2017-06-13 11 views
2

にグローバル変数の実際の値を取得します方法例えばLLVM

int x=0; 
int y=0; 
xとyはグローバル変数であり、main()関数では、我々は次の操作を行い

x++; 
y++; 

方法llvmのグローバル変数xとyの最新の値を取得します。

は、私は、彼らが@BB0 = global i32 として初期値を与えるerrs()<<g;をしようとするとき、私はLLVMを使用することにより、x=1のように実際の値を取得する必要があります。

+0

すると、正確に、あなたはLLVMを実行していますか?なぜそれが実行時の値について知っていると思いますか? – Oak

+0

MCJITにコードを実装してすべての命令を取得します。 lli file.llを実行した後、その名前でグローバル変数の値を取得したい –

+0

これは可能ですか?各グローバル変数の値を戻すことは可能ですか? –

答えて

2

グローバルは基本的にポインタです。あなたはExecutionEngine::getGlobalValueAddress経由でホストプログラムのアドレスを取得することができますし、格納された値を取得するためにそのアドレスを逆参照することができます。その値は、例えばのであれば

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

をそして:グローバルが一定であれば、たとえば、あなたが直接その初期値にアクセスすることができます

:あなたと仮定すると

+0

それは私が本当に必要なものです。ありがとうございます –

+0

さらに、ローカル変数の実際の値を取得するメソッドがありますか? not getValue()私は実際の値(1、2、3.5など) –

+0

@ R.Omarを新しい(それに関連していますが)質問したいので、別に質問してください。 – Oak

1

はLLVMのAPIを使用しています整数型、あなたはそうのようにそれを取得することができます。

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

地球が一定でない場合、あなたはそれが指すデータをロードする必要があります(すべてのグローバルが実際にポインタです):

Value* loadedValue = new LoadInst(myGlobal);