Skip to content

Commit af836ea

Browse files
authored
Merge pull request #40812 from slavapestov/remove-gsb-queries
AST: Remove legacy GSB-based GenericSignature query implementation
2 parents f179674 + 3a92d2f commit af836ea

40 files changed

+50
-1182
lines changed

include/swift/AST/ASTContext.h

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,6 @@ namespace swift {
9595
class TypeVariableType;
9696
class TupleType;
9797
class FunctionType;
98-
class GenericSignatureBuilder;
9998
class ArchetypeType;
10099
class Identifier;
101100
class InheritedNameSet;
@@ -1225,26 +1224,13 @@ class ASTContext final {
12251224
/// Increments \c NumTypoCorrections then checks this against the limit in
12261225
/// the language options.
12271226
bool shouldPerformTypoCorrection();
1228-
1229-
private:
1230-
/// Register the given generic signature builder to be used as the canonical
1231-
/// generic signature builder for the given signature, if we don't already
1232-
/// have one.
1233-
void registerGenericSignatureBuilder(GenericSignature sig,
1234-
GenericSignatureBuilder &&builder);
1235-
friend class GenericSignatureBuilder;
12361227

12371228
private:
12381229
friend class IntrinsicInfo;
12391230
/// Retrieve an LLVMContext that is used for scratch space for intrinsic lookup.
12401231
llvm::LLVMContext &getIntrinsicScratchContext() const;
12411232

12421233
public:
1243-
/// Retrieve or create the stored generic signature builder for the given
1244-
/// canonical generic signature and module.
1245-
GenericSignatureBuilder *getOrCreateGenericSignatureBuilder(
1246-
CanGenericSignature sig);
1247-
12481234
rewriting::RewriteContext &getRewriteContext();
12491235

12501236
/// This is a hack to break cycles. Don't introduce new callers of this

include/swift/AST/GenericSignature.h

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030

3131
namespace swift {
3232

33-
class GenericSignatureBuilder;
3433
class ProtocolConformanceRef;
3534
class ProtocolType;
3635
class SubstitutionMap;
@@ -84,7 +83,6 @@ class ConformanceAccessPath {
8483
ConformanceAccessPath(ArrayRef<Entry> path) : path(path) {}
8584

8685
friend class GenericSignatureImpl;
87-
friend class GenericSignatureBuilder;
8886
friend class rewriting::RequirementMachine;
8987

9088
public:
@@ -338,9 +336,6 @@ class alignas(1 << TypeAlignInBits) GenericSignatureImpl final
338336

339337
ASTContext &getASTContext() const;
340338

341-
/// Retrieve the generic signature builder for the given generic signature.
342-
GenericSignatureBuilder *getGenericSignatureBuilder() const;
343-
344339
/// Retrieve the requirement machine for the given generic signature.
345340
rewriting::RequirementMachine *getRequirementMachine() const;
346341

@@ -385,8 +380,6 @@ class alignas(1 << TypeAlignInBits) GenericSignatureImpl final
385380
///
386381
/// The type parameters must be known to not be concrete within the context.
387382
bool areSameTypeParameterInContext(Type type1, Type type2) const;
388-
bool areSameTypeParameterInContext(Type type1, Type type2,
389-
GenericSignatureBuilder &builder) const;
390383

391384
/// Determine if \c sig can prove \c requirement, meaning that it can deduce
392385
/// T: Foo or T == U (etc.) with the information it knows. This includes
@@ -396,8 +389,6 @@ class alignas(1 << TypeAlignInBits) GenericSignatureImpl final
396389
Requirement requirement, bool allowMissing = false) const;
397390

398391
bool isCanonicalTypeInContext(Type type) const;
399-
bool isCanonicalTypeInContext(Type type,
400-
GenericSignatureBuilder &builder) const;
401392

402393
/// Retrieve the conformance access path used to extract the conformance of
403394
/// interface \c type to the given \c protocol.

include/swift/Basic/LangOptions.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -477,10 +477,6 @@ namespace swift {
477477
ASTVerifierOverrideKind ASTVerifierOverride =
478478
ASTVerifierOverrideKind::NoOverride;
479479

480-
/// Whether the new experimental generics implementation is enabled.
481-
RequirementMachineMode EnableRequirementMachine =
482-
RequirementMachineMode::Enabled;
483-
484480
/// Enables merged associated type support, which might go away.
485481
bool RequirementMachineMergedAssociatedTypes = true;
486482

include/swift/Option/Options.td

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -616,10 +616,6 @@ def no_emit_module_separately:
616616
Flags<[NoInteractiveOption, HelpHidden]>,
617617
HelpText<"Force using merge-module as the incremental build mode (new Driver only)">;
618618

619-
def requirement_machine_EQ : Joined<["-"], "requirement-machine=">,
620-
Flags<[FrontendOption, ModuleInterfaceOption]>,
621-
HelpText<"Control usage of experimental generics implementation: 'on', 'off', or 'verify'">;
622-
623619
def requirement_machine_protocol_signatures_EQ : Joined<["-"], "requirement-machine-protocol-signatures=">,
624620
Flags<[FrontendOption]>,
625621
HelpText<"Control usage of experimental protocol requirement signature minimization: 'on', 'off', or 'verify'">;

lib/AST/ASTContext.cpp

Lines changed: 0 additions & 118 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
#include "swift/AST/ASTContext.h"
1818
#include "ClangTypeConverter.h"
1919
#include "ForeignRepresentationInfo.h"
20-
#include "GenericSignatureBuilder.h"
2120
#include "SubstitutionMapStorage.h"
2221
#include "swift/AST/ClangModuleLoader.h"
2322
#include "swift/AST/ConcreteDeclRef.h"
@@ -72,17 +71,9 @@
7271
using namespace swift;
7372

7473
#define DEBUG_TYPE "ASTContext"
75-
STATISTIC(NumRegisteredGenericSignatureBuilders,
76-
"# of generic signature builders successfully registered");
77-
STATISTIC(NumRegisteredGenericSignatureBuildersAlready,
78-
"# of generic signature builders already registered");
7974
STATISTIC(NumCollapsedSpecializedProtocolConformances,
8075
"# of specialized protocol conformances collapsed");
8176

82-
/// Define this to 1 to enable expensive assertions of the
83-
/// GenericSignatureBuilder.
84-
#define SWIFT_GSB_EXPENSIVE_ASSERTIONS 0
85-
8677
void ModuleLoader::anchor() {}
8778
void ClangModuleLoader::anchor() {}
8879

@@ -480,10 +471,6 @@ struct ASTContext::Implementation {
480471

481472
llvm::FoldingSet<GenericSignatureImpl> GenericSignatures;
482473

483-
/// Stored generic signature builders for canonical generic signatures.
484-
llvm::DenseMap<GenericSignature, std::unique_ptr<GenericSignatureBuilder>>
485-
GenericSignatureBuilders;
486-
487474
/// A cache of information about whether particular nominal types
488475
/// are representable in a foreign language.
489476
llvm::DenseMap<NominalTypeDecl *, ForeignRepresentationInfo>
@@ -1938,111 +1925,6 @@ void ASTContext::addLoadedModule(ModuleDecl *M) {
19381925
getImpl().LoadedModules[M->getRealName()] = M;
19391926
}
19401927

1941-
void ASTContext::registerGenericSignatureBuilder(
1942-
GenericSignature sig,
1943-
GenericSignatureBuilder &&builder) {
1944-
if (LangOpts.EnableRequirementMachine == RequirementMachineMode::Enabled)
1945-
return;
1946-
1947-
auto canSig = sig.getCanonicalSignature();
1948-
auto &genericSignatureBuilders = getImpl().GenericSignatureBuilders;
1949-
auto known = genericSignatureBuilders.find(canSig);
1950-
if (known != genericSignatureBuilders.end()) {
1951-
++NumRegisteredGenericSignatureBuildersAlready;
1952-
return;
1953-
}
1954-
1955-
++NumRegisteredGenericSignatureBuilders;
1956-
genericSignatureBuilders[canSig] =
1957-
std::make_unique<GenericSignatureBuilder>(std::move(builder));
1958-
}
1959-
1960-
GenericSignatureBuilder *ASTContext::getOrCreateGenericSignatureBuilder(
1961-
CanGenericSignature sig) {
1962-
// We should only create GenericSignatureBuilders if the requirement machine
1963-
// mode is ::Disabled or ::Verify.
1964-
assert(LangOpts.EnableRequirementMachine != RequirementMachineMode::Enabled &&
1965-
"Shouldn't create GenericSignatureBuilder when RequirementMachine "
1966-
"is enabled");
1967-
1968-
// Check whether we already have a generic signature builder for this
1969-
// signature and module.
1970-
auto &genericSignatureBuilders = getImpl().GenericSignatureBuilders;
1971-
auto known = genericSignatureBuilders.find(sig);
1972-
if (known != genericSignatureBuilders.end())
1973-
return known->second.get();
1974-
1975-
// Create a new generic signature builder with the given signature.
1976-
auto builder = new GenericSignatureBuilder(*this);
1977-
1978-
// Store this generic signature builder (no generic environment yet).
1979-
genericSignatureBuilders[sig] =
1980-
std::unique_ptr<GenericSignatureBuilder>(builder);
1981-
1982-
builder->addGenericSignature(sig);
1983-
1984-
#if SWIFT_GSB_EXPENSIVE_ASSERTIONS
1985-
auto builderSig =
1986-
builder->computeGenericSignature(/*allowConcreteGenericParams=*/true);
1987-
if (builderSig.getCanonicalSignature() != sig) {
1988-
llvm::errs() << "ERROR: generic signature builder is not idempotent.\n";
1989-
llvm::errs() << "Original generic signature : ";
1990-
sig->print(llvm::errs());
1991-
llvm::errs() << "\nReprocessed generic signature: ";
1992-
auto reprocessedSig = builderSig.getCanonicalSignature();
1993-
1994-
reprocessedSig->print(llvm::errs());
1995-
llvm::errs() << "\n";
1996-
1997-
if (sig.getGenericParams().size() ==
1998-
reprocessedSig.getGenericParams().size() &&
1999-
sig.getRequirements().size() ==
2000-
reprocessedSig.getRequirements().size()) {
2001-
for (unsigned i : indices(sig.getRequirements())) {
2002-
auto sigReq = sig.getRequirements()[i];
2003-
auto reprocessedReq = reprocessedSig.getRequirements()[i];
2004-
if (sigReq.getKind() != reprocessedReq.getKind()) {
2005-
llvm::errs() << "Requirement mismatch:\n";
2006-
llvm::errs() << " Original: ";
2007-
sigReq.print(llvm::errs(), PrintOptions());
2008-
llvm::errs() << "\n Reprocessed: ";
2009-
reprocessedReq.print(llvm::errs(), PrintOptions());
2010-
llvm::errs() << "\n";
2011-
break;
2012-
}
2013-
2014-
if (!sigReq.getFirstType()->isEqual(reprocessedReq.getFirstType())) {
2015-
llvm::errs() << "First type mismatch, original is:\n";
2016-
sigReq.getFirstType().dump(llvm::errs());
2017-
llvm::errs() << "Reprocessed:\n";
2018-
reprocessedReq.getFirstType().dump(llvm::errs());
2019-
llvm::errs() << "\n";
2020-
break;
2021-
}
2022-
2023-
if (sigReq.getKind() == RequirementKind::SameType &&
2024-
!sigReq.getSecondType()->isEqual(reprocessedReq.getSecondType())) {
2025-
llvm::errs() << "Second type mismatch, original is:\n";
2026-
sigReq.getSecondType().dump(llvm::errs());
2027-
llvm::errs() << "Reprocessed:\n";
2028-
reprocessedReq.getSecondType().dump(llvm::errs());
2029-
llvm::errs() << "\n";
2030-
break;
2031-
}
2032-
}
2033-
}
2034-
2035-
llvm_unreachable("idempotency problem with a generic signature");
2036-
}
2037-
#else
2038-
// FIXME: This should be handled lazily in the future, and therefore not
2039-
// required.
2040-
builder->processDelayedRequirements();
2041-
#endif
2042-
2043-
return builder;
2044-
}
2045-
20461928
rewriting::RewriteContext &
20471929
ASTContext::getRewriteContext() {
20481930
auto &rewriteCtx = getImpl().TheRewriteContext;

0 commit comments

Comments
 (0)