@@ -2063,22 +2063,20 @@ void Parser::parseObjCSelector(SmallVector<Identifier, 4> &Names,
20632063}
20642064
20652065bool Parser::peekAvailabilityMacroName () {
2066- parseAllAvailabilityMacroArguments ();
2067- AvailabilityMacroMap Map = AvailabilityMacros;
2066+ AvailabilityMacroMap &Map = parseAllAvailabilityMacroArguments ();
20682067
20692068 StringRef MacroName = Tok.getText ();
2070- return Map.find (MacroName) != Map.end ();
2069+ return Map.Impl . find (MacroName) != Map. Impl .end ();
20712070}
20722071
20732072ParserStatus
20742073Parser::parseAvailabilityMacro (SmallVectorImpl<AvailabilitySpec *> &Specs) {
20752074 // Get the macros from the compiler arguments.
2076- parseAllAvailabilityMacroArguments ();
2077- AvailabilityMacroMap Map = AvailabilityMacros;
2075+ AvailabilityMacroMap &Map = parseAllAvailabilityMacroArguments ();
20782076
20792077 StringRef MacroName = Tok.getText ();
2080- auto NameMatch = Map.find (MacroName);
2081- if (NameMatch == Map.end ())
2078+ auto NameMatch = Map.Impl . find (MacroName);
2079+ if (NameMatch == Map.Impl . end ())
20822080 return makeParserSuccess (); // No match, it could be a standard platform.
20832081
20842082 consumeToken ();
@@ -2114,20 +2112,26 @@ Parser::parseAvailabilityMacro(SmallVectorImpl<AvailabilitySpec *> &Specs) {
21142112 return makeParserSuccess ();
21152113}
21162114
2117- void Parser::parseAllAvailabilityMacroArguments () {
2118-
2119- if (AvailabilityMacrosComputed) return ;
2120-
2121- AvailabilityMacroMap Map;
2115+ AvailabilityMacroMap &Parser::parseAllAvailabilityMacroArguments () {
2116+ AvailabilityMacroMap &Map = Context.getAvailabilityMacroCache ();
2117+ if (Map.WasParsed )
2118+ return Map;
21222119
21232120 SourceManager &SM = Context.SourceMgr ;
21242121 LangOptions LangOpts = Context.LangOpts ;
21252122
2123+ // Allocate all buffers in one go to avoid repeating the sorting in
2124+ // findBufferContainingLocInternal.
2125+ llvm::SmallVector<unsigned , 4 > bufferIDs;
21262126 for (StringRef macro: LangOpts.AvailabilityMacros ) {
2127+ unsigned bufferID = SM.addMemBufferCopy (macro,
2128+ " -define-availability argument" );
2129+ bufferIDs.push_back (bufferID);
2130+ }
21272131
2132+ // Parse each macro definition.
2133+ for (unsigned bufferID: bufferIDs) {
21282134 // Create temporary parser.
2129- int bufferID = SM.addMemBufferCopy (macro,
2130- " -define-availability argument" );
21312135 swift::ParserUnit PU (SM, SourceFileKind::Main, bufferID, LangOpts,
21322136 TypeCheckerOptions (), SILOptions (), " unknown" );
21332137
@@ -2156,9 +2160,9 @@ void Parser::parseAllAvailabilityMacroArguments() {
21562160 ParsedMacro.Specs = SpecsCopy;
21572161
21582162 // Find the macro info by name.
2159- AvailabilityMacroVersionMap MacroDefinition;
2160- auto NameMatch = Map.find (ParsedMacro.Name );
2161- if (NameMatch != Map.end ()) {
2163+ AvailabilityMacroMap::VersionEntry MacroDefinition;
2164+ auto NameMatch = Map.Impl . find (ParsedMacro.Name );
2165+ if (NameMatch != Map.Impl . end ()) {
21622166 MacroDefinition = NameMatch->getSecond ();
21632167 }
21642168
@@ -2171,12 +2175,12 @@ void Parser::parseAllAvailabilityMacroArguments() {
21712175 }
21722176
21732177 // Save back the macro spec.
2174- Map.erase (ParsedMacro.Name );
2175- Map.insert ({ParsedMacro.Name , MacroDefinition});
2178+ Map.Impl . erase (ParsedMacro.Name );
2179+ Map.Impl . insert ({ParsedMacro.Name , MacroDefinition});
21762180 }
21772181
2178- AvailabilityMacros = Map ;
2179- AvailabilityMacrosComputed = true ;
2182+ Map. WasParsed = true ;
2183+ return Map ;
21802184}
21812185
21822186ParserStatus Parser::parsePlatformVersionInList (StringRef AttrName,
0 commit comments