Types 在LLVM中定义新类型

Types 在LLVM中定义新类型,types,llvm,llvm-ir,Types,Llvm,Llvm Ir,在一个非常简单的LLVM IR程序中,我可以 %MyStruct = type { i32 } %MyInt = type i32 declare void @main(%MyStruct, %MyInt) 但是,我不能用LLVM C++ API来生成相同的 %MyStRe= = {I32 } /Cube >或 %Myt=类型I32 < /Cord>语句。在过去的几天里,我一直在搜索文档,我发现唯一接近我想要的是手动定义一个新类型,如下所述: 但是,我希望用LLVM C++ API定义和使用

在一个非常简单的LLVM IR程序中,我可以

%MyStruct = type { i32 }
%MyInt = type i32

declare void @main(%MyStruct, %MyInt)
<>但是,我不能用LLVM C++ API来生成相同的<代码> %MyStRe= = {I32 } /Cube >或<代码> %Myt=类型I32 < /Cord>语句。在过去的几天里,我一直在搜索文档,我发现唯一接近我想要的是手动定义一个新类型,如下所述:

<>但是,我希望用LLVM C++ API定义和使用新的类型,如我可以用函数等。 我唯一能想到的另一种方法是单独记录我的自定义类型和它们的LLVM基元类型,并且在声明函数时,使用基元类型;但是,如果有一种更快的方式内置到LLVM本身中,我就不想开始这样做(正如我通过查看一些LLVM IR示例并生成上面的代码所发现的那样)


Edit:我已经做了更多的调查,我发现了一个函数的引用,该函数似乎正是我所需要的,在和中称为
addTypeName
,然而,这似乎就是全部,因为我在实际文档中看不到任何对
addTypeName
的引用,并且我无法使用
addTypeName
编译程序,因为它声称该方法不存在。

最简单的方法是使用cpp后端(llc-march=cpp)给定IR,它将生成复制IR所必需的C++ API调用序列。

谢谢这个建议。我这样做了,这有助于解释
llvmas
是如何工作的。对于
MyStruct
它创建了一个命名的
StructType
,这是有意义的,但是对于
MyInt
它只是绕过了一个新类型的命名,定义了一个以
i32
为参数的函数;因此,无法再命名非结构类型。我不确定这是否是一个bug。只是尝试了使用
%foo
-march=cpp
编译一个
%foo=type i32
+短函数:生成的API调用直接使用IntegerType。