| Index: src/x64/assembler-x64.h
|
| ===================================================================
|
| --- src/x64/assembler-x64.h (revision 3020)
|
| +++ src/x64/assembler-x64.h (working copy)
|
| @@ -440,18 +440,26 @@
|
| // Assembler functions are invoked in between GetCode() calls.
|
| void GetCode(CodeDesc* desc);
|
|
|
| - // Read/Modify the code target in the branch/call instruction at pc.
|
| - // On the x64 architecture, the address is absolute, not relative.
|
| + // Read/Modify the code target in the relative branch/call instruction at pc.
|
| + // On the x64 architecture, we use relative jumps with a 32-bit displacement
|
| + // to jump to other Code objects in the Code space in the heap.
|
| + // Jumps to C functions are done indirectly through a 64-bit register holding
|
| + // the absolute address of the target.
|
| + // These functions convert between absolute Addresses of Code objects and
|
| + // the relative displacements stored in the code.
|
| static inline Address target_address_at(Address pc);
|
| static inline void set_target_address_at(Address pc, Address target);
|
| -
|
| + inline Handle<Object> code_target_object_handle_at(Address pc);
|
| // Distance between the address of the code target in the call instruction
|
| - // and the return address. Checked in the debug build.
|
| - static const int kCallTargetAddressOffset = 3 + kPointerSize;
|
| - // Distance between start of patched return sequence and the emitted address
|
| - // to jump to (movq = REX.W 0xB8+r.).
|
| - static const int kPatchReturnSequenceAddressOffset = 2;
|
| -
|
| + // and the return address pushed on the stack.
|
| + static const int kCallTargetAddressOffset = 4; // Use 32-bit displacement.
|
| + // Distance between the start of the JS return sequence and where the
|
| + // 32-bit displacement of a near call would be, relative to the pushed
|
| + // return address. TODO: Use return sequence length instead.
|
| + // Should equal Debug::kX64JSReturnSequenceLength - kCallTargetAddressOffset;
|
| + static const int kPatchReturnSequenceAddressOffset = 13 - 4;
|
| + // TODO(X64): Rename this, removing the "Real", after changing the above.
|
| + static const int kRealPatchReturnSequenceAddressOffset = 2;
|
| // ---------------------------------------------------------------------------
|
| // Code generation
|
| //
|
| @@ -923,6 +931,7 @@
|
| // Calls
|
| // Call near relative 32-bit displacement, relative to next instruction.
|
| void call(Label* L);
|
| + void call(Handle<Code> target, RelocInfo::Mode rmode);
|
|
|
| // Call near absolute indirect, address in register
|
| void call(Register adr);
|
| @@ -932,7 +941,9 @@
|
|
|
| // Jumps
|
| // Jump short or near relative.
|
| + // Use a 32-bit signed displacement.
|
| void jmp(Label* L); // unconditional jump to L
|
| + void jmp(Handle<Code> target, RelocInfo::Mode rmode);
|
|
|
| // Jump near absolute indirect (r64)
|
| void jmp(Register adr);
|
| @@ -942,6 +953,7 @@
|
|
|
| // Conditional jumps
|
| void j(Condition cc, Label* L);
|
| + void j(Condition cc, Handle<Code> target, RelocInfo::Mode rmode);
|
|
|
| // Floating-point operations
|
| void fld(int i);
|
| @@ -1047,14 +1059,6 @@
|
| void RecordStatementPosition(int pos);
|
| void WriteRecordedPositions();
|
|
|
| - // Writes a doubleword of data in the code stream.
|
| - // Used for inline tables, e.g., jump-tables.
|
| - // void dd(uint32_t data);
|
| -
|
| - // Writes a quadword of data in the code stream.
|
| - // Used for inline tables, e.g., jump-tables.
|
| - // void dd(uint64_t data, RelocInfo::Mode reloc_info);
|
| -
|
| int pc_offset() const { return pc_ - buffer_; }
|
| int current_statement_position() const { return current_statement_position_; }
|
| int current_position() const { return current_position_; }
|
| @@ -1096,9 +1100,9 @@
|
|
|
| void emit(byte x) { *pc_++ = x; }
|
| inline void emitl(uint32_t x);
|
| - inline void emit(Handle<Object> handle);
|
| inline void emitq(uint64_t x, RelocInfo::Mode rmode);
|
| inline void emitw(uint16_t x);
|
| + inline void emit_code_target(Handle<Code> target, RelocInfo::Mode rmode);
|
| void emit(Immediate x) { emitl(x.value_); }
|
|
|
| // Emits a REX prefix that encodes a 64-bit operand size and
|
| @@ -1276,6 +1280,7 @@
|
| byte* pc_; // the program counter; moves forward
|
| RelocInfoWriter reloc_info_writer;
|
|
|
| + List< Handle<Code> > code_targets_;
|
| // push-pop elimination
|
| byte* last_pc_;
|
|
|
|
|