2012-05-01 13 views
3

LLVM-3.0では、名前付き構造体は常に一意であり、他の構造的に同じ構造体とのポインタの等価性は機能しません。そのblog entry on LLVM-3.0 typesからは、ハイライトは私です:LLVM 3.0に構造体型同型チェックがありますか?

同定された構造は、私たちが話しているようなものです:彼らは名前を持つことができ、およびタイプが作成された後に自分の体を指定することができます。 識別された構造は他の構造体型と一意ではないため、StructType :: create(...)を使用して生成されています。識別された型は潜在的に再帰的であるため、asmprinterは常にそれらの名前(または識別された構造体に名前がない場合は%42のような数)を出力します。

これは、タイプポインターチェックによるタイプの等価チェックを中断します。 たとえば、haskellパッケージllvmは、llvm型ポインタがコンパイル時の型チェックと型キャストと等価であるかどうかに依存します。

2つの構造体が同形(同じ構造)であることを確認する方法はありますか?好ましくは、llvm-c apiにおいて、 C++のAPIで

+0

私はこの質問が意味をなさないとは確信していません... 2つの異なる名前のstruct型は* different *です。 LLVMは2つの構造体の内容を異なる名前で比較しようとすることはありません。あなたのコードはなぜ気になるのですか? – servn

+0

あなたは構造体** S **にアクセスする関数をJITしようとしており、他のモジュールで別の関数(引数として** S **のインスタンスを引数にとります)を呼び出します。コードを生成する前に型の一致を確認するのが賢明です。型の等しいかどうかをチェックする一般的な方法は、型ポインタが等しいことを確認することです。これはLLVM-3.0という名前の構造体では機能しません。 これは、llvmリンカでも必要です。リンカでは、各モジュールの名前付き構造体をマップできるため、リンクが機能する必要があります。詳細については、[ここ](http://nondot.org/sabre/LLVMNotes/TypeSystemRewrite.txt)を参照してください。 – Chetan

+0

LLVM IRリンカは実際には一種の構造比較を行うコードを持っていますが、そのような比較をしようとするLLVMの*唯一の場所なので、パブリックAPIではありません。また、リンカのアルゴリズムの正確さには基本的には必要ありません。一般的に、リンカはちょうどビットキャストを使うことができます。 – servn

答えて

3

StructTypeクラスは、彼らが同じだかどうかを確認するためにStructTypesの要素を通してこの機能を反復

bool StructType::isLayoutIdentical(StructType *Other) const 

を持っています。

関連する問題