使用C ++ API在llvmIR中创建struct和union类型

时间:2013-05-27 06:33:45

标签: api struct llvm union

为了在我的语言中保存非类型var中不同类型(str或double)的值,我需要一个像这样的结构:

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

我尝试使用StructType * BaseVarType = StructType :: create(" basevar",type :: getInt1Ty(),???),但我不确定它&#39在saical class ref中,有一个名为" UnionType"的类,但是我找不到它。现在LLVM中不支持MAYBE联合类型了?或者我可以通过StructType定义联合类型并为所有成员提供相同的偏移量?

1 个答案:

答案 0 :(得分:1)

LLVM IR曾经有一个联合类型 - 它本质上是一个结构,所有字段都在偏移0处 - 但它不再存在(在2.8版中删除)。我认为将任何带有动态类型或联合的语言编译成强类型的IR都需要添加bitcasts。

所以你可以找到需要对齐并创建一个带有适合它的字段的结构(参见this related question关于Clang如何做),然后根据_isString进行分支,并在每个分支目标中执行一个不同的bitcast。或者,如果您知道在每个点使用联合的期望类型,您可以在元数据而不是字段中编码该信息,然后根据元数据编译对联合的访问。