2011-10-16 28 views
8

Me gustaría registrar algunos comportamientos dinámicos en algunas variables globales. Así que escribí un pase para instrumentar el código e insertar algunas instrucciones para actualizar la variable global. Traté de usar el constructor GlobalVariable para definir una variable global, pero hay dos problemas. Primero, ¿cómo puedo DEFINIR las variables globales en el módulo que contiene la función principal? En segundo lugar, ¿cómo puedo DECLARAR esas variables globales en otros módulos? Es como "extern double someThing;".¿Cómo puedo declarar una variable global en LLVM?

Los programas de destino están escritos en C

+0

Qué idioma se utiliza? ([LLVM] (http://llvm.org/) no es un lenguaje, es "una colección de tecnologías modulares y reutilizables de compiladores y cadenas de herramientas"). –

+2

Parece que están utilizando la API LLVM para construir programas directamente, en lugar de compilar un idioma. –

+1

Sí, solo quiero insertar varias instrucciones. – dalibocai

Respuesta

21

Hay una herramienta que puede responder a esta y muchas otras preguntas acerca de la API LLVM: llc -march=cpp. Puede generar un archivo de código de bits usando Clang o llvm-gcc, y luego crear un código de C++ que debería reconstruir el mismo módulo usando el backend cpp.

Una salida de ejemplo, muestra cómo se define una variable global int *:

// Global Variable Declarations 

GlobalVariable* gvar_ptr_abc = new GlobalVariable(/*Module=*/*mod, 
     /*Type=*/PointerTy_0, 
     /*isConstant=*/false, 
     /*Linkage=*/GlobalValue::CommonLinkage, 
     /*Initializer=*/0, // has initializer, specified below 
     /*Name=*/"abc"); 
gvar_ptr_abc->setAlignment(4); 

// Constant Definitions 
ConstantPointerNull* const_ptr_2 = ConstantPointerNull::get(PointerTy_0); 

// Global Variable Definitions 
gvar_ptr_abc->setInitializer(const_ptr_2); 
+0

Parece C++, no C (la llamada 'ConstantPointerNull :: get()'). –

+6

@ Keith Thompson, no se puede escribir un pase de LLVM en C de todos modos, ¿cuál es el problema? –

+1

El OP dijo que los programas objetivo están escritos en C. (No estoy familiarizado con LLVM, así que no comentaré más). –

Cuestiones relacionadas