2012-01-03 18 views
6

Sto tentando di eseguire il seguente example per compilare, assemblare e disassemblare un piccolo programma utilizzando la catena di strumenti LLVM.Compilare, assemblare e smontare utilizzando la catena di utensili LLVM

La mia intenzione è di imparare come funziona, quindi, in ulteriori prove, potrei fare un test delle prestazioni cambiando e/o riordinando le istruzioni di assmbly.

Per cominciare, in primo luogo ho ottenere il codice morso di un programma fittizio:

% llvm-gcc -O3 -emit-llvm hello.c -c -o hello.bc 

Una volta che ho il codice morso, cerco di utilizzare la LLVM-dis utility per dare un'occhiata all'assemblea LLVM codice e llc per compilare il programma torna al montaggio nativo utilizzando il generatore di codice LLC (solo per la scossa di cercare):

% llvm-dis < hello.bc | less 
    % llc hello.bc -o hello.s 

Ma in entrambi i casi ottengo il seguente errore:

llvm-dis: Invalid MODULE_CODE_GLOBALVAR record 

Qualche idea su come risolvere questo problema?

Ho cercato su Google e non ho trovato una soluzione. Ho anche provato a usare

otool -tV hello 

Ma l'uscita non è compatibile con llvm. Invece di ottenere il seguente formato di montaggio:

.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 

ottengo:

__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 

Il che non è valido per me come io gatto compilare il secondo montaggio con ad esempio:

% gcc hello.s -o hello.native 

Grazie in anticipo.

+4

LLVM-GCC è deprecato. Puoi provare clang? – arrowd

+1

Ho il problema simile. L'hai risolto in qualche modo ??? – Cartesius00

risposta

5

Assicurati che la versione di llvm-gcc corrisponda alla versione di LLVM installata: il formato IR binario cambia abbastanza velocemente e non è retrocompatibile su più versioni.

In alternativa, si potrebbe provare a emettere testo rappresentazione di LLVM IR su llvm-gcc e assemblarlo tramite llvm-as.

Qualcosa di simile a questo:

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

ecc