I wanted to run the GCC test-suite on Adapteva’s Epiphany architecture, but I could not find much useful information on how to do it. This post documents what I eventually managed to get running.
The GCC "simtest howto" (having examples/results from 2003 — I'll send a patch to update it...) suggests using a "combined tree" where the source code from GCC, binutils, GDB, and newlib are merged. I'd like to avoid this, as I want to be able to test with different revisions of the components, and I do not trust that I will get reproducible results with the combined tree (for example, both binutils and GDB includes libbfd, and I want to ensure that binutils is built with the correct version).
The instructions below builds everything separately, using the latest released versions. It is assumed that
We cannot build GCC before we have a full environment with newlib, but GCC is needed in order to build newlib. We, therefore, start by building a somewhat limited version of GCC that can be used to build the library.
The GCC test-suite can now be run as
This post was updated 2017-08-13 with a note about
The GCC "simtest howto" (having examples/results from 2003 — I'll send a patch to update it...) suggests using a "combined tree" where the source code from GCC, binutils, GDB, and newlib are merged. I'd like to avoid this, as I want to be able to test with different revisions of the components, and I do not trust that I will get reproducible results with the combined tree (for example, both binutils and GDB includes libbfd, and I want to ensure that binutils is built with the correct version).
The instructions below builds everything separately, using the latest released versions. It is assumed that
DIST
contains the path to the source code packages, and that PREFIX
is the path where the resulting toolchain will be installed.Building binutils
Binutils is built astar zxf ${DIST}/binutils-2.25.tar.gz mkdir build_binutils && cd build_binutils ../binutils-2.25/configure --prefix=${PREFIX} --target=epiphany-elf make -j4 make install cd ..
Building GCC
GCC need support from GMP, MPFR, etc. These can be handled using shared libraries, but I want to make sure I know which versions are used. The easiest way of handling this is to place the libraries' source code within the GCC source tree, which builds them as a part of GCC.tar zxf ${DIST}/gcc-5.1.0.tar.gz tar zxf ${DIST}/gmp-6.0.0a.tar.bz2 mv gmp-6.0.0 gcc-5.1.0/gmp tar zxf ${DIST}/mpc-1.0.3.tar.gz mv mpc-1.0.3 gcc-5.1.0/mpc tar zxf ${DIST}/mpfr-3.1.2.tar.gz mv mpfr-3.1.2 gcc-5.1.0/mpfr tar zxf ${DIST}/isl-0.14.tar.bz2 mv isl-0.14 gcc-5.1.0/islThe GCC source tree has a script
contrib/download_prerequisites
that downloads and extracts the correct versions of GMP etc.We cannot build GCC before we have a full environment with newlib, but GCC is needed in order to build newlib. We, therefore, start by building a somewhat limited version of GCC that can be used to build the library.
mkdir build_gcc_tmp && cd build_gcc_tmp ../gcc-5.1.0/configure --prefix=${PREFIX} --target=epiphany-elf \ --enable-languages="c" --with-newlib --without-headers make -j4 all-gcc make install-gcc cd ..
Building newlib
Newlib can now be built astar zxf ${DIST}/newlib-2.2.0.tar.gz mkdir build_newlib && cd build_newlib env PATH="${PREFIX}/bin:${PATH}" \ ../newlib-2.2.0/configure --prefix=${PREFIX} --target=epiphany-elf env PATH="${PREFIX}/bin:${PATH}" make -j4 all env PATH="${PREFIX}/bin:${PATH}" make install cd ..
Building GCC again
The "real" GCC is built asmkdir build_gcc && cd build_gcc ../gcc-5.1.0/configure --prefix=${PREFIX} --target=epiphany-elf \ --enable-languages="c,c++" --with-newlib make -j4 make install cd ..
Building the simulator
The testing is done by running the compiled code on a simulator that is built as a part of GDB, but the GNU GDB distribution does not have support for Epiphany. We, therefore, use theepiphany-gdb-7.8
branch from https://github.com/adapteva/epiphany-binutils-gdb. This repository contains both GDB and some random version of binutils, but we only need the simulator:unzip ${DIST}/epiphany-binutils-gdb-epiphany-gdb-7.8.zip mkdir build_sim && cd build_sim ../epiphany-binutils-gdb-epiphany-gdb-7.8/configure \ --prefix=${PREFIX} --target=epiphany-elf make -j4 all-sim make install-sim cd ..
Running the GCC test-suite
Dejagnu has configuration files for running tests on simulators for most hardware architectures, but not for Epiphany, so we need to create a configuration fileepiphany-sim.exp
. I'm using the following, that is a modified version of arm-sim.exp
:# Load the generic configuration for this board. This will define a basic # set of routines used to communicate with the board. load_generic_config "sim" # No multilib flags needed by default. process_multilib_options "" # basic-sim.exp is a basic description for the standard Cygnus simulator. load_base_board_description "basic-sim" # The name of the directory in the build tree where the simulator lives. setup_sim epiphany # The compiler used to build for this board. This has *nothing* to do # with what compiler is tested if we're testing gcc. set_board_info compiler "[find_gcc]" # The basic set of flags needed to build "hello world" for this # board. This board uses libgloss and newlib. set_board_info cflags "[libgloss_include_flags] [newlib_include_flags]" set_board_info ldflags "[libgloss_link_flags] [newlib_link_flags]" # This board doesn't use a linker script. set_board_info ldscript "" # No support for signals. set_board_info gdb,nosignals 1This file needs to be added to dejagnu's search path through a global configuration file. But you do not really need to add the path to the configuration file — dejagnu automatically adds a search path to the
board
directory in the same place as the configuration file is located. So it is enough to create an empty file ~/dejagnu/config.exp
, and copy epiphany-sim.exp
to ~/dejagnu/boards/epiphany-sim.exp
.The GCC test-suite can now be run as
cd build_gcc env PATH="${PREFIX}/bin:${PATH}" DEJAGNU="~/dejagnu/config.exp" \ make -j4 check-gcc RUNTESTFLAGS="--target_board=epiphany-sim"
This post was updated 2017-08-13 with a note about
contrib/download_prerequisites
.