Как сгенерировать исполняемый файл из llvm:: Module? - программирование
Подтвердить что ты не робот

Как сгенерировать исполняемый файл из 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, я просто не могу его найти.)

4b9b3361

Ответ 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 должен заменить его функцию. Вы можете начать там.