diff options
author | Owen Anderson <resistor@mac.com> | 2010-12-09 01:51:07 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2010-12-09 01:51:07 +0000 |
commit | d7b3f5870d9d04351d9cd363d9d6af01482a2eb8 (patch) | |
tree | 1452f991c6291a4a897dfbbed367c91033e0b4f5 /lib/Target/ARM/ARMAsmBackend.cpp | |
parent | 766a63d20e89ad5a8b19aba2df0128c1f73174b3 (diff) | |
download | external_llvm-d7b3f5870d9d04351d9cd363d9d6af01482a2eb8.zip external_llvm-d7b3f5870d9d04351d9cd363d9d6af01482a2eb8.tar.gz external_llvm-d7b3f5870d9d04351d9cd363d9d6af01482a2eb8.tar.bz2 |
Fix Thumb2 fixups for ldr.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@121350 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/ARM/ARMAsmBackend.cpp')
-rw-r--r-- | lib/Target/ARM/ARMAsmBackend.cpp | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/lib/Target/ARM/ARMAsmBackend.cpp b/lib/Target/ARM/ARMAsmBackend.cpp index e2a23ac..0f96d61 100644 --- a/lib/Target/ARM/ARMAsmBackend.cpp +++ b/lib/Target/ARM/ARMAsmBackend.cpp @@ -98,16 +98,28 @@ static unsigned adjustFixupValue(unsigned Kind, uint64_t Value) { Value = (Hi4 << 16) | (Lo12); return Value; } - case ARM::fixup_arm_ldst_pcrel_12: { - bool isAdd = true; + case ARM::fixup_arm_ldst_pcrel_12: // ARM PC-relative values are offset by 8. - Value -= 8; + Value -= 6; + case ARM::fixup_t2_ldst_pcrel_12: { + // Offset by 4, adjusted by two due to the half-word ordering of thumb. + Value -= 2; + bool isAdd = true; if ((int64_t)Value < 0) { Value = -Value; isAdd = false; } assert ((Value < 4096) && "Out of range pc-relative fixup value!"); Value |= isAdd << 23; + + // Same addressing mode as fixup_arm_pcrel_10, + // but with 16-bit halfwords swapped. + if (Kind == ARM::fixup_t2_ldst_pcrel_12) { + uint64_t swapped = (Value & 0xFFFF0000) >> 16; + swapped |= (Value & 0x0000FFFF) << 16; + return swapped; + } + return Value; } case ARM::fixup_arm_adr_pcrel_12: { @@ -128,7 +140,7 @@ static unsigned adjustFixupValue(unsigned Kind, uint64_t Value) { // Offset by 8 just as above. return 0xffffff & ((Value - 8) >> 2); case ARM::fixup_t2_branch: { - Value = Value - 6; + Value = Value - 8; Value >>= 1; // Low bit is not encoded. uint64_t out = 0; @@ -310,6 +322,7 @@ static unsigned getFixupKindNumBytes(unsigned Kind) { return 3; case FK_Data_4: + case ARM::fixup_t2_ldst_pcrel_12: case ARM::fixup_t2_branch: case ARM::fixup_t2_pcrel_10: case ARM::fixup_arm_thumb_bl: |