[compile hints] Collect compile hints data in v8

This adds the APIs for the embedder to
1) request compile hints collection for a script
2) retrieve the compile hint data

Bug: chromium:1406506
Change-Id: Ic23430d3cff9fe71faa71f4c7be6635467e14268
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/4154427
Commit-Queue: Marja Hölttä <marja@chromium.org>
Reviewed-by: Camillo Bruni <cbruni@chromium.org>
Cr-Commit-Position: refs/heads/main@{#85461}
This commit is contained in:
Marja Hölttä 2023-01-24 14:16:41 +01:00 committed by V8 LUCI CQ
parent 9637266ea5
commit 0ea9064e39
15 changed files with 242 additions and 65 deletions

View File

@ -347,6 +347,12 @@ class V8_EXPORT Script {
* ScriptOrigin. This can be either a v8::String or v8::Undefined.
*/
Local<Value> GetResourceName();
/**
* If the script was compiled, returns the positions of lazy functions which
* were eventually compiled and executed.
*/
std::vector<int> GetProducedCompileHints() const;
};
enum class ScriptType { kClassic, kModule };
@ -562,7 +568,8 @@ class V8_EXPORT ScriptCompiler {
enum CompileOptions {
kNoCompileOptions = 0,
kConsumeCodeCache,
kEagerCompile
kEagerCompile,
kProduceCompileHints
};
/**

View File

@ -2317,6 +2317,31 @@ Local<Value> Script::GetResourceName() {
i::handle(i::Script::cast(sfi.script()).name(), i_isolate));
}
std::vector<int> Script::GetProducedCompileHints() const {
i::DisallowGarbageCollection no_gc;
i::Handle<i::JSFunction> func = Utils::OpenHandle(this);
i::Isolate* i_isolate = func->GetIsolate();
i::SharedFunctionInfo sfi = (*func).shared();
CHECK(sfi.script().IsScript());
i::Script script = i::Script::cast(sfi.script());
i::Object maybe_array_list = script.compiled_lazy_function_positions();
std::vector<int> result;
if (!maybe_array_list.IsUndefined(i_isolate)) {
i::ArrayList array_list = i::ArrayList::cast(maybe_array_list);
result.reserve(array_list.Length());
for (int i = 0; i < array_list.Length(); ++i) {
i::Object item = array_list.Get(i);
CHECK(item.IsSmi());
result.push_back(i::Smi::ToInt(item));
}
// Clear the data; the embedder can still request more data later, but it'll
// have to keep track of the original data itself.
script.set_compiled_lazy_function_positions(
i::ReadOnlyRoots(i_isolate).undefined_value());
}
return result;
}
// static
Local<PrimitiveArray> PrimitiveArray::New(Isolate* v8_isolate, int length) {
i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(v8_isolate);
@ -2723,9 +2748,10 @@ MaybeLocal<Script> ScriptCompiler::Compile(Local<Context> context,
MaybeLocal<Module> ScriptCompiler::CompileModule(
Isolate* v8_isolate, Source* source, CompileOptions options,
NoCacheReason no_cache_reason) {
Utils::ApiCheck(options == kNoCompileOptions || options == kConsumeCodeCache,
"v8::ScriptCompiler::CompileModule",
"Invalid CompileOptions");
Utils::ApiCheck(
options == kNoCompileOptions || options == kConsumeCodeCache ||
options == kProduceCompileHints,
"v8::ScriptCompiler::CompileModule", "Invalid CompileOptions");
Utils::ApiCheck(source->GetResourceOptions().IsModule(),
"v8::ScriptCompiler::CompileModule",
"Invalid ScriptOrigin: is_module must be true");
@ -2860,7 +2886,8 @@ void ScriptCompiler::ScriptStreamingTask::Run() { data_->task->Run(); }
ScriptCompiler::ScriptStreamingTask* ScriptCompiler::StartStreaming(
Isolate* v8_isolate, StreamedSource* source, v8::ScriptType type,
CompileOptions options) {
Utils::ApiCheck(options == kNoCompileOptions || options == kEagerCompile,
Utils::ApiCheck(options == kNoCompileOptions || options == kEagerCompile ||
options == kProduceCompileHints,
"v8::ScriptCompiler::StartStreaming",
"Invalid CompileOptions");
if (!i::v8_flags.script_streaming) return nullptr;

View File

@ -1596,6 +1596,9 @@ BackgroundCompileTask::BackgroundCompileTask(
start_position_(0),
end_position_(0),
function_literal_id_(kFunctionLiteralIdTopLevel) {
if (options == ScriptCompiler::CompileOptions::kProduceCompileHints) {
flags_.set_produce_compile_hints(true);
}
DCHECK(is_streaming_compilation());
}
@ -2536,6 +2539,21 @@ bool Compiler::Compile(Isolate* isolate, Handle<SharedFunctionInfo> shared_info,
CompileAllWithBaseline(isolate, finalize_unoptimized_compilation_data_list);
}
if (script->produce_compile_hints()) {
// Log lazy funtion compilation.
Handle<ArrayList> list;
if (script->compiled_lazy_function_positions().IsUndefined()) {
constexpr int kInitialLazyFunctionPositionListSize = 100;
list = ArrayList::New(isolate, kInitialLazyFunctionPositionListSize);
} else {
list = handle(ArrayList::cast(script->compiled_lazy_function_positions()),
isolate);
}
list = ArrayList::Add(isolate, list,
Smi::FromInt(shared_info->StartPosition()));
script->set_compiled_lazy_function_positions(*list);
}
DCHECK(!isolate->has_pending_exception());
DCHECK(is_compiled_scope->is_compiled());
return true;
@ -3336,7 +3354,8 @@ bool CanBackgroundCompile(const ScriptDetails& script_details,
// modules is supported.
return !script_details.origin_options.IsModule() && !extension &&
script_details.repl_mode == REPLMode::kNo &&
compile_options == ScriptCompiler::kNoCompileOptions &&
(compile_options == ScriptCompiler::kNoCompileOptions ||
compile_options == ScriptCompiler::kProduceCompileHints) &&
natives == NOT_NATIVES_CODE;
}
@ -3422,16 +3441,14 @@ MaybeHandle<SharedFunctionInfo> GetSharedFunctionInfoForScriptImpl(
ScriptCompiler::NoCacheReason no_cache_reason, NativesFlag natives) {
ScriptCompileTimerScope compile_timer(isolate, no_cache_reason);
if (compile_options == ScriptCompiler::kNoCompileOptions ||
compile_options == ScriptCompiler::kEagerCompile) {
DCHECK_NULL(cached_data);
DCHECK_NULL(deserialize_task);
} else {
DCHECK_EQ(compile_options, ScriptCompiler::kConsumeCodeCache);
if (compile_options == ScriptCompiler::kConsumeCodeCache) {
// Have to have exactly one of cached_data or deserialize_task.
DCHECK(cached_data || deserialize_task);
DCHECK(!(cached_data && deserialize_task));
DCHECK_NULL(extension);
} else {
DCHECK_NULL(cached_data);
DCHECK_NULL(deserialize_task);
}
if (V8_UNLIKELY(
@ -3573,6 +3590,11 @@ MaybeHandle<SharedFunctionInfo> GetSharedFunctionInfoForScriptImpl(
isolate->ReportPendingMessages();
}
}
Handle<SharedFunctionInfo> result;
if (compile_options == ScriptCompiler::CompileOptions::kProduceCompileHints &&
maybe_result.ToHandle(&result)) {
Script::cast(result->script()).set_produce_compile_hints(true);
}
return maybe_result;
}
@ -3632,12 +3654,10 @@ MaybeHandle<JSFunction> Compiler::GetWrappedFunction(
Isolate* isolate = context->GetIsolate();
ScriptCompileTimerScope compile_timer(isolate, no_cache_reason);
if (compile_options == ScriptCompiler::kNoCompileOptions ||
compile_options == ScriptCompiler::kEagerCompile) {
DCHECK_NULL(cached_data);
} else {
DCHECK(compile_options == ScriptCompiler::kConsumeCodeCache);
if (compile_options == ScriptCompiler::kConsumeCodeCache) {
DCHECK(cached_data);
} else {
DCHECK_NULL(cached_data);
}
LanguageMode language_mode = construct_language_mode(v8_flags.use_strict);
@ -3763,6 +3783,10 @@ Compiler::GetSharedFunctionInfoForStreamedScript(
Handle<SharedFunctionInfo> result;
if (maybe_result.ToHandle(&result)) {
if (task->flags().produce_compile_hints()) {
Script::cast(result->script()).set_produce_compile_hints(true);
}
// Add compiled code to the isolate cache.
TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8.compile"),
"V8.StreamingFinalization.AddToCache");

View File

@ -2356,6 +2356,8 @@ void Script::ScriptPrint(std::ostream& os) {
os << "\n - source_mapping_url: " << Brief(source_mapping_url());
os << "\n - host_defined_options: " << Brief(host_defined_options());
os << "\n - compilation type: " << compilation_type();
os << "\n - compiled lazy function positions: "
<< compiled_lazy_function_positions();
bool is_wasm = false;
#if V8_ENABLE_WEBASSEMBLY
if ((is_wasm = (type() == TYPE_WASM))) {

View File

@ -288,6 +288,8 @@ Handle<Script> FactoryBase<Impl>::NewScriptWithId(
raw.set_flags(0);
raw.set_host_defined_options(roots.empty_fixed_array(), SKIP_WRITE_BARRIER);
raw.set_source_hash(roots.undefined_value(), SKIP_WRITE_BARRIER);
raw.set_compiled_lazy_function_positions(roots.undefined_value(),
SKIP_WRITE_BARRIER);
#ifdef V8_SCRIPTORMODULE_LEGACY_LIFETIME
raw.set_script_or_modules(roots.empty_array_list());
#endif

View File

@ -1520,6 +1520,8 @@ Handle<Script> Factory::CloneScript(Handle<Script> script) {
new_script.set_flags(old_script.flags());
new_script.set_host_defined_options(old_script.host_defined_options());
new_script.set_source_hash(*undefined_value(), SKIP_WRITE_BARRIER);
new_script.set_compiled_lazy_function_positions(*undefined_value(),
SKIP_WRITE_BARRIER);
#ifdef V8_SCRIPTORMODULE_LEGACY_LIFETIME
new_script.set_script_or_modules(*list);
#endif

View File

@ -465,6 +465,9 @@ class ArrayList : public TorqueGeneratedArrayList<ArrayList, FixedArray> {
Handle<ArrayList> array,
Handle<Object> obj1,
Handle<Object> obj2);
V8_EXPORT_PRIVATE static Handle<ArrayList> Add(Isolate* isolate,
Handle<ArrayList> array,
Smi obj1);
V8_EXPORT_PRIVATE static Handle<ArrayList> Add(Isolate* isolate,
Handle<ArrayList> array,
Handle<Object> obj1, Smi obj2,

View File

@ -4033,6 +4033,21 @@ Handle<ArrayList> ArrayList::Add(Isolate* isolate, Handle<ArrayList> array,
return array;
}
Handle<ArrayList> ArrayList::Add(Isolate* isolate, Handle<ArrayList> array,
Smi obj1) {
int length = array->Length();
array = EnsureSpace(isolate, array, length + 1);
// Check that GC didn't remove elements from the array.
DCHECK_EQ(array->Length(), length);
{
DisallowGarbageCollection no_gc;
ArrayList raw_array = *array;
raw_array.Set(length, obj1);
raw_array.SetLength(length + 1);
}
return array;
}
// static
Handle<ArrayList> ArrayList::Add(Isolate* isolate, Handle<ArrayList> array,
Handle<Object> obj1, Handle<Object> obj2) {

View File

@ -44,6 +44,9 @@ SMI_ACCESSORS_CHECKED(Script, eval_from_position, kEvalFromPositionOffset,
CHECK_SCRIPT_NOT_WASM)
#undef CHECK_SCRIPT_NOT_WASM
ACCESSORS(Script, compiled_lazy_function_positions, Object,
kCompiledLazyFunctionPositionsOffset)
bool Script::is_wrapped() const {
return eval_from_shared_or_wrapped_arguments_or_sfi_table().IsFixedArray() &&
type() != TYPE_WEB_SNAPSHOT;
@ -148,6 +151,14 @@ void Script::set_compilation_state(CompilationState state) {
set_flags(CompilationStateBit::update(flags(), state));
}
bool Script::produce_compile_hints() const {
return ProduceCompileHintsBit::decode(flags());
}
void Script::set_produce_compile_hints(bool produce_compile_hints) {
set_flags(ProduceCompileHintsBit::update(flags(), produce_compile_hints));
}
bool Script::is_repl_mode() const { return IsReplModeBit::decode(flags()); }
void Script::set_is_repl_mode(bool value) {

View File

@ -128,6 +128,9 @@ class Script : public TorqueGeneratedScript<Script, Struct> {
inline CompilationType compilation_type();
inline void set_compilation_type(CompilationType type);
inline bool produce_compile_hints() const;
inline void set_produce_compile_hints(bool produce_compile_hints);
// [compilation_state]: determines whether the script has already been
// compiled. Encoded in the 'flags' field.
inline CompilationState compilation_state();
@ -144,6 +147,8 @@ class Script : public TorqueGeneratedScript<Script, Struct> {
inline v8::ScriptOriginOptions origin_options();
inline void set_origin_options(ScriptOriginOptions origin_options);
DECL_ACCESSORS(compiled_lazy_function_positions, Object)
// If script source is an external string, check that the underlying
// resource is accessible. Otherwise, always return true.
inline bool HasValidSource();

View File

@ -12,6 +12,7 @@ bitfield struct ScriptFlags extends uint31 {
origin_options: int32: 4 bit;
// Whether an instrumentation breakpoint is set for this script (wasm only).
break_on_entry: bool: 1 bit;
produce_compile_hints: bool: 1 bit;
}
extern class Script extends Struct {
@ -48,6 +49,10 @@ extern class Script extends Struct {
eval_from_position: Smi|Foreign; // Smi or Managed<wasm::NativeModule>
shared_function_infos: WeakFixedArray|WeakArrayList;
// [compiled_lazy_function_positions]: ArrayList containing SMIs marking
// the start positions of lazy functions which got compiled.
compiled_lazy_function_positions: ArrayList|Undefined;
// [flags]: Holds an exciting bitfield.
flags: SmiTagged<ScriptFlags>;

View File

@ -61,7 +61,8 @@ class Zone;
V(post_parallel_compile_tasks_for_eager_toplevel, bool, 1, _) \
V(post_parallel_compile_tasks_for_lazy, bool, 1, _) \
V(collect_source_positions, bool, 1, _) \
V(is_repl_mode, bool, 1, _)
V(is_repl_mode, bool, 1, _) \
V(produce_compile_hints, bool, 1, _)
class V8_EXPORT_PRIVATE UnoptimizedCompileFlags {
public:

View File

@ -742,9 +742,11 @@ void Serializer::ObjectSerializer::Serialize() {
return;
}
if (InstanceTypeChecker::IsScript(instance_type)) {
// Clear cached line ends.
// Clear cached line ends & compiled lazy function positions.
Oddball undefined = ReadOnlyRoots(isolate()).undefined_value();
Handle<Script>::cast(object_)->set_line_ends(undefined);
Handle<Script>::cast(object_)->set_compiled_lazy_function_positions(
undefined);
}
// We don't expect fillers.

View File

@ -157,5 +157,76 @@ TEST_F(ScriptTest, GetEmptyStalledTopLevelAwaitMessage) {
{});
}
TEST_F(ScriptTest, ProduceCompileHints) {
const char* url = "http://www.foo.com/foo.js";
v8::ScriptOrigin origin(isolate(), NewString(url), 13, 0);
const char* code = "function lazy1() {} function lazy2() {} lazy1();";
v8::ScriptCompiler::Source script_source(NewString(code), origin);
// Test producing compile hints.
{
Local<Script> script =
v8::ScriptCompiler::Compile(
v8_context(), &script_source,
v8::ScriptCompiler::CompileOptions::kProduceCompileHints)
.ToLocalChecked();
{
auto compile_hints = script->GetProducedCompileHints();
EXPECT_EQ(0u, compile_hints.size());
}
v8::Local<v8::Context> context = v8::Context::New(isolate());
v8::MaybeLocal<v8::Value> result = script->Run(context);
EXPECT_FALSE(result.IsEmpty());
{
auto compile_hints = script->GetProducedCompileHints();
EXPECT_EQ(1u, compile_hints.size());
EXPECT_EQ(14, compile_hints[0]);
}
// The previous data is cleared if we retrieve compile hints again.
{
auto compile_hints = script->GetProducedCompileHints();
EXPECT_EQ(0u, compile_hints.size());
}
// Call the other lazy function and retrieve compile hints again.
const char* code2 = "lazy2();";
v8::ScriptCompiler::Source script_source2(NewString(code2), origin);
Local<Script> script2 =
v8::ScriptCompiler::Compile(v8_context(), &script_source2)
.ToLocalChecked();
v8::MaybeLocal<v8::Value> result2 = script2->Run(context);
EXPECT_FALSE(result2.IsEmpty());
{
auto compile_hints = script->GetProducedCompileHints();
EXPECT_EQ(1u, compile_hints.size());
EXPECT_EQ(34, compile_hints[0]);
}
}
// Test that compile hints are not produced unless the relevant compile option
// is set.
{
Local<Script> script =
v8::ScriptCompiler::Compile(v8_context(), &script_source)
.ToLocalChecked();
{
auto compile_hints = script->GetProducedCompileHints();
EXPECT_EQ(0u, compile_hints.size());
}
v8::Local<v8::Context> context = v8::Context::New(isolate());
v8::MaybeLocal<v8::Value> result = script->Run(context);
EXPECT_FALSE(result.IsEmpty());
{
auto compile_hints = script->GetProducedCompileHints();
EXPECT_EQ(0u, compile_hints.size());
}
}
}
} // namespace
} // namespace v8

View File

@ -555,52 +555,52 @@ KNOWN_OBJECTS = {
("old_space", 0x043bd): "ExternalMap",
("old_space", 0x043e5): "JSMessageObjectMap",
("old_space", 0x0440d): "EmptyScript",
("old_space", 0x04451): "ManyClosuresCell",
("old_space", 0x0445d): "ArrayConstructorProtector",
("old_space", 0x04471): "NoElementsProtector",
("old_space", 0x04485): "MegaDOMProtector",
("old_space", 0x04499): "IsConcatSpreadableProtector",
("old_space", 0x044ad): "ArraySpeciesProtector",
("old_space", 0x044c1): "TypedArraySpeciesProtector",
("old_space", 0x044d5): "PromiseSpeciesProtector",
("old_space", 0x044e9): "RegExpSpeciesProtector",
("old_space", 0x044fd): "StringLengthProtector",
("old_space", 0x04511): "ArrayIteratorProtector",
("old_space", 0x04525): "ArrayBufferDetachingProtector",
("old_space", 0x04539): "PromiseHookProtector",
("old_space", 0x0454d): "PromiseResolveProtector",
("old_space", 0x04561): "MapIteratorProtector",
("old_space", 0x04575): "PromiseThenProtector",
("old_space", 0x04589): "SetIteratorProtector",
("old_space", 0x0459d): "StringIteratorProtector",
("old_space", 0x045b1): "NumberStringPrototypeNoReplaceProtector",
("old_space", 0x045c5): "StringSplitCache",
("old_space", 0x049cd): "RegExpMultipleCache",
("old_space", 0x04dd5): "BuiltinsConstantsTable",
("old_space", 0x053a5): "AsyncFunctionAwaitRejectSharedFun",
("old_space", 0x053c9): "AsyncFunctionAwaitResolveSharedFun",
("old_space", 0x053ed): "AsyncGeneratorAwaitRejectSharedFun",
("old_space", 0x05411): "AsyncGeneratorAwaitResolveSharedFun",
("old_space", 0x05435): "AsyncGeneratorYieldWithAwaitResolveSharedFun",
("old_space", 0x05459): "AsyncGeneratorReturnResolveSharedFun",
("old_space", 0x0547d): "AsyncGeneratorReturnClosedRejectSharedFun",
("old_space", 0x054a1): "AsyncGeneratorReturnClosedResolveSharedFun",
("old_space", 0x054c5): "AsyncIteratorValueUnwrapSharedFun",
("old_space", 0x054e9): "PromiseAllResolveElementSharedFun",
("old_space", 0x0550d): "PromiseAllSettledResolveElementSharedFun",
("old_space", 0x05531): "PromiseAllSettledRejectElementSharedFun",
("old_space", 0x05555): "PromiseAnyRejectElementSharedFun",
("old_space", 0x05579): "PromiseCapabilityDefaultRejectSharedFun",
("old_space", 0x0559d): "PromiseCapabilityDefaultResolveSharedFun",
("old_space", 0x055c1): "PromiseCatchFinallySharedFun",
("old_space", 0x055e5): "PromiseGetCapabilitiesExecutorSharedFun",
("old_space", 0x05609): "PromiseThenFinallySharedFun",
("old_space", 0x0562d): "PromiseThrowerFinallySharedFun",
("old_space", 0x05651): "PromiseValueThunkFinallySharedFun",
("old_space", 0x05675): "ProxyRevokeSharedFun",
("old_space", 0x05699): "ShadowRealmImportValueFulfilledSFI",
("old_space", 0x056bd): "SourceTextModuleExecuteAsyncModuleFulfilledSFI",
("old_space", 0x056e1): "SourceTextModuleExecuteAsyncModuleRejectedSFI",
("old_space", 0x04455): "ManyClosuresCell",
("old_space", 0x04461): "ArrayConstructorProtector",
("old_space", 0x04475): "NoElementsProtector",
("old_space", 0x04489): "MegaDOMProtector",
("old_space", 0x0449d): "IsConcatSpreadableProtector",
("old_space", 0x044b1): "ArraySpeciesProtector",
("old_space", 0x044c5): "TypedArraySpeciesProtector",
("old_space", 0x044d9): "PromiseSpeciesProtector",
("old_space", 0x044ed): "RegExpSpeciesProtector",
("old_space", 0x04501): "StringLengthProtector",
("old_space", 0x04515): "ArrayIteratorProtector",
("old_space", 0x04529): "ArrayBufferDetachingProtector",
("old_space", 0x0453d): "PromiseHookProtector",
("old_space", 0x04551): "PromiseResolveProtector",
("old_space", 0x04565): "MapIteratorProtector",
("old_space", 0x04579): "PromiseThenProtector",
("old_space", 0x0458d): "SetIteratorProtector",
("old_space", 0x045a1): "StringIteratorProtector",
("old_space", 0x045b5): "NumberStringPrototypeNoReplaceProtector",
("old_space", 0x045c9): "StringSplitCache",
("old_space", 0x049d1): "RegExpMultipleCache",
("old_space", 0x04dd9): "BuiltinsConstantsTable",
("old_space", 0x053a9): "AsyncFunctionAwaitRejectSharedFun",
("old_space", 0x053cd): "AsyncFunctionAwaitResolveSharedFun",
("old_space", 0x053f1): "AsyncGeneratorAwaitRejectSharedFun",
("old_space", 0x05415): "AsyncGeneratorAwaitResolveSharedFun",
("old_space", 0x05439): "AsyncGeneratorYieldWithAwaitResolveSharedFun",
("old_space", 0x0545d): "AsyncGeneratorReturnResolveSharedFun",
("old_space", 0x05481): "AsyncGeneratorReturnClosedRejectSharedFun",
("old_space", 0x054a5): "AsyncGeneratorReturnClosedResolveSharedFun",
("old_space", 0x054c9): "AsyncIteratorValueUnwrapSharedFun",
("old_space", 0x054ed): "PromiseAllResolveElementSharedFun",
("old_space", 0x05511): "PromiseAllSettledResolveElementSharedFun",
("old_space", 0x05535): "PromiseAllSettledRejectElementSharedFun",
("old_space", 0x05559): "PromiseAnyRejectElementSharedFun",
("old_space", 0x0557d): "PromiseCapabilityDefaultRejectSharedFun",
("old_space", 0x055a1): "PromiseCapabilityDefaultResolveSharedFun",
("old_space", 0x055c5): "PromiseCatchFinallySharedFun",
("old_space", 0x055e9): "PromiseGetCapabilitiesExecutorSharedFun",
("old_space", 0x0560d): "PromiseThenFinallySharedFun",
("old_space", 0x05631): "PromiseThrowerFinallySharedFun",
("old_space", 0x05655): "PromiseValueThunkFinallySharedFun",
("old_space", 0x05679): "ProxyRevokeSharedFun",
("old_space", 0x0569d): "ShadowRealmImportValueFulfilledSFI",
("old_space", 0x056c1): "SourceTextModuleExecuteAsyncModuleFulfilledSFI",
("old_space", 0x056e5): "SourceTextModuleExecuteAsyncModuleRejectedSFI",
}
# Lower 32 bits of first page addresses for various heap spaces.