Difference between revisions of "NaplesPU Tools"

From NaplesPU Documentation
Jump to: navigation, search
 
(21 intermediate revisions by 2 users not shown)
Line 1: Line 1:
A new backend for llvm needs to be added and registered. After registration, llvm tools are able to lookup and use the new target at runtime.
+
NaplesPU is provided with a set of additional tools in order to fully support the compilation process of an application.  
In the following, we will show which files are involved in the registration phase and which changes are required.  
 
  
==== CMakeLists.txt ====
+
== elf2hex ==
<syntaxhighlight lang="java" line='line'>
+
elf2hex is the tool required for elf code transformation. It works on an input ELF code to produce a hex output file as the memory image to be written on device memory. NaplesPU relies on its own implementation of the elf2hex tool, located in elf2hex.cpp. In our purposes, the tool produces two different outputs:
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
+
* MANGO compliant memory image, a 512-bit little-endian aligned image ready to be flashed on the MANGO platform;
set(CMAKE_INSTALL_PREFIX "/usr/local/llvm-nuplus/" CACHE PATH "NuPlusLLVM install prefix" FORCE)
+
* Standalone compliant memory image, a 512-bit little-endian aligned image to be used in a standalone environment.
endif()
+
 
</syntaxhighlight>
+
== Disassembler ==
This specifies the installation path that, in our case, is: "/usr/local/llvm-nuplus/".
+
A disassembler attempts to revert back the assembly code from the binary one. In order to be able to support NaplesPU code disassembly, LLVM requires to implement a Disassembler class. The implementation is provided in [[NaplesPUDisassembler.cpp]]. Disassembly methods rely on auto-generated ''decoder tables'' from TableGen files. TableGen also offers a way to force a specific decoder method to be called, specifying the ''DecoderMethod'' field on instructions.
  
<syntaxhighlight lang="java" line='line'>
+
<syntaxhighlight>
set(LLVM_ALL_TARGETS
+
def V16MEMri : Operand<v16i32> {
   AArch64
+
   let EncoderMethod = "encodeMemoryOpValue";
   AMDGPU
+
   let DecoderMethod = "decodeVectorWMemoryOpValue";
  ARM
+
...
  BPF
+
}
  Hexagon
 
  Mips
 
  MSP430
 
  NVPTX
 
  PowerPC
 
  Sparc
 
  SystemZ
 
  X86
 
  XCore
 
  NuPlus
 
  )
 
</syntaxhighlight>
 
The target name should be added to the LLVM_ALL_TARGETS list.
 
  
<syntaxhighlight lang="java" line='line'>
+
static DecodeStatus decodeVectorWMemoryOpValue(...)
set(LLVM_TARGETS_TO_BUILD "NuPlus" CACHE STRING "Semicolon-separated list of targets to build, or \"all\".")
+
{
 +
  return decodeMemoryOpValue(Inst, Insn, Address, Decoder,
 +
        NaplesPU::VR512WRegClassID);
 +
}
 
</syntaxhighlight>
 
</syntaxhighlight>
In a standard version of llvm, the LLVM_TARGETS_TO_BUILD variable is set to "all" in order to compile llvm with all the provided target backends. In out custom compiler, we set this variable to "NuPlus". In this way the compiler is built just targeting the NuPlus architecture.
 
  
<syntaxhighlight lang="java" line='line'>
+
== Object File Dumper ==
set(LLVM_DEFAULT_TARGET_TRIPLE "nuplus-none-none" CACHE STRING "Default target for which LLVM will generate code." )
+
LLVM provides a custom tool to work as an object file dumper, that is a utility that prints the contents of object files and of the final linked image. For this reason, it is primarily used to debug the generated machine code. In the LLVM implementation, the ''llvm-objdump'' binary relies on the Disassembler classes, in order to revert the binary code into the assembly back.
</syntaxhighlight>
 
Finally, we remove the possibility of targeting a different architecture then NuPlus.
 

Latest revision as of 17:22, 21 June 2019

NaplesPU is provided with a set of additional tools in order to fully support the compilation process of an application.

elf2hex

elf2hex is the tool required for elf code transformation. It works on an input ELF code to produce a hex output file as the memory image to be written on device memory. NaplesPU relies on its own implementation of the elf2hex tool, located in elf2hex.cpp. In our purposes, the tool produces two different outputs:

  • MANGO compliant memory image, a 512-bit little-endian aligned image ready to be flashed on the MANGO platform;
  • Standalone compliant memory image, a 512-bit little-endian aligned image to be used in a standalone environment.

Disassembler

A disassembler attempts to revert back the assembly code from the binary one. In order to be able to support NaplesPU code disassembly, LLVM requires to implement a Disassembler class. The implementation is provided in NaplesPUDisassembler.cpp. Disassembly methods rely on auto-generated decoder tables from TableGen files. TableGen also offers a way to force a specific decoder method to be called, specifying the DecoderMethod field on instructions.

def V16MEMri : Operand<v16i32> {
  let EncoderMethod = "encodeMemoryOpValue";
  let DecoderMethod = "decodeVectorWMemoryOpValue";
...
}

static DecodeStatus decodeVectorWMemoryOpValue(...) 
{
  return decodeMemoryOpValue(Inst, Insn, Address, Decoder,
         NaplesPU::VR512WRegClassID);
}

Object File Dumper

LLVM provides a custom tool to work as an object file dumper, that is a utility that prints the contents of object files and of the final linked image. For this reason, it is primarily used to debug the generated machine code. In the LLVM implementation, the llvm-objdump binary relies on the Disassembler classes, in order to revert the binary code into the assembly back.