Difference between revisions of "Toolchain"

From NaplesPU Documentation
Jump to: navigation, search
(Building Toolchain on Ubuntu Linux environment)
 
(38 intermediate revisions by 2 users not shown)
Line 1: Line 1:
The nu+ toolchain is a collection of tools required to compile a nu+ ''executable'' application. It is based on the [https://llvm.org LLVM] project leveraging on a custom version of the [[Frontend | Clang Frontend]] and on a ''from-scratch'' implementation of the [[Backend | Backend]]. The toolchain comes with a modified version of [https://lld.llvm.org LLD], an ''elf2hex'' tool to generate nu+ compatible memory images and lastly a custom version of the ''objdump'' tool for debug purposes. A custom implementation of the ''libc'' libraries is provided.
+
The NaplesPU toolchain is a collection of tools required to compile a NaplesPU ''executable'' application. It is based on the [https://llvm.org LLVM] project leveraging on a custom version of the [[Frontend | Clang Frontend]] and on a ''from-scratch'' implementation of the [[Backend | Backend]]. The toolchain comes with a modified version of [https://lld.llvm.org LLD], an ''elf2hex'' tool to generate NaplesPU compatible memory images and lastly a custom version of the ''objdump'' tool for debuggingc purposes. A custom implementation of the ''libc'' libraries is provided.
  
 
The toolchain supports the compilation of ''C''-based and ''OpenCL C'' kernels.   
 
The toolchain supports the compilation of ''C''-based and ''OpenCL C'' kernels.   
  
 
== Building Toolchain on Ubuntu Linux environment ==
 
== Building Toolchain on Ubuntu Linux environment ==
This section shows how to build the nu+ toolchain in an Ubuntu Linux environment. The following steps are still valid in any other Unix-based system despite of package manager related differences.
+
This section shows how to build the NaplesPU toolchain in an Ubuntu Linux environment. The following steps are still valid in any other Unix-based system despite package manager related differences.
  
 
=== Required Software ===
 
=== Required Software ===
The nu+ toolchain installation relies on the following dependencies:
+
The NaplesPU toolchain installation relies on the following dependencies:
 
* Git
 
* Git
 
* GCC
 
* GCC
Line 23: Line 23:
 
The following terminal command may be used to install all required software:
 
The following terminal command may be used to install all required software:
  
<code> sudo apt install libxml2-dev git cmake gcc g++ python bison flex zlib1g-dev swig python-dev libedit-dev libncurses5-dev ninja </code>
+
<code> $ sudo apt install libxml2-dev git cmake gcc g++ python bison flex zlib1g-dev swig python-dev libedit-dev libncurses5-dev ninja-build </code>
  
 
=== Building Process ===
 
=== Building Process ===
  
 
First, you have to obtain the source code from the official repository by typing the following command:
 
First, you have to obtain the source code from the official repository by typing the following command:
<code> git clone https://gitlab.com/catecio/NuPlusLLVM.git <clone_directory> </code>
 
  
== How to compile the the nu+ toolchain==
+
<code> $ git clone https://github.com/AlessandroCilardo/NaplesPU-toolchain <clone_directory> </code>
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 nu+ architecture ==
+
The repository contains a helper script, ''setup.sh'' to make easier the installation process. To build a new implementation of the NaplesPU toolchain just type: 
  
TODO: considerare rimuovere questo e spostarlo in nuova pagina (Writing nu+ applications)
+
<code> $  ./setup.sh -n </code>
  
Some kernels are provided with the standard release of the nu+ toolchain. We provide a makefile to compile these kernels for nu+. 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:
+
This command starts the compilation process, installing the toolchain in ''Release Mode'' in <code>/usr/local/llvm-npu</code>.  
* Clang to emit the LLVM IR and the object files
+
If a debug version is required, add the <code> -d </code> flag to ''setup.sh''. You can also choose the number of threads for the compilation process, by using the <code> -t=<number_of_threads> </code> parameter.
* 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 [http://www.mango-project.eu/ MANGO project] ) makefile.
 
  
== How to compile the libraries for the nu+ architecture ==
+
At the end of the compilation process, libraries are required to be linked to the installation folder:
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 nu+ compiler first.
 
  
== The nu+ LLVM ==
+
<code> $  ./setup.sh -l </code>
The nu+ toolchain is based on the LLVM project and includes:
 
# [[Frontend | A custom version of the Clang frontend]]
 
# [[Backend | A native nu+ backend]]
 
# [[Tools| Some external tools that are used by llvm, i.e. linker, disassembler, etc..]]
 
  
In addition, in order add the nu+ architecture inside llvm, a [[How to add a new backend to llvm | registration phase]] was required.
+
Now, you can use the toolchain to build your own application.
  
== Testing ==
+
== The NaplesPU LLVM Structure ==
To test the code generation process, the [https://llvm.org/docs/TestingGuide.html LLVM testing infrastructure] has been used.  
+
The NaplesPU toolchain relies on the LLVM project, version 7.0, providing a custom implementation of its libraries in order to make possible the generation of NaplesPU kernels.  
  
The script "run_tests" can be used to run the nu+ testing suite. The main purpose is to perform regression tests, so that it is possible to determine if a change in the back-end has any negative consequence.
+
[http://clang.llvm.org Clang] is the compiler frontend for NaplesPU, extended to handle the token-recognition of custom intrinsic functions.  
  
The tool used is the "llvm-lit", a python script that parses the test files and executes the testing commands.  
+
[http://llvm.org/ LLVM] core libraries are used to implement a custom backend for NaplesPU, to manage the code lowering on the target device.
  
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 functions written in LLVM IR with commands directed to the llvm-lit and [https://llvm.org/docs/CommandGuide/FileCheck.html FileCheck] tools. These commands are written as comments. The main commands used are '''RUN''', '''CHECK''', and '''CHECK-LABEL'''.  
+
[http://lld.llvm.org LLD] is adapted to match NaplesPU architecture requirements for linking.
  
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 the output and check if the test has been passed, the FileCheck tool must be used.
+
[http://llvm.org/docs/CommandGuide/llvm-objdump.html objdump] is provided to disassemble and analyze the generated code.
  
The RUN line used for all the tests is:
+
''elf2hex'' is a tool required for memory image generation.
  
<syntaxhighlight lang="c" line='line'>
 
; RUN: llc -march=nuplus < %s | FileCheck %s
 
</syntaxhighlight>
 
  
This tells lit to run '''llc''' with nu+ architecture as target, to give the output file to the FileCheck tool.
+
Check the following links for detailed informations on how the toolchain is implemented.
 +
*  [[nu+ Clang Documentation | ''NaplesPU '' Clang Documentation]]
 +
*  [[nu+ LLVM Documentation | ''NaplesPU '' LLVM Documentation]]
 +
*  [[nu+ LLD Linker| ''NaplesPU '' LLD Linker Documentation]]
 +
*  [[nu+ Tools | ''NaplesPU '' Tools]]
 +
*  [[nu+ Libraries | ''NaplesPU '' Libraries]]
  
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 not be performed in sequential order, see [https://llvm.org/docs/CommandGuide/FileCheck.html] for further details.
+
== Extensions ==
  
== Libraries ==
+
* [[Extending NaplesPU for 64-bit support]]
nu+ is provided with different kind of libraries that are contained in the libs/ folder. For more information, check [[libraries|The nu+ libraries]].
+
* [[Extending NaplesPU for OpenCL support]]
 
 
== Makefiles and linker scripts ==
 
 
 
TODO: completare
 
 
 
== Debug and typical errors ==
 
For more information about the debug support and some typical errors, check [[debugLLVM|How to debug LLVM]].
 
 
 
== Compiler Extensions ==
 
* [[OpenCL|OpenCL extension for the nu+ architecture]]
 
* [[OpenMP|OpenMP extension for the nu+ architecture]]
 

Latest revision as of 13:49, 29 June 2019

The NaplesPU toolchain is a collection of tools required to compile a NaplesPU executable application. It is based on the LLVM project leveraging on a custom version of the Clang Frontend and on a from-scratch implementation of the Backend. The toolchain comes with a modified version of LLD, an elf2hex tool to generate NaplesPU compatible memory images and lastly a custom version of the objdump tool for debuggingc purposes. A custom implementation of the libc libraries is provided.

The toolchain supports the compilation of C-based and OpenCL C kernels.

Building Toolchain on Ubuntu Linux environment

This section shows how to build the NaplesPU toolchain in an Ubuntu Linux environment. The following steps are still valid in any other Unix-based system despite package manager related differences.

Required Software

The NaplesPU toolchain installation relies on the following dependencies:

  • Git
  • GCC
  • CMake
  • Python 2.7
  • libxml
  • Zlib
  • Bison
  • Flex
  • Libedit
  • Swig
  • ncurses libraries
  • Ninja

The following terminal command may be used to install all required software:

$ sudo apt install libxml2-dev git cmake gcc g++ python bison flex zlib1g-dev swig python-dev libedit-dev libncurses5-dev ninja-build

Building Process

First, you have to obtain the source code from the official repository by typing the following command:

$ git clone https://github.com/AlessandroCilardo/NaplesPU-toolchain <clone_directory>

The repository contains a helper script, setup.sh to make easier the installation process. To build a new implementation of the NaplesPU toolchain just type:

$ ./setup.sh -n

This command starts the compilation process, installing the toolchain in Release Mode in /usr/local/llvm-npu. If a debug version is required, add the -d flag to setup.sh. You can also choose the number of threads for the compilation process, by using the -t=<number_of_threads> parameter.

At the end of the compilation process, libraries are required to be linked to the installation folder:

$ ./setup.sh -l

Now, you can use the toolchain to build your own application.

The NaplesPU LLVM Structure

The NaplesPU toolchain relies on the LLVM project, version 7.0, providing a custom implementation of its libraries in order to make possible the generation of NaplesPU kernels.

Clang is the compiler frontend for NaplesPU, extended to handle the token-recognition of custom intrinsic functions.

LLVM core libraries are used to implement a custom backend for NaplesPU, to manage the code lowering on the target device.

LLD is adapted to match NaplesPU architecture requirements for linking.

objdump is provided to disassemble and analyze the generated code.

elf2hex is a tool required for memory image generation.


Check the following links for detailed informations on how the toolchain is implemented.

Extensions