@@ -4470,44 +4470,9 @@ void irgen::emitTaskCancel(IRGenFunction &IGF, llvm::Value *task) {
44704470 call->setCallingConv (IGF.IGM .SwiftCC );
44714471}
44724472
4473- llvm::Value *irgen::emitTaskCreate (IRGenFunction &IGF, llvm::Value *flags,
4474- llvm::Value *taskGroup,
4475- llvm::Value *futureResultType,
4476- llvm::Value *taskFunction,
4477- llvm::Value *localContextInfo,
4478- SubstitutionMap subs) {
4479- // Start with empty task options.
4480- llvm::Value *taskOptions =
4481- llvm::ConstantInt::get (IGF.IGM .SwiftTaskOptionRecordPtrTy , 0 );
4482-
4483- // If there is a task group, emit a task group option structure to contain it.
4484- if (taskGroup) {
4485- TaskOptionRecordFlags optionsFlags (TaskOptionRecordKind::TaskGroup);
4486- llvm::Value *optionsFlagsVal = llvm::ConstantInt::get (
4487- IGF.IGM .SizeTy , optionsFlags.getOpaqueValue ());
4488-
4489- auto optionsRecord = IGF.createAlloca (
4490- IGF.IGM .SwiftTaskGroupTaskOptionRecordTy , Alignment (),
4491- " task_group_options" );
4492- auto optionsBaseRecord = IGF.Builder .CreateStructGEP (
4493- optionsRecord, 0 , Size ());
4494-
4495- // Flags
4496- IGF.Builder .CreateStore (
4497- optionsFlagsVal,
4498- IGF.Builder .CreateStructGEP (optionsBaseRecord, 0 , Size ()));
4499- // Parent
4500- IGF.Builder .CreateStore (
4501- taskOptions, IGF.Builder .CreateStructGEP (optionsBaseRecord, 1 , Size ()));
4502- // TaskGroup
4503- IGF.Builder .CreateStore (
4504- taskGroup, IGF.Builder .CreateStructGEP (optionsRecord, 1 , Size ()));
4505-
4506- taskOptions = IGF.Builder .CreateBitOrPointerCast (
4507- optionsRecord.getAddress (), IGF.IGM .SwiftTaskOptionRecordPtrTy );
4508- }
4509-
4510- // In embedded Swift, create and pass result type info.
4473+ llvm::Value *irgen::addEmbeddedSwiftResultTypeInfo (IRGenFunction &IGF,
4474+ llvm::Value *taskOptions,
4475+ SubstitutionMap subs) {
45114476 if (IGF.IGM .Context .LangOpts .hasFeature (Feature::Embedded)) {
45124477 auto optionsRecord =
45134478 IGF.createAlloca (IGF.IGM .SwiftResultTypeInfoTaskOptionRecordTy ,
@@ -4561,6 +4526,48 @@ llvm::Value *irgen::emitTaskCreate(IRGenFunction &IGF, llvm::Value *flags,
45614526 taskOptions = IGF.Builder .CreateBitOrPointerCast (
45624527 optionsRecord.getAddress (), IGF.IGM .SwiftTaskOptionRecordPtrTy );
45634528 }
4529+ return taskOptions;
4530+ }
4531+
4532+ llvm::Value *irgen::emitTaskCreate (IRGenFunction &IGF, llvm::Value *flags,
4533+ llvm::Value *taskGroup,
4534+ llvm::Value *futureResultType,
4535+ llvm::Value *taskFunction,
4536+ llvm::Value *localContextInfo,
4537+ SubstitutionMap subs) {
4538+ // Start with empty task options.
4539+ llvm::Value *taskOptions =
4540+ llvm::ConstantInt::get (IGF.IGM .SwiftTaskOptionRecordPtrTy , 0 );
4541+
4542+ // If there is a task group, emit a task group option structure to contain it.
4543+ if (taskGroup) {
4544+ TaskOptionRecordFlags optionsFlags (TaskOptionRecordKind::TaskGroup);
4545+ llvm::Value *optionsFlagsVal = llvm::ConstantInt::get (
4546+ IGF.IGM .SizeTy , optionsFlags.getOpaqueValue ());
4547+
4548+ auto optionsRecord = IGF.createAlloca (
4549+ IGF.IGM .SwiftTaskGroupTaskOptionRecordTy , Alignment (),
4550+ " task_group_options" );
4551+ auto optionsBaseRecord = IGF.Builder .CreateStructGEP (
4552+ optionsRecord, 0 , Size ());
4553+
4554+ // Flags
4555+ IGF.Builder .CreateStore (
4556+ optionsFlagsVal,
4557+ IGF.Builder .CreateStructGEP (optionsBaseRecord, 0 , Size ()));
4558+ // Parent
4559+ IGF.Builder .CreateStore (
4560+ taskOptions, IGF.Builder .CreateStructGEP (optionsBaseRecord, 1 , Size ()));
4561+ // TaskGroup
4562+ IGF.Builder .CreateStore (
4563+ taskGroup, IGF.Builder .CreateStructGEP (optionsRecord, 1 , Size ()));
4564+
4565+ taskOptions = IGF.Builder .CreateBitOrPointerCast (
4566+ optionsRecord.getAddress (), IGF.IGM .SwiftTaskOptionRecordPtrTy );
4567+ }
4568+
4569+ // In embedded Swift, create and pass result type info.
4570+ taskOptions = addEmbeddedSwiftResultTypeInfo (IGF, taskOptions, subs);
45644571
45654572 assert (futureResultType && " no future?!" );
45664573 llvm::CallInst *result = IGF.Builder .CreateCall (
0 commit comments