[llvm] r253328 - [Assembler] Make fatal assembler errors non-fatal

Manuel Klimek via llvm-commits llvm-commits at lists.llvm.org
Wed Nov 18 07:20:08 PST 2015


Apparently this just uncovered a latent bug. Sent
http://reviews.llvm.org/D14776 for review.

On Wed, Nov 18, 2015 at 2:08 PM Manuel Klimek <klimek at google.com> wrote:

> Note: this change lands us in this assert in
> est/MC/COFF/secidx-diagnostic.s:
>
> lib/MC/WinCOFFObjectWriter.cpp:1065: virtual void (anonymous
> namespace)::WinCOFFObjectWriter::writeObject(llvm::MCAssembler &, const
> llvm::MCAsmLayout &): Assertion `getStream().tell() <=
> (*i)->Header.PointerToRawData && "Section::PointerToRawData is insane!"'
> failed.
>
> Some of the time; I'm currently trying to figure out what exactly triggers
> this.
>
> On Tue, Nov 17, 2015 at 11:03 AM Oliver Stannard via llvm-commits <
> llvm-commits at lists.llvm.org> wrote:
>
>> Author: olista01
>> Date: Tue Nov 17 04:00:43 2015
>> New Revision: 253328
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=253328&view=rev
>> Log:
>> [Assembler] Make fatal assembler errors non-fatal
>>
>> Currently, if the assembler encounters an error after parsing (such as an
>> out-of-range fixup), it reports this as a fatal error, and so stops after
>> the
>> first error. However, for most of these there is an obvious way to recover
>> after emitting the error, such as emitting the fixup with a value of
>> zero. This
>> means that we can report on all of the errors in a file, not just the
>> first
>> one. MCContext::reportError records the fact that an error was
>> encountered, so
>> we won't actually emit an object file with the incorrect contents.
>>
>> Differential Revision: http://reviews.llvm.org/D14717
>>
>>
>> Added:
>>     llvm/trunk/test/MC/ARM/thumb1-relax.s
>>     llvm/trunk/test/MC/MachO/AArch64/reloc-errors.s
>> Removed:
>>     llvm/trunk/test/MC/ARM/thumb1-relax-adr-local.s
>>     llvm/trunk/test/MC/ARM/thumb1-relax-bcc-local.s
>>     llvm/trunk/test/MC/ARM/thumb1-relax-br-local.s
>>     llvm/trunk/test/MC/ARM/thumb1-relax-ldrlit-local-behind.s
>>     llvm/trunk/test/MC/ARM/thumb1-relax-ldrlit-local-misaligned.s
>>     llvm/trunk/test/MC/ARM/thumb1-relax-ldrlit-local-range.s
>>     llvm/trunk/test/MC/MachO/bad-darwin-x86_64-reloc-expr1.s
>>     llvm/trunk/test/MC/MachO/bad-darwin-x86_64-reloc-expr2.s
>> Modified:
>>     llvm/trunk/include/llvm/MC/MCWinCOFFStreamer.h
>>     llvm/trunk/lib/MC/ELFObjectWriter.cpp
>>     llvm/trunk/lib/MC/MCAssembler.cpp
>>     llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp
>>     llvm/trunk/lib/MC/WinCOFFStreamer.cpp
>>     llvm/trunk/lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp
>>     llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp
>>     llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp
>>     llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp
>>     llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp
>>     llvm/trunk/lib/Target/PowerPC/MCTargetDesc/PPCMachObjectWriter.cpp
>>     llvm/trunk/lib/Target/X86/MCTargetDesc/X86MachObjectWriter.cpp
>>     llvm/trunk/test/MC/AArch64/error-location.s
>>     llvm/trunk/test/MC/ARM/arm-elf-relocation-diagnostics.s
>>     llvm/trunk/test/MC/ARM/error-location.s
>>     llvm/trunk/test/MC/COFF/bad-expr.s
>>     llvm/trunk/test/MC/COFF/invalid-def.s
>>     llvm/trunk/test/MC/COFF/invalid-endef.s
>>     llvm/trunk/test/MC/COFF/invalid-scl-range.s
>>     llvm/trunk/test/MC/COFF/invalid-scl.s
>>     llvm/trunk/test/MC/COFF/invalid-type.s
>>     llvm/trunk/test/MC/COFF/label-undefined.s
>>     llvm/trunk/test/MC/COFF/secidx-diagnostic.s
>>     llvm/trunk/test/MC/ELF/common-error1.s
>>     llvm/trunk/test/MC/ELF/common-error2.s
>>     llvm/trunk/test/MC/MachO/ARM/bad-darwin-ARM-reloc.s
>>     llvm/trunk/test/MC/MachO/bad-darwin-x86_64-diff-relocs.s
>>     llvm/trunk/test/MC/Mips/micromips-diagnostic-fixup.s
>>     llvm/trunk/test/MC/Mips/micromips-pc16-fixup.s
>>     llvm/trunk/test/MC/Mips/mips-diagnostic-fixup.s
>>     llvm/trunk/test/MC/Mips/mips-pc16-fixup.s
>>
>> Modified: llvm/trunk/include/llvm/MC/MCWinCOFFStreamer.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCWinCOFFStreamer.h?rev=253328&r1=253327&r2=253328&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/MC/MCWinCOFFStreamer.h (original)
>> +++ llvm/trunk/include/llvm/MC/MCWinCOFFStreamer.h Tue Nov 17 04:00:43
>> 2015
>> @@ -73,7 +73,7 @@ protected:
>>    void EmitInstToData(const MCInst &Inst, const MCSubtargetInfo &STI)
>> override;
>>
>>  private:
>> -  LLVM_ATTRIBUTE_NORETURN void FatalError(const Twine &Msg) const;
>> +  void Error(const Twine &Msg) const;
>>  };
>>  }
>>
>>
>> Modified: llvm/trunk/lib/MC/ELFObjectWriter.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/ELFObjectWriter.cpp?rev=253328&r1=253327&r2=253328&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/MC/ELFObjectWriter.cpp (original)
>> +++ llvm/trunk/lib/MC/ELFObjectWriter.cpp Tue Nov 17 04:00:43 2015
>> @@ -630,28 +630,36 @@ void ELFObjectWriter::recordRelocation(M
>>      // In general, ELF has no relocations for -B. It can only represent
>> (A + C)
>>      // or (A + C - R). If B = R + K and the relocation is not pcrel, we
>> can
>>      // replace B to implement it: (A - R - K + C)
>> -    if (IsPCRel)
>> -      Asm.getContext().reportFatalError(
>> +    if (IsPCRel) {
>> +      Asm.getContext().reportError(
>>            Fixup.getLoc(),
>>            "No relocation available to represent this relative
>> expression");
>> +      return;
>> +    }
>>
>>      const auto &SymB = cast<MCSymbolELF>(RefB->getSymbol());
>>
>> -    if (SymB.isUndefined())
>> -      Asm.getContext().reportFatalError(
>> +    if (SymB.isUndefined()) {
>> +      Asm.getContext().reportError(
>>            Fixup.getLoc(),
>>            Twine("symbol '") + SymB.getName() +
>>                "' can not be undefined in a subtraction expression");
>> +      return;
>> +    }
>>
>>      assert(!SymB.isAbsolute() && "Should have been folded");
>>      const MCSection &SecB = SymB.getSection();
>> -    if (&SecB != &FixupSection)
>> -      Asm.getContext().reportFatalError(
>> +    if (&SecB != &FixupSection) {
>> +      Asm.getContext().reportError(
>>            Fixup.getLoc(), "Cannot represent a difference across
>> sections");
>> +      return;
>> +    }
>>
>> -    if (::isWeak(SymB))
>> -      Asm.getContext().reportFatalError(
>> +    if (::isWeak(SymB)) {
>> +      Asm.getContext().reportError(
>>            Fixup.getLoc(), "Cannot represent a subtraction with a weak
>> symbol");
>> +      return;
>> +    }
>>
>>      uint64_t SymBOffset = Layout.getSymbolOffset(SymB);
>>      uint64_t K = SymBOffset - FixupOffset;
>> @@ -784,8 +792,10 @@ void ELFObjectWriter::computeSymbolTable
>>                      Renames.count(&Symbol)))
>>        continue;
>>
>> -    if (Symbol.isTemporary() && Symbol.isUndefined())
>> -      Ctx.reportFatalError(SMLoc(), "Undefined temporary");
>> +    if (Symbol.isTemporary() && Symbol.isUndefined()) {
>> +      Ctx.reportError(SMLoc(), "Undefined temporary symbol");
>> +      continue;
>> +    }
>>
>>      ELFSymbolData MSD;
>>      MSD.Symbol = cast<MCSymbolELF>(&Symbol);
>>
>> Modified: llvm/trunk/lib/MC/MCAssembler.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAssembler.cpp?rev=253328&r1=253327&r2=253328&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/MC/MCAssembler.cpp (original)
>> +++ llvm/trunk/lib/MC/MCAssembler.cpp Tue Nov 17 04:00:43 2015
>> @@ -179,14 +179,19 @@ const MCSymbol *MCAsmLayout::getBaseSymb
>>
>>    const MCExpr *Expr = Symbol.getVariableValue();
>>    MCValue Value;
>> -  if (!Expr->evaluateAsValue(Value, *this))
>> -    llvm_unreachable("Invalid Expression");
>> +  if (!Expr->evaluateAsValue(Value, *this)) {
>> +    Assembler.getContext().reportError(
>> +        SMLoc(), "expression could not be evaluated");
>> +    return nullptr;
>> +  }
>>
>>    const MCSymbolRefExpr *RefB = Value.getSymB();
>> -  if (RefB)
>> -    Assembler.getContext().reportFatalError(
>> +  if (RefB) {
>> +    Assembler.getContext().reportError(
>>          SMLoc(), Twine("symbol '") + RefB->getSymbol().getName() +
>>                       "' could not be evaluated in a subtraction
>> expression");
>> +    return nullptr;
>> +  }
>>
>>    const MCSymbolRefExpr *A = Value.getSymA();
>>    if (!A)
>> @@ -196,9 +201,10 @@ const MCSymbol *MCAsmLayout::getBaseSymb
>>    const MCAssembler &Asm = getAssembler();
>>    if (ASym.isCommon()) {
>>      // FIXME: we should probably add a SMLoc to MCExpr.
>> -    Asm.getContext().reportFatalError(SMLoc(),
>> -                                "Common symbol " + ASym.getName() +
>> -                                    " cannot be used in assignment
>> expr");
>> +    Asm.getContext().reportError(SMLoc(),
>> +                                 "Common symbol '" + ASym.getName() +
>> +                                     "' cannot be used in assignment
>> expr");
>> +    return nullptr;
>>    }
>>
>>    return &ASym;
>> @@ -436,8 +442,13 @@ bool MCAssembler::evaluateFixup(const MC
>>    // probably merge the two into a single callback that tries to
>> evaluate a
>>    // fixup and records a relocation if one is needed.
>>    const MCExpr *Expr = Fixup.getValue();
>> -  if (!Expr->evaluateAsRelocatable(Target, &Layout, &Fixup))
>> -    getContext().reportFatalError(Fixup.getLoc(), "expected relocatable
>> expression");
>> +  if (!Expr->evaluateAsRelocatable(Target, &Layout, &Fixup)) {
>> +    getContext().reportError(Fixup.getLoc(), "expected relocatable
>> expression");
>> +    // Claim to have completely evaluated the fixup, to prevent any
>> further
>> +    // processing from being done.
>> +    Value = 0;
>> +    return true;
>> +  }
>>
>>    bool IsPCRel = Backend.getFixupKindInfo(
>>      Fixup.getKind()).Flags & MCFixupKindInfo::FKF_IsPCRel;
>>
>> Modified: llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp?rev=253328&r1=253327&r2=253328&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp (original)
>> +++ llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp Tue Nov 17 04:00:43 2015
>> @@ -706,14 +706,17 @@ void WinCOFFObjectWriter::recordRelocati
>>
>>    const MCSymbol &Symbol = Target.getSymA()->getSymbol();
>>    const MCSymbol &A = Symbol;
>> -  if (!A.isRegistered())
>> -    Asm.getContext().reportFatalError(Fixup.getLoc(),
>> +  if (!A.isRegistered()) {
>> +    Asm.getContext().reportError(Fixup.getLoc(),
>>                                        Twine("symbol '") + A.getName() +
>>                                            "' can not be undefined");
>> +    return;
>> +  }
>>    if (A.isTemporary() && A.isUndefined()) {
>> -    Asm.getContext().reportFatalError(Fixup.getLoc(),
>> +    Asm.getContext().reportError(Fixup.getLoc(),
>>                                        Twine("assembler label '") +
>> A.getName() +
>>                                            "' can not be undefined");
>> +    return;
>>    }
>>
>>    MCSection *Section = Fragment->getParent();
>> @@ -731,17 +734,21 @@ void WinCOFFObjectWriter::recordRelocati
>>
>>    if (SymB) {
>>      const MCSymbol *B = &SymB->getSymbol();
>> -    if (!B->getFragment())
>> -      Asm.getContext().reportFatalError(
>> +    if (!B->getFragment()) {
>> +      Asm.getContext().reportError(
>>            Fixup.getLoc(),
>>            Twine("symbol '") + B->getName() +
>>                "' can not be undefined in a subtraction expression");
>> +      return;
>> +    }
>>
>> -    if (!A.getFragment())
>> -      Asm.getContext().reportFatalError(
>> +    if (!A.getFragment()) {
>> +      Asm.getContext().reportError(
>>            Fixup.getLoc(),
>>            Twine("symbol '") + Symbol.getName() +
>>                "' can not be undefined in a subtraction expression");
>> +      return;
>> +    }
>>
>>      CrossSection = &Symbol.getSection() != &B->getSection();
>>
>>
>> Modified: llvm/trunk/lib/MC/WinCOFFStreamer.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/WinCOFFStreamer.cpp?rev=253328&r1=253327&r2=253328&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/MC/WinCOFFStreamer.cpp (original)
>> +++ llvm/trunk/lib/MC/WinCOFFStreamer.cpp Tue Nov 17 04:00:43 2015
>> @@ -122,29 +122,37 @@ void MCWinCOFFStreamer::BeginCOFFSymbolD
>>           "Got non-COFF section in the COFF backend!");
>>
>>    if (CurSymbol)
>> -    FatalError("starting a new symbol definition without completing the "
>> -               "previous one");
>> +    Error("starting a new symbol definition without completing the "
>> +          "previous one");
>>    CurSymbol = Symbol;
>>  }
>>
>>  void MCWinCOFFStreamer::EmitCOFFSymbolStorageClass(int StorageClass) {
>> -  if (!CurSymbol)
>> -    FatalError("storage class specified outside of symbol definition");
>> +  if (!CurSymbol) {
>> +    Error("storage class specified outside of symbol definition");
>> +    return;
>> +  }
>>
>> -  if (StorageClass & ~COFF::SSC_Invalid)
>> -    FatalError("storage class value '" + Twine(StorageClass) +
>> +  if (StorageClass & ~COFF::SSC_Invalid) {
>> +    Error("storage class value '" + Twine(StorageClass) +
>>                 "' out of range");
>> +    return;
>> +  }
>>
>>    getAssembler().registerSymbol(*CurSymbol);
>>    cast<MCSymbolCOFF>(CurSymbol)->setClass((uint16_t)StorageClass);
>>  }
>>
>>  void MCWinCOFFStreamer::EmitCOFFSymbolType(int Type) {
>> -  if (!CurSymbol)
>> -    FatalError("symbol type specified outside of a symbol definition");
>> +  if (!CurSymbol) {
>> +    Error("symbol type specified outside of a symbol definition");
>> +    return;
>> +  }
>>
>> -  if (Type & ~0xffff)
>> -    FatalError("type value '" + Twine(Type) + "' out of range");
>> +  if (Type & ~0xffff) {
>> +    Error("type value '" + Twine(Type) + "' out of range");
>> +    return;
>> +  }
>>
>>    getAssembler().registerSymbol(*CurSymbol);
>>    cast<MCSymbolCOFF>(CurSymbol)->setType((uint16_t)Type);
>> @@ -152,7 +160,7 @@ void MCWinCOFFStreamer::EmitCOFFSymbolTy
>>
>>  void MCWinCOFFStreamer::EndCOFFSymbolDef() {
>>    if (!CurSymbol)
>> -    FatalError("ending symbol definition without starting one");
>> +    Error("ending symbol definition without starting one");
>>    CurSymbol = nullptr;
>>  }
>>
>> @@ -281,9 +289,8 @@ void MCWinCOFFStreamer::FinishImpl() {
>>    MCObjectStreamer::FinishImpl();
>>  }
>>
>> -LLVM_ATTRIBUTE_NORETURN
>> -void MCWinCOFFStreamer::FatalError(const Twine &Msg) const {
>> -  getContext().reportFatalError(SMLoc(), Msg);
>> +void MCWinCOFFStreamer::Error(const Twine &Msg) const {
>> +  getContext().reportError(SMLoc(), Msg);
>>  }
>>  }
>>
>>
>> Modified:
>> llvm/trunk/lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp?rev=253328&r1=253327&r2=253328&view=diff
>>
>> ==============================================================================
>> ---
>> llvm/trunk/lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp
>> (original)
>> +++
>> llvm/trunk/lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp Tue
>> Nov 17 04:00:43 2015
>> @@ -90,9 +90,11 @@ bool AArch64MachObjectWriter::getAArch64
>>      Log2Size = llvm::Log2_32(4);
>>      // This encompasses the relocation for the whole 21-bit value.
>>      switch (Sym->getKind()) {
>> -    default:
>> -      Asm.getContext().reportFatalError(Fixup.getLoc(),
>> -                                  "ADR/ADRP relocations must be GOT
>> relative");
>> +    default: {
>> +      Asm.getContext().reportError(Fixup.getLoc(),
>> +                                   "ADR/ADRP relocations must be GOT
>> relative");
>> +      return false;
>> +    }
>>      case MCSymbolRefExpr::VK_PAGE:
>>        RelocType = unsigned(MachO::ARM64_RELOC_PAGE21);
>>        return true;
>> @@ -170,25 +172,25 @@ void AArch64MachObjectWriter::recordRelo
>>    // assembler local symbols. If we got here, that's not what we have,
>>    // so complain loudly.
>>    if (Kind == AArch64::fixup_aarch64_pcrel_branch19) {
>> -    Asm.getContext().reportFatalError(Fixup.getLoc(),
>> -                                "conditional branch requires
>> assembler-local"
>> -                                " label. '" +
>> -
>> Target.getSymA()->getSymbol().getName() +
>> -                                    "' is external.");
>> +    Asm.getContext().reportError(Fixup.getLoc(),
>> +                                 "conditional branch requires
>> assembler-local"
>> +                                 " label. '" +
>> +
>>  Target.getSymA()->getSymbol().getName() +
>> +                                     "' is external.");
>>      return;
>>    }
>>
>>    // 14-bit branch relocations should only target internal labels, and so
>>    // should never get here.
>>    if (Kind == AArch64::fixup_aarch64_pcrel_branch14) {
>> -    Asm.getContext().reportFatalError(Fixup.getLoc(),
>> -                                "Invalid relocation on conditional
>> branch!");
>> +    Asm.getContext().reportError(Fixup.getLoc(),
>> +                                 "Invalid relocation on conditional
>> branch!");
>>      return;
>>    }
>>
>>    if (!getAArch64FixupKindMachOInfo(Fixup, Type, Target.getSymA(),
>> Log2Size,
>> -                                  Asm)) {
>> -    Asm.getContext().reportFatalError(Fixup.getLoc(), "unknown AArch64
>> fixup kind!");
>> +                                    Asm)) {
>> +    Asm.getContext().reportError(Fixup.getLoc(), "unknown AArch64 fixup
>> kind!");
>>      return;
>>    }
>>
>> @@ -200,8 +202,9 @@ void AArch64MachObjectWriter::recordRelo
>>      Type = MachO::ARM64_RELOC_UNSIGNED;
>>
>>      if (IsPCRel) {
>> -      Asm.getContext().reportFatalError(Fixup.getLoc(),
>> -                                  "PC relative absolute relocation!");
>> +      Asm.getContext().reportError(Fixup.getLoc(),
>> +                                   "PC relative absolute relocation!");
>> +      return;
>>
>>        // FIXME: x86_64 sets the type to a branch reloc here. Should we do
>>        // something similar?
>> @@ -229,16 +232,20 @@ void AArch64MachObjectWriter::recordRelo
>>        Writer->addRelocation(A_Base, Fragment->getParent(), MRE);
>>        return;
>>      } else if (Target.getSymA()->getKind() != MCSymbolRefExpr::VK_None ||
>> -               Target.getSymB()->getKind() != MCSymbolRefExpr::VK_None)
>> +               Target.getSymB()->getKind() != MCSymbolRefExpr::VK_None) {
>>        // Otherwise, neither symbol can be modified.
>> -      Asm.getContext().reportFatalError(Fixup.getLoc(),
>> -                                  "unsupported relocation of modified
>> symbol");
>> +      Asm.getContext().reportError(Fixup.getLoc(),
>> +                                   "unsupported relocation of modified
>> symbol");
>> +      return;
>> +    }
>>
>>      // We don't support PCrel relocations of differences.
>> -    if (IsPCRel)
>> -      Asm.getContext().reportFatalError(Fixup.getLoc(),
>> -                                  "unsupported pc-relative relocation of
>> "
>> -                                  "difference");
>> +    if (IsPCRel) {
>> +      Asm.getContext().reportError(Fixup.getLoc(),
>> +                                   "unsupported pc-relative relocation
>> of "
>> +                                   "difference");
>> +      return;
>> +    }
>>
>>      // AArch64 always uses external relocations. If there is no symbol
>> to use as
>>      // a base address (a local symbol with no preceding non-local
>> symbol),
>> @@ -246,20 +253,26 @@ void AArch64MachObjectWriter::recordRelo
>>      //
>>      // FIXME: We should probably just synthesize an external symbol and
>> use
>>      // that.
>> -    if (!A_Base)
>> -      Asm.getContext().reportFatalError(
>> +    if (!A_Base) {
>> +      Asm.getContext().reportError(
>>            Fixup.getLoc(),
>>            "unsupported relocation of local symbol '" + A->getName() +
>>                "'. Must have non-local symbol earlier in section.");
>> -    if (!B_Base)
>> -      Asm.getContext().reportFatalError(
>> +      return;
>> +    }
>> +    if (!B_Base) {
>> +      Asm.getContext().reportError(
>>            Fixup.getLoc(),
>>            "unsupported relocation of local symbol '" + B->getName() +
>>                "'. Must have non-local symbol earlier in section.");
>> +      return;
>> +    }
>>
>> -    if (A_Base == B_Base && A_Base)
>> -      Asm.getContext().reportFatalError(Fixup.getLoc(),
>> -                                  "unsupported relocation with identical
>> base");
>> +    if (A_Base == B_Base && A_Base) {
>> +      Asm.getContext().reportError(
>> +          Fixup.getLoc(), "unsupported relocation with identical base");
>> +      return;
>> +    }
>>
>>      Value += (!A->getFragment() ? 0 : Writer->getSymbolAddress(*A,
>> Layout)) -
>>               (!A_Base || !A_Base->getFragment() ? 0 :
>> Writer->getSymbolAddress(
>> @@ -309,10 +322,12 @@ void AArch64MachObjectWriter::recordRelo
>>        // we need to preserve and merge with the new Target? How about
>>        // the FixedValue?
>>        if (!Symbol->getVariableValue()->evaluateAsRelocatable(Target,
>> &Layout,
>> -                                                             &Fixup))
>> -        Asm.getContext().reportFatalError(Fixup.getLoc(),
>> -                                    "unable to resolve variable '" +
>> -                                        Symbol->getName() + "'");
>> +                                                             &Fixup)) {
>> +        Asm.getContext().reportError(Fixup.getLoc(),
>> +                                     "unable to resolve variable '" +
>> +                                         Symbol->getName() + "'");
>> +        return;
>> +      }
>>        return recordRelocation(Writer, Asm, Layout, Fragment, Fixup,
>> Target,
>>                                FixedValue);
>>      }
>> @@ -337,11 +352,13 @@ void AArch64MachObjectWriter::recordRelo
>>          Value +=
>>              Layout.getSymbolOffset(*Symbol) -
>> Layout.getSymbolOffset(*Base);
>>      } else if (Symbol->isInSection()) {
>> -      if (!CanUseLocalRelocation)
>> -        Asm.getContext().reportFatalError(
>> +      if (!CanUseLocalRelocation) {
>> +        Asm.getContext().reportError(
>>              Fixup.getLoc(),
>>              "unsupported relocation of local symbol '" +
>> Symbol->getName() +
>>                  "'. Must have non-local symbol earlier in section.");
>> +        return;
>> +      }
>>        // Adjust the relocation to be section-relative.
>>        // The index is the section ordinal (1-based).
>>        const MCSection &Sec = Symbol->getSection();
>> @@ -361,9 +378,10 @@ void AArch64MachObjectWriter::recordRelo
>>            return;
>>          }
>>        }
>> -      Asm.getContext().reportFatalError(Fixup.getLoc(),
>> +      Asm.getContext().reportError(Fixup.getLoc(),
>>                                    "unsupported relocation of variable '"
>> +
>>                                        Symbol->getName() + "'");
>> +      return;
>>      }
>>    }
>>
>>
>> Modified: llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp?rev=253328&r1=253327&r2=253328&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp (original)
>> +++ llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp Tue Nov 17
>> 04:00:43 2015
>> @@ -395,8 +395,10 @@ unsigned ARMAsmBackend::adjustFixupValue
>>        Value = -Value;
>>        isAdd = false;
>>      }
>> -    if (Ctx && Value >= 4096)
>> -      Ctx->reportFatalError(Fixup.getLoc(), "out of range pc-relative
>> fixup value");
>> +    if (Ctx && Value >= 4096) {
>> +      Ctx->reportError(Fixup.getLoc(), "out of range pc-relative fixup
>> value");
>> +      return 0;
>> +    }
>>      Value |= isAdd << 23;
>>
>>      // Same addressing mode as fixup_arm_pcrel_10,
>> @@ -414,8 +416,10 @@ unsigned ARMAsmBackend::adjustFixupValue
>>        Value = -Value;
>>        opc = 2; // 0b0010
>>      }
>> -    if (Ctx && ARM_AM::getSOImmVal(Value) == -1)
>> -      Ctx->reportFatalError(Fixup.getLoc(), "out of range pc-relative
>> fixup value");
>> +    if (Ctx && ARM_AM::getSOImmVal(Value) == -1) {
>> +      Ctx->reportError(Fixup.getLoc(), "out of range pc-relative fixup
>> value");
>> +      return 0;
>> +    }
>>      // Encode the immediate and shift the opcode into place.
>>      return ARM_AM::getSOImmVal(Value) | (opc << 21);
>>    }
>> @@ -544,8 +548,10 @@ unsigned ARMAsmBackend::adjustFixupValue
>>      // could have an error on our hands.
>>      if (Ctx && !STI->getFeatureBits()[ARM::FeatureThumb2] && IsResolved)
>> {
>>        const char *FixupDiagnostic = reasonForFixupRelaxation(Fixup,
>> Value);
>> -      if (FixupDiagnostic)
>> -        Ctx->reportFatalError(Fixup.getLoc(), FixupDiagnostic);
>> +      if (FixupDiagnostic) {
>> +        Ctx->reportError(Fixup.getLoc(), FixupDiagnostic);
>> +        return 0;
>> +      }
>>      }
>>      // Offset by 4, and don't encode the low two bits.
>>      return ((Value - 4) >> 2) & 0xff;
>> @@ -559,16 +565,20 @@ unsigned ARMAsmBackend::adjustFixupValue
>>      // Offset by 4 and don't encode the lower bit, which is always 0.
>>      if (Ctx && !STI->getFeatureBits()[ARM::FeatureThumb2]) {
>>        const char *FixupDiagnostic = reasonForFixupRelaxation(Fixup,
>> Value);
>> -      if (FixupDiagnostic)
>> -        Ctx->reportFatalError(Fixup.getLoc(), FixupDiagnostic);
>> +      if (FixupDiagnostic) {
>> +        Ctx->reportError(Fixup.getLoc(), FixupDiagnostic);
>> +        return 0;
>> +      }
>>      }
>>      return ((Value - 4) >> 1) & 0x7ff;
>>    case ARM::fixup_arm_thumb_bcc:
>>      // Offset by 4 and don't encode the lower bit, which is always 0.
>>      if (Ctx && !STI->getFeatureBits()[ARM::FeatureThumb2]) {
>>        const char *FixupDiagnostic = reasonForFixupRelaxation(Fixup,
>> Value);
>> -      if (FixupDiagnostic)
>> -        Ctx->reportFatalError(Fixup.getLoc(), FixupDiagnostic);
>> +      if (FixupDiagnostic) {
>> +        Ctx->reportError(Fixup.getLoc(), FixupDiagnostic);
>> +        return 0;
>> +      }
>>      }
>>      return ((Value - 4) >> 1) & 0xff;
>>    case ARM::fixup_arm_pcrel_10_unscaled: {
>> @@ -580,8 +590,10 @@ unsigned ARMAsmBackend::adjustFixupValue
>>        isAdd = false;
>>      }
>>      // The value has the low 4 bits encoded in [3:0] and the high 4 in
>> [11:8].
>> -    if (Ctx && Value >= 256)
>> -      Ctx->reportFatalError(Fixup.getLoc(), "out of range pc-relative
>> fixup value");
>> +    if (Ctx && Value >= 256) {
>> +      Ctx->reportError(Fixup.getLoc(), "out of range pc-relative fixup
>> value");
>> +      return 0;
>> +    }
>>      Value = (Value & 0xf) | ((Value & 0xf0) << 4);
>>      return Value | (isAdd << 23);
>>    }
>> @@ -599,8 +611,10 @@ unsigned ARMAsmBackend::adjustFixupValue
>>      }
>>      // These values don't encode the low two bits since they're always
>> zero.
>>      Value >>= 2;
>> -    if (Ctx && Value >= 256)
>> -      Ctx->reportFatalError(Fixup.getLoc(), "out of range pc-relative
>> fixup value");
>> +    if (Ctx && Value >= 256) {
>> +      Ctx->reportError(Fixup.getLoc(), "out of range pc-relative fixup
>> value");
>> +      return 0;
>> +    }
>>      Value |= isAdd << 23;
>>
>>      // Same addressing mode as fixup_arm_pcrel_10, but with 16-bit
>> halfwords
>>
>> Modified: llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp?rev=253328&r1=253327&r2=253328&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp (original)
>> +++ llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp Tue Nov 17
>> 04:00:43 2015
>> @@ -509,8 +509,10 @@ public:
>>    /// necessary.
>>    void EmitValueImpl(const MCExpr *Value, unsigned Size, SMLoc Loc)
>> override {
>>      if (const MCSymbolRefExpr *SRE =
>> dyn_cast_or_null<MCSymbolRefExpr>(Value))
>> -      if (SRE->getKind() == MCSymbolRefExpr::VK_ARM_SBREL && !(Size ==
>> 4))
>> -        getContext().reportFatalError(Loc, "relocated expression must be
>> 32-bit");
>> +      if (SRE->getKind() == MCSymbolRefExpr::VK_ARM_SBREL && !(Size ==
>> 4)) {
>> +        getContext().reportError(Loc, "relocated expression must be
>> 32-bit");
>> +        return;
>> +      }
>>
>>      EmitDataMappingSymbol();
>>      MCELFStreamer::EmitValueImpl(Value, Size, Loc);
>>
>> Modified: llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp?rev=253328&r1=253327&r2=253328&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp
>> (original)
>> +++ llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp Tue
>> Nov 17 04:00:43 2015
>> @@ -150,10 +150,12 @@ RecordARMScatteredHalfRelocation(MachObj
>>    // See <reloc.h>.
>>    const MCSymbol *A = &Target.getSymA()->getSymbol();
>>
>> -  if (!A->getFragment())
>> -    Asm.getContext().reportFatalError(Fixup.getLoc(),
>> +  if (!A->getFragment()) {
>> +    Asm.getContext().reportError(Fixup.getLoc(),
>>                         "symbol '" + A->getName() +
>>                         "' can not be undefined in a subtraction
>> expression");
>> +    return;
>> +  }
>>
>>    uint32_t Value = Writer->getSymbolAddress(*A, Layout);
>>    uint32_t Value2 = 0;
>> @@ -163,10 +165,12 @@ RecordARMScatteredHalfRelocation(MachObj
>>    if (const MCSymbolRefExpr *B = Target.getSymB()) {
>>      const MCSymbol *SB = &B->getSymbol();
>>
>> -    if (!SB->getFragment())
>> -      Asm.getContext().reportFatalError(Fixup.getLoc(),
>> +    if (!SB->getFragment()) {
>> +      Asm.getContext().reportError(Fixup.getLoc(),
>>                           "symbol '" + B->getSymbol().getName() +
>>                           "' can not be undefined in a subtraction
>> expression");
>> +      return;
>> +    }
>>
>>      // Select the appropriate difference relocation type.
>>      Type = MachO::ARM_RELOC_HALF_SECTDIFF;
>> @@ -251,10 +255,12 @@ void ARMMachObjectWriter::RecordARMScatt
>>    // See <reloc.h>.
>>    const MCSymbol *A = &Target.getSymA()->getSymbol();
>>
>> -  if (!A->getFragment())
>> -    Asm.getContext().reportFatalError(Fixup.getLoc(),
>> +  if (!A->getFragment()) {
>> +    Asm.getContext().reportError(Fixup.getLoc(),
>>                         "symbol '" + A->getName() +
>>                         "' can not be undefined in a subtraction
>> expression");
>> +    return;
>> +  }
>>
>>    uint32_t Value = Writer->getSymbolAddress(*A, Layout);
>>    uint64_t SecAddr =
>> Writer->getSectionAddress(A->getFragment()->getParent());
>> @@ -265,10 +271,12 @@ void ARMMachObjectWriter::RecordARMScatt
>>      assert(Type == MachO::ARM_RELOC_VANILLA && "invalid reloc for 2
>> symbols");
>>      const MCSymbol *SB = &B->getSymbol();
>>
>> -    if (!SB->getFragment())
>> -      Asm.getContext().reportFatalError(Fixup.getLoc(),
>> +    if (!SB->getFragment()) {
>> +      Asm.getContext().reportError(Fixup.getLoc(),
>>                           "symbol '" + B->getSymbol().getName() +
>>                           "' can not be undefined in a subtraction
>> expression");
>> +      return;
>> +    }
>>
>>      // Select the appropriate difference relocation type.
>>      Type = MachO::ARM_RELOC_SECTDIFF;
>> @@ -346,13 +354,15 @@ void ARMMachObjectWriter::recordRelocati
>>    unsigned IsPCRel = Writer->isFixupKindPCRel(Asm, Fixup.getKind());
>>    unsigned Log2Size;
>>    unsigned RelocType = MachO::ARM_RELOC_VANILLA;
>> -  if (!getARMFixupKindMachOInfo(Fixup.getKind(), RelocType, Log2Size))
>> +  if (!getARMFixupKindMachOInfo(Fixup.getKind(), RelocType, Log2Size)) {
>>      // If we failed to get fixup kind info, it's because there's no legal
>>      // relocation type for the fixup kind. This happens when it's a
>> fixup that's
>>      // expected to always be resolvable at assembly time and not have any
>>      // relocations needed.
>> -    Asm.getContext().reportFatalError(Fixup.getLoc(),
>> -                                "unsupported relocation on symbol");
>> +    Asm.getContext().reportError(Fixup.getLoc(),
>> +                                 "unsupported relocation on symbol");
>> +    return;
>> +  }
>>
>>    // If this is a difference or a defined symbol plus an offset, then we
>> need a
>>    // scattered relocation entry.  Differences always require scattered
>>
>> Modified: llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp?rev=253328&r1=253327&r2=253328&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp (original)
>> +++ llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp Tue Nov 17
>> 04:00:43 2015
>> @@ -63,15 +63,19 @@ static unsigned adjustFixupValue(const M
>>      // address range. Forcing a signed division because Value can be
>> negative.
>>      Value = (int64_t)Value / 4;
>>      // We now check if Value can be encoded as a 16-bit signed immediate.
>> -    if (!isInt<16>(Value) && Ctx)
>> -      Ctx->reportFatalError(Fixup.getLoc(), "out of range PC16 fixup");
>> +    if (!isInt<16>(Value) && Ctx) {
>> +      Ctx->reportError(Fixup.getLoc(), "out of range PC16 fixup");
>> +      return 0;
>> +    }
>>      break;
>>    case Mips::fixup_MIPS_PC19_S2:
>>      // Forcing a signed division because Value can be negative.
>>      Value = (int64_t)Value / 4;
>>      // We now check if Value can be encoded as a 19-bit signed immediate.
>> -    if (!isInt<19>(Value) && Ctx)
>> -      Ctx->reportFatalError(Fixup.getLoc(), "out of range PC19 fixup");
>> +    if (!isInt<19>(Value) && Ctx) {
>> +      Ctx->reportError(Fixup.getLoc(), "out of range PC19 fixup");
>> +      return 0;
>> +    }
>>      break;
>>    case Mips::fixup_Mips_26:
>>      // So far we are only using this type for jumps.
>> @@ -104,45 +108,57 @@ static unsigned adjustFixupValue(const M
>>      // Forcing a signed division because Value can be negative.
>>      Value = (int64_t) Value / 2;
>>      // We now check if Value can be encoded as a 7-bit signed immediate.
>> -    if (!isInt<7>(Value) && Ctx)
>> -      Ctx->reportFatalError(Fixup.getLoc(), "out of range PC7 fixup");
>> +    if (!isInt<7>(Value) && Ctx) {
>> +      Ctx->reportError(Fixup.getLoc(), "out of range PC7 fixup");
>> +      return 0;
>> +    }
>>      break;
>>    case Mips::fixup_MICROMIPS_PC10_S1:
>>      Value -= 2;
>>      // Forcing a signed division because Value can be negative.
>>      Value = (int64_t) Value / 2;
>>      // We now check if Value can be encoded as a 10-bit signed immediate.
>> -    if (!isInt<10>(Value) && Ctx)
>> -      Ctx->reportFatalError(Fixup.getLoc(), "out of range PC10 fixup");
>> +    if (!isInt<10>(Value) && Ctx) {
>> +      Ctx->reportError(Fixup.getLoc(), "out of range PC10 fixup");
>> +      return 0;
>> +    }
>>      break;
>>    case Mips::fixup_MICROMIPS_PC16_S1:
>>      Value -= 4;
>>      // Forcing a signed division because Value can be negative.
>>      Value = (int64_t)Value / 2;
>>      // We now check if Value can be encoded as a 16-bit signed immediate.
>> -    if (!isInt<16>(Value) && Ctx)
>> -      Ctx->reportFatalError(Fixup.getLoc(), "out of range PC16 fixup");
>> +    if (!isInt<16>(Value) && Ctx) {
>> +      Ctx->reportError(Fixup.getLoc(), "out of range PC16 fixup");
>> +      return 0;
>> +    }
>>      break;
>>    case Mips::fixup_MIPS_PC18_S3:
>>      // Forcing a signed division because Value can be negative.
>>      Value = (int64_t)Value / 8;
>>      // We now check if Value can be encoded as a 18-bit signed immediate.
>> -    if (!isInt<18>(Value) && Ctx)
>> -      Ctx->reportFatalError(Fixup.getLoc(), "out of range PC18 fixup");
>> +    if (!isInt<18>(Value) && Ctx) {
>> +      Ctx->reportError(Fixup.getLoc(), "out of range PC18 fixup");
>> +      return 0;
>> +    }
>>      break;
>>    case Mips::fixup_MIPS_PC21_S2:
>>      // Forcing a signed division because Value can be negative.
>>      Value = (int64_t) Value / 4;
>>      // We now check if Value can be encoded as a 21-bit signed immediate.
>> -    if (!isInt<21>(Value) && Ctx)
>> -      Ctx->reportFatalError(Fixup.getLoc(), "out of range PC21 fixup");
>> +    if (!isInt<21>(Value) && Ctx) {
>> +      Ctx->reportError(Fixup.getLoc(), "out of range PC21 fixup");
>> +      return 0;
>> +    }
>>      break;
>>    case Mips::fixup_MIPS_PC26_S2:
>>      // Forcing a signed division because Value can be negative.
>>      Value = (int64_t) Value / 4;
>>      // We now check if Value can be encoded as a 26-bit signed immediate.
>> -    if (!isInt<26>(Value) && Ctx)
>> -      Ctx->reportFatalError(Fixup.getLoc(), "out of range PC26 fixup");
>> +    if (!isInt<26>(Value) && Ctx) {
>> +      Ctx->reportError(Fixup.getLoc(), "out of range PC26 fixup");
>> +      return 0;
>> +    }
>>      break;
>>    }
>>
>>
>> Modified:
>> llvm/trunk/lib/Target/PowerPC/MCTargetDesc/PPCMachObjectWriter.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/MCTargetDesc/PPCMachObjectWriter.cpp?rev=253328&r1=253327&r2=253328&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Target/PowerPC/MCTargetDesc/PPCMachObjectWriter.cpp
>> (original)
>> +++ llvm/trunk/lib/Target/PowerPC/MCTargetDesc/PPCMachObjectWriter.cpp
>> Tue Nov 17 04:00:43 2015
>> @@ -241,12 +241,12 @@ bool PPCMachObjectWriter::recordScattere
>>      if (FixupOffset > 0xffffff) {
>>        char Buffer[32];
>>        format("0x%x", FixupOffset).print(Buffer, sizeof(Buffer));
>> -      Asm.getContext().reportFatalError(Fixup.getLoc(),
>> +      Asm.getContext().reportError(Fixup.getLoc(),
>>                                    Twine("Section too large, can't encode
>> "
>>                                          "r_address (") +
>>                                        Buffer + ") into 24 bits of
>> scattered "
>>                                                 "relocation entry.");
>> -      llvm_unreachable("fatal error returned?!");
>> +      return false;
>>      }
>>
>>      // Is this supposed to follow
>> MCTarget/PPCAsmBackend.cpp:adjustFixupValue()?
>>
>> Modified: llvm/trunk/lib/Target/X86/MCTargetDesc/X86MachObjectWriter.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/MCTargetDesc/X86MachObjectWriter.cpp?rev=253328&r1=253327&r2=253328&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Target/X86/MCTargetDesc/X86MachObjectWriter.cpp
>> (original)
>> +++ llvm/trunk/lib/Target/X86/MCTargetDesc/X86MachObjectWriter.cpp Tue
>> Nov 17 04:00:43 2015
>> @@ -175,9 +175,10 @@ void X86MachObjectWriter::RecordX86_64Re
>>      // non-relocatable expression.
>>      if (A->isUndefined() || B->isUndefined()) {
>>        StringRef Name = A->isUndefined() ? A->getName() : B->getName();
>> -      Asm.getContext().reportFatalError(Fixup.getLoc(),
>> +      Asm.getContext().reportError(Fixup.getLoc(),
>>          "unsupported relocation with subtraction expression, symbol '" +
>>          Name + "' can not be undefined in a subtraction expression");
>> +      return;
>>      }
>>
>>      Value += Writer->getSymbolAddress(*A, Layout) -
>> @@ -387,12 +388,12 @@ bool X86MachObjectWriter::recordScattere
>>      if (FixupOffset > 0xffffff) {
>>        char Buffer[32];
>>        format("0x%x", FixupOffset).print(Buffer, sizeof(Buffer));
>> -      Asm.getContext().reportFatalError(Fixup.getLoc(),
>> +      Asm.getContext().reportError(Fixup.getLoc(),
>>                           Twine("Section too large, can't encode "
>>                                  "r_address (") + Buffer +
>>                           ") into 24 bits of scattered "
>>                           "relocation entry.");
>> -      llvm_unreachable("fatal error returned?!");
>> +      return false;
>>      }
>>
>>      MachO::any_relocation_info MRE;
>>
>> Modified: llvm/trunk/test/MC/AArch64/error-location.s
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AArch64/error-location.s?rev=253328&r1=253327&r2=253328&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/test/MC/AArch64/error-location.s (original)
>> +++ llvm/trunk/test/MC/AArch64/error-location.s Tue Nov 17 04:00:43 2015
>> @@ -1,5 +1,49 @@
>>  // RUN: not llvm-mc -triple aarch64--none-eabi -filetype obj < %s -o
>> /dev/null 2>&1 | FileCheck %s
>>
>> +// Note: These errors are not always emitted in the order in which the
>> relevant
>> +// source appears, this file is carefully ordered so that that is the
>> case.
>> +
>>    .text
>>  // CHECK: :[[@LINE+1]]:{{[0-9]+}}: error: symbol 'undef' can not be
>> undefined in a subtraction expression
>>    .word (0-undef)
>> +
>> +// CHECK: :[[@LINE+1]]:{{[0-9]+}}: error: expected relocatable expression
>> +  .word -undef
>> +
>> +// CHECK: :[[@LINE+1]]:{{[0-9]+}}: error: No relocation available to
>> represent this relative expression
>> +  adr x0, #a-undef
>> +
>> +// CHECK: :[[@LINE+1]]:{{[0-9]+}}: error: Cannot represent a difference
>> across sections
>> +  .word x_a - y_a
>> +
>> +// CHECK: :[[@LINE+1]]:{{[0-9]+}}: error: Cannot represent a subtraction
>> with a weak symbol
>> +  .word a - w
>> +
>> +// CHECK: <unknown>:0: error: expression could not be evaluated
>> +  .set v1, -undef
>> +
>> +  .comm common, 4
>> +// CHECK: <unknown>:0: error: Common symbol 'common' cannot be used in
>> assignment expr
>> +  .set v3, common
>> +
>> +// CHECK: <unknown>:0: error: Undefined temporary symbol
>> +  .word 5f
>> +
>> +// CHECK: <unknown>:0: error: symbol 'undef' could not be evaluated in a
>> subtraction expression
>> +  .set v2, a-undef
>> +
>> +
>> +
>> +w:
>> +  .word 0
>> +  .weak w
>> +
>> +
>> +  .section sec_x
>> +x_a:
>> +  .word 0
>> +
>> +
>> +  .section sec_y
>> +y_a:
>> +  .word 0
>>
>> Modified: llvm/trunk/test/MC/ARM/arm-elf-relocation-diagnostics.s
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/arm-elf-relocation-diagnostics.s?rev=253328&r1=253327&r2=253328&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/test/MC/ARM/arm-elf-relocation-diagnostics.s (original)
>> +++ llvm/trunk/test/MC/ARM/arm-elf-relocation-diagnostics.s Tue Nov 17
>> 04:00:43 2015
>> @@ -8,20 +8,19 @@
>>  @ CHECK: .byte target(sbrel)
>>  @ CHECK:       ^
>>
>> -@ TODO: enable these negative test cases
>> -@      .hword target(sbrel)
>> -@ @ CHECK-SBREL-HWORD: error: relocated expression must be 32-bit
>> -@ @ CHECK-SBREL-HWORD: .hword target(sbrel)
>> -@ @ CHECK-SBREL-HWORD:        ^
>> -@
>> -@      .short target(sbrel)
>> -@ @ CHECK-SBREL-SHORT: error: relocated expression must be 32-bit
>> -@ @ CHECK-SBREL-SHORT: .short target(sbrel)
>> -@ @ CHECK-SBREL-SHORT:        ^
>> -@
>> -@      .quad target(sbrel)
>> -@ @ CHECK-SBREL-SHORT: error: relocated expression must be 32-bit
>> -@ @ CHECK-SBREL-SHORT: .quad target(sbrel)
>> -@ @ CHECK-SBREL-SHORT:        ^
>> +       .hword target(sbrel)
>> +@ CHECK: error: relocated expression must be 32-bit
>> +@ CHECK: .hword target(sbrel)
>> +@ CHECK:        ^
>> +
>> +       .short target(sbrel)
>> +@ CHECK: error: relocated expression must be 32-bit
>> +@ CHECK: .short target(sbrel)
>> +@ CHECK:        ^
>> +
>> +       .quad target(sbrel)
>> +@ CHECK: error: relocated expression must be 32-bit
>> +@ CHECK: .quad target(sbrel)
>> +@ CHECK:        ^
>>
>>
>>
>> Modified: llvm/trunk/test/MC/ARM/error-location.s
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/error-location.s?rev=253328&r1=253327&r2=253328&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/test/MC/ARM/error-location.s (original)
>> +++ llvm/trunk/test/MC/ARM/error-location.s Tue Nov 17 04:00:43 2015
>> @@ -1,5 +1,49 @@
>>  @ RUN: not llvm-mc -triple armv7a--none-eabi -filetype obj < %s -o
>> /dev/null 2>&1 | FileCheck %s
>>
>> +@ Note: These errors are not always emitted in the order in which the
>> relevant
>> +@ source appears, this file is carefully ordered so that that is the
>> case.
>> +
>>    .text
>>  @ CHECK: :[[@LINE+1]]:{{[0-9]+}}: error: symbol 'undef' can not be
>> undefined in a subtraction expression
>>    .word (0-undef)
>> +
>> +@ CHECK: :[[@LINE+1]]:{{[0-9]+}}: error: expected relocatable expression
>> +  .word -undef
>> +
>> +@ CHECK: :[[@LINE+1]]:{{[0-9]+}}: error: No relocation available to
>> represent this relative expression
>> +  adr r0, #a-undef
>> +
>> +@ CHECK: :[[@LINE+1]]:{{[0-9]+}}: error: Cannot represent a difference
>> across sections
>> +  .word x_a - y_a
>> +
>> +@ CHECK: :[[@LINE+1]]:{{[0-9]+}}: error: Cannot represent a subtraction
>> with a weak symbol
>> +  .word a - w
>> +
>> +@ CHECK: <unknown>:0: error: expression could not be evaluated
>> +  .set v1, -undef
>> +
>> +  .comm common, 4
>> +@ CHECK: <unknown>:0: error: Common symbol 'common' cannot be used in
>> assignment expr
>> +  .set v3, common
>> +
>> +@ CHECK: <unknown>:0: error: Undefined temporary symbol
>> +  .word 5f
>> +
>> +@ CHECK: <unknown>:0: error: symbol 'undef' could not be evaluated in a
>> subtraction expression
>> +  .set v2, a-undef
>> +
>> +
>> +
>> +w:
>> +  .word 0
>> +  .weak w
>> +
>> +
>> +  .section sec_x
>> +x_a:
>> +  .word 0
>> +
>> +
>> +  .section sec_y
>> +y_a:
>> +  .word 0
>>
>> Removed: llvm/trunk/test/MC/ARM/thumb1-relax-adr-local.s
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/thumb1-relax-adr-local.s?rev=253327&view=auto
>>
>> ==============================================================================
>> --- llvm/trunk/test/MC/ARM/thumb1-relax-adr-local.s (original)
>> +++ llvm/trunk/test/MC/ARM/thumb1-relax-adr-local.s (removed)
>> @@ -1,9 +0,0 @@
>> -@ RUN: not llvm-mc -triple thumbv6m-none-macho -filetype=obj -o
>> /dev/null %s 2>&1 | FileCheck --check-prefix=CHECK-ERROR %s
>> -
>> -        .global func1
>> -        adr r0, Lmisaligned
>> -Lmisaligned:
>> -        .word 42
>> -
>> -@ CHECK-ERROR: misaligned pc-relative fixup value
>> -
>>
>> Removed: llvm/trunk/test/MC/ARM/thumb1-relax-bcc-local.s
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/thumb1-relax-bcc-local.s?rev=253327&view=auto
>>
>> ==============================================================================
>> --- llvm/trunk/test/MC/ARM/thumb1-relax-bcc-local.s (original)
>> +++ llvm/trunk/test/MC/ARM/thumb1-relax-bcc-local.s (removed)
>> @@ -1,6 +0,0 @@
>> -@ RUN: not llvm-mc -triple thumbv6m-none-macho -filetype=obj -o
>> /dev/null %s 2>&1 | FileCheck --check-prefix=CHECK-ERROR %s
>> -
>> -        bne Lfar
>> -        .space 258
>> -Lfar:
>> -@ CHECK-ERROR: out of range pc-relative fixup value
>>
>> Removed: llvm/trunk/test/MC/ARM/thumb1-relax-br-local.s
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/thumb1-relax-br-local.s?rev=253327&view=auto
>>
>> ==============================================================================
>> --- llvm/trunk/test/MC/ARM/thumb1-relax-br-local.s (original)
>> +++ llvm/trunk/test/MC/ARM/thumb1-relax-br-local.s (removed)
>> @@ -1,8 +0,0 @@
>> -@ RUN: not llvm-mc -triple thumbv6m-none-macho -filetype=obj -o
>> /dev/null %s 2>&1 | FileCheck --check-prefix=CHECK-ERROR %s
>> -
>> -        b Lfar
>> -        .space 2050
>> -
>> -Lfar:
>> -
>> -@ CHECK-ERROR: out of range pc-relative fixup value
>>
>> Removed: llvm/trunk/test/MC/ARM/thumb1-relax-ldrlit-local-behind.s
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/thumb1-relax-ldrlit-local-behind.s?rev=253327&view=auto
>>
>> ==============================================================================
>> --- llvm/trunk/test/MC/ARM/thumb1-relax-ldrlit-local-behind.s (original)
>> +++ llvm/trunk/test/MC/ARM/thumb1-relax-ldrlit-local-behind.s (removed)
>> @@ -1,7 +0,0 @@
>> -@ RUN: not llvm-mc -triple thumbv6m-none-macho -filetype=obj -o
>> /dev/null %s 2>&1 | FileCheck --check-prefix=CHECK-ERROR %s
>> -
>> -Lhere:
>> -        ldr r0, Lhere
>> -
>> -@ CHECK-ERROR: out of range pc-relative fixup value
>> -
>>
>> Removed: llvm/trunk/test/MC/ARM/thumb1-relax-ldrlit-local-misaligned.s
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/thumb1-relax-ldrlit-local-misaligned.s?rev=253327&view=auto
>>
>> ==============================================================================
>> --- llvm/trunk/test/MC/ARM/thumb1-relax-ldrlit-local-misaligned.s
>> (original)
>> +++ llvm/trunk/test/MC/ARM/thumb1-relax-ldrlit-local-misaligned.s
>> (removed)
>> @@ -1,10 +0,0 @@
>> -@ RUN: not llvm-mc -triple thumbv6m-none-macho -filetype=obj -o
>> /dev/null %s 2>&1 | FileCheck --check-prefix=CHECK-ERROR %s
>> -
>> -        .global func1
>> -_func1:
>> -        ldr r0, L_misaligned
>> -L_misaligned:
>> -        .word 42
>> -
>> -@ CHECK-ERROR: misaligned pc-relative fixup value
>> -
>>
>> Removed: llvm/trunk/test/MC/ARM/thumb1-relax-ldrlit-local-range.s
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/thumb1-relax-ldrlit-local-range.s?rev=253327&view=auto
>>
>> ==============================================================================
>> --- llvm/trunk/test/MC/ARM/thumb1-relax-ldrlit-local-range.s (original)
>> +++ llvm/trunk/test/MC/ARM/thumb1-relax-ldrlit-local-range.s (removed)
>> @@ -1,13 +0,0 @@
>> -@ RUN: not llvm-mc -triple thumbv6m-none-macho -filetype=obj -o
>> /dev/null %s 2>&1 | FileCheck --check-prefix=CHECK-ERROR %s
>> -
>> -        .global func1
>> -_func1:
>> -        ldr r0, L_far
>> -        .space 1024
>> -
>> -        .p2align 2
>> -L_far:
>> -        .word 42
>> -
>> -@ CHECK-ERROR: out of range pc-relative fixup value
>> -
>>
>> Added: llvm/trunk/test/MC/ARM/thumb1-relax.s
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/thumb1-relax.s?rev=253328&view=auto
>>
>> ==============================================================================
>> --- llvm/trunk/test/MC/ARM/thumb1-relax.s (added)
>> +++ llvm/trunk/test/MC/ARM/thumb1-relax.s Tue Nov 17 04:00:43 2015
>> @@ -0,0 +1,35 @@
>> +@ RUN: not llvm-mc -triple thumbv6m-none-macho -filetype=obj -o
>> /dev/null %s 2>&1 | FileCheck %s
>> +@ RUN: not llvm-mc -triple thumbv6m-none-eabi -filetype=obj -o /dev/null
>> %s 2>&1 | FileCheck %s
>> +
>> +Lhere:
>> +@ CHECK: out of range pc-relative fixup value
>> +  ldr r0, Lhere
>> +
>> +@ CHECK: out of range pc-relative fixup value
>> +  b Lfar2
>> +
>> +@ CHECK: out of range pc-relative fixup value
>> +  bne Lfar1
>> +
>> +@ CHECK: out of range pc-relative fixup value
>> +  ldr r0, Lfar2
>> +
>> +@ CHECK: misaligned pc-relative fixup value
>> +  adr r0, Lmisaligned
>> +
>> +@ CHECK: misaligned pc-relative fixup value
>> +  ldr r0, Lmisaligned
>> +
>> +  .balign 4
>> +  .short 0
>> +Lmisaligned:
>> +  .word 42
>> +
>> +  .space 256
>> +Lfar1:
>> +  .word 42
>> +
>> +  .space 2050
>> +Lfar2:
>> +  .word 42
>> +
>>
>> Modified: llvm/trunk/test/MC/COFF/bad-expr.s
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/COFF/bad-expr.s?rev=253328&r1=253327&r2=253328&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/test/MC/COFF/bad-expr.s (original)
>> +++ llvm/trunk/test/MC/COFF/bad-expr.s Tue Nov 17 04:00:43 2015
>> @@ -1,7 +1,9 @@
>>  // RUN: not llvm-mc -filetype=obj -triple i386-pc-win32 %s 2>&1 |
>> FileCheck %s
>>
>>  // CHECK: symbol '__ImageBase' can not be undefined in a subtraction
>> expression
>> +// CHECK: symbol '__ImageBase' can not be undefined in a subtraction
>> expression
>>
>>          .data
>>  _x:
>>          .long   _x-__ImageBase
>> +        .long   __ImageBase-_x
>>
>> Modified: llvm/trunk/test/MC/COFF/invalid-def.s
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/COFF/invalid-def.s?rev=253328&r1=253327&r2=253328&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/test/MC/COFF/invalid-def.s (original)
>> +++ llvm/trunk/test/MC/COFF/invalid-def.s Tue Nov 17 04:00:43 2015
>> @@ -1,5 +1,8 @@
>> -# RUN: not llvm-mc -triple i686-windows -filetype obj -o /dev/null %s
>> +# RUN: not llvm-mc -triple i686-windows -filetype obj -o /dev/null %s
>> 2>&1 | FileCheck %s
>>
>> +# CHECK: error: starting a new symbol definition without completing the
>> previous one
>> +# CHECK: error: starting a new symbol definition without completing the
>> previous one
>>         .def first
>>         .def second
>> +       .def third
>>
>>
>> Modified: llvm/trunk/test/MC/COFF/invalid-endef.s
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/COFF/invalid-endef.s?rev=253328&r1=253327&r2=253328&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/test/MC/COFF/invalid-endef.s (original)
>> +++ llvm/trunk/test/MC/COFF/invalid-endef.s Tue Nov 17 04:00:43 2015
>> @@ -1,4 +1,7 @@
>> -# RUN: not llvm-mc -triple i686-windows -filetype obj -o /dev/null %s
>> +# RUN: not llvm-mc -triple i686-windows -filetype obj -o /dev/null %s
>> 2>&1 | FileCheck %s
>>
>> +# CHECK: ending symbol definition without starting one
>> +# CHECK: ending symbol definition without starting one
>> +       .endef
>>         .endef
>>
>>
>> Modified: llvm/trunk/test/MC/COFF/invalid-scl-range.s
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/COFF/invalid-scl-range.s?rev=253328&r1=253327&r2=253328&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/test/MC/COFF/invalid-scl-range.s (original)
>> +++ llvm/trunk/test/MC/COFF/invalid-scl-range.s Tue Nov 17 04:00:43 2015
>> @@ -1,6 +1,9 @@
>>  # RUN: not llvm-mc -triple i686-windows -filetype obj -o /dev/null %s
>>
>>         .def storage_class_range
>> +# CHECK: storage class value '1337' out of range
>> +# CHECK: storage class value '9001' out of range
>>                 .scl 1337
>> +               .scl 9001
>>         .endef
>>
>>
>> Modified: llvm/trunk/test/MC/COFF/invalid-scl.s
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/COFF/invalid-scl.s?rev=253328&r1=253327&r2=253328&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/test/MC/COFF/invalid-scl.s (original)
>> +++ llvm/trunk/test/MC/COFF/invalid-scl.s Tue Nov 17 04:00:43 2015
>> @@ -1,4 +1,7 @@
>> -# RUN: not llvm-mc -triple i686-windows -filetype obj -o /dev/null %s
>> +# RUN: not llvm-mc -triple i686-windows -filetype obj -o /dev/null %s
>> 2>&1 | FileCheck %s
>>
>> +# CHECK: storage class specified outside of symbol definition
>> +# CHECK: storage class specified outside of symbol definition
>> +       .scl 1337
>>         .scl 1337
>>
>>
>> Modified: llvm/trunk/test/MC/COFF/invalid-type.s
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/COFF/invalid-type.s?rev=253328&r1=253327&r2=253328&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/test/MC/COFF/invalid-type.s (original)
>> +++ llvm/trunk/test/MC/COFF/invalid-type.s Tue Nov 17 04:00:43 2015
>> @@ -1,4 +1,7 @@
>> -# RUN: not llvm-mc -triple i686-windows -filetype obj -o /dev/null %s
>> +# RUN: not llvm-mc -triple i686-windows -filetype obj -o /dev/null %s
>> 2>&1 | FileCheck %s
>>
>> +# CHECK: symbol type specified outside of a symbol definition
>> +# CHECK: symbol type specified outside of a symbol definition
>>         .type 65536
>> +       .type 65537
>>
>>
>> Modified: llvm/trunk/test/MC/COFF/label-undefined.s
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/COFF/label-undefined.s?rev=253328&r1=253327&r2=253328&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/test/MC/COFF/label-undefined.s (original)
>> +++ llvm/trunk/test/MC/COFF/label-undefined.s Tue Nov 17 04:00:43 2015
>> @@ -1,4 +1,6 @@
>>  // RUN: not llvm-mc -filetype=obj -triple i386-pc-win32 %s 2>&1 |
>> FileCheck %s
>>  // CHECK: assembler label 'Lundefined' can not be undefined
>> +// CHECK: assembler label 'Lundefined2' can not be undefined
>>          .text
>>          movl Lundefined, %eax
>> +        movl Lundefined2, %eax
>>
>> Modified: llvm/trunk/test/MC/COFF/secidx-diagnostic.s
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/COFF/secidx-diagnostic.s?rev=253328&r1=253327&r2=253328&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/test/MC/COFF/secidx-diagnostic.s (original)
>> +++ llvm/trunk/test/MC/COFF/secidx-diagnostic.s Tue Nov 17 04:00:43 2015
>> @@ -2,7 +2,9 @@
>>  // RUN: FileCheck %s < %t
>>
>>  // CHECK: symbol 'bar' can not be undefined
>> +// CHECK: symbol 'baz' can not be undefined
>>
>>  .data
>>  foo:
>>          .secidx bar
>> +        .secidx baz
>>
>> Modified: llvm/trunk/test/MC/ELF/common-error1.s
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ELF/common-error1.s?rev=253328&r1=253327&r2=253328&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/test/MC/ELF/common-error1.s (original)
>> +++ llvm/trunk/test/MC/ELF/common-error1.s Tue Nov 17 04:00:43 2015
>> @@ -3,4 +3,4 @@
>>          .comm   C,4,4
>>          .set    A,C
>>
>> -// CHECK: Common symbol C cannot be used in assignment expr
>> +// CHECK: Common symbol 'C' cannot be used in assignment expr
>>
>> Modified: llvm/trunk/test/MC/ELF/common-error2.s
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ELF/common-error2.s?rev=253328&r1=253327&r2=253328&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/test/MC/ELF/common-error2.s (original)
>> +++ llvm/trunk/test/MC/ELF/common-error2.s Tue Nov 17 04:00:43 2015
>> @@ -3,4 +3,4 @@
>>          .set    A,C
>>          .comm   C,4,4
>>
>> -// CHECK: Common symbol C cannot be used in assignment expr
>> +// CHECK: Common symbol 'C' cannot be used in assignment expr
>>
>> Added: llvm/trunk/test/MC/MachO/AArch64/reloc-errors.s
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/MachO/AArch64/reloc-errors.s?rev=253328&view=auto
>>
>> ==============================================================================
>> --- llvm/trunk/test/MC/MachO/AArch64/reloc-errors.s (added)
>> +++ llvm/trunk/test/MC/MachO/AArch64/reloc-errors.s Tue Nov 17 04:00:43
>> 2015
>> @@ -0,0 +1,10 @@
>> +; RUN: not llvm-mc -triple aarch64-none-macho %s -filetype=obj -o - 2>&1
>> | FileCheck %s
>> +
>> +; CHECK: error: conditional branch requires assembler-local label.
>> 'external' is external.
>> +  b.eq external
>> +
>> +; CHECK: error: Invalid relocation on conditional branch
>> +  tbz w0, #4, external
>> +
>> +; CHECK: error: unknown AArch64 fixup kind!
>> +  adr x0, external
>>
>> Modified: llvm/trunk/test/MC/MachO/ARM/bad-darwin-ARM-reloc.s
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/MachO/ARM/bad-darwin-ARM-reloc.s?rev=253328&r1=253327&r2=253328&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/test/MC/MachO/ARM/bad-darwin-ARM-reloc.s (original)
>> +++ llvm/trunk/test/MC/MachO/ARM/bad-darwin-ARM-reloc.s Tue Nov 17
>> 04:00:43 2015
>> @@ -7,3 +7,9 @@
>>  L___fcommon:
>>      .word 0
>>  @ CHECK-ERROR: unsupported relocation on symbol
>> +
>> +c:
>> +  .word a - b
>> +@ CHECK-ERROR: symbol 'a' can not be undefined in a subtraction
>> expression
>> +  .word c - b
>> +@ CHECK-ERROR: symbol 'b' can not be undefined in a subtraction
>> expression
>>
>> Modified: llvm/trunk/test/MC/MachO/bad-darwin-x86_64-diff-relocs.s
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/MachO/bad-darwin-x86_64-diff-relocs.s?rev=253328&r1=253327&r2=253328&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/test/MC/MachO/bad-darwin-x86_64-diff-relocs.s (original)
>> +++ llvm/trunk/test/MC/MachO/bad-darwin-x86_64-diff-relocs.s Tue Nov 17
>> 04:00:43 2015
>> @@ -2,4 +2,12 @@
>>  // RUN: FileCheck --check-prefix=CHECK-ERROR < %t.err %s
>>
>>  .quad _foo - _bar
>> -// CHECK-ERROR: unsupported relocation with subtraction expression
>> +// CHECK-ERROR: error: unsupported relocation with subtraction expression
>> +
>> +_Y:
>> +.long (_Y+4)-_b
>> +// CHECK-ERROR: error: unsupported relocation with subtraction
>> expression, symbol '_b' can not be undefined in a subtraction expression
>> +
>> +_Z:
>> +.long (_a+4)-_Z
>> +// CHECK-ERROR: error: unsupported relocation with subtraction
>> expression, symbol '_a' can not be undefined in a subtraction expression
>>
>> Removed: llvm/trunk/test/MC/MachO/bad-darwin-x86_64-reloc-expr1.s
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/MachO/bad-darwin-x86_64-reloc-expr1.s?rev=253327&view=auto
>>
>> ==============================================================================
>> --- llvm/trunk/test/MC/MachO/bad-darwin-x86_64-reloc-expr1.s (original)
>> +++ llvm/trunk/test/MC/MachO/bad-darwin-x86_64-reloc-expr1.s (removed)
>> @@ -1,6 +0,0 @@
>> -// RUN: not llvm-mc -triple x86_64-apple-darwin10 %s -filetype=obj -o -
>> 2> %t.err > %t
>> -// RUN: FileCheck --check-prefix=CHECK-ERROR < %t.err %s
>> -
>> -_Z:
>> -.long (_Z+4)-_b
>> -// CHECK-ERROR: error: unsupported relocation with subtraction
>> expression, symbol '_b' can not be undefined in a subtraction expression
>>
>> Removed: llvm/trunk/test/MC/MachO/bad-darwin-x86_64-reloc-expr2.s
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/MachO/bad-darwin-x86_64-reloc-expr2.s?rev=253327&view=auto
>>
>> ==============================================================================
>> --- llvm/trunk/test/MC/MachO/bad-darwin-x86_64-reloc-expr2.s (original)
>> +++ llvm/trunk/test/MC/MachO/bad-darwin-x86_64-reloc-expr2.s (removed)
>> @@ -1,6 +0,0 @@
>> -// RUN: not llvm-mc -triple x86_64-apple-darwin10 %s -filetype=obj -o -
>> 2> %t.err > %t
>> -// RUN: FileCheck --check-prefix=CHECK-ERROR < %t.err %s
>> -
>> -_Z:
>> -.long (_a+4)-_Z
>> -// CHECK-ERROR: error: unsupported relocation with subtraction
>> expression, symbol '_a' can not be undefined in a subtraction expression
>>
>> Modified: llvm/trunk/test/MC/Mips/micromips-diagnostic-fixup.s
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/Mips/micromips-diagnostic-fixup.s?rev=253328&r1=253327&r2=253328&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/test/MC/Mips/micromips-diagnostic-fixup.s (original)
>> +++ llvm/trunk/test/MC/Mips/micromips-diagnostic-fixup.s Tue Nov 17
>> 04:00:43 2015
>> @@ -1,9 +1,12 @@
>>  # RUN: not llvm-mc %s -triple=mipsel-unknown-linux -mcpu=mips32r2
>> -arch=mips -mattr=+micromips 2>&1 -filetype=obj | FileCheck %s
>> -#
>> +
>> +# Two instructions, to check that this is not a fatal error
>> +# CHECK: error: out of range PC16 fixup
>>  # CHECK: error: out of range PC16 fixup
>>
>>  .text
>>    b foo
>> +  b foo
>>    .space 65536 - 6, 1   # -6 = size of b instr plus size of
>> automatically inserted nop
>>    nop                   # This instr makes the branch too long to fit
>> into a 17-bit offset
>>  foo:
>>
>> Modified: llvm/trunk/test/MC/Mips/micromips-pc16-fixup.s
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/Mips/micromips-pc16-fixup.s?rev=253328&r1=253327&r2=253328&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/test/MC/Mips/micromips-pc16-fixup.s (original)
>> +++ llvm/trunk/test/MC/Mips/micromips-pc16-fixup.s Tue Nov 17 04:00:43
>> 2015
>> @@ -1,6 +1,6 @@
>>  # RUN: llvm-mc %s -triple=mips-unknown-linux -mcpu=mips32r2 -arch=mips
>> -mattr=+micromips 2>&1 -filetype=obj | FileCheck %s
>>  #
>> -# CHECK-NOT: LLVM ERROR: out of range PC16 fixup
>> +# CHECK-NOT: error: out of range PC16 fixup
>>
>>  .text
>>    b foo
>>
>> Modified: llvm/trunk/test/MC/Mips/mips-diagnostic-fixup.s
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/Mips/mips-diagnostic-fixup.s?rev=253328&r1=253327&r2=253328&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/test/MC/Mips/mips-diagnostic-fixup.s (original)
>> +++ llvm/trunk/test/MC/Mips/mips-diagnostic-fixup.s Tue Nov 17 04:00:43
>> 2015
>> @@ -1,9 +1,12 @@
>>  # RUN: not llvm-mc %s -triple=mipsel-unknown-linux -mcpu=mips32r2
>> -arch=mips 2>&1 -filetype=obj | FileCheck %s
>> -#
>> +
>> +# Two instructions, to check that this is not a fatal error
>> +# CHECK: error: out of range PC16 fixup
>>  # CHECK: error: out of range PC16 fixup
>>
>>  .text
>>    b foo
>> +  b foo
>>    .space 131072 - 8, 1  # -8 = size of b instr plus size of
>> automatically inserted nop
>>    nop                   # This instr makes the branch too long to fit
>> into a 18-bit offset
>>  foo:
>>
>> Modified: llvm/trunk/test/MC/Mips/mips-pc16-fixup.s
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/Mips/mips-pc16-fixup.s?rev=253328&r1=253327&r2=253328&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/test/MC/Mips/mips-pc16-fixup.s (original)
>> +++ llvm/trunk/test/MC/Mips/mips-pc16-fixup.s Tue Nov 17 04:00:43 2015
>> @@ -1,6 +1,6 @@
>>  # RUN: llvm-mc %s -triple=mips-unknown-linux -mcpu=mips32r2 -arch=mips
>> 2>&1 -filetype=obj | FileCheck %s
>>  #
>> -# CHECK-NOT: LLVM ERROR: out of range PC16 fixup
>> +# CHECK-NOT: error: out of range PC16 fixup
>>
>>  .text
>>    b foo
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20151118/55b9becb/attachment.html>


More information about the llvm-commits mailing list