gcc在系统调用之前优化变量

时间:2012-10-31 10:34:34

标签: c compiler-construction arm

使用Codesourcery arm-linux-eabi交叉编译器并且编译器没有执行某些代码时遇到问题,因为它认为它没有被使用,特别是对于系统调用。有没有办法解决这个问题?

例如,此代码不会初始化变量。

unsigned int temp = 42;
asm volatile("mov R1, %0 :: "r" (temp));
asm volatile("swi 1");

在这种情况下,temp永远不会被初始化为值42.但是如果我在初始化后添加了printk,它会被初始化为正确的值42.我尝试了

unsigned int temp __attribute__ ((used)) = 42;

仍然无效,但我收到一条警告信息:

  

'used'属性被忽略[-Wattributes]

这是在Linux内核代码中。

任何提示?

1 个答案:

答案 0 :(得分:4)

这不是使用内联汇编的正确方法。如上所述,这两个语句是分开的,并且没有理由编译器必须保留两者之间的任何寄存器值。您需要将两个汇编指令放在相同的内联汇编块中,并使用适当的输入和输出约束,或者您可以执行以下操作,使编译器更有效:

register unsigned int temp __asm__("r1") = 42;
__asm__ volatile("swi 1" : : "r"(temp) : "memory");

(请注意,我在clobber列表中添加了内存;我不确定您正在进行哪个系统调用,但如果系统调用写入用户空间中的任何对象,则需要在clobberlist中列出“memory”。)< / p>