Skip to content

Parser: Move availability macro definition cache to a request #76829

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 0 additions & 7 deletions include/swift/AST/ASTContext.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,6 @@ namespace swift {
class AbstractFunctionDecl;
class ASTContext;
enum class Associativity : unsigned char;
class AvailabilityMacroMap;
class AvailabilityRange;
class BoundGenericType;
class BuiltinTupleDecl;
Expand Down Expand Up @@ -988,12 +987,6 @@ class ASTContext final {
return getMultiPayloadEnumTagSinglePayloadAvailability();
}

/// Cache of the availability macros parsed from the command line arguments.
///
/// This is an implementation detail, access via
/// \c Parser::parseAllAvailabilityMacroArguments.
AvailabilityMacroMap &getAvailabilityMacroCache() const;

/// Test support utility for loading a platform remap file
/// in case an SDK is not specified to the compilation.
const clang::DarwinSDKInfo::RelatedTargetVersionMapping *
Expand Down
1 change: 0 additions & 1 deletion include/swift/AST/AvailabilitySpec.h
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,6 @@ class AvailabilityMacroMap {
typedef llvm::DenseMap<llvm::VersionTuple,
SmallVector<AvailabilitySpec *, 4>> VersionEntry;

bool WasParsed = false;
llvm::DenseMap<StringRef, VersionEntry> Impl;
};

Expand Down
25 changes: 25 additions & 0 deletions include/swift/AST/ParseRequests.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
namespace swift {

struct ASTNode;
class AvailabilityMacroMap;

/// Report that a request of the given kind is being evaluated, so it
/// can be recorded by the stats reporter.
Expand Down Expand Up @@ -192,6 +193,30 @@ class EvaluateIfConditionRequest
bool shouldEvaluate) const;
};

/// Parse the availability macros definitions passed as arguments.
class AvailabilityMacroArgumentsRequest
: public SimpleRequest<AvailabilityMacroArgumentsRequest,
AvailabilityMacroMap(ASTContext *),
RequestFlags::Cached> {
public:
using SimpleRequest::SimpleRequest;

private:
friend SimpleRequest;

// Evaluation.
AvailabilityMacroMap evaluate(Evaluator &evaluator, ASTContext *ctx) const;

public:
// Caching.
bool isCached() const { return true; }

// Source location.
SourceLoc getNearestLoc() const { return SourceLoc(); };
};

void simple_display(llvm::raw_ostream &out, const ASTContext *state);

/// The zone number for the parser.
#define SWIFT_TYPEID_ZONE Parse
#define SWIFT_TYPEID_HEADER "swift/AST/ParseTypeIDZone.def"
Expand Down
3 changes: 3 additions & 0 deletions include/swift/AST/ParseTypeIDZone.def
Original file line number Diff line number Diff line change
Expand Up @@ -34,3 +34,6 @@ SWIFT_REQUEST(Parse, ExportedSourceFileRequest,
SWIFT_REQUEST(Parse, EvaluateIfConditionRequest,
(std::pair<bool, bool>)(SourceFile *, SourceRange, bool), Uncached,
NoLocationInfo)
SWIFT_REQUEST(Parse, AvailabilityMacroArgumentsRequest,
(AvailabilityMacroMap)(ASTContext *), Cached,
NoLocationInfo)
2 changes: 1 addition & 1 deletion include/swift/Parse/Parser.h
Original file line number Diff line number Diff line change
Expand Up @@ -2064,7 +2064,7 @@ class Parser {
parseAvailabilityMacro(SmallVectorImpl<AvailabilitySpec *> &Specs);

/// Parse the availability macros definitions passed as arguments.
AvailabilityMacroMap &parseAllAvailabilityMacroArguments();
AvailabilityMacroMap parseAllAvailabilityMacroArguments();

/// Result of parsing an availability macro definition.
struct AvailabilityMacroDefinition {
Expand Down
7 changes: 0 additions & 7 deletions lib/AST/ASTContext.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -426,9 +426,6 @@ struct ASTContext::Implementation {
/// Singleton used to cache the import graph.
swift::namelookup::ImportCache TheImportCache;

/// Cache of availability macros parsed from the command line.
AvailabilityMacroMap TheAvailabilityMacroCache;

/// The module loader used to load Clang modules.
ClangModuleLoader *TheClangModuleLoader = nullptr;

Expand Down Expand Up @@ -2284,10 +2281,6 @@ swift::namelookup::ImportCache &ASTContext::getImportCache() const {
return getImpl().TheImportCache;
}

AvailabilityMacroMap &ASTContext::getAvailabilityMacroCache() const {
return getImpl().TheAvailabilityMacroCache;
}

ClangModuleLoader *ASTContext::getClangModuleLoader() const {
return getImpl().TheClangModuleLoader;
}
Expand Down
41 changes: 27 additions & 14 deletions lib/Parse/ParseDecl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2063,7 +2063,7 @@ void Parser::parseObjCSelector(SmallVector<Identifier, 4> &Names,
}

bool Parser::peekAvailabilityMacroName() {
AvailabilityMacroMap &Map = parseAllAvailabilityMacroArguments();
AvailabilityMacroMap Map = parseAllAvailabilityMacroArguments();

StringRef MacroName = Tok.getText();
return Map.Impl.find(MacroName) != Map.Impl.end();
Expand All @@ -2072,7 +2072,7 @@ bool Parser::peekAvailabilityMacroName() {
ParserStatus
Parser::parseAvailabilityMacro(SmallVectorImpl<AvailabilitySpec *> &Specs) {
// Get the macros from the compiler arguments.
AvailabilityMacroMap &Map = parseAllAvailabilityMacroArguments();
AvailabilityMacroMap Map = parseAllAvailabilityMacroArguments();

StringRef MacroName = Tok.getText();
auto NameMatch = Map.Impl.find(MacroName);
Expand Down Expand Up @@ -2112,13 +2112,19 @@ Parser::parseAvailabilityMacro(SmallVectorImpl<AvailabilitySpec *> &Specs) {
return makeParserSuccess();
}

AvailabilityMacroMap &Parser::parseAllAvailabilityMacroArguments() {
AvailabilityMacroMap &Map = Context.getAvailabilityMacroCache();
if (Map.WasParsed)
return Map;
AvailabilityMacroMap
Parser::parseAllAvailabilityMacroArguments() {
return evaluateOrDefault(Context.evaluator,
AvailabilityMacroArgumentsRequest{&Context},
AvailabilityMacroMap());
}

SourceManager &SM = Context.SourceMgr;
LangOptions LangOpts = Context.LangOpts;
AvailabilityMacroMap
AvailabilityMacroArgumentsRequest::evaluate(Evaluator &evaluator,
ASTContext *ctx) const {
AvailabilityMacroMap Map;
SourceManager &SM = ctx->SourceMgr;
LangOptions LangOpts = ctx->LangOpts;

// Allocate all buffers in one go to avoid repeating the sorting in
// findBufferContainingLocInternal.
Expand All @@ -2135,11 +2141,11 @@ AvailabilityMacroMap &Parser::parseAllAvailabilityMacroArguments() {
swift::ParserUnit PU(SM, SourceFileKind::Main, bufferID, LangOpts,
TypeCheckerOptions(), SILOptions(), "unknown");

ForwardingDiagnosticConsumer PDC(Context.Diags);
ForwardingDiagnosticConsumer PDC(ctx->Diags);
PU.getDiagnosticEngine().addConsumer(PDC);

// Parse the argument.
AvailabilityMacroDefinition ParsedMacro;
Parser::AvailabilityMacroDefinition ParsedMacro;
ParserStatus Status =
PU.getParser().parseAvailabilityMacroDefinition(ParsedMacro);
if (Status.isError())
Expand All @@ -2152,7 +2158,7 @@ AvailabilityMacroMap &Parser::parseAllAvailabilityMacroArguments() {
if (auto *PlatformVersionSpec =
dyn_cast<PlatformVersionConstraintAvailabilitySpec>(Spec)) {
auto SpecCopy =
new (Context) PlatformVersionConstraintAvailabilitySpec(
new (*ctx) PlatformVersionConstraintAvailabilitySpec(
*PlatformVersionSpec);
SpecsCopy.push_back(SpecCopy);
}
Expand All @@ -2170,19 +2176,26 @@ AvailabilityMacroMap &Parser::parseAllAvailabilityMacroArguments() {
auto PreviousEntry =
MacroDefinition.insert({ParsedMacro.Version, ParsedMacro.Specs});
if (!PreviousEntry.second) {
diagnose(PU.getParser().PreviousLoc, diag::attr_availability_duplicate,
ParsedMacro.Name, ParsedMacro.Version.getAsString());
auto &Diags = ctx->Diags;
Diags.diagnose(PU.getParser().PreviousLoc,
diag::attr_availability_duplicate,
ParsedMacro.Name, ParsedMacro.Version.getAsString());

}

// Save back the macro spec.
Map.Impl.erase(ParsedMacro.Name);
Map.Impl.insert({ParsedMacro.Name, MacroDefinition});
}

Map.WasParsed = true;
return Map;
}

void swift::simple_display(llvm::raw_ostream &out,
const ASTContext *value) {
out << "ASTContext: " << value;
}

ParserStatus Parser::parsePlatformVersionInList(StringRef AttrName,
llvm::SmallVector<PlatformAndVersion, 4> &PlatformAndVersions,
bool &ParsedUnrecognizedPlatformName) {
Expand Down