なんとかなるさね

マイコンをネタにブログを始めてみました


スポンサーサイト 

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

--/--/--   blog-entry-   category: スポンサー広告

go page top

RL78マイコン(RL78/G13)|rl78-elf-gccが生成したアセンブラソースのデバッグ情報にパッチを当てた 

2つ前のエントリからIDE4GRに同梱されているKPIT GNURL78でビルドしたプログラムをCS+ for CCのRL78
モードでデバッグ出来ないものかと考えて以前のエントリで遭遇したe2 studio+KPIT GNURL78でビルドした
プログラムをCS+ for CCのRL78モードでデバッグしようとするとauto変数の値の表示が??になる現象について
原因と解決策を調べ始めたのですが、当初はKPIT GNURL78 GCCのソースコードを基に調べるつもりでしたが、
1つ前のエントリでKPIT GNURL78 GCCが生成したアセンブラソースにもデバッグ情報が含まれていたことに
気付いてからアセンブラソースを基に調べるようにやり方を変えました。

そして分かって来たことは、2つ前のエントリで立てた仮説(CS+ for CCのRL78モードでは詳細形式にしか対応
していないのかもしれない)が原因では無く、以下のようにKPIT GNURL78とCC-RLでデバッグ情報(というか
コンパイラの実装それ自体?として)のレジスタ番号が(当然のこと?ながら)異なっていることが原因らしいという
ことです。(ちなみに、時系列としては、KPIT GNURL78がリリースされた後にCC-RLがリリースされました。)

CC-RLコンパイラでのレジスタ番号割り当て(ソース非公開なので推測)

デバッグ情報のレジスタ番号       マイコンのレジスタ
r0 ?(カレントBANK:AX?)
r1 ?(カレントBANK:BC?)
r2 ?(カレントBANK:DE?)
r3 ?(カレントBANK:HL?)
r4 SP?
r5 ?
r6 ?
r7 ?
r8 ?

KPIT GNURL78 GCCでのレジスタ番号割り当て(まだソースを追ってないので推測を含む)

デバッグ情報のレジスタ番号       マイコンのレジスタ
r0 ?(BANK0:X? (0xffef8?))
r1 ?(BANK0:A? (0xffef9?))
r2 ?(BANK0:C? (0xffefa?))
r3 ?(BANK0:B? (0xffefb?))
r4 ?(BANK0:E? (0xffefc?))
r5 ?(BANK0:D? (0xffefd?))
r6 ?(BANK0:L? (0xffefe?))
r7 ?(BANK0:H? (0xffeff?))
r8 BANK1:X (0xffef0)
r9 BANK1:A (0xffef1)
r10 BANK1:C (0xffef2)
r11 BANK1:B (0xffef3)
r12 BANK1:E (0xffef4)
r13 BANK1:D (0xffef5)
r14 BANK1:L (0xffef6)
r15 BANK1:H (0xffef7)
r16 BANK2:X (0xffee8)
r17 BANK2:A (0xffee9)
r18 BANK2:C (0xffeea)
r19 BANK2:B (0xffeeb)
r20 BANK2:E (0xffeec)
r21 BANK2:D (0xffeed)
r22 BANK2:L (0xffeee)
r23 BANK2:H (0xffeef)
r24 BANK3:X (0xffee0)
r25 BANK3:A (0xffee1)
r26 BANK3:C (0xffee2)
r27 BANK3:B (0xffee3)
r28 BANK3:E (0xffee4)
r29 BANK3:D (0xffee5)
r30 BANK3:L (0xffee6)
r31 BANK3:H (0xffee7)
r32 SP?

例えば、前のエントリでrl78-elf-gccの-save-tempオプションで得たアセンブラソースのデバッグ情報に赤字の
パッチを当ててみたところ、CS+ for CCのRL78モードでのデバッグでもauto変数の値が表示されました。

前のエントリで得たアセンブラソースのデバッグ情報(紫字の箇所がパッチ前)

    .section    .debug_loc,"",@progbits
.Ldebug_loc0:
.LLST0:
    .4byte  .LFB0-.Ltext0
    .4byte  .LCFI0-.Ltext0
    .2byte  0x3
    .byte   0x92
    .uleb128 0x20
    .sleb128 4
    .4byte  .LCFI0-.Ltext0
    .4byte  .LFE0-.Ltext0
    .2byte  0x3
    .byte   0x92
    .uleb128 0x20
    .sleb128 36
    .4byte  0
    .4byte  0
.LEFDE0:


ビルドしたプログラムの上記部分に該当するrl78-elf-readelf.exeによるダンプ結果

Contents of the .debug_loc section:

    Offset   Begin    End      Expression
    00000000 00000138 0000013a (DW_OP_bregx: 32 (r32) 4)
    00000000 0000013a 0000027c (DW_OP_bregx: 32 (r32) 36)
    00000000 <End of list>


上のアセンブラソースのデバッグ情報にパッチを当てたもの(赤字の箇所がパッチ後)

    .section    .debug_loc,"",@progbits
.Ldebug_loc0:
.LLST0:
    .4byte  .LFB0-.Ltext0
    .4byte  .LCFI0-.Ltext0
    .2byte  0x2
    .byte   0x74
    .sleb128 4
    .4byte  .LCFI0-.Ltext0
    .4byte  .LFE0-.Ltext0
    .2byte  0x2
    .byte   0x74
    .sleb128 36
    .4byte  0
    .4byte  0


ビルドしたプログラムの上記部分に該当するrl78-elf-readelf.exeによるダンプ結果

Contents of the .debug_loc section:

    Offset   Begin    End      Expression
    00000000 00000138 0000013a (DW_OP_breg4 (r4): 4)
    00000000 0000013a 0000027c (DW_OP_breg4 (r4): 36)
    00000000 <End of list>


以下はパッチを当てる前とパッチを当てた後のCS+ for CCのRL78モードでのデバッグ画面です。

パッチを当てる前



パッチを当てた後



追記 : 雑感

今回はrl78-elf-gccが生成したアセンブラソースのデバッグ情報にパッチを当てたのですが、別の見方をすれば、
ごりごりと手作業でテキストを書いてやれば幾らでも任意のデバッグ情報を作っていくことが出来るということ
ですので、デバッガの評価TP作りに利用することも出来そうな気もします。(C/C++のソースから試行錯誤で
所望のデバッグ情報パターンを作り出そうとするより、かえって簡単に作り出すことが出来そうな気がします。)
流石に、べたな手作業では効率が悪いですが、幸い、GASのアセンブラソースに対してもGCCのプリプロセスを
適用することが出来ますので、何かしら手はありそうな気はします。(もっとも、もしそういう仕事をしていれば
というところの、ふとした思い付きですが、、、)

関連記事

2016/07/05   blog-entry-790   category: RL78 /* 16bit,8bit CISC */

go page top

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。