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 | 5 // modification, are permitted provided that the following conditions |
6 // are met: | 6 // are 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 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
54 void RelocInfo::apply(intptr_t delta) { | 54 void RelocInfo::apply(intptr_t delta) { |
55 // absolute code pointer inside code object moves with the code object. | 55 // absolute code pointer inside code object moves with the code object. |
56 if (IsInternalReference(rmode_)) { | 56 if (IsInternalReference(rmode_)) { |
57 // Jump table entry | 57 // Jump table entry |
58 Address target = Memory::Address_at(pc_); | 58 Address target = Memory::Address_at(pc_); |
59 Memory::Address_at(pc_) = target + delta; | 59 Memory::Address_at(pc_) = target + delta; |
60 } else { | 60 } else { |
61 // mov sequence | 61 // mov sequence |
62 DCHECK(IsInternalReferenceEncoded(rmode_)); | 62 DCHECK(IsInternalReferenceEncoded(rmode_)); |
63 Address target = Assembler::target_address_at(pc_, host_); | 63 Address target = Assembler::target_address_at(pc_, host_); |
64 Assembler::set_target_address_at(isolate_, pc_, host_, target + delta, | 64 Assembler::set_target_address_at(nullptr, pc_, host_, target + delta, |
65 SKIP_ICACHE_FLUSH); | 65 SKIP_ICACHE_FLUSH); |
66 } | 66 } |
67 } | 67 } |
68 | 68 |
69 | 69 |
70 Address RelocInfo::target_internal_reference() { | 70 Address RelocInfo::target_internal_reference() { |
71 if (IsInternalReference(rmode_)) { | 71 if (IsInternalReference(rmode_)) { |
72 // Jump table entry | 72 // Jump table entry |
73 return Memory::Address_at(pc_); | 73 return Memory::Address_at(pc_); |
74 } else { | 74 } else { |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
184 Handle<HeapObject> RelocInfo::target_object_handle(Assembler* origin) { | 184 Handle<HeapObject> RelocInfo::target_object_handle(Assembler* origin) { |
185 DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); | 185 DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); |
186 return Handle<HeapObject>( | 186 return Handle<HeapObject>( |
187 reinterpret_cast<HeapObject**>(Assembler::target_address_at(pc_, host_))); | 187 reinterpret_cast<HeapObject**>(Assembler::target_address_at(pc_, host_))); |
188 } | 188 } |
189 | 189 |
190 void RelocInfo::set_target_object(HeapObject* target, | 190 void RelocInfo::set_target_object(HeapObject* target, |
191 WriteBarrierMode write_barrier_mode, | 191 WriteBarrierMode write_barrier_mode, |
192 ICacheFlushMode icache_flush_mode) { | 192 ICacheFlushMode icache_flush_mode) { |
193 DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); | 193 DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); |
194 Assembler::set_target_address_at(isolate_, pc_, host_, | 194 Assembler::set_target_address_at(target->GetIsolate(), pc_, host_, |
195 reinterpret_cast<Address>(target), | 195 reinterpret_cast<Address>(target), |
196 icache_flush_mode); | 196 icache_flush_mode); |
197 if (write_barrier_mode == UPDATE_WRITE_BARRIER && host() != NULL && | 197 if (write_barrier_mode == UPDATE_WRITE_BARRIER && host() != NULL) { |
198 target->IsHeapObject()) { | 198 host()->GetHeap()->incremental_marking()->RecordWriteIntoCode(host(), this, |
199 host()->GetHeap()->incremental_marking()->RecordWriteIntoCode( | 199 target); |
200 host(), this, HeapObject::cast(target)); | |
201 host()->GetHeap()->RecordWriteIntoCode(host(), this, target); | 200 host()->GetHeap()->RecordWriteIntoCode(host(), this, target); |
202 } | 201 } |
203 } | 202 } |
204 | 203 |
205 | 204 |
206 Address RelocInfo::target_external_reference() { | 205 Address RelocInfo::target_external_reference() { |
207 DCHECK(rmode_ == EXTERNAL_REFERENCE); | 206 DCHECK(rmode_ == EXTERNAL_REFERENCE); |
208 return Assembler::target_address_at(pc_, host_); | 207 return Assembler::target_address_at(pc_, host_); |
209 } | 208 } |
210 | 209 |
211 | 210 |
212 Address RelocInfo::target_runtime_entry(Assembler* origin) { | 211 Address RelocInfo::target_runtime_entry(Assembler* origin) { |
213 DCHECK(IsRuntimeEntry(rmode_)); | 212 DCHECK(IsRuntimeEntry(rmode_)); |
214 return target_address(); | 213 return target_address(); |
215 } | 214 } |
216 | 215 |
217 | 216 void RelocInfo::set_target_runtime_entry(Isolate* isolate, Address target, |
218 void RelocInfo::set_target_runtime_entry(Address target, | |
219 WriteBarrierMode write_barrier_mode, | 217 WriteBarrierMode write_barrier_mode, |
220 ICacheFlushMode icache_flush_mode) { | 218 ICacheFlushMode icache_flush_mode) { |
221 DCHECK(IsRuntimeEntry(rmode_)); | 219 DCHECK(IsRuntimeEntry(rmode_)); |
222 if (target_address() != target) | 220 if (target_address() != target) |
223 set_target_address(target, write_barrier_mode, icache_flush_mode); | 221 set_target_address(isolate, target, write_barrier_mode, icache_flush_mode); |
224 } | 222 } |
225 | 223 |
226 | 224 |
227 Handle<Cell> RelocInfo::target_cell_handle() { | 225 Handle<Cell> RelocInfo::target_cell_handle() { |
228 DCHECK(rmode_ == RelocInfo::CELL); | 226 DCHECK(rmode_ == RelocInfo::CELL); |
229 Address address = Memory::Address_at(pc_); | 227 Address address = Memory::Address_at(pc_); |
230 return Handle<Cell>(reinterpret_cast<Cell**>(address)); | 228 return Handle<Cell>(reinterpret_cast<Cell**>(address)); |
231 } | 229 } |
232 | 230 |
233 | 231 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
274 Code* RelocInfo::code_age_stub() { | 272 Code* RelocInfo::code_age_stub() { |
275 DCHECK(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); | 273 DCHECK(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); |
276 return Code::GetCodeFromTargetAddress( | 274 return Code::GetCodeFromTargetAddress( |
277 Assembler::target_address_at(pc_ + kCodeAgingTargetDelta, host_)); | 275 Assembler::target_address_at(pc_ + kCodeAgingTargetDelta, host_)); |
278 } | 276 } |
279 | 277 |
280 | 278 |
281 void RelocInfo::set_code_age_stub(Code* stub, | 279 void RelocInfo::set_code_age_stub(Code* stub, |
282 ICacheFlushMode icache_flush_mode) { | 280 ICacheFlushMode icache_flush_mode) { |
283 DCHECK(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); | 281 DCHECK(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); |
284 Assembler::set_target_address_at(isolate_, pc_ + kCodeAgingTargetDelta, host_, | 282 Assembler::set_target_address_at( |
285 stub->instruction_start(), | 283 stub->GetIsolate(), pc_ + kCodeAgingTargetDelta, host_, |
286 icache_flush_mode); | 284 stub->instruction_start(), icache_flush_mode); |
287 } | 285 } |
288 | 286 |
289 | 287 |
290 Address RelocInfo::debug_call_address() { | 288 Address RelocInfo::debug_call_address() { |
291 DCHECK(IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence()); | 289 DCHECK(IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence()); |
292 return Assembler::target_address_at(pc_, host_); | 290 return Assembler::target_address_at(pc_, host_); |
293 } | 291 } |
294 | 292 |
295 | 293 void RelocInfo::set_debug_call_address(Isolate* isolate, Address target) { |
296 void RelocInfo::set_debug_call_address(Address target) { | |
297 DCHECK(IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence()); | 294 DCHECK(IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence()); |
298 Assembler::set_target_address_at(isolate_, pc_, host_, target); | 295 Assembler::set_target_address_at(isolate, pc_, host_, target); |
299 if (host() != NULL) { | 296 if (host() != NULL) { |
300 Code* target_code = Code::GetCodeFromTargetAddress(target); | 297 Code* target_code = Code::GetCodeFromTargetAddress(target); |
301 host()->GetHeap()->incremental_marking()->RecordWriteIntoCode(host(), this, | 298 host()->GetHeap()->incremental_marking()->RecordWriteIntoCode(host(), this, |
302 target_code); | 299 target_code); |
303 } | 300 } |
304 } | 301 } |
305 | 302 |
306 | 303 void RelocInfo::WipeOut(Isolate* isolate) { |
307 void RelocInfo::WipeOut() { | |
308 DCHECK(IsEmbeddedObject(rmode_) || IsCodeTarget(rmode_) || | 304 DCHECK(IsEmbeddedObject(rmode_) || IsCodeTarget(rmode_) || |
309 IsRuntimeEntry(rmode_) || IsExternalReference(rmode_) || | 305 IsRuntimeEntry(rmode_) || IsExternalReference(rmode_) || |
310 IsInternalReference(rmode_) || IsInternalReferenceEncoded(rmode_)); | 306 IsInternalReference(rmode_) || IsInternalReferenceEncoded(rmode_)); |
311 if (IsInternalReference(rmode_)) { | 307 if (IsInternalReference(rmode_)) { |
312 // Jump table entry | 308 // Jump table entry |
313 Memory::Address_at(pc_) = NULL; | 309 Memory::Address_at(pc_) = NULL; |
314 } else if (IsInternalReferenceEncoded(rmode_)) { | 310 } else if (IsInternalReferenceEncoded(rmode_)) { |
315 // mov sequence | 311 // mov sequence |
316 // Currently used only by deserializer, no need to flush. | 312 // Currently used only by deserializer, no need to flush. |
317 Assembler::set_target_address_at(isolate_, pc_, host_, NULL, | 313 Assembler::set_target_address_at(isolate, pc_, host_, NULL, |
318 SKIP_ICACHE_FLUSH); | 314 SKIP_ICACHE_FLUSH); |
319 } else { | 315 } else { |
320 Assembler::set_target_address_at(isolate_, pc_, host_, NULL); | 316 Assembler::set_target_address_at(isolate, pc_, host_, NULL); |
321 } | 317 } |
322 } | 318 } |
323 | 319 |
324 template <typename ObjectVisitor> | 320 template <typename ObjectVisitor> |
325 void RelocInfo::Visit(Isolate* isolate, ObjectVisitor* visitor) { | 321 void RelocInfo::Visit(Isolate* isolate, ObjectVisitor* visitor) { |
326 RelocInfo::Mode mode = rmode(); | 322 RelocInfo::Mode mode = rmode(); |
327 if (mode == RelocInfo::EMBEDDED_OBJECT) { | 323 if (mode == RelocInfo::EMBEDDED_OBJECT) { |
328 visitor->VisitEmbeddedPointer(this); | 324 visitor->VisitEmbeddedPointer(this); |
329 } else if (RelocInfo::IsCodeTarget(mode)) { | 325 } else if (RelocInfo::IsCodeTarget(mode)) { |
330 visitor->VisitCodeTarget(this); | 326 visitor->VisitCodeTarget(this); |
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
613 } else { | 609 } else { |
614 Memory::Address_at(pc) = target; | 610 Memory::Address_at(pc) = target; |
615 } | 611 } |
616 } | 612 } |
617 | 613 |
618 | 614 |
619 // This code assumes the FIXED_SEQUENCE of lis/ori | 615 // This code assumes the FIXED_SEQUENCE of lis/ori |
620 void Assembler::set_target_address_at(Isolate* isolate, Address pc, | 616 void Assembler::set_target_address_at(Isolate* isolate, Address pc, |
621 Address constant_pool, Address target, | 617 Address constant_pool, Address target, |
622 ICacheFlushMode icache_flush_mode) { | 618 ICacheFlushMode icache_flush_mode) { |
| 619 DCHECK_IMPLIES(isolate == nullptr, icache_flush_mode == SKIP_ICACHE_FLUSH); |
| 620 |
623 if (FLAG_enable_embedded_constant_pool && constant_pool) { | 621 if (FLAG_enable_embedded_constant_pool && constant_pool) { |
624 ConstantPoolEntry::Access access; | 622 ConstantPoolEntry::Access access; |
625 if (IsConstantPoolLoadStart(pc, &access)) { | 623 if (IsConstantPoolLoadStart(pc, &access)) { |
626 Memory::Address_at(target_constant_pool_address_at( | 624 Memory::Address_at(target_constant_pool_address_at( |
627 pc, constant_pool, access, ConstantPoolEntry::INTPTR)) = target; | 625 pc, constant_pool, access, ConstantPoolEntry::INTPTR)) = target; |
628 return; | 626 return; |
629 } | 627 } |
630 } | 628 } |
631 | 629 |
632 Instr instr1 = instr_at(pc); | 630 Instr instr1 = instr_at(pc); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
680 } | 678 } |
681 #endif | 679 #endif |
682 return; | 680 return; |
683 } | 681 } |
684 UNREACHABLE(); | 682 UNREACHABLE(); |
685 } | 683 } |
686 } // namespace internal | 684 } // namespace internal |
687 } // namespace v8 | 685 } // namespace v8 |
688 | 686 |
689 #endif // V8_PPC_ASSEMBLER_PPC_INL_H_ | 687 #endif // V8_PPC_ASSEMBLER_PPC_INL_H_ |
OLD | NEW |