Получить количество функций файла c++, скомпилированного с помощью плагина gcc.

Я создаю проход с помощью плагинов GCC, это мой проход:

static const struct pass_data calls_printer_pass_data = {
                .type                   = GIMPLE_PASS,
                .name                   = "calls_printer",
                .optinfo_flags          = OPTGROUP_NONE,
                .has_gate               = false,
                .has_execute            = true,
                .tv_id                  = TV_NONE,
                .properties_required    = 0,
                .properties_provided    = 0,
                .properties_destroyed   = 0,
                .todo_flags_start       = 0,
                .todo_flags_finish      = 0
};

class calls_printer_pass : public gimple_opt_pass {
public:
        calls_printer_pass() : gimple_opt_pass(calls_printer_pass_data, g) {}
        unsigned int execute() { return toto(); }
};

int plugin_init (plugin_name_args* plugin_info,
             plugin_gcc_version* ver)
{
  cerr << "starting " << plugin_info->base_name << endl;
  const char * const plugin_name = plugin_info->base_name;
  const int argc = plugin_info->argc;
  const struct plugin_argument * const argv = plugin_info->argv;
  struct register_pass_info calls_printer_info;

  calls_printer_info.pass                         = new calls_printer_pass();
  calls_printer_info.reference_pass_name          = "ssa" ;
  calls_printer_info.ref_pass_instance_number     = 1;
  calls_printer_info.pos_op                       = PASS_POS_INSERT_AFTER;
  register_callback (plugin_name,
                     PLUGIN_PASS_MANAGER_SETUP,
                     NULL,
                     &calls_printer_info);
  return 0;
}

поэтому toto() выполняется для каждой определенной функции, возможно ли получить количество всех функций при выполнении toto(), если нет, как я могу выполнить проход только один раз для всего файла и выполнить цикл через все функции, используя FOR_EACH_FUNCTION( ) ?


person Othman Benchekroun    schedule 02.04.2015    source источник
comment
На самом деле нет необходимости создавать проход для определения количества функций в исходном файле C++. В этом случае toto() выполняется для каждой функции в исходном файле. Вы можете просто объявить глобальную переменную внутри плагина, которая будет отслеживать счетчик, и хук в ALL_PASSES_START, который просто увеличивает эту глобальную переменную.   -  person Shahzad    schedule 03.06.2015
comment
Я не создавал проход для того, чтобы подсчитать количество функций, я создал проход (для какой-то цели и мне нужно было получить количество функций. И я знаю, что могу посчитать количество вызовов toto(), но это не то, что я хочу Я хочу получить количество функций при первом вызове toto()   -  person Othman Benchekroun    schedule 04.06.2015


Ответы (2)


Вы можете получить желаемый эффект, написав пропуск «IPA». Это «межпроцедурные» проходы, и они имеют доступ к графу вызовов (и пулу переменных).

person Tom Tromey    schedule 04.06.2015
comment
Ядро Linux цикломатическая сложность использует IPA. - person artless noise; 19.07.2019

person    schedule
comment
так просто, но я был в ловушке примерно на одну ночь, спасибо - person lllllllllllll; 17.02.2021