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
This commit is contained in:
David Majnemer 2014-01-06 07:39:46 +00:00
parent c8fd2c57c8
commit ba7548302b
2 changed files with 22 additions and 5 deletions

View File

@ -720,6 +720,12 @@ void ELFObjectWriter::RecordRelocation(const MCAssembler &Asm,
MCSymbolData &SDB = Asm.getSymbolData(SymbolB); MCSymbolData &SDB = Asm.getSymbolData(SymbolB);
IsPCRel = true; IsPCRel = true;
if (!SDB.getFragment())
Asm.getContext().FatalError(
Fixup.getLoc(),
Twine("symbol '") + SymbolB.getName() +
"' can not be undefined in a subtraction expression");
// Offset of the symbol in the section // Offset of the symbol in the section
int64_t a = Layout.getSymbolOffset(&SDB); int64_t a = Layout.getSymbolOffset(&SDB);

View File

@ -648,14 +648,25 @@ void WinCOFFObjectWriter::RecordRelocation(const MCAssembler &Asm,
COFFSection *coff_section = SectionMap[&SectionData->getSection()]; COFFSection *coff_section = SectionMap[&SectionData->getSection()];
COFFSymbol *coff_symbol = SymbolMap[&A_SD.getSymbol()]; COFFSymbol *coff_symbol = SymbolMap[&A_SD.getSymbol()];
const MCSymbolRefExpr *SymA = Target.getSymA();
const MCSymbolRefExpr *SymB = Target.getSymB(); const MCSymbolRefExpr *SymB = Target.getSymB();
const bool CrossSection = SymB && bool CrossSection = false;
&SymA->getSymbol().getSection() != &SymB->getSymbol().getSection();
if (Target.getSymB()) { if (SymB) {
const MCSymbol *B = &Target.getSymB()->getSymbol(); const MCSymbol *B = &SymB->getSymbol();
MCSymbolData &B_SD = Asm.getSymbolData(*B); 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 // Offset of the symbol in the section
int64_t a = Layout.getSymbolOffset(&B_SD); int64_t a = Layout.getSymbolOffset(&B_SD);