c - 为内联汇编参数打开即时值传播的特定 GCcflags是什么?

标签 c gcc compiler-optimization inline-assembly 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;
}

如果我构建它:

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

我是这样决定的:

  1. gcc -Q --help=optimizers 告诉您哪些优化是默认启用/禁用的(有些是启用的)
  2. gcc -O -Q --help=optimizers 告诉您为 -O
  3. 启用/禁用了哪些优化
  4. 将这些命令的输出重定向到文件并比较它们。
  5. 尝试仅在指定 -O 时启用的优化,直到一个有效。

关于c - 为内联汇编参数打开即时值传播的特定 GCcflags是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11518097/

相关文章:

c - 错误 : function declared as function returning function

c - 为什么编译器会发出 : warning: assignment makes integer from pointer without a cast

c++ - 如何使用 make 链接 c++ 中不同目录中的对象而不在 makefile 中引用它们?

c++ - 如何知道一个共享库是否依赖于另一个共享库?

c - 如何在 gcc 中正确使用 __attribute__((fallthrough))

c++ - 如果仍然可以间接执行(通过回调函数),将 C 函数声明为静态函数是不好的做法吗?

c - 加入路径时出现段错误

c - 汇编函数具有相同的名称,后缀为 ..0 和 ..1

assembly - 是 mov rax,0x12345678; jmp rax 仍然会杀死分支预测吗?

c - 从 cmd.exe 运行时如何从 cscope-win32 启动 gvim.exe?