Я хотел бы заставить исходные строки C, встроенные с выводом блока видеть, какой код генерируется.
Я попробовал опции GCC как -S
-Wa,-ahlms
(и даже -Wa,--gstabs
Потому что я считал его где-нибудь).
О! BTW, я нахожусь на Mac, таким образом, я не имею objdump
.
(Извините это коротко, я должен выйти из поезда!)
Вывод gcc pc-clisp.c -S -g -fverbose-asm -fnested-functions
.globl _getBool
_getBool:
LFB32:
LM21:
pushl %ebp #
LCFI30:
movl %esp, %ebp #,
LCFI31:
subl $8, %esp #,
LCFI32:
LM22:
movzbl 8(%ebp), %eax # atom.pred, D.4112
movzbl %al, %eax # D.4112, D.4113
andl $-16, %eax #, D.4114
sarl $4, %eax #, D.4115
testl %eax, %eax # D.4115
setne %al #, tmp64
movzbl %al, %eax # tmp64, D.4111
leave
ret
LFE32:
Может быть, отладка + этап постобработки?
gcc <source.c> -S -g -fverbose-asm
Найдите .file 1 "1.c"
, чтобы сказать вам номер файла для сопоставления имени файла.
Затем добавьте источник после строк .loc 1 8 0
. Я не уверен, как это сделать с помощью одной команды оболочки, но короткий сценарий должен уметь это сделать:
#!/usr/bin/env python
import re
import sys
filename = sys.argv[1]
f = open(filename)
lines = f.readlines()
f.close()
FILE_RE=re.compile(r"\s+\.file (\d+) \"(.*)\"")
LOC_RE =re.compile(r"\s+\.loc (\d+) (\d+)")
output = []
files = {}
for line in lines:
output.append(line)
mo = FILE_RE.match(line)
if mo is not None:
files[mo.group(1)] = open(mo.group(2)).readlines()
print mo.group(1),"=",mo.group(2)
continue
mo = LOC_RE.match(line)
if mo is not None:
print mo.group(1),"=",mo.group(2)
source = files[mo.group(1)][int(mo.group(2))-1]
output.append("\t#"+source)
f = open(filename+".2","w")
f.writelines(output)
f.close()
Это не совсем то, о чем вы просите, но вы можете найти -S -fverbose-asm
полезным.