@@ -1349,3 +1349,63 @@ irgen::emitDynamicTupleTypeLabels(IRGenFunction &IGF,
1349
1349
1350
1350
return labelString;
1351
1351
}
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