Я пытаюсь запустить следующий пример для компиляции, сборки и дизассемблирования небольшой программы с использованием цепочки инструментов LLVM.
Мое намерение состоит в том, чтобы узнать, как это работает, поэтому в дальнейших попытках я мог бы провести тест производительности, изменив и / или переупорядочив инструкции ассемблера.
Для начала я сначала получаю код прикуса фиктивной программы:
% llvm-gcc -O3 -emit-llvm hello.c -c -o hello.bc
Получив код bite, я пытаюсь использовать утилиту llvm-dis, чтобы взглянуть на код ассемблера LLVM и llc, чтобы скомпилировать программу обратно в собственную сборку с помощью генератора кода LLC (просто для того, чтобы попробовать ):
% llvm-dis < hello.bc | less
% llc hello.bc -o hello.s
Но в обоих случаях я получаю следующую ошибку:
llvm-dis: Invalid MODULE_CODE_GLOBALVAR record
Есть идеи, как решить эту проблему?
Я гуглил и не нашел решения. Я также пытался использовать
otool -tV hello
Но вывод не совместим с llvm. Вместо получения следующего формата сборки:
.section __TEXT,__text,regular,pure_instructions
.globl _main
.align 4, 0x90
_main:
Leh_func_begin1:
pushq %rbp
Ltmp0:
movq %rsp, %rbp
Ltmp1:
subq $16, %rsp
Ltmp2:
leaq L_.str(%rip), %rax
Я получаю:
__TEXT,__text) section
start:
0000000100000eb0 pushq $0x00
0000000100000eb2 movq %rsp,%rbp
0000000100000eb5 andq $0xf0,%rsp
0000000100000eb9 movq 0x08(%rbp),%rdi
0000000100000ebd leaq 0x10(%rbp),%rsi
0000000100000ec1 movl %edi,%edx
0000000100000ec3 addl $0x01,%edx
Это недопустимо для меня, так как я могу скомпилировать последнюю сборку, например:
% gcc hello.s -o hello.native
Заранее спасибо.