Skip to main content

IAR Embedded Workbench for Arm 9.70.x

CFIサポートを持つアセンブラソースの作成

このセクションの内容:

コールフレーム情報を正しく処理するアセンブラ言語ルーチンを作成するには、コンパイラで作成されたアセンブラ言語ソースファイルから開始することをお勧めします。

  1. 適当なCソースコードを使用して開始します。以下に例を示します。

    int F(int);
    int cfiExample(int i)
    {
      return i + F(i);
    }
  2. Cソースコードをコンパイルします。コールフレーム情報(CFIディレクティブ)を含むリストファイルを必ず作成してください。

    危険

    コマンドラインでは、-lAオプションを使用します。

    注意

    IDEで、[プロジェクト]>[オプション]>[C/C++コンパイラ]>[リスト]を選択し、サブオプションの[コールフレーム情報のインクルード]が選択されていることを確認します。

    この例のソースコードの場合、32ビットモードのリストファイルは以下のようになります。

            NAME Cfi
    
            RTMODEL "__SystemLibrary", "DLib"
    
            EXTERN F
    
            PUBLIC cfiExample
            
            CFI Names cfiNames0
            CFI StackFrame CFA R13 DATA
            CFI Resource R0:32, R1:32, R2:32, R3:32, R4:32, R5:32, R6:32, R7:32
            CFI Resource R8:32, R9:32, R10:32, R11:32, R12:32, R13:32, R14:32
            CFI EndNames cfiNames0
            
            CFI Common cfiCommon0 Using cfiNames0
            CFI CodeAlign 4
            CFI DataAlign 4
            CFI ReturnAddress R14 CODE
            CFI CFA R13+0
            CFI R0 Undefined
            CFI R1 Undefined
            CFI R2 Undefined
            CFI R3 Undefined
            CFI R4 SameValue
            CFI R5 SameValue
            CFI R6 SameValue
            CFI R7 SameValue
            CFI R8 SameValue
            CFI R9 SameValue
            CFI R10 SameValue
            CFI R11 SameValue
            CFI R12 Undefined
            CFI R14 SameValue
            CFI EndCommon cfiCommon0
            
    
            SECTION `.text`:CODE:NOROOT(2)
            CFI Block cfiBlock0 Using cfiCommon0
            CFI Function cfiExample
            ARM
    cfiExample:
            PUSH     {R4,LR}
            CFI R14 Frame(CFA, -4)
            CFI R4 Frame(CFA, -8)
            CFI CFA R13+8
            MOVS     R4,R0
            MOVS     R0,R4
            BL       F
            ADDS     R0,R0,R4
            POP      {R4,PC}          ;; return
            CFI EndBlock cfiBlock0
    
            END

    注記

    ヘッダファイルCommon.iは、マクロCFI_NAMES_BLOCKCFI_COMMON_ARMCFI_COMMON_Thumbを含み、これらは一般的な名前ブロックおよび一般的な共通ブロックを各1つ宣言します。これらの2つのマクロは、仮想リソースと具体的なリソースの両方を宣言します。