[COFF] Fix crash when emitting symbol tables with GC

When running with linker GC (`-opt:ref`), defined imported symbols that
are referenced but then dropped by GC end up with their `Location`
member being nullptr, which means `getChunk()` returns nullptr for them
and attempting to call `getChunk()->getOutputSection()` causes a crash
from the nullptr dereference. Check for `getChunk()` being nullptr and
bail out early to avoid the crash.

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

llvm-svn: 334548
This commit is contained in:
Shoaib Meenai 2018-06-12 21:19:33 +00:00
parent 04920989a2
commit 02c4344262
2 changed files with 31 additions and 1 deletions

View File

@ -614,7 +614,10 @@ Optional<coff_symbol16> Writer::createSymbol(Defined *Def) {
default: {
// Don't write symbols that won't be written to the output to the symbol
// table.
OutputSection *OS = Def->getChunk()->getOutputSection();
Chunk *C = Def->getChunk();
if (!C)
return None;
OutputSection *OS = C->getOutputSection();
if (!OS)
return None;

27
lld/test/COFF/symtab-gc.s Normal file
View File

@ -0,0 +1,27 @@
# REQUIRES: x86
# RUN: llvm-mc -filetype=obj -triple=x86_64-windows-msvc -o %tobject.obj %S/Inputs/object.s
# RUN: lld-link -dll -entry:f -out:%t.dll -implib:%t.lib %tobject.obj
# RUN: llvm-mc -filetype=obj -triple=x86_64-windows-msvc -o %tmain.obj %s
# RUN: lld-link -entry:main -out:%t.exe -opt:ref -debug:dwarf %tmain.obj %t.lib
# RUN: llvm-readobj -coff-imports %t.exe | FileCheck %s
# CHECK-NOT: Symbol: f
.def main;
.scl 2;
.type 32;
.endef
.section .text,"xr",one_only,main
.globl main
main:
retq
.def stripped;
.scl 3;
.type 32;
.endef
.section .text,"xr",one_only,stripped
stripped:
callq __imp_f
retq