summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp10
-rw-r--r--llvm/test/MC/ARM/thumb-branches-err.s7
-rw-r--r--llvm/test/MC/ARM/thumb-branches.s5
3 files changed, 9 insertions, 13 deletions
diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp
index fd678fb132e..7a0a089b35f 100644
--- a/llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp
+++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp
@@ -639,13 +639,11 @@ void ARMAsmBackend::processFixupValue(const MCAssembler &Asm,
// If the symbol is external the linker will handle it.
// FIXME: Should we handle it as an optimization?
- if (Sym->isExternal()) {
+
+ // If the symbol is out of range, produce a relocation and hope the
+ // linker can handle it. GNU AS produces an error in this case.
+ if (Sym->isExternal() || Value >= 0x400004)
IsResolved = false;
- } else {
- if (Value >= 0x400004)
- Asm.getContext().reportFatalError(Fixup.getLoc(),
- "out of range for branch");
- }
}
// We must always generate a relocation for BL/BLX instructions if we have
// a symbol to reference, as the linker relies on knowing the destination
diff --git a/llvm/test/MC/ARM/thumb-branches-err.s b/llvm/test/MC/ARM/thumb-branches-err.s
deleted file mode 100644
index 624ebeeb037..00000000000
--- a/llvm/test/MC/ARM/thumb-branches-err.s
+++ /dev/null
@@ -1,7 +0,0 @@
-@ RUN: not llvm-mc < %s -triple thumbv5-linux-gnueabi -filetype=obj -o %t 2>&1 | FileCheck %s
-
- bl end
- .space 0x400000
-end:
-
-@ CHECK: out of range for branch
diff --git a/llvm/test/MC/ARM/thumb-branches.s b/llvm/test/MC/ARM/thumb-branches.s
index 4870e821623..b4cdfa12a55 100644
--- a/llvm/test/MC/ARM/thumb-branches.s
+++ b/llvm/test/MC/ARM/thumb-branches.s
@@ -16,5 +16,10 @@ end2:
.global end3
end3:
+ bl end4
+ .space 0x400000
+end4:
+
@ CHECK: 0x400003 R_ARM_THM_CALL end2 0x0
@ CHECK: 0x800006 R_ARM_THM_CALL end3 0x0
+@ CHECK: 0xC0000A R_ARM_THM_CALL end4 0x0
OpenPOWER on IntegriCloud