Подтвердить что ты не робот

LLVM и номенклатура компилятора

Я изучаю систему LLVM, и я прочитал Документацию по началу работы. Тем не менее, некоторые номенклатуры (и формулировки в примере clang) все еще немного запутывают. Следующие термины и команды являются частью процесса компиляции, и мне было интересно, сможет ли кто-нибудь объяснить им немного лучше для меня:

  • clang -S vs. clang -c (Я знаю, что делает -c, но как отличаются результаты?) * (Изменить)
  • LLVM Bitcode против LLVM IR (какая разница?)
  • .ll файлы против .bc файлов (каковы они, как они отличаются?)
  • Код сборки LLVM против исходного кода сборки (есть ли разница?)

На более высоком уровне я понимаю общий процесс компиляции и хорошо отслеживаю свой путь, я просто застрял в некоторых точках, где, например, я ожидаю увидеть "IR", но вместо этого вижу "биткод" "или" сборка LLVM ", которая заставляет меня думать, что я не понимаю их почти так же хорошо, как и я!

4b9b3361

Ответ 1

Использование Клана

В общем, Clang принимает те же параметры командной строки, что и GCC. Опция -c (только компилировать и собирать, не ссылаться) и -S (только компилировать, не собирать или связывать) означает то же самое в обоих.

Условия LLVM относительно промежуточного представления

Процитировать из еще один мой ответ на этом сайте:

LLVM IR обычно хранится на диске в текстовых файлах с расширением .ll или в двоичных файлах с расширением .bc. Преобразование между ними тривиально, и вы можете просто использовать llvm-dis для bc ll и llvm-as для ll Ьс. Бинарный формат более эффективен с точки зрения памяти, тогда как текстовый формат читается человеком.

В дополнение, существуют некоторые обычно используемые псевдонимы:

  • Бинарный формат, хранящийся в файлах .bc, также называется bitcode (хотя я иногда слышал термин "биткод", применяемый к общему IR, а также )
  • IR также назвал сборку LLVM или языком ассемблера LLVM

В любом случае все это означает одно и то же, под потенциально разными представлениями.

Собственная сборка

Собственная сборка - это то, о чем многие обычно думают, когда слышат термин "сборка" - язык низкого уровня с отображением почти 1:1 на ваш собственный двоичный файл машины, и в отличие от сборки LLVM, собственная сборка является очень зависимым от цели (примеры - сборка x86, сборка ARM и т.д.). Собственная сборка собирается в нативный двоичный файл через ассемблер - LLVM включает один, хотя вы также можете использовать другие ассемблеры (например, gas).

Нативный двоичный файл - результат процесса сборки - это, конечно, язык (только), на котором компьютер действительно говорит, и после его привязки он может быть загружен в память и запускаться непосредственно на вашем оборудовании.