Index: lib/ReaderWriter/ELF/AMDGPU/AMDGPUELFFile.cpp =================================================================== --- lib/ReaderWriter/ELF/AMDGPU/AMDGPUELFFile.cpp +++ lib/ReaderWriter/ELF/AMDGPU/AMDGPUELFFile.cpp @@ -43,7 +43,9 @@ // symbol offset, which is section relative, so we can write it to the // symbol table in AMDDGPUSymbolTable::finalize(). bool HasSectionRelativeOffset = false; - if (sectionName == ".hsatext" || sectionName == ".hsarodata_readonly_agent") + if (sectionName == ".hsatext" || sectionName == ".hsarodata_readonly_agent" || + sectionName == ".hsadata_global_program" || + sectionName == ".hsadata_global_agent") HasSectionRelativeOffset = true; return new (this->_readerStorage) AMDGPUELFDefinedAtom( Index: lib/ReaderWriter/ELF/AMDGPU/AMDGPUSectionChunks.h =================================================================== --- lib/ReaderWriter/ELF/AMDGPU/AMDGPUSectionChunks.h +++ lib/ReaderWriter/ELF/AMDGPU/AMDGPUSectionChunks.h @@ -20,6 +20,16 @@ HSARoDataReadOnlySection(const ELFLinkingContext &ctx); }; +class HSADataGlobalProgramSection : public AtomSection { +public: + HSADataGlobalProgramSection(const ELFLinkingContext &ctx); +}; + +class HSADataGlobalAgentSection : public AtomSection { +public: + HSADataGlobalAgentSection(const ELFLinkingContext &ctx); +}; + } // elf } // lld Index: lib/ReaderWriter/ELF/AMDGPU/AMDGPUSectionChunks.cpp =================================================================== --- lib/ReaderWriter/ELF/AMDGPU/AMDGPUSectionChunks.cpp +++ lib/ReaderWriter/ELF/AMDGPU/AMDGPUSectionChunks.cpp @@ -26,5 +26,30 @@ } +HSADataGlobalProgramSection::HSADataGlobalProgramSection(const ELFLinkingContext &ctx) + : AtomSection(ctx, ".hsadata_global_program", DefinedAtom::typeData, 0, 0) { + + _type = llvm::ELF::SHT_PROGBITS; + _flags = llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE | + llvm::ELF::SHF_AMDGPU_HSA_GLOBAL; + + // FIXME: What is the correct alignment? + _alignment = 4; + +} + +HSADataGlobalAgentSection::HSADataGlobalAgentSection(const ELFLinkingContext &ctx) + : AtomSection(ctx, ".hsadata_global_agent", DefinedAtom::typeData, 0, 0) { + + _type = llvm::ELF::SHT_PROGBITS; + _flags = llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE | + llvm::ELF::SHF_AMDGPU_HSA_GLOBAL | + llvm::ELF::SHF_AMDGPU_HSA_AGENT; + + // FIXME: What is the correct alignment? + _alignment = 4; + +} + } // elf } // lld Index: lib/ReaderWriter/ELF/AMDGPU/AMDGPUTargetHandler.h =================================================================== --- lib/ReaderWriter/ELF/AMDGPU/AMDGPUTargetHandler.h +++ lib/ReaderWriter/ELF/AMDGPU/AMDGPUTargetHandler.h @@ -43,6 +43,12 @@ if (name == ".hsarodata_readonly_agent") return new (_allocator) HSARoDataReadOnlySection(_ctx); + if (name == ".hsadata_global_program") + return new (_allocator) HSADataGlobalProgramSection(_ctx); + + if (name == ".hsadata_global_agent") + return new (_allocator) HSADataGlobalAgentSection(_ctx); + if (name == ".note") contentType = DefinedAtom::typeRONote; Index: lib/ReaderWriter/ELF/AMDGPU/AMDGPUTargetHandler.cpp =================================================================== --- lib/ReaderWriter/ELF/AMDGPU/AMDGPUTargetHandler.cpp +++ lib/ReaderWriter/ELF/AMDGPU/AMDGPUTargetHandler.cpp @@ -57,6 +57,12 @@ segment->append(section); } + if (InputSectionName == ".hsadata_global_agent") { + Segment *segment = new (_allocator) Segment(_ctx, + "PT_AMDGPU_HSA_LOAD_GLOBAL_AGENT", PT_AMDGPU_HSA_LOAD_GLOBAL_AGENT); + _segments.push_back(segment); + segment->append(section); + } if (InputSectionName == ".hsarodata_readonly_agent") { Segment *segment = new (_allocator) Segment(_ctx, @@ -64,6 +70,13 @@ _segments.push_back(segment); segment->append(section); } + + if (InputSectionName == ".hsadata_global_program") { + Segment *segment = new (_allocator) Segment(_ctx, + "PT_AMDGPU_HSA_LOAD_GLOBAL_PROGRAM", PT_AMDGPU_HSA_LOAD_GLOBAL_PROGRAM); + _segments.push_back(segment); + segment->append(section); + } } } } Index: test/elf/AMDGPU/hsa-sections.test =================================================================== --- test/elf/AMDGPU/hsa-sections.test +++ test/elf/AMDGPU/hsa-sections.test @@ -3,6 +3,27 @@ # RUN: llvm-readobj -h -program-headers -s -symbols %t.exe | FileCheck %s # CHECK: Section { +# CHECK: Name: .hsadata_global_agent +# CHECK: Type: SHT_PROGBITS (0x1) +# CHECK: Flags [ (0x900003 +# CHECK: SHF_ALLOC (0x2) +# CHECK: SHF_AMDGPU_HSA_AGENT (0x800000) +# CHECK: SHF_AMDGPU_HSA_GLOBAL (0x100000) +# CHECK: SHF_WRITE (0x1) +# CHECK: ] +# CHECK: } + +# CHECK: Section { +# CHECK: Name: .hsadata_global_program +# CHECK: Type: SHT_PROGBITS (0x1) +# CHECK: Flags [ (0x100003 +# CHECK: SHF_ALLOC (0x2) +# CHECK: SHF_AMDGPU_HSA_GLOBAL (0x100000) +# CHECK: SHF_WRITE (0x1) +# CHECK: ] +# CHECK: } + +# CHECK: Section { # CHECK: Name: .hsarodata_readonly_agent # CHECK: Type: SHT_PROGBITS # CHECK: Flags [ (0xA00002 @@ -12,6 +33,15 @@ # CHECK: ] # CHECK: } + +# CHECK: ProgramHeader { +# CHECK: Type: PT_AMDGPU_HSA_LOAD_GLOBAL_PROGRAM (0x60000000) +# CHECK: } + +# CHECK: ProgramHeader { +# CHECK: Type: PT_AMDGPU_HSA_LOAD_GLOBAL_AGENT (0x60000001) +# CHECK: } + # CHECK: ProgramHeader { # CHECK: Type: PT_AMDGPU_HSA_LOAD_READONLY_AGENT (0x60000002) # CHECK: } @@ -24,6 +54,14 @@ Type: ET_REL Machine: EM_AMDGPU Sections: + - Name: .hsadata_global_agent + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_WRITE, SHF_AMDGPU_HSA_GLOBAL, SHF_AMDGPU_HSA_AGENT ] + + - Name: .hsadata_global_program + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_WRITE, SHF_AMDGPU_HSA_GLOBAL ] + - Name: .hsarodata_readonly_agent Type: SHT_PROGBITS Flags: [ SHF_ALLOC, SHF_AMDGPU_HSA_AGENT, SHF_AMDGPU_HSA_READONLY ]