首页 > 解决方案 > llvm::IRBuilderBase 和 llvm::BinaryOperator 中的`Create` API 有什么区别?

问题描述

我想在我的玩具编程语言中以 LLVM 作为其后端来实现 bianry 操作。在 LLVM 文档中,我在和Create中都找到了 API :llvm::IRBuilderBasellvm::BinaryOperator

  1. llvm::IRBuilderBase::CreateAddhttps ://llvm.org/doxygen/classllvm_1_1IRBuilderBase.html#a928603739e0e70713566011d44052a4f

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

我有两个关于CreateAPI 的问题:

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

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

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

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

解决方案


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

Create可以使用您给它的指令找到相关的模块和上下文:insertBefore->getModule()insertBefore->getModule()->getContext().


推荐阅读