Skip to content

Commit 39b81a3

Browse files
authored
Merge pull request #67724 from slavapestov/variadic-function-type-metadata-irgen
IRGen: Emitting metadata for function types containing pack expansion parameters
2 parents c9be4bd + 59fd295 commit 39b81a3

File tree

6 files changed

+449
-245
lines changed

6 files changed

+449
-245
lines changed

lib/AST/ModuleNameLookup.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ class LookupByName : public ModuleNameLookup<LookupByName> {
7878
lookupKind(lookupKind) {}
7979

8080
private:
81-
/// Returns whether it's okay to stop recursively searching imports, given
81+
/// Returns whether it's okay to stop recursively searching imports, given
8282
/// that we found something non-overloadable.
8383
static bool canReturnEarly() {
8484
return true;

lib/IRGen/GenPack.cpp

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
}

lib/IRGen/GenPack.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,12 @@ emitDynamicTupleTypeLabels(IRGenFunction &IGF,
120120
CanPackType packType,
121121
llvm::Value *shapeExpression);
122122

123+
StackAddress
124+
emitDynamicFunctionParameterFlags(IRGenFunction &IGF,
125+
AnyFunctionType::CanParamArrayRef params,
126+
CanPackType packType,
127+
llvm::Value *shapeExpression);
128+
123129
} // end namespace irgen
124130
} // end namespace swift
125131

0 commit comments

Comments
 (0)