我有翻译与此功能的GCC交叉编译一些PowerPC汇编代码:

uint32_t fill_cache(void)
{
    __asm__ ("addi 3, 0, 0\n");  /* R3 = 0 */
    /* More asm here modifying R3 and filling the cache lines. */
}

其中,根据PowerPC的EABI,返回R3计算的值。在编译时,我得到
foo.c:105: warning: control reaches end of non-void function

有没有办法教gcc的一个值实际上是回来了?或者是有没有办法抑制警告(不删除-Wall或添加-Wno- *)?我想为了让一般的警告级别尽可能高的非常有选择性地禁止这种警告仅此功能。

它是不是让,因为计算的值被调用者不需要该功能,返回void的选项。

最佳答案

解决方案1个:与diagnostic pragmas您可以在本地抑制某些诊断检查。其提示用于在非void函数没有返回(其也通过-Wall隐含)特定选项是-Wreturn型。因此,特定的代码来抑制警告:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wreturn-type"
/* Your code here */
#pragma GCC diagnostic pop

你可以找出哪些选项是通过与-fdiagnostics出现选项编译引起警告。它只是追加选项的警告消息。

解决方案2:限定register variable并把它在所期望的寄存器中。使用结果代码引用inline assembler template中的变量:
uint32_t fill_cache(void)
{
  register uint32_t cacheVal __asm__ ("r3");

  __asm__ __volatile__ ("addi %0, 0, 0" : "=r" (cacheVal));
  /* More code here */

  return cacheVal;
}

volatile修饰符是为了确保该指令是不会被删除或以其他方式通过优化策略不希望影响。

首选解决方案2至少有两个原因:
  • 无返回非void函数的值就标准而言不确定的。
  • 有没有抑制(新)诊断警告没有企图打压摆在首位的风险。
  • 关于gcc - 如何抑制 "warning: control reaches end of non-void function",我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15927583/

    10-15 03:06