2017-06-13 2 views
2

Par exemple:Comment obtenir la valeur réelle des variables globales dans LLVM

int x=0; 
int y=0; 

où x et y sont des variables globales, et en fonction main() nous faisons ce qui suit:

x++; 
y++; 

Comment pour obtenir la plus nouvelle valeur des variables globales x et y dans llvm.

lorsque je tente de faire errs()<<g; ils donnent la valeur initiale @BB0 = global i32 mais je dois obtenir la valeur réelle comme x=1, en utilisant LLVM.

+0

Quand, exactement , exécutez-vous LLVM? Pourquoi attendez-vous qu'il connaisse les valeurs d'exécution? – Oak

+0

J'implémente le code dans MCJIT pour obtenir toutes les instructions. Je veux obtenir la valeur de la variable globale par son nom après avoir exécuté lli file.ll –

+0

Est-ce possible, pour récupérer la valeur de chaque variable globale? –

Répondre

2

Un global est fondamentalement un pointeur. Vous pouvez obtenir l'adresse dans le programme hôte via ExecutionEngine::getGlobalValueAddress, puis vous pouvez déréférencer cette adresse afin d'obtenir la valeur enregistrée.

+0

C'est ce dont j'ai vraiment besoin. Merci –

+0

En outre, existe-t-il une méthode pour obtenir la valeur réelle de la variable locale. Not getValue() Je veux une valeur réelle (comme 1, 2, 3.5, etc) –

+0

@ R.Omar comme c'est une nouvelle question (bien que liée), s'il vous plaît poser cette question séparément. – Oak

1

En supposant que vous utilisez l'API de LLVM:

Si le monde est constante, vous pouvez accéder à sa valeur d'initialisation directement, par exemple:

Constant* myGlobal = new GlobalVariable(myLlvmModule, myLlvmType, true, GlobalValue::InternalLinkage, initializationValue); 
... 
Constant* constValue = myGlobal->getInitializer(); 

Et si cette valeur est par exemple type entier, vous pouvez le récupérer comme ceci:

ConstantInt* constInt = cast<ConstantInt>(constValue); 
int64_t constIntValue = constInt->getSExtValue(); 

Si le monde n'est pas constante, vous devez charger les données qu'il pointe vers (tous sont en fait des pointeurs GLOBALS):

Value* loadedValue = new LoadInst(myGlobal);