Компиляция, сборка и разборка с помощью цепочки инструментов LLVM - PullRequest
6 голосов
/ 03 января 2012

Я пытаюсь запустить следующий пример для компиляции, сборки и дизассемблирования небольшой программы с использованием цепочки инструментов 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

Заранее спасибо.

1 Ответ

5 голосов
/ 04 января 2012

Убедитесь, что версия вашего llvm-gcc соответствует версии LLVM, которую вы установили - двоичный формат IR изменяется довольно быстро и не совместим с предыдущими версиями для нескольких версий.

В качестве альтернативы, вы можете попробовать выдать текст представление LLVM IR из llvm-gcc и сборка через llvm-as.

Примерно так:

llvm-gcc -emit-llvm -S foo.c -o foo.ll
llvm-as foo.ll -o foo.bc
llc foo.ll -o foo.S

и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...