Как сделать лязгом компиляции в промежуточный код LLVM ИК



Я хочу, чтобы clang скомпилировал мой C/C++ код LLVM байт-код, а не двоичный исполняемый файл. Как я могу этого достичь? И если я получу LLVM байт-код, как я могу взять его для дальнейшей компиляции в двоичный исполняемый файл.



в основном я хочу добавить свой собственный код в LLVM байт-код перед компиляцией в двоичный исполняемый файл.

630   5  

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 -вот его документация.

использовать

clang -emit-llvm -o foo.bc -c foo.c
clang -o foo foo.bc

если у вас есть несколько исходных файлов, вы, вероятно, на самом деле хотите использовать 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 но вы можете использовать любую другую версию):

  1. создать все .ll файлы

    clang-3.8 -S -emit-llvm *.c
    
  2. связать их в один

    llvm-link-3.8 -S -v -o single.ll *.ll
    
  3. (необязательно) Оптимизируйте свой код (возможно, какой-то анализ псевдонимов)

    opt-3.8 -S -O3 -aa -basicaaa -tbaa -licm single.ll -o optimised.ll
    
  4. создать сборка (генерирует optimised.s file)

    llc-3.8 optimised.ll
    
  5. создать исполняемый файл (с именем a.out)

    clang-3.8 optimised.s
    

Comments

    Ничего не найдено.