2011-03-24 10 views
6

Acabo de descubrir LLVM y todavía no sé mucho sobre él. Lo he estado probando usando llvm in browser. Puedo ver que cualquier código C que escribo se convierte a código de bytes LLVM que luego se convierte en código nativo. La página muestra una representación textual del código de bytes. Por ejemplo, para el siguiente código C:Escribiendo el código de byte de llvm

int array[] = { 1, 2, 3}; 

int foo(int X) { 
    return array[X]; 
} 

Se muestra el siguiente código de bytes:

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" 

@array = global [3 x i32] [i32 1, i32 2, i32 3] ; <[3 x i32]*> [#uses=1] 

define i32 @foo(i32 %X) nounwind readonly { 
entry: 
    %0 = sext i32 %X to i64       ; <i64> [#uses=1] 
    %1 = getelementptr inbounds [3 x i32]* @array, i64 0, i64 %0 ; <i32*> [#uses=1] 
    %2 = load i32* %1, align 4      ; <i32> [#uses=1] 
    ret i32 %2 
} 

Mi pregunta es: ¿Puedo escribir el código de bytes y darle al ensamblador llvm para convertir a los nativos ¿omitiendo el primer paso de escribir el código C por completo? Si es así, ¿cómo lo hago? ¿Alguien tiene alguna indicación para mí?

+1

http://llvm.org/docs /CommandGuide/index.html –

Respuesta

6

Sí, seguramente puede. Primero, puede escribir LLVM IR a mano. Todas las herramientas como llc (que generará un código nativo para usted) y opt (LLVM IR => LLVM IR optimizer) aceptan la representación textual de LLVM IR como entrada.

7

Una característica muy importante (y objetivo de diseño) de la lengua LLVM IR es su representación de 3 vías:

  • La representación textual se puede ver aquí
  • La representación de código de bytes (o binario)
  • La representación en memoria

Los 3 son completamente intercambiables. Nada de lo que se puede expresar en uno tampoco se puede expresar en los otros 2.

Por lo tanto, siempre que se ajuste a la sintaxis, puede escribir el IR usted mismo. Sin embargo, es inútil, a menos que se use como ejercicio para acostumbrarse al formato, ya sea para leer (y diagnosticar) el IR o para producir su propio compilador :)

Cuestiones relacionadas