2013-04-10 24 views
5

を、私はこの機能ではgccクロスコンパイラで翻訳されたいくつかのPowerPCアセンブリコードを持っている:PowerPCのEABIの下で、返し、どのように「警告:コントロールは非void型関数の終わりに到達した」抑制する

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

R3で計算された値。コンパイル時に

foo.c:105: warning: control reaches end of non-void function 

実際に値が返されることを教える方法はありますか?または、警告を抑制する方法があります(-Wallを削除したり-Wno- *を追加しないでください)?私は非常に一般的な警告レベルを可能な限り高くするために、この機能についてのみこの警告を選択的に抑制したいと思います。

計算された値が呼び出し側で必要なので、この関数にvoidを返させるオプションはありません。

答えて

12

解決策1:を使用すると、特定の診断チェックをローカルで抑制することができます。空でない関数で返されないと訴える特定のオプション(-Wallも含める)は、-Wreturn-typeです。だから、警告を抑制するための具体的なコードは次のとおりです。

#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; 
} 

揮発性修飾子命令が除去又は他の方法で最適化戦略によって望ましくない影響を受けないことを保証することです。

  1. なし戻り非ボイド関数の値が限り標準に関しては不定である。

    溶液2は、少なくとも2つの理由から好ましいです。

  2. (新しい)診断警告を抑制するリスクはありません。最初に抑制する意図はありませんでした。
1

機能は、この場合には、コンパイラがプロローグ&エピローグを生成しないだろうし、そのプログラマが必要なすべてのレジスタを保存し、復帰前に、正しいレジスタ(複数可)への出力値を置く引き受ける、nakedとして宣言することができます。私の知る限り__asm__のためだけでなく、__volatile__std=c89構文です:

uint32_t fill_cache(void) __attribute__((naked)); // Declaration 
// attribute should be specified in declaration not in implementation 

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

ビットが遅れて多分誰かが:)もこの中に

PSをステップインします。実際にはGNU GCCの__asm__ & asmの間に違いはありません。しかし、近代的なアプローチはアンダースコアのスタイルです:asm volatile

asm_language

関連する問題