OLD | NEW |
1 // Copyright (c) 1994-2006 Sun Microsystems Inc. | 1 // Copyright (c) 1994-2006 Sun Microsystems Inc. |
2 // All Rights Reserved. | 2 // All Rights Reserved. |
3 // | 3 // |
4 // Redistribution and use in source and binary forms, with or without | 4 // Redistribution and use in source and binary forms, with or without |
5 // modification, are permitted provided that the following conditions are | 5 // modification, are permitted provided that the following conditions are |
6 // met: | 6 // met: |
7 // | 7 // |
8 // - Redistributions of source code must retain the above copyright notice, | 8 // - Redistributions of source code must retain the above copyright notice, |
9 // this list of conditions and the following disclaimer. | 9 // this list of conditions and the following disclaimer. |
10 // | 10 // |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 // absolute code pointer inside code object moves with the code object. | 78 // absolute code pointer inside code object moves with the code object. |
79 int32_t* p = reinterpret_cast<int32_t*>(pc_); | 79 int32_t* p = reinterpret_cast<int32_t*>(pc_); |
80 *p += delta; // Relocate entry. | 80 *p += delta; // Relocate entry. |
81 CPU::FlushICache(p, sizeof(uint32_t)); | 81 CPU::FlushICache(p, sizeof(uint32_t)); |
82 } | 82 } |
83 } | 83 } |
84 | 84 |
85 | 85 |
86 Address RelocInfo::target_address() { | 86 Address RelocInfo::target_address() { |
87 ASSERT(IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_)); | 87 ASSERT(IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_)); |
88 return Assembler::target_address_at(pc_, host_); | 88 return Assembler::target_address_at(pc_); |
89 } | 89 } |
90 | 90 |
91 | 91 |
92 Address RelocInfo::target_address_address() { | 92 Address RelocInfo::target_address_address() { |
93 ASSERT(IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_) | 93 ASSERT(IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_) |
94 || rmode_ == EMBEDDED_OBJECT | 94 || rmode_ == EMBEDDED_OBJECT |
95 || rmode_ == EXTERNAL_REFERENCE); | 95 || rmode_ == EXTERNAL_REFERENCE); |
96 return reinterpret_cast<Address>(pc_); | 96 return reinterpret_cast<Address>(pc_); |
97 } | 97 } |
98 | 98 |
99 | 99 |
100 Address RelocInfo::constant_pool_entry_address() { | 100 Address RelocInfo::constant_pool_entry_address() { |
101 UNREACHABLE(); | 101 UNREACHABLE(); |
102 return NULL; | 102 return NULL; |
103 } | 103 } |
104 | 104 |
105 | 105 |
106 int RelocInfo::target_address_size() { | 106 int RelocInfo::target_address_size() { |
107 return Assembler::kSpecialTargetSize; | 107 return Assembler::kSpecialTargetSize; |
108 } | 108 } |
109 | 109 |
110 | 110 |
111 void RelocInfo::set_target_address(Address target, WriteBarrierMode mode) { | 111 void RelocInfo::set_target_address(Address target, WriteBarrierMode mode) { |
112 Assembler::set_target_address_at(pc_, host_, target); | 112 Assembler::set_target_address_at(pc_, target); |
113 ASSERT(IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_)); | 113 ASSERT(IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_)); |
114 if (mode == UPDATE_WRITE_BARRIER && host() != NULL && IsCodeTarget(rmode_)) { | 114 if (mode == UPDATE_WRITE_BARRIER && host() != NULL && IsCodeTarget(rmode_)) { |
115 Object* target_code = Code::GetCodeFromTargetAddress(target); | 115 Object* target_code = Code::GetCodeFromTargetAddress(target); |
116 host()->GetHeap()->incremental_marking()->RecordWriteIntoCode( | 116 host()->GetHeap()->incremental_marking()->RecordWriteIntoCode( |
117 host(), this, HeapObject::cast(target_code)); | 117 host(), this, HeapObject::cast(target_code)); |
118 } | 118 } |
119 } | 119 } |
120 | 120 |
121 | 121 |
122 Object* RelocInfo::target_object() { | 122 Object* RelocInfo::target_object() { |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
195 ASSERT(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); | 195 ASSERT(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); |
196 ASSERT(*pc_ == kCallOpcode); | 196 ASSERT(*pc_ == kCallOpcode); |
197 return Memory::Object_Handle_at(pc_ + 1); | 197 return Memory::Object_Handle_at(pc_ + 1); |
198 } | 198 } |
199 | 199 |
200 | 200 |
201 Code* RelocInfo::code_age_stub() { | 201 Code* RelocInfo::code_age_stub() { |
202 ASSERT(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); | 202 ASSERT(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); |
203 ASSERT(*pc_ == kCallOpcode); | 203 ASSERT(*pc_ == kCallOpcode); |
204 return Code::GetCodeFromTargetAddress( | 204 return Code::GetCodeFromTargetAddress( |
205 Assembler::target_address_at(pc_ + 1, host_)); | 205 Assembler::target_address_at(pc_ + 1)); |
206 } | 206 } |
207 | 207 |
208 | 208 |
209 void RelocInfo::set_code_age_stub(Code* stub) { | 209 void RelocInfo::set_code_age_stub(Code* stub) { |
210 ASSERT(*pc_ == kCallOpcode); | 210 ASSERT(*pc_ == kCallOpcode); |
211 ASSERT(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); | 211 ASSERT(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); |
212 Assembler::set_target_address_at(pc_ + 1, host_, stub->instruction_start()); | 212 Assembler::set_target_address_at(pc_ + 1, stub->instruction_start()); |
213 } | 213 } |
214 | 214 |
215 | 215 |
216 Address RelocInfo::call_address() { | 216 Address RelocInfo::call_address() { |
217 ASSERT((IsJSReturn(rmode()) && IsPatchedReturnSequence()) || | 217 ASSERT((IsJSReturn(rmode()) && IsPatchedReturnSequence()) || |
218 (IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence())); | 218 (IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence())); |
219 return Assembler::target_address_at(pc_ + 1, host_); | 219 return Assembler::target_address_at(pc_ + 1); |
220 } | 220 } |
221 | 221 |
222 | 222 |
223 void RelocInfo::set_call_address(Address target) { | 223 void RelocInfo::set_call_address(Address target) { |
224 ASSERT((IsJSReturn(rmode()) && IsPatchedReturnSequence()) || | 224 ASSERT((IsJSReturn(rmode()) && IsPatchedReturnSequence()) || |
225 (IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence())); | 225 (IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence())); |
226 Assembler::set_target_address_at(pc_ + 1, host_, target); | 226 Assembler::set_target_address_at(pc_ + 1, target); |
227 if (host() != NULL) { | 227 if (host() != NULL) { |
228 Object* target_code = Code::GetCodeFromTargetAddress(target); | 228 Object* target_code = Code::GetCodeFromTargetAddress(target); |
229 host()->GetHeap()->incremental_marking()->RecordWriteIntoCode( | 229 host()->GetHeap()->incremental_marking()->RecordWriteIntoCode( |
230 host(), this, HeapObject::cast(target_code)); | 230 host(), this, HeapObject::cast(target_code)); |
231 } | 231 } |
232 } | 232 } |
233 | 233 |
234 | 234 |
235 Object* RelocInfo::call_object() { | 235 Object* RelocInfo::call_object() { |
236 return *call_object_address(); | 236 return *call_object_address(); |
(...skipping 10 matching lines...) Expand all Loading... |
247 (IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence())); | 247 (IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence())); |
248 return reinterpret_cast<Object**>(pc_ + 1); | 248 return reinterpret_cast<Object**>(pc_ + 1); |
249 } | 249 } |
250 | 250 |
251 | 251 |
252 void RelocInfo::WipeOut() { | 252 void RelocInfo::WipeOut() { |
253 if (IsEmbeddedObject(rmode_) || IsExternalReference(rmode_)) { | 253 if (IsEmbeddedObject(rmode_) || IsExternalReference(rmode_)) { |
254 Memory::Address_at(pc_) = NULL; | 254 Memory::Address_at(pc_) = NULL; |
255 } else if (IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_)) { | 255 } else if (IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_)) { |
256 // Effectively write zero into the relocation. | 256 // Effectively write zero into the relocation. |
257 Assembler::set_target_address_at(pc_, host_, pc_ + sizeof(int32_t)); | 257 Assembler::set_target_address_at(pc_, pc_ + sizeof(int32_t)); |
258 } else { | 258 } else { |
259 UNREACHABLE(); | 259 UNREACHABLE(); |
260 } | 260 } |
261 } | 261 } |
262 | 262 |
263 | 263 |
264 bool RelocInfo::IsPatchedReturnSequence() { | 264 bool RelocInfo::IsPatchedReturnSequence() { |
265 return *pc_ == kCallOpcode; | 265 return *pc_ == kCallOpcode; |
266 } | 266 } |
267 | 267 |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
438 | 438 |
439 | 439 |
440 void Assembler::emit_w(const Immediate& x) { | 440 void Assembler::emit_w(const Immediate& x) { |
441 ASSERT(RelocInfo::IsNone(x.rmode_)); | 441 ASSERT(RelocInfo::IsNone(x.rmode_)); |
442 uint16_t value = static_cast<uint16_t>(x.x_); | 442 uint16_t value = static_cast<uint16_t>(x.x_); |
443 reinterpret_cast<uint16_t*>(pc_)[0] = value; | 443 reinterpret_cast<uint16_t*>(pc_)[0] = value; |
444 pc_ += sizeof(uint16_t); | 444 pc_ += sizeof(uint16_t); |
445 } | 445 } |
446 | 446 |
447 | 447 |
448 Address Assembler::target_address_at(Address pc, | 448 Address Assembler::target_address_at(Address pc) { |
449 ConstantPoolArray* constant_pool) { | |
450 return pc + sizeof(int32_t) + *reinterpret_cast<int32_t*>(pc); | 449 return pc + sizeof(int32_t) + *reinterpret_cast<int32_t*>(pc); |
451 } | 450 } |
452 | 451 |
453 | 452 |
454 void Assembler::set_target_address_at(Address pc, | 453 void Assembler::set_target_address_at(Address pc, Address target) { |
455 ConstantPoolArray* constant_pool, | |
456 Address target) { | |
457 int32_t* p = reinterpret_cast<int32_t*>(pc); | 454 int32_t* p = reinterpret_cast<int32_t*>(pc); |
458 *p = target - (pc + sizeof(int32_t)); | 455 *p = target - (pc + sizeof(int32_t)); |
459 CPU::FlushICache(p, sizeof(int32_t)); | 456 CPU::FlushICache(p, sizeof(int32_t)); |
460 } | 457 } |
461 | 458 |
462 | 459 |
463 Address Assembler::target_address_from_return_address(Address pc) { | 460 Address Assembler::target_address_from_return_address(Address pc) { |
464 return pc - kCallTargetAddressOffset; | 461 return pc - kCallTargetAddressOffset; |
465 } | 462 } |
466 | 463 |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
539 | 536 |
540 Operand::Operand(int32_t disp, RelocInfo::Mode rmode) { | 537 Operand::Operand(int32_t disp, RelocInfo::Mode rmode) { |
541 // [disp/r] | 538 // [disp/r] |
542 set_modrm(0, ebp); | 539 set_modrm(0, ebp); |
543 set_dispr(disp, rmode); | 540 set_dispr(disp, rmode); |
544 } | 541 } |
545 | 542 |
546 } } // namespace v8::internal | 543 } } // namespace v8::internal |
547 | 544 |
548 #endif // V8_IA32_ASSEMBLER_IA32_INL_H_ | 545 #endif // V8_IA32_ASSEMBLER_IA32_INL_H_ |
OLD | NEW |