[llvm-commits] [llvm] r148424 - in /llvm/trunk: lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp test/MC/MachO/ARM/relax-thumb-ldr-literal.s
Jim Grosbach
grosbach at apple.com
Wed Jan 18 13:54:17 PST 2012
Author: grosbach
Date: Wed Jan 18 15:54:16 2012
New Revision: 148424
URL: http://llvm.org/viewvc/llvm-project?rev=148424&view=rev
Log:
Thumb2 relaxation for LDR(literal).
If the fixup is out of range for the Thumb1 instruction, relax it
to the Thumb2 encoding instead.
rdar://10711829
Added:
llvm/trunk/test/MC/MachO/ARM/relax-thumb-ldr-literal.s
Modified:
llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp
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=148424&r1=148423&r2=148424&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp (original)
+++ llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp Wed Jan 18 15:54:16 2012
@@ -152,7 +152,8 @@
static unsigned getRelaxedOpcode(unsigned Op) {
switch (Op) {
default: return Op;
- case ARM::tBcc: return ARM::t2Bcc;
+ case ARM::tBcc: return ARM::t2Bcc;
+ case ARM::tLDRpciASM: return ARM::t2LDRpci;
}
}
@@ -166,14 +167,24 @@
uint64_t Value,
const MCInstFragment *DF,
const MCAsmLayout &Layout) const {
- // Relaxing tBcc to t2Bcc. tBcc has a signed 9-bit displacement with the
- // low bit being an implied zero. There's an implied +4 offset for the
- // branch, so we adjust the other way here to determine what's
- // encodable.
- //
- // Relax if the value is too big for a (signed) i8.
- int64_t Offset = int64_t(Value) - 4;
- return Offset > 254 || Offset < -256;
+ switch (Fixup.getKind()) {
+ default: assert(0 && "Unexpected fixup kind in fixupNeedsRelaxation()!");
+ case ARM::fixup_arm_thumb_bcc: {
+ // Relaxing tBcc to t2Bcc. tBcc has a signed 9-bit displacement with the
+ // low bit being an implied zero. There's an implied +4 offset for the
+ // branch, so we adjust the other way here to determine what's
+ // encodable.
+ //
+ // Relax if the value is too big for a (signed) i8.
+ int64_t Offset = int64_t(Value) - 4;
+ return Offset > 254 || Offset < -256;
+ }
+ case ARM::fixup_arm_thumb_cp: {
+ int64_t Offset = int64_t(Value) - 4;
+ return Offset > 4095 || Offset < 0;
+ }
+ }
+ llvm_unreachable("Invalid switch/cash!?");
}
void ARMAsmBackend::relaxInstruction(const MCInst &Inst, MCInst &Res) const {
Added: llvm/trunk/test/MC/MachO/ARM/relax-thumb-ldr-literal.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/MachO/ARM/relax-thumb-ldr-literal.s?rev=148424&view=auto
==============================================================================
--- llvm/trunk/test/MC/MachO/ARM/relax-thumb-ldr-literal.s (added)
+++ llvm/trunk/test/MC/MachO/ARM/relax-thumb-ldr-literal.s Wed Jan 18 15:54:16 2012
@@ -0,0 +1,13 @@
+@ RUN: llvm-mc -n -triple thumbv7-apple-darwin10 %s -filetype=obj -o %t.obj
+@ RUN: macho-dump --dump-section-data < %t.obj > %t.dump
+@ RUN: FileCheck < %t.dump %s
+
+ .syntax unified
+ .text
+ .thumb
+ .thumb_func _foo
+_foo:
+ ldr r2, (_foo - 4)
+
+@ CHECK: ('num_reloc', 0)
+@ CHECK: ('_section_data', '5ff80820')
More information about the llvm-commits
mailing list