Пытаясь понять байт-код C, может ли GNU/gcc создавать байт-код C, такой как Clang/LLVM?

Недавно мне сказали посмотреть, как функции C компилируются в байт-код LLVM, а затем как байт-код LLVM транслируется в x86 ASM. Как у обычного пользователя GNU/gcc, у меня есть несколько вопросов по этому поводу. Мягко говоря.

GNU/gcc тоже компилирует в байт-код? Возможно? У меня сложилось впечатление, что gcc компилируется непосредственно в ASM. Если нет, есть ли способ просмотреть посредника байт-кода, как с командой clang?

~$ clang ~/prog_name.c -S -emit-llvm -o - ‹== покажет байт-код для prog_name.c.

Кроме того, я считаю байт-код довольно византийским. Напротив, он делает язык ассемблера легким чтением. Другими словами: я плохо понимаю, о чем он говорит.

Есть ли у кого-нибудь какие-либо советы или ссылки для неопределенной расшифровки информации, которую дает байт-код? В настоящее время я сравниваю и сравниваю с реальным ASM, поэтому сказать, что он работает медленно, - это комплимент.

Возможно, все это до смешного наивно, но мне довольно сложно пробиться сквозь поверхность этого.


person d0rmLife    schedule 18.03.2013    source источник
comment
llvm.org/releases/1.3/docs/CommandGuide/html/llvmgcc. html   -  person Robert Harvey    schedule 19.03.2013
comment
И для документации по самому языку LLVM: llvm.org/docs/LangRef.html   -  person Pavel Minaev    schedule 19.03.2013
comment
@RobertHarvey, который выглядит значительно полезнее, чем llvm.org/docs/LangRef.html... Спасибо   -  person d0rmLife    schedule 19.03.2013
comment
@RobertHarvey: обратите внимание, что вы ссылаетесь на очень старую версию LLVM. llvmgcc давно устарел. Его функциональность теперь реализована через плагин gcc dragonegg.   -  person Eli Bendersky    schedule 19.03.2013
comment
@EliBendersky: Спасибо. Я заметил, что он был довольно старым.   -  person Robert Harvey    schedule 19.03.2013
comment
Возможно, источником вашей путаницы является термин байт-код C - такого понятия не существует. Промежуточное представление LLVM (называемое биткодом LLVM или LLVM IR) — это SSA, который не является связанный с C. GCC использует другое промежуточное представление (на самом деле, несколько), которое также не связано с C.   -  person Oak    schedule 19.03.2013
comment
Попробуйте запустить gcc -fdump-tree-ssa   -  person SK-logic    schedule 20.03.2013
comment
@SK-logic Как проверить дамп? Я проверил руководство и запустил gcc -fdump-tree-ssa program.c -o program.ssa, но nano program.ssa выглядит как крылышки... или это так должно выглядеть?   -  person d0rmLife    schedule 20.03.2013
comment
@d0rmLife, вы смотрите на двоичный файл. Вы должны изучить файл с именем типа 'program.c.????.ssa', он должен быть сгенерирован в том же каталоге, где находится ваш program.c.   -  person SK-logic    schedule 20.03.2013
comment
@SK-логика Хорошо. Так лучше выглядит :Р   -  person d0rmLife    schedule 20.03.2013


Ответы (1)


Попробуйте взглянуть на справочник по языку.

Насколько мне известно, в GCC есть IR, известный как GIMPLE (еще один ссылка здесь).

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

person Jorge Israel Peña    schedule 18.03.2013
comment
@d0rmLife Действительно, я считаю, что сайт gcc временно не работает, я все равно связал их, потому что это ссылки, которые вы захотите увидеть (также известные как официальные и т. Д.) - person Jorge Israel Peña; 19.03.2013