Я хочу реализовать операцию bianry на моем игрушечном языке программирования с LLVM в качестве бэкэнда. В документе LLVM я нашел API Create
как в llvm::IRBuilderBase
, так и в llvm::BinaryOperator
:
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 могут реализовывать операции bianry. Но я не знаю разницы между ними.
Если я хочу использовать llvm::IRBuilderBase::CreateAdd
API, мне нужно построить llvm::IRBuilder
с llvm::Context
и llvm::Module
сначала, как:
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
он принадлежит?