Linux内核调用堆栈转储通常包含以“.isra.NNN”结尾的函数名称,其中NNN是一些数字。例如,请参见herehere

这是什么意思,数字表示什么?

最佳答案



gcc manual:

-fipa-sra



在此选项下优化的所有函数的名称后均附加了isra。我研究了gcc代码,并发现了附加字符串的函数。
tree
clone_function_name (tree decl, const char *suffix)
{
  tree name = DECL_ASSEMBLER_NAME (decl);
  size_t len = IDENTIFIER_LENGTH (name);
  char *tmp_name, *prefix;

  prefix = XALLOCAVEC (char, len + strlen (suffix) + 2);
  memcpy (prefix, IDENTIFIER_POINTER (name), len);
  strcpy (prefix + len + 1, suffix);
#ifndef NO_DOT_IN_LABEL
  prefix[len] = '.';
#elif !defined NO_DOLLAR_IN_LABEL
  prefix[len] = '$';
#else
  prefix[len] = '_';
#endif
  ASM_FORMAT_PRIVATE_NAME (tmp_name, prefix, clone_fn_id_num++);
  return get_identifier (tmp_name);
}

在这里,参数2 const char *suffix"isra",请注意函数宏ASM_FORMAT_PRIVATE_NAME的底部,该函数将clone_fn_id_num++作为其第三个参数。这是在"isra"之后找到的任意数字。它的名称就是在此编译器选项下克隆的函数的计数(或者可以是跟踪所有克隆函数的全局计数器)。

如果您想了解更多信息,请在文件modify_function中搜索gcc/tree-sra.c,该文件又调用cgraph_function_versioning(),该文件将"isra"作为最后一个参数。

10-07 17:31