【问题标题】:LLVM create function with type "Instruction*"LLVM 创建类型为“指令*”的函数
【发布时间】:2014-06-25 09:42:33
【问题描述】:

我想使用Function::Create 方法来创建一个输入参数类型为llvm::Instruction* 的函数,但是我在class Type 中没有找到任何直接方法可以做到这一点。谁能给我一些提示?

另外,对于Instruction *pi 的具体比较,我尝试了pi->getType()->print(errs()),它返回了i1 作为类型。但是当我在另一个cpp文件中写了一个函数int externalCall(Instruction *p)并编译成IR。这个 IR 说类型是class.llvm::Instruction。为什么这两个不同,我如何从 API 中获取后一个?

【问题讨论】:

  • 您能否提供一个示例,说明您希望 IR 最终的样子,以及您希望对该函数的调用在 IR 中的样子?
  • 类似call void @foo('class.llvm::Instruction' p)
  • 就 LLVM 位码而言,llvm::Instruction 没有什么特别之处,它只是一个 C++ 类型。所以这个问题可能与任何其他类型一样好。特别是,您绝对不会发现这种类型的任何特殊处理。所以我建议寻找在 LLVM 中创建类型的通用方法。

标签: llvm llvm-ir llvm-c++-api


【解决方案1】:

只要你使用 c 风格的链接,指针类型在很大程度上是无关紧要的:

  • 在 llvm 端转换为指向 i8 的指针
  • 在 c/c++ 被调用方接收您想要的任何类型。 Instruction *还可以

(只需在 llvm 端使用 BitcastInst 来区分大小写,例如:

BitCastInst *bitcast = new BitCastInst(value, PointerType::get(IntegerType::get(context, 8), 0));

(...其中value 是您的Instruction * 对象)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多