llvm::IRBuilderBase 和 llvm::BinaryOperator 中的 `Create` API 有什么区别?
What's the difference of `Create` API in llvm::IRBuilderBase and llvm::BinaryOperator?
我想在我的玩具编程语言中以 LLVM 作为后端实现二进制操作。在 LLVM 文档中,我在 llvm::IRBuilderBase
和 llvm::BinaryOperator
:
中都找到了 Create
API
llvm::IRBuilderBase::CreateAdd
: https://llvm.org/doxygen/classllvm_1_1IRBuilderBase.html#a928603739e0e70713566011d44052a4f
llvm::BinaryOperator::Create
: https://llvm.org/doxygen/classllvm_1_1BinaryOperator.html#a02ce9966395063ac501ecbc1623deda4
我有 2 个关于 Create
API 的问题:
看来这2个API都可以实现二进制操作。但是我不知道它们之间的区别。
如果我想用llvm::IRBuilderBase::CreateAdd
API,我需要先用llvm::Context
和llvm::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::Create
API,因为是static
方法,直接调用就可以了,就像:
llvm::Value *v = llvm::BinaryOperator::Create(llvm::BinaryOps::Add, left, right);
但是 llvm::BinaryOperator
怎么知道它属于哪个 llvm::Context
或 llvm::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()
.
我想在我的玩具编程语言中以 LLVM 作为后端实现二进制操作。在 LLVM 文档中,我在 llvm::IRBuilderBase
和 llvm::BinaryOperator
:
Create
API
llvm::IRBuilderBase::CreateAdd
: https://llvm.org/doxygen/classllvm_1_1IRBuilderBase.html#a928603739e0e70713566011d44052a4fllvm::BinaryOperator::Create
: https://llvm.org/doxygen/classllvm_1_1BinaryOperator.html#a02ce9966395063ac501ecbc1623deda4
我有 2 个关于 Create
API 的问题:
看来这2个API都可以实现二进制操作。但是我不知道它们之间的区别。
如果我想用
llvm::IRBuilderBase::CreateAdd
API,我需要先用llvm::Context
和llvm::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::Create
API,因为是static
方法,直接调用就可以了,就像:
llvm::Value *v = llvm::BinaryOperator::Create(llvm::BinaryOps::Add, left, right);
但是 llvm::BinaryOperator
怎么知道它属于哪个 llvm::Context
或 llvm::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()
.