Index: src/arm/assembler-arm.h |
=================================================================== |
--- src/arm/assembler-arm.h (revision 2877) |
+++ src/arm/assembler-arm.h (working copy) |
@@ -376,6 +376,10 @@ |
typedef int32_t Instr; |
+extern const Instr kMovLrPc; |
+extern const Instr kLdrPCPattern; |
+ |
+ |
class Assembler : public Malloced { |
public: |
// Create an assembler. Instructions and relocation information are emitted |
@@ -433,12 +437,16 @@ |
INLINE(static Address target_address_at(Address pc)); |
INLINE(static void set_target_address_at(Address pc, Address target)); |
+ // Size of an instruction. |
+ static const int kInstrSize = sizeof(Instr); |
+ |
// Distance between the instruction referring to the address of the call |
// target (ldr pc, [target addr in const pool]) and the return address |
- static const int kCallTargetAddressOffset = sizeof(Instr); |
+ static const int kCallTargetAddressOffset = kInstrSize; |
+ |
// Distance between start of patched return sequence and the emitted address |
// to jump to. |
- static const int kPatchReturnSequenceAddressOffset = 1; |
+ static const int kPatchReturnSequenceAddressOffset = kInstrSize; |
// Difference between address of current opcode and value read from pc |
// register. |
@@ -652,9 +660,16 @@ |
// Jump unconditionally to given label. |
void jmp(Label* L) { b(L, al); } |
+ // Check the code size generated from label to here. |
+ int InstructionsGeneratedSince(Label* l) { |
+ return (pc_offset() - l->pos()) / kInstrSize; |
+ } |
// Debugging |
+ // Mark address of the ExitJSFrame code. |
+ void RecordJSReturn(); |
+ |
// Record a comment relocation entry that can be used by a disassembler. |
// Use --debug_code to enable. |
void RecordComment(const char* msg); |
@@ -671,7 +686,7 @@ |
int buffer_space() const { return reloc_info_writer.pos() - pc_; } |
// Read/patch instructions |
- Instr instr_at(byte* pc) { return *reinterpret_cast<Instr*>(pc); } |
+ static Instr instr_at(byte* pc) { return *reinterpret_cast<Instr*>(pc); } |
void instr_at_put(byte* pc, Instr instr) { |
*reinterpret_cast<Instr*>(pc) = instr; |
} |
@@ -708,7 +723,6 @@ |
int next_buffer_check_; // pc offset of next buffer check |
// Code generation |
- static const int kInstrSize = sizeof(Instr); // signed size |
// The relocation writer's position is at least kGap bytes below the end of |
// the generated instructions. This is so that multi-instruction sequences do |
// not have to check for overflow. The same is true for writes of large |
@@ -795,6 +809,8 @@ |
void RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data = 0); |
friend class RegExpMacroAssemblerARM; |
+ friend class RelocInfo; |
+ friend class CodePatcher; |
}; |
} } // namespace v8::internal |