NaplesPU Tools
nu+ is provided with a set of additional tools in order to fully support the compilation process of an application.
elf2hex
As the name said, elf2hex is the tool that provides the transformation of the elf file, the output of the compilation passes illustrated in the previous sections, in hex file, in order to be compliant with the required format that has to be written in the memory. The elf2hex source code is implemented in the elf2hex.cpp file. It is developed to print the memory image in various formats, such as the MANGO format, that is 512-bit aligned in a little-endian fashion, MANGO architecture compliant, and the standalone format, that is compliant with the standalone implementation of the device.
Disassembler
A disassembler attempts to revert the assembly code from the binary machine code. LLVM provides its own tool, that is llvm-is. In order to provide to LLVM the support for the target-platform machine code disassembly, it is necessary to register a custom implementation of the NuPlusDisassembler.cpp file. It relies on the decoder table located in the NuPlusGenDisassemblerTables.inc file, that is an autogenerated file, result of the compilation of the target-specific TableGen files. For this reason, most of Disassembler code in the NuPlusDisassembler.cpp file is retrieved from the .td description. It is also possible to specify the DecoderMethod flag on an instruction in the TableGen file. Consequently, it is necessary to provide the implementation of the specified method in the NuPlusDisassembler.cpp file.
def V16MEMri : Operand<v16i32> {
let EncoderMethod = "encodeMemoryOpValue";
let DecoderMethod = "decodeVectorWMemoryOpValue";
...
}
static DecodeStatus decodeVectorWMemoryOpValue(...)
{
return decodeMemoryOpValue(Inst, Insn, Address, Decoder,
NuPlus::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 \texttt{llvm-objdump} binary relies on the Disassembler classes, in order to revert the binary code into the assembly back.