@@ -598,6 +598,31 @@ llvm::Value *irgen::maybeAddEmbeddedSwiftResultTypeInfo(IRGenFunction &IGF,
598598
599599namespace {
600600
601+ struct InitialSerialExecutorRecordTraits {
602+ static StringRef getLabel () {
603+ return " initial_serial_executor" ;
604+ }
605+ static llvm::StructType *getRecordType (IRGenModule &IGM) {
606+ return IGM.SwiftInitialSerialExecutorTaskOptionRecordTy ;
607+ }
608+ static TaskOptionRecordFlags getRecordFlags () {
609+ return TaskOptionRecordFlags (TaskOptionRecordKind::InitialSerialExecutor);
610+ }
611+ static CanType getValueType (ASTContext &ctx) {
612+ return ctx.TheExecutorType ;
613+ }
614+
615+ void initialize (IRGenFunction &IGF, Address recordAddr,
616+ Explosion &serialExecutor) const {
617+ auto executorRecord =
618+ IGF.Builder .CreateStructGEP (recordAddr, 1 , 2 * IGF.IGM .getPointerSize ());
619+ IGF.Builder .CreateStore (serialExecutor.claimNext (),
620+ IGF.Builder .CreateStructGEP (executorRecord, 0 , Size ()));
621+ IGF.Builder .CreateStore (serialExecutor.claimNext (),
622+ IGF.Builder .CreateStructGEP (executorRecord, 1 , Size ()));
623+ }
624+ };
625+
601626struct TaskGroupRecordTraits {
602627 static StringRef getLabel () {
603628 return " task_group" ;
@@ -647,6 +672,15 @@ struct InitialTaskExecutorRecordTraits {
647672
648673} // end anonymous namespace
649674
675+ static llvm::Value *
676+ maybeAddInitialSerialExecutorOptionRecord (IRGenFunction &IGF,
677+ llvm::Value *prevOptions,
678+ OptionalExplosion &serialExecutor) {
679+ return maybeAddOptionRecord (IGF, prevOptions,
680+ InitialSerialExecutorRecordTraits (),
681+ serialExecutor);
682+ }
683+
650684static llvm::Value *
651685maybeAddTaskGroupOptionRecord (IRGenFunction &IGF, llvm::Value *prevOptions,
652686 OptionalExplosion &taskGroup) {
@@ -665,6 +699,7 @@ maybeAddInitialTaskExecutorOptionRecord(IRGenFunction &IGF,
665699
666700std::pair<llvm::Value *, llvm::Value *>
667701irgen::emitTaskCreate (IRGenFunction &IGF, llvm::Value *flags,
702+ OptionalExplosion &serialExecutor,
668703 OptionalExplosion &taskGroup,
669704 OptionalExplosion &taskExecutor,
670705 Explosion &taskFunction,
@@ -686,6 +721,10 @@ irgen::emitTaskCreate(IRGenFunction &IGF, llvm::Value *flags,
686721 resultTypeMetadata = IGF.emitTypeMetadataRef (resultType);
687722 }
688723
724+ // Add an option record for the initial serial executor, if present.
725+ taskOptions =
726+ maybeAddInitialSerialExecutorOptionRecord (IGF, taskOptions, serialExecutor);
727+
689728 // Add an option record for the task group, if present.
690729 taskOptions = maybeAddTaskGroupOptionRecord (IGF, taskOptions, taskGroup);
691730
0 commit comments