Как сделать лязгом компиляции в промежуточный код LLVM ИК
Я хочу, чтобы clang скомпилировал мой C/C++ код LLVM байт-код, а не двоичный исполняемый файл. Как я могу этого достичь? И если я получу LLVM байт-код, как я могу взять его для дальнейшей компиляции в двоичный исполняемый файл.
в основном я хочу добавить свой собственный код в LLVM байт-код перед компиляцией в двоичный исполняемый файл.
5 ответов:
учитывая некоторые C/C++ - файл
foo.c:> clang -S -emit-llvm foo.cпроизводит
foo.llкоторый является файлом LLVM IR.The
-emit-llvmопция также может быть передана непосредственно интерфейсу компилятора, а не драйверу с помощью-cc1:> clang -cc1 foo.c -emit-llvmпроизводит
foo.llС ИК.-cc1добавляет некоторые интересные варианты, как-ast-print. Проверьте-cc1 --helpдля более подробной информации.
чтобы скомпилировать LLVM IR далее в сборку, используйте
llcинструмент:> llc foo.llпроизводит
foo.sС сборкой (по умолчанию для архитектуры машины, на которой Вы ее запускаете).llcявляется одним из инструментов LLVM -вот его документация.
если у вас есть несколько исходных файлов, вы, вероятно, на самом деле хотите использовать link-time-optimization для вывода одного файла bitcode для всей программы. Другие ответы приведут к тому, что вы получите файл bitcode для каждого исходного файла.
вместо этого вы хотите скомпилировать с помощью link-time-optimization
clang -flto -c program1.c -o program1.o clang -flto -c program2.c -o program2.oи для последнего шага связывания добавьте аргумент-Wl, - plugin-opt=also-emit-llvm
clang -flto -Wl,-plugin-opt=also-emit-llvm program1.o program2.o -o programэто дает вам и a скомпилированная программа и соответствующий ей битовый код (program.британская Колумбия.) Затем вы можете изменить программу.bc в любом случае вам нравится, и перекомпилировать измененную программу в любое время, делая
clang program.bc -o programхотя имейте в виду, что вам нужно включить все необходимые флаги компоновщика (для внешних библиотек и т. д.) На этом шаге снова.
обратите внимание, что для этого вам нужно использовать Gold linker. Если вы хотите заставить clang использовать определенный компоновщик, создайте символическую ссылку на этот компоновщик с именем "ld" в специальном каталоге под названием "fakebin" где-то на вашем компьютере, и добавить опцию
-B/home/jeremy/fakebinк любым соединяя шагам выше.
вы читали
clangдокументация ? Вы, наверное, ищете-emit-llvm.
если у вас есть несколько файлов, и вы не хотите вводить каждый файл, я бы рекомендовал вам выполнить следующие простые шаги (я использую
clang-3.8но вы можете использовать любую другую версию):
создать все
.llфайлыclang-3.8 -S -emit-llvm *.cсвязать их в один
llvm-link-3.8 -S -v -o single.ll *.ll(необязательно) Оптимизируйте свой код (возможно, какой-то анализ псевдонимов)
opt-3.8 -S -O3 -aa -basicaaa -tbaa -licm single.ll -o optimised.llсоздать сборка (генерирует
optimised.sfile)llc-3.8 optimised.llсоздать исполняемый файл (с именем
a.out)clang-3.8 optimised.s
Comments