Index: include/llvm/Support/ELF.h =================================================================== --- include/llvm/Support/ELF.h +++ include/llvm/Support/ELF.h @@ -747,7 +747,12 @@ SHF_MIPS_ADDR = 0x40000000, // Section data is string data by default. - SHF_MIPS_STRING = 0x80000000 + SHF_MIPS_STRING = 0x80000000, + + SHF_AMDGPU_HSA_GLOBAL = (0x00100000 & SHF_MASKOS), + SHF_AMDGPU_HSA_READONLY = (0x00200000 & SHF_MASKOS), + SHF_AMDGPU_HSA_CODE = (0x00400000 & SHF_MASKOS), + SHF_AMDGPU_HSA_AGENT = (0x00800000 & SHF_MASKOS) }; // Section Group Flags @@ -828,7 +833,12 @@ STT_LOOS = 10, // Lowest operating system-specific symbol type STT_HIOS = 12, // Highest operating system-specific symbol type STT_LOPROC = 13, // Lowest processor-specific symbol type - STT_HIPROC = 15 // Highest processor-specific symbol type + STT_HIPROC = 15, // Highest processor-specific symbol type + + // AMDGPU symbol types + STT_AMDGPU_HSA_KERNEL = STT_LOOS, + STT_AMDGPU_HSA_INDIRECT_FUNCTION = STT_LOOS + 1, + STT_AMDGPU_HSA_METADATA = STT_LOOS + 2 }; enum { @@ -979,7 +989,13 @@ PT_MIPS_REGINFO = 0x70000000, // Register usage information. PT_MIPS_RTPROC = 0x70000001, // Runtime procedure table. PT_MIPS_OPTIONS = 0x70000002, // Options segment. - PT_MIPS_ABIFLAGS = 0x70000003 // Abiflags segment. + PT_MIPS_ABIFLAGS = 0x70000003, // Abiflags segment. + + // AMDGPU program header types. + PT_AMDGPU_HSA_LOAD_GLOBAL_PROGRAM = PT_LOOS, + PT_AMDGPU_HSA_LOAD_GLOBAL_AGENT = PT_LOOS + 1, + PT_AMDGPU_HSA_LOAD_READONLY_AGENT = PT_LOOS + 2, + PT_AMDGPU_HSA_LOAD_CODE_AGENT = PT_LOOS + 3 }; // Segment flag bits. Index: tools/llvm-readobj/ELFDumper.cpp =================================================================== --- tools/llvm-readobj/ELFDumper.cpp +++ tools/llvm-readobj/ELFDumper.cpp @@ -507,13 +507,24 @@ LLVM_READOBJ_ENUM_ENT(ELF, SHF_TLS ), LLVM_READOBJ_ENUM_ENT(ELF, XCORE_SHF_CP_SECTION), LLVM_READOBJ_ENUM_ENT(ELF, XCORE_SHF_DP_SECTION), - LLVM_READOBJ_ENUM_ENT(ELF, SHF_MIPS_NOSTRIP ) + LLVM_READOBJ_ENUM_ENT(ELF, SHF_MIPS_NOSTRIP ), + LLVM_READOBJ_ENUM_ENT(ELF, SHF_AMDGPU_HSA_GLOBAL), + LLVM_READOBJ_ENUM_ENT(ELF, SHF_AMDGPU_HSA_READONLY), + LLVM_READOBJ_ENUM_ENT(ELF, SHF_AMDGPU_HSA_CODE), + LLVM_READOBJ_ENUM_ENT(ELF, SHF_AMDGPU_HSA_AGENT) }; static const char *getElfSegmentType(unsigned Arch, unsigned Type) { // Check potentially overlapped processor-specific // program header type. switch (Arch) { + case ELF::EM_AMDGPU: + switch (Type) { + LLVM_READOBJ_ENUM_CASE(ELF, PT_AMDGPU_HSA_LOAD_GLOBAL_PROGRAM); + LLVM_READOBJ_ENUM_CASE(ELF, PT_AMDGPU_HSA_LOAD_GLOBAL_AGENT); + LLVM_READOBJ_ENUM_CASE(ELF, PT_AMDGPU_HSA_LOAD_READONLY_AGENT); + LLVM_READOBJ_ENUM_CASE(ELF, PT_AMDGPU_HSA_LOAD_CODE_AGENT); + } case ELF::EM_ARM: switch (Type) { LLVM_READOBJ_ENUM_CASE(ELF, PT_ARM_EXIDX); @@ -942,6 +953,7 @@ getSectionNameIndex(*Obj, Symbol, SectionName, SectionIndex); std::string FullSymbolName = getFullSymbolName(*Obj, Symbol, StrTable, IsDynamic); + unsigned char SymbolType = Symbol->getType(); DictScope D(W, "Symbol"); W.printNumber("Name", FullSymbolName, Symbol->st_name); @@ -949,7 +961,18 @@ W.printNumber("Size", Symbol->st_size); W.printEnum ("Binding", Symbol->getBinding(), makeArrayRef(ElfSymbolBindings)); - W.printEnum ("Type", Symbol->getType(), makeArrayRef(ElfSymbolTypes)); + if (Obj->getHeader()->e_machine == ELF::EM_AMDGPU && + SymbolType >= ELF::STT_LOOS && SymbolType < ELF::STT_HIOS) { + switch(SymbolType) { + #define LLVM_READOBJ_AMDGPU_STT_CASE(name) \ + case name: W.printHex("Type", #name, name); break; + LLVM_READOBJ_AMDGPU_STT_CASE(STT_AMDGPU_HSA_KERNEL); + LLVM_READOBJ_AMDGPU_STT_CASE(STT_AMDGPU_HSA_INDIRECT_FUNCTION); + LLVM_READOBJ_AMDGPU_STT_CASE(STT_AMDGPU_HSA_METADATA); + #undef LLVM_READOBJ_AMDGPU_STT_CASE + } + } else + W.printEnum ("Type", SymbolType, makeArrayRef(ElfSymbolTypes)); W.printNumber("Other", Symbol->st_other); W.printHex("Section", SectionName, SectionIndex); }