Renesas V850 64bit Linux版gccコンパイラ

#概要
フリーの v850 gcc ソースは，以下で公開されています．

https://gcc-renesas.com/ja/v850/v850-source-code/

今回，上記ソースを 64bit版Linuxでビルドできるようになりましたので，ビルド手順を公開します．

下記手順は，[2018年10月/TOPPERS開発者会議](https://www.toppers.jp/devconf2018.html)で開発協力して頂ける方々から頂いた情報をもとに手順化しております(感謝)．

#ビルド環境
* OS
 * Windows10 pro
* ビルド用端末
 * WSL

```
$ uname -a
Linux  4.4.0-17134-Microsoft #345-Microsoft Wed Sep 19 17:47:00 PST 2018 x86_64 x86_64 x86_64 GNU/Linux

$cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.5 LTS"
```

#使用したライブラリ
GNU FTPサイトから，以下のライブラリを取得しました．

* gmp-6.1.2
* mpfr-4.0.0
* mpc-1.1.0

また，binutils と newlib は，https://gcc-renesas.com/ja/v850/v850-source-code/ から取得しました．

* binutils-2.24
* newlib-2.1.0

当初，GNU FTPサイトから binutils/newlibを取得していましたが，ルネサスさんの方でいくつかカスタイズされておられるようで，特定のコンパイルオプション認識しない問題や，bcond命令が RH850向けに生成されてしまう問題が発生したため，ルネサスさんの公開ソースをベースにビルドするようにしました．

#フォルダ構成
ビルド実施時のフォルダ構成は以下で行っています．

```
.
├── binutils-2.24
├── gcc-4.9.2
├── newlib-2.1.0
└── other
    ├── gmp-6.1.2
    ├── mpc-1.1.0
    └── mpfr-4.0.0
```

#ライブラリビルド手順
gmp, mpc, mpfr は以下のサイトを参考にしました(感謝)．
http://syohex.hatenablog.com/entry/20120705/1341459296

##環境変数登録
以下の環境変数(PATH, LD_LIBRARY_PATH)を追加します．

```
export PATH=/usr/local/bin/:${PATH}
export LD_LIBRARY_PATH=/usr/local/:/usr/local/lib:${LD_LIBRARY_PATH}
```


## gmp
gmp ソースをに任意のフォルダで解凍し，解凍したフォルダ直下に build フォルダを作成後，以下のコマンドを実行します．

```
$ CPPFLAGS=-fexceptions ../configure --prefix=/usr/local --enable-cxx
$ make
$ make check
$ sudo make install
```

## mpfr
mpfr ソースをに任意のフォルダで解凍し，解凍したフォルダ直下に build フォルダを作成後，以下のコマンドを実行します．

```
$ ../configure --prefix=/usr/local --with-gmp-build=../../gmp-6.1.2/build
$ make
$ make check
$ sudo make install
```

## mpc
mpc ソースをに任意のフォルダで解凍し，解凍したフォルダ直下に build フォルダを作成後，以下のコマンドを実行します．

```
$ ../configure --prefix=/usr/local --with-gmp=/usr/local --with-mpfr=/usr/local
$ make
$ make check
$ sudo make install
```

#gcc ビルド環境
ビルド前のファイル構成

```
$ ls
gcc-4.9.2_v850_v14.01.tar.bz2  newlib-2.1.0_v850_v14.01.tar.bz2  binutils-2.24_v850_v14.01.tar.bz2
```

gcc, binutils, newlib ソースをに任意のフォルダで解凍し，解凍したフォルダ直下に，それぞれ build フォルダを作成します．

## binutils
binutils の build フォルダ直下で，以下のコマンドを実行します．

```
$  ../configure --target=v850-elf --prefix=/usr/local --enable-soft-float
$ make
$ sudo make install
```

#gcc ビルド手順
gcc の build フォルダ直下で，以下のコマンドを実行します．

```
$ ../configure --target=v850-elf --prefix=/usr/local --enable-languages=c,c++ --disable-nls --disable-multilib --disable-libssp --with-newlib --with-header=../../newlib-2.1.0/newlib/libc/include
$ make
$ sudo make install
```

ちなみに，クロスコンパイラ作成した時にできる libgcov.a は，中身が空っぽになっています．理由は，gcovからファイルI/Oが発生するため，組込み向けにはオミットしているようです．

組込み向けに gcov ライブラリを作成したい場合は，gcc の make 完了後，gcc/Makefile の inhibit_libcをfalseにして，再度 make すると中身あり版の libgcov.a ができます．ただし，このライブラリはファイルI/Oのシステムコールが実行されてしまいますので，そのまま利用することが出来ませんので，ご注意ください．


#ビルド結果確認
パス確認

```
$ which v850-elf-gcc
/usr/local/bin//v850-elf-gcc
```

バージョン確認

```
$ v850-elf-gcc --version
v850-elf-gcc (GCC) 4.9-GNUV850_v14.01
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
```

## newlibのビルド手順
gcc のコンパイルが終わったら，newlib の build フォルダ直下で，以下のコマンドを実行します．
※newlibをビルドするには，クロスコンパイラが出来上がっている必要があります．

```
$ ../configure --target=v850-elf --prefix=/usr/local
$ make
$ sudo make install
```

なお，newlib 作成時の v850-elf-gcc のコンパイルオプションを指定したい場合は，configure 実行前に以下のように，コンパイルオプションを環境変数として指定することで対応できます．
※本例は，v850e2m で浮動小数点命令を生成させるフラグ指定です．

```
export CFLAGS_FOR_TARGET="-mv850e2v3 -mhard-float" 
```


#その他気づいたこと
当初，gcc は，GNUのFTPサイトから取得してビルドしました．
試したバージョンは以下の通りでしたが，athrill との相性があまりよくないことがわかりました．

相性が悪い理由を以下に示します．

* gcc-4.9.2.tar.gz
 * アセンブラファイル(.S)のソースデバッグができない．
 * コンパイル済みのアセンブラファイル(オブジェクトファイル)に対して，以下のコマンドを実行しましたが，なぜか .debug_lineが出力されませんでした．
 * $ v850-elf-readelf --debug-dump <オブジェクトファイル>

* gcc-8.2.0.tar.gz
 * デバッグ情報 dwarf のバージョンが athrillのバージョンと合わない．
 * athrillはdwarf2 までしか対応しきれていませんが，最新のgcc ではdwarf4の
 * デバッグ情報が出力されるようです．-gdwarf2でオプション指定してもダメでした．
 * さらに，このコンパイラでビルドしたバイナリをathrillで実行するとSIGSEGVで落ちます…
 * athrillのdwarf4対応は課題ですね．

上記をトライしてダメでしたので，ルネサスサイトの「GNUV850 v14.01 Source Code of GCC」でコンパイルすることにしました．

athrill向けのクロスコンパイラはもともとルネサスサイトのv850-gccバイナリを使用していたので，やはりこちらの方が相性は良いようです．

上記でビルドしたクロスコンパイラを使用して過去のathrill sampleをビルドしていて気づきましたが，
「-msoft-float」を認識できないようです．以下のエラー出力がされてしまいました．
クロスコンパイラ作成時に何らかのオプション指定が必要だったのかもしれない．
おそらく，以下のページがヒントになりそうですので，また空き時間見つけて，リコンパイルします．

http://lists.atmark-techno.com/pipermail/armadillo/2007-September/001996.html

※gccコンパイル時のオプションに --with-float=soft を指定する

```
Assembler messages:
Error: unrecognized option -msoft-float
```

#-msoft-floatが認識できない問題の調査状況
gccコンパイル時のオプションに --with-float=soft を追加したところ，configureで失敗しました．
gcc の configure のオプションを色々と調べたところ，以下のサイトにヒントがありました．

http://msyksphinz.hatenablog.com/entry/2015/06/18/020000

--enable-soft-float を付加すれば gcc が認識してくれそうだと思い，こちら試してみましたが，現象変わらず．
以下のエラーメッセージが出力されます．

```
Assembler messages:
Error: unrecognized option -msoft-float
```

現状，手詰まり感ありで，調査の方向性がみていない状況になってしまいました…

#bcond問題の調査状況
当初，GNU FTP サイトの binutils-2.25.1 を使用したところ，bcond命令のジャンプサイズが255を超える命令を出力していることがわかりました．

-mv850e2v3 オプション指定の場合，ジャンプサイズは255を超えないはずなのに，超えてしまったことが問題です(RH850向けのオプション指定(-mv850e3v5)ならOKなのですが)．

そこで，ルネサスさんの binutilsのソース(2.24)と GNUサイトのソース(2.24)の差分調査したところ，bcond命令周りでいくつか修正が入っていることがわかりました．

また，この調査をしていて，たまたまですが，追加で分かったこととして，-msoft-floatに関する修正が入っていることもわかりました．

というわけで，ルネサスさんのサイトの binutilsを使用する方が良いと判断しました．
最初からそうすればよかったのですが，ルネサスさんのサイトのbinutilsはビルドエラーが発生するので，GNUサイトから取得していたという経緯があります．

いずれにせよ，発生したコンパイルエラーは，それほど難しいものではないので，強引に修正しビルドを通しました．本 binutilsを使用することで，bcond 問題も -msoft-float 問題も無事解決できました！

* 2019.02.04 追記
 * mikotoさんがソース修正なしでビルドできる方法を見つけられました(感謝)。
 * https://mikoto2000.blogspot.com/2019/01/renesas-v850-gcc-64bit-linux.html


#64bit linux v850-gcc バイナリ公開
~~ここで作成したクロスコンパイラを，以下で公開しました．~~

~~https://github.com/tmori/athrill-gcc/tree/master/linux/64bit~~

~~展開すると，usr/local/athrill-gcc　の下に配置されますので，~~
~~usr/local/athrill-gcc/bin をPATH設定すればビルドできるようになります．~~

* 2018/12/28追記
  * v850-elf-g++ を上記に追加しました．
  * サイズが100MBを超えてしまったので，git lfs でコミットしました．
  * その他，浮動小数点演算のハード命令を含むnewlibを追加しています．
  * 上記は自分でビルドしたものではなく，ルネサスさんの公式サイトから取得したものをマージしました．
  * (ルネサスさんのライブラリはクロスコンパイル済みなので，32bit/64bit関係なく使えますから，自分でビルドする必要なかったなと気づきました…)

* 2019/10/14追記
  * git-lfs の容量が不足してしまいましたので，公開リポジトリを削除しました．．

* 2019/10/20追記
  * 代わりに，以下にathrill-gcc-package.tar.gzを配置しました．
  * https://github.com/tmori/athrill-gcc/releases/tag/v1.0 

#履歴
* 2018.11.04 新規作成
* 2018.11.05 幾つかご指摘いただいた点を改修しました．
 * gmpのビルド手順(sudo make install)
 * newlib のビルド順番はgccの後でした．
 * フォルダ構成を追加
* 2018.11.06 -msoft-floatが認識できない問題を追記
* 2018.11.07 -msoft-floatが認識できない問題の調査状況を追記(まだ解決できていない)
* 2018.11.08 64bit linux v850-gcc バイナリを github で公開
* 2018.11.17 諸問題あり，binutilsをルネサスさんのサイトのソースに差し替えました
* 2018.12.28 gccのビルドコマンドにc++のオプションを追加しました
* 2018.12.28 c++を同梱したv850-gccをgithubで公開
* 2019.02.04 binutilsのビルドオプション情報を追記
* 2019.10.14 公開リポジトリを削除
* 2019.10.20 athrill-gcc-packageを追加