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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@148424 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Jim Grosbach 2012-01-18 21:54:16 +00:00
parent ec4ceb797a
commit 256ba4f42a
2 changed files with 33 additions and 9 deletions

View File

@ -152,7 +152,8 @@ public:
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 @@ bool ARMAsmBackend::fixupNeedsRelaxation(const MCFixup &Fixup,
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 {

View File

@ -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')