为了在我的语言中保存非类型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定义联合类型并为所有成员提供相同的偏移量?
答案 0 :(得分:1)
LLVM IR曾经有一个联合类型 - 它本质上是一个结构,所有字段都在偏移0处 - 但它不再存在(在2.8版中删除)。我认为将任何带有动态类型或联合的语言编译成强类型的IR都需要添加bitcasts。
所以你可以找到需要对齐并创建一个带有适合它的字段的结构(参见this related question关于Clang如何做),然后根据_isString
进行分支,并在每个分支目标中执行一个不同的bitcast。或者,如果您知道在每个点使用联合的期望类型,您可以在元数据而不是字段中编码该信息,然后根据元数据编译对联合的访问。