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 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
57 } | 57 } |
58 | 58 |
59 | 59 |
60 Address RelocInfo::target_address() { | 60 Address RelocInfo::target_address() { |
61 ASSERT(IsCodeTarget(rmode_) || rmode_ == RUNTIME_ENTRY); | 61 ASSERT(IsCodeTarget(rmode_) || rmode_ == RUNTIME_ENTRY); |
62 return Assembler::target_address_at(pc_); | 62 return Assembler::target_address_at(pc_); |
63 } | 63 } |
64 | 64 |
65 | 65 |
66 Address RelocInfo::target_address_address() { | 66 Address RelocInfo::target_address_address() { |
67 ASSERT(IsCodeTarget(rmode_) || rmode_ == RUNTIME_ENTRY); | 67 ASSERT(IsCodeTarget(rmode_) || rmode_ == RUNTIME_ENTRY |
| 68 || rmode_ == EMBEDDED_OBJECT |
| 69 || rmode_ == EXTERNAL_REFERENCE); |
68 return reinterpret_cast<Address>(Assembler::target_address_address_at(pc_)); | 70 return reinterpret_cast<Address>(Assembler::target_address_address_at(pc_)); |
69 } | 71 } |
70 | 72 |
71 | 73 |
72 int RelocInfo::target_address_size() { | 74 int RelocInfo::target_address_size() { |
73 return Assembler::kExternalTargetSize; | 75 return Assembler::kExternalTargetSize; |
74 } | 76 } |
75 | 77 |
76 | 78 |
77 void RelocInfo::set_target_address(Address target, WriteBarrierMode mode) { | 79 void RelocInfo::set_target_address(Address target, WriteBarrierMode mode) { |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
217 | 219 |
218 void RelocInfo::Visit(ObjectVisitor* visitor) { | 220 void RelocInfo::Visit(ObjectVisitor* visitor) { |
219 RelocInfo::Mode mode = rmode(); | 221 RelocInfo::Mode mode = rmode(); |
220 if (mode == RelocInfo::EMBEDDED_OBJECT) { | 222 if (mode == RelocInfo::EMBEDDED_OBJECT) { |
221 visitor->VisitEmbeddedPointer(this); | 223 visitor->VisitEmbeddedPointer(this); |
222 } else if (RelocInfo::IsCodeTarget(mode)) { | 224 } else if (RelocInfo::IsCodeTarget(mode)) { |
223 visitor->VisitCodeTarget(this); | 225 visitor->VisitCodeTarget(this); |
224 } else if (mode == RelocInfo::GLOBAL_PROPERTY_CELL) { | 226 } else if (mode == RelocInfo::GLOBAL_PROPERTY_CELL) { |
225 visitor->VisitGlobalPropertyCell(this); | 227 visitor->VisitGlobalPropertyCell(this); |
226 } else if (mode == RelocInfo::EXTERNAL_REFERENCE) { | 228 } else if (mode == RelocInfo::EXTERNAL_REFERENCE) { |
227 visitor->VisitExternalReference(target_reference_address()); | 229 visitor->VisitExternalReference(this); |
228 #ifdef ENABLE_DEBUGGER_SUPPORT | 230 #ifdef ENABLE_DEBUGGER_SUPPORT |
229 // TODO(isolates): Get a cached isolate below. | 231 // TODO(isolates): Get a cached isolate below. |
230 } else if (((RelocInfo::IsJSReturn(mode) && | 232 } else if (((RelocInfo::IsJSReturn(mode) && |
231 IsPatchedReturnSequence()) || | 233 IsPatchedReturnSequence()) || |
232 (RelocInfo::IsDebugBreakSlot(mode) && | 234 (RelocInfo::IsDebugBreakSlot(mode) && |
233 IsPatchedDebugBreakSlotSequence())) && | 235 IsPatchedDebugBreakSlotSequence())) && |
234 Isolate::Current()->debug()->has_break_points()) { | 236 Isolate::Current()->debug()->has_break_points()) { |
235 visitor->VisitDebugTarget(this); | 237 visitor->VisitDebugTarget(this); |
236 #endif | 238 #endif |
237 } else if (mode == RelocInfo::RUNTIME_ENTRY) { | 239 } else if (mode == RelocInfo::RUNTIME_ENTRY) { |
238 visitor->VisitRuntimeEntry(this); | 240 visitor->VisitRuntimeEntry(this); |
239 } | 241 } |
240 } | 242 } |
241 | 243 |
242 | 244 |
243 template<typename StaticVisitor> | 245 template<typename StaticVisitor> |
244 void RelocInfo::Visit(Heap* heap) { | 246 void RelocInfo::Visit(Heap* heap) { |
245 RelocInfo::Mode mode = rmode(); | 247 RelocInfo::Mode mode = rmode(); |
246 if (mode == RelocInfo::EMBEDDED_OBJECT) { | 248 if (mode == RelocInfo::EMBEDDED_OBJECT) { |
247 StaticVisitor::VisitEmbeddedPointer(heap, this); | 249 StaticVisitor::VisitEmbeddedPointer(heap, this); |
248 } else if (RelocInfo::IsCodeTarget(mode)) { | 250 } else if (RelocInfo::IsCodeTarget(mode)) { |
249 StaticVisitor::VisitCodeTarget(heap, this); | 251 StaticVisitor::VisitCodeTarget(heap, this); |
250 } else if (mode == RelocInfo::GLOBAL_PROPERTY_CELL) { | 252 } else if (mode == RelocInfo::GLOBAL_PROPERTY_CELL) { |
251 StaticVisitor::VisitGlobalPropertyCell(heap, this); | 253 StaticVisitor::VisitGlobalPropertyCell(heap, this); |
252 } else if (mode == RelocInfo::EXTERNAL_REFERENCE) { | 254 } else if (mode == RelocInfo::EXTERNAL_REFERENCE) { |
253 StaticVisitor::VisitExternalReference(target_reference_address()); | 255 StaticVisitor::VisitExternalReference(this); |
254 #ifdef ENABLE_DEBUGGER_SUPPORT | 256 #ifdef ENABLE_DEBUGGER_SUPPORT |
255 } else if (heap->isolate()->debug()->has_break_points() && | 257 } else if (heap->isolate()->debug()->has_break_points() && |
256 ((RelocInfo::IsJSReturn(mode) && | 258 ((RelocInfo::IsJSReturn(mode) && |
257 IsPatchedReturnSequence()) || | 259 IsPatchedReturnSequence()) || |
258 (RelocInfo::IsDebugBreakSlot(mode) && | 260 (RelocInfo::IsDebugBreakSlot(mode) && |
259 IsPatchedDebugBreakSlotSequence()))) { | 261 IsPatchedDebugBreakSlotSequence()))) { |
260 StaticVisitor::VisitDebugTarget(heap, this); | 262 StaticVisitor::VisitDebugTarget(heap, this); |
261 #endif | 263 #endif |
262 } else if (mode == RelocInfo::RUNTIME_ENTRY) { | 264 } else if (mode == RelocInfo::RUNTIME_ENTRY) { |
263 StaticVisitor::VisitRuntimeEntry(this); | 265 StaticVisitor::VisitRuntimeEntry(this); |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
367 // CPU::FlushICache(pc, sizeof(target)); | 369 // CPU::FlushICache(pc, sizeof(target)); |
368 // However, on ARM, no instruction was actually patched by the assignment | 370 // However, on ARM, no instruction was actually patched by the assignment |
369 // above; the target address is not part of an instruction, it is patched in | 371 // above; the target address is not part of an instruction, it is patched in |
370 // the constant pool and is read via a data access; the instruction accessing | 372 // the constant pool and is read via a data access; the instruction accessing |
371 // this address in the constant pool remains unchanged. | 373 // this address in the constant pool remains unchanged. |
372 } | 374 } |
373 | 375 |
374 } } // namespace v8::internal | 376 } } // namespace v8::internal |
375 | 377 |
376 #endif // V8_ARM_ASSEMBLER_ARM_INL_H_ | 378 #endif // V8_ARM_ASSEMBLER_ARM_INL_H_ |
OLD | NEW |