こんにちは。NoMaYです。ウェブで調べ物をしていて気付いたのですが、RenesasさんはLLVM(今はGCCと並ぶ著名なフリーコンパイラ)にRL78をPortingしようとしているのかも、、、[llvm-dev] New LLVM backend for Renesas RL78 MCUSebastian 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
> 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 programjapan.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 operandsrc/FreeRTOS/Source/portable/Renesas/LLVMRL78/subdir.mk:30: recipe for target 'src/FreeRTOS/Source/portable/Renesas/LLVMRL78/portasm.o' failedmake[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' failedmake[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)の「起動前に進行中のビルドが終了するのをまつ」)など、ビルダとデバッガの連携に影響のあるオプションを標準と変えている所はありませんか?