[PATCH] D75419: [ELF][PPC32] Don't report "relocation refers to a discarded section" for .got2
Fangrui Song via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Sun Mar 1 19:57:44 PST 2020
This revision was automatically updated to reflect the committed changes.
Closed by commit rG315f8a55f504: [ELF][PPC32] Don't report "relocation refers to a discarded section" for .got2 (authored by MaskRay).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D75419/new/
https://reviews.llvm.org/D75419
Files:
lld/ELF/InputSection.cpp
lld/ELF/Relocations.cpp
lld/test/ELF/comdat-discarded-ppc32.s
Index: lld/test/ELF/comdat-discarded-ppc32.s
===================================================================
--- /dev/null
+++ lld/test/ELF/comdat-discarded-ppc32.s
@@ -0,0 +1,21 @@
+# REQUIRES: ppc
+# RUN: llvm-mc -filetype=obj -triple=powerpc %s -o %t.o
+# RUN: ld.lld %t.o %t.o -o /dev/null
+# RUN: ld.lld -r --fatal-warnings %t.o %t.o -o /dev/null
+
+## Similar to PPC64, clang/gcc PPC32 may emit a .rela.got2 which references a local symbol
+## defined in a discarded .rodata section. Unfortunately, .got2 cannot be placed in a comdat
+## because for lwz 3, .LC0-.LTOC(30), we cannot define .LC0 in a different .got2 section.
+
+## Don't error "relocation refers to a discarded section".
+
+.section .text.foo,"axG", at progbits,foo,comdat
+.globl foo
+foo:
+ lwz 3, .LC0-.LTOC(30)
+.L0:
+
+.section .got2,"aw", at progbits
+.set .LTOC, .got2+32768
+.LC0:
+.long .L0
Index: lld/ELF/Relocations.cpp
===================================================================
--- lld/ELF/Relocations.cpp
+++ lld/ELF/Relocations.cpp
@@ -946,8 +946,12 @@
// .toc and the .rela.toc are incorrectly not placed in the comdat. The ELF
// spec says references from outside the group to a STB_LOCAL symbol are not
// allowed. Work around the bug.
- if (config->emachine == EM_PPC64 &&
- cast<Undefined>(sym).discardedSecIdx != 0 && sec.name == ".toc")
+ //
+ // PPC32 .got2 is similar but cannot be fixed. Multiple .got2 is infeasible
+ // because .LC0-.LTOC is not representable if the two labels are in different
+ // .got2
+ if (cast<Undefined>(sym).discardedSecIdx != 0 &&
+ (sec.name == ".got2" || sec.name == ".toc"))
return false;
bool isWarning =
Index: lld/ELF/InputSection.cpp
===================================================================
--- lld/ELF/InputSection.cpp
+++ lld/ELF/InputSection.cpp
@@ -438,11 +438,12 @@
// hopefully creates a frame that is ignored at runtime. Also, don't warn
// on .gcc_except_table and debug sections.
//
- // See the comment in maybeReportUndefined for PPC64 .toc .
+ // See the comment in maybeReportUndefined for PPC32 .got2 and PPC64 .toc
auto *d = dyn_cast<Defined>(&sym);
if (!d) {
if (!isDebugSection(*sec) && sec->name != ".eh_frame" &&
- sec->name != ".gcc_except_table" && sec->name != ".toc") {
+ sec->name != ".gcc_except_table" && sec->name != ".got2" &&
+ sec->name != ".toc") {
uint32_t secIdx = cast<Undefined>(sym).discardedSecIdx;
Elf_Shdr_Impl<ELFT> sec =
CHECK(file->getObj().sections(), file)[secIdx];
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D75419.247544.patch
Type: text/x-patch
Size: 2618 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200302/40cc1e4c/attachment.bin>
More information about the llvm-commits
mailing list