2012-01-03 10 views
6

Estoy tratando de ejecutar el siguiente example para compilar, ensamblar y desmontar un pequeño programa utilizando la cadena de herramientas LLVM.Compilar, montar y desmontar utilizando la cadena de herramientas LLVM

Mi intención es aprender cómo funciona, así que en futuros intentos podría hacer una prueba de rendimiento cambiando y/o reordenando las instrucciones del asistente.

Para empezar, lo primero que obtener el código picadura de un programa simulado:

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

Una vez que tengo el código mordedura, intento utilizar el llvm-DIS utilidad para echar un vistazo a la asamblea LLVM LLC código y compilar el programa posterior al montaje nativa utilizando el generador de código LLC (sólo para el batido de tratar):

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

Pero en ambos casos me sale el siguiente error:

llvm-dis: Invalid MODULE_CODE_GLOBALVAR record 

¿Alguna idea sobre cómo resolver este problema?

He buscado en Google y no he encontrado una solución. También he intentado utilizar

otool -tV hello 

Pero la salida no es compatible con llvm. En lugar de obtener el siguiente formato de montaje:

.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 

me sale:

__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 

Lo cual no es válido para mí, ya que el gato compilar la última asamblea con por ejemplo:

% gcc hello.s -o hello.native 

Gracias por adelantado.

+4

llvm-gcc está en desuso. ¿Puedes intentar clang? – arrowd

+1

Tengo el problema similar. ¿Lo has resuelto de alguna manera? – Cartesius00

Respuesta

5

Asegúrese de que la versión de su llvm-gcc coincida con la versión de LLVM que instaló: el formato de IR binario cambia bastante rápido y no es compatible con versiones anteriores en varias versiones.

Alternativamente, puede tratar de emitir texto representación de LLVM IR de llvm-gcc y montarlo a través de llvm-as.

Algo como esto:

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

etc.

Cuestiones relacionadas