Index: COFF/Writer.cpp =================================================================== --- COFF/Writer.cpp +++ COFF/Writer.cpp @@ -797,7 +797,10 @@ SC->printDiscardedMessage(); continue; } - PartialSection *PSec = createPartialSection(C->getSectionName(), + StringRef Name = C->getSectionName(); + if (Config->MinGW && SC && SC->isCOMDAT()) + Name = Name.split('$').first; + PartialSection *PSec = createPartialSection(Name, C->getOutputCharacteristics()); PSec->Chunks.push_back(C); } Index: test/COFF/eh_frame_suffix_sorting.s =================================================================== --- /dev/null +++ test/COFF/eh_frame_suffix_sorting.s @@ -0,0 +1,39 @@ +# REQUIRES: x86 + +# RUN: llvm-mc -triple=i686-windows-gnu %s -filetype=obj -o %t.main.o +# RUN: llvm-mc -filetype=obj -triple=i686-windows-gnu \ +# RUN: %p/Inputs/eh_frame_terminator-crtend.s -o %t.crtend.o + +# RUN: lld-link -lldmingw -entry:main %t.main.o %t.crtend.o -out:%t.exe +# RUN: llvm-objdump -s %t.exe | FileCheck %s + +# Check that the contents of .eh_frame$foo was placed before .eh_frame from +# crtend.o, even if the former had a section name suffix. + +# CHECK: Contents of section .eh_fram: +# CHECK: 403000 4203 + + .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