2011-03-15 20 views
18

creo un llvm :: * Valor de una constante entera como esta:LLVM obtener constante entera detrás de Valor *

llvm::Value* constValue = llvm::ConstantInt::get(llvmContext , llvm::APInt(node->someInt())); 

ahora quiero recuperar el tiempo de compilación valor constante hacia atrás;

int constIntValue = constValue->??? 

Los ejemplos mostrados en LLVM Programmer manual parecen implicar que fundido <> aceptará un puntero cuando se utiliza el tipo (en lugar del tipo más puntero) parámetro de plantilla, sin embargo estoy bastante seguro de que eso es que fallan como de 2,8:

llvm::Value* foo = 0; 
llvm::ConstantInt* intValue = & llvm::cast< llvm::ConstantInt , llvm::Value >(foo); 

//build error: 
//error: no matching function for call to ‘cast(llvm::Value*&)’ 

¿Cuál sería el enfoque correcto aquí?

Respuesta

25

Dada llvm::Value* foo y sabes que es en realidad un fooConstantInt, creo que el enfoque de código LLVM idiomática es utilizar dyn_cast de la siguiente manera:

if (llvm::ConstantInt* CI = dyn_cast<llvm::ConstantInt>(foo)) { 
    // foo indeed is a ConstantInt, we can use CI here 
} 
else { 
    // foo was not actually a ConstantInt 
} 

Si está completamente seguro de que es una fooConstantInt y están listos para ser golpeados con una falla de aserción si no es así, puede usar cast en lugar de dyn_cast.


P.S. Tenga en cuenta que cast y dyn_cast son parte de la propia implementación de RTTI de LLVM. dyn_cast actúa de manera similar al estándar C++ dynamic_cast, aunque existen diferencias en la implementación y el rendimiento (como puede ser read here).

27

La respuesta de Eli es genial, pero le falta la parte final, que es recuperar el número entero. El cuadro completo debe tener este aspecto:

if (ConstantInt* CI = dyn_cast<ConstantInt>(Val)) { 
    if (CI->getBitWidth() <= 32) { 
    constIntValue = CI->getSExtValue(); 
    } 
} 

Por supuesto, también puede cambiar a <= 64 si constIntValue es un entero de 64 bits, etc.

Y como escribió Eli, si está seguro de la el valor es de hecho del tipo ConstInt, puede usar cast<ConstantInt> en lugar de dyn_cast.

Cuestiones relacionadas