Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(198)

Side by Side Diff: src/mark-compact.cc

Issue 179813005: Special case the recording of constant pool entries in the slot buffer. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698