Опитвайки се да разбера 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 отдавна е отхвърлен. Неговата функционалност вече се реализира чрез плъгина dragonegg gcc.   -  person Eli Bendersky    schedule 19.03.2013
comment
@EliBendersky: Благодаря. Забелязах, че е доста старо.   -  person Robert Harvey    schedule 19.03.2013
comment
Може би източникът на вашето объркване е терминът C байткод - няма такова нещо. Междинното представяне на LLVM (наречено LLVM bitcode или 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 изглежда като wingdings... или така трябва да изглежда?   -  person d0rmLife    schedule 20.03.2013
comment
@d0rmLife, ти гледаш двоичен файл. Трябва да разгледате файла с име като 'program.c.????.ssa', той трябва да бъде генериран в същата директория, където е вашият program.c.   -  person SK-logic    schedule 20.03.2013
comment
@SK-logic Хубаво. Така изглежда по-добре :P   -  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