我正在实现llvm转换过程。在某种程度上,我需要初始化我的自定义类对象并调用其方法。举例来说:
Foo* foo = new Foo(3);
foo->createSomething(attrCount, foo)
我需要插入这些说明。我该怎么办?我认为我必须先使用AllocaInst,然后使用IR Builder创建函数调用。但是直到现在我还是无法掌握它。
不是LLVM或Clang的专家,但我没有找到可用于此类适应的任何LLVM官方api,但我认为有一种间接的方法可能有助于解决您的问题。
AFAIK,您应该插入clang发出的IR中的说明。这可能很麻烦,因为您需要处理一些符号,例如Foo
,new
和createSomething
。
llvm::TypeFinder
对于查找指定的“类”类型很有用,实际上,类类型表示为StructType,您可以使用getName来查找所需的类型。
对于一个函数,通常需要它的名称才能得到getFunction,但是名称在IR中被修饰,因此您应该首先获得该函数的修饰名称。众所周知,LLVM没有提供这样的接口来处理名称,因此您必须手动进行操作。例如,libclang中的clang_Cursor_getMangling
可以在AST中获取错误的名称(在libclang大声笑中获取AST非常容易)。
最后,最后一步是使用IRBuilder
创建一些完成较大工作的指令,例如CreateAlloca
,CreateCall
等。
希望这会有所帮助。