Skip to content

Commit 12d83b4

Browse files
committed
[ELF][PPC] Allow PT_LOAD to have overlapping p_offset ranges on EM_PPC
Ported the D64906 technique to EM_PPC. Delete ppc-rela.s that is covered by ppc32-abs-pic.s llvm-svn: 369351
1 parent 30c86b6 commit 12d83b4

12 files changed

+88
-95
lines changed

lld/ELF/Writer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2221,7 +2221,7 @@ template <class ELFT> void Writer<ELFT>::fixSectionAlignments() {
22212221
// TODO Enable this technique on all targets.
22222222
bool enable = config->emachine == EM_386 ||
22232223
config->emachine == EM_AARCH64 ||
2224-
config->emachine == EM_PPC64;
2224+
config->emachine == EM_PPC || config->emachine == EM_PPC64;
22252225

22262226
if (!enable || (config->zSeparateCode && prev &&
22272227
(prev->p_flags & PF_X) != (p->p_flags & PF_X)))

lld/test/ELF/basic-ppc.s

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@
2626
// CHECK-NEXT: Type: Executable (0x2)
2727
// CHECK-NEXT: Machine: EM_PPC (0x14)
2828
// CHECK-NEXT: Version: 1
29-
// CHECK-NEXT: Entry: 0x10010000
29+
// CHECK-NEXT: Entry: 0x100100B4
3030
// CHECK-NEXT: ProgramHeaderOffset: 0x34
31-
// CHECK-NEXT: SectionHeaderOffset: 0x10050
31+
// CHECK-NEXT: SectionHeaderOffset: 0x104
3232
// CHECK-NEXT: Flags [ (0x0)
3333
// CHECK-NEXT: ]
3434
// CHECK-NEXT: HeaderSize: 52
@@ -63,8 +63,8 @@
6363
// CHECK-NEXT: SHF_ALLOC (0x2)
6464
// CHECK-NEXT: SHF_EXECINSTR (0x4)
6565
// CHECK-NEXT: ]
66-
// CHECK-NEXT: Address: 0x10010000
67-
// CHECK-NEXT: Offset: 0x10000
66+
// CHECK-NEXT: Address: 0x100100B4
67+
// CHECK-NEXT: Offset: 0xB4
6868
// CHECK-NEXT: Size: 12
6969
// CHECK-NEXT: Link: 0
7070
// CHECK-NEXT: Info: 0
@@ -83,7 +83,7 @@
8383
// CHECK-NEXT: SHF_STRINGS (0x20)
8484
// CHECK-NEXT: ]
8585
// CHECK-NEXT: Address: 0x0
86-
// CHECK-NEXT: Offset: 0x1000C
86+
// CHECK-NEXT: Offset: 0xC0
8787
// CHECK-NEXT: Size: 8
8888
// CHECK-NEXT: Link: 0
8989
// CHECK-NEXT: Info: 0
@@ -97,7 +97,7 @@
9797
// CHECK-NEXT: Flags [ (0x0)
9898
// CHECK-NEXT: ]
9999
// CHECK-NEXT: Address: 0x0
100-
// CHECK-NEXT: Offset: 0x10014
100+
// CHECK-NEXT: Offset: 0xC8
101101
// CHECK-NEXT: Size: 16
102102
// CHECK-NEXT: Link: 5
103103
// CHECK-NEXT: Info: 1
@@ -114,7 +114,7 @@
114114
// CHECK-NEXT: Flags [ (0x0)
115115
// CHECK-NEXT: ]
116116
// CHECK-NEXT: Address: 0x0
117-
// CHECK-NEXT: Offset: 0x10024
117+
// CHECK-NEXT: Offset: 0xD8
118118
// CHECK-NEXT: Size: 42
119119
// CHECK-NEXT: Link: 0
120120
// CHECK-NEXT: Info: 0
@@ -128,7 +128,7 @@
128128
// CHECK-NEXT: Flags [ (0x0)
129129
// CHECK-NEXT: ]
130130
// CHECK-NEXT: Address: 0x0
131-
// CHECK-NEXT: Offset: 0x1004E
131+
// CHECK-NEXT: Offset: 0x102
132132
// CHECK-NEXT: Size: 1
133133
// CHECK-NEXT: Link: 0
134134
// CHECK-NEXT: Info: 0
@@ -143,8 +143,8 @@
143143
// CHECK-NEXT: ProgramHeader {
144144
// CHECK-NEXT: Type: PT_PHDR (0x6)
145145
// CHECK-NEXT: Offset: 0x34
146-
// CHECK-NEXT: VirtualAddress: 0x10000034
147-
// CHECK-NEXT: PhysicalAddress: 0x10000034
146+
// CHECK-NEXT: VirtualAddress: 0x10010034
147+
// CHECK-NEXT: PhysicalAddress: 0x10010034
148148
// CHECK-NEXT: FileSize: 128
149149
// CHECK-NEXT: MemSize: 128
150150
// CHECK-NEXT: Flags [ (0x4)
@@ -155,8 +155,8 @@
155155
// CHECK-NEXT: ProgramHeader {
156156
// CHECK-NEXT: Type: PT_LOAD (0x1)
157157
// CHECK-NEXT: Offset: 0x0
158-
// CHECK-NEXT: VirtualAddress: 0x10000000
159-
// CHECK-NEXT: PhysicalAddress: 0x10000000
158+
// CHECK-NEXT: VirtualAddress: 0x10010000
159+
// CHECK-NEXT: PhysicalAddress: 0x10010000
160160
// CHECK-NEXT: FileSize: 180
161161
// CHECK-NEXT: MemSize: 180
162162
// CHECK-NEXT: Flags [ (0x4)
@@ -166,9 +166,9 @@
166166
// CHECK-NEXT: }
167167
// CHECK-NEXT: ProgramHeader {
168168
// CHECK-NEXT: Type: PT_LOAD (0x1)
169-
// CHECK-NEXT: Offset: 0x1000
170-
// CHECK-NEXT: VirtualAddress: 0x10010000
171-
// CHECK-NEXT: PhysicalAddress: 0x10010000
169+
// CHECK-NEXT: Offset: 0xB4
170+
// CHECK-NEXT: VirtualAddress: 0x100100B4
171+
// CHECK-NEXT: PhysicalAddress: 0x100100B4
172172
// CHECK-NEXT: FileSize: 12
173173
// CHECK-NEXT: MemSize: 12
174174
// CHECK-NEXT: Flags [ (0x5)

lld/test/ELF/ppc-rela.s

Lines changed: 0 additions & 11 deletions
This file was deleted.

lld/test/ELF/ppc32-abs-pic.s

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@
77
## R_PPC_ADDR32 is an absolute relocation type.
88
## In PIC mode, it creates a relative relocation if the symbol is non-preemptable.
99

10-
# NM: 00020004 d b
10+
# NM: 00030204 d b
1111

1212
# RELOC: .rela.dyn {
13-
# RELOC-NEXT: 0x20004 R_PPC_RELATIVE - 0x20004
14-
# RELOC-NEXT: 0x20000 R_PPC_ADDR32 a 0
13+
# RELOC-NEXT: 0x30204 R_PPC_RELATIVE - 0x30204
14+
# RELOC-NEXT: 0x30200 R_PPC_ADDR32 a 0
1515
# RELOC-NEXT: }
1616

1717
.globl a, b

lld/test/ELF/ppc32-call-stub-nopic.s

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@
1111
# RUN: llvm-objdump -d --no-show-raw-insn %t | FileCheck %s
1212

1313
# RELOC: .rela.plt {
14-
# RELOC-NEXT: 0x10030000 R_PPC_JMP_SLOT f 0x0
15-
# RELOC-NEXT: 0x10030004 R_PPC_JMP_SLOT g 0x0
14+
# RELOC-NEXT: 0x100302C4 R_PPC_JMP_SLOT f 0x0
15+
# RELOC-NEXT: 0x100302C8 R_PPC_JMP_SLOT g 0x0
1616
# RELOC-NEXT: }
1717

18-
# SEC: .got PROGBITS 10020070
19-
# RELOC: PPC_GOT 0x10020070
18+
# SEC: .got PROGBITS 100202b8
19+
# RELOC: PPC_GOT 0x100202B8
2020

2121
## .got2+0x8000-0x10004 = 0x30000+0x8000-0x10004 = 65536*2+32764
2222
# CHECK-LABEL: _start:
@@ -27,40 +27,40 @@
2727
# CHECK-EMPTY:
2828

2929
## -fno-PIC call stubs of f and g.
30-
## .plt[0] = 0x10030000 = 65536*4099+0
31-
## .plt[1] = 0x10030004 = 65536*4099+4
30+
## .plt[0] = 0x100302c4 = 65536*4099+708
31+
## .plt[1] = 0x100302c8 = 65536*4099+712
3232
# CHECK-NEXT: 00000000.plt_call32.f:
3333
# CHECK-NEXT: lis 11, 4099
34-
# CHECK-NEXT: lwz 11, 0(11)
34+
# CHECK-NEXT: lwz 11, 708(11)
3535
# CHECK-NEXT: mtctr 11
3636
# CHECK-NEXT: bctr
3737
# CHECK-EMPTY:
3838
# CHECK-NEXT: 00000000.plt_call32.g:
3939
# CHECK-NEXT: lis 11, 4099
40-
# CHECK-NEXT: lwz 11, 4(11)
40+
# CHECK-NEXT: lwz 11, 712(11)
4141
# CHECK-NEXT: mtctr 11
4242
# CHECK-NEXT: bctr
4343
# CHECK-EMPTY:
4444

4545
## In Secure PLT ABI, .plt stores function pointers to first instructions of .glink
46-
# HEX: 0x10030000 10010040 10010044
46+
# HEX: 0x100302c4 10010200 10010204
4747

4848
## These instructions are referenced by .plt entries.
49-
# CHECK: 10010040 .glink:
49+
# CHECK: 10010200 .glink:
5050
# CHECK-NEXT: b .+8
5151
# CHECK-NEXT: b .+4
5252

5353
## PLTresolve
54-
## Operands of lis & lwz: .got+4 = 0x10020070+4 = 65536*4098+116
55-
## Operands of addis & addi: -.glink = -0x10010040 = 65536*-4097-48
54+
## Operands of lis & lwz: .got+4 = 0x10020070+4 = 65536*4098+700
55+
## Operands of addis & addi: -.glink = -0x10010200 = 65536*-4097-512
5656
# CHECK-NEXT: lis 12, 4098
5757
# CHECK-NEXT: addis 11, 11, -4097
58-
# CHECK-NEXT: lwz 0, 116(12)
59-
# CHECK-NEXT: addi 11, 11, -64
58+
# CHECK-NEXT: lwz 0, 700(12)
59+
# CHECK-NEXT: addi 11, 11, -512
6060

6161
# CHECK-NEXT: mtctr 0
6262
# CHECK-NEXT: add 0, 11, 11
63-
# CHECK-NEXT: lwz 12, 120(12)
63+
# CHECK-NEXT: lwz 12, 704(12)
6464
# CHECK-NEXT: add 11, 0, 11
6565
# CHECK-NEXT: bctr
6666

lld/test/ELF/ppc32-call-stub-pic.s

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,18 @@
2828
# RELOC-NEXT: R_PPC_JMP_SLOT h 0x0
2929
# RELOC-NEXT: }
3030

31-
# SEC: .got PROGBITS 00020088
32-
# DYN: PPC_GOT 0x20088
31+
# SEC: .got PROGBITS 00020374
32+
# DYN: PPC_GOT 0x20374
3333

3434
## .got2+0x8000-0x10004 = 0x30000+0x8000-0x10004 = 65536*2+32764
3535
# CHECK-LABEL: _start:
36-
# CHECK-NEXT: bcl 20, 31, .+4
37-
# CHECK-NEXT: 10004: mflr 30
38-
# CHECK-NEXT: addis 30, 30, 2
39-
# CHECK-NEXT: addi 30, 30, 32764
36+
# CHECK-NEXT: bcl 20, 31, .+4
37+
# PIE-NEXT: 10210: mflr 30
38+
# PIE-NEXT: addis 30, 30, 3
39+
# PIE-NEXT: addi 30, 30, -32400
40+
# SHARED-NEXT: 10230: mflr 30
41+
# SHARED-NEXT: addis 30, 30, 3
42+
# SHARED-NEXT: addi 30, 30, -32408
4043

4144
## Two bl 00008000.got2.plt_pic32.f
4245
# CHECK-NEXT: bl .+40
@@ -80,8 +83,7 @@
8083
## -fpic call stub of f.
8184
# CHECK-NEXT: 00000000.plt_pic32.f:
8285
# CHECK-NEXT: addis 11, 30, 2
83-
# PIE-NEXT: lwz 11, -144(11)
84-
# SHARED-NEXT: lwz 11, -136(11)
86+
# CHECK-NEXT: lwz 11, 4(11)
8587
# CHECK-NEXT: mtctr 11
8688
# CHECK-NEXT: bctr
8789
# CHECK-EMPTY:
@@ -92,36 +94,38 @@
9294
# CHECK-NEXT: 00008000.got2.plt_pic32.f:
9395

9496
## In Secure PLT ABI, .plt stores function pointers to first instructions of .glink
95-
# HEX: 0x0003fff8 00010090 00010094 00010098
97+
# HEX: 0x00040378 000102a0 000102a4 000102a8
9698

9799
## These instructions are referenced by .plt entries.
98-
# CHECK: 00010090 .glink:
100+
# PIE: 000102a0 .glink:
101+
# SHARED: 000102c0 .glink:
99102
# CHECK-NEXT: b .+12
100103
# CHECK-NEXT: b .+8
101104
# CHECK-NEXT: b .+4
102105

103106
## PLTresolve
104107
## Operand of addi: 0x100a8-.glink = 24
105-
# CHECK-NEXT: addis 11, 11, 0
106-
# CHECK-NEXT: mflr 0
107-
# CHECK-NEXT: bcl 20, 31, .+4
108-
# CHECK-NEXT: 100a8: addi 11, 11, 24
108+
# CHECK-NEXT: addis 11, 11, 0
109+
# CHECK-NEXT: mflr 0
110+
# CHECK-NEXT: bcl 20, 31, .+4
111+
# PIE-NEXT: 102b8: addi 11, 11, 24
112+
# SHARED-NEXT: 102d8: addi 11, 11, 24
109113

110114
# CHECK-NEXT: mflr 12
111115
# CHECK-NEXT: mtlr 0
112116
# CHECK-NEXT: subf 11, 12, 11
113117

114118
## Operand of lwz in -pie mode: &.got[1] - 0x100a8 = 0x20088+4 - 0x100a8 = 65536*1-28
115-
# CHECK-NEXT: addis 12, 12, 1
116-
# PIE-NEXT: lwz 0, -28(12)
117-
# SHARED-NEXT: lwz 0, -36(12)
118-
119-
# PIE-NEXT: lwz 12, -24(12)
120-
# SHARED-NEXT: lwz 12, -32(12)
121-
# CHECK-NEXT: mtctr 0
122-
# CHECK-NEXT: add 0, 11, 11
123-
# CHECK-NEXT: add 11, 0, 11
124-
# CHECK-NEXT: bctr
119+
# CHECK-NEXT: addis 12, 12, 1
120+
# PIE-NEXT: lwz 0, 192(12)
121+
# SHARED-NEXT: lwz 0, 184(12)
122+
123+
# PIE-NEXT: lwz 12, 196(12)
124+
# SHARED-NEXT: lwz 12, 188(12)
125+
# CHECK-NEXT: mtctr 0
126+
# CHECK-NEXT: add 0, 11, 11
127+
# CHECK-NEXT: add 11, 0, 11
128+
# CHECK-NEXT: bctr
125129

126130
.section .got2,"aw"
127131
.space 65516

lld/test/ELF/ppc32-gnu-ifunc-nonpreemptable.s

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,26 +7,26 @@
77
# RUN: llvm-objdump -d --no-show-raw-insn %t | FileCheck %s
88

99
# RELOC: .rela.dyn {
10-
# RELOC-NEXT: 0x10020004 R_PPC_IRELATIVE - 0x10010000
10+
# RELOC-NEXT: 0x10020108 R_PPC_IRELATIVE - 0x100100E0
1111
# RELOC-NEXT: }
1212

13-
# SYM: 10010020 0 FUNC GLOBAL DEFAULT {{.*}} func
14-
# HEX: 0x10020000 10010020
13+
# SYM: 10010100 0 FUNC GLOBAL DEFAULT {{.*}} func
14+
# HEX: 0x10020104 10010100
1515

1616
.section .got2,"aw"
1717
.long func
1818

1919
# CHECK: func_resolver:
20-
# CHECK-NEXT: 10010000: blr
20+
# CHECK-NEXT: 100100e0: blr
2121
# CHECK: _start:
2222
# CHECK-NEXT: bl .+12
2323
# CHECK-NEXT: lis 9, 4097
24-
# CHECK-NEXT: addi 9, 9, 32
24+
# CHECK-NEXT: addi 9, 9, 256
2525
# CHECK-EMPTY:
2626
# CHECK-NEXT: 00000000.plt_call32.func:
27-
## 10020004 = 65536*4098+4
27+
## 0x10020108 = 65536*4098+264
2828
# CHECK-NEXT: lis 11, 4098
29-
# CHECK-NEXT: lwz 11, 4(11)
29+
# CHECK-NEXT: lwz 11, 264(11)
3030

3131
.text
3232
.globl func

lld/test/ELF/ppc32-gnu-ifunc.s

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@
66
# RUN: llvm-objdump -d --no-show-raw-insn %t | FileCheck %s
77

88
# RELOC: .rela.dyn {
9-
# RELOC-NEXT: 0x10020000 R_PPC_IRELATIVE - 0x10010000
9+
# RELOC-NEXT: 0x10020114 R_PPC_IRELATIVE - 0x100100E0
1010
# RELOC-NEXT: }
1111

1212
# SEC: .rela.dyn RELA 100000d4 0000d4 00000c
13-
# SYM: 10010000 0 FUNC GLOBAL DEFAULT {{.*}} func
13+
# SYM: 100100e0 0 FUNC GLOBAL DEFAULT {{.*}} func
1414

1515
# CHECK: func_resolver:
16-
# CHECK-NEXT: 10010000:
16+
# CHECK-NEXT: 100100e0:
1717
# CHECK: _start:
1818
# CHECK-NEXT: bl .+20
1919
## .rela.plt = 0x100000d4 = 65536*4096+212

lld/test/ELF/ppc32-reloc-got.s

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# REQUIRES: ppc
22
# RUN: llvm-mc -filetype=obj -triple=powerpc %s -o %t.o
33
# RUN: echo '.globl b; b:' | llvm-mc -filetype=obj -triple=powerpc - -o %t1.o
4-
# RUN: ld.lld -shared %t1.o -o %t1.so
4+
# RUN: ld.lld -shared %t1.o -soname=t1.so -o %t1.so
55

66
# RUN: ld.lld %t.o %t1.so -o %t
77
# RUN: llvm-readobj -r %t | FileCheck --check-prefix=RELOC %s
@@ -14,14 +14,14 @@
1414
# SEC: .got PROGBITS 00020068 020068 000014
1515

1616
# RELOC: .rela.dyn {
17-
# RELOC-NEXT: 0x10020078 R_PPC_GLOB_DAT b 0x0
17+
# RELOC-NEXT: 0x1002021C R_PPC_GLOB_DAT b 0x0
1818
# RELOC-NEXT: }
1919

20-
# NM: 10030000 d a
20+
# NM: 10030220 d a
2121

2222
## The GOT slot of a can be filled at link time.
2323
# HEX: section '.got':
24-
# HEX: 0x10020068 {{[0-9a-f]+}} 00000000 00000000 10030000
24+
# HEX: 0x1002020c {{[0-9a-f]+}} 00000000 00000000 10030220
2525

2626
## a: &.got[3] - _GLOBAL_OFFSET_TABLE_ = 12
2727
## b: &.got[4] - _GLOBAL_OFFSET_TABLE_ = 16

0 commit comments

Comments
 (0)