diff options
-rw-r--r-- | include/llvm/MC/MCAssembler.h | 4 | ||||
-rw-r--r-- | lib/MC/WinCOFFObjectWriter.cpp | 5 | ||||
-rw-r--r-- | test/MC/COFF/secidx-diagnostic.s | 8 |
3 files changed, 17 insertions, 0 deletions
diff --git a/include/llvm/MC/MCAssembler.h b/include/llvm/MC/MCAssembler.h index e1cf66d3f9..0d12a5d5c8 100644 --- a/include/llvm/MC/MCAssembler.h +++ b/include/llvm/MC/MCAssembler.h @@ -1153,6 +1153,10 @@ public: return *Entry; } + bool hasSymbolData(const MCSymbol &Symbol) const { + return SymbolMap.lookup(&Symbol) != 0; + } + MCSymbolData &getSymbolData(const MCSymbol &Symbol) const { MCSymbolData *Entry = SymbolMap.lookup(&Symbol); assert(Entry && "Missing symbol data!"); diff --git a/lib/MC/WinCOFFObjectWriter.cpp b/lib/MC/WinCOFFObjectWriter.cpp index ed19b7ec69..b68e69f2eb 100644 --- a/lib/MC/WinCOFFObjectWriter.cpp +++ b/lib/MC/WinCOFFObjectWriter.cpp @@ -636,6 +636,11 @@ void WinCOFFObjectWriter::RecordRelocation(const MCAssembler &Asm, const MCSymbol &Symbol = Target.getSymA()->getSymbol(); const MCSymbol &A = Symbol.AliasedSymbol(); + if (!Asm.hasSymbolData(A)) + Asm.getContext().FatalError( + Fixup.getLoc(), + Twine("symbol '") + A.getName() + "' can not be undefined"); + MCSymbolData &A_SD = Asm.getSymbolData(A); MCSectionData const *SectionData = Fragment->getParent(); diff --git a/test/MC/COFF/secidx-diagnostic.s b/test/MC/COFF/secidx-diagnostic.s new file mode 100644 index 0000000000..3e496c3fd4 --- /dev/null +++ b/test/MC/COFF/secidx-diagnostic.s @@ -0,0 +1,8 @@ +// RUN: not llvm-mc -filetype=obj -triple i686-pc-win32 %s 2>%t +// RUN: FileCheck %s < %t + +// CHECK: symbol 'bar' can not be undefined + +.data +foo: + .secidx bar |