| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <iomanip> | 5 #include <iomanip> |
| 6 #include <sstream> | 6 #include <sstream> |
| 7 | 7 |
| 8 #include "src/v8.h" | 8 #include "src/v8.h" |
| 9 | 9 |
| 10 #include "src/accessors.h" | 10 #include "src/accessors.h" |
| 11 #include "src/allocation-site-scopes.h" | 11 #include "src/allocation-site-scopes.h" |
| 12 #include "src/api.h" | 12 #include "src/api.h" |
| 13 #include "src/arguments.h" | 13 #include "src/arguments.h" |
| 14 #include "src/base/bits.h" | 14 #include "src/base/bits.h" |
| 15 #include "src/bootstrapper.h" | 15 #include "src/bootstrapper.h" |
| 16 #include "src/code-stubs.h" | 16 #include "src/code-stubs.h" |
| 17 #include "src/codegen.h" | 17 #include "src/codegen.h" |
| 18 #include "src/compilation-dependencies.h" |
| 18 #include "src/compiler.h" | 19 #include "src/compiler.h" |
| 19 #include "src/cpu-profiler.h" | 20 #include "src/cpu-profiler.h" |
| 20 #include "src/date.h" | 21 #include "src/date.h" |
| 21 #include "src/debug.h" | 22 #include "src/debug.h" |
| 22 #include "src/deoptimizer.h" | 23 #include "src/deoptimizer.h" |
| 23 #include "src/elements.h" | 24 #include "src/elements.h" |
| 24 #include "src/execution.h" | 25 #include "src/execution.h" |
| 25 #include "src/field-index-inl.h" | 26 #include "src/field-index-inl.h" |
| 26 #include "src/field-index.h" | 27 #include "src/field-index.h" |
| 27 #include "src/full-codegen.h" | 28 #include "src/full-codegen.h" |
| (...skipping 12102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12130 } | 12131 } |
| 12131 | 12132 |
| 12132 RETURN_ON_EXCEPTION( | 12133 RETURN_ON_EXCEPTION( |
| 12133 isolate, EnqueueSpliceRecord(array, index, deleted, add_count), Object); | 12134 isolate, EnqueueSpliceRecord(array, index, deleted, add_count), Object); |
| 12134 | 12135 |
| 12135 return hresult; | 12136 return hresult; |
| 12136 } | 12137 } |
| 12137 | 12138 |
| 12138 | 12139 |
| 12139 // static | 12140 // static |
| 12140 void Map::AddDependentCompilationInfo(Handle<Map> map, | |
| 12141 DependentCode::DependencyGroup group, | |
| 12142 CompilationInfo* info) { | |
| 12143 Handle<DependentCode> codes = DependentCode::InsertCompilationInfo( | |
| 12144 handle(map->dependent_code(), info->isolate()), group, | |
| 12145 info->object_wrapper()); | |
| 12146 if (*codes != map->dependent_code()) map->set_dependent_code(*codes); | |
| 12147 info->dependencies(group)->Add(map, info->zone()); | |
| 12148 } | |
| 12149 | |
| 12150 | |
| 12151 // static | |
| 12152 void Map::AddDependentCode(Handle<Map> map, | 12141 void Map::AddDependentCode(Handle<Map> map, |
| 12153 DependentCode::DependencyGroup group, | 12142 DependentCode::DependencyGroup group, |
| 12154 Handle<Code> code) { | 12143 Handle<Code> code) { |
| 12155 Handle<WeakCell> cell = Code::WeakCellFor(code); | 12144 Handle<WeakCell> cell = Code::WeakCellFor(code); |
| 12156 Handle<DependentCode> codes = DependentCode::InsertWeakCode( | 12145 Handle<DependentCode> codes = DependentCode::InsertWeakCode( |
| 12157 Handle<DependentCode>(map->dependent_code()), group, cell); | 12146 Handle<DependentCode>(map->dependent_code()), group, cell); |
| 12158 if (*codes != map->dependent_code()) map->set_dependent_code(*codes); | 12147 if (*codes != map->dependent_code()) map->set_dependent_code(*codes); |
| 12159 } | 12148 } |
| 12160 | 12149 |
| 12161 | 12150 |
| 12162 DependentCode::GroupStartIndexes::GroupStartIndexes(DependentCode* entries) { | 12151 DependentCode::GroupStartIndexes::GroupStartIndexes(DependentCode* entries) { |
| 12163 Recompute(entries); | 12152 Recompute(entries); |
| 12164 } | 12153 } |
| 12165 | 12154 |
| 12166 | 12155 |
| 12167 void DependentCode::GroupStartIndexes::Recompute(DependentCode* entries) { | 12156 void DependentCode::GroupStartIndexes::Recompute(DependentCode* entries) { |
| 12168 start_indexes_[0] = 0; | 12157 start_indexes_[0] = 0; |
| 12169 for (int g = 1; g <= kGroupCount; g++) { | 12158 for (int g = 1; g <= kGroupCount; g++) { |
| 12170 int count = entries->number_of_entries(static_cast<DependencyGroup>(g - 1)); | 12159 int count = entries->number_of_entries(static_cast<DependencyGroup>(g - 1)); |
| 12171 start_indexes_[g] = start_indexes_[g - 1] + count; | 12160 start_indexes_[g] = start_indexes_[g - 1] + count; |
| 12172 } | 12161 } |
| 12173 } | 12162 } |
| 12174 | 12163 |
| 12175 | 12164 |
| 12176 DependentCode* DependentCode::ForObject(Handle<HeapObject> object, | 12165 Handle<DependentCode> DependentCode::InsertCompilationDependencies( |
| 12177 DependencyGroup group) { | |
| 12178 AllowDeferredHandleDereference dependencies_are_safe; | |
| 12179 if (group == DependentCode::kPropertyCellChangedGroup) { | |
| 12180 return Handle<PropertyCell>::cast(object)->dependent_code(); | |
| 12181 } else if (group == DependentCode::kAllocationSiteTenuringChangedGroup || | |
| 12182 group == DependentCode::kAllocationSiteTransitionChangedGroup) { | |
| 12183 return Handle<AllocationSite>::cast(object)->dependent_code(); | |
| 12184 } | |
| 12185 return Handle<Map>::cast(object)->dependent_code(); | |
| 12186 } | |
| 12187 | |
| 12188 | |
| 12189 Handle<DependentCode> DependentCode::InsertCompilationInfo( | |
| 12190 Handle<DependentCode> entries, DependencyGroup group, | 12166 Handle<DependentCode> entries, DependencyGroup group, |
| 12191 Handle<Foreign> info) { | 12167 Handle<Foreign> info) { |
| 12192 return Insert(entries, group, info); | 12168 return Insert(entries, group, info); |
| 12193 } | 12169 } |
| 12194 | 12170 |
| 12195 | 12171 |
| 12196 Handle<DependentCode> DependentCode::InsertWeakCode( | 12172 Handle<DependentCode> DependentCode::InsertWeakCode( |
| 12197 Handle<DependentCode> entries, DependencyGroup group, | 12173 Handle<DependentCode> entries, DependencyGroup group, |
| 12198 Handle<WeakCell> code_cell) { | 12174 Handle<WeakCell> code_cell) { |
| 12199 return Insert(entries, group, code_cell); | 12175 return Insert(entries, group, code_cell); |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12285 } | 12261 } |
| 12286 | 12262 |
| 12287 #ifdef DEBUG | 12263 #ifdef DEBUG |
| 12288 for (int i = start; i < end; i++) { | 12264 for (int i = start; i < end; i++) { |
| 12289 DCHECK(object_at(i) != info); | 12265 DCHECK(object_at(i) != info); |
| 12290 } | 12266 } |
| 12291 #endif | 12267 #endif |
| 12292 } | 12268 } |
| 12293 | 12269 |
| 12294 | 12270 |
| 12295 void DependentCode::RemoveCompilationInfo(DependentCode::DependencyGroup group, | 12271 void DependentCode::RemoveCompilationDependencies( |
| 12296 Foreign* info) { | 12272 DependentCode::DependencyGroup group, Foreign* info) { |
| 12297 DisallowHeapAllocation no_allocation; | 12273 DisallowHeapAllocation no_allocation; |
| 12298 GroupStartIndexes starts(this); | 12274 GroupStartIndexes starts(this); |
| 12299 int start = starts.at(group); | 12275 int start = starts.at(group); |
| 12300 int end = starts.at(group + 1); | 12276 int end = starts.at(group + 1); |
| 12301 // Find compilation info wrapper. | 12277 // Find compilation info wrapper. |
| 12302 int info_pos = -1; | 12278 int info_pos = -1; |
| 12303 for (int i = start; i < end; i++) { | 12279 for (int i = start; i < end; i++) { |
| 12304 if (object_at(i) == info) { | 12280 if (object_at(i) == info) { |
| 12305 info_pos = i; | 12281 info_pos = i; |
| 12306 break; | 12282 break; |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12360 Code* code = Code::cast(cell->value()); | 12336 Code* code = Code::cast(cell->value()); |
| 12361 if (!code->marked_for_deoptimization()) { | 12337 if (!code->marked_for_deoptimization()) { |
| 12362 SetMarkedForDeoptimization(code, group); | 12338 SetMarkedForDeoptimization(code, group); |
| 12363 if (invalidate_embedded_objects) { | 12339 if (invalidate_embedded_objects) { |
| 12364 code->InvalidateEmbeddedObjects(); | 12340 code->InvalidateEmbeddedObjects(); |
| 12365 } | 12341 } |
| 12366 marked = true; | 12342 marked = true; |
| 12367 } | 12343 } |
| 12368 } else { | 12344 } else { |
| 12369 DCHECK(obj->IsForeign()); | 12345 DCHECK(obj->IsForeign()); |
| 12370 CompilationInfo* info = reinterpret_cast<CompilationInfo*>( | 12346 CompilationDependencies* info = |
| 12371 Foreign::cast(obj)->foreign_address()); | 12347 reinterpret_cast<CompilationDependencies*>( |
| 12372 info->AbortDueToDependencyChange(); | 12348 Foreign::cast(obj)->foreign_address()); |
| 12349 info->Abort(); |
| 12373 } | 12350 } |
| 12374 } | 12351 } |
| 12375 // Compact the array by moving all subsequent groups to fill in the new holes. | 12352 // Compact the array by moving all subsequent groups to fill in the new holes. |
| 12376 for (int src = end, dst = start; src < code_entries; src++, dst++) { | 12353 for (int src = end, dst = start; src < code_entries; src++, dst++) { |
| 12377 copy(src, dst); | 12354 copy(src, dst); |
| 12378 } | 12355 } |
| 12379 // Now the holes are at the end of the array, zap them for heap-verifier. | 12356 // Now the holes are at the end of the array, zap them for heap-verifier. |
| 12380 int removed = end - start; | 12357 int removed = end - start; |
| 12381 for (int i = code_entries - removed; i < code_entries; i++) { | 12358 for (int i = code_entries - removed; i < code_entries; i++) { |
| 12382 clear_at(i); | 12359 clear_at(i); |
| (...skipping 1059 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13442 ElementsKindToString(to_kind)); | 13419 ElementsKindToString(to_kind)); |
| 13443 } | 13420 } |
| 13444 site->SetElementsKind(to_kind); | 13421 site->SetElementsKind(to_kind); |
| 13445 site->dependent_code()->DeoptimizeDependentCodeGroup( | 13422 site->dependent_code()->DeoptimizeDependentCodeGroup( |
| 13446 isolate, DependentCode::kAllocationSiteTransitionChangedGroup); | 13423 isolate, DependentCode::kAllocationSiteTransitionChangedGroup); |
| 13447 } | 13424 } |
| 13448 } | 13425 } |
| 13449 } | 13426 } |
| 13450 | 13427 |
| 13451 | 13428 |
| 13452 // static | |
| 13453 void AllocationSite::RegisterForDeoptOnTenureChange(Handle<AllocationSite> site, | |
| 13454 CompilationInfo* info) { | |
| 13455 AddDependentCompilationInfo( | |
| 13456 site, DependentCode::kAllocationSiteTenuringChangedGroup, info); | |
| 13457 } | |
| 13458 | |
| 13459 | |
| 13460 // static | |
| 13461 void AllocationSite::RegisterForDeoptOnTransitionChange( | |
| 13462 Handle<AllocationSite> site, CompilationInfo* info) { | |
| 13463 // Do nothing if the object doesn't have any useful element transitions left. | |
| 13464 ElementsKind kind = | |
| 13465 site->SitePointsToLiteral() | |
| 13466 ? JSObject::cast(site->transition_info())->GetElementsKind() | |
| 13467 : site->GetElementsKind(); | |
| 13468 if (AllocationSite::GetMode(kind) == TRACK_ALLOCATION_SITE) { | |
| 13469 AddDependentCompilationInfo( | |
| 13470 site, DependentCode::kAllocationSiteTransitionChangedGroup, info); | |
| 13471 } | |
| 13472 } | |
| 13473 | |
| 13474 | |
| 13475 // static | |
| 13476 void AllocationSite::AddDependentCompilationInfo( | |
| 13477 Handle<AllocationSite> site, DependentCode::DependencyGroup group, | |
| 13478 CompilationInfo* info) { | |
| 13479 Handle<DependentCode> dep(site->dependent_code()); | |
| 13480 Handle<DependentCode> codes = | |
| 13481 DependentCode::InsertCompilationInfo(dep, group, info->object_wrapper()); | |
| 13482 if (*codes != site->dependent_code()) site->set_dependent_code(*codes); | |
| 13483 info->dependencies(group)->Add(Handle<HeapObject>(*site), info->zone()); | |
| 13484 } | |
| 13485 | |
| 13486 | |
| 13487 const char* AllocationSite::PretenureDecisionName(PretenureDecision decision) { | 13429 const char* AllocationSite::PretenureDecisionName(PretenureDecision decision) { |
| 13488 switch (decision) { | 13430 switch (decision) { |
| 13489 case kUndecided: return "undecided"; | 13431 case kUndecided: return "undecided"; |
| 13490 case kDontTenure: return "don't tenure"; | 13432 case kDontTenure: return "don't tenure"; |
| 13491 case kMaybeTenure: return "maybe tenure"; | 13433 case kMaybeTenure: return "maybe tenure"; |
| 13492 case kTenure: return "tenure"; | 13434 case kTenure: return "tenure"; |
| 13493 case kZombie: return "zombie"; | 13435 case kZombie: return "zombie"; |
| 13494 default: UNREACHABLE(); | 13436 default: UNREACHABLE(); |
| 13495 } | 13437 } |
| 13496 return NULL; | 13438 return NULL; |
| (...skipping 3633 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 17130 // Deopt when transitioning from a constant type. | 17072 // Deopt when transitioning from a constant type. |
| 17131 if (!invalidate && old_type == PropertyCellType::kConstant && | 17073 if (!invalidate && old_type == PropertyCellType::kConstant && |
| 17132 new_type != PropertyCellType::kConstant) { | 17074 new_type != PropertyCellType::kConstant) { |
| 17133 auto isolate = dictionary->GetIsolate(); | 17075 auto isolate = dictionary->GetIsolate(); |
| 17134 cell->dependent_code()->DeoptimizeDependentCodeGroup( | 17076 cell->dependent_code()->DeoptimizeDependentCodeGroup( |
| 17135 isolate, DependentCode::kPropertyCellChangedGroup); | 17077 isolate, DependentCode::kPropertyCellChangedGroup); |
| 17136 } | 17078 } |
| 17137 return value; | 17079 return value; |
| 17138 } | 17080 } |
| 17139 | 17081 |
| 17140 | |
| 17141 // static | |
| 17142 void PropertyCell::AddDependentCompilationInfo(Handle<PropertyCell> cell, | |
| 17143 CompilationInfo* info) { | |
| 17144 Handle<DependentCode> codes = DependentCode::InsertCompilationInfo( | |
| 17145 handle(cell->dependent_code(), info->isolate()), | |
| 17146 DependentCode::kPropertyCellChangedGroup, info->object_wrapper()); | |
| 17147 if (*codes != cell->dependent_code()) cell->set_dependent_code(*codes); | |
| 17148 info->dependencies(DependentCode::kPropertyCellChangedGroup)->Add( | |
| 17149 cell, info->zone()); | |
| 17150 } | |
| 17151 | |
| 17152 } } // namespace v8::internal | 17082 } } // namespace v8::internal |
| OLD | NEW |