2011-10-16 3 views
8

Chciałbym nagrać niektóre dynamiczne zachowania w niektórych zmiennych globalnych. Napisałem więc hasło do przyrządu kodu i wstawiłem kilka instrukcji, aby zaktualizować zmienną globalną. Próbowałem użyć konstruktora GlobalVariable do zdefiniowania zmiennej globalnej, ale są dwa problemy. Po pierwsze, w jaki sposób mogę OZNACZAĆ zmienne globalne w module zawierającym funkcję główną? Po drugie, w jaki sposób ZDECYDOWAĆ te zmienne globalne w innych modułach? To jest jak "zewnętrzne podwójne";Jak mogę zadeklarować zmienną globalną w LLVM?

Programy docelowe są napisane w C.

+0

Jakiego języka używasz? ([LLVM] (http://llvm.org/) nie jest językiem, jest "zbiorem modułowych i wielokrotnego użytku technologii kompilatora i narzędzi"). –

+2

Wygląda na to, że używają interfejsu API LLVM do konstruowania programów bezpośrednio, a nie kompilacji języka. –

+1

Tak, chcę tylko wstawić kilka instrukcji. – dalibocai

Odpowiedz

21

Jest to narzędzie, które może odpowiedzieć na to i wiele innych pytań o LLVM API: llc -march=cpp. Możesz wygenerować plik bitcode przy pomocy Clang lub llvm-gcc, a następnie skompilować kod C++, który powinien zrekonstruować ten sam moduł przy użyciu zaplecza cpp.

Próbkę wyjścia, pokazując w jaki sposób zdefiniować zmienną globalną 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

To wygląda jak C++, a nie C (wywołanie "ConstantPointerNull :: get()"). –

+6

@ Keith Thompson, nie możesz napisać przepustki LLVM w C tak, więc w czym problem? –

+1

OP powiedział, że programy docelowe są napisane w C. (Nie znam LLVM, więc nie będę komentować dalej.) –