#include "src/baseline/baseline.h"
#include "src/handles/maybe-handles.h"
#include "src/objects/shared-function-info-inl.h"
#ifdef V8_ENABLE_SPARKPLUG
#include "src/baseline/baseline-assembler-inl.h"
#include "src/baseline/baseline-compiler.h"
#include "src/debug/debug.h"
#include "src/heap/factory-inl.h"
#include "src/logging/runtime-call-stats-scope.h"
#include "src/objects/script-inl.h"
namespace v8 {
namespace internal {
bool CanCompileWithBaseline(Isolate* isolate,
Tagged<SharedFunctionInfo> shared) {
DisallowGarbageCollection no_gc;
if (!v8_flags.sparkplug) return false;
if (v8_flags.sparkplug_needs_short_builtins &&
!isolate->is_short_builtin_calls_enabled()) {
return false;
}
if (!shared->HasBytecodeArray()) return false;
if (isolate->debug()->needs_check_on_function_call()) return false;
if (auto debug_info = shared->TryGetDebugInfo(isolate)) {
if (debug_info.value()->HasBreakInfo()) return false;
if (debug_info.value()->HasInstrumentedBytecodeArray()) return false;
}
if (!shared->PassesFilter(v8_flags.sparkplug_filter)) return false;
return true;
}
MaybeDirectHandle<Code> GenerateBaselineCode(
Isolate* isolate, Handle<SharedFunctionInfo> shared) {
RCS_SCOPE(isolate, RuntimeCallCounterId::kCompileBaseline);
Handle<BytecodeArray> bytecode(shared->GetBytecodeArray(isolate), isolate);
LocalIsolate* local_isolate = isolate->main_thread_local_isolate();
baseline::BaselineCompiler compiler(local_isolate, shared, bytecode);
compiler.GenerateCode();
MaybeDirectHandle<Code> code = compiler.Build();
if (v8_flags.print_code && !code.is_null()) {
Print(*code.ToHandleChecked());
}
return code;
}
void EmitReturnBaseline(MacroAssembler* masm) {
baseline::BaselineAssembler::EmitReturn(masm);
}
}
}
#else
namespace v8 {
namespace internal {
bool CanCompileWithBaseline(Isolate* isolate,
Tagged<SharedFunctionInfo> shared) {
return false;
}
MaybeDirectHandle<Code> GenerateBaselineCode(
Isolate* isolate, Handle<SharedFunctionInfo> shared) {
UNREACHABLE();
}
void EmitReturnBaseline(MacroAssembler* masm) { UNREACHABLE(); }
}
}
#endif