Как скомпилировать с помощью LLVM / Clang через API без вызова исполняемого файла?

#clang #llvm #llvm-ir

#clang #llvm #llvm-ir

Вопрос:

Я хотел бы скомпилировать исходный файл в LLVM IR в моем демонстрационном приложении с помощью LLVM / Clang API без clang вызова исполняемого файла. Кажется, что Driver для выполнения все еще используется исполняемый Compilation файл (я использовал слегка измененный пример)

 string clangPath = "clang";

string inputPath = "../test/hello_world.cpp";
string outputPath = "hello_world.ll";

// "clang -S -emit-llvm ../test/hello_world.cpp -v"
vector<const char *> args;
args.push_back(clangPath.c_str());
args.push_back("-S");
args.push_back("-emit-llvm");
args.push_back(inputPath.c_str());
args.push_back("-v");

// ...
  

Как вы можете видеть, он печатает действия, и для компиляции, похоже, требуется clang исполняемый путь:

 MBA-Anton:build asmirnov$ ./clang_ir
Starting ----
making driver
making compilation
clang version 3.4 (branches/release_34 198679)
Target: x86_64-apple-darwin13.2.0
Thread model: posix
printing actions:
0: input, "../test/hello_world.cpp", c  
1: preprocessor, {0}, c  -cpp-output
2: compiler, {1}, ir
3: bind-arch, "x86_64", {2}, ir
Done ----
 "clang" -cc1 -triple x86_64-apple-macosx10.9.0 -emit-llvm -disable-free -main-file-name hello_world.cpp -mrelocation-model pic -pic-level 2 -mdisable-fp-elim -masm-verbose -munwind-tables -target-cpu core2 -target-linker-version 224.1 -v -coverage-file /Users/asmirnov/Documents/dev/src/clang_jni/mac/build/hello_world.ll -resource-dir ../lib/clang/3.4 -stdlib=libc   -fdeprecated-macro -fdebug-compilation-dir /Users/asmirnov/Documents/dev/src/clang_jni/mac/build -ferror-limit 19 -fmessage-length 100 -stack-protector 1 -mstackrealign -fblocks -fobjc-runtime=macosx-10.9.0 -fencode-extended-block-signature -fcxx-exceptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -vectorize-slp -o hello_world.ll -x c   ../test/hello_world.cpp
error: unable to execute command: Executable "clang" doesn't exist!
  

Действительно ли нужен путь clang и как я могу выполнить компиляцию в LLVM IR через LLVM / Clang API без вызова исполняемого файла? Если он недоступен в текущем API, как я могу изменить API, чтобы использовать статическую библиотеку вместо исполняемого файла?

Комментарии:

1. Возможно, вы захотите посмотреть на КОРНЕВОЙ проект «cling» для примера Clang с JIT-серверной частью.

2. Я обнаружил, что он действительно использует clang готовый исполняемый файл. Выполняет ли cling компиляцию в LLVM IR без вызова исполняемого файла?