2017-01-18 7 views
-1

基本的に実行時のチェックを追加することで呼び出し元/呼び出し先のマッピングを行います。 各C/C++の戻り値が になる前に許容範囲を調べます。仮想関数のすべての戻り値を対応する戻り値のアドレスにマップします

私はすべての仮想オブジェクトディスパッチを、指定されたクラス階層の仮想テーブルエントリ に順方向マッピングしています。 このデータはLLVM LTO中に収集されます。今私は のために同じことをしたいすべての仮想関数が返します。前方マッピングはどの機能がアクセス可能であるべきか私に を教えているので、私は を次の情報を正確に後方にマッピングするように決定する必要があります。

  1. クラン/ LLVMで仮想関数に含まれる各 リターンのリターンアドレスを取得する場所から。コンパイル時に この情報を取得することは可能ですか?

  2. 特定のリターンがどの機能に含まれているかを判断する方法。 次の関数が属するクラスを特定する方法は?事前に

おかげで、 ポール

+0

1.もちろん、リターンアドレスは実行時にスタックにプッシュされます。コンパイル時には使用できません。 2.私はこの質問の馬小屋や尻尾をすることはできません。 – EJP

+1

質問を編集して[これまでに試したこと](http://whathaveyoutried.com)を表示してください。問題のあるコードの[mcve]を含める必要があります。次に、特定の問題を解決するために役立つことができます。 [ask]も読んでください。 –

答えて

0

はいEJPあなたは、リターンアドレスがスタックに実行時にプッシュされますが、それぞれのリターンだったコール命令の次のアドレスに戻す必要があることを右です対応する関数を呼び出すために使用されていたので、コール命令の後(コール命令の後)はコンパイル時に取得できるアドレスでなければならないと考えていました。

上記のことが、コンパイラが各呼び出し命令の後に必要な情報を生成することについての指示よりも成り立たない場合は、

私のポストへの正確な正確な答えを楽しみにしています。 :)