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

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

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

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


person Ephemera    schedule 01.01.2013    source источник


Ответы (1)


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

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

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

Процитирую другой мой ответ на этом сайте:

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

Кроме того, есть несколько часто используемых псевдонимов:

  • Двоичный формат, хранящийся в файлах .bc, также называется битовым кодом (хотя я иногда слышал, что термин «битовый код» также применяется к общему IR)
  • НП также называл сборку LLVM или язык ассемблера LLVM.

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

Родная сборка

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

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

person Oak    schedule 01.01.2013
comment
+1 Хотя вы тоже можете отличить сборку LLVM от нативной сборки. - person ; 01.01.2013
comment
@delnan верно, пропустил это в вопросе. Отредактировано, чтобы также включить кое-что об этом, спасибо! - person Oak; 01.01.2013
comment
The binary format is more memory-efficient, потому что файл bc всегда меньше, чем ll? Кстати, мне интересно, существует ли проход, который сериализует ll в формат bc или непосредственно в представление, которое находится только в памяти при загрузке (например, с использованием инструмента opt). - person Hongxu Chen; 01.01.2013
comment
@HongxuChen запишите на бумаге тройку и тройку. Теперь прочтите вслух то, что вы написали. Его читают одинаково, и это означает одно и то же, но на бумаге есть два разных изображения, одно из которых занимает больше площади, чем другое. То же самое и с LLVM IR. В любом случае нет возможности преобразовать одно в другое, потому что при загрузке в память из LLVM вы получаете то же самое. - person Oak; 01.01.2013