2

これを使用して、プログラムの呼び出された関数の名前を出力する必要があります。gcc plugins 後で呼び出されるパスを作成しましたssa pass。すでにプラグインを開始しており、次を使用してそのステートメントをループできますgimple_stmt_iterator

int read_calls(){
  unsigned i;
  const_tree str, op;
  basic_block bb;
  gimple stmt;
  tree fnt;
  FOR_EACH_BB_FN(bb, cfun) {
    gimple_stmt_iterator gsi;
    for (gsi=gsi_start_bb(bb); !gsi_end_p(gsi); gsi_next(&gsi))
    {
        stmt = gsi_stmt(gsi);
        if (is_gimple_call(stmt)){
          const char* name = THE_FUNCTION_I_NEED(stmt);
          cerr << " Function : " << name << " is called \n";
        }
    }
  }
  return 0;
}

gimpleノードを使用して、呼び出された関数の名前を出力するにはどうすればよいですか?? 呼び出された行番号、呼び出された関数の名前など、他の情報も出力できますか?

4

2 に答える 2

2

私は何時間も答えを探していましたが、答えは実際には非常に簡単です: get_name(tree node)...ドキュメントが本当に貧弱であるため、多くの機能を試してきました...ここで見つけました: GCC Middle and Back End API Reference

ご覧のとおり、関数が何をするかについてのコメントはなく、gcc について見つけた最高のドキュメントを終了しました。とにかくget_name(..)正常に動作していますが、ソース行を印刷する方法がまだ見つかりません。

于 2015-03-30T14:00:39.607 に答える
2

私は3つの方法を知っています:

1:

tree current_fn_decl = gimple_call_fndecl(stmt);
const char* name = function_name(DECL_STRUCT_FUNCTION(current_fn_decl);

2:

const char* name = IDENTIFIER_POINTER(DECL_NAME(current_fn_decl));

3:

tree current_fn_decl = gimple_call_fndecl(stmt);
const char* name = get_name(current_fn_decl);
于 2015-06-08T18:58:38.467 に答える