1

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

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

我尝试使用 StructType* BaseVarType=StructType::create("basevar",type::getInt1Ty(),???),但我不确定它是否是文字。在官方类 ref 中,有一个类名为“UnionType”,但我找不到它。LLVM 现在可能不支持联合类型?或者我可以通过 StructType 定义联合类型并给所有成员相同的偏移量?

4

1 回答 1

1

LLVM IR 曾经有一个联合类型——它本质上是一个所有字段都位于偏移量 0 的结构——但它不再有(在 2.8 版中删除)。我相信将任何具有动态类型或联合的语言编译到强类型 IR 中都需要添加位广播。

因此,您可以找到所需的对齐方式并创建一个包含适合它的字段的结构(请参阅有关 Clang 如何执行此操作的相关问题),然后基于 进行分支_isString,并在每个分支目标中执行不同的位转换。或者,如果您知道联合在每个使用点的预期类型,您可以在元数据而不是字段中对该信息进行编码,然后根据元数据编译对联合的访问。

于 2013-05-27T07:28:43.720 回答