forked from OSchip/llvm-project
[ELF][PPC32] Don't report "relocation refers to a discarded section" for .got2
Similar to D63182 [ELF][PPC64] Don't report "relocation refers to a discarded section" for .toc Reviewed By: Bdragon28 Differential Revision: https://reviews.llvm.org/D75419
This commit is contained in:
parent
bfdb834bc3
commit
315f8a55f5
|
@ -438,11 +438,12 @@ void InputSection::copyRelocations(uint8_t *buf, ArrayRef<RelTy> rels) {
|
||||||
// hopefully creates a frame that is ignored at runtime. Also, don't warn
|
// hopefully creates a frame that is ignored at runtime. Also, don't warn
|
||||||
// on .gcc_except_table and debug sections.
|
// 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);
|
auto *d = dyn_cast<Defined>(&sym);
|
||||||
if (!d) {
|
if (!d) {
|
||||||
if (!isDebugSection(*sec) && sec->name != ".eh_frame" &&
|
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;
|
uint32_t secIdx = cast<Undefined>(sym).discardedSecIdx;
|
||||||
Elf_Shdr_Impl<ELFT> sec =
|
Elf_Shdr_Impl<ELFT> sec =
|
||||||
CHECK(file->getObj().sections(), file)[secIdx];
|
CHECK(file->getObj().sections(), file)[secIdx];
|
||||||
|
|
|
@ -946,8 +946,12 @@ static bool maybeReportUndefined(Symbol &sym, InputSectionBase &sec,
|
||||||
// .toc and the .rela.toc are incorrectly not placed in the comdat. The ELF
|
// .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
|
// spec says references from outside the group to a STB_LOCAL symbol are not
|
||||||
// allowed. Work around the bug.
|
// 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;
|
return false;
|
||||||
|
|
||||||
bool isWarning =
|
bool isWarning =
|
||||||
|
|
|
@ -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",@progbits,foo,comdat
|
||||||
|
.globl foo
|
||||||
|
foo:
|
||||||
|
lwz 3, .LC0-.LTOC(30)
|
||||||
|
.L0:
|
||||||
|
|
||||||
|
.section .got2,"aw",@progbits
|
||||||
|
.set .LTOC, .got2+32768
|
||||||
|
.LC0:
|
||||||
|
.long .L0
|
Loading…
Reference in New Issue