gpt4 book ai didi

c - 消除 GOT 寄存器的冗余负载?

转载 作者:太空宇宙 更新时间:2023-11-04 02:17:42 27 4
gpt4 key购买 nike

我正在处理一些在编译为 PIC(位置无关代码)时速度变慢 70-80% 的代码,并且正在寻找缓解问题的方法。问题的很大一部分是 gcc 坚持在每个函数中插入以下内容:

call __i686.get_pc_thunk.bx
addl $_GLOBAL_OFFSET_TABLE_,%ebx

即使最终只占函数内容的 20%。现在,ebx 是一个调用保留寄存器,相关翻译单元(源文件)中的每个 函数都用 GOT 的地址加载它,并且很容易检测到static 函数不能从翻译单元外部调用(它们的地址永远不会被获取)。那么,为什么 gcc 不能在大型外部链接函数的开头加载一次 ebx,并生成静态链接函数,以便它们假定 ebx 已经加载GOT的地址?是否有任何优化标志我可以用来强制 gcc 进行这种明显而大规模的优化,而不是将内联限制提高到天高,以便所有内容都内联到外部函数中?

最佳答案

可能没有通用的解决方法,但您可以尝试使用内联选项。我猜测编译单元中的 static 函数没有太多调用者,因此代码复制的开销不会太糟糕。

使用 gcc 强制执行此类操作的最简单方法是设置 attribute((always_inline))。您可以使用依赖于 gcc 的宏来确保可移植性。

如果您不想修改代码(但 static inline 无论如何都会很好),您可以使用 -finline-limit 选项对其进行微调。

关于c - 消除 GOT 寄存器的冗余负载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5075178/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com