1

私の言語で型指定されていない var に異なる型 (str または double) の値を保存するには、次のような構造体が必要です。

Struct BaseVarStruct{
         bool _isString;
         union {
         string _sVal;
         double _dVal;
         }_val;
};

StructType* BaseVarType=StructType::create("basevar",type::getInt1Ty(),???) を使用しようとしていますが、それがリテラルかどうかはわかりません。 「UnionType」というクラスが見つかりません.MAYBEユニオンタイプは現在LLVMでサポートされていませんか?または、StructTypeでユニオンタイプを定義して、すべてのメンバーに同じオフセットを与えることができますか?

4

1 に答える 1

1

LLVM IR はユニオン型を持っていましたが、これは基本的にすべてのフィールドがオフセット 0 の構造体でしたが、もうありません (バージョン 2.8 で削除されました)。動的な型または共用体を含む言語を厳密に型指定された IR にコンパイルするには、ビットキャストを追加する必要があると思います。

そのため、必要なアライメントを見つけて、それに適合するフィールドを持つ構造体を作成し ( Clang がどのように行うかについては、この関連する質問を参照してください)、次に に基づいて分岐し_isString、各分岐ターゲットで異なるビットキャストを実行できます。または、使用される各ポイントでユニオンに期待される型がわかっている場合は、フィールドではなくメタデータでその情報をエンコードし、メタデータに基づいてユニオンへのアクセスをコンパイルできます。

于 2013-05-27T07:28:43.720 に答える