Skip to content

Commit c31620d

Browse files
committed
IRGen: Mangle generic signature and type for outlined thunks
1 parent 8d6b60f commit c31620d

21 files changed

+172
-185
lines changed

lib/Demangling/Demangler.cpp

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2119,43 +2119,59 @@ NodePointer Demangler::demangleWitness() {
21192119
}
21202120
case 'e': {
21212121
if (auto sig = popNode(Node::Kind::DependentGenericSignature))
2122-
return createWithChildren(Node::Kind::OutlinedCopy,
2122+
return createWithChildren(Node::Kind::OutlinedConsume,
21232123
popNode(Node::Kind::Type), sig);
21242124
return createWithChild(Node::Kind::OutlinedConsume,
21252125
popNode(Node::Kind::Type));
21262126
}
21272127
case 'r': {
2128+
if (auto sig = popNode(Node::Kind::DependentGenericSignature))
2129+
return createWithChildren(Node::Kind::OutlinedRetain,
2130+
popNode(Node::Kind::Type), sig);
21282131
return createWithChild(Node::Kind::OutlinedRetain,
21292132
popNode(Node::Kind::Type));
21302133
}
21312134
case 's': {
2135+
if (auto sig = popNode(Node::Kind::DependentGenericSignature))
2136+
return createWithChildren(Node::Kind::OutlinedRelease,
2137+
popNode(Node::Kind::Type), sig);
21322138
return createWithChild(Node::Kind::OutlinedRelease,
21332139
popNode(Node::Kind::Type));
21342140
}
21352141
case 'b': {
2136-
NodePointer IndexChild = demangleIndexAsNode();
2137-
return createWithChildren(Node::Kind::OutlinedInitializeWithTake,
2138-
popNode(Node::Kind::Type), IndexChild);
2142+
if (auto sig = popNode(Node::Kind::DependentGenericSignature))
2143+
return createWithChildren(Node::Kind::OutlinedInitializeWithTake,
2144+
popNode(Node::Kind::Type), sig);
2145+
return createWithChild(Node::Kind::OutlinedInitializeWithTake,
2146+
popNode(Node::Kind::Type));
21392147
}
21402148
case 'c': {
2141-
NodePointer IndexChild = demangleIndexAsNode();
2142-
return createWithChildren(Node::Kind::OutlinedInitializeWithCopy,
2143-
popNode(Node::Kind::Type), IndexChild);
2149+
if (auto sig = popNode(Node::Kind::DependentGenericSignature))
2150+
return createWithChildren(Node::Kind::OutlinedInitializeWithCopy,
2151+
popNode(Node::Kind::Type), sig);
2152+
return createWithChild(Node::Kind::OutlinedInitializeWithCopy,
2153+
popNode(Node::Kind::Type));
21442154
}
21452155
case 'd': {
2146-
NodePointer IndexChild = demangleIndexAsNode();
2147-
return createWithChildren(Node::Kind::OutlinedAssignWithTake,
2148-
popNode(Node::Kind::Type), IndexChild);
2156+
if (auto sig = popNode(Node::Kind::DependentGenericSignature))
2157+
return createWithChildren(Node::Kind::OutlinedAssignWithTake,
2158+
popNode(Node::Kind::Type), sig);
2159+
return createWithChild(Node::Kind::OutlinedAssignWithTake,
2160+
popNode(Node::Kind::Type));
21492161
}
21502162
case 'f': {
2151-
NodePointer IndexChild = demangleIndexAsNode();
2152-
return createWithChildren(Node::Kind::OutlinedAssignWithCopy,
2153-
popNode(Node::Kind::Type), IndexChild);
2163+
if (auto sig = popNode(Node::Kind::DependentGenericSignature))
2164+
return createWithChildren(Node::Kind::OutlinedAssignWithCopy,
2165+
popNode(Node::Kind::Type), sig);
2166+
return createWithChild(Node::Kind::OutlinedAssignWithCopy,
2167+
popNode(Node::Kind::Type));
21542168
}
21552169
case 'h': {
2156-
NodePointer IndexChild = demangleIndexAsNode();
2157-
return createWithChildren(Node::Kind::OutlinedDestroy,
2158-
popNode(Node::Kind::Type), IndexChild);
2170+
if (auto sig = popNode(Node::Kind::DependentGenericSignature))
2171+
return createWithChildren(Node::Kind::OutlinedDestroy,
2172+
popNode(Node::Kind::Type), sig);
2173+
return createWithChild(Node::Kind::OutlinedDestroy,
2174+
popNode(Node::Kind::Type));
21592175
}
21602176
default:
21612177
return nullptr;

lib/Demangling/Remangler.cpp

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1852,43 +1852,38 @@ void Remangler::mangleOutlinedConsume(Node *node) {
18521852
}
18531853

18541854
void Remangler::mangleOutlinedRetain(Node *node) {
1855-
mangleSingleChildNode(node);
1855+
mangleChildNodes(node);
18561856
Buffer << "WOr";
18571857
}
18581858

18591859
void Remangler::mangleOutlinedRelease(Node *node) {
1860-
mangleSingleChildNode(node);
1860+
mangleChildNodes(node);
18611861
Buffer << "WOs";
18621862
}
18631863

18641864
void Remangler::mangleOutlinedInitializeWithTake(Node *node) {
1865-
mangleChildNode(node, 0);
1865+
mangleChildNodes(node);
18661866
Buffer << "WOb";
1867-
mangleChildNode(node, 1);
18681867
}
18691868

18701869
void Remangler::mangleOutlinedInitializeWithCopy(Node *node) {
1871-
mangleChildNode(node, 0);
1870+
mangleChildNodes(node);
18721871
Buffer << "WOc";
1873-
mangleChildNode(node, 1);
18741872
}
18751873

18761874
void Remangler::mangleOutlinedAssignWithTake(Node *node) {
1877-
mangleChildNode(node, 0);
1875+
mangleChildNodes(node);
18781876
Buffer << "WOd";
1879-
mangleChildNode(node, 1);
18801877
}
18811878

18821879
void Remangler::mangleOutlinedAssignWithCopy(Node *node) {
1883-
mangleChildNode(node, 0);
1880+
mangleChildNodes(node);
18841881
Buffer << "WOf";
1885-
mangleChildNode(node, 1);
18861882
}
18871883

18881884
void Remangler::mangleOutlinedDestroy(Node *node) {
1889-
mangleChildNode(node, 0);
1885+
mangleChildNodes(node);
18901886
Buffer << "WOh";
1891-
mangleChildNode(node, 1);
18921887
}
18931888

18941889
void Remangler::mangleOutlinedVariable(Node *node) {

lib/IRGen/GenDecl.cpp

Lines changed: 53 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -4231,13 +4231,35 @@ IRGenModule::getOrCreateHelperFunction(StringRef fnName, llvm::Type *resultTy,
42314231
return fn;
42324232
}
42334233

4234+
std::pair<CanType, CanGenericSignature>
4235+
irgen::getTypeAndGenericSignatureForManglingOutlineFunction(SILType type) {
4236+
auto loweredType = type.getSwiftRValueType();
4237+
if (loweredType->hasArchetype()) {
4238+
GenericEnvironment *env = nullptr;
4239+
loweredType.findIf([&env](Type t) -> bool {
4240+
if (auto arch = t->getAs<ArchetypeType>()) {
4241+
env = arch->getGenericEnvironment();
4242+
return true;
4243+
}
4244+
return false;
4245+
});
4246+
assert(env && "has archetype but no archetype?!");
4247+
return {loweredType->mapTypeOutOfContext()->getCanonicalType(),
4248+
env->getGenericSignature()->getCanonicalSignature()};
4249+
}
4250+
return {loweredType, nullptr};
4251+
}
4252+
42344253
llvm::Constant *IRGenModule::getOrCreateRetainFunction(const TypeInfo &objectTI,
4235-
Type t,
4254+
SILType t,
42364255
llvm::Type *llvmType) {
42374256
auto *loadableTI = dyn_cast<LoadableTypeInfo>(&objectTI);
42384257
assert(loadableTI && "Should only be called on Loadable types");
42394258
IRGenMangler mangler;
4240-
std::string funcName = mangler.mangleOutlinedRetainFunction(t);
4259+
auto manglingBits =
4260+
getTypeAndGenericSignatureForManglingOutlineFunction(t);
4261+
auto funcName = mangler.mangleOutlinedRetainFunction(manglingBits.first,
4262+
manglingBits.second);
42414263
llvm::Type *argTys[] = {llvmType};
42424264
return getOrCreateHelperFunction(
42434265
funcName, llvmType, argTys,
@@ -4255,12 +4277,16 @@ llvm::Constant *IRGenModule::getOrCreateRetainFunction(const TypeInfo &objectTI,
42554277
}
42564278

42574279
llvm::Constant *
4258-
IRGenModule::getOrCreateReleaseFunction(const TypeInfo &objectTI, Type t,
4280+
IRGenModule::getOrCreateReleaseFunction(const TypeInfo &objectTI,
4281+
SILType t,
42594282
llvm::Type *llvmType) {
42604283
auto *loadableTI = dyn_cast<LoadableTypeInfo>(&objectTI);
42614284
assert(loadableTI && "Should only be called on Loadable types");
42624285
IRGenMangler mangler;
4263-
std::string funcName = mangler.mangleOutlinedReleaseFunction(t);
4286+
auto manglingBits =
4287+
getTypeAndGenericSignatureForManglingOutlineFunction(t);
4288+
auto funcName = mangler.mangleOutlinedReleaseFunction(manglingBits.first,
4289+
manglingBits.second);
42644290
llvm::Type *argTys[] = {llvmType};
42654291
return getOrCreateHelperFunction(
42664292
funcName, llvmType, argTys,
@@ -4304,8 +4330,10 @@ void IRGenModule::generateCallToOutlinedDestroy(
43044330
IRGenFunction &IGF, const TypeInfo &objectTI, Address addr, SILType T,
43054331
const llvm::MapVector<CanType, llvm::Value *> *typeToMetadataVec) {
43064332
IRGenMangler mangler;
4307-
CanType canType = T.getSwiftRValueType();
4308-
std::string funcName = mangler.mangleOutlinedDestroyFunction(canType, this);
4333+
auto manglingBits =
4334+
getTypeAndGenericSignatureForManglingOutlineFunction(T);
4335+
auto funcName = mangler.mangleOutlinedDestroyFunction(manglingBits.first,
4336+
manglingBits.second);
43094337

43104338
llvm::SmallVector<llvm::Type *, 4> argsTysVec;
43114339
llvm::SmallVector<llvm::Value *, 4> argsVec;
@@ -4388,9 +4416,10 @@ llvm::Constant *IRGenModule::getOrCreateOutlinedInitializeWithTakeFunction(
43884416
const TypeInfo &objectTI, llvm::Type *llvmType, SILType addrTy,
43894417
const llvm::MapVector<CanType, llvm::Value *> *typeToMetadataVec) {
43904418
IRGenMangler mangler;
4391-
CanType canType = addrTy.getSwiftRValueType();
4392-
std::string funcName =
4393-
mangler.mangleOutlinedInitializeWithTakeFunction(canType, this);
4419+
auto manglingBits =
4420+
getTypeAndGenericSignatureForManglingOutlineFunction(addrTy);
4421+
auto funcName = mangler.mangleOutlinedInitializeWithTakeFunction(manglingBits.first,
4422+
manglingBits.second);
43944423
auto GenFunc = [](const TypeInfo &objectTI, IRGenFunction &IGF, Address dest,
43954424
Address src, SILType T) {
43964425
objectTI.initializeWithTake(IGF, dest, src, T, true);
@@ -4403,9 +4432,11 @@ llvm::Constant *IRGenModule::getOrCreateOutlinedInitializeWithCopyFunction(
44034432
const TypeInfo &objectTI, llvm::Type *llvmType, SILType addrTy,
44044433
const llvm::MapVector<CanType, llvm::Value *> *typeToMetadataVec) {
44054434
IRGenMangler mangler;
4406-
CanType canType = addrTy.getObjectType().getSwiftRValueType();
4407-
std::string funcName =
4408-
mangler.mangleOutlinedInitializeWithCopyFunction(canType, this);
4435+
auto manglingBits =
4436+
getTypeAndGenericSignatureForManglingOutlineFunction(addrTy);
4437+
auto funcName =
4438+
mangler.mangleOutlinedInitializeWithCopyFunction(manglingBits.first,
4439+
manglingBits.second);
44094440
auto GenFunc = [](const TypeInfo &objectTI, IRGenFunction &IGF, Address dest,
44104441
Address src, SILType T) {
44114442
objectTI.initializeWithCopy(IGF, dest, src, T, true);
@@ -4418,9 +4449,11 @@ llvm::Constant *IRGenModule::getOrCreateOutlinedAssignWithTakeFunction(
44184449
const TypeInfo &objectTI, llvm::Type *llvmType, SILType addrTy,
44194450
const llvm::MapVector<CanType, llvm::Value *> *typeToMetadataVec) {
44204451
IRGenMangler mangler;
4421-
CanType canType = addrTy.getObjectType().getSwiftRValueType();
4422-
std::string funcName =
4423-
mangler.mangleOutlinedAssignWithTakeFunction(canType, this);
4452+
auto manglingBits =
4453+
getTypeAndGenericSignatureForManglingOutlineFunction(addrTy);
4454+
auto funcName =
4455+
mangler.mangleOutlinedAssignWithTakeFunction(manglingBits.first,
4456+
manglingBits.second);
44244457
auto GenFunc = [](const TypeInfo &objectTI, IRGenFunction &IGF, Address dest,
44254458
Address src, SILType T) {
44264459
objectTI.assignWithTake(IGF, dest, src, T, true);
@@ -4433,29 +4466,15 @@ llvm::Constant *IRGenModule::getOrCreateOutlinedAssignWithCopyFunction(
44334466
const TypeInfo &objectTI, llvm::Type *llvmType, SILType addrTy,
44344467
const llvm::MapVector<CanType, llvm::Value *> *typeToMetadataVec) {
44354468
IRGenMangler mangler;
4436-
CanType canType = addrTy.getObjectType().getSwiftRValueType();
4437-
std::string funcName =
4438-
mangler.mangleOutlinedAssignWithCopyFunction(canType, this);
4469+
auto manglingBits =
4470+
getTypeAndGenericSignatureForManglingOutlineFunction(addrTy);
4471+
auto funcName =
4472+
mangler.mangleOutlinedAssignWithCopyFunction(manglingBits.first,
4473+
manglingBits.second);
44394474
auto GenFunc = [](const TypeInfo &objectTI, IRGenFunction &IGF, Address dest,
44404475
Address src, SILType T) {
44414476
objectTI.assignWithCopy(IGF, dest, src, T, true);
44424477
};
44434478
return getOrCreateOutlinedCopyAddrHelperFunction(
44444479
objectTI, llvmType, addrTy, funcName, GenFunc, typeToMetadataVec);
44454480
}
4446-
4447-
// IRGen is only multi-threaded during LLVM part
4448-
// We don't need to be thread safe even
4449-
// We are working on the primary module *before* LLVM
4450-
unsigned IRGenModule::getCanTypeID(const CanType type) {
4451-
if (this != IRGen.getPrimaryIGM()) {
4452-
return IRGen.getPrimaryIGM()->getCanTypeID(type);
4453-
}
4454-
auto it = typeToUniqueID.find(type.getPointer());
4455-
if (it != typeToUniqueID.end()) {
4456-
return it->second;
4457-
}
4458-
++currUniqueID;
4459-
typeToUniqueID[type.getPointer()] = currUniqueID;
4460-
return currUniqueID;
4461-
}

lib/IRGen/GenDecl.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,10 @@ namespace irgen {
5353
DebugTypeInfo DebugType=DebugTypeInfo(),
5454
Optional<SILLocation> DebugLoc = None,
5555
StringRef DebugName = StringRef());
56+
57+
std::pair<CanType, CanGenericSignature>
58+
getTypeAndGenericSignatureForManglingOutlineFunction(SILType type);
59+
5660
}
5761
}
5862

lib/IRGen/GenEnum.cpp

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@
115115
#include "llvm/Support/Compiler.h"
116116
#include "clang/CodeGen/SwiftCallingConv.h"
117117

118+
#include "GenDecl.h"
118119
#include "GenMeta.h"
119120
#include "GenProto.h"
120121
#include "GenType.h"
@@ -1442,25 +1443,6 @@ namespace {
14421443
PayloadTypesAndTagType.push_back(type);
14431444
}
14441445
}
1445-
1446-
static std::pair<CanType, CanGenericSignature>
1447-
getTypeAndGenericSignatureForManglingOutlineFunction(SILType type) {
1448-
auto loweredType = type.getSwiftRValueType();
1449-
if (loweredType->hasArchetype()) {
1450-
GenericEnvironment *env = nullptr;
1451-
loweredType.findIf([&env](Type t) -> bool {
1452-
if (auto arch = t->getAs<ArchetypeType>()) {
1453-
env = arch->getGenericEnvironment();
1454-
return true;
1455-
}
1456-
return false;
1457-
});
1458-
assert(env && "has archetype but no archetype?!");
1459-
return {loweredType->mapTypeOutOfContext()->getCanonicalType(),
1460-
env->getGenericSignature()->getCanonicalSignature()};
1461-
}
1462-
return {loweredType, nullptr};
1463-
}
14641446

14651447
static llvm::Function *createOutlineLLVMFunction(
14661448
IRGenModule &IGM, std::string &name,

0 commit comments

Comments
 (0)