我正在实现一个llvm转换传递。在某些时候,我需要初始化我的自定义类对象并调用它的方法。 例如:
Foo* foo = new Foo(3);
foo->createSomething(attrCount, foo)
我需要插入这些说明。我该怎么办? 我想我必须使用 AllocaInst,然后使用 IR Builder 创建一个函数调用,但直到现在我都无法将其记下来。
不是LLVM或Clang的专家,但我没有找到任何LLVM官方api,你可以用于这种适合,但我认为有一种间接的方法可能有助于解决你的问题。
AFAIK,您应该插入像 IR 中由叮当声发出的指令一样的指令。这可能会很麻烦,因为您需要处理一些符号,例如Foo
、new
和createSomething
。
llvm::TypeFinder
找到指定的"类"类型很有用,实际上类类型表示为 StructType,您可以获取 Name 来查找所需的类型。
对于一个函数,通常需要它的名称才能获得函数,但名称在 IR 中被篡改,因此您应该首先获取函数的损坏名称。据我所知,LLVM 不提供这样的接口来破坏名称,因此您必须手动执行此操作。例如,libclang 中的clang_Cursor_getMangling
可以在 AST 中获得损坏的名称(在 libclang 中获得 AST 非常容易,哈哈(。
最后,最后一步是使用IRBuilder
创建一些指令来完成大工作,例如CreateAlloca
、CreateCall
等。
希望这有帮助。