[COFF] Handle .eh_frame$symbol as associative comdat for MinGW

This matches how it is done for .xdata and .pdata already.

On i386, the symbol name in the section name suffix does not contain
the extra underscore prefix.

This is one part of a fix for PR42217.

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

git-svn-id: https://llvm.org/svn/llvm-project/lld/trunk@363456 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/COFF/InputFiles.cpp b/COFF/InputFiles.cpp
index 538a36e..ebf6e44 100644
--- a/COFF/InputFiles.cpp
+++ b/COFF/InputFiles.cpp
@@ -288,6 +288,8 @@
   if (SC && SC->getOutputCharacteristics() & IMAGE_SCN_MEM_EXECUTE) {
     StringRef Name;
     COFFObj->getSymbolName(Sym, Name);
+    if (getMachineType() == I386)
+      Name.consume_front("_");
     PrevailingSectionMap[Name] = SectionNumber;
   }
 }
@@ -297,9 +299,10 @@
     const DenseMap<StringRef, uint32_t> &PrevailingSectionMap) {
   StringRef Name;
   COFFObj->getSymbolName(Sym, Name);
-  if (Name.consume_front(".pdata$") || Name.consume_front(".xdata$")) {
-    // For MinGW, treat .[px]data$<func> as implicitly associative to
-    // the symbol <func>.
+  if (Name.consume_front(".pdata$") || Name.consume_front(".xdata$") ||
+      Name.consume_front(".eh_frame$")) {
+    // For MinGW, treat .[px]data$<func> and .eh_frame$<func> as implicitly
+    // associative to the symbol <func>.
     auto ParentSym = PrevailingSectionMap.find(Name);
     if (ParentSym != PrevailingSectionMap.end())
       readAssociativeDefinition(Sym, Def, ParentSym->second);
diff --git a/test/COFF/associative-comdat-mingw-i386.s b/test/COFF/associative-comdat-mingw-i386.s
new file mode 100644
index 0000000..3f5e023
--- /dev/null
+++ b/test/COFF/associative-comdat-mingw-i386.s
@@ -0,0 +1,37 @@
+# REQUIRES: x86
+
+# RUN: llvm-mc -triple=i686-windows-gnu %s -filetype=obj -o %t.obj
+
+# RUN: lld-link -lldmingw -entry:main %t.obj -out:%t.exe
+# RUN: llvm-objdump -s %t.exe | FileCheck %s
+
+# Check that the .eh_frame comdat was included, even if it had no symbols,
+# due to associativity with the symbol _foo.
+
+# CHECK: Contents of section .eh_fram:
+# CHECK:  403000 42
+
+        .text
+        .def            _main;
+        .scl            2;
+        .type           32;
+        .endef
+        .globl          _main
+        .p2align        4, 0x90
+_main:
+        call            _foo
+        ret
+
+        .section        .eh_frame$foo,"dr"
+        .linkonce       discard
+        .byte           0x42
+
+        .def            _foo;
+        .scl            2;
+        .type           32;
+        .endef
+        .section        .text$foo,"xr",discard,foo
+        .globl          _foo
+        .p2align        4
+_foo:
+        ret