summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFangrui Song <maskray@google.com>2020-01-22 23:26:49 -0800
committerFangrui Song <maskray@google.com>2020-01-24 09:06:52 -0800
commit425d15aeb13e2f60867654dd1abab515447a71ec (patch)
tree635d85cfe05d2f9dab4b0f1c420326071c18c165
parent901a7890c0e65060511c43d55fc347a1a5cb54ff (diff)
downloadbcm5719-llvm-425d15aeb13e2f60867654dd1abab515447a71ec.tar.gz
bcm5719-llvm-425d15aeb13e2f60867654dd1abab515447a71ec.zip
[ELF][PowerPC] Support R_PPC_COPY and R_PPC64_COPY
Reviewed By: Bdragon28, jhenderson, grimar, sfertile Differential Revision: https://reviews.llvm.org/D73255 (cherry picked from commit f1dab29908d25a4044abff6ffc120c48b20f034d)
-rw-r--r--lld/ELF/Arch/PPC.cpp1
-rw-r--r--lld/ELF/Arch/PPC64.cpp1
-rw-r--r--lld/test/ELF/ppc-reloc-copy.s29
-rw-r--r--llvm/include/llvm/BinaryFormat/ELFRelocs/PowerPC64.def2
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-ppc64.test3
5 files changed, 36 insertions, 0 deletions
diff --git a/lld/ELF/Arch/PPC.cpp b/lld/ELF/Arch/PPC.cpp
index 3c0b0c290b5..1d4e80184dc 100644
--- a/lld/ELF/Arch/PPC.cpp
+++ b/lld/ELF/Arch/PPC.cpp
@@ -136,6 +136,7 @@ void writePPC32GlinkSection(uint8_t *buf, size_t numEntries) {
}
PPC::PPC() {
+ copyRel = R_PPC_COPY;
gotRel = R_PPC_GLOB_DAT;
noneRel = R_PPC_NONE;
pltRel = R_PPC_JMP_SLOT;
diff --git a/lld/ELF/Arch/PPC64.cpp b/lld/ELF/Arch/PPC64.cpp
index da77a4ddadd..e48a184c9db 100644
--- a/lld/ELF/Arch/PPC64.cpp
+++ b/lld/ELF/Arch/PPC64.cpp
@@ -293,6 +293,7 @@ static uint32_t readFromHalf16(const uint8_t *loc) {
}
PPC64::PPC64() {
+ copyRel = R_PPC64_COPY;
gotRel = R_PPC64_GLOB_DAT;
noneRel = R_PPC64_NONE;
pltRel = R_PPC64_JMP_SLOT;
diff --git a/lld/test/ELF/ppc-reloc-copy.s b/lld/test/ELF/ppc-reloc-copy.s
new file mode 100644
index 00000000000..1f169e40d37
--- /dev/null
+++ b/lld/test/ELF/ppc-reloc-copy.s
@@ -0,0 +1,29 @@
+# REQUIRES: ppc
+# RUN: llvm-mc -filetype=obj -triple=powerpc %p/Inputs/relocation-copy.s -o %t1.32.o
+# RUN: ld.lld -shared %t1.32.o -soname=so -o %t1.32.so
+# RUN: llvm-mc -filetype=obj -triple=powerpc %s -o %t.32.o
+# RUN: ld.lld %t.32.o %t1.32.so -o %t.32
+# RUN: llvm-readobj -r %t.32 | FileCheck --check-prefix=REL32 %s
+# RUN: llvm-nm -S %t.32 | FileCheck --check-prefix=NM32 %s
+
+# RUN: llvm-mc -filetype=obj -triple=powerpc64 %p/Inputs/relocation-copy.s -o %t1.64.o
+# RUN: ld.lld -shared %t1.64.o -soname=so -o %t1.64.so
+# RUN: llvm-mc -filetype=obj -triple=powerpc64 %s -o %t.64.o
+# RUN: ld.lld %t.64.o %t1.64.so -o %t.64
+# RUN: llvm-readobj -r %t.64 | FileCheck --check-prefix=REL64 %s
+# RUN: llvm-nm -S %t.64 | FileCheck --check-prefix=NM64 %s
+
+# REL32: .rela.dyn {
+# REL32-NEXT: 0x10030210 R_PPC_COPY x 0x0
+# REL32-NEXT: }
+
+# NM32: 10030210 00000004 B x
+
+# REL64: .rela.dyn {
+# REL64-NEXT: 0x10030350 R_PPC64_COPY x 0x0
+# REL64-NEXT: }
+
+# NM64: 0000000010030350 0000000000000004 B x
+
+lis 3, x@ha
+lwz 3, x@l(3)
diff --git a/llvm/include/llvm/BinaryFormat/ELFRelocs/PowerPC64.def b/llvm/include/llvm/BinaryFormat/ELFRelocs/PowerPC64.def
index 8c5b482f051..719d0c9c36a 100644
--- a/llvm/include/llvm/BinaryFormat/ELFRelocs/PowerPC64.def
+++ b/llvm/include/llvm/BinaryFormat/ELFRelocs/PowerPC64.def
@@ -26,6 +26,7 @@
#undef R_PPC64_GOT16_LO
#undef R_PPC64_GOT16_HI
#undef R_PPC64_GOT16_HA
+#undef R_PPC64_COPY
#undef R_PPC64_GLOB_DAT
#undef R_PPC64_JMP_SLOT
#undef R_PPC64_RELATIVE
@@ -119,6 +120,7 @@ ELF_RELOC(R_PPC64_GOT16, 14)
ELF_RELOC(R_PPC64_GOT16_LO, 15)
ELF_RELOC(R_PPC64_GOT16_HI, 16)
ELF_RELOC(R_PPC64_GOT16_HA, 17)
+ELF_RELOC(R_PPC64_COPY, 19)
ELF_RELOC(R_PPC64_GLOB_DAT, 20)
ELF_RELOC(R_PPC64_JMP_SLOT, 21)
ELF_RELOC(R_PPC64_RELATIVE, 22)
diff --git a/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-ppc64.test b/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-ppc64.test
index 7e081b7e4e2..3a00dafb736 100644
--- a/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-ppc64.test
+++ b/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-ppc64.test
@@ -22,6 +22,7 @@
# CHECK: Type: R_PPC64_GOT16_LO (15)
# CHECK: Type: R_PPC64_GOT16_HI (16)
# CHECK: Type: R_PPC64_GOT16_HA (17)
+# CHECK: Type: R_PPC64_COPY (19)
# CHECK: Type: R_PPC64_GLOB_DAT (20)
# CHECK: Type: R_PPC64_JMP_SLOT (21)
# CHECK: Type: R_PPC64_RELATIVE (22)
@@ -144,6 +145,8 @@ Sections:
- Offset: 0x0000000000000000
Type: R_PPC64_GOT16_HA
- Offset: 0x0000000000000000
+ Type: R_PPC64_COPY
+ - Offset: 0x0000000000000000
Type: R_PPC64_GLOB_DAT
- Offset: 0x0000000000000000
Type: R_PPC64_JMP_SLOT
OpenPOWER on IntegriCloud