[MCJIT] Take the relocation addend into account when applying ARM MachO VANILLA

and BR24 relocations.

<rdar://problem/18296496>

llvm-svn: 217605
This commit is contained in:
Lang Hames 2014-09-11 17:27:01 +00:00
parent eb7c1a6e50
commit 4669cd08a7
2 changed files with 5 additions and 1 deletions

View File

@ -101,12 +101,13 @@ public:
default: default:
llvm_unreachable("Invalid relocation type!"); llvm_unreachable("Invalid relocation type!");
case MachO::ARM_RELOC_VANILLA: case MachO::ARM_RELOC_VANILLA:
writeBytesUnaligned(Value, LocalAddress, 1 << RE.Size); writeBytesUnaligned(Value + RE.Addend, LocalAddress, 1 << RE.Size);
break; break;
case MachO::ARM_RELOC_BR24: { case MachO::ARM_RELOC_BR24: {
// Mask the value into the target address. We know instructions are // Mask the value into the target address. We know instructions are
// 32-bit aligned, so we can do it all at once. // 32-bit aligned, so we can do it all at once.
uint32_t *p = (uint32_t *)LocalAddress; uint32_t *p = (uint32_t *)LocalAddress;
Value += RE.Addend;
// The low two bits of the value are not encoded. // The low two bits of the value are not encoded.
Value >>= 2; Value >>= 2;
// Mask the value to 24 bits. // Mask the value to 24 bits.

View File

@ -34,6 +34,9 @@ insn3:
foo: foo:
bx lr bx lr
# Add 'aaa' to the common symbols to make sure 'baz' isn't at the start of the
# section. This ensures that we test VANILLA relocation addends correctly.
.comm aaa, 4, 2
.comm baz, 4, 2 .comm baz, 4, 2
.subsections_via_symbols .subsections_via_symbols