2011-12-04 18 views
10

Al construir el IR desde un AST existente, mi AST tiene algunos valores de cadena (en tiempo de compilación están construidos desde std::string) y quiero configurarlos de manera segura como llvm::Value para usar como parte de una expresión.Objetos de valor de cadena LLVM: ¿Cómo puedo recuperar la cadena de un valor?

En este caso, no es necesario vincular la cadena en tiempo de ejecución, porque los valores de cadena solo sirven para resolver cosas como variables, funciones o clases en tiempo de compilación (el lenguaje no admite una versión nativa tipo de cuerda).

Cuál es la mejor manera de mantener el contenido de mi cadena como llvm::Value y todavía ser capaz de recuperarlo en etapas posteriores de la compilación (cuando las expresiones de anidación se construyen)?

Más concretamente, si fijo el llvm::Value con:

llvm::Value* v = llvm::ConstantArray::get(llvmContext, myString.c_str()); 

¿Cómo puedo recuperar con seguridad el valor de la cadena? ¿Es llvm::ConstantArray la forma adecuada de ajustar cadenas?

Respuesta

5

Sí, ConstantArray es lo que debe usar aquí. Para recuperar el valor más tarde simplemente use ConstantArray :: getAsCString(). Si tiene activadas las afirmaciones, se activará si algo sale mal (por ejemplo, intentará tomar una cadena de la matriz sin terminador cero).

3

Correr http://llvm.org/demo/ en el código C char *x = "asdf"; da:

@.str = private unnamed_addr constant [5 x i8] c"asdf\00" 
@x = global i8* getelementptr inbounds ([5 x i8]* @.str, i64 0, i64 0), align 8 

Básicamente, para obtener la dirección de una cadena, usted tiene que construir un mundial que lo contiene. Puede cambiar http://llvm.org/demo/ para enviar llamadas API C++ si tiene problemas para averiguar cómo hacerlo.

Cuestiones relacionadas