Index: src/arm/assembler-thumb2-inl.h |
=================================================================== |
--- src/arm/assembler-thumb2-inl.h (revision 3836) |
+++ src/arm/assembler-thumb2-inl.h (working copy) |
@@ -174,20 +174,6 @@ |
} |
-Operand::Operand(Object** opp) { |
- rm_ = no_reg; |
- imm32_ = reinterpret_cast<int32_t>(opp); |
- rmode_ = RelocInfo::NONE; |
-} |
- |
- |
-Operand::Operand(Context** cpp) { |
- rm_ = no_reg; |
- imm32_ = reinterpret_cast<int32_t>(cpp); |
- rmode_ = RelocInfo::NONE; |
-} |
- |
- |
Operand::Operand(Smi* value) { |
rm_ = no_reg; |
imm32_ = reinterpret_cast<intptr_t>(value); |
@@ -229,14 +215,24 @@ |
Address Assembler::target_address_address_at(Address pc) { |
- Instr instr = Memory::int32_at(pc); |
- // Verify that the instruction at pc is a ldr<cond> <Rd>, [pc +/- offset_12]. |
+ Address target_pc = pc; |
+ Instr instr = Memory::int32_at(target_pc); |
+ // If we have a bx instruction, the instruction before the bx is |
+ // what we need to patch. |
+ static const int32_t kBxInstMask = 0x0ffffff0; |
+ static const int32_t kBxInstPattern = 0x012fff10; |
+ if ((instr & kBxInstMask) == kBxInstPattern) { |
+ target_pc -= kInstrSize; |
+ instr = Memory::int32_at(target_pc); |
+ } |
+ // Verify that the instruction to patch is a |
+ // ldr<cond> <Rd>, [pc +/- offset_12]. |
ASSERT((instr & 0x0f7f0000) == 0x051f0000); |
int offset = instr & 0xfff; // offset_12 is unsigned |
if ((instr & (1 << 23)) == 0) offset = -offset; // U bit defines offset sign |
// Verify that the constant pool comes after the instruction referencing it. |
ASSERT(offset >= -4); |
- return pc + offset + 8; |
+ return target_pc + offset + 8; |
} |