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 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
43 #include "src/debug.h" | 43 #include "src/debug.h" |
44 | 44 |
45 | 45 |
46 namespace v8 { | 46 namespace v8 { |
47 namespace internal { | 47 namespace internal { |
48 | 48 |
49 | 49 |
50 bool CpuFeatures::SupportsCrankshaft() { return true; } | 50 bool CpuFeatures::SupportsCrankshaft() { return true; } |
51 | 51 |
52 | 52 |
53 void RelocInfo::apply(intptr_t delta, ICacheFlushMode icache_flush_mode) { | 53 void RelocInfo::apply(intptr_t delta) { |
54 // absolute code pointer inside code object moves with the code object. | 54 // absolute code pointer inside code object moves with the code object. |
55 if (IsInternalReference(rmode_)) { | 55 if (IsInternalReference(rmode_)) { |
56 // Jump table entry | 56 // Jump table entry |
57 Address target = Memory::Address_at(pc_); | 57 Address target = Memory::Address_at(pc_); |
58 Memory::Address_at(pc_) = target + delta; | 58 Memory::Address_at(pc_) = target + delta; |
59 } else { | 59 } else { |
60 // mov sequence | 60 // mov sequence |
61 DCHECK(IsInternalReferenceEncoded(rmode_)); | 61 DCHECK(IsInternalReferenceEncoded(rmode_)); |
62 Address target = Assembler::target_address_at(pc_, host_); | 62 Address target = Assembler::target_address_at(pc_, host_); |
63 Assembler::set_target_address_at(pc_, host_, target + delta, | 63 Assembler::set_target_address_at(pc_, host_, target + delta, |
64 icache_flush_mode); | 64 SKIP_ICACHE_FLUSH); |
65 } | 65 } |
66 } | 66 } |
67 | 67 |
68 | 68 |
69 Address RelocInfo::target_internal_reference() { | 69 Address RelocInfo::target_internal_reference() { |
70 if (IsInternalReference(rmode_)) { | 70 if (IsInternalReference(rmode_)) { |
71 // Jump table entry | 71 // Jump table entry |
72 return Memory::Address_at(pc_); | 72 return Memory::Address_at(pc_); |
73 } else { | 73 } else { |
74 // mov sequence | 74 // mov sequence |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
139 Assembler::set_target_address_at(pc_, host_, target, icache_flush_mode); | 139 Assembler::set_target_address_at(pc_, host_, target, icache_flush_mode); |
140 if (write_barrier_mode == UPDATE_WRITE_BARRIER && host() != NULL && | 140 if (write_barrier_mode == UPDATE_WRITE_BARRIER && host() != NULL && |
141 IsCodeTarget(rmode_)) { | 141 IsCodeTarget(rmode_)) { |
142 Object* target_code = Code::GetCodeFromTargetAddress(target); | 142 Object* target_code = Code::GetCodeFromTargetAddress(target); |
143 host()->GetHeap()->incremental_marking()->RecordWriteIntoCode( | 143 host()->GetHeap()->incremental_marking()->RecordWriteIntoCode( |
144 host(), this, HeapObject::cast(target_code)); | 144 host(), this, HeapObject::cast(target_code)); |
145 } | 145 } |
146 } | 146 } |
147 | 147 |
148 | 148 |
149 Address Assembler::break_address_from_return_address(Address pc) { | |
150 return target_address_from_return_address(pc); | |
151 } | |
152 | |
153 | |
154 Address Assembler::target_address_from_return_address(Address pc) { | 149 Address Assembler::target_address_from_return_address(Address pc) { |
155 // Returns the address of the call target from the return address that will | 150 // Returns the address of the call target from the return address that will |
156 // be returned to after a call. | 151 // be returned to after a call. |
157 // Call sequence is : | 152 // Call sequence is : |
158 // mov ip, @ call address | 153 // mov ip, @ call address |
159 // mtlr ip | 154 // mtlr ip |
160 // blrl | 155 // blrl |
161 // @ return address | 156 // @ return address |
162 int len; | 157 int len; |
163 ConstantPoolEntry::Access access; | 158 ConstantPoolEntry::Access access; |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
290 | 285 |
291 void RelocInfo::set_code_age_stub(Code* stub, | 286 void RelocInfo::set_code_age_stub(Code* stub, |
292 ICacheFlushMode icache_flush_mode) { | 287 ICacheFlushMode icache_flush_mode) { |
293 DCHECK(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); | 288 DCHECK(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); |
294 Assembler::set_target_address_at(pc_ + kCodeAgingTargetDelta, host_, | 289 Assembler::set_target_address_at(pc_ + kCodeAgingTargetDelta, host_, |
295 stub->instruction_start(), | 290 stub->instruction_start(), |
296 icache_flush_mode); | 291 icache_flush_mode); |
297 } | 292 } |
298 | 293 |
299 | 294 |
300 Address RelocInfo::call_address() { | 295 Address RelocInfo::debug_call_address() { |
301 DCHECK((IsJSReturn(rmode()) && IsPatchedReturnSequence()) || | 296 DCHECK(IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence()); |
302 (IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence())); | |
303 // The pc_ offset of 0 assumes patched return sequence per | |
304 // BreakLocation::SetDebugBreakAtReturn(), or debug break | |
305 // slot per BreakLocation::SetDebugBreakAtSlot(). | |
306 return Assembler::target_address_at(pc_, host_); | 297 return Assembler::target_address_at(pc_, host_); |
307 } | 298 } |
308 | 299 |
309 | 300 |
310 void RelocInfo::set_call_address(Address target) { | 301 void RelocInfo::set_debug_call_address(Address target) { |
311 DCHECK((IsJSReturn(rmode()) && IsPatchedReturnSequence()) || | 302 DCHECK(IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence()); |
312 (IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence())); | |
313 Assembler::set_target_address_at(pc_, host_, target); | 303 Assembler::set_target_address_at(pc_, host_, target); |
314 if (host() != NULL) { | 304 if (host() != NULL) { |
315 Object* target_code = Code::GetCodeFromTargetAddress(target); | 305 Object* target_code = Code::GetCodeFromTargetAddress(target); |
316 host()->GetHeap()->incremental_marking()->RecordWriteIntoCode( | 306 host()->GetHeap()->incremental_marking()->RecordWriteIntoCode( |
317 host(), this, HeapObject::cast(target_code)); | 307 host(), this, HeapObject::cast(target_code)); |
318 } | 308 } |
319 } | 309 } |
320 | 310 |
321 | 311 |
322 Object* RelocInfo::call_object() { return *call_object_address(); } | |
323 | |
324 | |
325 void RelocInfo::set_call_object(Object* target) { | |
326 *call_object_address() = target; | |
327 } | |
328 | |
329 | |
330 Object** RelocInfo::call_object_address() { | |
331 DCHECK((IsJSReturn(rmode()) && IsPatchedReturnSequence()) || | |
332 (IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence())); | |
333 return reinterpret_cast<Object**>(pc_ + 2 * Assembler::kInstrSize); | |
334 } | |
335 | |
336 | |
337 void RelocInfo::WipeOut() { | 312 void RelocInfo::WipeOut() { |
338 DCHECK(IsEmbeddedObject(rmode_) || IsCodeTarget(rmode_) || | 313 DCHECK(IsEmbeddedObject(rmode_) || IsCodeTarget(rmode_) || |
339 IsRuntimeEntry(rmode_) || IsExternalReference(rmode_) || | 314 IsRuntimeEntry(rmode_) || IsExternalReference(rmode_) || |
340 IsInternalReference(rmode_) || IsInternalReferenceEncoded(rmode_)); | 315 IsInternalReference(rmode_) || IsInternalReferenceEncoded(rmode_)); |
341 if (IsInternalReference(rmode_)) { | 316 if (IsInternalReference(rmode_)) { |
342 // Jump table entry | 317 // Jump table entry |
343 Memory::Address_at(pc_) = NULL; | 318 Memory::Address_at(pc_) = NULL; |
344 } else if (IsInternalReferenceEncoded(rmode_)) { | 319 } else if (IsInternalReferenceEncoded(rmode_)) { |
345 // mov sequence | 320 // mov sequence |
346 // Currently used only by deserializer, no need to flush. | 321 // Currently used only by deserializer, no need to flush. |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
392 visitor->VisitCodeTarget(this); | 367 visitor->VisitCodeTarget(this); |
393 } else if (mode == RelocInfo::CELL) { | 368 } else if (mode == RelocInfo::CELL) { |
394 visitor->VisitCell(this); | 369 visitor->VisitCell(this); |
395 } else if (mode == RelocInfo::EXTERNAL_REFERENCE) { | 370 } else if (mode == RelocInfo::EXTERNAL_REFERENCE) { |
396 visitor->VisitExternalReference(this); | 371 visitor->VisitExternalReference(this); |
397 } else if (mode == RelocInfo::INTERNAL_REFERENCE || | 372 } else if (mode == RelocInfo::INTERNAL_REFERENCE || |
398 mode == RelocInfo::INTERNAL_REFERENCE_ENCODED) { | 373 mode == RelocInfo::INTERNAL_REFERENCE_ENCODED) { |
399 visitor->VisitInternalReference(this); | 374 visitor->VisitInternalReference(this); |
400 } else if (RelocInfo::IsCodeAgeSequence(mode)) { | 375 } else if (RelocInfo::IsCodeAgeSequence(mode)) { |
401 visitor->VisitCodeAgeSequence(this); | 376 visitor->VisitCodeAgeSequence(this); |
402 } else if (((RelocInfo::IsJSReturn(mode) && IsPatchedReturnSequence()) || | 377 } else if (RelocInfo::IsDebugBreakSlot(mode) && |
403 (RelocInfo::IsDebugBreakSlot(mode) && | 378 IsPatchedDebugBreakSlotSequence() && |
404 IsPatchedDebugBreakSlotSequence())) && | |
405 isolate->debug()->has_break_points()) { | 379 isolate->debug()->has_break_points()) { |
406 visitor->VisitDebugTarget(this); | 380 visitor->VisitDebugTarget(this); |
407 } else if (IsRuntimeEntry(mode)) { | 381 } else if (IsRuntimeEntry(mode)) { |
408 visitor->VisitRuntimeEntry(this); | 382 visitor->VisitRuntimeEntry(this); |
409 } | 383 } |
410 } | 384 } |
411 | 385 |
412 | 386 |
413 template <typename StaticVisitor> | 387 template <typename StaticVisitor> |
414 void RelocInfo::Visit(Heap* heap) { | 388 void RelocInfo::Visit(Heap* heap) { |
415 RelocInfo::Mode mode = rmode(); | 389 RelocInfo::Mode mode = rmode(); |
416 if (mode == RelocInfo::EMBEDDED_OBJECT) { | 390 if (mode == RelocInfo::EMBEDDED_OBJECT) { |
417 StaticVisitor::VisitEmbeddedPointer(heap, this); | 391 StaticVisitor::VisitEmbeddedPointer(heap, this); |
418 } else if (RelocInfo::IsCodeTarget(mode)) { | 392 } else if (RelocInfo::IsCodeTarget(mode)) { |
419 StaticVisitor::VisitCodeTarget(heap, this); | 393 StaticVisitor::VisitCodeTarget(heap, this); |
420 } else if (mode == RelocInfo::CELL) { | 394 } else if (mode == RelocInfo::CELL) { |
421 StaticVisitor::VisitCell(heap, this); | 395 StaticVisitor::VisitCell(heap, this); |
422 } else if (mode == RelocInfo::EXTERNAL_REFERENCE) { | 396 } else if (mode == RelocInfo::EXTERNAL_REFERENCE) { |
423 StaticVisitor::VisitExternalReference(this); | 397 StaticVisitor::VisitExternalReference(this); |
424 } else if (mode == RelocInfo::INTERNAL_REFERENCE || | 398 } else if (mode == RelocInfo::INTERNAL_REFERENCE || |
425 mode == RelocInfo::INTERNAL_REFERENCE_ENCODED) { | 399 mode == RelocInfo::INTERNAL_REFERENCE_ENCODED) { |
426 StaticVisitor::VisitInternalReference(this); | 400 StaticVisitor::VisitInternalReference(this); |
427 } else if (RelocInfo::IsCodeAgeSequence(mode)) { | 401 } else if (RelocInfo::IsCodeAgeSequence(mode)) { |
428 StaticVisitor::VisitCodeAgeSequence(heap, this); | 402 StaticVisitor::VisitCodeAgeSequence(heap, this); |
429 } else if (heap->isolate()->debug()->has_break_points() && | 403 } else if (heap->isolate()->debug()->has_break_points() && |
430 ((RelocInfo::IsJSReturn(mode) && IsPatchedReturnSequence()) || | 404 RelocInfo::IsDebugBreakSlot(mode) && |
431 (RelocInfo::IsDebugBreakSlot(mode) && | 405 IsPatchedDebugBreakSlotSequence()) { |
432 IsPatchedDebugBreakSlotSequence()))) { | |
433 StaticVisitor::VisitDebugTarget(heap, this); | 406 StaticVisitor::VisitDebugTarget(heap, this); |
434 } else if (IsRuntimeEntry(mode)) { | 407 } else if (IsRuntimeEntry(mode)) { |
435 StaticVisitor::VisitRuntimeEntry(this); | 408 StaticVisitor::VisitRuntimeEntry(this); |
436 } | 409 } |
437 } | 410 } |
438 | 411 |
439 Operand::Operand(intptr_t immediate, RelocInfo::Mode rmode) { | 412 Operand::Operand(intptr_t immediate, RelocInfo::Mode rmode) { |
440 rm_ = no_reg; | 413 rm_ = no_reg; |
441 imm_ = immediate; | 414 imm_ = immediate; |
442 rmode_ = rmode; | 415 rmode_ = rmode; |
(...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
746 } | 719 } |
747 #endif | 720 #endif |
748 return; | 721 return; |
749 } | 722 } |
750 UNREACHABLE(); | 723 UNREACHABLE(); |
751 } | 724 } |
752 } | 725 } |
753 } // namespace v8::internal | 726 } // namespace v8::internal |
754 | 727 |
755 #endif // V8_PPC_ASSEMBLER_PPC_INL_H_ | 728 #endif // V8_PPC_ASSEMBLER_PPC_INL_H_ |
OLD | NEW |