Вывести имя вызываемой функции с помощью плагина GCC

Мне нужно напечатать название вызываемых функций программы, используя 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?? Могу ли я также распечатать другую информацию, такую ​​как номер строки, в которой она была вызвана, имя функции, в которой она была вызвана и т. Д.?

2 ответа

Решение

Я искал ответ часами, ответ на самом деле довольно прост: get_name(tree node)... Я пробовал много функций, так как документация действительно плохая... Я нашел это здесь: GCC Middle and Back End API Reference

Как вы можете видеть, нет никаких комментариев о том, что функции делают, и это в любом случае выходит из лучшей документации, которую я нашел о gcc get_name(..) работает нормально, но я пока не нашел, как напечатать исходную строку

Я знаю три способа:

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);
Другие вопросы по тегам