2011-03-22 14 views
7

Soy un novato en LLVM y trato de generar un archivo .ll legible para humanos en Linux. Instalé llvm-gcc pero, como veo, puede generar solo código de ensamblaje (opción -S). ¿Hay alguna manera de obtener algo como lo que genera llvm en línea compiler?-emit-llvm en Linux

Eso es lo que me pasa con -S -emit-llvm en Linux:

.file "hello.c" 

    .ident "GCC: (Ubuntu/Linaro 4.5.1-7ubuntu2) 4.5.1 LLVM: " 

    .text 
    .globl main 
    .align 16, 0x90 
    .type main,@function 
main: 
    pushl %ebp 
    movl %esp, %ebp 
    subl $8, %esp 
    movl $.L.str, 4(%esp) 
    movl $1, (%esp) 
    call __printf_chk 
    xorl %eax, %eax 
    addl $8, %esp 
    popl %ebp 
    ret 
.Ltmp0: 
    .size main, .Ltmp0-main 

    .type .L.str,@object 
    .section .rodata.str1.1,"aMS",@progbits,1 
.L.str: 
    .asciz "hello world\n" 
    .size .L.str, 13 

    .section .note.GNU-stack,"",@progbits 

Eso es lo que estoy tratando de conseguir:

; ModuleID = '/tmp/webcompile/_7829_0.bc' 
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" 
target triple = "x86_64-linux-gnu" 

@.str = private constant [12 x i8] c"hello world\00", align 1 ; <[12 x i8]*> [#uses=1] 

define i32 @main() nounwind { 
entry: 
    %0 = tail call i32 @puts(i8* getelementptr inbounds ([12 x i8]* @.str, i64 0, i64 0)) nounwind ; <i32> [#uses=0] 
    ret i32 0 
} 

declare i32 @puts(i8* nocapture) nounwind 

En windows me sale con éxito este archivo con el mismo comando: llvm-gcc -S -emit-llvm hello.c.

Respuesta

7

Algo se rompe horrible en envases de ubuntu llvm-gcc. La versión de llvm-gcc es 4.2.1, pero aquí estamos viendo 4.5. Por favor, informe errores de Ubuntu.

+0

Funciona con -fplugin- arg-dragonegg-emit-ir – Nutel

+0

Bueno, llvm-gcc no es dragonegg. Si ubuntu está tratando de "engañar", entonces está de nuevo error de ubuntu :) –

2

Desde el LLVM tutorial:

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

compilará la fuente hello.c en un archivo de código de bytes hello.bc.

continuación, utilizar el llvm dis-utilidad para echar un vistazo al código ensamblador LLVM:

$ llvm-dis < hello.bc | less 
+1

Intenté pero obtengo "llvm-dis: firma de bitcode inválida". Tomé hello.c del tutorial, llvm-gcc compila el código sin ningún problema – Nutel

+1

Parece ser un error https://bugs.launchpad.net/ubuntu/+source/dragonegg/+bug/712199 – Nutel

3

Probar:

llvm-gcc -c -emit-llvm source.cpp 

uso -c en lugar de -S.

si no funciona, utilice:

clang -c -emit-llvm source.cpp 

Usted puede construir llvm ya sea desde Ubuntu centro de software o descargar llvm-3,0-src y sonido metálico-src a ellos compilar tu mismo.

0

Realice los pasos en http://clang.llvm.org/get_started.html esto instalará llvm y clang desde svn. Así que va a construir desde la fuente

pero con menor diferencia: ../llvm/configure --prefix =/usr/--enable-optimizado hacen -j4 make install (para instalar herramientas locales bajo/usr/local)

(+ instalar la liberación afirma en lugar de depuración + afirma o ir con ../llvm/configure para la depuración + afirma tengo una i5, así que utiliza maquillaje -j4 cambiar como desee)

usa clang not llvm-gcc. A continuación, puede generar directamente un .ll por: sonido metálico -S file.cpp -emit-llvm -o file.ll

y sonido metálico -c--emit llvm file.cpp -o file.bc

si desea obtener y .s hacer lo siguiente: archivo llc.bc

esta es la manera más limpia para la versión más reciente de llvm en ubuntu


Lo mismo sucede con llvm-gcc-4.6, que es también la versión dragonEgg supongo.

Me estoy llvm-gcc potencial incompatibles versión plug-in

Después de este punto me da exactamente el mismo error con llvm-dis:

"llvm-dis: firma de código binario no válido".

+0

¿Sabía que el script 'configure' (autoconf) ha sido eliminado de LLVM hace meses? Confiamos en CMake ahora. – Joky

+0

Sí, mi respuesta fue hace 3 años sin embargo. Fue así en ese momento. –

+0

Se perdió esto, lo siento. por alguna razón terminé aquí mientras miraba las cosas más recientes (o eso es lo que pensaba al menos ...) – Joky

0

Si quiere jugar con LLVM, construirlo desde la fuente: http://clang.llvm.org/get_started.html

De lo contrario, al inicio rápido, intente instalar sonido metálico en Ubuntu. Este es el compilador C/C++ construido sobre LLVM. Podrás generar LLVM IR directamente desde el clang.

llvm-gcc parece estar basado en el huevo de dragón, que ya no es compatible con LLVM AFAIK.