首页 > 解决方案 > 是否有任何 api 可以使用 llvm 转换传递来初始化我的自定义类对象?如果没有,实现这一目标的最佳策略是什么?

问题描述

我正在实现一个 llvm 转换通道。在某些时候,我需要初始化我的自定义类对象并调用它的方法。比如说:

 Foo* foo = new Foo(3);                   
 foo->createSomething(attrCount, foo)

我需要插入这些说明。我该怎么办?我想我必须使用 AllocaInst,然后使用 IR Builder 创建一个函数调用。但直到现在我都无法得到它。

标签: llvmllvm-irllvm-c++-api

解决方案


不是 LLVM 或 Clang 专家,但我没有找到任何 LLVM 官方 api 可以用于这种适合,但我认为有一种间接方法可能有助于解决你的问题。

AFAIK,您应该插入类似于 clang 发出的 IR 中的指令。这可能很麻烦,因为您需要处理一些符号,Foo例如newcreateSomething

llvm::TypeFinder查找指定的“类”类型会很有用,实际上类类型表示为 StructType,您可以通过 getName 找到您需要的类型。

对于一个函数,通常你需要它的名字来getFunction,但是名字在IR中是错位的,所以你应该首先得到函数的错位名称。据我所知,LLVM 不提供这样的接口来修改名称,因此您必须手动进行。例如,clang_Cursor_getMangling在 libclang 中可能能够在 AST 中获取损坏的名称(在 libclang 中获取 AST 非常容易,哈哈)。

最后,最后一步是使用IRBuilder创建一些指令来完成大工作,例如CreateAllocaCreateCall等。

希望这可以帮助。


推荐阅读