@@ -2036,6 +2036,7 @@ namespace {
20362036 maybeAddCanonicalMetadataPrespecializations ();
20372037 addInvertedProtocols ();
20382038 maybeAddSingletonMetadataPointer ();
2039+ maybeAddDefaultOverrideTable ();
20392040 }
20402041
20412042 void addIncompleteMetadataOrRelocationFunction () {
@@ -2077,6 +2078,9 @@ namespace {
20772078 if (getType ()->isDefaultActor (IGM.getSwiftModule (),
20782079 ResilienceExpansion::Maximal))
20792080 flags.class_setIsDefaultActor (true );
2081+
2082+ if (getDefaultOverrideTable ())
2083+ flags.class_setHasDefaultOverrideTable (true );
20802084 }
20812085
20822086 if (ResilientSuperClassRef) {
@@ -2286,6 +2290,71 @@ namespace {
22862290 descriptor.finishAndAddTo (B);
22872291 }
22882292
2293+ SILDefaultOverrideTable *getDefaultOverrideTable () {
2294+ auto *table = IGM.getSILModule ().lookUpDefaultOverrideTable (getType ());
2295+ if (!table)
2296+ return nullptr ;
2297+
2298+ if (table->getEntries ().size () == 0 )
2299+ return nullptr ;
2300+
2301+ return table;
2302+ }
2303+
2304+ void maybeAddDefaultOverrideTable () {
2305+ auto *table = getDefaultOverrideTable ();
2306+ if (!table)
2307+ return ;
2308+
2309+ LLVM_DEBUG (llvm::dbgs () << " Default Override Table entries for "
2310+ << getType ()->getName () << " :\n " ;
2311+ for (auto entry
2312+ : table->getEntries ()) {
2313+ llvm::dbgs () << " " ;
2314+ llvm::dbgs () << " original(" << entry.original << " )" ;
2315+ llvm::dbgs () << " -> " ;
2316+ llvm::dbgs () << " replacement(" << entry.method << " )" ;
2317+ llvm::dbgs () << " -> " ;
2318+ llvm::dbgs () << " impl(" << entry.impl ->getName () << " )" ;
2319+ llvm::dbgs () << ' \n ' ;
2320+ });
2321+
2322+ B.addInt32 (table->getEntries ().size ());
2323+
2324+ for (auto entry : table->getEntries ())
2325+ emitDefaultOverrideDescriptor (entry.method , entry.original , entry.impl );
2326+ }
2327+
2328+ void emitDefaultOverrideDescriptor (SILDeclRef replacement,
2329+ SILDeclRef original, SILFunction *impl) {
2330+ auto descriptor =
2331+ B.beginStruct (IGM.MethodDefaultOverrideDescriptorStructTy );
2332+
2333+ auto replacementEntity = LinkEntity::forMethodDescriptor (replacement);
2334+ auto replacementDescriptor =
2335+ IGM.getAddrOfLLVMVariableOrGOTEquivalent (replacementEntity);
2336+ descriptor.addRelativeAddress (replacementDescriptor);
2337+
2338+ auto originalEntity = LinkEntity::forMethodDescriptor (original);
2339+ auto originalDescriptor =
2340+ IGM.getAddrOfLLVMVariableOrGOTEquivalent (originalEntity);
2341+ descriptor.addRelativeAddress (originalDescriptor);
2342+
2343+ if (impl->isAsync ()) {
2344+ llvm::Constant *implFn = IGM.getAddrOfAsyncFunctionPointer (impl);
2345+ descriptor.addRelativeAddress (implFn);
2346+ } else if (impl->getLoweredFunctionType ()->isCalleeAllocatedCoroutine ()) {
2347+ llvm::Constant *implFn = IGM.getAddrOfCoroFunctionPointer (impl);
2348+ descriptor.addRelativeAddress (implFn);
2349+ } else {
2350+ llvm::Function *implFn =
2351+ IGM.getAddrOfSILFunction (impl, NotForDefinition);
2352+ descriptor.addCompactFunctionReference (implFn);
2353+ }
2354+
2355+ descriptor.finishAndAddTo (B);
2356+ }
2357+
22892358 void addPlaceholder (MissingMemberDecl *MMD) {
22902359 llvm_unreachable (" cannot generate metadata with placeholders in it" );
22912360 }
0 commit comments