@@ -4470,18 +4470,17 @@ void irgen::emitTaskCancel(IRGenFunction &IGF, llvm::Value *task) {
44704470 call->setCallingConv (IGF.IGM .SwiftCC );
44714471}
44724472
4473- llvm::Value *irgen::emitTaskCreate (
4474- IRGenFunction &IGF,
4475- llvm::Value *flags,
4476- llvm::Value *taskGroup,
4477- llvm::Value *futureResultType,
4478- llvm::Value *taskFunction,
4479- llvm::Value *localContextInfo,
4480- SubstitutionMap subs) {
4481- // If there is a task group, emit a task group option structure to contain
4482- // it.
4483- llvm::Value *taskOptions = llvm::ConstantInt::get (
4484- IGF.IGM .SwiftTaskOptionRecordPtrTy , 0 );
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.
44854484 if (taskGroup) {
44864485 TaskOptionRecordFlags optionsFlags (TaskOptionRecordKind::TaskGroup);
44874486 llvm::Value *optionsFlagsVal = llvm::ConstantInt::get (
@@ -4492,14 +4491,73 @@ llvm::Value *irgen::emitTaskCreate(
44924491 " task_group_options" );
44934492 auto optionsBaseRecord = IGF.Builder .CreateStructGEP (
44944493 optionsRecord, 0 , Size ());
4494+
4495+ // Flags
44954496 IGF.Builder .CreateStore (
44964497 optionsFlagsVal,
44974498 IGF.Builder .CreateStructGEP (optionsBaseRecord, 0 , Size ()));
4499+ // Parent
44984500 IGF.Builder .CreateStore (
44994501 taskOptions, IGF.Builder .CreateStructGEP (optionsBaseRecord, 1 , Size ()));
4500-
4502+ // TaskGroup
45014503 IGF.Builder .CreateStore (
45024504 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.
4511+ if (IGF.IGM .Context .LangOpts .hasFeature (Feature::Embedded)) {
4512+ auto optionsRecord =
4513+ IGF.createAlloca (IGF.IGM .SwiftResultTypeInfoTaskOptionRecordTy ,
4514+ Alignment (), " result_type_info" );
4515+ auto optionsBaseRecord =
4516+ IGF.Builder .CreateStructGEP (optionsRecord, 0 , Size ());
4517+
4518+ TaskOptionRecordFlags optionsFlags (TaskOptionRecordKind::ResultTypeInfo);
4519+ llvm::Value *optionsFlagsVal = llvm::ConstantInt::get (
4520+ IGF.IGM .SizeTy , optionsFlags.getOpaqueValue ());
4521+
4522+ // Flags
4523+ IGF.Builder .CreateStore (
4524+ optionsFlagsVal,
4525+ IGF.Builder .CreateStructGEP (optionsBaseRecord, 0 , Size ()));
4526+ // Parent
4527+ IGF.Builder .CreateStore (
4528+ taskOptions, IGF.Builder .CreateStructGEP (optionsBaseRecord, 1 , Size ()));
4529+
4530+ Type unloweredType = subs.getReplacementTypes ()[0 ];
4531+ SILType lowered = IGF.IGM .getLoweredType (unloweredType);
4532+ const TypeInfo &TI = IGF.IGM .getTypeInfo (lowered);
4533+ CanType canType = lowered.getASTType ();
4534+ FixedPacking packing = TI.getFixedPacking (IGF.IGM );
4535+
4536+ // Size
4537+ IGF.Builder .CreateStore (
4538+ TI.getStaticSize (IGF.IGM ),
4539+ IGF.Builder .CreateStructGEP (optionsRecord, 1 , Size ()));
4540+ // Align mask
4541+ IGF.Builder .CreateStore (
4542+ TI.getStaticAlignmentMask (IGF.IGM ),
4543+ IGF.Builder .CreateStructGEP (optionsRecord, 2 , Size ()));
4544+ // initializeWithCopy witness
4545+ IGF.Builder .CreateStore (
4546+ IGF.IGM .getOrCreateValueWitnessFunction (
4547+ ValueWitness::InitializeWithCopy, packing, canType, lowered, TI),
4548+ IGF.Builder .CreateStructGEP (optionsRecord, 3 , Size ()));
4549+ // storeEnumTagSinglePayload witness
4550+ IGF.Builder .CreateStore (
4551+ IGF.IGM .getOrCreateValueWitnessFunction (
4552+ ValueWitness::StoreEnumTagSinglePayload, packing, canType, lowered,
4553+ TI),
4554+ IGF.Builder .CreateStructGEP (optionsRecord, 4 , Size ()));
4555+ // destroy witness
4556+ IGF.Builder .CreateStore (
4557+ IGF.IGM .getOrCreateValueWitnessFunction (ValueWitness::Destroy, packing,
4558+ canType, lowered, TI),
4559+ IGF.Builder .CreateStructGEP (optionsRecord, 5 , Size ()));
4560+
45034561 taskOptions = IGF.Builder .CreateBitOrPointerCast (
45044562 optionsRecord.getAddress (), IGF.IGM .SwiftTaskOptionRecordPtrTy );
45054563 }
0 commit comments