2011-06-16 14 views
10

estoy escribiendo a compiler que utiliza LLVM como backend, y mi compilador genera el siguiente código ensamblador LLVMmontaje LLVM: asigno constante entera para registrar

@0 = private constant [25 x i8] c"Hello World to %dntegers\00" 

declare void @printf (i8*, i32) 

define void @main() { 
    %1 = getelementptr [25 x i8]* @0, i32 0, i32 0 
    %2 = 1 
    tail call void @printf(i8* %1, i32 %2) 
    ret void 
} 

Pero me sale el siguiente error:

c.ll:8:8: error: expected instruction opcode 
    %2 = 1 
    ^

La documentación muestra examples like that embargo.

¿Sabes cómo hacer que esto funcione? Actualmente, estoy usando en su lugar:

%2 = add i32 0, 1 ; FIXME 
+2

¿Por qué quieres vincular un valor constante a un nombre? Simplemente use la constante en su lugar, como en 'tail call void @printf (i8 *% 1, i31 1)'. Por cierto, ¿estás generando IR como un texto? ¿Para qué? –

+2

Porque esto es más simple para el generador de código. Estoy usando IR textual porque no tengo acceso fácil a librerías C/C++ del lenguaje que estoy usando. – Mildred

Respuesta

13

Véase la discusión LLVMdev "How to assign a constant to a register?" Como ha señalado que hay por Duncan Sands:

let me say that in general doing this is pointless. Due to SSA form, if %x is set to 5 you can't set it to something else later. Thus everywhere that you use %x you might as well just directly use 5 there instead. A common situation is that you have a register %x, and due to performing optimizations you discover that in fact %x will always have the value 5. You can use RAUW (aka the replaceAllUsesWith method) to replace %x with 5 everywhere.

El hilo generó un par de alternativas para el uso directamente la constante:

  • Utilice alloca para obtener un puntero, almacénelo, luego cargue el valor según sea necesario.
  • Crea un indicador global de la constante, luego carga ese valor según sea necesario.

Alguien señaló que el enfoque alloca terminará usando un registro después de la optimización.

De todos modos, usar la constante directamente como lo sugiere @ SK-logic parece ser la solución más limpia.

+0

Finalmente, trabajo alrededor de mi generador de código para evitar la creación de un registro aquí. – Mildred