Difference between revisions of "Toolchain"
m |
|||
Line 11: | Line 11: | ||
== How to compile a kernel for the NuPlus architecture == | == How to compile a kernel for the NuPlus architecture == | ||
− | Some kernels are provided with the standard release of the NuPlus toolchain. We provide makefile to compile these kernels for NuPlus. In case you want to add a new kernel, it is suggested to copy a kernel folder and replace C/C++ files with your own source code. Then, remember to modify the makefile updating the SRCS variable with the names of the C/C++ files you want to compile. When using these makefiles, different tools are called: | + | Some kernels are provided with the standard release of the NuPlus toolchain. We provide a makefile to compile these kernels for NuPlus. In case you want to add a new kernel, it is suggested to copy a kernel folder and replace C/C++ files with your own source code. Then, remember to modify the makefile updating the SRCS variable with the names of the C/C++ files you want to compile. When using these makefiles, different tools are called: |
* Clang to emit the LLVM IR and the object files | * Clang to emit the LLVM IR and the object files | ||
* MCLINKER to handle the job of linking | * MCLINKER to handle the job of linking | ||
Line 23: | Line 23: | ||
== The nu+ LLVM == | == The nu+ LLVM == | ||
The nu+ toolchain is based on the LLVM project and include: | The nu+ toolchain is based on the LLVM project and include: | ||
− | # [[Frontend | A | + | # [[Frontend | A custom version of the Clang frontend]] |
# [[Backend | A native nu+ backend]] | # [[Backend | A native nu+ backend]] | ||
# [[Tools| Some external tools that are used by llvm, i.e. linker, disassembler, etc..]] | # [[Tools| Some external tools that are used by llvm, i.e. linker, disassembler, etc..]] |
Revision as of 15:13, 4 June 2018
The nu+ toolchain is based on the LLVM project and includes a custom version of the Clang frontend and a native nu+ backend. The nu+ linker is based on MCLinker. In addition, Nu+ comes with an ELFtoHEX tool that takes in input the ELF file and builds memory images that can be loaded into memory.
Contents
Requirements for Nu+ toolchain
- cmake (we tested cmake 3.7.2 downloaded from https://cmake.org/download/)
- flex (we tested flex 2.6.0 downloaded using the advanced packaging tool, i.e. apt-get)
- bison (we tested bison 3.0.4 downloaded using the advanced packaging tool, i.e. apt-get)
- libz-dev (downloaded using the advanced packaging tool, i.e. apt-get)
How to compile the the Nu+ toolchain
To build the nu+ toolchain, you must launch ./setup_new.sh -n from a terminal in the compiler root folder. The script will create a new directory called build and will start building the compiler. By default the script tries to build the compiler using 4 threads. If you want to modify that, especially if your machine have less than 8GB of RAM, you can use the -t flag to specify the number of threads to use. Other information can be obtained by using the -h flag.
How to compile a kernel for the NuPlus architecture
Some kernels are provided with the standard release of the NuPlus toolchain. We provide a makefile to compile these kernels for NuPlus. In case you want to add a new kernel, it is suggested to copy a kernel folder and replace C/C++ files with your own source code. Then, remember to modify the makefile updating the SRCS variable with the names of the C/C++ files you want to compile. When using these makefiles, different tools are called:
- Clang to emit the LLVM IR and the object files
- MCLINKER to handle the job of linking
- elf2hex to generate the HEX file from the ELF file
- llvm-objdump to generate the dump from the elf file
In order to change the optimization level of the compiler or any other flag, it is possible to modify the misc/NuPlus.mk (or misc/Makefile.nuplus if you are compiling a kernel for the MANGO project ) makefile.
How to compile the libraries for the NuPlus architecture
To compile the libraries you only have to execute ./setup_new.sh -l from a terminal in the NuPlusLLVM root folder. The script will automatically build the libraries. Note that you must have compiled the NuPlus compiler first.
The nu+ LLVM
The nu+ toolchain is based on the LLVM project and include:
- A custom version of the Clang frontend
- A native nu+ backend
- Some external tools that are used by llvm, i.e. linker, disassembler, etc..
In addition, in order add the nu+ architecture inside llvm, a registration phase was required.
Testing
To test the code generation process, the LLVM testing infrastructure has been used.
The script "run_tests" can be used to run the nu+ testing suite. The main purpose is to perform regression test, so that it is possible to determine if a change in the back-end has negative consequences.
The tool used is the "llvm-lit", a python script that parses the test files and executes the testing commands.
The code generation tests are contained in "compiler/test/CodeGen/NuPlus" and cover the main LLVM IR operations. A code generation test file is a collection of function written in LLVM IR with commands directed to the llvm-lit and FileCheck tools. These commands are written as comments. The main commands used are RUN, CHECK and CHECK-LABEL.
The RUN line tells lit how to run the test. If there are no RUN lines, lit will issue an error while running a test. The line syntax is similar to a shell’s syntax for pipelines. To examine output to figure out if the test passes the FileCheck tool must be used.
The RUN line used for all the tests is:
; RUN: llc -march=nuplus < %s | FileCheck %s
This tells lit to run llc with nuplus architecture as target, to give the output file to the FileCheck tool.
The CHECK_LABEL and the CHECK lines are interpreted by the FileCheck tool. It compares the llc output file with the CHECK_LABEL and CHECK lines. The comparison is done in sequence, although there are directives that let the checking in not sequential order, see [1] for further informations.
Libraries
Nu+ is provided with different kind of libraries that are contained in the libs/ folder. For more information, check The nu+ libraries