8.18 --branch_tables、--no_branch_tables

switch ステートメント用の分岐テーブルを、コンパイラが、コードセクションに配置するか、または別のデータセクションに配置するかを制御します。

コンパイラでは、switch ステートメント用のコードを生成するために、いくつかの異なる方法を使用します。 これらの方法のいくつかで、分岐オフセットのテーブルを作成します。
--branch_tables オプションを使用すると、コンパイラは コードセクションに分岐オフセットテーブルを配置します。以下のサンプルでは、*** で強調表示した行に これらの分岐オフセットが保持されます。
** Section #1 '.text' (SHT_PROGBITS) [SHF_ALLOC + SHF_EXECINSTR]
    Size   : 72 bytes (alignment 2)
    Address: 0x00000000

    $t
    .text
    f
        0x00000000:    b510        ..      PUSH     {r4,lr}
        0x00000002:    2807        .(      CMP      r0,#7
        0x00000004:    d21b        ..      BCS      {pc}+0x3a ; 0x3e
        0x00000006:    e8dff000    ....    TBB      [pc,r0]
    $d
        0x0000000a:    0704        ..      DCW    1796                  ***
        0x0000000c:    13100d0a    ....    DCDU   319819018             ***
        0x00000010:    0016        ..      DCW    22                    ***
    $t
        0x00000012:    2005        .       MOVS     r0,#5
        0x00000014:    f7fffffe    ....    BL       g
代わりに --no_branch_tables オプションは、分岐オフセットテーブルを 別のデータセクションに挿入するようにコンパイラに指示します。
** Section #1 '.text' (SHT_PROGBITS) [SHF_ALLOC + SHF_EXECINSTR]
    Size   : 72 bytes (alignment 4)
    Address: 0x00000000
			
    $t
    .text
    f
        0x00000000:    b510        ..      PUSH     {r4,lr}
        0x00000002:    2807        .(      CMP      r0,#7
        0x00000004:    d218        ..      BCS      {pc}+0x34 ; 0x38
        0x00000006:    4b0f        .K      LDR      r3,[pc,#60] ; [0x44] = 0
        0x00000008:    e8d3f000    ....    TBB      [r3,r0]
        0x0000000c:    2005        .       MOVS     r0,#5
        0x0000000e:    f7fffffe    ....    BL       g
        ...
			
** Section #4 'c.f.00000006' (SHT_PROGBITS) [SHF_ALLOC]
    Size   : 7 bytes
    Address: 0x00000000
			
    0x000000:   00 03 06 09 0c 0f 12                               .......	

デフォルト

デフォルトは --branch_tables です。
--branch_tables を明示的に指定しなかった場合、--execute_only--no_branch_tables を意味します。

--execute_only--branch_tables と組み合わせて使用しないで下さい。組み合わせて使用すると、コンパイラは分岐オフセットテーブルを読み取り不能の実行専用コード領域に配置してしまいます。
関連する概念
4.21 リテラルプールに対するコンパイラサポート
関連する参考文書
8.108 --integer_literal_pools, --no_integer_literal_pools
8.178 --string_literal_pools、--no_string_literal_pools
8.82 --float_literal_pools、--no_float_literal_pools
8.77 --execute_only
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.