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_); | 88 return Assembler::target_address_at(pc_, host_); |
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 int RelocInfo::target_address_size() { | 100 int RelocInfo::target_address_size() { |
101 return Assembler::kSpecialTargetSize; | 101 return Assembler::kSpecialTargetSize; |
102 } | 102 } |
103 | 103 |
104 | 104 |
105 void RelocInfo::set_target_address(Address target, WriteBarrierMode mode) { | 105 void RelocInfo::set_target_address(Address target, WriteBarrierMode mode) { |
106 Assembler::set_target_address_at(pc_, target); | 106 Assembler::set_target_address_at(pc_, host_, target); |
107 ASSERT(IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_)); | 107 ASSERT(IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_)); |
108 if (mode == UPDATE_WRITE_BARRIER && host() != NULL && IsCodeTarget(rmode_)) { | 108 if (mode == UPDATE_WRITE_BARRIER && host() != NULL && IsCodeTarget(rmode_)) { |
109 Object* target_code = Code::GetCodeFromTargetAddress(target); | 109 Object* target_code = Code::GetCodeFromTargetAddress(target); |
110 host()->GetHeap()->incremental_marking()->RecordWriteIntoCode( | 110 host()->GetHeap()->incremental_marking()->RecordWriteIntoCode( |
111 host(), this, HeapObject::cast(target_code)); | 111 host(), this, HeapObject::cast(target_code)); |
112 } | 112 } |
113 } | 113 } |
114 | 114 |
115 | 115 |
116 Object* RelocInfo::target_object() { | 116 Object* RelocInfo::target_object() { |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
189 ASSERT(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); | 189 ASSERT(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); |
190 ASSERT(*pc_ == kCallOpcode); | 190 ASSERT(*pc_ == kCallOpcode); |
191 return Memory::Object_Handle_at(pc_ + 1); | 191 return Memory::Object_Handle_at(pc_ + 1); |
192 } | 192 } |
193 | 193 |
194 | 194 |
195 Code* RelocInfo::code_age_stub() { | 195 Code* RelocInfo::code_age_stub() { |
196 ASSERT(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); | 196 ASSERT(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); |
197 ASSERT(*pc_ == kCallOpcode); | 197 ASSERT(*pc_ == kCallOpcode); |
198 return Code::GetCodeFromTargetAddress( | 198 return Code::GetCodeFromTargetAddress( |
199 Assembler::target_address_at(pc_ + 1)); | 199 Assembler::target_address_at(pc_ + 1, host_)); |
200 } | 200 } |
201 | 201 |
202 | 202 |
203 void RelocInfo::set_code_age_stub(Code* stub) { | 203 void RelocInfo::set_code_age_stub(Code* stub) { |
204 ASSERT(*pc_ == kCallOpcode); | 204 ASSERT(*pc_ == kCallOpcode); |
205 ASSERT(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); | 205 ASSERT(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); |
206 Assembler::set_target_address_at(pc_ + 1, stub->instruction_start()); | 206 Assembler::set_target_address_at(pc_ + 1, host_, stub->instruction_start()); |
207 } | 207 } |
208 | 208 |
209 | 209 |
210 Address RelocInfo::call_address() { | 210 Address RelocInfo::call_address() { |
211 ASSERT((IsJSReturn(rmode()) && IsPatchedReturnSequence()) || | 211 ASSERT((IsJSReturn(rmode()) && IsPatchedReturnSequence()) || |
212 (IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence())); | 212 (IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence())); |
213 return Assembler::target_address_at(pc_ + 1); | 213 return Assembler::target_address_at(pc_ + 1, host_); |
214 } | 214 } |
215 | 215 |
216 | 216 |
217 void RelocInfo::set_call_address(Address target) { | 217 void RelocInfo::set_call_address(Address target) { |
218 ASSERT((IsJSReturn(rmode()) && IsPatchedReturnSequence()) || | 218 ASSERT((IsJSReturn(rmode()) && IsPatchedReturnSequence()) || |
219 (IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence())); | 219 (IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence())); |
220 Assembler::set_target_address_at(pc_ + 1, target); | 220 Assembler::set_target_address_at(pc_ + 1, host_, target); |
221 if (host() != NULL) { | 221 if (host() != NULL) { |
222 Object* target_code = Code::GetCodeFromTargetAddress(target); | 222 Object* target_code = Code::GetCodeFromTargetAddress(target); |
223 host()->GetHeap()->incremental_marking()->RecordWriteIntoCode( | 223 host()->GetHeap()->incremental_marking()->RecordWriteIntoCode( |
224 host(), this, HeapObject::cast(target_code)); | 224 host(), this, HeapObject::cast(target_code)); |
225 } | 225 } |
226 } | 226 } |
227 | 227 |
228 | 228 |
229 Object* RelocInfo::call_object() { | 229 Object* RelocInfo::call_object() { |
230 return *call_object_address(); | 230 return *call_object_address(); |
(...skipping 10 matching lines...) Expand all Loading... |
241 (IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence())); | 241 (IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence())); |
242 return reinterpret_cast<Object**>(pc_ + 1); | 242 return reinterpret_cast<Object**>(pc_ + 1); |
243 } | 243 } |
244 | 244 |
245 | 245 |
246 void RelocInfo::WipeOut() { | 246 void RelocInfo::WipeOut() { |
247 if (IsEmbeddedObject(rmode_) || IsExternalReference(rmode_)) { | 247 if (IsEmbeddedObject(rmode_) || IsExternalReference(rmode_)) { |
248 Memory::Address_at(pc_) = NULL; | 248 Memory::Address_at(pc_) = NULL; |
249 } else if (IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_)) { | 249 } else if (IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_)) { |
250 // Effectively write zero into the relocation. | 250 // Effectively write zero into the relocation. |
251 Assembler::set_target_address_at(pc_, pc_ + sizeof(int32_t)); | 251 Assembler::set_target_address_at(pc_, host_, pc_ + sizeof(int32_t)); |
252 } else { | 252 } else { |
253 UNREACHABLE(); | 253 UNREACHABLE(); |
254 } | 254 } |
255 } | 255 } |
256 | 256 |
257 | 257 |
258 bool RelocInfo::IsPatchedReturnSequence() { | 258 bool RelocInfo::IsPatchedReturnSequence() { |
259 return *pc_ == kCallOpcode; | 259 return *pc_ == kCallOpcode; |
260 } | 260 } |
261 | 261 |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
432 | 432 |
433 | 433 |
434 void Assembler::emit_w(const Immediate& x) { | 434 void Assembler::emit_w(const Immediate& x) { |
435 ASSERT(RelocInfo::IsNone(x.rmode_)); | 435 ASSERT(RelocInfo::IsNone(x.rmode_)); |
436 uint16_t value = static_cast<uint16_t>(x.x_); | 436 uint16_t value = static_cast<uint16_t>(x.x_); |
437 reinterpret_cast<uint16_t*>(pc_)[0] = value; | 437 reinterpret_cast<uint16_t*>(pc_)[0] = value; |
438 pc_ += sizeof(uint16_t); | 438 pc_ += sizeof(uint16_t); |
439 } | 439 } |
440 | 440 |
441 | 441 |
442 Address Assembler::target_address_at(Address pc) { | 442 Address Assembler::target_address_at(Address pc, |
| 443 ConstantPoolArray* constant_pool) { |
443 return pc + sizeof(int32_t) + *reinterpret_cast<int32_t*>(pc); | 444 return pc + sizeof(int32_t) + *reinterpret_cast<int32_t*>(pc); |
444 } | 445 } |
445 | 446 |
446 | 447 |
447 void Assembler::set_target_address_at(Address pc, Address target) { | 448 void Assembler::set_target_address_at(Address pc, |
| 449 ConstantPoolArray* constant_pool, |
| 450 Address target) { |
448 int32_t* p = reinterpret_cast<int32_t*>(pc); | 451 int32_t* p = reinterpret_cast<int32_t*>(pc); |
449 *p = target - (pc + sizeof(int32_t)); | 452 *p = target - (pc + sizeof(int32_t)); |
450 CPU::FlushICache(p, sizeof(int32_t)); | 453 CPU::FlushICache(p, sizeof(int32_t)); |
451 } | 454 } |
452 | 455 |
453 | 456 |
454 Address Assembler::target_address_from_return_address(Address pc) { | 457 Address Assembler::target_address_from_return_address(Address pc) { |
455 return pc - kCallTargetAddressOffset; | 458 return pc - kCallTargetAddressOffset; |
456 } | 459 } |
457 | 460 |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
530 | 533 |
531 Operand::Operand(int32_t disp, RelocInfo::Mode rmode) { | 534 Operand::Operand(int32_t disp, RelocInfo::Mode rmode) { |
532 // [disp/r] | 535 // [disp/r] |
533 set_modrm(0, ebp); | 536 set_modrm(0, ebp); |
534 set_dispr(disp, rmode); | 537 set_dispr(disp, rmode); |
535 } | 538 } |
536 | 539 |
537 } } // namespace v8::internal | 540 } } // namespace v8::internal |
538 | 541 |
539 #endif // V8_IA32_ASSEMBLER_IA32_INL_H_ | 542 #endif // V8_IA32_ASSEMBLER_IA32_INL_H_ |
OLD | NEW |