diff --git a/lld/COFF/SymbolTable.cpp b/lld/COFF/SymbolTable.cpp --- a/lld/COFF/SymbolTable.cpp +++ b/lld/COFF/SymbolTable.cpp @@ -545,6 +545,8 @@ static std::string getSourceLocation(InputFile *file, SectionChunk *sc, uint32_t offset, StringRef name) { + if (!file) + return ""; if (auto *o = dyn_cast(file)) return getSourceLocationObj(o, sc, offset, name); if (auto *b = dyn_cast(file)) @@ -566,7 +568,7 @@ llvm::raw_string_ostream os(msg); os << "duplicate symbol: " << toString(*existing); - DefinedRegular *d = cast(existing); + DefinedRegular *d = dyn_cast(existing); if (d && isa(d->getFile())) { os << getSourceLocation(d->getFile(), d->getChunk(), d->getValue(), existing->getName()); diff --git a/lld/test/COFF/duplicate-absolute.s b/lld/test/COFF/duplicate-absolute.s new file mode 100644 --- /dev/null +++ b/lld/test/COFF/duplicate-absolute.s @@ -0,0 +1,14 @@ +// REQUIRES: x86 +// RUN: llvm-mc -triple x86_64-windows-msvc -filetype obj -o %t.obj %s +// RUN: echo -e ".globl myabsolute\nmyabsolute = 0" > %t.dupl.s +// RUN: llvm-mc -triple x86_64-windows-msvc -filetype obj -o %t.dupl.obj %t.dupl.s +// RUN: not lld-link /out:%t.exe %t.obj %t.dupl.obj 2>&1 | FileCheck %s + +// CHECK: error: duplicate symbol: myabsolute + +.globl myabsolute +myabsolute = 0 + +.globl entry +entry: + ret