Chromium Code Reviews| 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 |