Как сгенерировать исполняемый файл из llvm:: Module?
Я хочу написать С++-функцию, которая принимает llvm::Module
, которая уже связана, и выводит ее в исполняемый файл. Он должен использовать API llvm/clang вместо того, чтобы развернуть процесс и вызвать clang командной строки.
Просматривая исходный код llvm/clang, ближайшая вещь, которую я нашел, это вывод Module
в файл .o. Например, инструмент llc (tools/llc/llc.cpp) выполняет это, вызывая TargetMachine::addPassesToEmitFile(...)
.
Альтернативой было бы записать Module
в .bc файл, затем создать CompilerInstance
и вызвать ExecuteCompilerInvocation
(как в tools/clang/tools/driver/cc1_main.cpp). Но тогда накладные расходы на ввод/вывод файлов.
Итак, я прошу чего-то по возможности, или я должен вернуться к альтернативе?
Изменить: (Конечно, это возможно. Это происходит где-то в исходном коде clang, я просто не могу его найти.)
Ответы
Ответ 1
Невозможно! clang
не создает сам исполняемый файл. Он вызывает ld
.
Нашел его в tools/clang/lib/Driver/Tools.cpp. В функциях ConstructJob
для различных платформ (darwin::Link::ConstructJob
, solaris::Link::ConstructJob
и т.д.) Он делает это:
const char *Exec =
Args.MakeArgString(getToolChain().GetProgramPath("ld"));
C.addCommand(new Command(JA, *this, Exec, CmdArgs));
(для visualstudio::Link::ConstructJob
вместо этого он вызывает link.exe
.)
Изменить:. В ретроспективе было бы быстрее найти это, отслеживая системные вызовы clang
с помощью dtruss
(Mac) или strace
(Linux).
Изменить: В итоге я использовал API-интерфейс драйвера Clang для построения и компоновки. Я написал несколько пример кода.
Ответ 2
llvm-ld
делает то, что вам нужно, когда передается флаг -native
.
llvm-ld
был удален в LLVM 3.1, но драйвер clang
должен заменить его функцию. Вы можете начать там.