Linux kernel “什么是”呢;isra“;在内核线程转储中

Linux kernel “什么是”呢;isra“;在内核线程转储中,linux-kernel,Linux Kernel,Linux内核调用堆栈转储通常包括以“.isra.NNN”结尾的函数名,其中NNN是一些数字。例如,请参见和 这意味着什么,这个数字意味着什么 isra是在执行gcc选项-fipa sra编译器优化时添加到函数名的后缀 发件人: 对骨料进行程序间标量替换,移除未使用的骨料 参数和用传递的参数替换引用传递的参数 按价值计算 在-O2、-O3和-Os级别启用 在此选项下优化的所有函数的名称后都附加了isra。我深入研究了gcccode,找到了追加字符串的函数 tree clone_function_

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

这意味着什么,这个数字意味着什么

isra
是在执行
gcc
选项
-fipa sra
编译器优化时添加到函数名的后缀

发件人:

对骨料进行程序间标量替换,移除未使用的骨料 参数和用传递的参数替换引用传递的参数 按价值计算

-O2
-O3
-Os
级别启用

在此选项下优化的所有函数的名称后都附加了
isra
。我深入研究了
gcc
code,找到了追加字符串的函数

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\u FORMAT\u PRIVATE\u NAME
的底部,它将
clone\u fn\u id\u num++
作为第三个参数。这是在“isra”之后找到的任意数字。它的名称是在此编译器选项下克隆的函数数(或者可能是跟踪所有克隆函数的全局计数器)


如果您想了解更多信息,请在文件
gcc/tree sra.c
中搜索
modify\u function
,它依次调用
cgraph\u function\u versioning()
,该函数将
“isra”
作为最后一个参数传递。

我认为这可能与ftrace和内联函数有关。NNN将是内联函数的偏移量。此线程将帮助您
-fipa src
:您的意思是
-fipa sra
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);
}