llvm::IRBuilderBase 和 llvm::BinaryOperator 中的 `Create` API 有什么区别?

What's the difference of `Create` API in llvm::IRBuilderBase and llvm::BinaryOperator?

我想在我的玩具编程语言中以 LLVM 作为后端实现二进制操作。在 LLVM 文档中,我在 llvm::IRBuilderBasellvm::BinaryOperator:

中都找到了 Create API
  1. llvm::IRBuilderBase::CreateAdd: https://llvm.org/doxygen/classllvm_1_1IRBuilderBase.html#a928603739e0e70713566011d44052a4f

  2. llvm::BinaryOperator::Create: https://llvm.org/doxygen/classllvm_1_1BinaryOperator.html#a02ce9966395063ac501ecbc1623deda4

我有 2 个关于 Create API 的问题:

  1. 看来这2个API都可以实现二进制操作。但是我不知道它们之间的区别。

  2. 如果我想用llvm::IRBuilderBase::CreateAddAPI,我需要先用llvm::Contextllvm::Module构造一个llvm::IRBuilder ,就像:

llvm::Module module;
llvm::Context context(module);
llvm::IRBuilder<> irBuilder(&context);

然后使用irBuilder.CreateAdd生成二进制运算,就像:

llvm::Value *v = irBuilder.CreateAdd(left, right);

如果我想用llvm::BinaryOperator::CreateAPI,因为是static方法,直接调用就可以了,就像:

llvm::Value *v = llvm::BinaryOperator::Create(llvm::BinaryOps::Add, left, right);

但是 llvm::BinaryOperator 怎么知道它属于哪个 llvm::Contextllvm::Module

他们都创建了一个BinaryOperator对象; IRBuilder 调用 BinaryOperator::Create()。 IRBuilder 只是许多不同 Something::Create() 的包装器,包括 BinaryOperator::Create()。我不知道为什么有些人喜欢使用包装器而有些人不喜欢。我认为这在很大程度上是一个品味问题。

Create can find the relevant Module and Context using the Instruction 你给了它:insertBefore->getModule()insertBefore->getModule()->getContext().