@@ -4484,44 +4484,9 @@ void irgen::emitTaskCancel(IRGenFunction &IGF, llvm::Value *task) {
44844484 call->setCallingConv (IGF.IGM .SwiftCC );
44854485}
44864486
4487- llvm::Value *irgen::emitTaskCreate (IRGenFunction &IGF, llvm::Value *flags,
4488- llvm::Value *taskGroup,
4489- llvm::Value *futureResultType,
4490- llvm::Value *taskFunction,
4491- llvm::Value *localContextInfo,
4492- SubstitutionMap subs) {
4493- // Start with empty task options.
4494- llvm::Value *taskOptions =
4495- llvm::ConstantInt::get (IGF.IGM .SwiftTaskOptionRecordPtrTy , 0 );
4496-
4497- // If there is a task group, emit a task group option structure to contain it.
4498- if (taskGroup) {
4499- TaskOptionRecordFlags optionsFlags (TaskOptionRecordKind::TaskGroup);
4500- llvm::Value *optionsFlagsVal = llvm::ConstantInt::get (
4501- IGF.IGM .SizeTy , optionsFlags.getOpaqueValue ());
4502-
4503- auto optionsRecord = IGF.createAlloca (
4504- IGF.IGM .SwiftTaskGroupTaskOptionRecordTy , Alignment (),
4505- " task_group_options" );
4506- auto optionsBaseRecord = IGF.Builder .CreateStructGEP (
4507- optionsRecord, 0 , Size ());
4508-
4509- // Flags
4510- IGF.Builder .CreateStore (
4511- optionsFlagsVal,
4512- IGF.Builder .CreateStructGEP (optionsBaseRecord, 0 , Size ()));
4513- // Parent
4514- IGF.Builder .CreateStore (
4515- taskOptions, IGF.Builder .CreateStructGEP (optionsBaseRecord, 1 , Size ()));
4516- // TaskGroup
4517- IGF.Builder .CreateStore (
4518- taskGroup, IGF.Builder .CreateStructGEP (optionsRecord, 1 , Size ()));
4519-
4520- taskOptions = IGF.Builder .CreateBitOrPointerCast (
4521- optionsRecord.getAddress (), IGF.IGM .SwiftTaskOptionRecordPtrTy );
4522- }
4523-
4524- // In embedded Swift, create and pass result type info.
4487+ llvm::Value *irgen::addEmbeddedSwiftResultTypeInfo (IRGenFunction &IGF,
4488+ llvm::Value *taskOptions,
4489+ SubstitutionMap subs) {
45254490 if (IGF.IGM .Context .LangOpts .hasFeature (Feature::Embedded)) {
45264491 auto optionsRecord =
45274492 IGF.createAlloca (IGF.IGM .SwiftResultTypeInfoTaskOptionRecordTy ,
@@ -4575,6 +4540,48 @@ llvm::Value *irgen::emitTaskCreate(IRGenFunction &IGF, llvm::Value *flags,
45754540 taskOptions = IGF.Builder .CreateBitOrPointerCast (
45764541 optionsRecord.getAddress (), IGF.IGM .SwiftTaskOptionRecordPtrTy );
45774542 }
4543+ return taskOptions;
4544+ }
4545+
4546+ llvm::Value *irgen::emitTaskCreate (IRGenFunction &IGF, llvm::Value *flags,
4547+ llvm::Value *taskGroup,
4548+ llvm::Value *futureResultType,
4549+ llvm::Value *taskFunction,
4550+ llvm::Value *localContextInfo,
4551+ SubstitutionMap subs) {
4552+ // Start with empty task options.
4553+ llvm::Value *taskOptions =
4554+ llvm::ConstantInt::get (IGF.IGM .SwiftTaskOptionRecordPtrTy , 0 );
4555+
4556+ // If there is a task group, emit a task group option structure to contain it.
4557+ if (taskGroup) {
4558+ TaskOptionRecordFlags optionsFlags (TaskOptionRecordKind::TaskGroup);
4559+ llvm::Value *optionsFlagsVal = llvm::ConstantInt::get (
4560+ IGF.IGM .SizeTy , optionsFlags.getOpaqueValue ());
4561+
4562+ auto optionsRecord = IGF.createAlloca (
4563+ IGF.IGM .SwiftTaskGroupTaskOptionRecordTy , Alignment (),
4564+ " task_group_options" );
4565+ auto optionsBaseRecord = IGF.Builder .CreateStructGEP (
4566+ optionsRecord, 0 , Size ());
4567+
4568+ // Flags
4569+ IGF.Builder .CreateStore (
4570+ optionsFlagsVal,
4571+ IGF.Builder .CreateStructGEP (optionsBaseRecord, 0 , Size ()));
4572+ // Parent
4573+ IGF.Builder .CreateStore (
4574+ taskOptions, IGF.Builder .CreateStructGEP (optionsBaseRecord, 1 , Size ()));
4575+ // TaskGroup
4576+ IGF.Builder .CreateStore (
4577+ taskGroup, IGF.Builder .CreateStructGEP (optionsRecord, 1 , Size ()));
4578+
4579+ taskOptions = IGF.Builder .CreateBitOrPointerCast (
4580+ optionsRecord.getAddress (), IGF.IGM .SwiftTaskOptionRecordPtrTy );
4581+ }
4582+
4583+ // In embedded Swift, create and pass result type info.
4584+ taskOptions = addEmbeddedSwiftResultTypeInfo (IGF, taskOptions, subs);
45784585
45794586 assert (futureResultType && " no future?!" );
45804587 llvm::CallInst *result = IGF.Builder .CreateCall (
0 commit comments