【问题标题】:Is there a compiler (for GCC and/or Clang) setting that limits compiled function length?是否有限制编译函数长度的编译器(用于 GCC 和/或 Clang)设置?
【发布时间】:2015-09-15 19:19:34
【问题描述】:

对于我正在处理的程序,我想限制每个编译函数的长度,以便提供到达函数所需距离1 的硬上限边界2。 GCC 或 Clang(或实际上任何编译器框架/工具链)中是否有一个选项可以启用函数拆分来执行此操作?或者是否存在我不知道的限制?

1 此处的距离定义为任何小于函数的离散单位 - 即指令数、基本块数、Jon Skeet 头上的白发数3等。

2 我将函数边界定义为“将新堆栈帧推入 CPU 堆栈的位置”。据我了解,这几乎只发生在调用新函数时(偶尔会出现自身不调用其他函数的叶函数)。

3 这只是个玩笑。我们都知道 Jon Skeet 的头发并没有变灰 - 它只是垃圾收集并实例化了新头发,就像新的一样。

【问题讨论】:

  • 其中一个限制是,当谈论指令数变得有意义时,重构代码已经太晚了(或者,如果您愿意,可以使用这种重构的数据结构)有意义不对应于可以计算的指令)。无论如何,什么是“功能边界”?无偿地拥有更多的功能边界有什么好处?
  • @PascalCuoq 我在问题中添加了我对“函数边界”的定义。至于为什么-有一个长而短的答案;简短的回答是我正在开发一个动态运行时工具,该工具可以在程序执行的任何时候使用,但在下一个函数边界处停止(如问题中所定义)。我想在到该边界的距离上尽可能地提供一个上限。您提到的限制是有道理的;是否可以将限制基于其他标记(即基本块的数量)?

标签: gcc clang llvm compiler-optimization


【解决方案1】:

我不知道有任何编译器开关,但您不需要。使用nm很容易获得文本段中符号的大小:

$ nm -AP a.out|awk '$3=="T" {print $2 " " $5}'
main 000000000000005b

请注意,这需要一个未剥离的可执行文件。许多nm 实现提供了额外的选项,例如十进制数字而不是十六进制,这使得比较数字更容易一些。将其转换为脚本以输出大于 X 的函数作为练习:-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    • 2012-09-24
    相关资源
    最近更新 更多