こんにちは。NoMaYです。e2 studio v6.3.0がリリースされていたので、インストールして幾つかプロジェクトを作成して、いつものようにe2 studioのインストールフォルダを眺めていたら、CCRXmachine.hとCCRXmachine.cというファイルがあることに気付きました。中を見てみると、概ねファイル名から予想される通りのソースファイルでした。(今までのe2 studioのインストールフォルダを見直してみたところ、以前からあったことが分かりましたが、今まで気付きませんでした。) ただ、一部コメントアウトされているものがあったり、以前に別スレッド『GUNRX用プロジェクトのスマートコンフィグレータのBSPを見ていて気付いた変な移植コード』で話題にしたことと同じ元のコードの意図を理解していない書き換えがあったり、ちょっと惜しいような気もしました。e2 studioインストールフォルダ\internal\projectgen\rx\Generate\CCRXConversion\inc\CCRXmachine.he2 studioインストールフォルダ\internal\projectgen\rx\Generate\CCRXConversion\inc\CCRXmachine.c
こんにちは。NoMaYです。どなたか、fujitaさんが気付かれた__builtin_rx_xchg(&mem, &mem);の命令列が-O2でコンパイルした時に壊れてしまう件について、GNURXの開発元のRedHat社(でしたよね) or サポートサイトのgcc-renesas.comに報告される人はいらっしゃいますか? これに気付いてしまったら放ったらかす訳にはいかない気がしますので、どなたもいらっしゃらなければ、私の方でgcc-renesas.comに報告しようかと思います。効率や仕様は脇へおいて、GNURXのGCCの__builtin_rx_xchg()関数のソースは間違っていなさそうなので、たぶん以下の画面コピーのフォルダのファイルのどこかに不具合があるのではないかと思います。rx_gcc4.8.4_2018q1\gcc\gcc\config\rx\ちなみに、以下はGNURXのリポジトリでは無くてGCCそのもののリポジトリですが、__builtin_rx_xchg()関数の実装は含まれていませんでした。きっと他にも色々と古いままなのだと思われます、、、[gcc.git] / gcc / config / rx /gcc.gnu.org/git/?p=gcc.git;a=tree;f=gcc/config/rx;hb=refs/heads/master
constraints.mdpredicates.mdrx-modes.defrx-opts.hrx-protos.hrx.crx.hrx.mdrx.optt-rx
開発費(勘で言って500万円/年ぐらいとか???)を出しているのはルネサスさん(ですよね)でしょうから、ルネサスさんから報告が行くのが一番確実に伝わるとは思われますが、、、[余談]GNURXのGCCのソースにGCCそのもののソースに無い以下のソースが含まれていることに気付いたのですが、これは何だろう、、、調べてみようかな、、、rx_gcc4.8.4_2018q1\gcc\gcc\config\rx\rx-pragma.c
#include "config.h"#include "system.h"#include "coretypes.h"#include "tm.h"#include "tree.h"#include "c-family/c-pragma.h"#include "c-family/c-common.h"#include "diagnostic-core.h"#include "cpplib.h"#include "hard-reg-set.h"#include "output.h"#include "rx-protos.h"#include "function.h"#define MAX_RECOG_OPERANDS 10#include "reload.h"#include "target.h"/* Implements the "pragma ADDRESS" pragma. This pragma takes a * variable name and an address, and arranges for that variable to be * "at" that address. The variable is also made volatile. */static voidrx_pragma_address (cpp_reader * reader ATTRIBUTE_UNUSED){ /* on off */ tree var, addr; enum cpp_ttype type; type = pragma_lex (&var); if (type == CPP_NAME) { type = pragma_lex (&addr); if (type == CPP_NUMBER) { if (var != error_mark_node) { unsigned uaddr = tree_low_cst (addr, 1); rx_note_pragma_address (IDENTIFIER_POINTER (var), uaddr); } type = pragma_lex (&var); if (type != CPP_EOF) { error ("junk at end of #pragma ADDRESS"); } return; } } error ("malformed #pragma ADDRESS variable address");}voidrx_register_pragmas (void){ c_register_pragma (NULL, "ADDRESS", rx_pragma_address); c_register_pragma (NULL, "address", rx_pragma_address);}