В чем разница API `Create` в llvm :: IRBuilderBase и llvm :: BinaryOperator? - PullRequest
0 голосов
/ 14 июля 2020

Я хочу реализовать операцию bianry на моем игрушечном языке программирования с LLVM в качестве бэкэнда. В документе LLVM я нашел API Create как в llvm::IRBuilderBase, так и в llvm::BinaryOperator:

  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 могут реализовывать операции bianry. Но я не знаю разницы между ними.

  2. Если я хочу использовать 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 он принадлежит?

1 Ответ

1 голос
/ 14 июля 2020

Оба они создают объект BinaryOperator; IRBuilder вызывает BinaryOperator :: Create (). IRBuilder - это просто оболочка для множества различных Something :: Create (), включая BinaryOperator :: Create (). Я не знаю, почему одни люди предпочитают использовать оболочку, а другие - нет. Я думаю, это в значительной степени дело вкуса.

Create может найти соответствующий модуль и контекст, используя Instruction , которую вы ему дали: insertBefore->getModule() и insertBefore->getModule()->getContext() .

...