65b1e0c058
Initial commit for transition from IsaGenerator/SP3 assembler model to the LLVM AMDGPU (AMDGCN) assembler backend: - Add Assembler class, may be instantiated for assembly similar to IsaGenerator. - Add Assembler and LLVM archive dependencies to build process. - CXX bumped to gnu++14 as required for LLVM compilation. - Compatible with LLVM 7.0 and greater (latest Lightning/llvm-git version should be used for up-to-date gfx support). Note that this is just a build dependency and *not* a runtime dependency. LLVM does not need to be installed on the host machine to run kfdtest. - CMake will first look for a Lightning build. Lightning itself does not need to be installed system-wide, just built. If this fails, it will attempt to find a system-wide LLVM install. General Assembler usage and notes: - Similar to IsaGenerator, applicable test classes will contain an Assembler object pointer which may be instantiated in the test constructor. - Instantiation requires the GFXIP version in order to find the appropriate LLVM AMDGPU Target ID. - The RunAssemble() member func takes in a standard const char* shader and fills the TextData member with the output binary; TextSize with the size of TextData. These may be accessed via GetInstrStream() and GetInstrStreamSize(), or the output binary may be copied into an IsaBuffer via CopyInstrStream(). RunAssembleBuf() combines RunAssemble() and CopyInstrStream() and additionally takes an optional BufSize parameter to specify the size of the output buffer (defaults to PAGE_SIZE). - Assembler object deletion is to be done in the base test destructor. Assembler-specific memory allocation is freed in the Assembler destructor. - For debug, one can call PrintTextHex() to print out a formatted hex representation of the output binary, or PrintELFHex() to print out the intermediate ELF object. Note that PrintTextHex() is public whereas PrintELFHex() is private. - Prints use the LLVM outs() call as that allows for use of the LLVM format_hex() func in the aforementioned debug prints. This is subject to change if the LOG() call would be preferred. RunAssemble control flow: - Ensure correct Assembler initialization and clear previous run TextData (if necessary). - Initialize LLVM AMDGPU target, required interfaces, and buffers. - Set parser to specified target/subtarget and assemble into ELF code object. - Extract .text section from ELF, allocate space for TextData and store. - On success, returns 0 (HSAKMT_STATUS_SUCCESS). On error, returns -1 (subject to change to be in line with HSAKMT_STATUS enum). Signed-off-by: Graham Sider <Graham.Sider@amd.com> Change-Id: I1d96230824db651d3ffbaa46eb68fc274e7066b5