Привет, я написал простой код C ++ с LLVM Api
#include <stdio.h>
#include "llvm/IR/LLVMContext.h"#include "llvm/IR/Module.h"#include "llvm/IR/IRBuilder.h"
int main()
{
llvm::LLVMContext& context = llvm::getGlobalContext();
llvm::Module* module = new llvm::Module("top", context);
llvm::IRBuilder<> builder(context);
module->dump( );
}
Как мне скомпилировать это, чтобы получить файл LLVM IR?
Спасибо за любую помощь
Компиляция самой программы в двоичный код машинного кода проста. На платформе Unix:
$ clang++ <c++ file> `llvm-config --cppflags --ldflags --libs core`
llvm-config
это инструмент, обеспечивающий необходимые флаги компиляции для включения определенных компонентов каркаса llvm. В вашем случае, кажется, вам нужен только основной компонент.
Добавление -v
параметр в командной строке требует clang
выводить все используемые команды. Добавление -S -emit-llvm
(оба параметра должны использоваться вместе) заставит его выводить ИК-перевод источника в формате Ivvm
$ clang++ -v file.cpp `llvm-config --cppflags --ldflags --libs core` -S -emit-llvm
Результирующий file.s
может быть затем непосредственно интерпретировано с lli
или дополнительно скомпилирован в битовый код с помощью llvm-as
, который оказывает .bc
файл.
$ llvm-as file.s
Такой же lli
также с удовольствием запустит этот файл:
$ lli file.s.bc
Запуск или интерпретация любого из этих результирующих файлов (llvm IR, битовый код или нативная программа), конечно же, даст тот же результат, сброс IR-кода llvm модуля top
определено в вашей программе (которая пуста).
Документация:
Самое простое, что можно сделать, это переслать вывод в файл и затем обработать его примерно так (при условии, что скомпилированный код, приведенный выше, скомпилирован в исполняемое имя ‘parser’):
./parser >> test.ll
llvm-as test.ll
llc test.bc
clang -o test test.s
Надеюсь, это поможет!
Как примечание стороны, у меня есть мой парсер к этому через system()
звонки и параметры командной строки, так что вы можете подумать об этом ^^