Skip to content

Commit 1de937d

Browse files
committed
fixes
1 parent 74abdf2 commit 1de937d

File tree

6 files changed

+120
-99
lines changed

6 files changed

+120
-99
lines changed

runtime/vm/compiler/backend/il.cc

Lines changed: 32 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -8551,106 +8551,52 @@ void Call1ArgStubInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
85518551
locs(), deopt_id(), env());
85528552
}
85538553

8554-
LocationSummary* CoroutineInitializeInstr::MakeLocationSummary(
8555-
Zone* zone,
8556-
bool opt) const {
8554+
LocationSummary* CoroutineInitializeInstr::MakeLocationSummary(Zone* zone,
8555+
bool opt) const {
85578556
const intptr_t kNumInputs = 1;
85588557
const intptr_t kNumTemps = 0;
8559-
LocationSummary* locs = new (zone) LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
8560-
locs->set_in(0, Location::RegisterLocation(CoroutineInitializeABI::kCoroutineReg));
8558+
LocationSummary* locs = new (zone)
8559+
LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
8560+
locs->set_in(
8561+
0, Location::RegisterLocation(CoroutineInitializeABI::kCoroutineReg));
85618562
return locs;
85628563
}
85638564

85648565
void CoroutineInitializeInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
8565-
const Register kCoroutine = CoroutineInitializeABI::kCoroutineReg;
8566-
8567-
#if defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_ARM64)
8568-
SPILLS_LR_TO_FRAME({});
8569-
#endif
8570-
__ PushObject(compiler::NullObject());
8571-
__ PushRegister(kCoroutine);
8572-
__ CallRuntime(kEnterCoroutineRuntimeEntry, 1);
8573-
__ PopRegister(kCoroutine);
8574-
__ Drop(1);
8575-
8576-
__ PushRegister(FPREG);
8577-
__ StoreFieldToOffset(SPREG, kCoroutine, Coroutine::native_stack_base_offset());
8578-
8579-
__ LoadFieldFromOffset(SPREG, kCoroutine, Coroutine::stack_base_offset());
8580-
__ PushRegister(kCoroutine);
8581-
compiler->GenerateStubCall(source(), StubCode::CoroutineEntry(), UntaggedPcDescriptors::kOther, locs(), deopt_id(), env());
8582-
__ PopRegister(kCoroutine);
8583-
__ StoreFieldToOffset(SPREG, kCoroutine, Coroutine::stack_base_offset());
8584-
8585-
__ LoadFieldFromOffset(SPREG, kCoroutine, Coroutine::native_stack_base_offset());
8586-
__ PopRegister(FPREG);
8587-
if (!FLAG_precompiled_mode) __ RestoreCodePointer();
8588-
if (FLAG_precompiled_mode) __ movq(PP, compiler::Address(THR, Thread::global_object_pool_offset()));
8589-
8590-
__ PushObject(compiler::NullObject());
8591-
__ PushRegister(kCoroutine);
8592-
__ CallRuntime(kExitCoroutineRuntimeEntry, 1);
8593-
__ PopRegister(kCoroutine);
8594-
__ Drop(1);
8566+
compiler->GenerateStubCall(source(), StubCode::CoroutineInitialize(),
8567+
UntaggedPcDescriptors::kOther, locs(), deopt_id(),
8568+
env());
85958569
}
85968570

8597-
LocationSummary* CoroutineForkInstr::MakeLocationSummary(
8598-
Zone* zone,
8599-
bool opt) const {
8571+
LocationSummary* CoroutineForkInstr::MakeLocationSummary(Zone* zone,
8572+
bool opt) const {
86008573
const intptr_t kNumInputs = 2;
86018574
const intptr_t kNumTemps = 0;
8602-
LocationSummary* locs = new (zone) LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
8603-
locs->set_in(0, Location::RegisterLocation(CoroutineForkABI::kCallerCoroutineReg));
8604-
locs->set_in(1, Location::RegisterLocation(CoroutineForkABI::kForkedCoroutineReg));
8575+
LocationSummary* locs = new (zone)
8576+
LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
8577+
locs->set_in(
8578+
0, Location::RegisterLocation(CoroutineForkABI::kCallerCoroutineReg));
8579+
locs->set_in(
8580+
1, Location::RegisterLocation(CoroutineForkABI::kForkedCoroutineReg));
86058581
return locs;
86068582
}
86078583

86088584
void CoroutineForkInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
8609-
const Register kCallerCoroutine = CoroutineForkABI::kCallerCoroutineReg;
8610-
const Register kForkedCoroutine = CoroutineForkABI::kForkedCoroutineReg;
8611-
8612-
#if defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_ARM64)
8613-
SPILLS_LR_TO_FRAME({});
8614-
#endif
8615-
__ PushObject(compiler::NullObject());
8616-
__ PushRegister(kForkedCoroutine);
8617-
__ CallRuntime(kEnterForkedCoroutineRuntimeEntry, 1);
8618-
__ PopRegister(kForkedCoroutine);
8619-
__ Drop(1);
8620-
8621-
__ LoadCompressedFieldFromOffset(kCallerCoroutine, kForkedCoroutine, Coroutine::caller_offset());
8622-
8623-
__ PushRegister(FPREG);
8624-
__ StoreFieldToOffset(SPREG, kCallerCoroutine, Coroutine::stack_base_offset());
8625-
8626-
__ LoadFieldFromOffset(SPREG, kForkedCoroutine, Coroutine::stack_base_offset());
8627-
__ PushRegister(kForkedCoroutine);
8628-
compiler->GenerateStubCall(source(), StubCode::CoroutineEntry(), UntaggedPcDescriptors::kOther, locs(), deopt_id(), env());
8629-
__ PopRegister(kForkedCoroutine);
8630-
__ StoreFieldToOffset(SPREG, kForkedCoroutine, Coroutine::stack_base_offset());
8631-
8632-
__ LoadCompressedFieldFromOffset(kCallerCoroutine, kForkedCoroutine, Coroutine::caller_offset());
8633-
8634-
__ LoadFieldFromOffset(SPREG, kCallerCoroutine, Coroutine::stack_base_offset());
8635-
__ PopRegister(FPREG);
8636-
if (!FLAG_precompiled_mode) __ RestoreCodePointer();
8637-
if (FLAG_precompiled_mode) __ movq(PP, compiler::Address(THR, Thread::global_object_pool_offset()));
8638-
8639-
__ PushObject(compiler::NullObject());
8640-
__ PushRegister(kForkedCoroutine);
8641-
__ CallRuntime(kExitForkedCoroutineRuntimeEntry, 1);
8642-
__ PopRegister(kForkedCoroutine);
8643-
__ Drop(1);
8585+
compiler->GenerateStubCall(source(), StubCode::CoroutineFork(),
8586+
UntaggedPcDescriptors::kOther, locs(), deopt_id(),
8587+
env());
86448588
}
86458589

8646-
LocationSummary* CoroutineTransferInstr::MakeLocationSummary(
8647-
Zone* zone,
8648-
bool opt) const {
8590+
LocationSummary* CoroutineTransferInstr::MakeLocationSummary(Zone* zone,
8591+
bool opt) const {
86498592
const intptr_t kNumInputs = 2;
86508593
const intptr_t kNumTemps = 0;
8651-
LocationSummary* locs = new (zone) LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
8652-
locs->set_in(0, Location::RegisterLocation(CoroutineTransferABI::kFromCoroutineReg));
8653-
locs->set_in(1, Location::RegisterLocation(CoroutineTransferABI::kToCoroutineReg));
8594+
LocationSummary* locs = new (zone)
8595+
LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
8596+
locs->set_in(
8597+
0, Location::RegisterLocation(CoroutineTransferABI::kFromCoroutineReg));
8598+
locs->set_in(
8599+
1, Location::RegisterLocation(CoroutineTransferABI::kToCoroutineReg));
86548600
return locs;
86558601
}
86568602

@@ -8661,14 +8607,15 @@ void CoroutineTransferInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
86618607

86628608
#if defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_ARM64)
86638609
SPILLS_LR_TO_FRAME({});
8664-
#endif
8610+
#endif
86658611
__ PushRegister(FPREG);
86668612
__ StoreFieldToOffset(SPREG, kFromCoroutine, Coroutine::stack_base_offset());
86678613

86688614
__ LoadFieldFromOffset(SPREG, kToCoroutine, Coroutine::stack_base_offset());
86698615
__ PopRegister(FPREG);
86708616
if (!FLAG_precompiled_mode) __ RestoreCodePointer();
8671-
if (FLAG_precompiled_mode) __ movq(PP, compiler::Address(THR, Thread::global_object_pool_offset()));
8617+
if (FLAG_precompiled_mode)
8618+
__ movq(PP, compiler::Address(THR, Thread::global_object_pool_offset()));
86728619

86738620
__ LoadFieldFromOffset(kToStackLimit, kToCoroutine, Coroutine::overflow_stack_limit_offset());
86748621
__ StoreToOffset(kToCoroutine, THR, Thread::coroutine_offset());
@@ -8677,7 +8624,7 @@ void CoroutineTransferInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
86778624
compiler::Label scheduled_interrupts;
86788625
__ LoadFromOffset(TMP, THR, Thread::stack_limit_offset());
86798626
__ testq(TMP, compiler::Immediate(Thread::kInterruptsMask));
8680-
__ BranchIf(NOT_ZERO, &scheduled_interrupts);
8627+
__ BranchIf(ZERO, &scheduled_interrupts);
86818628
__ StoreToOffset(kToStackLimit, THR, Thread::stack_limit_offset());
86828629
__ Bind(&scheduled_interrupts);
86838630
}

runtime/vm/compiler/stub_code_compiler.cc

Lines changed: 85 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3234,17 +3234,99 @@ void StubCodeCompiler::GenerateSubtypeTestCacheSearch(
32343234
}
32353235
#endif
32363236

3237-
void StubCodeCompiler::GenerateCoroutineEntryStub() {
3238-
const Register kCoroutine = CoroutineEntryABI::kCoroutineReg;
3237+
void StubCodeCompiler::GenerateCoroutineInitializeStub() {
3238+
const Register kCoroutine = CoroutineEntryABI::kCoroutineReg;
3239+
3240+
#if defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_ARM64)
3241+
SPILLS_LR_TO_FRAME({});
3242+
#endif
32393243
__ EnterStubFrame();
3244+
3245+
__ PushObject(compiler::NullObject());
3246+
__ PushRegister(kCoroutine);
3247+
__ CallRuntime(kEnterCoroutineRuntimeEntry, 1);
3248+
__ PopRegister(kCoroutine);
3249+
__ Drop(1);
3250+
3251+
__ PushRegister(FPREG);
3252+
__ StoreFieldToOffset(SPREG, kCoroutine, Coroutine::native_stack_base_offset());
3253+
3254+
__ LoadFieldFromOffset(SPREG, kCoroutine, Coroutine::stack_base_offset());
3255+
__ PushRegister(kCoroutine);
3256+
32403257
__ LoadCompressedFieldFromOffset(FUNCTION_REG, kCoroutine, Coroutine::trampoline_offset());
3241-
__ LoadFieldFromOffset(TMP, FUNCTION_REG, Function::entry_point_offset());
32423258
if (!FLAG_precompiled_mode) {
32433259
__ LoadCompressedFieldFromOffset(CODE_REG, FUNCTION_REG, Function::code_offset());
32443260
__ LoadImmediate(ARGS_DESC_REG, 0);
32453261
}
32463262
__ Call(compiler::FieldAddress(FUNCTION_REG, Function::entry_point_offset()));
3263+
3264+
__ PopRegister(kCoroutine);
3265+
__ StoreFieldToOffset(SPREG, kCoroutine, Coroutine::stack_base_offset());
3266+
3267+
__ LoadFieldFromOffset(SPREG, kCoroutine, Coroutine::native_stack_base_offset());
3268+
__ PopRegister(FPREG);
3269+
if (!FLAG_precompiled_mode) __ RestoreCodePointer();
3270+
if (FLAG_precompiled_mode) __ movq(PP, compiler::Address(THR, Thread::global_object_pool_offset()));
3271+
3272+
__ PushObject(compiler::NullObject());
3273+
__ PushRegister(kCoroutine);
3274+
__ CallRuntime(kExitCoroutineRuntimeEntry, 1);
3275+
__ PopRegister(kCoroutine);
3276+
__ Drop(1);
3277+
3278+
__ LeaveStubFrame();
3279+
3280+
__ Ret();
3281+
}
3282+
3283+
void StubCodeCompiler::GenerateCoroutineForkStub() {
3284+
const Register kCallerCoroutine = CoroutineForkABI::kCallerCoroutineReg;
3285+
const Register kForkedCoroutine = CoroutineForkABI::kForkedCoroutineReg;
3286+
3287+
#if defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_ARM64)
3288+
SPILLS_LR_TO_FRAME({});
3289+
#endif
3290+
__ EnterStubFrame();
3291+
3292+
__ PushObject(compiler::NullObject());
3293+
__ PushRegister(kForkedCoroutine);
3294+
__ CallRuntime(kEnterForkedCoroutineRuntimeEntry, 1);
3295+
__ PopRegister(kForkedCoroutine);
3296+
__ Drop(1);
3297+
3298+
__ LoadCompressedFieldFromOffset(kCallerCoroutine, kForkedCoroutine, Coroutine::caller_offset());
3299+
3300+
__ PushRegister(FPREG);
3301+
__ StoreFieldToOffset(SPREG, kCallerCoroutine, Coroutine::stack_base_offset());
3302+
3303+
__ LoadFieldFromOffset(SPREG, kForkedCoroutine, Coroutine::stack_base_offset());
3304+
3305+
__ LoadCompressedFieldFromOffset(FUNCTION_REG, kForkedCoroutine, Coroutine::trampoline_offset());
3306+
if (!FLAG_precompiled_mode) {
3307+
__ LoadCompressedFieldFromOffset(CODE_REG, FUNCTION_REG, Function::code_offset());
3308+
__ LoadImmediate(ARGS_DESC_REG, 0);
3309+
}
3310+
__ Call(compiler::FieldAddress(FUNCTION_REG, Function::entry_point_offset()));
3311+
3312+
__ StoreFieldToOffset(SPREG, kForkedCoroutine, Coroutine::stack_base_offset());
3313+
3314+
__ LoadCompressedFieldFromOffset(kCallerCoroutine, kForkedCoroutine, Coroutine::caller_offset());
3315+
3316+
__ LoadFieldFromOffset(SPREG, kCallerCoroutine, Coroutine::stack_base_offset());
3317+
__ PopRegister(FPREG);
3318+
if (!FLAG_precompiled_mode) __ RestoreCodePointer();
3319+
if (FLAG_precompiled_mode)
3320+
__ movq(PP, compiler::Address(THR, Thread::global_object_pool_offset()));
3321+
3322+
__ PushObject(compiler::NullObject());
3323+
__ PushRegister(kForkedCoroutine);
3324+
__ CallRuntime(kExitForkedCoroutineRuntimeEntry, 1);
3325+
__ PopRegister(kForkedCoroutine);
3326+
__ Drop(1);
3327+
32473328
__ LeaveStubFrame();
3329+
32483330
__ Ret();
32493331
}
32503332

runtime/vm/stack_frame.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,7 @@ void StackFrame::VisitObjectPointers(ObjectPointerVisitor* visitor) {
303303
// to an osr function. In each of these cases, all stack slots contain
304304
// tagged pointers, so fall through.
305305
#if defined(DEBUG)
306+
OS::Print(" pc 0x%" Pp " fp 0x%" Pp " sp 0x%" Pp "\n", pc_, fp_, sp_);
306307
if (FLAG_precompiled_mode) {
307308
ASSERT(IsStubFrame());
308309
} else {

runtime/vm/stub_code.cc

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -137,13 +137,6 @@ bool StubCode::InInvocationStub(uword pc) {
137137
return (pc >= entry) && (pc < (entry + size));
138138
}
139139

140-
bool StubCode::InCoroutineEntryStub(uword pc) {
141-
ASSERT(HasBeenInitialized());
142-
uword entry = StubCode::CoroutineEntry().EntryPoint();
143-
uword size = StubCode::CoroutineEntrySize();
144-
return (pc >= entry) && (pc < (entry + size));
145-
}
146-
147140
bool StubCode::InJumpToFrameStub(uword pc) {
148141
ASSERT(HasBeenInitialized());
149142
uword entry = StubCode::JumpToFrame().EntryPoint();

runtime/vm/stub_code.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,6 @@ class StubCode : public AllStatic {
4949
// transitioning into dart code.
5050
static bool InInvocationStub(uword pc);
5151

52-
// Check if specified pc is in the dart coroutine entry stub
53-
static bool InCoroutineEntryStub(uword pc);
54-
5552
// Check if the specified pc is in the jump to frame stub.
5653
static bool InJumpToFrameStub(uword pc);
5754

runtime/vm/stub_code_list.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,8 @@ namespace dart {
177177
V(SuspendSyncStarAtYield) \
178178
V(AsyncExceptionHandler) \
179179
V(CloneSuspendState) \
180-
V(CoroutineEntry) \
180+
V(CoroutineInitialize) \
181+
V(CoroutineFork) \
181182
V(FfiAsyncCallbackSend) \
182183
V(UnknownDartCode)
183184

0 commit comments

Comments
 (0)