diff options
author | David Majnemer <david.majnemer@gmail.com> | 2014-01-06 07:39:46 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2014-01-06 07:39:46 +0000 |
commit | ba7548302b23b1dd8ce4e6fa941c143fda49fe5e (patch) | |
tree | 0be2f151ed846f7e58676b91110587e696e33f66 /lib/MC/WinCOFFObjectWriter.cpp | |
parent | c8fd2c57c8fe8f382dbd43abebb26a6e0fdbd83f (diff) | |
download | llvm-ba7548302b23b1dd8ce4e6fa941c143fda49fe5e.tar.gz llvm-ba7548302b23b1dd8ce4e6fa941c143fda49fe5e.tar.bz2 llvm-ba7548302b23b1dd8ce4e6fa941c143fda49fe5e.tar.xz |
MC: Fatally error if subtraction operand is bad
Instead of crashing, raise an error when a subtraction expression
involves an undefined symbol.
This fixes PR18375.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@198590 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/MC/WinCOFFObjectWriter.cpp')
-rw-r--r-- | lib/MC/WinCOFFObjectWriter.cpp | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/lib/MC/WinCOFFObjectWriter.cpp b/lib/MC/WinCOFFObjectWriter.cpp index 6d270209b7..ed19b7ec69 100644 --- a/lib/MC/WinCOFFObjectWriter.cpp +++ b/lib/MC/WinCOFFObjectWriter.cpp @@ -648,14 +648,25 @@ void WinCOFFObjectWriter::RecordRelocation(const MCAssembler &Asm, COFFSection *coff_section = SectionMap[&SectionData->getSection()]; COFFSymbol *coff_symbol = SymbolMap[&A_SD.getSymbol()]; - const MCSymbolRefExpr *SymA = Target.getSymA(); const MCSymbolRefExpr *SymB = Target.getSymB(); - const bool CrossSection = SymB && - &SymA->getSymbol().getSection() != &SymB->getSymbol().getSection(); + bool CrossSection = false; - if (Target.getSymB()) { - const MCSymbol *B = &Target.getSymB()->getSymbol(); + if (SymB) { + const MCSymbol *B = &SymB->getSymbol(); MCSymbolData &B_SD = Asm.getSymbolData(*B); + if (!B_SD.getFragment()) + Asm.getContext().FatalError( + Fixup.getLoc(), + Twine("symbol '") + B->getName() + + "' can not be undefined in a subtraction expression"); + + if (!A_SD.getFragment()) + Asm.getContext().FatalError( + Fixup.getLoc(), + Twine("symbol '") + Symbol.getName() + + "' can not be undefined in a subtraction expression"); + + CrossSection = &Symbol.getSection() != &B->getSection(); // Offset of the symbol in the section int64_t a = Layout.getSymbolOffset(&B_SD); |