Skip to content

Commit 51ded9d

Browse files
LeszekSwirskiCommit Bot
authored andcommitted
Reland^2: Remove SFI code field
This is a reland of d8f564e TBR=mstarzinger@chromium.org,yangguo@chromium.org,jgruber@chromium.org Original change's description: > Reland: Remove SFI code field > > Remove the SharedFunctionInfo code field, inferring the code object > from the function_data field instead. In some cases, the function_data > field can now hold a Code object (e.g. some WASM cases). > > (Reland of https://chromium-review.googlesource.com/952452) > > TBR=mstarzinger@chromium.org > > Bug: chromium:783853 > Cq-Include-Trybots: luci.chromium.try:linux_chromium_rel_ng > Change-Id: I10ea5be7ceed1b51362a2fad9be7397624d69343 > Reviewed-on: https://chromium-review.googlesource.com/970649 > Commit-Queue: Leszek Swirski <leszeks@chromium.org> > Reviewed-by: Yang Guo <yangguo@chromium.org> > Reviewed-by: Jakob Gruber <jgruber@chromium.org> > Reviewed-by: Leszek Swirski <leszeks@chromium.org> > Cr-Commit-Position: refs/heads/master@{#52136} Bug: chromium:783853 Cq-Include-Trybots: luci.chromium.try:linux_chromium_rel_ng;master.tryserver.blink:linux_trusty_blink_rel Change-Id: I5187851b923e9a92f43daf8cb99e662786cbb839 Reviewed-on: https://chromium-review.googlesource.com/975942 Commit-Queue: Leszek Swirski <leszeks@chromium.org> Reviewed-by: Leszek Swirski <leszeks@chromium.org> Cr-Commit-Position: refs/heads/master@{#52159}
1 parent 1110486 commit 51ded9d

59 files changed

Lines changed: 907 additions & 525 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/api.cc

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -732,15 +732,33 @@ StartupData SnapshotCreator::CreateBlob(
732732
i::SerializedHandleChecker handle_checker(isolate, &contexts);
733733
CHECK(handle_checker.CheckGlobalAndEternalHandles());
734734

735-
// Complete in-object slack tracking for all functions.
736735
i::HeapIterator heap_iterator(isolate->heap());
737736
while (i::HeapObject* current_obj = heap_iterator.next()) {
738-
if (!current_obj->IsJSFunction()) continue;
739-
i::JSFunction* fun = i::JSFunction::cast(current_obj);
740-
fun->CompleteInobjectSlackTrackingIfActive();
737+
// Complete in-object slack tracking for all functions.
738+
if (current_obj->IsJSFunction()) {
739+
i::JSFunction* fun = i::JSFunction::cast(current_obj);
740+
fun->CompleteInobjectSlackTrackingIfActive();
741+
}
742+
743+
// Clear out re-compilable data from all shared function infos. Any
744+
// JSFunctions using these SFIs will have their code pointers reset by the
745+
// partial serializer.
746+
if (current_obj->IsSharedFunctionInfo() &&
747+
function_code_handling == FunctionCodeHandling::kClear) {
748+
i::SharedFunctionInfo* shared = i::SharedFunctionInfo::cast(current_obj);
749+
if (shared->HasBytecodeArray()) {
750+
shared->ClearBytecodeArray();
751+
} else if (shared->HasAsmWasmData()) {
752+
shared->ClearAsmWasmData();
753+
} else if (shared->HasPreParsedScopeData()) {
754+
shared->ClearPreParsedScopeData();
755+
}
756+
DCHECK(shared->HasCodeObject() || shared->HasBuiltinId() ||
757+
shared->IsApiFunction());
758+
}
741759
}
742760

743-
i::StartupSerializer startup_serializer(isolate, function_code_handling);
761+
i::StartupSerializer startup_serializer(isolate);
744762
startup_serializer.SerializeStrongReferences();
745763

746764
// Serialize each context with a new partial serializer.
@@ -9692,9 +9710,8 @@ Local<Function> debug::GetBuiltin(Isolate* v8_isolate, Builtin builtin) {
96929710
}
96939711

96949712
i::Handle<i::String> name = isolate->factory()->empty_string();
9695-
i::Handle<i::Code> code(isolate->builtins()->builtin(builtin_id));
96969713
i::NewFunctionArgs args = i::NewFunctionArgs::ForBuiltinWithoutPrototype(
9697-
name, code, builtin_id, i::LanguageMode::kSloppy);
9714+
name, builtin_id, i::LanguageMode::kSloppy);
96989715
i::Handle<i::JSFunction> fun = isolate->factory()->NewFunction(args);
96999716

97009717
fun->shared()->DontAdaptArguments();

src/asmjs/asm-js.cc

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -65,21 +65,20 @@ bool AreStdlibMembersValid(Isolate* isolate, Handle<JSReceiver> stdlib,
6565
Handle<Object> value = JSReceiver::GetDataProperty(stdlib, name);
6666
if (!value->IsNaN()) return false;
6767
}
68-
#define STDLIB_MATH_FUNC(fname, FName, ignore1, ignore2) \
69-
if (members.Contains(wasm::AsmJsParser::StandardMember::kMath##FName)) { \
70-
members.Remove(wasm::AsmJsParser::StandardMember::kMath##FName); \
71-
Handle<Name> name(isolate->factory()->InternalizeOneByteString( \
72-
STATIC_CHAR_VECTOR(#fname))); \
73-
Handle<Object> value = StdlibMathMember(isolate, stdlib, name); \
74-
if (!value->IsJSFunction()) return false; \
75-
SharedFunctionInfo* shared = Handle<JSFunction>::cast(value)->shared(); \
76-
if (shared->HasLazyDeserializationBuiltinId()) { \
77-
if (shared->lazy_deserialization_builtin_id() != Builtins::kMath##FName) \
78-
return false; \
79-
} else if (shared->code() != \
80-
isolate->builtins()->builtin(Builtins::kMath##FName)) { \
81-
return false; \
82-
} \
68+
#define STDLIB_MATH_FUNC(fname, FName, ignore1, ignore2) \
69+
if (members.Contains(wasm::AsmJsParser::StandardMember::kMath##FName)) { \
70+
members.Remove(wasm::AsmJsParser::StandardMember::kMath##FName); \
71+
Handle<Name> name(isolate->factory()->InternalizeOneByteString( \
72+
STATIC_CHAR_VECTOR(#fname))); \
73+
Handle<Object> value = StdlibMathMember(isolate, stdlib, name); \
74+
if (!value->IsJSFunction()) return false; \
75+
SharedFunctionInfo* shared = Handle<JSFunction>::cast(value)->shared(); \
76+
if (!shared->HasBuiltinId() || \
77+
shared->builtin_id() != Builtins::kMath##FName) { \
78+
return false; \
79+
} \
80+
DCHECK_EQ(shared->GetCode(), \
81+
isolate->builtins()->builtin(Builtins::kMath##FName)); \
8382
}
8483
STDLIB_MATH_FUNCTION_LIST(STDLIB_MATH_FUNC)
8584
#undef STDLIB_MATH_FUNC
@@ -302,7 +301,6 @@ CompilationJob::Status AsmJsCompilationJob::FinalizeJobImpl(Isolate* isolate) {
302301
result->set(kWasmDataCompiledModule, *compiled);
303302
result->set(kWasmDataUsesBitSet, *uses_bitset);
304303
compilation_info()->SetAsmWasmData(result);
305-
compilation_info()->SetCode(BUILTIN_CODE(isolate, InstantiateAsmJs));
306304

307305
RecordHistograms(isolate);
308306
ReportCompilationSuccess(parse_info()->script(),

src/bailout-reason.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ namespace internal {
3232
V(kInvalidHandleScopeLevel, "Invalid HandleScope level") \
3333
V(kInvalidJumpTableIndex, "Invalid jump table index") \
3434
V(kInvalidRegisterFileInGenerator, "invalid register file in generator") \
35+
V(kInvalidSharedFunctionInfoData, "Invalid SharedFunctionInfo data") \
3536
V(kMissingBytecodeArray, "Missing bytecode array from function") \
3637
V(kObjectNotTagged, "The object is not tagged") \
3738
V(kObjectTagged, "The object is tagged") \

src/bootstrapper.cc

Lines changed: 20 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -359,10 +359,10 @@ namespace {
359359
// Non-construct case.
360360
V8_NOINLINE Handle<SharedFunctionInfo> SimpleCreateSharedFunctionInfo(
361361
Isolate* isolate, Builtins::Name builtin_id, Handle<String> name, int len) {
362-
Handle<Code> code = isolate->builtins()->builtin_handle(builtin_id);
363362
const bool kNotConstructor = false;
364-
Handle<SharedFunctionInfo> shared = isolate->factory()->NewSharedFunctionInfo(
365-
name, code, kNotConstructor, kNormalFunction, builtin_id);
363+
Handle<SharedFunctionInfo> shared =
364+
isolate->factory()->NewSharedFunctionInfoForBuiltin(
365+
name, builtin_id, kNotConstructor, kNormalFunction);
366366
shared->set_internal_formal_parameter_count(len);
367367
shared->set_length(len);
368368
return shared;
@@ -373,10 +373,10 @@ V8_NOINLINE Handle<SharedFunctionInfo>
373373
SimpleCreateConstructorSharedFunctionInfo(Isolate* isolate,
374374
Builtins::Name builtin_id,
375375
Handle<String> name, int len) {
376-
Handle<Code> code = isolate->builtins()->builtin_handle(builtin_id);
377376
const bool kIsConstructor = true;
378-
Handle<SharedFunctionInfo> shared = isolate->factory()->NewSharedFunctionInfo(
379-
name, code, kIsConstructor, kNormalFunction, builtin_id);
377+
Handle<SharedFunctionInfo> shared =
378+
isolate->factory()->NewSharedFunctionInfoForBuiltin(
379+
name, builtin_id, kIsConstructor, kNormalFunction);
380380
shared->SetConstructStub(*BUILTIN_CODE(isolate, JSBuiltinsConstructStub));
381381
shared->set_internal_formal_parameter_count(len);
382382
shared->set_length(len);
@@ -402,22 +402,21 @@ V8_NOINLINE Handle<JSFunction> CreateFunction(
402402
Isolate* isolate, Handle<String> name, InstanceType type, int instance_size,
403403
int inobject_properties, MaybeHandle<Object> maybe_prototype,
404404
Builtins::Name builtin_id) {
405-
Handle<Code> code(isolate->builtins()->builtin(builtin_id));
406405
Handle<Object> prototype;
407406
Handle<JSFunction> result;
408407

409408
if (maybe_prototype.ToHandle(&prototype)) {
410409
NewFunctionArgs args = NewFunctionArgs::ForBuiltinWithPrototype(
411-
name, code, prototype, type, instance_size, inobject_properties,
412-
builtin_id, IMMUTABLE);
410+
name, prototype, type, instance_size, inobject_properties, builtin_id,
411+
IMMUTABLE);
413412

414413
result = isolate->factory()->NewFunction(args);
415414
// Make the JSFunction's prototype object fast.
416415
JSObject::MakePrototypesFast(handle(result->prototype(), isolate),
417416
kStartAtReceiver, isolate);
418417
} else {
419418
NewFunctionArgs args = NewFunctionArgs::ForBuiltinWithoutPrototype(
420-
name, code, builtin_id, LanguageMode::kStrict);
419+
name, builtin_id, LanguageMode::kStrict);
421420
result = isolate->factory()->NewFunction(args);
422421
}
423422

@@ -608,10 +607,8 @@ Handle<JSFunction> Genesis::CreateEmptyFunction(Isolate* isolate) {
608607

609608
// Allocate the empty function as the prototype for function according to
610609
// ES#sec-properties-of-the-function-prototype-object
611-
Handle<Code> code(BUILTIN_CODE(isolate, EmptyFunction));
612-
NewFunctionArgs args =
613-
NewFunctionArgs::ForBuiltin(factory->empty_string(), code,
614-
empty_function_map, Builtins::kEmptyFunction);
610+
NewFunctionArgs args = NewFunctionArgs::ForBuiltin(
611+
factory->empty_string(), empty_function_map, Builtins::kEmptyFunction);
615612
Handle<JSFunction> empty_function = factory->NewFunction(args);
616613

617614
// --- E m p t y ---
@@ -663,9 +660,8 @@ Handle<JSFunction> Genesis::GetThrowTypeErrorIntrinsic() {
663660
return restricted_properties_thrower_;
664661
}
665662
Handle<String> name(factory()->empty_string());
666-
Handle<Code> code = BUILTIN_CODE(isolate(), StrictPoisonPillThrower);
667663
NewFunctionArgs args = NewFunctionArgs::ForBuiltinWithoutPrototype(
668-
name, code, Builtins::kStrictPoisonPillThrower, i::LanguageMode::kStrict);
664+
name, Builtins::kStrictPoisonPillThrower, i::LanguageMode::kStrict);
669665
Handle<JSFunction> function = factory()->NewFunction(args);
670666
function->shared()->DontAdaptArguments();
671667

@@ -1228,11 +1224,10 @@ Handle<JSGlobalObject> Genesis::CreateNewGlobals(
12281224

12291225
if (js_global_object_template.is_null()) {
12301226
Handle<String> name(factory()->empty_string());
1231-
Handle<Code> code = BUILTIN_CODE(isolate(), Illegal);
12321227
Handle<JSObject> prototype =
12331228
factory()->NewFunctionPrototype(isolate()->object_function());
12341229
NewFunctionArgs args = NewFunctionArgs::ForBuiltinWithPrototype(
1235-
name, code, prototype, JS_GLOBAL_OBJECT_TYPE, JSGlobalObject::kSize, 0,
1230+
name, prototype, JS_GLOBAL_OBJECT_TYPE, JSGlobalObject::kSize, 0,
12361231
Builtins::kIllegal, MUTABLE);
12371232
js_global_object_function = factory()->NewFunction(args);
12381233
#ifdef DEBUG
@@ -1261,9 +1256,8 @@ Handle<JSGlobalObject> Genesis::CreateNewGlobals(
12611256
Handle<JSFunction> global_proxy_function;
12621257
if (global_proxy_template.IsEmpty()) {
12631258
Handle<String> name(factory()->empty_string());
1264-
Handle<Code> code = BUILTIN_CODE(isolate(), Illegal);
12651259
NewFunctionArgs args = NewFunctionArgs::ForBuiltinWithPrototype(
1266-
name, code, factory()->the_hole_value(), JS_GLOBAL_PROXY_TYPE,
1260+
name, factory()->the_hole_value(), JS_GLOBAL_PROXY_TYPE,
12671261
JSGlobalProxy::SizeWithEmbedderFields(0), 0, Builtins::kIllegal,
12681262
MUTABLE);
12691263
global_proxy_function = factory()->NewFunction(args);
@@ -1399,11 +1393,9 @@ static void InstallError(Isolate* isolate, Handle<JSObject> global,
13991393
namespace {
14001394

14011395
void InstallMakeError(Isolate* isolate, int builtin_id, int context_index) {
1402-
Handle<Code> code(isolate->builtins()->builtin(builtin_id));
14031396
NewFunctionArgs args = NewFunctionArgs::ForBuiltinWithPrototype(
1404-
isolate->factory()->empty_string(), code,
1405-
isolate->factory()->the_hole_value(), JS_OBJECT_TYPE,
1406-
JSObject::kHeaderSize, 0, builtin_id, MUTABLE);
1397+
isolate->factory()->empty_string(), isolate->factory()->the_hole_value(),
1398+
JS_OBJECT_TYPE, JSObject::kHeaderSize, 0, builtin_id, MUTABLE);
14071399

14081400
Handle<JSFunction> function = isolate->factory()->NewFunction(args);
14091401
function->shared()->DontAdaptArguments();
@@ -3281,10 +3273,9 @@ void Genesis::InitializeGlobal(Handle<JSGlobalObject> global_object,
32813273
proxy_function_map->SetInObjectUnusedPropertyFields(unused_property_fields);
32823274

32833275
Handle<String> name = factory->Proxy_string();
3284-
Handle<Code> code(BUILTIN_CODE(isolate, ProxyConstructor));
32853276

32863277
NewFunctionArgs args = NewFunctionArgs::ForBuiltin(
3287-
name, code, proxy_function_map, Builtins::kProxyConstructor);
3278+
name, proxy_function_map, Builtins::kProxyConstructor);
32883279
Handle<JSFunction> proxy_function = factory->NewFunction(args);
32893280

32903281
JSFunction::SetInitialMap(proxy_function, isolate->proxy_map(),
@@ -3388,9 +3379,9 @@ void Genesis::InitializeGlobal(Handle<JSGlobalObject> global_object,
33883379
{ // --- sloppy arguments map
33893380
Handle<String> arguments_string = factory->Arguments_string();
33903381
NewFunctionArgs args = NewFunctionArgs::ForBuiltinWithPrototype(
3391-
arguments_string, BUILTIN_CODE(isolate, Illegal),
3392-
isolate->initial_object_prototype(), JS_ARGUMENTS_TYPE,
3393-
JSSloppyArgumentsObject::kSize, 2, Builtins::kIllegal, MUTABLE);
3382+
arguments_string, isolate->initial_object_prototype(),
3383+
JS_ARGUMENTS_TYPE, JSSloppyArgumentsObject::kSize, 2,
3384+
Builtins::kIllegal, MUTABLE);
33943385
Handle<JSFunction> function = factory->NewFunction(args);
33953386
Handle<Map> map(function->initial_map());
33963387

src/builtins/arm/builtins-arm.cc

Lines changed: 68 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1245,17 +1245,75 @@ void Builtins::Generate_InterpreterEnterBytecodeDispatch(MacroAssembler* masm) {
12451245
}
12461246

12471247
void Builtins::Generate_CompileLazyDeoptimizedCode(MacroAssembler* masm) {
1248-
// Set the code slot inside the JSFunction to the trampoline to the
1249-
// interpreter entry.
1250-
__ ldr(r2, FieldMemOperand(r1, JSFunction::kSharedFunctionInfoOffset));
1251-
__ ldr(r2, FieldMemOperand(r2, SharedFunctionInfo::kCodeOffset));
1248+
// Set the code slot inside the JSFunction to CompileLazy.
1249+
__ Move(r2, BUILTIN_CODE(masm->isolate(), CompileLazy));
12521250
__ str(r2, FieldMemOperand(r1, JSFunction::kCodeOffset));
12531251
__ RecordWriteField(r1, JSFunction::kCodeOffset, r2, r4, kLRHasNotBeenSaved,
12541252
kDontSaveFPRegs, OMIT_REMEMBERED_SET, OMIT_SMI_CHECK);
12551253
// Jump to compile lazy.
12561254
Generate_CompileLazy(masm);
12571255
}
12581256

1257+
static void GetSharedFunctionInfoCode(MacroAssembler* masm, Register sfi_data,
1258+
Register scratch1) {
1259+
// Figure out the SFI's code object.
1260+
Label done;
1261+
Label check_is_bytecode_array;
1262+
Label check_is_code;
1263+
Label check_is_fixed_array;
1264+
Label check_is_pre_parsed_scope_data;
1265+
Label check_is_function_template_info;
1266+
1267+
Register data_type = scratch1;
1268+
1269+
// IsSmi: Is builtin
1270+
__ JumpIfNotSmi(sfi_data, &check_is_bytecode_array);
1271+
__ Move(scratch1,
1272+
Operand(ExternalReference::builtins_address(masm->isolate())));
1273+
__ ldr(sfi_data, MemOperand::PointerAddressFromSmiKey(scratch1, sfi_data));
1274+
__ b(&done);
1275+
1276+
// Get map for subsequent checks.
1277+
__ bind(&check_is_bytecode_array);
1278+
__ ldr(data_type, FieldMemOperand(sfi_data, HeapObject::kMapOffset));
1279+
__ ldrh(data_type, FieldMemOperand(data_type, Map::kInstanceTypeOffset));
1280+
1281+
// IsBytecodeArray: Interpret bytecode
1282+
__ cmp(data_type, Operand(BYTECODE_ARRAY_TYPE));
1283+
__ b(ne, &check_is_code);
1284+
__ Move(sfi_data, BUILTIN_CODE(masm->isolate(), InterpreterEntryTrampoline));
1285+
__ b(&done);
1286+
1287+
// IsCode: Run code
1288+
__ bind(&check_is_code);
1289+
__ cmp(data_type, Operand(CODE_TYPE));
1290+
__ b(eq, &done);
1291+
1292+
// IsFixedArray: Instantiate using AsmWasmData,
1293+
__ bind(&check_is_fixed_array);
1294+
__ cmp(data_type, Operand(FIXED_ARRAY_TYPE));
1295+
__ b(ne, &check_is_pre_parsed_scope_data);
1296+
__ Move(sfi_data, BUILTIN_CODE(masm->isolate(), InstantiateAsmJs));
1297+
__ b(&done);
1298+
1299+
// IsPreParsedScopeData: Compile lazy
1300+
__ bind(&check_is_pre_parsed_scope_data);
1301+
__ cmp(data_type, Operand(TUPLE2_TYPE));
1302+
__ b(ne, &check_is_function_template_info);
1303+
__ Move(sfi_data, BUILTIN_CODE(masm->isolate(), CompileLazy));
1304+
__ b(&done);
1305+
1306+
// IsFunctionTemplateInfo: API call
1307+
__ bind(&check_is_function_template_info);
1308+
if (FLAG_debug_code) {
1309+
__ cmp(data_type, Operand(FUNCTION_TEMPLATE_INFO_TYPE));
1310+
__ Assert(eq, AbortReason::kInvalidSharedFunctionInfoData);
1311+
}
1312+
__ Move(sfi_data, BUILTIN_CODE(masm->isolate(), HandleApiCall));
1313+
1314+
__ bind(&done);
1315+
}
1316+
12591317
void Builtins::Generate_CompileLazy(MacroAssembler* masm) {
12601318
// ----------- S t a t e -------------
12611319
// -- r0 : argument count (preserved for callee)
@@ -1278,13 +1336,15 @@ void Builtins::Generate_CompileLazy(MacroAssembler* masm) {
12781336
// Is there an optimization marker or optimized code in the feedback vector?
12791337
MaybeTailCallOptimizedCodeSlot(masm, feedback_vector, r4, r6, r5);
12801338

1281-
// We found no optimized code.
1339+
// We found no optimized code. Infer the code object needed for the SFI.
12821340
Register entry = r4;
12831341
__ ldr(entry,
12841342
FieldMemOperand(closure, JSFunction::kSharedFunctionInfoOffset));
1343+
__ ldr(entry,
1344+
FieldMemOperand(entry, SharedFunctionInfo::kFunctionDataOffset));
1345+
GetSharedFunctionInfoCode(masm, entry, r5);
12851346

1286-
// If SFI points to anything other than CompileLazy, install that.
1287-
__ ldr(entry, FieldMemOperand(entry, SharedFunctionInfo::kCodeOffset));
1347+
// If code entry points to anything other than CompileLazy, install that.
12881348
__ Move(r5, masm->CodeObject());
12891349
__ cmp(entry, r5);
12901350
__ b(eq, &gotta_call_runtime);
@@ -1354,25 +1414,9 @@ void Builtins::Generate_DeserializeLazy(MacroAssembler* masm) {
13541414

13551415
{
13561416
// If we've reached this spot, the target builtin has been deserialized and
1357-
// we simply need to copy it over. First to the shared function info.
1417+
// we simply need to copy it over to the target function.
13581418

13591419
Register target_builtin = scratch1;
1360-
Register shared = scratch0;
1361-
1362-
__ ldr(shared,
1363-
FieldMemOperand(target, JSFunction::kSharedFunctionInfoOffset));
1364-
1365-
CHECK(r5 != target && r5 != scratch0 && r5 != scratch1);
1366-
CHECK(r9 != target && r9 != scratch0 && r9 != scratch1);
1367-
1368-
__ str(target_builtin,
1369-
FieldMemOperand(shared, SharedFunctionInfo::kCodeOffset));
1370-
__ mov(r9, target_builtin); // Write barrier clobbers r9 below.
1371-
__ RecordWriteField(shared, SharedFunctionInfo::kCodeOffset, r9, r5,
1372-
kLRHasNotBeenSaved, kDontSaveFPRegs,
1373-
OMIT_REMEMBERED_SET, OMIT_SMI_CHECK);
1374-
1375-
// And second to the target function.
13761420

13771421
__ str(target_builtin, FieldMemOperand(target, JSFunction::kCodeOffset));
13781422
__ mov(r9, target_builtin); // Write barrier clobbers r9 below.

0 commit comments

Comments
 (0)