OLD | NEW |
---|---|
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 2898 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2909 void VisitCodeTarget(RelocInfo* rinfo) { | 2909 void VisitCodeTarget(RelocInfo* rinfo) { |
2910 ASSERT(RelocInfo::IsCodeTarget(rinfo->rmode())); | 2910 ASSERT(RelocInfo::IsCodeTarget(rinfo->rmode())); |
2911 Object* target = Code::GetCodeFromTargetAddress(rinfo->target_address()); | 2911 Object* target = Code::GetCodeFromTargetAddress(rinfo->target_address()); |
2912 Object* old_target = target; | 2912 Object* old_target = target; |
2913 VisitPointer(&target); | 2913 VisitPointer(&target); |
2914 if (target != old_target) { | 2914 if (target != old_target) { |
2915 rinfo->set_target_address(Code::cast(target)->instruction_start()); | 2915 rinfo->set_target_address(Code::cast(target)->instruction_start()); |
2916 } | 2916 } |
2917 } | 2917 } |
2918 | 2918 |
2919 void VisitCodeTarget(Address target_address_pointer) { | |
2920 Object* target = Code::GetCodeFromTargetAddress( | |
2921 Memory::Address_at(target_address_pointer)); | |
2922 VisitPointer(&target); | |
2923 *reinterpret_cast<Address*>(target_address_pointer) = | |
Michael Starzinger
2014/03/07 14:36:59
Instead of the reinterpret case, case we use ...
rmcilroy
2014/03/10 12:25:23
Removed VisitCodeTarget(Address) as discussed, so
| |
2924 Code::cast(target)->instruction_start(); | |
2925 } | |
2926 | |
2919 void VisitCodeAgeSequence(RelocInfo* rinfo) { | 2927 void VisitCodeAgeSequence(RelocInfo* rinfo) { |
2920 ASSERT(RelocInfo::IsCodeAgeSequence(rinfo->rmode())); | 2928 ASSERT(RelocInfo::IsCodeAgeSequence(rinfo->rmode())); |
2921 Object* stub = rinfo->code_age_stub(); | 2929 Object* stub = rinfo->code_age_stub(); |
2922 ASSERT(stub != NULL); | 2930 ASSERT(stub != NULL); |
2923 VisitPointer(&stub); | 2931 VisitPointer(&stub); |
2924 if (stub != rinfo->code_age_stub()) { | 2932 if (stub != rinfo->code_age_stub()) { |
2925 rinfo->set_code_age_stub(Code::cast(stub)); | 2933 rinfo->set_code_age_stub(Code::cast(stub)); |
2926 } | 2934 } |
2927 } | 2935 } |
2928 | 2936 |
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3149 return object; | 3157 return object; |
3150 } | 3158 } |
3151 }; | 3159 }; |
3152 | 3160 |
3153 | 3161 |
3154 static inline void UpdateSlot(Isolate* isolate, | 3162 static inline void UpdateSlot(Isolate* isolate, |
3155 ObjectVisitor* v, | 3163 ObjectVisitor* v, |
3156 SlotsBuffer::SlotType slot_type, | 3164 SlotsBuffer::SlotType slot_type, |
3157 Address addr) { | 3165 Address addr) { |
3158 switch (slot_type) { | 3166 switch (slot_type) { |
3159 case SlotsBuffer::CODE_TARGET_SLOT: { | 3167 case SlotsBuffer::CODE_TARGET_RELOC_INFO_SLOT: { |
3160 RelocInfo rinfo(addr, RelocInfo::CODE_TARGET, 0, NULL); | 3168 RelocInfo rinfo(addr, RelocInfo::CODE_TARGET, 0, NULL); |
3161 rinfo.Visit(isolate, v); | 3169 rinfo.Visit(isolate, v); |
3162 break; | 3170 break; |
3163 } | 3171 } |
3172 case SlotsBuffer::CODE_TARGET_CONSTANT_POOL_SLOT: { | |
3173 v->VisitCodeTarget(addr); | |
3174 break; | |
3175 } | |
3164 case SlotsBuffer::CODE_ENTRY_SLOT: { | 3176 case SlotsBuffer::CODE_ENTRY_SLOT: { |
3165 v->VisitCodeEntry(addr); | 3177 v->VisitCodeEntry(addr); |
3166 break; | 3178 break; |
3167 } | 3179 } |
3168 case SlotsBuffer::RELOCATED_CODE_OBJECT: { | 3180 case SlotsBuffer::RELOCATED_CODE_OBJECT: { |
3169 HeapObject* obj = HeapObject::FromAddress(addr); | 3181 HeapObject* obj = HeapObject::FromAddress(addr); |
3170 Code::cast(obj)->CodeIterateBody(v); | 3182 Code::cast(obj)->CodeIterateBody(v); |
3171 break; | 3183 break; |
3172 } | 3184 } |
3173 case SlotsBuffer::DEBUG_TARGET_SLOT: { | 3185 case SlotsBuffer::DEBUG_TARGET_SLOT: { |
(...skipping 1143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4317 } | 4329 } |
4318 ASSERT(buffer->HasSpaceForTypedSlot()); | 4330 ASSERT(buffer->HasSpaceForTypedSlot()); |
4319 buffer->Add(reinterpret_cast<ObjectSlot>(type)); | 4331 buffer->Add(reinterpret_cast<ObjectSlot>(type)); |
4320 buffer->Add(reinterpret_cast<ObjectSlot>(addr)); | 4332 buffer->Add(reinterpret_cast<ObjectSlot>(addr)); |
4321 return true; | 4333 return true; |
4322 } | 4334 } |
4323 | 4335 |
4324 | 4336 |
4325 static inline SlotsBuffer::SlotType SlotTypeForRMode(RelocInfo::Mode rmode) { | 4337 static inline SlotsBuffer::SlotType SlotTypeForRMode(RelocInfo::Mode rmode) { |
4326 if (RelocInfo::IsCodeTarget(rmode)) { | 4338 if (RelocInfo::IsCodeTarget(rmode)) { |
4327 return SlotsBuffer::CODE_TARGET_SLOT; | 4339 return SlotsBuffer::CODE_TARGET_RELOC_INFO_SLOT; |
4328 } else if (RelocInfo::IsEmbeddedObject(rmode)) { | 4340 } else if (RelocInfo::IsEmbeddedObject(rmode)) { |
4329 return SlotsBuffer::EMBEDDED_OBJECT_SLOT; | 4341 return SlotsBuffer::EMBEDDED_OBJECT_SLOT; |
4330 } else if (RelocInfo::IsDebugBreakSlot(rmode)) { | 4342 } else if (RelocInfo::IsDebugBreakSlot(rmode)) { |
4331 return SlotsBuffer::DEBUG_TARGET_SLOT; | 4343 return SlotsBuffer::DEBUG_TARGET_SLOT; |
4332 } else if (RelocInfo::IsJSReturn(rmode)) { | 4344 } else if (RelocInfo::IsJSReturn(rmode)) { |
4333 return SlotsBuffer::JS_RETURN_SLOT; | 4345 return SlotsBuffer::JS_RETURN_SLOT; |
4334 } | 4346 } |
4335 UNREACHABLE(); | 4347 UNREACHABLE(); |
4336 return SlotsBuffer::NUMBER_OF_SLOT_TYPES; | 4348 return SlotsBuffer::NUMBER_OF_SLOT_TYPES; |
4337 } | 4349 } |
4338 | 4350 |
4339 | 4351 |
4340 void MarkCompactCollector::RecordRelocSlot(RelocInfo* rinfo, Object* target) { | 4352 void MarkCompactCollector::RecordRelocSlot(RelocInfo* rinfo, Object* target) { |
4341 Page* target_page = Page::FromAddress(reinterpret_cast<Address>(target)); | 4353 Page* target_page = Page::FromAddress(reinterpret_cast<Address>(target)); |
4354 RelocInfo::Mode rmode = rinfo->rmode(); | |
4342 if (target_page->IsEvacuationCandidate() && | 4355 if (target_page->IsEvacuationCandidate() && |
4343 (rinfo->host() == NULL || | 4356 (rinfo->host() == NULL || |
4344 !ShouldSkipEvacuationSlotRecording(rinfo->host()))) { | 4357 !ShouldSkipEvacuationSlotRecording(rinfo->host()))) { |
4345 if (!SlotsBuffer::AddTo(&slots_buffer_allocator_, | 4358 bool success; |
4346 target_page->slots_buffer_address(), | 4359 if (RelocInfo::IsEmbeddedObject(rmode) && rinfo->IsInConstantPool()) { |
4347 SlotTypeForRMode(rinfo->rmode()), | 4360 // This doesn't need to be typed since it is just a normal heap pointer. |
4348 rinfo->pc(), | 4361 Object** target_pointer = |
4349 SlotsBuffer::FAIL_ON_OVERFLOW)) { | 4362 reinterpret_cast<Object**>(rinfo->constant_pool_entry_address()); |
4363 success = SlotsBuffer::AddTo(&slots_buffer_allocator_, | |
4364 target_page->slots_buffer_address(), | |
4365 target_pointer, | |
4366 SlotsBuffer::FAIL_ON_OVERFLOW); | |
4367 } else if (RelocInfo::IsCodeTarget(rmode) && rinfo->IsInConstantPool()) { | |
4368 success = SlotsBuffer::AddTo(&slots_buffer_allocator_, | |
4369 target_page->slots_buffer_address(), | |
4370 SlotsBuffer::CODE_TARGET_CONSTANT_POOL_SLOT, | |
4371 rinfo->constant_pool_entry_address(), | |
4372 SlotsBuffer::FAIL_ON_OVERFLOW); | |
4373 } else { | |
4374 success = SlotsBuffer::AddTo(&slots_buffer_allocator_, | |
4375 target_page->slots_buffer_address(), | |
4376 SlotTypeForRMode(rmode), | |
4377 rinfo->pc(), | |
4378 SlotsBuffer::FAIL_ON_OVERFLOW); | |
4379 } | |
4380 if (!success) { | |
4350 EvictEvacuationCandidate(target_page); | 4381 EvictEvacuationCandidate(target_page); |
4351 } | 4382 } |
4352 } | 4383 } |
4353 } | 4384 } |
4354 | 4385 |
4355 | 4386 |
4356 void MarkCompactCollector::RecordCodeEntrySlot(Address slot, Code* target) { | 4387 void MarkCompactCollector::RecordCodeEntrySlot(Address slot, Code* target) { |
4357 Page* target_page = Page::FromAddress(reinterpret_cast<Address>(target)); | 4388 Page* target_page = Page::FromAddress(reinterpret_cast<Address>(target)); |
4358 if (target_page->IsEvacuationCandidate() && | 4389 if (target_page->IsEvacuationCandidate() && |
4359 !ShouldSkipEvacuationSlotRecording(reinterpret_cast<Object**>(slot))) { | 4390 !ShouldSkipEvacuationSlotRecording(reinterpret_cast<Object**>(slot))) { |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4446 while (buffer != NULL) { | 4477 while (buffer != NULL) { |
4447 SlotsBuffer* next_buffer = buffer->next(); | 4478 SlotsBuffer* next_buffer = buffer->next(); |
4448 DeallocateBuffer(buffer); | 4479 DeallocateBuffer(buffer); |
4449 buffer = next_buffer; | 4480 buffer = next_buffer; |
4450 } | 4481 } |
4451 *buffer_address = NULL; | 4482 *buffer_address = NULL; |
4452 } | 4483 } |
4453 | 4484 |
4454 | 4485 |
4455 } } // namespace v8::internal | 4486 } } // namespace v8::internal |
OLD | NEW |