LLVMにRenesas RL78をPortingしようとしているのかな?

こんにちは。NoMaYです。

ウェブで調べ物をしていて気付いたのですが、RenesasさんはLLVM(今はGCCと並ぶ著名なフリーコンパイラ)にRL78をPortingしようとしているのかも、、、

[llvm-dev] New LLVM backend for Renesas RL78 MCU
Sebastian Perta via llvm-dev llvm-dev at lists.llvm.org
Wed Apr 1 10:26:05 PDT 2020
lists.llvm.org/pipermail/llvm-dev/2020-April/140546.html
 

  • 何か月か前に https://gcc-renesas.com/ で「clang 移植するとしたら良いと思うか?」みたいなアンケート採ってましたがこれ絡みかな

    # 既に CC-RX や CC-RL で LLVM のバックエンドは実装されてるので 2度手間掛けるなら無駄、とか答えた希ガス
  • > LLVMにRenesas RL78をPortingしようとしているのかな?

    A New LLVM-Based Toolchain Released for Renesas RL78!

    llvm-gcc-renesas.com/.../

    Portingされたようです。

  • こんにちは。NoMaYです。

    LLVMベースになってソース公開義務は無くなってはいますが、ソースは公開されているようですね。(すみません、ビルドは試していません、、、)

    llvm-gcc-renesas.com/rl78/rl78-latest-source-code/
     

  • こんにちは。NoMaYです。

    以下に投稿したBlinkyサンプルプログラムのzipファイルにリストファイル(GNURL78)と逆アセンブルダンプファイル(LLVM-RL78とGNURL78)も入れておいたのですが、内蔵周辺レジスタアクセスのコードがLLVM-RL78はGNURL78より随分悪いですね。(コンパイラでの最適化レベルは共に -Os です。) たぶんこれは、LLVM-RL78での最適化処理において抜けてしまっている何かがある、のではないだろうかと思ってしまうのです、、、

    RL78/G23-64p Fast Prototyping Board Blinky sample program
    japan.renesasrulz.com/cafe_rene/m/sample_program/463

    ●LLVM-RL78の場合

    RL78_RL78G23_FPB_LLVM_e2studio/HardwareDebug/rl78g23_fpb.dmp より抜粋

    0000323b _R_Config_ITL0_Create:
    ;     ITLCTL0 = 0x00U;
        323b: 36 66 03                      movw hl, #870
        323e: cc 00 00                      mov [hl], #0
    ;     ITLMKF0 |= _01_ITL_CHANNEL0_COUNT_MATCH_MASK;
        3241: 36 6c 03                      movw hl, #876
        3244: 8b                            mov a, [hl]
        3245: 71 8a                         set1 a.0
        3247: 36 6c 03                      movw hl, #876
        324a: 9b                            mov [hl], a
        324b: fd ce 32                      call !0x32ce
    ;     ITLMK = 1U;    /* disable INTITL interrupt */
        324e: 36 e7 ff                      movw hl, #65511
        3251: 8b                            mov a, [hl]
        3252: 71 aa                         set1 a.2
        3254: 36 e7 ff                      movw hl, #65511
        3257: 9b                            mov [hl], a
    ;     ITLIF = 0U;    /* clear INTITL interrupt flag */
        3258: 36 e3 ff                      movw hl, #65507
        325b: 8b                            mov a, [hl]
        325c: 71 ab                         clr1 a.2
        325e: 36 e3 ff                      movw hl, #65507
        3261: 9b                            mov [hl], a
    ;     ITLPR1 = 1U;
        3262: 36 ef ff                      movw hl, #65519
        3265: 8b                            mov a, [hl]
        3266: 71 aa                         set1 a.2
        3268: 36 ef ff                      movw hl, #65519
        326b: 9b                            mov [hl], a
    ;     ITLPR0 = 1U;
        326c: 36 eb ff                      movw hl, #65515
        326f: 8b                            mov a, [hl]
        3270: 71 aa                         set1 a.2
        3272: 36 eb ff                      movw hl, #65515
        3275: 9b                            mov [hl], a
    ;     ITLCTL0 |= _80_ITL_MODE_32BIT;
        3276: 36 66 03                      movw hl, #870
        3279: 8b                            mov a, [hl]
        327a: 71 fa                         set1 a.7
        327c: 36 66 03                      movw hl, #870
        327f: 9b                            mov [hl], a
    ;     ITLCSEL0 &= _F8_ITL_CLOCK_FITL0_CLEAR;
        3280: 36 67 03                      movw hl, #871
        3283: 51 f8                         mov a, #248
        3285: 5d                            and a, [hl]
        3286: 36 67 03                      movw hl, #871
        3289: 9b                            mov [hl], a
    ;     ITLCSEL0 |= _01_ITL_CLOCK_FITL0_FIHP;
        328a: 36 67 03                      movw hl, #871
        328d: 8b                            mov a, [hl]
        328e: 71 8a                         set1 a.0
        3290: 36 67 03                      movw hl, #871
        3293: 9b                            mov [hl], a
    ;     ITLFDIV00 &= _F8_ITL_ITL000_FITL0_CLEAR;
        3294: 36 68 03                      movw hl, #872
        3297: 51 f8                         mov a, #248
        3299: 5d                            and a, [hl]
        329a: 36 68 03                      movw hl, #872
        329d: 9b                            mov [hl], a
    ;     ITLFDIV00 |= _07_ITL_ITL000_FITL0_128;
        329e: 36 68 03                      movw hl, #872
        32a1: 51 07                         mov a, #7
        32a3: 6d                            or a, [hl]
        32a4: 36 68 03                      movw hl, #872
        32a7: 9b                            mov [hl], a
    ;     ITLCMP00 = _E847_ITL_ITLCMP00_VALUE;
        32a8: 36 60 03                      movw hl, #864
        32ab: 30 47 e8                      movw ax, #59463
        32ae: bb                            movw [hl], ax
    ;     ITLCMP01 = _0001_ITL_ITLCMP01_VALUE;
        32af: 36 62 03                      movw hl, #866
        32b2: e6                            onew ax
        32b3: bb                            movw [hl], ax
    ;     R_Config_ITL0_Create_UserInit();
        32b4: fd de 32                      call !0x32de
    ; }
        32b7: d7                            ret

     
    ●GNURL78の場合

    RL78_RL78G23_FPB_GCC_e2studio/HardwareDebug/rl78g23_fpb.dmp より抜粋(+少々加工)

    00000272 <_R_Config_ITL0_Create>:
        ITLCTL0 = 0x00U;
     272:   f5 66 03                        clrb    !f0366 <__mirror_end+0xe4466>
        ITLMKF0 |= _01_ITL_CHANNEL0_COUNT_MATCH_MASK;
     275:   e4 f0                           oneb    0xffef0
     277:   8f 6c 03                        mov a, !f036c <__mirror_end+0xe446c>
     27a:   6b f0                           or  a, 0xffef0
     27c:   9f 6c 03                        mov !f036c <__mirror_end+0xe446c>, a
        ITLS0 &= (uint16_t)~_01_ITL_CHANNEL0_COUNT_MATCH_DETECTE;
     27f:   71 08 6b 03                     clr1    !f036b <__mirror_end+0xe446b>.0
        ITLMK = 1U;    /* disable INTITL interrupt */
     283:   71 2a e7                        set1    0xfffe7.2
        ITLIF = 0U;    /* clear INTITL interrupt flag */
     286:   71 2b e3                        clr1    0xfffe3.2
        ITLPR1 = 1U;
     289:   71 2a ef                        set1    0xfffef.2
        ITLPR0 = 1U;
     28c:   71 2a eb                        set1    0xfffeb.2
        ITLCTL0 |= _80_ITL_MODE_32BIT;
     28f:   71 70 66 03                     set1    !f0366 <__mirror_end+0xe4466>.7
        ITLCSEL0 &= _F8_ITL_CLOCK_FITL0_CLEAR;
     293:   8f 67 03                        mov a, !f0367 <__mirror_end+0xe4467>
     296:   5c f8                           and a, #248
     298:   9f 67 03                        mov !f0367 <__mirror_end+0xe4467>, a
        ITLCSEL0 |= _01_ITL_CLOCK_FITL0_FIHP;
     29b:   8f 67 03                        mov a, !f0367 <__mirror_end+0xe4467>
     29e:   6b f0                           or  a, 0xffef0
     2a0:   9f 67 03                        mov !f0367 <__mirror_end+0xe4467>, a
        ITLFDIV00 &= _F8_ITL_ITL000_FITL0_CLEAR;
     2a3:   8f 68 03                        mov a, !f0368 <__mirror_end+0xe4468>
     2a6:   5c f8                           and a, #248
     2a8:   9f 68 03                        mov !f0368 <__mirror_end+0xe4468>, a
        ITLFDIV00 |= _07_ITL_ITL000_FITL0_128;
     2ab:   8f 68 03                        mov a, !f0368 <__mirror_end+0xe4468>
     2ae:   6c 07                           or  a, #7
     2b0:   9f 68 03                        mov !f0368 <__mirror_end+0xe4468>, a
        ITLCMP00 = _E847_ITL_ITLCMP00_VALUE;
     2b3:   30 47 e8                        movw    ax, #0xe847
     2b6:   bf 60 03                        movw    !f0360 <__mirror_end+0xe4460>, ax
        ITLCMP01 = _0001_ITL_ITLCMP01_VALUE;
     2b9:   e6                              onew    ax
     2ba:   bf 62 03                        movw    !f0362 <__mirror_end+0xe4462>, ax
        R_Config_ITL0_Create_UserInit();
     2bd:   fd ce 02                        call    !2ce <_R_Config_ITL0_Create_UserInit>
    }
     2c0:   d7                              ret

     

  • こんにちは。NoMaYです。

    LLVM-RL78のアセンブラで頭を抱えてしまいました。せめて、アセンブルエラーになった行番号ぐらいは表示して欲しいかな、、、

    'clang --target=rl78 -Os -ffunction-sections -fdata-sections -Wunused -Wuninitialized -Wall -Wextra -Wmissing-declarations -Wpointer-arith -Wshadow -Wstrict-prototypes -Wmissing-prototypes -Wundef -Wno-unused-function -Wno-unused-label -Wno-main-return-type -g -mcpu=s3 -x assembler-with-cpp -I"C:\\Renesas\\GitHubDesktop\\work\\FreeRTOS\\FreeRTOS\\Demo\\RL78_RL78G23_64p_FPB_LLVM_e2studio\\src\\FreeRTOS_Demo" -I"C:\\Renesas\\GitHubDesktop\\work\\FreeRTOS\\FreeRTOS\\Source\\portable\\Renesas\\LLVMRL78" -I"C:\\Renesas\\GitHubDesktop\\work\\FreeRTOS\\FreeRTOS\\Demo\\RL78_RL78G23_64p_FPB_LLVM_e2studio\\src\\frtos_config" -I"C:\\Renesas\\GitHubDesktop\\work\\FreeRTOS\\FreeRTOS\\Demo\\RL78_RL78G23_64p_FPB_LLVM_e2studio\\src" -MMD -MP -MF"src/FreeRTOS/Source/portable/Renesas/LLVMRL78/portasm.d" -MT"src/FreeRTOS/Source/portable/Renesas/LLVMRL78/portasm.o" -c "C:/Renesas/GitHubDesktop/work/FreeRTOS/FreeRTOS/Source/portable/Renesas/LLVMRL78/portasm.S" -o "src/FreeRTOS/Source/portable/Renesas/LLVMRL78/portasm.o"'
    clang -cc1as: fatal error: error in backend: Instruction using illegal operand
    src/FreeRTOS/Source/portable/Renesas/LLVMRL78/subdir.mk:30: recipe for target 'src/FreeRTOS/Source/portable/Renesas/LLVMRL78/portasm.o' failed
    make[1]: *** [src/FreeRTOS/Source/portable/Renesas/LLVMRL78/portasm.o] Error 1

     

  • こんにちは。NoMaYです。

    先程のアセンブルエラーの箇所を探そうとしたら、今度は、LLVM-RL78のアセンブラでスタックダンプが表示されてしまいました、、、トホホ、、、

    'clang --target=rl78 -Os -ffunction-sections -fdata-sections -Wunused -Wuninitialized -Wall -Wextra -Wmissing-declarations -Wpointer-arith -Wshadow -Wstrict-prototypes -Wmissing-prototypes -Wundef -Wno-unused-function -Wno-unused-label -Wno-main-return-type -g -mcpu=s3 -x assembler-with-cpp -I"C:\\Renesas\\GitHubDesktop\\work\\FreeRTOS\\FreeRTOS\\Demo\\RL78_RL78G23_64p_FPB_LLVM_e2studio\\src\\FreeRTOS_Demo" -I"C:\\Renesas\\GitHubDesktop\\work\\FreeRTOS\\FreeRTOS\\Source\\portable\\Renesas\\LLVMRL78" -I"C:\\Renesas\\GitHubDesktop\\work\\FreeRTOS\\FreeRTOS\\Demo\\RL78_RL78G23_64p_FPB_LLVM_e2studio\\src\\frtos_config" -I"C:\\Renesas\\GitHubDesktop\\work\\FreeRTOS\\FreeRTOS\\Demo\\RL78_RL78G23_64p_FPB_LLVM_e2studio\\src" -MMD -MP -MF"src/FreeRTOS/Source/portable/Renesas/LLVMRL78/portasm.d" -MT"src/FreeRTOS/Source/portable/Renesas/LLVMRL78/portasm.o" -c "C:/Renesas/GitHubDesktop/work/FreeRTOS/FreeRTOS/Source/portable/Renesas/LLVMRL78/portasm.S" -o "src/FreeRTOS/Source/portable/Renesas/LLVMRL78/portasm.o"'
    Stack dump:
    0.    Program arguments: C:\Renesas\LLVM\RL78\10.0.0.202104\bin\clang.exe -cc1as -triple rl78 -filetype obj -main-file-name portasm.S -target-cpu RL78_S3 -I C:\Renesas\GitHubDesktop\work\FreeRTOS\FreeRTOS\Demo\RL78_RL78G23_64p_FPB_LLVM_e2studio\src\FreeRTOS_Demo -I C:\Renesas\GitHubDesktop\work\FreeRTOS\FreeRTOS\Source\portable\Renesas\LLVMRL78 -I C:\Renesas\GitHubDesktop\work\FreeRTOS\FreeRTOS\Demo\RL78_RL78G23_64p_FPB_LLVM_e2studio\src\frtos_config -I C:\Renesas\GitHubDesktop\work\FreeRTOS\FreeRTOS\Demo\RL78_RL78G23_64p_FPB_LLVM_e2studio\src -fdebug-compilation-dir C:\Renesas\GitHubDesktop\work\FreeRTOS\FreeRTOS\Demo\RL78_RL78G23_64p_FPB_LLVM_e2studio\HardwareDebug -dwarf-debug-producer clang version LLVM for Renesas RL78 10.0.0.202104  -I C:\Renesas\GitHubDesktop\work\FreeRTOS\FreeRTOS\Demo\RL78_RL78G23_64p_FPB_LLVM_e2studio\src\FreeRTOS_Demo -I C:\Renesas\GitHubDesktop\work\FreeRTOS\FreeRTOS\Source\portable\Renesas\LLVMRL78 -I C:\Renesas\GitHubDesktop\work\FreeRTOS\FreeRTOS\Demo\RL78_RL78G23_64p_FPB_LLVM_e2studio\src\frtos_config -I C:\Renesas\GitHubDesktop\work\FreeRTOS\FreeRTOS\Demo\RL78_RL78G23_64p_FPB_LLVM_e2studio\src -debug-info-kind=limited -dwarf-version=4 -mrelocation-model static -o src/FreeRTOS/Source/portable/Renesas/LLVMRL78/portasm.o C:\Temp\DevTools\portasm-21872c.s
     #0 0x776d46d2 (C:\WINDOWS\System32\KERNELBASE.dll+0x1146d2)
     #1 0x75137a36 (C:\WINDOWS\SYSTEM32\VCRUNTIME140.dll+0x7a36)
     #2 0x7517f77f (C:\WINDOWS\SYSTEM32\MSVCP140.dll+0x2f77f)
     #3 0x009cbb0b (C:\Renesas\LLVM\RL78\10.0.0.202104\bin\clang.exe+0x9bb0b)
     #4 0x009cd352 (C:\Renesas\LLVM\RL78\10.0.0.202104\bin\clang.exe+0x9d352)
     #5 0x009c8234 (C:\Renesas\LLVM\RL78\10.0.0.202104\bin\clang.exe+0x98234)
     #6 0x009c7fac (C:\Renesas\LLVM\RL78\10.0.0.202104\bin\clang.exe+0x97fac)
     #7 0x00efb60d (C:\Renesas\LLVM\RL78\10.0.0.202104\bin\clang.exe+0x5cb60d)
     #8 0x00ee99c5 (C:\Renesas\LLVM\RL78\10.0.0.202104\bin\clang.exe+0x5b99c5)
     #9 0x0099e53b (C:\Renesas\LLVM\RL78\10.0.0.202104\bin\clang.exe+0x6e53b)
    #10 0x0099eff0 (C:\Renesas\LLVM\RL78\10.0.0.202104\bin\clang.exe+0x6eff0)
    #11 0x0099609c (C:\Renesas\LLVM\RL78\10.0.0.202104\bin\clang.exe+0x6609c)
    #12 0x00997713 (C:\Renesas\LLVM\RL78\10.0.0.202104\bin\clang.exe+0x67713)
    #13 0x023f897f (C:\Renesas\LLVM\RL78\10.0.0.202104\bin\clang.exe+0x1ac897f)
    #14 0x76cc6359 (C:\WINDOWS\System32\KERNEL32.DLL+0x16359)
    #15 0x77a887a4 (C:\WINDOWS\SYSTEM32\ntdll.dll+0x687a4)
    #16 0x77a88774 (C:\WINDOWS\SYSTEM32\ntdll.dll+0x68774)
    clang: error: clang integrated assembler command failed with exit code 1617785699 (use -v to see invocation)
    src/FreeRTOS/Source/portable/Renesas/LLVMRL78/subdir.mk:30: recipe for target 'src/FreeRTOS/Source/portable/Renesas/LLVMRL78/portasm.o' failed
    make[1]: *** [src/FreeRTOS/Source/portable/Renesas/LLVMRL78/portasm.o] Error 1617785699

     

  • こんにちは。NoMaYです。

    私はズボラしてコンパイラの最適化を有効にしたままデバッグすることが多いのですが(多くの人は最適化をOffに切り替えてデバッグしますが)、いつものようにGNURL78と同様に-Os(サイズ最適化)オプションを付けたままデバッグしていたら、アセンブラソースに設定したブレークポイントが全然頓珍漢な所へ移動させられてしまいました。もう少し正確に言えば、アドレス的には意図したところですが、ソース的には「何がどうしてこうなった?」的なところになっています。こんなにも因果関係が無いのは、とても奇妙な気がします、、、(LLVMとは、そういうもの、なのかなぁ、、、)

    以下、画面コピーです。

    ブレークしたときのソース表示箇所と逆アセンブル表示箇所が全く因果関係が無いところである


    アセンブラソースにブレークポイントを設定したときからそもそもおかしかったのだけれども

     

  • こんにちは。NoMaYです。

    LLVM-RL78+e2 studioですが、デバッグ中にバグの箇所が分かったのでソースを修正して(デバッグ中のまま)ビルドするとpermission deniedでリンクエラーになることがあります。(エラーにならない時もあり、何の手順が影響しているのかは分からないです。また、どっちのケースの頻度が多いかまでは数えていません。)

    実は、ICCRL78+e2 studio+IARビルドプラグインの組み合わせでも同様ですが(しかも、こちらは、ほぼ100%そうだったと記憶していますが)、GNURL78+e2 studio(やCC-RL+e2 studio)の組み合わせでは発生していませんでしたので、LLVM-RL78+e2 studioでも発生しないようにしてもらいたいですね、、、

    以下、画面コピーです。

    LLVM-RL78+e2 studioでデバッグ中のままビルドするとpermission deniedでリンクエラーになることがある

     

  • こんにちは。NoMaYです。

    以前に別スレッドのBlinkyサンプルプログラムでLLVM-RL78は内蔵周辺レジスタアクセスのコードが随分悪いことに気付いた時に既に気になっていたことなのですが、LLVM-RL78は生成コードでビット操作命令を使っていないのですよ。

    ところが、RL78スマートコンフィグレータはビット操作命令が使われることを前提にして以下のようなAPIを生成しています。Start関数とStop関数は、いつ何時呼び出しても構わない(ドキュメントには何の注意事項も記載されていない)ですので、以下のような問題が発生する可能性があります。(今ちゃんと認識しました。)

    (1) 非常に微妙なタイミングで立った他のIFフラグを勝手にクリアしてしまう
    (2) IFフラグ操作中に割り込み処理へ飛んでいたら、その期間中に立った他のIFフラグを勝手にクリアしてしまう
    (3) MKフラグ操作中に割り込み処理へ飛んでいたら、その期間中に変更された他のMKフラグを勝手に元の値に戻してしまう

    void R_Config_INTC_INTP0_Start(void)
    {
        PIF0 = 0U;    /* clear INTP0 interrupt flag */
        PMK0 = 0U;    /* enable INTP0 interrupt */
    }

     

    void R_Config_INTC_INTP0_Stop(void)
    {
        PMK0 = 1U;    /* disable INTP0 interrupt */
        PIF0 = 0U;    /* clear INTP0 interrupt flag */
    }

     

    0000373a _R_Config_INTC_INTP0_Start:
    ;     PIF0 = 0U;    /* clear INTP0 interrupt flag */
        373a: 36 e0 ff                      movw hl, #65504
        373d: ab                            movw ax, [hl]
        373e: 5a f8 fb                      and 0xffef8, #251
        3741: 36 e0 ff                      movw hl, #65504
        3744: bb                            movw [hl], ax
    ;     PMK0 = 0U;    /* enable INTP0 interrupt */
        3745: 36 e4 ff                      movw hl, #65508
        3748: ab                            movw ax, [hl]
        3749: 5a f8 fb                      and 0xffef8, #251
        374c: 36 e4 ff                      movw hl, #65508
        374f: bb                            movw [hl], ax
    ; }
        3750: d7                            ret

     

    00003751 _R_Config_INTC_INTP0_Stop:
    ; {
        3751: fd 65 37                      call !0x3765
    ; }
        3754: d7                            ret
    ...
    00003765 _OUTLINED_FUNCTION_0:
        3765: 36 e4 ff                      movw hl, #65508
        3768: ab                            movw ax, [hl]
        3769: 6a f8 04                      or 0xffef8, #4
        376c: 36 e4 ff                      movw hl, #65508
        376f: bb                            movw [hl], ax
        3770: 36 e0 ff                      movw hl, #65504
        3773: ab                            movw ax, [hl]
        3774: 5a f8 fb                      and 0xffef8, #251
        3777: 36 e0 ff                      movw hl, #65504
        377a: bb                            movw [hl], ax
        377b: d7                            ret

     

  • NoMaY さん
    ほや です。こんにちは。

    > ソースを修正して(デバッグ中のまま)ビルドするとpermission deniedでリンクエラーになることがあります。
    ちょっとやってみた位では現象が再現しないので、何か発生条件がありそうです。
    (単にプロジェクトの規模かもしれませんが)

    自動ビルド(プロジェクト メニューの「自動的にビルド」)、ビルドが終わらないうちにデバッガを起動しているとか
    (ワークスペースプロパティの「実行/デバッグ」→「起動中」(Launching)の「起動前に進行中のビルドが終了するのをまつ」)など、ビルダとデバッガの連携に影響のあるオプションを標準と変えている所はありませんか?