Skip to content

Commit df523d4

Browse files
committed
KeyPath: Allow existing context descriptors to be used as generic environment.
If a key path literal appears in a generic context with an existing context descriptor, this will allow us to save some code size by not having to emit a separate GenericEnvironment descriptor.
1 parent 7f2a58a commit df523d4

File tree

3 files changed

+35
-11
lines changed

3 files changed

+35
-11
lines changed

lib/IRGen/GenKeyPath.cpp

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1305,17 +1305,10 @@ void IRGenModule::emitSILProperty(SILProperty *prop) {
13051305
{},
13061306
hasSubscriptIndices);
13071307

1308-
auto size = fields.getNextOffsetFromGlobal();
1309-
13101308
auto var = cast<llvm::GlobalVariable>(
13111309
getAddrOfPropertyDescriptor(prop->getDecl(),
13121310
fields.finishAndCreateFuture()));
13131311
var->setConstant(true);
13141312
var->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
1315-
// A simple stored component descriptor can fit in four bytes. Anything else
1316-
// needs pointer alignment.
1317-
if (size <= Size(4))
1318-
var->setAlignment(4);
1319-
else
1320-
var->setAlignment(getPointerAlignment().getValue());
1313+
var->setAlignment(4);
13211314
}

stdlib/public/core/KeyPath.swift

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2396,6 +2396,29 @@ internal func _getSymbolicMangledNameLength(_ base: UnsafeRawPointer) -> Int {
23962396
return end - base
23972397
}
23982398

2399+
// Resolve a mangled name in a generic environment, described by either a
2400+
// flat GenericEnvironment * (if the bottom tag bit is 0) or possibly-nested
2401+
// ContextDescriptor * (if the bottom tag bit is 1)
2402+
internal func _getTypeByMangledNameInEnvironmentOrContext(
2403+
_ name: UnsafePointer<UInt8>,
2404+
_ nameLength: UInt,
2405+
genericEnvironmentOrContext: UnsafeRawPointer?,
2406+
genericArguments: UnsafeRawPointer?)
2407+
-> Any.Type? {
2408+
2409+
let taggedPointer = UInt(bitPattern: genericEnvironmentOrContext)
2410+
if taggedPointer & 1 == 0 {
2411+
return _getTypeByMangledNameInEnvironment(name, nameLength,
2412+
genericEnvironment: genericEnvironmentOrContext,
2413+
genericArguments: genericArguments)
2414+
} else {
2415+
let context = UnsafeRawPointer(bitPattern: taggedPointer & ~1)
2416+
return _getTypeByMangledNameInContext(name, nameLength,
2417+
genericContext: context,
2418+
genericArguments: genericArguments)
2419+
}
2420+
}
2421+
23992422
// Resolve the given generic argument reference to a generic argument.
24002423
internal func _resolveKeyPathGenericArgReference(
24012424
_ reference: UnsafeRawPointer,
@@ -2431,8 +2454,8 @@ internal func _resolveKeyPathGenericArgReference(
24312454
capacity: nameLength + 1)
24322455
// FIXME: Could extract this information from the mangled name.
24332456
guard let result =
2434-
_getTypeByMangledName(namePtr, UInt(nameLength),
2435-
genericEnvironment: genericEnvironment,
2457+
_getTypeByMangledNameInEnvironmentOrContext(namePtr, UInt(nameLength),
2458+
genericEnvironmentOrContext: genericEnvironment,
24362459
genericArguments: arguments)
24372460
else {
24382461
let nameStr = String._fromUTF8Repairing(

stdlib/public/core/Misc.swift

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,17 @@ internal func _getTypeByMangledNameUntrusted(
9696
-> Any.Type?
9797

9898
@_silgen_name("swift_getTypeByMangledNameInEnvironment")
99-
internal func _getTypeByMangledName(
99+
public func _getTypeByMangledNameInEnvironment(
100100
_ name: UnsafePointer<UInt8>,
101101
_ nameLength: UInt,
102102
genericEnvironment: UnsafeRawPointer?,
103103
genericArguments: UnsafeRawPointer?)
104104
-> Any.Type?
105+
106+
@_silgen_name("swift_getTypeByMangledNameInContext")
107+
public func _getTypeByMangledNameInContext(
108+
_ name: UnsafePointer<UInt8>,
109+
_ nameLength: UInt,
110+
genericContext: UnsafeRawPointer?,
111+
genericArguments: UnsafeRawPointer?)
112+
-> Any.Type?

0 commit comments

Comments
 (0)