diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp index 4b4956e914f2..0ced8195790d 100644 --- a/llvm/lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp +++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp @@ -22,6 +22,8 @@ #include "llvm/MC/MCSection.h" #include "llvm/MC/MCValue.h" #include "llvm/Support/ErrorHandling.h" +#include "llvm/Support/ScopedPrinter.h" + using namespace llvm; namespace { @@ -144,6 +146,15 @@ RecordARMScatteredHalfRelocation(MachObjectWriter *Writer, MCValue Target, uint64_t &FixedValue) { uint32_t FixupOffset = Layout.getFragmentOffset(Fragment)+Fixup.getOffset(); + + if (FixupOffset & 0xff000000) { + Asm.getContext().reportError(Fixup.getLoc(), + "can not encode offset '0x" + + to_hexString(FixupOffset) + + "' in resulting scattered relocation."); + return; + } + unsigned IsPCRel = Writer->isFixupKindPCRel(Asm, Fixup.getKind()); unsigned Type = MachO::ARM_RELOC_HALF; @@ -250,6 +261,15 @@ void ARMMachObjectWriter::RecordARMScatteredRelocation(MachObjectWriter *Writer, unsigned Log2Size, uint64_t &FixedValue) { uint32_t FixupOffset = Layout.getFragmentOffset(Fragment)+Fixup.getOffset(); + + if (FixupOffset & 0xff000000) { + Asm.getContext().reportError(Fixup.getLoc(), + "can not encode offset '0x" + + to_hexString(FixupOffset) + + "' in resulting scattered relocation."); + return; + } + unsigned IsPCRel = Writer->isFixupKindPCRel(Asm, Fixup.getKind()); // See . diff --git a/llvm/test/MC/MachO/ARM/bad-darwin-ARM-offset-scattered.s b/llvm/test/MC/MachO/ARM/bad-darwin-ARM-offset-scattered.s new file mode 100644 index 000000000000..e5b279a8af7e --- /dev/null +++ b/llvm/test/MC/MachO/ARM/bad-darwin-ARM-offset-scattered.s @@ -0,0 +1,15 @@ +@ RUN: not llvm-mc -n -triple armv7-apple-darwin10 %s -filetype=obj -o - 2> %t.err > %t +@ RUN: FileCheck --check-prefix=CHECK-ERROR < %t.err %s + +.text +.space 0x1029eb8 + +fn: + movw r0, :lower16:(fn2-L1) + andeq r0, r0, r0 +L1: + andeq r0, r0, r0 + +fn2: + +@ CHECK-ERROR: error: can not encode offset '0x1029EB8' in resulting scattered relocation.