5

タイプ i32 の 2 つの引数を渡して関数を選択する LLVM を作成したいと考えています。私の最初の試み(下図)は失敗しました:

bool MyFunctionPass::runOnFunction(Function &f) 
{
    Type *int32 = Type::getInt32Ty(f.getParent()->getContext());
    Argument *xC = new Argument(int32, "__xC", &f);
    ...

上記を試すと、モジュール検証ツールがクラッシュします。新しく追加された引数の型は、ジャンク 0xCDCDCDCD (初期化されていないヒープ メモリ) です。関数型はそのままです。

void (i32 addrspace(1)*, i32 addrspace(1)*, i32)

新しい によって拡張される代わりにi32

また、コンストラクター自体が関数にリンクしているため、パラメーター リストに直接パラメーターを追加するとFunction::getArgumentList()失敗し、Argumentこれは二重リンクとして検出されます。

  • これを行うには ModulePass が必要ですか、それとも FunctionPass で十分ですか?
  • これを行うエレガントな方法はありますか?

ありがとう!

4

1 に答える 1

8

関数に引数を追加するのは驚くほどトリッキーです。ご存知のように、引数リストを変更するほど簡単ではありません。

それを行う最も簡単な方法は、おそらく最初にすべての元の引数と追加の引数を使用して新しい関数を作成し、次に呼び出しCloneFunctionIntoて元の関数を新しい関数内に埋め込むことです。

于 2014-03-19T08:10:47.103 に答える