2016-04-26 14 views
0

LLVMフレームワークの学習では、メソッドが呼び出されたときに実行時に各メソッドの名前を出力する「最適化」パスを実装しようとしています。LLVM:関数パスからのグローバル変数へのアクセス

私はグローバル変数だけモジュールパスに作成する必要があることを読んで、私はそこに文字列(機能ごとに1つ)を作成し、

Constant* data = ConstantDataArray::getString(M.getContext(), F.getName()); 

GlobalVariable* gvar = 
    new GlobalVariable(M, 
        data->getType(), 
        true, 
        GlobalValue::ExternalLinkage, 
        data, 
        "fname_" + F.getName().str()); 

でこれは文字列が正しくレイアウトされている限り、正常に動作します'最適化された'ビットコードによって生成されたアセンブリファイル内のメモリに格納されます。

しかし、これらの文字列を関数パスに出力するための呼び出しを挿入する方法が見つかりませんでした。 は私が

Value* string = F.getValueSymbolTable().lookup("fname_" + F.getName().str()); 
CallInst* call = builder.CreateCall(emitPutS(string, builder, &TLI)); 

を使用したいが、stringNULLとして戻ってきます。関数からグローバル変数を参照する良い方法はありますか?

答えて

0

はそれを考え出した:

基本ブロックはgetModule()方法を持っている、とモジュールはgetGlobalVariable(StringRef Name)方法を持っています。

また、関数パスからIRBuilder:CreateGlobalStringPtr(...)を呼び出して、Value*を返すことで、emitPutS(...)に直接渡すことができます。モジュールパスは必要ありませんでした。

注:CallInst* call = builder.CreateCall(emitPutS(string, builder, &TLI));は間違っています。 emitPutS(...)は、すでに基本ブロックにコールを作成します。 CreateCallは誤りです。

関連する問題