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

我知道三种方法:

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 回答