2017-04-25 15 views
4

宣言された関数に渡された値を取得し、それを出力する必要があるLLVMパスを記述しています。宣言された関数がLLVM IRで呼び出されていることに注意してください。ランタイム中に宣言された関数の引数値を取得する

私は、モジュールパスを書いて、プログラム内のすべての命令について反復処理を行いました。命令で呼び出された関数の引数を取得するためのスニペットは次のとおりです。

invoke void @function_name(i8* %4, i8* bitcast (i8** @_ZTIi to i8*), i8* null) #5 
      to label %36 unwind label %6 

その後、私の上記のコード:

for (auto &B: F){ 
       for (auto &I: B){ 
        if (auto *InvokeI = dyn_cast <InvokeInst>(&I)) { 
         if (InvokeI->getCalledFunction()->getName().str() == "function_name") { 
          errs() << "===\n"; 
          errs() << *(InvokeI->getOperand(0)) <<"\n"; 
          errs() << *(InvokeI->getOperand(1)) <<"\n"; 
          errs() << *(InvokeI->getOperand(2)) <<"\n"; 
         } 
        } 
       } 

} 

機能のためにLLVM IRが呼び出さ取得ただし場合は、次のようになりますスニペット出力:

%4 = call i8* @__cxa_allocate_exception(i64 4) #2 
i8* bitcast (i8** @_ZTIi to i8*) 
i8* null 

代わりの関数呼び出しの間に渡されている実際の値をoutputing。

私の質問は、実行時に渡される値を取得する方法です。何も返さない関数宣言に関数本体を追加する方法はありますか?

この上の任意のヘルプは高く評価され、 おかげ

+0

これは、例外を生成するための 'C++ abi'呼び出しです。ペーストビンやそれに類似した場所でそのIRを生成する元のソースコードの最小限のスニペットを提供できますか? – compor

+0

実際には関数名は '__cxa_throw'であり、そのIRを生成するコード行は基本的に' thow 1'だけで、それを捕まえようとしていました – Nik391

+0

少し混乱しています。あなたがC++ [ABI](https://itanium-cxx-abi.github.io/cxx-abi/)を指し示すものを残しているからです。 – compor

答えて

1

例外は、プログラムの実行中にその機能を提供するために、プログラムの制御フローを変更します。プログラムスタックを操作したり、クリーンアップなどを実行する実行時構成では、runtime systemのサポートが必要です。このため、実装全体でどのように動作させるべきかを標準化するABI standardがあります。

あなたがその仕様を掘り下げれば、__cxa_throwの引数はとなります。見てくださいhere。上記のフラグメントは、型情報と共に割り当てられた例外の位置へのポインタを含みます。実際にc++filt_ZTIiに適用すると、typeinfo for intとなります。

つまり、文throw 1によってスローされた整数1は、実行時にアクセスされる例外オブジェクト(つまり、メモリ位置)にラップされます。これらの値がどこにどのように格納されるかについてのより詳細な詳細は前述の仕様に含まれています。私は、特定の値に静的にアクセスする簡単な方法は見当たりません。なぜなら、何か例外がアクティブであり、正確な内容が実行中のプログラムの状態(例えばコールスタックなど)に依存しているからです。

+0

ニース、入力していただきありがとうございます。実際にはコンパイル時に例外をキャッチしようとすると複雑になります(明らかに私は今やっています)。しかし、JITを使用すると実行時にthrow引数をgrepする方が、もう一度私はそれを使用する方法がかなりわからない:) – Nik391

関連する問題