H8/300向けのgcc-11.3.0をconfigure --target=h8300-unknown-elf --enable-languages=c,c++ --prefix=/path/to/install --with-newlib --disable-nls --disable-libssp --disable-libgomp --disable-libstdcxx-pch --disable-libstdcxx-filesystem-ts --with-newlib --disable-wchar_tでビルドしようとして、上手くいかずに詰まっています。
感触としては、C++を使う場合は-mint32を有効にし、ノーマルモードは一切使わないという方向で行くしかない(逆にノーマルモードを使う場合はC++を捨てる)という感じなのですが…gcc/config/h8300/t-h8300のMULTILIB_EXCEPTIONSを設定しようにも、MULTILIB_OPTIONSに書いていないコマンドを指定しない場合を除外という条件設定はできないようなのです。残されている手段は、強引に-mint32が指定されているものとして動くようにするくらい、でしょうか。((1 << 16)のような部分を全て((long)1 << 16)のように直し、これを使う変数の宣言をint→longに変えるという方法もありますが…正しい修正とはいえ変更箇所が多すぎます)
libstdc++のC++17向けライブラリでintが32bitであることを前提としているコードがいくつかあり、このビルドで引っかかっています。H8の場合は-mint32を指定した場合はintが32bit、デフォルトは16bitになるので両方に対応できないと困るのですけどね。
なお、(Changesにちゃんと書かれていないような気がするのですが)gcc-11.1.0以降においてはH8/300(H8/300L)へのサポートが廃止され、デフォルトでH8/300H向けのバイナリを作成するように変更されている点に注意してください。H8/3664をTRAP命令の使えるH8/300Lとして扱うような人は流石にもういないと思いますが、そういう場合はgcc-10までのコンパイラを動かせる環境をどうにかして維持するしかありません。
binutils-2.36.1, gcc-11.3.0, newlib-4.1.0の組み合わせで、gccをconfigure --target=h8300-unknown-elf --enable-languages=c --prefix=/path/to/install --with-newlib --disable-nls --disable-libssp --disable-libgomp --with-newlibとすれば、とりあえずCのコンパイラは生成できるようではあります。生成されるバイナリがちゃんとしていることが確認できれば、C言語のみの対応とはいえイマドキの環境でgccを構築できることを示せそうですが…どうやってバイナリの動作を確認したものでしょうか。56.4kg(21:00)
17-Oct-2022補足:こんな修正を施せば、とりあえずC++を有効にした状態のビルドは通るようです。
- mn(ノーマルモードへの対応)は削除
- (1 << 16)となっている箇所はint(16bit)を超えてしまうためキャストするか、あるいは16bitに収まるように修正(なお、(1 << 15)も符号ビットを踏んでしまうためこれも使えない点に注意)
- wchar_tはinternal compiler errorを起こすため、configureにより無効化
ノーマルモード対応を切ったのは「/tmp/cc6H2O7O.s:76945: Error: value of 68249 too large for field of 2 bytes at 2」といったアセンブラのエラーへの対処法が分からなかったという理由によるものですが、おそらくh8300-elfのgccを作ろうとしたらにある、DWARF2_ADDR_SIZE絡みの問題を踏んでしまうようです。
Arduino(ATmega328P)ではC++を使っているのでノーマルモード対応を切るのはちょっと納得できない部分もあるのですが…今使わない機能を動かせるようにするために費やせる時間が無い以上、これは他の方にお任せします。