От C ++ до LLVM IR [дубликат]

Ajax не поддерживает загрузку файлов, вы должны использовать iframe вместо

114
задан Jav_Rock 6 February 2012 в 11:48
поделиться

5 ответов

Для некоторых файлов C / C ++ foo.c:

> clang -S -emit-llvm foo.c

Производит foo.ll, который является IR-файлом LLVM.

Опция -emit-llvm также может быть передана прямо перед интерфейсом компилятора, а не с помощью драйвера -cc1:

> clang -cc1 foo.c -emit-llvm

Производит foo.ll с IR. -cc1 добавляет некоторые интересные варианты, такие как -ast-print. Подробнее см. -cc1 --help.


Чтобы скомпилировать LLVM IR далее для сборки, используйте инструмент llc:

> llc foo.ll

Производит foo.s со сборкой (в соответствии с архитектурой машины, в которой вы ее запускаете). llc является одним из инструментов LLVM - - это его документация .

157
ответ дан Eli Bendersky 22 August 2018 в 08:04
поделиться
  • 1
    Что здесь делает? – meawoppl 27 February 2014 в 18:17
  • 2
    @meawoppl: -S как в gcc говорит испускать текстовую сборку, а не собранную двоичную – Eli Bendersky 28 February 2014 в 18:53
  • 3
  • 4
    @EliBendersky Знаете ли вы, как скомпилировать несколько файлов .c и .h в один считываемый человеком ИК-код, чтобы я мог запускать IR с помощью lli theIrFile? благодаря – cache 20 July 2014 в 19:43
  • 5
    @cache: скомпилируйте каждый в свой собственный IR-файл, а затем используйте LLVM-компоновщик для объединения – Eli Bendersky 22 July 2014 в 04:12

Используйте

clang -emit-llvm -o foo.bc -c foo.c
clang -o foo foo.bc
18
ответ дан Christoph 22 August 2018 в 08:04
поделиться
  • 1
    Я бы рекомендовал сохранить неизменяемые значения. IOW, .o должны ссылаться на файлы двоичных объектов, .s на файлы сборки и что-то еще (по соглашению .ll) на файлы LLVM IR. В противном случае легко запутаться. Clang / LLVM теперь не имеют собственного компоновщика для двоичных объектов (хотя один из них работает). Линейщик LLVM llvm-ld просто объединяет несколько IR-файлов в один – Eli Bendersky 5 February 2012 в 15:06
  • 2
    @EliBendersky: вы правы, если речь идет о расширениях файлов, и интерфейс clang действительно делает правильную вещь, если используется .bc; также имейте в виду, что llvm-ld может выступать в качестве интерфейса для системной привязки, т. е. мой предыдущий ответ с использованием llvm-ld -native должен работать как ожидалось .... – Christoph 5 February 2012 в 15:13
  • 3
    Не работает. foo.bc - это объектный файл. – rickfoosusa 25 September 2014 в 22:15
  • 4
    @rickfoosusa: работает для меня - foo.bc является файлом биткода LLVM – Christoph 25 September 2014 в 22:23
  • 5
    Работает для меня: clang -emit-llvm -o test.bc -c test.c && file test.bc: test.bc: LLVM IR bitcode. – ntc2 12 April 2016 в 17:11

Если у вас есть несколько исходных файлов, вы, вероятно, на самом деле хотите использовать оптимизацию времени соединения для вывода одного файла биткода для всей программы. Другие полученные ответы приведут к тому, что вы получите файл биткода для каждого исходного файла.

Вместо этого вы хотите скомпилировать с оптимизацией времени ссылки

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

Это дает вам как скомпилированную программу, так и бит-код, соответствующий это (program.bc). Вы можете в любое время изменить файл program.bc и перекомпилировать измененную программу в любое время, выполнив

clang program.bc -o program

, хотя помните, что вам нужно включить любые необходимые флаги компоновщика (для внешних библиотек, и т. д.) на этом этапе снова.

Обратите внимание, что для этого вам нужно использовать золотой линкер. Если вы хотите заставить clang использовать конкретный компоновщик, создайте символическую ссылку на этот компоновщик с именем «ld» в специальном каталоге под названием «fakebin» где-то на вашем компьютере и добавьте опцию

-B/home/jeremy/fakebin

в любые этапы соединения выше.

18
ответ дан Jeremy Salwen 22 August 2018 в 08:04
поделиться

Если у вас несколько файлов, и вы не хотите вводить каждый файл, я бы рекомендовал вам выполнить следующие простые шаги (я использую 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)
    llc-3.8 optimised.ll
    
  5. Создать исполняемый файл (с именем a.out)
    clang-3.8 optimised.s
    
7
ответ дан Kiko Fernandez 22 August 2018 в 08:04
поделиться
  • 1
    Ваше решение совершенно уникально: вы использовали & quot; -S & quot; вместо того, чтобы просто оставить его двоичным выходом. Есть ли разница между наличием «-S», и не имеет & quot; -S & quot ;? – Peter Teoh 24 September 2017 в 01:46
  • 2
    @PeterTeoh Я использую опцию -S (на шаге 2), я указываю, что хочу создать вывод в LLVM IR. В принципе, все * .ll файлы в один. Я делаю это, чтобы проверить, что оптимизация действительно меняет код, т. Е. single.ll и optimised.ll теперь должны выглядеть по-другому (по коду), и вы также можете показать отчет, чтобы увидеть, есть ли какая-либо разница вообще. – Kiko Fernandez 16 October 2017 в 07:39

Вы читали clang документацию ? Вероятно, вы ищете -emit-llvm.

11
ответ дан rotoglup 22 August 2018 в 08:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: