gby*_*gby 4 c gcc inline-assembly compiler-optimization compiler-options
请考虑以下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;
}
Run Code Online (Sandbox Code Playgroud)
如果我用它构建它:
gcc -O test.c
Run Code Online (Sandbox Code Playgroud)
它建立得很好.
如果我用它构建它(没有优化):
gcc test.c
Run Code Online (Sandbox Code Playgroud)
它在组装阶段失败,因为该值'5'不会作为直接值传播到内联函数测试,因此我们使约束失败.
我希望能够在不启用其他非相关优化的情况下编译此代码,以便更轻松地进行调试.
从理论上讲,-O它只是一个捷径,可以在GCC手册中记录一系列GCC优化选项.不幸的是,我无法找到打开此行为的特定GCC标志.
有任何想法吗?
澄清:为了减轻任何疑问,代码片段只是一个例子.除了展示我想要做的事情之外,它本身并没有多大意义.实际的用例涉及一个自定义处理器上的指令,该指令只能立即作为我试图在C结构中包装的参数.一个宏确实可以做到这一点,但是遭受了宏的所有通常的缺点,因此我试图避免它.
更新:对于那些想知道的人,一个宏也不会工作.似乎内联函数根本不起作用.例如,这也不起作用:
void foo (void)
{
int i = 6;
asm volatile ("" : : "i" (i));
}
Run Code Online (Sandbox Code Playgroud)
我还修正了问题标题以反映这一点.
看起来像 -ftree-ter (替换SSA中的临时表达式 - >正常传递 - 无论是什么)可以解决问题:
gcc -ftree-ter test.c # no errors
Run Code Online (Sandbox Code Playgroud)
以下是我如何确定:
gcc -Q --help=optimizers 告诉您默认启用/禁用哪些优化(一些已启用)gcc -O -Q --help=optimizers 告诉您启用/禁用哪些优化 -O-O指定的情况下启用的优化,直到一个工作.| 归档时间: |
|
| 查看次数: |
2763 次 |
| 最近记录: |