// Copyright 2019 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "src/codegen/pending-optimization-table.h" #include "src/base/flags.h" #include "src/execution/isolate-inl.h" #include "src/heap/heap-inl.h" #include "src/objects/hash-table.h" #include "src/objects/js-objects.h" namespace v8 { namespace internal { void ManualOptimizationTable::MarkFunctionForManualOptimization( Isolate* isolate, Handle function, IsCompiledScope* is_compiled_scope) { DCHECK(v8_flags.testing_d8_test_runner || v8_flags.allow_natives_syntax); DCHECK(is_compiled_scope->is_compiled()); DCHECK(function->has_feedback_vector()); Handle shared_info(function->shared(), isolate); Handle table = IsUndefined(isolate->heap()->functions_marked_for_manual_optimization()) ? ObjectHashTable::New(isolate, 1) : handle(ObjectHashTable::cast( isolate->heap() ->functions_marked_for_manual_optimization()), isolate); table = ObjectHashTable::Put( table, shared_info, handle(shared_info->GetBytecodeArray(isolate), isolate)); isolate->heap()->SetFunctionsMarkedForManualOptimization(*table); } void ManualOptimizationTable::CheckMarkedForManualOptimization( Isolate* isolate, Tagged function) { if (!IsMarkedForManualOptimization(isolate, function)) { PrintF("Error: Function "); ShortPrint(function); PrintF( " should be prepared for optimization with " "%%PrepareFunctionForOptimization before " "%%OptimizeFunctionOnNextCall / %%OptimizeMaglevOnNextCall / " "%%OptimizeOSR "); UNREACHABLE(); } } bool ManualOptimizationTable::IsMarkedForManualOptimization( Isolate* isolate, Tagged function) { DCHECK(v8_flags.testing_d8_test_runner || v8_flags.allow_natives_syntax); Handle table = handle( isolate->heap()->functions_marked_for_manual_optimization(), isolate); Handle entry = IsUndefined(*table) ? handle(ReadOnlyRoots(isolate).the_hole_value(), isolate) : handle(Handle::cast(table)->Lookup( handle(function->shared(), isolate)), isolate); return !IsTheHole(*entry); } } // namespace internal } // namespace v8