[PATCH] D72899: [MC] Drop SHF_LINK_ORDER and set sh_link to 0 if the associated symbol is undefined
Fangrui Song via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Jan 16 23:40:23 PST 2020
MaskRay created this revision.
MaskRay added reviewers: eugenis, grimar, lebedev.ri, pcc, peter.smith.
Herald added subscribers: llvm-commits, dexonsmith, hiraditya, mehdi_amini.
Herald added a project: LLVM.
Part of https://bugs.llvm.org/show_bug.cgi?id=41734
LTO can drop externally available definitions. Such AssociatedSymbol is
not associated with a symbol. ELFWriter::writeSection() will assert.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D72899
Files:
llvm/lib/MC/ELFObjectWriter.cpp
llvm/test/CodeGen/X86/elf-associated-discarded.ll
Index: llvm/test/CodeGen/X86/elf-associated-discarded.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/X86/elf-associated-discarded.ll
@@ -0,0 +1,23 @@
+;; Test that we drop SHF_LINK_ORDER and reset sh_link to 0 if the associated
+;; symbol is not defined.
+; RUN: llc -mtriple=x86_64 -data-sections=1 < %s | FileCheck %s
+; RUN: llc -filetype=obj -mtriple=x86_64 -data-sections=1 < %s | llvm-readelf -S | FileCheck --check-prefix=SEC %s
+
+;; FIXME The assembly output cannot be assembled because foo is not defined.
+;; This is difficult to fix because we allow loops (see elf-associated.ll
+;; .data.c and .data.d).
+; CHECK: .section .data.a,"awo", at progbits,foo
+; CHECK: .section .data.b,"awo", at progbits,foo
+
+;; No 'L' (SHF_LINK_ORDER). sh_link=0.
+; SEC; Name {{.*}} Flg Lk Inf
+; SEC: .data.a {{.*}} WA 0 0
+; SEC: .data.b {{.*}} WA 0 0
+
+;; The definition may be discarded by LTO.
+declare void @foo()
+
+ at a = global i32 1, !associated !0
+ at b = global i32 1, !associated !0
+
+!0 = !{void ()* @foo}
Index: llvm/lib/MC/ELFObjectWriter.cpp
===================================================================
--- llvm/lib/MC/ELFObjectWriter.cpp
+++ llvm/lib/MC/ELFObjectWriter.cpp
@@ -1023,16 +1023,20 @@
break;
}
- if (Section.getFlags() & ELF::SHF_LINK_ORDER) {
+ unsigned Flags = Section.getFlags();
+ if (Flags & ELF::SHF_LINK_ORDER) {
const MCSymbol *Sym = Section.getAssociatedSymbol();
- const MCSectionELF *Sec = cast<MCSectionELF>(&Sym->getSection());
- sh_link = SectionIndexMap.lookup(Sec);
+ if (Sym->isInSection()) {
+ const MCSectionELF *Sec = cast<MCSectionELF>(&Sym->getSection());
+ sh_link = SectionIndexMap.lookup(Sec);
+ } else {
+ Flags &= ~ELF::SHF_LINK_ORDER;
+ }
}
WriteSecHdrEntry(StrTabBuilder.getOffset(Section.getSectionName()),
- Section.getType(), Section.getFlags(), 0, Offset, Size,
- sh_link, sh_info, Section.getAlignment(),
- Section.getEntrySize());
+ Section.getType(), Flags, 0, Offset, Size, sh_link, sh_info,
+ Section.getAlignment(), Section.getEntrySize());
}
void ELFWriter::writeSectionHeader(
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D72899.238699.patch
Type: text/x-patch
Size: 2265 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200117/550c6e4f/attachment.bin>
More information about the llvm-commits
mailing list