diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/include/llvm/MC/MCAssembler.h | 4 | ||||
| -rw-r--r-- | llvm/lib/MC/WinCOFFObjectWriter.cpp | 5 | ||||
| -rw-r--r-- | llvm/test/MC/COFF/secidx-diagnostic.s | 8 |
3 files changed, 17 insertions, 0 deletions
diff --git a/llvm/include/llvm/MC/MCAssembler.h b/llvm/include/llvm/MC/MCAssembler.h index e1cf66d3f9e..0d12a5d5c8d 100644 --- a/llvm/include/llvm/MC/MCAssembler.h +++ b/llvm/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/llvm/lib/MC/WinCOFFObjectWriter.cpp b/llvm/lib/MC/WinCOFFObjectWriter.cpp index ed19b7ec69d..b68e69f2eb3 100644 --- a/llvm/lib/MC/WinCOFFObjectWriter.cpp +++ b/llvm/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/llvm/test/MC/COFF/secidx-diagnostic.s b/llvm/test/MC/COFF/secidx-diagnostic.s new file mode 100644 index 00000000000..3e496c3fd45 --- /dev/null +++ b/llvm/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 |

