diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp --- a/lld/COFF/Driver.cpp +++ b/lld/COFF/Driver.cpp @@ -2229,8 +2229,23 @@ config->printSymbolOrder = arg->getValue(); // Identify unreferenced COMDAT sections. - if (config->doGC) + if (config->doGC) { + if (config->mingw) { + // markLive doesn't traverse .eh_frame, but the personality function is + // only reached that way. The proper solution would be to make .eh_frame + // into individual COMDAT sections (just like .xdata/.pdata) and have + // markLive traverse them, but until then, just try to include this one + // symbol, if available. + Defined *d = dyn_cast_or_null( + symtab->findUnderscore("__gxx_personality_v0")); + if (d && !d->isGCRoot) { + d->isGCRoot = true; + config->gcroot.push_back(d); + } + } + markLive(symtab->getChunks()); + } // Needs to happen after the last call to addFile(). convertResources(); diff --git a/lld/test/COFF/gc-dwarf-eh.s b/lld/test/COFF/gc-dwarf-eh.s new file mode 100644 --- /dev/null +++ b/lld/test/COFF/gc-dwarf-eh.s @@ -0,0 +1,39 @@ +# REQUIRES: x86 + +# RUN: llvm-mc -triple=i686-windows-gnu %s -filetype=obj -o %t.obj +# RUN: lld-link -lldmingw -lldmap:%t.map -out:%t.exe -opt:ref -entry:main %t.obj -verbose 2>&1 | FileCheck %s +# RUN: FileCheck %s --check-prefix=MAP --input-file=%t.map + +# CHECK: Discarded _unused + +# MAP: In Symbol +# MAP: gc-dwarf-eh.s.tmp.obj:(.text) +# MAP: {{ ___gxx_personality_v0$}} + + .def _main; .scl 2; .type 32; .endef + .section .text,"xr",one_only,_main + .globl _main +_main: + xorl %eax, %eax + ret + + .def ___gxx_personality_v0; .scl 2; .type 32; .endef + .section .text,"xr",one_only,___gxx_personality_v0 + .globl ___gxx_personality_v0 +___gxx_personality_v0: + ret + + .def _unused; .scl 2; .type 32; .endef + .section .text,"xr",one_only,_unused + .globl _unused +_unused: + ret + +# This isn't valid DWARF, but LLD doesn't care. Make up some data that +# references the functions above. +# We need the personality function included, but not all functions referenced +# here. +.section .eh_frame,"r" +.long _main@IMGREL +.long ___gxx_personality_v0@IMGREL +.long _unused@IMGREL