Skip to content

Commit 63cfe46

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. Change-Id: I98d67e0f33a893eb48e2f47300702d75c4da6e1f
1 parent 007bf41 commit 63cfe46

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
@@ -907,6 +907,7 @@ static bool isRelroSection(const OutputSection *sec) {
907907
enum RankFlags {
908908
RF_NOT_ADDR_SET = 1 << 27,
909909
RF_NOT_ALLOC = 1 << 26,
910+
RF_HIP_FATBIN = 1 << 19,
910911
RF_PARTITION = 1 << 18, // Partition number (8 bits)
911912
RF_NOT_SPECIAL = 1 << 17,
912913
RF_WRITE = 1 << 16,
@@ -997,6 +998,15 @@ static unsigned getSectionRank(OutputSection &osec) {
997998
if (osec.type == SHT_NOBITS)
998999
rank |= RF_BSS;
9991000

1001+
// Put HIP fatbin related sections further away to avoid wasting relocation
1002+
// range to jump over them. Make sure .hip_fatbin is the furthest.
1003+
if (osec.name == ".hipFatBinSegment")
1004+
rank |= RF_HIP_FATBIN;
1005+
if (osec.name == ".hip_gpubin_handle")
1006+
rank |= RF_HIP_FATBIN | 2;
1007+
if (osec.name == ".hip_fatbin")
1008+
rank |= RF_HIP_FATBIN | RF_WRITE | 3;
1009+
10001010
// Some architectures have additional ordering restrictions for sections
10011011
// within the same PT_LOAD.
10021012
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)