[MC][ARM] Don't create multiple .ARM.exidx associated to one .text
authorFangrui Song <maskray@google.com>
Tue, 25 Feb 2020 01:54:39 +0000 (17:54 -0800)
committerFangrui Song <maskray@google.com>
Wed, 26 Feb 2020 02:18:13 +0000 (18:18 -0800)
Fixed an issue exposed by D74006.

In clang cc1as, MCContext::UseNamesOnTempLabels is true.
When parsing a .fnstart directive, FnStart gets redefined to a temporary symbol of a different name (.Ltmp0, .Ltmp1, ...).
MCContext::getELFSection() called by SwitchToEHSection() will create a different .ARM.exidx each time.

llvm-mc uses `Ctx.setUseNamesOnTempLabels(false);` and FnStart is unnamed.
MCContext::getELFSection() called by SwitchToEHSection() will reuse the same .ARM.exidx .

Reviewed By: efriedma

Differential Revision: https://reviews.llvm.org/D75095

llvm/lib/MC/MCContext.cpp
llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp

index 6cda18adb8818900043b616145c6daa35d1cbc61..524ef44d1863c8b951bf03e9e5c200b3b3b5a5fe 100644 (file)
@@ -405,6 +405,7 @@ MCSectionELF *MCContext::getELFSection(const Twine &Section, unsigned Type,
   StringRef Group = "";
   if (GroupSym)
     Group = GroupSym->getName();
+  assert(!(LinkedToSym && LinkedToSym->getName().empty()));
   // Do the lookup, if we have a hit, return it.
   auto IterBool = ELFUniquingMap.insert(std::make_pair(
       ELFSectionKey{Section.str(), Group,
index b13188ad9a5ecc966325b9eb907d34aa0204ffe7..ef9804ab63a573c4c841118d48300fff3aa6a666 100644 (file)
@@ -1201,7 +1201,7 @@ inline void ARMELFStreamer::SwitchToEHSection(StringRef Prefix,
     Flags |= ELF::SHF_GROUP;
   MCSectionELF *EHSection = getContext().getELFSection(
       EHSecName, Type, Flags, 0, Group, FnSection.getUniqueID(),
-      static_cast<const MCSymbolELF *>(&Fn));
+      static_cast<const MCSymbolELF *>(FnSection.getBeginSymbol()));
 
   assert(EHSection && "Failed to get the required EH section");