Skip to content

Commit

Permalink
Merge pull request 'fibers' (dart-lang#9) from fibers into main
Browse files Browse the repository at this point in the history
  • Loading branch information
antonbashir committed Sep 1, 2024
2 parents c937d58 + 7b19ae5 commit 57e4644
Show file tree
Hide file tree
Showing 22 changed files with 86 additions and 268 deletions.
8 changes: 4 additions & 4 deletions runtime/lib/fiber.cc
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@

#include "vm/bootstrap_natives.h"

#include "vm/compiler/method_recognizer.h"
#include "vm/compiler/runtime_api.h"
#include "vm/native_entry.h"
#include "vm/tagged_pointer.h"
#include "vm/virtual_memory.h"

namespace dart {
DEFINE_NATIVE_ENTRY(Coroutine_factory, 0, 3) {
GET_NON_NULL_NATIVE_ARGUMENT(Smi, stack, arguments->NativeArgAt(1));
GET_NON_NULL_NATIVE_ARGUMENT(Smi, size, arguments->NativeArgAt(1));
GET_NON_NULL_NATIVE_ARGUMENT(Closure, entry, arguments->NativeArgAt(2));
return Coroutine::New(stack.Value(), Function::Handle(entry.function()).ptr());
void* stack = VirtualMemory::Allocate(size.Value() * kWordSize, false, false, "coroutine-stack")->address();
return Coroutine::New((void**)stack + size.Value(), size.Value(), Function::Handle(entry.function()).ptr());
}
} // namespace dart
6 changes: 3 additions & 3 deletions runtime/vm/compiler/backend/constant_propagator.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1565,13 +1565,13 @@ void ConstantPropagator::VisitCall1ArgStub(Call1ArgStubInstr* instr) {
SetValue(instr, non_constant_);
}

void ConstantPropagator::VisitCoroutineInitializeStub(CoroutineInitializeStubInstr* instr) {
void ConstantPropagator::VisitCoroutineInitialize(CoroutineInitializeInstr* instr) {
}

void ConstantPropagator::VisitCoroutineTransferStub(CoroutineTransferStubInstr* instr) {
void ConstantPropagator::VisitCoroutineTransfer(CoroutineTransferInstr* instr) {
}

void ConstantPropagator::VisitCoroutineForkStub(CoroutineForkStubInstr* instr) {
void ConstantPropagator::VisitCoroutineFork(CoroutineForkInstr* instr) {
}

void ConstantPropagator::VisitSuspend(SuspendInstr* instr) {
Expand Down
36 changes: 18 additions & 18 deletions runtime/vm/compiler/backend/il.cc
Original file line number Diff line number Diff line change
Expand Up @@ -8551,18 +8551,18 @@ void Call1ArgStubInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
locs(), deopt_id(), env());
}

LocationSummary* CoroutineInitializeStubInstr::MakeLocationSummary(
LocationSummary* CoroutineInitializeInstr::MakeLocationSummary(
Zone* zone,
bool opt) const {
const intptr_t kNumInputs = 1;
const intptr_t kNumTemps = 0;
LocationSummary* locs = new (zone) LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
locs->set_in(0, Location::RegisterLocation(CoroutineInitializeStubABI::kCoroutineReg));
locs->set_in(0, Location::RegisterLocation(CoroutineInitializeABI::kCoroutineReg));
return locs;
}

void CoroutineInitializeStubInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
const Register kCoroutine = CoroutineInitializeStubABI::kCoroutineReg;
void CoroutineInitializeInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
const Register kCoroutine = CoroutineInitializeABI::kCoroutineReg;

#if defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_ARM64)
SPILLS_LR_TO_FRAME({});
Expand Down Expand Up @@ -8606,21 +8606,21 @@ void CoroutineInitializeStubInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
__ LeaveFrame();
}

LocationSummary* CoroutineTransferStubInstr::MakeLocationSummary(
LocationSummary* CoroutineTransferInstr::MakeLocationSummary(
Zone* zone,
bool opt) const {
const intptr_t kNumInputs = 2;
const intptr_t kNumTemps = 0;
LocationSummary* locs = new (zone) LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
locs->set_in(0, Location::RegisterLocation(CoroutineTransferStubABI::kFromCoroutineReg));
locs->set_in(1, Location::RegisterLocation(CoroutineTransferStubABI::kToCoroutineReg));
locs->set_in(0, Location::RegisterLocation(CoroutineTransferABI::kFromCoroutineReg));
locs->set_in(1, Location::RegisterLocation(CoroutineTransferABI::kToCoroutineReg));
return locs;
}

void CoroutineTransferStubInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
const Register kFromCoroutine = CoroutineTransferStubABI::kFromCoroutineReg;
const Register kToCoroutine = CoroutineTransferStubABI::kToCoroutineReg;
const Register kToStackLimit = CoroutineTransferStubABI::kToStackLimitReg;
void CoroutineTransferInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
const Register kFromCoroutine = CoroutineTransferABI::kFromCoroutineReg;
const Register kToCoroutine = CoroutineTransferABI::kToCoroutineReg;
const Register kToStackLimit = CoroutineTransferABI::kToStackLimitReg;

#if defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_ARM64)
SPILLS_LR_TO_FRAME({});
Expand All @@ -8644,21 +8644,21 @@ void CoroutineTransferStubInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
__ StoreFieldToOffset(kFromCoroutine, kToCoroutine, Coroutine::caller_offset());
}

LocationSummary* CoroutineForkStubInstr::MakeLocationSummary(
LocationSummary* CoroutineForkInstr::MakeLocationSummary(
Zone* zone,
bool opt) const {
const intptr_t kNumInputs = 2;
const intptr_t kNumTemps = 0;
LocationSummary* locs = new (zone) LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
locs->set_in(0, Location::RegisterLocation(CoroutineForkStubABI::kCallerCoroutineReg));
locs->set_in(1, Location::RegisterLocation(CoroutineForkStubABI::kForkedCoroutineReg));
locs->set_in(0, Location::RegisterLocation(CoroutineForkABI::kCallerCoroutineReg));
locs->set_in(1, Location::RegisterLocation(CoroutineForkABI::kForkedCoroutineReg));
return locs;
}

void CoroutineForkStubInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
const Register kCallerCoroutine = CoroutineForkStubABI::kCallerCoroutineReg;
const Register kForkedCoroutine = CoroutineForkStubABI::kForkedCoroutineReg;
const Register kStackLimit = CoroutineForkStubABI::kStackLimitReg;
void CoroutineForkInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
const Register kCallerCoroutine = CoroutineForkABI::kCallerCoroutineReg;
const Register kForkedCoroutine = CoroutineForkABI::kForkedCoroutineReg;
const Register kStackLimit = CoroutineForkABI::kStackLimitReg;

#if defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_ARM64)
SPILLS_LR_TO_FRAME({});
Expand Down
42 changes: 21 additions & 21 deletions runtime/vm/compiler/backend/il.h
Original file line number Diff line number Diff line change
Expand Up @@ -545,9 +545,9 @@ struct InstrAttrs {
M(IntConverter, kNoGC) \
M(BitCast, kNoGC) \
M(Call1ArgStub, _) \
M(CoroutineInitializeStub, _) \
M(CoroutineTransferStub, _) \
M(CoroutineForkStub, _) \
M(CoroutineInitialize, _) \
M(CoroutineTransfer, _) \
M(CoroutineFork, _) \
M(LoadThread, kNoGC) \
M(Deoptimize, kNoGC) \
M(SimdOp, kNoGC) \
Expand Down Expand Up @@ -11476,11 +11476,11 @@ class Call1ArgStubInstr : public TemplateDefinition<1, Throws> {
DISALLOW_COPY_AND_ASSIGN(Call1ArgStubInstr);
};

class CoroutineInitializeStubInstr : public TemplateInstruction<1, NoThrow> {
class CoroutineInitializeInstr : public TemplateInstruction<1, NoThrow> {
public:
CoroutineInitializeStubInstr(Value* root, intptr_t deopt_id)
CoroutineInitializeInstr(Value* root, intptr_t deopt_id)
: TemplateInstruction(InstructionSource(TokenPosition::kNoSource),
deopt_id) {
deopt_id) {
SetInputAt(0, root);
}

Expand All @@ -11493,19 +11493,19 @@ class CoroutineInitializeStubInstr : public TemplateInstruction<1, NoThrow> {
return InputCount();
}

DECLARE_INSTRUCTION(CoroutineInitializeStub);
DECLARE_INSTRUCTION(CoroutineInitialize);
PRINT_OPERANDS_TO_SUPPORT
DECLARE_EMPTY_SERIALIZATION(CoroutineInitializeStubInstr, TemplateInstruction)
DECLARE_EMPTY_SERIALIZATION(CoroutineInitializeInstr, TemplateInstruction)

private:
DISALLOW_COPY_AND_ASSIGN(CoroutineInitializeStubInstr);
DISALLOW_COPY_AND_ASSIGN(CoroutineInitializeInstr);
};

class CoroutineTransferStubInstr : public TemplateInstruction<2, NoThrow> {
class CoroutineTransferInstr : public TemplateInstruction<2, NoThrow> {
public:
CoroutineTransferStubInstr(Value* from, Value* to, intptr_t deopt_id)
CoroutineTransferInstr(Value* from, Value* to, intptr_t deopt_id)
: TemplateInstruction(InstructionSource(TokenPosition::kNoSource),
deopt_id) {
deopt_id) {
SetInputAt(0, from);
SetInputAt(1, to);
}
Expand All @@ -11521,19 +11521,19 @@ class CoroutineTransferStubInstr : public TemplateInstruction<2, NoThrow> {
return InputCount();
}

DECLARE_INSTRUCTION(CoroutineTransferStub);
DECLARE_INSTRUCTION(CoroutineTransfer);
PRINT_OPERANDS_TO_SUPPORT
DECLARE_EMPTY_SERIALIZATION(CoroutineTransferStubInstr, TemplateInstruction)
DECLARE_EMPTY_SERIALIZATION(CoroutineTransferInstr, TemplateInstruction)

private:
DISALLOW_COPY_AND_ASSIGN(CoroutineTransferStubInstr);
DISALLOW_COPY_AND_ASSIGN(CoroutineTransferInstr);
};

class CoroutineForkStubInstr : public TemplateInstruction<2, NoThrow> {
class CoroutineForkInstr : public TemplateInstruction<2, NoThrow> {
public:
CoroutineForkStubInstr(Value* from, Value* to, intptr_t deopt_id)
CoroutineForkInstr(Value* from, Value* to, intptr_t deopt_id)
: TemplateInstruction(InstructionSource(TokenPosition::kNoSource),
deopt_id) {
deopt_id) {
SetInputAt(0, from);
SetInputAt(1, to);
}
Expand All @@ -11549,13 +11549,13 @@ class CoroutineForkStubInstr : public TemplateInstruction<2, NoThrow> {
return InputCount();
}

DECLARE_INSTRUCTION(CoroutineForkStub);
DECLARE_INSTRUCTION(CoroutineFork);
PRINT_OPERANDS_TO_SUPPORT

DECLARE_EMPTY_SERIALIZATION(CoroutineForkStubInstr, TemplateInstruction)
DECLARE_EMPTY_SERIALIZATION(CoroutineForkInstr, TemplateInstruction)

private:
DISALLOW_COPY_AND_ASSIGN(CoroutineForkStubInstr);
DISALLOW_COPY_AND_ASSIGN(CoroutineForkInstr);
};

// Suspends execution using the suspend stub specified using [StubId].
Expand Down
6 changes: 3 additions & 3 deletions runtime/vm/compiler/backend/il_printer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1576,22 +1576,22 @@ void Call1ArgStubInstr::PrintOperandsTo(BaseTextBuffer* f) const {
f->AddString(")");
}

void CoroutineInitializeStubInstr::PrintOperandsTo(BaseTextBuffer* f) const {
void CoroutineInitializeInstr::PrintOperandsTo(BaseTextBuffer* f) const {
const char* name = "CoroutineInitialize";
f->Printf("%s(", name);
root()->PrintTo(f);
f->AddString(")");
}

void CoroutineTransferStubInstr::PrintOperandsTo(BaseTextBuffer* f) const {
void CoroutineTransferInstr::PrintOperandsTo(BaseTextBuffer* f) const {
const char* name = "CoroutineTransfer";
f->Printf("%s(", name);
from()->PrintTo(f);
to()->PrintTo(f);
f->AddString(")");
}

void CoroutineForkStubInstr::PrintOperandsTo(BaseTextBuffer* f) const {
void CoroutineForkInstr::PrintOperandsTo(BaseTextBuffer* f) const {
const char* name = "CoroutineFork";
f->Printf("%s(", name);
from()->PrintTo(f);
Expand Down
12 changes: 6 additions & 6 deletions runtime/vm/compiler/frontend/kernel_to_il.cc
Original file line number Diff line number Diff line change
Expand Up @@ -4766,20 +4766,20 @@ Fragment FlowGraphBuilder::Call1ArgStub(TokenPosition position,
}

Fragment FlowGraphBuilder::CoroutineInitialize() {
CoroutineInitializeStubInstr* instr =
new (Z) CoroutineInitializeStubInstr(Pop(), GetNextDeoptId());
CoroutineInitializeInstr* instr =
new (Z) CoroutineInitializeInstr(Pop(), GetNextDeoptId());
return Fragment(instr);
}

Fragment FlowGraphBuilder::CoroutineTransfer() {
CoroutineTransferStubInstr* instr =
new (Z) CoroutineTransferStubInstr(Pop(), Pop(), GetNextDeoptId());
CoroutineTransferInstr* instr =
new (Z) CoroutineTransferInstr(Pop(), Pop(), GetNextDeoptId());
return Fragment(instr);
}

Fragment FlowGraphBuilder::CoroutineFork() {
CoroutineForkStubInstr* instr =
new (Z) CoroutineForkStubInstr(Pop(), Pop(), GetNextDeoptId());
CoroutineForkInstr* instr =
new (Z) CoroutineForkInstr(Pop(), Pop(), GetNextDeoptId());
return Fragment(instr);
}

Expand Down
Loading

0 comments on commit 57e4644

Please sign in to comment.