タイプ 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 で十分ですか?
- これを行うエレガントな方法はありますか?
ありがとう!