diff options
Diffstat (limited to 'lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp')
| -rw-r--r-- | lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp | 63 |
1 files changed, 17 insertions, 46 deletions
diff --git a/lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp b/lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp index 55151c2b8d21..1021cdeeb3be 100644 --- a/lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp +++ b/lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp @@ -306,39 +306,24 @@ void AArch64MachObjectWriter::recordRelocation( bool CanUseLocalRelocation = canUseLocalRelocation(Section, *Symbol, Log2Size); if (Symbol->isTemporary() && (Value || !CanUseLocalRelocation)) { + // Make sure that the symbol is actually in a section here. If it isn't, + // emit an error and exit. + if (!Symbol->isInSection()) { + Asm.getContext().reportError( + Fixup.getLoc(), + "unsupported relocation of local symbol '" + Symbol->getName() + + "'. Must have non-local symbol earlier in section."); + return; + } const MCSection &Sec = Symbol->getSection(); if (!Asm.getContext().getAsmInfo()->isSectionAtomizableBySymbols(Sec)) Symbol->setUsedInReloc(); } const MCSymbol *Base = Asm.getAtom(*Symbol); - - // If the symbol is a variable and we weren't able to get a Base for it - // (i.e., it's not in the symbol table associated with a section) resolve - // the relocation based its expansion instead. - if (Symbol->isVariable() && !Base) { - // If the evaluation is an absolute value, just use that directly - // to keep things easy. - int64_t Res; - if (Symbol->getVariableValue()->evaluateAsAbsolute( - Res, Layout, Writer->getSectionAddressMap())) { - FixedValue = Res; - return; - } - - // FIXME: Will the Target we already have ever have any data in it - // we need to preserve and merge with the new Target? How about - // the FixedValue? - if (!Symbol->getVariableValue()->evaluateAsRelocatable(Target, &Layout, - &Fixup)) { - Asm.getContext().reportError(Fixup.getLoc(), - "unable to resolve variable '" + - Symbol->getName() + "'"); - return; - } - return recordRelocation(Writer, Asm, Layout, Fragment, Fixup, Target, - FixedValue); - } + // If the symbol is a variable it can either be in a section and + // we have a base or it is absolute and should have been expanded. + assert(!Symbol->isVariable() || Base); // Relocations inside debug sections always use local relocations when // possible. This seems to be done because the debugger doesn't fully @@ -377,19 +362,8 @@ void AArch64MachObjectWriter::recordRelocation( Value -= Writer->getFragmentAddress(Fragment, Layout) + Fixup.getOffset() + (1ULL << Log2Size); } else { - // Resolve constant variables. - if (Symbol->isVariable()) { - int64_t Res; - if (Symbol->getVariableValue()->evaluateAsAbsolute( - Res, Layout, Writer->getSectionAddressMap())) { - FixedValue = Res; - return; - } - } - Asm.getContext().reportError(Fixup.getLoc(), - "unsupported relocation of variable '" + - Symbol->getName() + "'"); - return; + llvm_unreachable( + "This constant variable should have been expanded during evaluation"); } } @@ -430,10 +404,7 @@ void AArch64MachObjectWriter::recordRelocation( Writer->addRelocation(RelSymbol, Fragment->getParent(), MRE); } -std::unique_ptr<MCObjectWriter> -llvm::createAArch64MachObjectWriter(raw_pwrite_stream &OS, uint32_t CPUType, - uint32_t CPUSubtype) { - return createMachObjectWriter( - llvm::make_unique<AArch64MachObjectWriter>(CPUType, CPUSubtype), OS, - /*IsLittleEndian=*/true); +std::unique_ptr<MCObjectTargetWriter> +llvm::createAArch64MachObjectWriter(uint32_t CPUType, uint32_t CPUSubtype) { + return llvm::make_unique<AArch64MachObjectWriter>(CPUType, CPUSubtype); } |
