Мне нужно напечатать название вызываемых функций программы, используя 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 ??
Могу ли я также распечатать другую информацию, такую как номер строки, в которой она была вызвана, имя функции, в которой она была вызвана и т. Д.?
Я знаю три способа:
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);
Я искал ответ часами, ответ на самом деле довольно прост:
get_name(tree node)
… Я пробовал много функций, так как документация действительно плохая … Я нашел это здесь:
Справочник по среднему и внутреннему API GCC
Как вы можете видеть, нет никаких комментариев о том, что функции делают, и это в любом случае выходит из лучшей документации, которую я нашел о gcc get_name(..)
работает нормально, но я еще не нашел, как напечатать исходную строку