【问题标题】:Can we add `-fcall-used-REG` for specific functions on gcc?我们可以为 gcc 上的特定功能添加 `-fcall-used-REG` 吗?
【发布时间】:2019-09-02 02:20:08
【问题描述】:

我们可以告诉 gcc 特定函数不需要通过函数属性存储/恢复一些被调用者保存寄存器吗? 对于一个文件,我们可以通过-fcall-used-REGS 告诉它,但是文件中的所有功能都会受到影响。

我制作了一个汇编代码,其中存储了一些被调用者保存寄存器(例如 x86_64 上的 r12),并希望从 asm 代码中调用一些 C 函数。被调用函数不需要存储/恢复被调用者保存寄存器,因为 asm 代码存储/恢复它们,所以保存被调用者保存寄存器只是开销(被调用函数足够小,所以 pro/epilogue 代码的开销很大)。

【问题讨论】:

    标签: c gcc


    【解决方案1】:

    使用编译指示/属性优化可能是可能的,但实际上您应该将函数放在它们自己的文件中。这些函数必须完全独立,因为它们使用的是非默认 ABI。无论如何,将函数放在自己的文件中是一个好习惯。

    【讨论】:

    • 只是添加一些链接,pragma optimizeoptimize attribute。但我同意,对于 R,这些都是坏主意。事实上,我正在寻找是否可以用 C 语言编写 asm(我的第一选择),或者用 asm 编写回调。
    • 谢谢,但是我不能用属性添加这个选项:gist.github.com/ko1/d8b35bf015217a39d6b49a5f3918ba8a > __attribute__((optimize("-fcall-used-r12"))) void func_w_opt(void)
    • 几点:1)您使用的属性不正确。它在返回类型之后,而不是之前。 2)正确使用它无济于事。显然 gcc 不允许在函数上使用此选项,给出bad option。 3) 使用#pragma optimize 不会出错,但我不相信它也能按预期工作。 4) 从命令行使用-fcall-used-r12 可以得到我期望的结果。也就是说,我仍然认为这整个想法是有风险的。似乎还有其他方法可以提供优化的结果。但是我不能在没有看到更多代码的情况下推荐一个。
    • 好的,结论,看来原始问题的答案是“不可能”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多