考虑以下 x86 代码示例:
#include <stdlib.h>
static int i;
static inline __attribute__((always_inline)) test(int x)
{
asm volatile("mov %1, %0" : "=r"(i): "i"(x));
}
int main(void)
{
test(5);
return i;
}
如果我构建它:
gcc -O test.c
构建良好。
如果我构建它(没有优化):
gcc test.c
它在组装阶段失败,因为值 '5'
没有作为立即值传播到内联函数测试,所以我们没有通过约束。
我希望能够在不开启其他不相关优化的情况下编译这段代码,以便于调试。
理论上,-O
只是一个快捷方式,可以同时启用一系列 GCC 优化选项,这些选项记录在 fine GCC manual 中。 .不幸的是,我无法找到打开此行为的特定 GCcflags。
有什么想法吗?
澄清:为了消除任何疑问,代码片段只是一个示例。除了展示我正在尝试做的事情之外,它本身没有多大意义。实际用例涉及自定义处理器上的指令,该指令只能将立即数作为我试图包装在 C 构造中的参数。宏确实可以解决问题,但会遇到宏所有常见的缺点,因此我尽量避免使用它。
更新:对于那些想知道的人,宏也不起作用。似乎内联函数在这里根本不起作用。例如,这也不起作用:
void foo (void)
{
int i = 6;
asm volatile ("" : : "i" (i));
}
我还修改了问题标题以反射(reflect)这一点。
最佳答案
看起来像 -ftree-ter
(替换 SSA 中的临时表达式->正常传递 - 不管是什么)就可以了:
gcc -ftree-ter test.c # no errors
我是这样决定的:
gcc -Q --help=optimizers
告诉您哪些优化是默认启用/禁用的(有些是启用的)gcc -O -Q --help=optimizers
告诉您为-O
启用/禁用了哪些优化
- 将这些命令的输出重定向到文件并比较它们。
- 尝试仅在指定
-O
时启用的优化,直到一个有效。
关于c - 为内联汇编参数打开即时值传播的特定 GCcflags是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11518097/