Skip to content

Commit

Permalink
[COFF] Handle .eh_frame$symbol as associative comdat for MinGW
Browse files Browse the repository at this point in the history
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

llvm-svn: 363456
  • Loading branch information
mstorsjo committed Jun 14, 2019
1 parent 9e5fa33 commit c3b1d73
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 3 deletions.
9 changes: 6 additions & 3 deletions lld/COFF/InputFiles.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -288,6 +288,8 @@ void ObjFile::recordPrevailingSymbolForMingw(
if (SC && SC->getOutputCharacteristics() & IMAGE_SCN_MEM_EXECUTE) {
StringRef Name;
COFFObj->getSymbolName(Sym, Name);
if (getMachineType() == I386)
Name.consume_front("_");
PrevailingSectionMap[Name] = SectionNumber;
}
}
Expand All @@ -297,9 +299,10 @@ void ObjFile::maybeAssociateSEHForMingw(
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);
Expand Down
37 changes: 37 additions & 0 deletions lld/test/COFF/associative-comdat-mingw-i386.s
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit c3b1d73

Please sign in to comment.