[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