考虑以下 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 优化选项的捷径,这些选项记录在精美的 GCC 手册中。不幸的是,我找不到打开此行为的特定 GCC 标志。
有任何想法吗?
澄清:为了消除任何疑问,代码片段只是一个示例。除了展示我正在尝试做的事情之外,它本身并没有多大意义。实际用例涉及自定义处理器上的指令,该指令只能将立即数作为参数,我试图将其包装在 C 构造中。宏确实可以解决问题,但会遇到宏的所有常见缺点,因此我试图避免它。
更新:对于那些想知道的人,宏也不起作用。看来内联函数在这里根本不起作用。例如,这也不起作用:
void foo (void)
{
int i = 6;
asm volatile ("" : : "i" (i));
}
我还修复了问题标题以反映这一点。