Renesas Synergy™

FAQ 1008227 : 実行速度優先(-Ot)を選択すると、以下の関数でラベルの多重定義というエラーが発生します。

      void aaaa(char bbbb、char cccc、int dddd)
      {
           #pragma asm
           mov #label_abcd、lp -- label_abcd からのリターン・アドレスをセット
           label_abcd: -- 多重定義エラーとなってしまう
           #pragma endasm

      }

 

回答

実行速度優先の場合には、グローバルな関数もインライン展開されますので 仮に関数aaaaを呼び出している関数の中に label_abcd がありますと、 以下のように展開されるます。したがって同じラベル名が定義されることになり、 多重定義エラーとなります。

        --- インライン展開前 ---------------------
        void func(){

         label_abcd:

            /* aaaaの呼び出し */
            aaaa(...);
        }

        --- インライン展開後 ---------------------
        void func(){

         label_abcd:

            /* aaaaの呼び出し */
            #pragma asm
            mov  #label_abcd、lp
            label_abcd:                 /* label_abcdが多重定義 */
            #pragma endasm
        }
        ------------------------------------------

このエラーを発生させないために、どちらかのラベル名を変更するか、 または、-Wp,-N/-Wp,-Gオプション指定で 関数aaaaのインライン展開を抑止してください。

ただし、この方法は中間言語レベルでの コード・サイズ、スタック・サイズによって、 インライン展開を制御しますので 他の関数のインライン展開にも影響が出る可能性があります。

可能であれば、関数aaaaを 呼び出しているファイル以外のファイルで定義すれば インライン展開はされなくなります。

 

 

適用製品

V850用コンパイラパッケージ [CA850]
他にご質問がございましたら、リクエストを送信してください