Skip to content

Commit 048f350

Browse files
committed
Move HIP fatbin sections farther away from .text
This would avoid wasting relocation range to jump over the HIP fatbin sections and therefore alleviate relocation overflow pressure.
1 parent 92a0168 commit 048f350

File tree

2 files changed

+49
-0
lines changed

2 files changed

+49
-0
lines changed

lld/ELF/Writer.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -632,6 +632,7 @@ static bool isRelroSection(const OutputSection *sec) {
632632
enum RankFlags {
633633
RF_NOT_ADDR_SET = 1 << 27,
634634
RF_NOT_ALLOC = 1 << 26,
635+
RF_HIP_FATBIN = 1 << 19,
635636
RF_PARTITION = 1 << 18, // Partition number (8 bits)
636637
RF_LARGE_ALT = 1 << 15,
637638
RF_WRITE = 1 << 14,
@@ -729,6 +730,15 @@ unsigned elf::getSectionRank(OutputSection &osec) {
729730
if (osec.type == SHT_NOBITS)
730731
rank |= RF_BSS;
731732

733+
// Put HIP fatbin related sections further away to avoid wasting relocation
734+
// range to jump over them. Make sure .hip_fatbin is the furthest.
735+
if (osec.name == ".hipFatBinSegment")
736+
rank |= RF_HIP_FATBIN;
737+
if (osec.name == ".hip_gpubin_handle")
738+
rank |= RF_HIP_FATBIN | 2;
739+
if (osec.name == ".hip_fatbin")
740+
rank |= RF_HIP_FATBIN | RF_WRITE | 3;
741+
732742
// Some architectures have additional ordering restrictions for sections
733743
// within the same PT_LOAD.
734744
if (config->emachine == EM_PPC64) {

lld/test/ELF/hip-section-layout.s

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# REQUIRES: x86
2+
## Test HIP specific sections layout.
3+
4+
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux --defsym=HIP_SECTIONS=1 --defsym=NON_HIP_SECTIONS=1 %s -o %t.o
5+
# RUN: ld.lld %t.o -o %t.out
6+
# RUN: llvm-readobj --sections %t.out | FileCheck %s
7+
8+
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux --defsym=NON_HIP_SECTIONS=1 %s -o %t.1.o
9+
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux --defsym=HIP_SECTIONS=1 %s -o %t.2.o
10+
# RUN: ld.lld %t.1.o %t.2.o -o %t.s.out
11+
# RUN: llvm-readobj --sections %t.s.out | FileCheck %s
12+
13+
.ifdef HIP_SECTIONS
14+
.section .hipFatBinSegment,"aw",@progbits; .space 1
15+
.section .hip_gpubin_handle,"aw",@progbits; .space 1
16+
.section .hip_fatbin,"a",@progbits; .space 1
17+
.endif
18+
19+
.ifdef NON_HIP_SECTIONS
20+
.global _start
21+
.text
22+
_start:
23+
.section .bss,"aw",@nobits; .space 1
24+
.section .debug_info,"",@progbits
25+
.section .debug_line,"",@progbits
26+
.section .debug_str,"MS",@progbits,1
27+
.endif
28+
29+
# Check that the HIP sections are placed towards the end but before non allocated sections
30+
31+
// CHECK: Name: .text
32+
// CHECK: Name: .bss
33+
// CHECK: Name: .hipFatBinSegment
34+
// CHECK: Name: .hip_gpubin_handle
35+
// CHECK: Name: .hip_fatbin
36+
// CHECK: Name: .debug_info
37+
// CHECK: Name: .debug_line
38+
// CHECK: Name: .debug_str
39+

0 commit comments

Comments
 (0)