@@ -1349,3 +1349,63 @@ irgen::emitDynamicTupleTypeLabels(IRGenFunction &IGF,
13491349
13501350 return labelString;
13511351}
1352+
1353+ StackAddress
1354+ irgen::emitDynamicFunctionParameterFlags (IRGenFunction &IGF,
1355+ AnyFunctionType::CanParamArrayRef params,
1356+ CanPackType packType,
1357+ llvm::Value *shapeExpression) {
1358+ auto array =
1359+ IGF.emitDynamicAlloca (IGF.IGM .Int32Ty , shapeExpression,
1360+ Alignment (4 ), /* allowTaskAlloc=*/ true );
1361+
1362+ unsigned numExpansions = 0 ;
1363+
1364+ auto visitFn = [&](CanType eltTy,
1365+ unsigned scalarIndex,
1366+ llvm::Value *dynamicIndex,
1367+ llvm::Value *dynamicLength) {
1368+ if (scalarIndex != 0 || dynamicIndex == nullptr ) {
1369+ auto *constant = llvm::ConstantInt::get (IGF.IGM .SizeTy , scalarIndex);
1370+ accumulateSum (IGF, dynamicIndex, constant);
1371+ }
1372+
1373+ auto elt = params[scalarIndex + numExpansions];
1374+ auto flags = getABIParameterFlags (elt.getParameterFlags ());
1375+ auto flagsVal = llvm::ConstantInt::get (
1376+ IGF.IGM .Int32Ty , flags.getIntValue ());
1377+
1378+ assert (eltTy == elt.getPlainType ());
1379+
1380+ // If we're looking at a pack expansion, insert the appropriate
1381+ // number of flags fields.
1382+ if (auto expansionTy = dyn_cast<PackExpansionType>(eltTy)) {
1383+ emitPackExpansionPack (IGF, array.getAddress (), expansionTy,
1384+ dynamicIndex, dynamicLength,
1385+ [&](llvm::Value *) -> llvm::Value * {
1386+ return flagsVal;
1387+ });
1388+
1389+ // We consumed an expansion.
1390+ numExpansions += 1 ;
1391+
1392+ return ;
1393+ }
1394+
1395+ // The destination address, where we put the current element's flags field.
1396+ Address eltAddr (
1397+ IGF.Builder .CreateInBoundsGEP (array.getAddress ().getElementType (),
1398+ array.getAddressPointer (),
1399+ dynamicIndex),
1400+ array.getAddress ().getElementType (),
1401+ array.getAlignment ());
1402+
1403+ // Otherwise, we have a single scalar element, which deposits a single
1404+ // flags field.
1405+ IGF.Builder .CreateStore (flagsVal, eltAddr);
1406+ };
1407+
1408+ (void ) visitPackExplosion (IGF, packType, visitFn);
1409+
1410+ return array;
1411+ }
0 commit comments