blob: 77f15bcd910a2ecde376bca7a5d3c00351870f39 [file] [log] [blame]
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00001//===- ASTReader.cpp - AST File Reader ------------------------------------===//
Guy Benyei11169dd2012-12-18 14:30:41 +00002//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Guy Benyei11169dd2012-12-18 14:30:41 +00006//
7//===----------------------------------------------------------------------===//
8//
9// This file defines the ASTReader class, which reads AST files.
10//
11//===----------------------------------------------------------------------===//
12
Alexey Bataev93dc40d2019-12-20 11:04:57 -050013#include "clang/Basic/OpenMPKinds.h"
John McCallc2f18312019-12-14 03:01:28 -050014#include "clang/Serialization/ASTRecordReader.h"
Guy Benyei11169dd2012-12-18 14:30:41 +000015#include "ASTCommon.h"
16#include "ASTReaderInternals.h"
John McCalld505e572019-12-13 21:54:44 -050017#include "clang/AST/AbstractTypeReader.h"
Guy Benyei11169dd2012-12-18 14:30:41 +000018#include "clang/AST/ASTConsumer.h"
19#include "clang/AST/ASTContext.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000020#include "clang/AST/ASTMutationListener.h"
21#include "clang/AST/ASTUnresolvedSet.h"
22#include "clang/AST/Decl.h"
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +000023#include "clang/AST/DeclBase.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000024#include "clang/AST/DeclCXX.h"
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +000025#include "clang/AST/DeclFriend.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000026#include "clang/AST/DeclGroup.h"
27#include "clang/AST/DeclObjC.h"
Guy Benyei11169dd2012-12-18 14:30:41 +000028#include "clang/AST/DeclTemplate.h"
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +000029#include "clang/AST/DeclarationName.h"
Guy Benyei11169dd2012-12-18 14:30:41 +000030#include "clang/AST/Expr.h"
31#include "clang/AST/ExprCXX.h"
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +000032#include "clang/AST/ExternalASTSource.h"
Guy Benyei11169dd2012-12-18 14:30:41 +000033#include "clang/AST/NestedNameSpecifier.h"
John McCallc2f18312019-12-14 03:01:28 -050034#include "clang/AST/OpenMPClause.h"
Richard Trieue7f7ed22017-02-22 01:11:25 +000035#include "clang/AST/ODRHash.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000036#include "clang/AST/RawCommentList.h"
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +000037#include "clang/AST/TemplateBase.h"
38#include "clang/AST/TemplateName.h"
Guy Benyei11169dd2012-12-18 14:30:41 +000039#include "clang/AST/Type.h"
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +000040#include "clang/AST/TypeLoc.h"
Guy Benyei11169dd2012-12-18 14:30:41 +000041#include "clang/AST/TypeLocVisitor.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000042#include "clang/AST/UnresolvedSet.h"
43#include "clang/Basic/CommentOptions.h"
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +000044#include "clang/Basic/Diagnostic.h"
Benjamin Kramerf3ca26982014-05-10 16:31:55 +000045#include "clang/Basic/DiagnosticOptions.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000046#include "clang/Basic/ExceptionSpecificationType.h"
Guy Benyei11169dd2012-12-18 14:30:41 +000047#include "clang/Basic/FileManager.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000048#include "clang/Basic/FileSystemOptions.h"
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +000049#include "clang/Basic/IdentifierTable.h"
50#include "clang/Basic/LLVM.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000051#include "clang/Basic/LangOptions.h"
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +000052#include "clang/Basic/Module.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000053#include "clang/Basic/ObjCRuntime.h"
54#include "clang/Basic/OperatorKinds.h"
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +000055#include "clang/Basic/PragmaKinds.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000056#include "clang/Basic/Sanitizers.h"
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +000057#include "clang/Basic/SourceLocation.h"
Guy Benyei11169dd2012-12-18 14:30:41 +000058#include "clang/Basic/SourceManager.h"
59#include "clang/Basic/SourceManagerInternals.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000060#include "clang/Basic/Specifiers.h"
Guy Benyei11169dd2012-12-18 14:30:41 +000061#include "clang/Basic/TargetInfo.h"
62#include "clang/Basic/TargetOptions.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000063#include "clang/Basic/TokenKinds.h"
Guy Benyei11169dd2012-12-18 14:30:41 +000064#include "clang/Basic/Version.h"
Guy Benyei11169dd2012-12-18 14:30:41 +000065#include "clang/Lex/HeaderSearch.h"
66#include "clang/Lex/HeaderSearchOptions.h"
67#include "clang/Lex/MacroInfo.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000068#include "clang/Lex/ModuleMap.h"
Guy Benyei11169dd2012-12-18 14:30:41 +000069#include "clang/Lex/PreprocessingRecord.h"
70#include "clang/Lex/Preprocessor.h"
71#include "clang/Lex/PreprocessorOptions.h"
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +000072#include "clang/Lex/Token.h"
73#include "clang/Sema/ObjCMethodList.h"
Guy Benyei11169dd2012-12-18 14:30:41 +000074#include "clang/Sema/Scope.h"
75#include "clang/Sema/Sema.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000076#include "clang/Sema/Weak.h"
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +000077#include "clang/Serialization/ASTBitCodes.h"
Guy Benyei11169dd2012-12-18 14:30:41 +000078#include "clang/Serialization/ASTDeserializationListener.h"
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +000079#include "clang/Serialization/ContinuousRangeMap.h"
Douglas Gregore060e572013-01-25 01:03:03 +000080#include "clang/Serialization/GlobalModuleIndex.h"
Duncan P. N. Exon Smith8bef5cd2019-03-09 17:33:56 +000081#include "clang/Serialization/InMemoryModuleCache.h"
Duncan P. N. Exon Smithf7170d12019-11-21 18:49:05 -080082#include "clang/Serialization/ModuleFile.h"
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +000083#include "clang/Serialization/ModuleFileExtension.h"
Guy Benyei11169dd2012-12-18 14:30:41 +000084#include "clang/Serialization/ModuleManager.h"
Richard Trieuf3b00462018-12-12 02:53:59 +000085#include "clang/Serialization/PCHContainerOperations.h"
Guy Benyei11169dd2012-12-18 14:30:41 +000086#include "clang/Serialization/SerializationDiagnostic.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +000087#include "llvm/ADT/APFloat.h"
88#include "llvm/ADT/APInt.h"
89#include "llvm/ADT/APSInt.h"
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +000090#include "llvm/ADT/ArrayRef.h"
91#include "llvm/ADT/DenseMap.h"
92#include "llvm/ADT/FoldingSet.h"
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +000093#include "llvm/ADT/Hashing.h"
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +000094#include "llvm/ADT/IntrusiveRefCntPtr.h"
95#include "llvm/ADT/None.h"
96#include "llvm/ADT/Optional.h"
97#include "llvm/ADT/STLExtras.h"
Duncan P. N. Exon Smith0a2be462019-03-09 17:44:01 +000098#include "llvm/ADT/ScopeExit.h"
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +000099#include "llvm/ADT/SmallPtrSet.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +0000100#include "llvm/ADT/SmallString.h"
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +0000101#include "llvm/ADT/SmallVector.h"
Vedant Kumar48b4f762018-04-14 01:40:48 +0000102#include "llvm/ADT/StringExtras.h"
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +0000103#include "llvm/ADT/StringMap.h"
104#include "llvm/ADT/StringRef.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +0000105#include "llvm/ADT/Triple.h"
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +0000106#include "llvm/ADT/iterator_range.h"
Francis Visoiu Mistrihe0308272019-07-03 22:40:07 +0000107#include "llvm/Bitstream/BitstreamReader.h"
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +0000108#include "llvm/Support/Casting.h"
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +0000109#include "llvm/Support/Compiler.h"
Pavel Labathd8c62902018-06-11 10:28:04 +0000110#include "llvm/Support/Compression.h"
Jonas Devlieghere560ce2c2018-02-26 15:16:42 +0000111#include "llvm/Support/DJB.h"
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +0000112#include "llvm/Support/Endian.h"
George Rimarc39f5492017-01-17 15:45:31 +0000113#include "llvm/Support/Error.h"
Guy Benyei11169dd2012-12-18 14:30:41 +0000114#include "llvm/Support/ErrorHandling.h"
115#include "llvm/Support/FileSystem.h"
116#include "llvm/Support/MemoryBuffer.h"
117#include "llvm/Support/Path.h"
118#include "llvm/Support/SaveAndRestore.h"
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +0000119#include "llvm/Support/Timer.h"
Pavel Labathd8c62902018-06-11 10:28:04 +0000120#include "llvm/Support/VersionTuple.h"
Dmitri Gribenkof430da42014-02-12 10:33:14 +0000121#include "llvm/Support/raw_ostream.h"
Guy Benyei11169dd2012-12-18 14:30:41 +0000122#include <algorithm>
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +0000123#include <cassert>
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +0000124#include <cstddef>
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +0000125#include <cstdint>
Chris Lattner91f373e2013-01-20 00:57:52 +0000126#include <cstdio>
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +0000127#include <ctime>
Guy Benyei11169dd2012-12-18 14:30:41 +0000128#include <iterator>
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +0000129#include <limits>
130#include <map>
131#include <memory>
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +0000132#include <string>
Rafael Espindola8a8e5542014-06-12 17:19:42 +0000133#include <system_error>
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +0000134#include <tuple>
135#include <utility>
136#include <vector>
Guy Benyei11169dd2012-12-18 14:30:41 +0000137
138using namespace clang;
Vedant Kumar48b4f762018-04-14 01:40:48 +0000139using namespace clang::serialization;
140using namespace clang::serialization::reader;
Chris Lattner7fb3bef2013-01-20 00:56:42 +0000141using llvm::BitstreamCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +0000142
Ben Langmuircb69b572014-03-07 06:40:32 +0000143//===----------------------------------------------------------------------===//
144// ChainedASTReaderListener implementation
145//===----------------------------------------------------------------------===//
146
147bool
148ChainedASTReaderListener::ReadFullVersionInformation(StringRef FullVersion) {
149 return First->ReadFullVersionInformation(FullVersion) ||
150 Second->ReadFullVersionInformation(FullVersion);
151}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +0000152
Ben Langmuir4f5212a2014-04-14 22:12:44 +0000153void ChainedASTReaderListener::ReadModuleName(StringRef ModuleName) {
154 First->ReadModuleName(ModuleName);
155 Second->ReadModuleName(ModuleName);
156}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +0000157
Ben Langmuir4f5212a2014-04-14 22:12:44 +0000158void ChainedASTReaderListener::ReadModuleMapFile(StringRef ModuleMapPath) {
159 First->ReadModuleMapFile(ModuleMapPath);
160 Second->ReadModuleMapFile(ModuleMapPath);
161}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +0000162
Richard Smith1e2cf0d2014-10-31 02:28:58 +0000163bool
164ChainedASTReaderListener::ReadLanguageOptions(const LangOptions &LangOpts,
165 bool Complain,
166 bool AllowCompatibleDifferences) {
167 return First->ReadLanguageOptions(LangOpts, Complain,
168 AllowCompatibleDifferences) ||
169 Second->ReadLanguageOptions(LangOpts, Complain,
170 AllowCompatibleDifferences);
Ben Langmuircb69b572014-03-07 06:40:32 +0000171}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +0000172
Chandler Carruth0d745bc2015-03-14 04:47:43 +0000173bool ChainedASTReaderListener::ReadTargetOptions(
174 const TargetOptions &TargetOpts, bool Complain,
175 bool AllowCompatibleDifferences) {
176 return First->ReadTargetOptions(TargetOpts, Complain,
177 AllowCompatibleDifferences) ||
178 Second->ReadTargetOptions(TargetOpts, Complain,
179 AllowCompatibleDifferences);
Ben Langmuircb69b572014-03-07 06:40:32 +0000180}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +0000181
Ben Langmuircb69b572014-03-07 06:40:32 +0000182bool ChainedASTReaderListener::ReadDiagnosticOptions(
Ben Langmuirb92de022014-04-29 16:25:26 +0000183 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) {
Ben Langmuircb69b572014-03-07 06:40:32 +0000184 return First->ReadDiagnosticOptions(DiagOpts, Complain) ||
185 Second->ReadDiagnosticOptions(DiagOpts, Complain);
186}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +0000187
Ben Langmuircb69b572014-03-07 06:40:32 +0000188bool
189ChainedASTReaderListener::ReadFileSystemOptions(const FileSystemOptions &FSOpts,
190 bool Complain) {
191 return First->ReadFileSystemOptions(FSOpts, Complain) ||
192 Second->ReadFileSystemOptions(FSOpts, Complain);
193}
194
195bool ChainedASTReaderListener::ReadHeaderSearchOptions(
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +0000196 const HeaderSearchOptions &HSOpts, StringRef SpecificModuleCachePath,
197 bool Complain) {
198 return First->ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
199 Complain) ||
200 Second->ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
201 Complain);
Ben Langmuircb69b572014-03-07 06:40:32 +0000202}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +0000203
Ben Langmuircb69b572014-03-07 06:40:32 +0000204bool ChainedASTReaderListener::ReadPreprocessorOptions(
205 const PreprocessorOptions &PPOpts, bool Complain,
206 std::string &SuggestedPredefines) {
207 return First->ReadPreprocessorOptions(PPOpts, Complain,
208 SuggestedPredefines) ||
209 Second->ReadPreprocessorOptions(PPOpts, Complain, SuggestedPredefines);
210}
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +0000211
Ben Langmuircb69b572014-03-07 06:40:32 +0000212void ChainedASTReaderListener::ReadCounter(const serialization::ModuleFile &M,
213 unsigned Value) {
214 First->ReadCounter(M, Value);
215 Second->ReadCounter(M, Value);
216}
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +0000217
Ben Langmuircb69b572014-03-07 06:40:32 +0000218bool ChainedASTReaderListener::needsInputFileVisitation() {
219 return First->needsInputFileVisitation() ||
220 Second->needsInputFileVisitation();
221}
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +0000222
Ben Langmuircb69b572014-03-07 06:40:32 +0000223bool ChainedASTReaderListener::needsSystemInputFileVisitation() {
224 return First->needsSystemInputFileVisitation() ||
225 Second->needsSystemInputFileVisitation();
226}
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +0000227
Richard Smith216a3bd2015-08-13 17:57:10 +0000228void ChainedASTReaderListener::visitModuleFile(StringRef Filename,
229 ModuleKind Kind) {
230 First->visitModuleFile(Filename, Kind);
231 Second->visitModuleFile(Filename, Kind);
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000232}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +0000233
Ben Langmuircb69b572014-03-07 06:40:32 +0000234bool ChainedASTReaderListener::visitInputFile(StringRef Filename,
Argyrios Kyrtzidis68ccbe02014-03-14 02:26:31 +0000235 bool isSystem,
Richard Smith216a3bd2015-08-13 17:57:10 +0000236 bool isOverridden,
237 bool isExplicitModule) {
Justin Bognerc65a66d2014-05-22 06:04:59 +0000238 bool Continue = false;
239 if (First->needsInputFileVisitation() &&
240 (!isSystem || First->needsSystemInputFileVisitation()))
Richard Smith216a3bd2015-08-13 17:57:10 +0000241 Continue |= First->visitInputFile(Filename, isSystem, isOverridden,
242 isExplicitModule);
Justin Bognerc65a66d2014-05-22 06:04:59 +0000243 if (Second->needsInputFileVisitation() &&
244 (!isSystem || Second->needsSystemInputFileVisitation()))
Richard Smith216a3bd2015-08-13 17:57:10 +0000245 Continue |= Second->visitInputFile(Filename, isSystem, isOverridden,
246 isExplicitModule);
Justin Bognerc65a66d2014-05-22 06:04:59 +0000247 return Continue;
Ben Langmuircb69b572014-03-07 06:40:32 +0000248}
249
Douglas Gregor6623e1f2015-11-03 18:33:07 +0000250void ChainedASTReaderListener::readModuleFileExtension(
251 const ModuleFileExtensionMetadata &Metadata) {
252 First->readModuleFileExtension(Metadata);
253 Second->readModuleFileExtension(Metadata);
254}
255
Guy Benyei11169dd2012-12-18 14:30:41 +0000256//===----------------------------------------------------------------------===//
257// PCH validator implementation
258//===----------------------------------------------------------------------===//
259
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +0000260ASTReaderListener::~ASTReaderListener() = default;
Guy Benyei11169dd2012-12-18 14:30:41 +0000261
Adrian Prantl9fc8faf2018-05-09 01:00:01 +0000262/// Compare the given set of language options against an existing set of
Guy Benyei11169dd2012-12-18 14:30:41 +0000263/// language options.
264///
265/// \param Diags If non-NULL, diagnostics will be emitted via this engine.
Richard Smith1e2cf0d2014-10-31 02:28:58 +0000266/// \param AllowCompatibleDifferences If true, differences between compatible
267/// language options will be permitted.
Guy Benyei11169dd2012-12-18 14:30:41 +0000268///
269/// \returns true if the languagae options mis-match, false otherwise.
270static bool checkLanguageOptions(const LangOptions &LangOpts,
271 const LangOptions &ExistingLangOpts,
Richard Smith1e2cf0d2014-10-31 02:28:58 +0000272 DiagnosticsEngine *Diags,
273 bool AllowCompatibleDifferences = true) {
Guy Benyei11169dd2012-12-18 14:30:41 +0000274#define LANGOPT(Name, Bits, Default, Description) \
275 if (ExistingLangOpts.Name != LangOpts.Name) { \
276 if (Diags) \
277 Diags->Report(diag::err_pch_langopt_mismatch) \
278 << Description << LangOpts.Name << ExistingLangOpts.Name; \
279 return true; \
280 }
281
282#define VALUE_LANGOPT(Name, Bits, Default, Description) \
283 if (ExistingLangOpts.Name != LangOpts.Name) { \
284 if (Diags) \
285 Diags->Report(diag::err_pch_langopt_value_mismatch) \
286 << Description; \
287 return true; \
288 }
289
290#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
291 if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \
292 if (Diags) \
293 Diags->Report(diag::err_pch_langopt_value_mismatch) \
294 << Description; \
295 return true; \
296 }
297
Richard Smith1e2cf0d2014-10-31 02:28:58 +0000298#define COMPATIBLE_LANGOPT(Name, Bits, Default, Description) \
299 if (!AllowCompatibleDifferences) \
300 LANGOPT(Name, Bits, Default, Description)
301
302#define COMPATIBLE_ENUM_LANGOPT(Name, Bits, Default, Description) \
303 if (!AllowCompatibleDifferences) \
304 ENUM_LANGOPT(Name, Bits, Default, Description)
305
Richard Smitha1ddf5e2016-04-07 20:47:37 +0000306#define COMPATIBLE_VALUE_LANGOPT(Name, Bits, Default, Description) \
307 if (!AllowCompatibleDifferences) \
308 VALUE_LANGOPT(Name, Bits, Default, Description)
309
Guy Benyei11169dd2012-12-18 14:30:41 +0000310#define BENIGN_LANGOPT(Name, Bits, Default, Description)
311#define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description)
Richard Smitha1ddf5e2016-04-07 20:47:37 +0000312#define BENIGN_VALUE_LANGOPT(Name, Type, Bits, Default, Description)
Guy Benyei11169dd2012-12-18 14:30:41 +0000313#include "clang/Basic/LangOptions.def"
314
Ben Langmuircd98cb72015-06-23 18:20:18 +0000315 if (ExistingLangOpts.ModuleFeatures != LangOpts.ModuleFeatures) {
316 if (Diags)
317 Diags->Report(diag::err_pch_langopt_value_mismatch) << "module features";
318 return true;
319 }
320
Guy Benyei11169dd2012-12-18 14:30:41 +0000321 if (ExistingLangOpts.ObjCRuntime != LangOpts.ObjCRuntime) {
322 if (Diags)
323 Diags->Report(diag::err_pch_langopt_value_mismatch)
324 << "target Objective-C runtime";
325 return true;
326 }
327
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +0000328 if (ExistingLangOpts.CommentOpts.BlockCommandNames !=
329 LangOpts.CommentOpts.BlockCommandNames) {
330 if (Diags)
331 Diags->Report(diag::err_pch_langopt_value_mismatch)
332 << "block command names";
333 return true;
334 }
335
Vedant Kumar85a83c22017-06-01 20:01:01 +0000336 // Sanitizer feature mismatches are treated as compatible differences. If
337 // compatible differences aren't allowed, we still only want to check for
338 // mismatches of non-modular sanitizers (the only ones which can affect AST
339 // generation).
340 if (!AllowCompatibleDifferences) {
341 SanitizerMask ModularSanitizers = getPPTransparentSanitizers();
342 SanitizerSet ExistingSanitizers = ExistingLangOpts.Sanitize;
343 SanitizerSet ImportedSanitizers = LangOpts.Sanitize;
344 ExistingSanitizers.clear(ModularSanitizers);
345 ImportedSanitizers.clear(ModularSanitizers);
346 if (ExistingSanitizers.Mask != ImportedSanitizers.Mask) {
347 const std::string Flag = "-fsanitize=";
348 if (Diags) {
349#define SANITIZER(NAME, ID) \
350 { \
351 bool InExistingModule = ExistingSanitizers.has(SanitizerKind::ID); \
352 bool InImportedModule = ImportedSanitizers.has(SanitizerKind::ID); \
353 if (InExistingModule != InImportedModule) \
354 Diags->Report(diag::err_pch_targetopt_feature_mismatch) \
355 << InExistingModule << (Flag + NAME); \
356 }
357#include "clang/Basic/Sanitizers.def"
358 }
359 return true;
360 }
361 }
362
Guy Benyei11169dd2012-12-18 14:30:41 +0000363 return false;
364}
365
Adrian Prantl9fc8faf2018-05-09 01:00:01 +0000366/// Compare the given set of target options against an existing set of
Guy Benyei11169dd2012-12-18 14:30:41 +0000367/// target options.
368///
369/// \param Diags If non-NULL, diagnostics will be emitted via this engine.
370///
371/// \returns true if the target options mis-match, false otherwise.
372static bool checkTargetOptions(const TargetOptions &TargetOpts,
373 const TargetOptions &ExistingTargetOpts,
Chandler Carruth0d745bc2015-03-14 04:47:43 +0000374 DiagnosticsEngine *Diags,
375 bool AllowCompatibleDifferences = true) {
Guy Benyei11169dd2012-12-18 14:30:41 +0000376#define CHECK_TARGET_OPT(Field, Name) \
377 if (TargetOpts.Field != ExistingTargetOpts.Field) { \
378 if (Diags) \
379 Diags->Report(diag::err_pch_targetopt_mismatch) \
380 << Name << TargetOpts.Field << ExistingTargetOpts.Field; \
381 return true; \
382 }
383
Chandler Carruth0d745bc2015-03-14 04:47:43 +0000384 // The triple and ABI must match exactly.
Guy Benyei11169dd2012-12-18 14:30:41 +0000385 CHECK_TARGET_OPT(Triple, "target");
Guy Benyei11169dd2012-12-18 14:30:41 +0000386 CHECK_TARGET_OPT(ABI, "target ABI");
Chandler Carruth0d745bc2015-03-14 04:47:43 +0000387
388 // We can tolerate different CPUs in many cases, notably when one CPU
389 // supports a strict superset of another. When allowing compatible
390 // differences skip this check.
391 if (!AllowCompatibleDifferences)
392 CHECK_TARGET_OPT(CPU, "target CPU");
393
Guy Benyei11169dd2012-12-18 14:30:41 +0000394#undef CHECK_TARGET_OPT
395
396 // Compare feature sets.
397 SmallVector<StringRef, 4> ExistingFeatures(
398 ExistingTargetOpts.FeaturesAsWritten.begin(),
399 ExistingTargetOpts.FeaturesAsWritten.end());
400 SmallVector<StringRef, 4> ReadFeatures(TargetOpts.FeaturesAsWritten.begin(),
401 TargetOpts.FeaturesAsWritten.end());
Fangrui Song55fab262018-09-26 22:16:28 +0000402 llvm::sort(ExistingFeatures);
403 llvm::sort(ReadFeatures);
Guy Benyei11169dd2012-12-18 14:30:41 +0000404
Chandler Carruth0d745bc2015-03-14 04:47:43 +0000405 // We compute the set difference in both directions explicitly so that we can
406 // diagnose the differences differently.
407 SmallVector<StringRef, 4> UnmatchedExistingFeatures, UnmatchedReadFeatures;
408 std::set_difference(
409 ExistingFeatures.begin(), ExistingFeatures.end(), ReadFeatures.begin(),
410 ReadFeatures.end(), std::back_inserter(UnmatchedExistingFeatures));
411 std::set_difference(ReadFeatures.begin(), ReadFeatures.end(),
412 ExistingFeatures.begin(), ExistingFeatures.end(),
413 std::back_inserter(UnmatchedReadFeatures));
Guy Benyei11169dd2012-12-18 14:30:41 +0000414
Chandler Carruth0d745bc2015-03-14 04:47:43 +0000415 // If we are allowing compatible differences and the read feature set is
416 // a strict subset of the existing feature set, there is nothing to diagnose.
417 if (AllowCompatibleDifferences && UnmatchedReadFeatures.empty())
418 return false;
Guy Benyei11169dd2012-12-18 14:30:41 +0000419
Chandler Carruth0d745bc2015-03-14 04:47:43 +0000420 if (Diags) {
421 for (StringRef Feature : UnmatchedReadFeatures)
Guy Benyei11169dd2012-12-18 14:30:41 +0000422 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
Chandler Carruth0d745bc2015-03-14 04:47:43 +0000423 << /* is-existing-feature */ false << Feature;
424 for (StringRef Feature : UnmatchedExistingFeatures)
425 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
426 << /* is-existing-feature */ true << Feature;
Guy Benyei11169dd2012-12-18 14:30:41 +0000427 }
428
Chandler Carruth0d745bc2015-03-14 04:47:43 +0000429 return !UnmatchedReadFeatures.empty() || !UnmatchedExistingFeatures.empty();
Guy Benyei11169dd2012-12-18 14:30:41 +0000430}
431
432bool
433PCHValidator::ReadLanguageOptions(const LangOptions &LangOpts,
Richard Smith1e2cf0d2014-10-31 02:28:58 +0000434 bool Complain,
435 bool AllowCompatibleDifferences) {
Guy Benyei11169dd2012-12-18 14:30:41 +0000436 const LangOptions &ExistingLangOpts = PP.getLangOpts();
437 return checkLanguageOptions(LangOpts, ExistingLangOpts,
Richard Smith1e2cf0d2014-10-31 02:28:58 +0000438 Complain ? &Reader.Diags : nullptr,
439 AllowCompatibleDifferences);
Guy Benyei11169dd2012-12-18 14:30:41 +0000440}
441
442bool PCHValidator::ReadTargetOptions(const TargetOptions &TargetOpts,
Chandler Carruth0d745bc2015-03-14 04:47:43 +0000443 bool Complain,
444 bool AllowCompatibleDifferences) {
Guy Benyei11169dd2012-12-18 14:30:41 +0000445 const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts();
446 return checkTargetOptions(TargetOpts, ExistingTargetOpts,
Chandler Carruth0d745bc2015-03-14 04:47:43 +0000447 Complain ? &Reader.Diags : nullptr,
448 AllowCompatibleDifferences);
Guy Benyei11169dd2012-12-18 14:30:41 +0000449}
450
451namespace {
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +0000452
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +0000453using MacroDefinitionsMap =
454 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/>>;
455using DeclsMap = llvm::DenseMap<DeclarationName, SmallVector<NamedDecl *, 8>>;
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +0000456
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +0000457} // namespace
Guy Benyei11169dd2012-12-18 14:30:41 +0000458
Ben Langmuirb92de022014-04-29 16:25:26 +0000459static bool checkDiagnosticGroupMappings(DiagnosticsEngine &StoredDiags,
460 DiagnosticsEngine &Diags,
461 bool Complain) {
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +0000462 using Level = DiagnosticsEngine::Level;
Ben Langmuirb92de022014-04-29 16:25:26 +0000463
464 // Check current mappings for new -Werror mappings, and the stored mappings
465 // for cases that were explicitly mapped to *not* be errors that are now
466 // errors because of options like -Werror.
467 DiagnosticsEngine *MappingSources[] = { &Diags, &StoredDiags };
468
Vedant Kumar48b4f762018-04-14 01:40:48 +0000469 for (DiagnosticsEngine *MappingSource : MappingSources) {
Ben Langmuirb92de022014-04-29 16:25:26 +0000470 for (auto DiagIDMappingPair : MappingSource->getDiagnosticMappings()) {
471 diag::kind DiagID = DiagIDMappingPair.first;
472 Level CurLevel = Diags.getDiagnosticLevel(DiagID, SourceLocation());
473 if (CurLevel < DiagnosticsEngine::Error)
474 continue; // not significant
475 Level StoredLevel =
476 StoredDiags.getDiagnosticLevel(DiagID, SourceLocation());
477 if (StoredLevel < DiagnosticsEngine::Error) {
478 if (Complain)
479 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror=" +
480 Diags.getDiagnosticIDs()->getWarningOptionForDiag(DiagID).str();
481 return true;
482 }
483 }
484 }
485
486 return false;
487}
488
Alp Tokerac4e8e52014-06-22 21:58:33 +0000489static bool isExtHandlingFromDiagsError(DiagnosticsEngine &Diags) {
490 diag::Severity Ext = Diags.getExtensionHandlingBehavior();
491 if (Ext == diag::Severity::Warning && Diags.getWarningsAsErrors())
492 return true;
493 return Ext >= diag::Severity::Error;
Ben Langmuirb92de022014-04-29 16:25:26 +0000494}
495
496static bool checkDiagnosticMappings(DiagnosticsEngine &StoredDiags,
497 DiagnosticsEngine &Diags,
498 bool IsSystem, bool Complain) {
499 // Top-level options
500 if (IsSystem) {
501 if (Diags.getSuppressSystemWarnings())
502 return false;
503 // If -Wsystem-headers was not enabled before, be conservative
504 if (StoredDiags.getSuppressSystemWarnings()) {
505 if (Complain)
506 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Wsystem-headers";
507 return true;
508 }
509 }
510
511 if (Diags.getWarningsAsErrors() && !StoredDiags.getWarningsAsErrors()) {
512 if (Complain)
513 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror";
514 return true;
515 }
516
517 if (Diags.getWarningsAsErrors() && Diags.getEnableAllWarnings() &&
518 !StoredDiags.getEnableAllWarnings()) {
519 if (Complain)
520 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Weverything -Werror";
521 return true;
522 }
523
524 if (isExtHandlingFromDiagsError(Diags) &&
525 !isExtHandlingFromDiagsError(StoredDiags)) {
526 if (Complain)
527 Diags.Report(diag::err_pch_diagopt_mismatch) << "-pedantic-errors";
528 return true;
529 }
530
531 return checkDiagnosticGroupMappings(StoredDiags, Diags, Complain);
532}
533
Duncan P. N. Exon Smith030d7d62017-03-20 17:58:26 +0000534/// Return the top import module if it is implicit, nullptr otherwise.
535static Module *getTopImportImplicitModule(ModuleManager &ModuleMgr,
536 Preprocessor &PP) {
537 // If the original import came from a file explicitly generated by the user,
538 // don't check the diagnostic mappings.
539 // FIXME: currently this is approximated by checking whether this is not a
540 // module import of an implicitly-loaded module file.
541 // Note: ModuleMgr.rbegin() may not be the current module, but it must be in
542 // the transitive closure of its imports, since unrelated modules cannot be
543 // imported until after this module finishes validation.
544 ModuleFile *TopImport = &*ModuleMgr.rbegin();
545 while (!TopImport->ImportedBy.empty())
546 TopImport = TopImport->ImportedBy[0];
547 if (TopImport->Kind != MK_ImplicitModule)
548 return nullptr;
549
550 StringRef ModuleName = TopImport->ModuleName;
551 assert(!ModuleName.empty() && "diagnostic options read before module name");
552
553 Module *M = PP.getHeaderSearchInfo().lookupModule(ModuleName);
554 assert(M && "missing module");
555 return M;
556}
557
Ben Langmuirb92de022014-04-29 16:25:26 +0000558bool PCHValidator::ReadDiagnosticOptions(
559 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) {
560 DiagnosticsEngine &ExistingDiags = PP.getDiagnostics();
561 IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(ExistingDiags.getDiagnosticIDs());
562 IntrusiveRefCntPtr<DiagnosticsEngine> Diags(
Alp Tokerf994cef2014-07-05 03:08:06 +0000563 new DiagnosticsEngine(DiagIDs, DiagOpts.get()));
Ben Langmuirb92de022014-04-29 16:25:26 +0000564 // This should never fail, because we would have processed these options
565 // before writing them to an ASTFile.
566 ProcessWarningOptions(*Diags, *DiagOpts, /*Report*/false);
567
568 ModuleManager &ModuleMgr = Reader.getModuleManager();
569 assert(ModuleMgr.size() >= 1 && "what ASTFile is this then");
570
Duncan P. N. Exon Smith030d7d62017-03-20 17:58:26 +0000571 Module *TopM = getTopImportImplicitModule(ModuleMgr, PP);
572 if (!TopM)
Ben Langmuirb92de022014-04-29 16:25:26 +0000573 return false;
574
Ben Langmuirb92de022014-04-29 16:25:26 +0000575 // FIXME: if the diagnostics are incompatible, save a DiagnosticOptions that
576 // contains the union of their flags.
Duncan P. N. Exon Smith030d7d62017-03-20 17:58:26 +0000577 return checkDiagnosticMappings(*Diags, ExistingDiags, TopM->IsSystem,
578 Complain);
Ben Langmuirb92de022014-04-29 16:25:26 +0000579}
580
Adrian Prantl9fc8faf2018-05-09 01:00:01 +0000581/// Collect the macro definitions provided by the given preprocessor
Guy Benyei11169dd2012-12-18 14:30:41 +0000582/// options.
Craig Toppera13603a2014-05-22 05:54:18 +0000583static void
584collectMacroDefinitions(const PreprocessorOptions &PPOpts,
585 MacroDefinitionsMap &Macros,
586 SmallVectorImpl<StringRef> *MacroNames = nullptr) {
Vedant Kumar48b4f762018-04-14 01:40:48 +0000587 for (unsigned I = 0, N = PPOpts.Macros.size(); I != N; ++I) {
588 StringRef Macro = PPOpts.Macros[I].first;
589 bool IsUndef = PPOpts.Macros[I].second;
Guy Benyei11169dd2012-12-18 14:30:41 +0000590
591 std::pair<StringRef, StringRef> MacroPair = Macro.split('=');
592 StringRef MacroName = MacroPair.first;
593 StringRef MacroBody = MacroPair.second;
594
595 // For an #undef'd macro, we only care about the name.
596 if (IsUndef) {
597 if (MacroNames && !Macros.count(MacroName))
598 MacroNames->push_back(MacroName);
599
600 Macros[MacroName] = std::make_pair("", true);
601 continue;
602 }
603
604 // For a #define'd macro, figure out the actual definition.
605 if (MacroName.size() == Macro.size())
606 MacroBody = "1";
607 else {
608 // Note: GCC drops anything following an end-of-line character.
609 StringRef::size_type End = MacroBody.find_first_of("\n\r");
610 MacroBody = MacroBody.substr(0, End);
611 }
612
613 if (MacroNames && !Macros.count(MacroName))
614 MacroNames->push_back(MacroName);
615 Macros[MacroName] = std::make_pair(MacroBody, false);
616 }
617}
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +0000618
Adrian Prantl9fc8faf2018-05-09 01:00:01 +0000619/// Check the preprocessor options deserialized from the control block
Guy Benyei11169dd2012-12-18 14:30:41 +0000620/// against the preprocessor options in an existing preprocessor.
621///
622/// \param Diags If non-null, produce diagnostics for any mismatches incurred.
Yaxun Liu43712e02016-09-07 18:40:20 +0000623/// \param Validate If true, validate preprocessor options. If false, allow
624/// macros defined by \p ExistingPPOpts to override those defined by
625/// \p PPOpts in SuggestedPredefines.
Guy Benyei11169dd2012-12-18 14:30:41 +0000626static bool checkPreprocessorOptions(const PreprocessorOptions &PPOpts,
627 const PreprocessorOptions &ExistingPPOpts,
628 DiagnosticsEngine *Diags,
629 FileManager &FileMgr,
Argyrios Kyrtzidisd3afa0c2013-04-26 21:33:40 +0000630 std::string &SuggestedPredefines,
Yaxun Liu43712e02016-09-07 18:40:20 +0000631 const LangOptions &LangOpts,
632 bool Validate = true) {
Guy Benyei11169dd2012-12-18 14:30:41 +0000633 // Check macro definitions.
634 MacroDefinitionsMap ASTFileMacros;
635 collectMacroDefinitions(PPOpts, ASTFileMacros);
636 MacroDefinitionsMap ExistingMacros;
637 SmallVector<StringRef, 4> ExistingMacroNames;
638 collectMacroDefinitions(ExistingPPOpts, ExistingMacros, &ExistingMacroNames);
639
Vedant Kumar48b4f762018-04-14 01:40:48 +0000640 for (unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) {
Guy Benyei11169dd2012-12-18 14:30:41 +0000641 // Dig out the macro definition in the existing preprocessor options.
Vedant Kumar48b4f762018-04-14 01:40:48 +0000642 StringRef MacroName = ExistingMacroNames[I];
Guy Benyei11169dd2012-12-18 14:30:41 +0000643 std::pair<StringRef, bool> Existing = ExistingMacros[MacroName];
644
645 // Check whether we know anything about this macro name or not.
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +0000646 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/>>::iterator Known =
647 ASTFileMacros.find(MacroName);
Yaxun Liu43712e02016-09-07 18:40:20 +0000648 if (!Validate || Known == ASTFileMacros.end()) {
Guy Benyei11169dd2012-12-18 14:30:41 +0000649 // FIXME: Check whether this identifier was referenced anywhere in the
650 // AST file. If so, we should reject the AST file. Unfortunately, this
651 // information isn't in the control block. What shall we do about it?
652
653 if (Existing.second) {
654 SuggestedPredefines += "#undef ";
655 SuggestedPredefines += MacroName.str();
656 SuggestedPredefines += '\n';
657 } else {
658 SuggestedPredefines += "#define ";
659 SuggestedPredefines += MacroName.str();
660 SuggestedPredefines += ' ';
661 SuggestedPredefines += Existing.first.str();
662 SuggestedPredefines += '\n';
663 }
664 continue;
665 }
666
667 // If the macro was defined in one but undef'd in the other, we have a
668 // conflict.
669 if (Existing.second != Known->second.second) {
670 if (Diags) {
671 Diags->Report(diag::err_pch_macro_def_undef)
672 << MacroName << Known->second.second;
673 }
674 return true;
675 }
676
677 // If the macro was #undef'd in both, or if the macro bodies are identical,
678 // it's fine.
679 if (Existing.second || Existing.first == Known->second.first)
680 continue;
681
682 // The macro bodies differ; complain.
683 if (Diags) {
684 Diags->Report(diag::err_pch_macro_def_conflict)
685 << MacroName << Known->second.first << Existing.first;
686 }
687 return true;
688 }
689
690 // Check whether we're using predefines.
Yaxun Liu43712e02016-09-07 18:40:20 +0000691 if (PPOpts.UsePredefines != ExistingPPOpts.UsePredefines && Validate) {
Guy Benyei11169dd2012-12-18 14:30:41 +0000692 if (Diags) {
693 Diags->Report(diag::err_pch_undef) << ExistingPPOpts.UsePredefines;
694 }
695 return true;
696 }
697
Argyrios Kyrtzidisd3afa0c2013-04-26 21:33:40 +0000698 // Detailed record is important since it is used for the module cache hash.
699 if (LangOpts.Modules &&
Yaxun Liu43712e02016-09-07 18:40:20 +0000700 PPOpts.DetailedRecord != ExistingPPOpts.DetailedRecord && Validate) {
Argyrios Kyrtzidisd3afa0c2013-04-26 21:33:40 +0000701 if (Diags) {
702 Diags->Report(diag::err_pch_pp_detailed_record) << PPOpts.DetailedRecord;
703 }
704 return true;
705 }
706
Guy Benyei11169dd2012-12-18 14:30:41 +0000707 // Compute the #include and #include_macros lines we need.
Vedant Kumar48b4f762018-04-14 01:40:48 +0000708 for (unsigned I = 0, N = ExistingPPOpts.Includes.size(); I != N; ++I) {
709 StringRef File = ExistingPPOpts.Includes[I];
Erich Keane76675de2018-07-05 17:22:13 +0000710
711 if (!ExistingPPOpts.ImplicitPCHInclude.empty() &&
712 !ExistingPPOpts.PCHThroughHeader.empty()) {
713 // In case the through header is an include, we must add all the includes
714 // to the predefines so the start point can be determined.
715 SuggestedPredefines += "#include \"";
716 SuggestedPredefines += File;
717 SuggestedPredefines += "\"\n";
718 continue;
719 }
720
Guy Benyei11169dd2012-12-18 14:30:41 +0000721 if (File == ExistingPPOpts.ImplicitPCHInclude)
722 continue;
723
724 if (std::find(PPOpts.Includes.begin(), PPOpts.Includes.end(), File)
725 != PPOpts.Includes.end())
726 continue;
727
728 SuggestedPredefines += "#include \"";
Manuel Klimek9af34ae2014-08-12 08:25:57 +0000729 SuggestedPredefines += File;
Guy Benyei11169dd2012-12-18 14:30:41 +0000730 SuggestedPredefines += "\"\n";
731 }
732
Vedant Kumar48b4f762018-04-14 01:40:48 +0000733 for (unsigned I = 0, N = ExistingPPOpts.MacroIncludes.size(); I != N; ++I) {
734 StringRef File = ExistingPPOpts.MacroIncludes[I];
Guy Benyei11169dd2012-12-18 14:30:41 +0000735 if (std::find(PPOpts.MacroIncludes.begin(), PPOpts.MacroIncludes.end(),
736 File)
737 != PPOpts.MacroIncludes.end())
738 continue;
739
740 SuggestedPredefines += "#__include_macros \"";
Manuel Klimek9af34ae2014-08-12 08:25:57 +0000741 SuggestedPredefines += File;
Guy Benyei11169dd2012-12-18 14:30:41 +0000742 SuggestedPredefines += "\"\n##\n";
743 }
744
745 return false;
746}
747
748bool PCHValidator::ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
749 bool Complain,
750 std::string &SuggestedPredefines) {
751 const PreprocessorOptions &ExistingPPOpts = PP.getPreprocessorOpts();
752
753 return checkPreprocessorOptions(PPOpts, ExistingPPOpts,
Craig Toppera13603a2014-05-22 05:54:18 +0000754 Complain? &Reader.Diags : nullptr,
Guy Benyei11169dd2012-12-18 14:30:41 +0000755 PP.getFileManager(),
Argyrios Kyrtzidisd3afa0c2013-04-26 21:33:40 +0000756 SuggestedPredefines,
757 PP.getLangOpts());
Guy Benyei11169dd2012-12-18 14:30:41 +0000758}
759
Yaxun Liu43712e02016-09-07 18:40:20 +0000760bool SimpleASTReaderListener::ReadPreprocessorOptions(
761 const PreprocessorOptions &PPOpts,
762 bool Complain,
763 std::string &SuggestedPredefines) {
764 return checkPreprocessorOptions(PPOpts,
765 PP.getPreprocessorOpts(),
766 nullptr,
767 PP.getFileManager(),
768 SuggestedPredefines,
769 PP.getLangOpts(),
770 false);
771}
772
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +0000773/// Check the header search options deserialized from the control block
774/// against the header search options in an existing preprocessor.
775///
776/// \param Diags If non-null, produce diagnostics for any mismatches incurred.
777static bool checkHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
778 StringRef SpecificModuleCachePath,
779 StringRef ExistingModuleCachePath,
780 DiagnosticsEngine *Diags,
781 const LangOptions &LangOpts) {
782 if (LangOpts.Modules) {
783 if (SpecificModuleCachePath != ExistingModuleCachePath) {
784 if (Diags)
785 Diags->Report(diag::err_pch_modulecache_mismatch)
786 << SpecificModuleCachePath << ExistingModuleCachePath;
787 return true;
788 }
789 }
790
791 return false;
792}
793
794bool PCHValidator::ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
795 StringRef SpecificModuleCachePath,
796 bool Complain) {
797 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
798 PP.getHeaderSearchInfo().getModuleCachePath(),
799 Complain ? &Reader.Diags : nullptr,
800 PP.getLangOpts());
801}
802
Guy Benyei11169dd2012-12-18 14:30:41 +0000803void PCHValidator::ReadCounter(const ModuleFile &M, unsigned Value) {
804 PP.setCounterValue(Value);
805}
806
807//===----------------------------------------------------------------------===//
808// AST reader implementation
809//===----------------------------------------------------------------------===//
810
Nico Weber824285e2014-05-08 04:26:47 +0000811void ASTReader::setDeserializationListener(ASTDeserializationListener *Listener,
812 bool TakeOwnership) {
Guy Benyei11169dd2012-12-18 14:30:41 +0000813 DeserializationListener = Listener;
Nico Weber824285e2014-05-08 04:26:47 +0000814 OwnsDeserializationListener = TakeOwnership;
Guy Benyei11169dd2012-12-18 14:30:41 +0000815}
816
Guy Benyei11169dd2012-12-18 14:30:41 +0000817unsigned ASTSelectorLookupTrait::ComputeHash(Selector Sel) {
818 return serialization::ComputeHash(Sel);
819}
820
Guy Benyei11169dd2012-12-18 14:30:41 +0000821std::pair<unsigned, unsigned>
822ASTSelectorLookupTrait::ReadKeyDataLength(const unsigned char*& d) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000823 using namespace llvm::support;
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +0000824
Justin Bogner57ba0b22014-03-28 22:03:24 +0000825 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
826 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
Guy Benyei11169dd2012-12-18 14:30:41 +0000827 return std::make_pair(KeyLen, DataLen);
828}
829
David L. Jonesc4808b9e2016-12-15 20:53:26 +0000830ASTSelectorLookupTrait::internal_key_type
Guy Benyei11169dd2012-12-18 14:30:41 +0000831ASTSelectorLookupTrait::ReadKey(const unsigned char* d, unsigned) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000832 using namespace llvm::support;
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +0000833
Guy Benyei11169dd2012-12-18 14:30:41 +0000834 SelectorTable &SelTable = Reader.getContext().Selectors;
Justin Bogner57ba0b22014-03-28 22:03:24 +0000835 unsigned N = endian::readNext<uint16_t, little, unaligned>(d);
836 IdentifierInfo *FirstII = Reader.getLocalIdentifier(
837 F, endian::readNext<uint32_t, little, unaligned>(d));
Guy Benyei11169dd2012-12-18 14:30:41 +0000838 if (N == 0)
839 return SelTable.getNullarySelector(FirstII);
840 else if (N == 1)
841 return SelTable.getUnarySelector(FirstII);
842
843 SmallVector<IdentifierInfo *, 16> Args;
844 Args.push_back(FirstII);
845 for (unsigned I = 1; I != N; ++I)
Justin Bogner57ba0b22014-03-28 22:03:24 +0000846 Args.push_back(Reader.getLocalIdentifier(
847 F, endian::readNext<uint32_t, little, unaligned>(d)));
Guy Benyei11169dd2012-12-18 14:30:41 +0000848
849 return SelTable.getSelector(N, Args.data());
850}
851
David L. Jonesc4808b9e2016-12-15 20:53:26 +0000852ASTSelectorLookupTrait::data_type
853ASTSelectorLookupTrait::ReadData(Selector, const unsigned char* d,
Guy Benyei11169dd2012-12-18 14:30:41 +0000854 unsigned DataLen) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000855 using namespace llvm::support;
Guy Benyei11169dd2012-12-18 14:30:41 +0000856
857 data_type Result;
858
Justin Bogner57ba0b22014-03-28 22:03:24 +0000859 Result.ID = Reader.getGlobalSelectorID(
860 F, endian::readNext<uint32_t, little, unaligned>(d));
Nico Weberff4b35e2014-12-27 22:14:15 +0000861 unsigned FullInstanceBits = endian::readNext<uint16_t, little, unaligned>(d);
862 unsigned FullFactoryBits = endian::readNext<uint16_t, little, unaligned>(d);
863 Result.InstanceBits = FullInstanceBits & 0x3;
864 Result.InstanceHasMoreThanOneDecl = (FullInstanceBits >> 2) & 0x1;
865 Result.FactoryBits = FullFactoryBits & 0x3;
866 Result.FactoryHasMoreThanOneDecl = (FullFactoryBits >> 2) & 0x1;
867 unsigned NumInstanceMethods = FullInstanceBits >> 3;
868 unsigned NumFactoryMethods = FullFactoryBits >> 3;
Guy Benyei11169dd2012-12-18 14:30:41 +0000869
870 // Load instance methods
871 for (unsigned I = 0; I != NumInstanceMethods; ++I) {
Vedant Kumar48b4f762018-04-14 01:40:48 +0000872 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
Justin Bogner57ba0b22014-03-28 22:03:24 +0000873 F, endian::readNext<uint32_t, little, unaligned>(d)))
Guy Benyei11169dd2012-12-18 14:30:41 +0000874 Result.Instance.push_back(Method);
875 }
876
877 // Load factory methods
878 for (unsigned I = 0; I != NumFactoryMethods; ++I) {
Vedant Kumar48b4f762018-04-14 01:40:48 +0000879 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
Justin Bogner57ba0b22014-03-28 22:03:24 +0000880 F, endian::readNext<uint32_t, little, unaligned>(d)))
Guy Benyei11169dd2012-12-18 14:30:41 +0000881 Result.Factory.push_back(Method);
882 }
883
884 return Result;
885}
886
Douglas Gregorbfd73d72013-01-23 18:53:14 +0000887unsigned ASTIdentifierLookupTraitBase::ComputeHash(const internal_key_type& a) {
Jonas Devlieghere560ce2c2018-02-26 15:16:42 +0000888 return llvm::djbHash(a);
Guy Benyei11169dd2012-12-18 14:30:41 +0000889}
890
891std::pair<unsigned, unsigned>
Douglas Gregorbfd73d72013-01-23 18:53:14 +0000892ASTIdentifierLookupTraitBase::ReadKeyDataLength(const unsigned char*& d) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000893 using namespace llvm::support;
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +0000894
Justin Bogner57ba0b22014-03-28 22:03:24 +0000895 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
896 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
Guy Benyei11169dd2012-12-18 14:30:41 +0000897 return std::make_pair(KeyLen, DataLen);
898}
899
Douglas Gregorbfd73d72013-01-23 18:53:14 +0000900ASTIdentifierLookupTraitBase::internal_key_type
901ASTIdentifierLookupTraitBase::ReadKey(const unsigned char* d, unsigned n) {
Guy Benyei11169dd2012-12-18 14:30:41 +0000902 assert(n >= 2 && d[n-1] == '\0');
Douglas Gregorbfd73d72013-01-23 18:53:14 +0000903 return StringRef((const char*) d, n-1);
Guy Benyei11169dd2012-12-18 14:30:41 +0000904}
905
Adrian Prantl9fc8faf2018-05-09 01:00:01 +0000906/// Whether the given identifier is "interesting".
Richard Smitha534a312015-07-21 23:54:07 +0000907static bool isInterestingIdentifier(ASTReader &Reader, IdentifierInfo &II,
908 bool IsModule) {
Richard Smithcab89802015-07-17 20:19:56 +0000909 return II.hadMacroDefinition() ||
910 II.isPoisoned() ||
Richard Smith9c254182015-07-19 21:41:12 +0000911 (IsModule ? II.hasRevertedBuiltin() : II.getObjCOrBuiltinID()) ||
Douglas Gregordcf25082013-02-11 18:16:18 +0000912 II.hasRevertedTokenIDToIdentifier() ||
Richard Smithdbafb6c2017-06-29 23:23:46 +0000913 (!(IsModule && Reader.getPreprocessor().getLangOpts().CPlusPlus) &&
Bruno Ricci366ba732018-09-21 12:53:22 +0000914 II.getFETokenInfo());
Douglas Gregordcf25082013-02-11 18:16:18 +0000915}
916
Richard Smith76c2f2c2015-07-17 20:09:43 +0000917static bool readBit(unsigned &Bits) {
918 bool Value = Bits & 0x1;
919 Bits >>= 1;
920 return Value;
921}
922
Richard Smith79bf9202015-08-24 03:33:22 +0000923IdentID ASTIdentifierLookupTrait::ReadIdentifierID(const unsigned char *d) {
924 using namespace llvm::support;
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +0000925
Richard Smith79bf9202015-08-24 03:33:22 +0000926 unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d);
927 return Reader.getGlobalIdentifierID(F, RawID >> 1);
928}
929
Richard Smitheb4b58f62016-02-05 01:40:54 +0000930static void markIdentifierFromAST(ASTReader &Reader, IdentifierInfo &II) {
931 if (!II.isFromAST()) {
932 II.setIsFromAST();
933 bool IsModule = Reader.getPreprocessor().getCurrentModule() != nullptr;
934 if (isInterestingIdentifier(Reader, II, IsModule))
935 II.setChangedSinceDeserialization();
936 }
937}
938
Guy Benyei11169dd2012-12-18 14:30:41 +0000939IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k,
940 const unsigned char* d,
941 unsigned DataLen) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000942 using namespace llvm::support;
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +0000943
Justin Bogner57ba0b22014-03-28 22:03:24 +0000944 unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d);
Guy Benyei11169dd2012-12-18 14:30:41 +0000945 bool IsInteresting = RawID & 0x01;
946
947 // Wipe out the "is interesting" bit.
948 RawID = RawID >> 1;
949
Richard Smith76c2f2c2015-07-17 20:09:43 +0000950 // Build the IdentifierInfo and link the identifier ID with it.
951 IdentifierInfo *II = KnownII;
952 if (!II) {
953 II = &Reader.getIdentifierTable().getOwn(k);
954 KnownII = II;
955 }
Richard Smitheb4b58f62016-02-05 01:40:54 +0000956 markIdentifierFromAST(Reader, *II);
Richard Smith76c2f2c2015-07-17 20:09:43 +0000957 Reader.markIdentifierUpToDate(II);
958
Guy Benyei11169dd2012-12-18 14:30:41 +0000959 IdentID ID = Reader.getGlobalIdentifierID(F, RawID);
960 if (!IsInteresting) {
Richard Smith76c2f2c2015-07-17 20:09:43 +0000961 // For uninteresting identifiers, there's nothing else to do. Just notify
962 // the reader that we've finished loading this identifier.
Guy Benyei11169dd2012-12-18 14:30:41 +0000963 Reader.SetIdentifierInfo(ID, II);
Guy Benyei11169dd2012-12-18 14:30:41 +0000964 return II;
965 }
966
Justin Bogner57ba0b22014-03-28 22:03:24 +0000967 unsigned ObjCOrBuiltinID = endian::readNext<uint16_t, little, unaligned>(d);
968 unsigned Bits = endian::readNext<uint16_t, little, unaligned>(d);
Richard Smith76c2f2c2015-07-17 20:09:43 +0000969 bool CPlusPlusOperatorKeyword = readBit(Bits);
970 bool HasRevertedTokenIDToIdentifier = readBit(Bits);
Richard Smith9c254182015-07-19 21:41:12 +0000971 bool HasRevertedBuiltin = readBit(Bits);
Richard Smith76c2f2c2015-07-17 20:09:43 +0000972 bool Poisoned = readBit(Bits);
973 bool ExtensionToken = readBit(Bits);
974 bool HadMacroDefinition = readBit(Bits);
Guy Benyei11169dd2012-12-18 14:30:41 +0000975
976 assert(Bits == 0 && "Extra bits in the identifier?");
977 DataLen -= 8;
978
Guy Benyei11169dd2012-12-18 14:30:41 +0000979 // Set or check the various bits in the IdentifierInfo structure.
980 // Token IDs are read-only.
Argyrios Kyrtzidisddee8c92013-02-27 01:13:51 +0000981 if (HasRevertedTokenIDToIdentifier && II->getTokenID() != tok::identifier)
Richard Smith9c254182015-07-19 21:41:12 +0000982 II->revertTokenIDToIdentifier();
983 if (!F.isModule())
984 II->setObjCOrBuiltinID(ObjCOrBuiltinID);
985 else if (HasRevertedBuiltin && II->getBuiltinID()) {
986 II->revertBuiltin();
987 assert((II->hasRevertedBuiltin() ||
988 II->getObjCOrBuiltinID() == ObjCOrBuiltinID) &&
989 "Incorrect ObjC keyword or builtin ID");
990 }
Guy Benyei11169dd2012-12-18 14:30:41 +0000991 assert(II->isExtensionToken() == ExtensionToken &&
992 "Incorrect extension token flag");
993 (void)ExtensionToken;
994 if (Poisoned)
995 II->setIsPoisoned(true);
996 assert(II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword &&
997 "Incorrect C++ operator keyword flag");
998 (void)CPlusPlusOperatorKeyword;
999
1000 // If this identifier is a macro, deserialize the macro
1001 // definition.
Richard Smith76c2f2c2015-07-17 20:09:43 +00001002 if (HadMacroDefinition) {
Justin Bogner57ba0b22014-03-28 22:03:24 +00001003 uint32_t MacroDirectivesOffset =
1004 endian::readNext<uint32_t, little, unaligned>(d);
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001005 DataLen -= 4;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001006
Richard Smithd7329392015-04-21 21:46:32 +00001007 Reader.addPendingMacro(II, &F, MacroDirectivesOffset);
Guy Benyei11169dd2012-12-18 14:30:41 +00001008 }
1009
1010 Reader.SetIdentifierInfo(ID, II);
1011
1012 // Read all of the declarations visible at global scope with this
1013 // name.
1014 if (DataLen > 0) {
1015 SmallVector<uint32_t, 4> DeclIDs;
1016 for (; DataLen > 0; DataLen -= 4)
Justin Bogner57ba0b22014-03-28 22:03:24 +00001017 DeclIDs.push_back(Reader.getGlobalDeclID(
1018 F, endian::readNext<uint32_t, little, unaligned>(d)));
Guy Benyei11169dd2012-12-18 14:30:41 +00001019 Reader.SetGloballyVisibleDecls(II, DeclIDs);
1020 }
1021
1022 return II;
1023}
1024
Richard Smitha06c7e62015-08-26 23:55:49 +00001025DeclarationNameKey::DeclarationNameKey(DeclarationName Name)
1026 : Kind(Name.getNameKind()) {
1027 switch (Kind) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001028 case DeclarationName::Identifier:
Richard Smitha06c7e62015-08-26 23:55:49 +00001029 Data = (uint64_t)Name.getAsIdentifierInfo();
Guy Benyei11169dd2012-12-18 14:30:41 +00001030 break;
1031 case DeclarationName::ObjCZeroArgSelector:
1032 case DeclarationName::ObjCOneArgSelector:
1033 case DeclarationName::ObjCMultiArgSelector:
Richard Smitha06c7e62015-08-26 23:55:49 +00001034 Data = (uint64_t)Name.getObjCSelector().getAsOpaquePtr();
Guy Benyei11169dd2012-12-18 14:30:41 +00001035 break;
1036 case DeclarationName::CXXOperatorName:
Richard Smitha06c7e62015-08-26 23:55:49 +00001037 Data = Name.getCXXOverloadedOperator();
1038 break;
1039 case DeclarationName::CXXLiteralOperatorName:
1040 Data = (uint64_t)Name.getCXXLiteralIdentifier();
1041 break;
Richard Smith35845152017-02-07 01:37:30 +00001042 case DeclarationName::CXXDeductionGuideName:
1043 Data = (uint64_t)Name.getCXXDeductionGuideTemplate()
1044 ->getDeclName().getAsIdentifierInfo();
1045 break;
Richard Smitha06c7e62015-08-26 23:55:49 +00001046 case DeclarationName::CXXConstructorName:
1047 case DeclarationName::CXXDestructorName:
1048 case DeclarationName::CXXConversionFunctionName:
1049 case DeclarationName::CXXUsingDirective:
1050 Data = 0;
1051 break;
1052 }
1053}
1054
1055unsigned DeclarationNameKey::getHash() const {
1056 llvm::FoldingSetNodeID ID;
1057 ID.AddInteger(Kind);
1058
1059 switch (Kind) {
1060 case DeclarationName::Identifier:
1061 case DeclarationName::CXXLiteralOperatorName:
Richard Smith35845152017-02-07 01:37:30 +00001062 case DeclarationName::CXXDeductionGuideName:
Richard Smitha06c7e62015-08-26 23:55:49 +00001063 ID.AddString(((IdentifierInfo*)Data)->getName());
1064 break;
1065 case DeclarationName::ObjCZeroArgSelector:
1066 case DeclarationName::ObjCOneArgSelector:
1067 case DeclarationName::ObjCMultiArgSelector:
1068 ID.AddInteger(serialization::ComputeHash(Selector(Data)));
1069 break;
1070 case DeclarationName::CXXOperatorName:
1071 ID.AddInteger((OverloadedOperatorKind)Data);
Guy Benyei11169dd2012-12-18 14:30:41 +00001072 break;
1073 case DeclarationName::CXXConstructorName:
1074 case DeclarationName::CXXDestructorName:
1075 case DeclarationName::CXXConversionFunctionName:
1076 case DeclarationName::CXXUsingDirective:
1077 break;
1078 }
1079
1080 return ID.ComputeHash();
1081}
1082
Richard Smithd88a7f12015-09-01 20:35:42 +00001083ModuleFile *
1084ASTDeclContextNameLookupTrait::ReadFileRef(const unsigned char *&d) {
1085 using namespace llvm::support;
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00001086
Richard Smithd88a7f12015-09-01 20:35:42 +00001087 uint32_t ModuleFileID = endian::readNext<uint32_t, little, unaligned>(d);
1088 return Reader.getLocalModuleFile(F, ModuleFileID);
1089}
1090
Guy Benyei11169dd2012-12-18 14:30:41 +00001091std::pair<unsigned, unsigned>
Richard Smitha06c7e62015-08-26 23:55:49 +00001092ASTDeclContextNameLookupTrait::ReadKeyDataLength(const unsigned char *&d) {
Justin Bogner57ba0b22014-03-28 22:03:24 +00001093 using namespace llvm::support;
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00001094
Justin Bogner57ba0b22014-03-28 22:03:24 +00001095 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
1096 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
Guy Benyei11169dd2012-12-18 14:30:41 +00001097 return std::make_pair(KeyLen, DataLen);
1098}
1099
Richard Smitha06c7e62015-08-26 23:55:49 +00001100ASTDeclContextNameLookupTrait::internal_key_type
1101ASTDeclContextNameLookupTrait::ReadKey(const unsigned char *d, unsigned) {
Justin Bogner57ba0b22014-03-28 22:03:24 +00001102 using namespace llvm::support;
Guy Benyei11169dd2012-12-18 14:30:41 +00001103
Vedant Kumar48b4f762018-04-14 01:40:48 +00001104 auto Kind = (DeclarationName::NameKind)*d++;
Richard Smitha06c7e62015-08-26 23:55:49 +00001105 uint64_t Data;
1106 switch (Kind) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001107 case DeclarationName::Identifier:
Richard Smith35845152017-02-07 01:37:30 +00001108 case DeclarationName::CXXLiteralOperatorName:
1109 case DeclarationName::CXXDeductionGuideName:
Richard Smitha06c7e62015-08-26 23:55:49 +00001110 Data = (uint64_t)Reader.getLocalIdentifier(
Justin Bogner57ba0b22014-03-28 22:03:24 +00001111 F, endian::readNext<uint32_t, little, unaligned>(d));
Guy Benyei11169dd2012-12-18 14:30:41 +00001112 break;
1113 case DeclarationName::ObjCZeroArgSelector:
1114 case DeclarationName::ObjCOneArgSelector:
1115 case DeclarationName::ObjCMultiArgSelector:
Richard Smitha06c7e62015-08-26 23:55:49 +00001116 Data =
Justin Bogner57ba0b22014-03-28 22:03:24 +00001117 (uint64_t)Reader.getLocalSelector(
1118 F, endian::readNext<uint32_t, little, unaligned>(
1119 d)).getAsOpaquePtr();
Guy Benyei11169dd2012-12-18 14:30:41 +00001120 break;
1121 case DeclarationName::CXXOperatorName:
Richard Smitha06c7e62015-08-26 23:55:49 +00001122 Data = *d++; // OverloadedOperatorKind
Guy Benyei11169dd2012-12-18 14:30:41 +00001123 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00001124 case DeclarationName::CXXConstructorName:
1125 case DeclarationName::CXXDestructorName:
1126 case DeclarationName::CXXConversionFunctionName:
1127 case DeclarationName::CXXUsingDirective:
Richard Smitha06c7e62015-08-26 23:55:49 +00001128 Data = 0;
Guy Benyei11169dd2012-12-18 14:30:41 +00001129 break;
1130 }
1131
Richard Smitha06c7e62015-08-26 23:55:49 +00001132 return DeclarationNameKey(Kind, Data);
Guy Benyei11169dd2012-12-18 14:30:41 +00001133}
1134
Richard Smithd88a7f12015-09-01 20:35:42 +00001135void ASTDeclContextNameLookupTrait::ReadDataInto(internal_key_type,
1136 const unsigned char *d,
1137 unsigned DataLen,
1138 data_type_builder &Val) {
Justin Bogner57ba0b22014-03-28 22:03:24 +00001139 using namespace llvm::support;
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00001140
Richard Smithd88a7f12015-09-01 20:35:42 +00001141 for (unsigned NumDecls = DataLen / 4; NumDecls; --NumDecls) {
1142 uint32_t LocalID = endian::readNext<uint32_t, little, unaligned>(d);
1143 Val.insert(Reader.getGlobalDeclID(F, LocalID));
1144 }
Guy Benyei11169dd2012-12-18 14:30:41 +00001145}
1146
Richard Smith0f4e2c42015-08-06 04:23:48 +00001147bool ASTReader::ReadLexicalDeclContextStorage(ModuleFile &M,
1148 BitstreamCursor &Cursor,
1149 uint64_t Offset,
1150 DeclContext *DC) {
1151 assert(Offset != 0);
1152
Guy Benyei11169dd2012-12-18 14:30:41 +00001153 SavedStreamPosition SavedPosition(Cursor);
JF Bastien0e828952019-06-26 19:50:12 +00001154 if (llvm::Error Err = Cursor.JumpToBit(Offset)) {
1155 Error(std::move(Err));
1156 return true;
1157 }
Guy Benyei11169dd2012-12-18 14:30:41 +00001158
Richard Smith0f4e2c42015-08-06 04:23:48 +00001159 RecordData Record;
1160 StringRef Blob;
JF Bastien0e828952019-06-26 19:50:12 +00001161 Expected<unsigned> MaybeCode = Cursor.ReadCode();
1162 if (!MaybeCode) {
1163 Error(MaybeCode.takeError());
1164 return true;
1165 }
1166 unsigned Code = MaybeCode.get();
1167
1168 Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record, &Blob);
1169 if (!MaybeRecCode) {
1170 Error(MaybeRecCode.takeError());
1171 return true;
1172 }
1173 unsigned RecCode = MaybeRecCode.get();
Richard Smith0f4e2c42015-08-06 04:23:48 +00001174 if (RecCode != DECL_CONTEXT_LEXICAL) {
1175 Error("Expected lexical block");
1176 return true;
Guy Benyei11169dd2012-12-18 14:30:41 +00001177 }
1178
Richard Smith82f8fcd2015-08-06 22:07:25 +00001179 assert(!isa<TranslationUnitDecl>(DC) &&
1180 "expected a TU_UPDATE_LEXICAL record for TU");
Richard Smith9c9173d2015-08-11 22:00:24 +00001181 // If we are handling a C++ class template instantiation, we can see multiple
1182 // lexical updates for the same record. It's important that we select only one
1183 // of them, so that field numbering works properly. Just pick the first one we
1184 // see.
1185 auto &Lex = LexicalDecls[DC];
1186 if (!Lex.first) {
1187 Lex = std::make_pair(
1188 &M, llvm::makeArrayRef(
1189 reinterpret_cast<const llvm::support::unaligned_uint32_t *>(
1190 Blob.data()),
1191 Blob.size() / 4));
1192 }
Richard Smith0f4e2c42015-08-06 04:23:48 +00001193 DC->setHasExternalLexicalStorage(true);
1194 return false;
1195}
Guy Benyei11169dd2012-12-18 14:30:41 +00001196
Richard Smith0f4e2c42015-08-06 04:23:48 +00001197bool ASTReader::ReadVisibleDeclContextStorage(ModuleFile &M,
1198 BitstreamCursor &Cursor,
1199 uint64_t Offset,
1200 DeclID ID) {
1201 assert(Offset != 0);
1202
1203 SavedStreamPosition SavedPosition(Cursor);
JF Bastien0e828952019-06-26 19:50:12 +00001204 if (llvm::Error Err = Cursor.JumpToBit(Offset)) {
1205 Error(std::move(Err));
1206 return true;
1207 }
Richard Smith0f4e2c42015-08-06 04:23:48 +00001208
1209 RecordData Record;
1210 StringRef Blob;
JF Bastien0e828952019-06-26 19:50:12 +00001211 Expected<unsigned> MaybeCode = Cursor.ReadCode();
1212 if (!MaybeCode) {
1213 Error(MaybeCode.takeError());
1214 return true;
1215 }
1216 unsigned Code = MaybeCode.get();
1217
1218 Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record, &Blob);
1219 if (!MaybeRecCode) {
1220 Error(MaybeRecCode.takeError());
1221 return true;
1222 }
1223 unsigned RecCode = MaybeRecCode.get();
Richard Smith0f4e2c42015-08-06 04:23:48 +00001224 if (RecCode != DECL_CONTEXT_VISIBLE) {
1225 Error("Expected visible lookup table block");
1226 return true;
Guy Benyei11169dd2012-12-18 14:30:41 +00001227 }
1228
Richard Smith0f4e2c42015-08-06 04:23:48 +00001229 // We can't safely determine the primary context yet, so delay attaching the
1230 // lookup table until we're done with recursive deserialization.
Richard Smithd88a7f12015-09-01 20:35:42 +00001231 auto *Data = (const unsigned char*)Blob.data();
1232 PendingVisibleUpdates[ID].push_back(PendingVisibleUpdate{&M, Data});
Guy Benyei11169dd2012-12-18 14:30:41 +00001233 return false;
1234}
1235
Richard Smith37a93df2017-02-18 00:32:02 +00001236void ASTReader::Error(StringRef Msg) const {
Guy Benyei11169dd2012-12-18 14:30:41 +00001237 Error(diag::err_fe_pch_malformed, Msg);
Richard Smithdbafb6c2017-06-29 23:23:46 +00001238 if (PP.getLangOpts().Modules && !Diags.isDiagnosticInFlight() &&
Richard Smithfb1e7f72015-08-14 05:02:58 +00001239 !PP.getHeaderSearchInfo().getModuleCachePath().empty()) {
Douglas Gregor940e8052013-05-10 22:15:13 +00001240 Diag(diag::note_module_cache_path)
1241 << PP.getHeaderSearchInfo().getModuleCachePath();
1242 }
Guy Benyei11169dd2012-12-18 14:30:41 +00001243}
1244
Duncan P. N. Exon Smitheef69022019-11-10 11:17:42 -08001245void ASTReader::Error(unsigned DiagID, StringRef Arg1, StringRef Arg2,
1246 StringRef Arg3) const {
Guy Benyei11169dd2012-12-18 14:30:41 +00001247 if (Diags.isDiagnosticInFlight())
Duncan P. N. Exon Smitheef69022019-11-10 11:17:42 -08001248 Diags.SetDelayedDiagnostic(DiagID, Arg1, Arg2, Arg3);
Guy Benyei11169dd2012-12-18 14:30:41 +00001249 else
Duncan P. N. Exon Smitheef69022019-11-10 11:17:42 -08001250 Diag(DiagID) << Arg1 << Arg2 << Arg3;
Guy Benyei11169dd2012-12-18 14:30:41 +00001251}
1252
Bruno Cardoso Lopes1731fc82019-10-15 14:23:55 +00001253void ASTReader::Error(unsigned DiagID, StringRef Arg1, StringRef Arg2,
1254 unsigned Select) const {
1255 if (!Diags.isDiagnosticInFlight())
1256 Diag(DiagID) << Arg1 << Arg2 << Select;
1257}
1258
JF Bastien0e828952019-06-26 19:50:12 +00001259void ASTReader::Error(llvm::Error &&Err) const {
1260 Error(toString(std::move(Err)));
1261}
1262
Guy Benyei11169dd2012-12-18 14:30:41 +00001263//===----------------------------------------------------------------------===//
1264// Source Manager Deserialization
1265//===----------------------------------------------------------------------===//
1266
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00001267/// Read the line table in the source manager block.
Guy Benyei11169dd2012-12-18 14:30:41 +00001268/// \returns true if there was an error.
1269bool ASTReader::ParseLineTable(ModuleFile &F,
Richard Smith7ed1bc92014-12-05 22:42:13 +00001270 const RecordData &Record) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001271 unsigned Idx = 0;
1272 LineTableInfo &LineTable = SourceMgr.getLineTable();
1273
1274 // Parse the file names
1275 std::map<int, int> FileIDs;
Hans Wennborg14487362017-12-04 22:28:45 +00001276 FileIDs[-1] = -1; // For unspecified filenames.
Richard Smith63078492015-09-01 07:41:55 +00001277 for (unsigned I = 0; Record[Idx]; ++I) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001278 // Extract the file name
Richard Smith7ed1bc92014-12-05 22:42:13 +00001279 auto Filename = ReadPath(F, Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00001280 FileIDs[I] = LineTable.getLineTableFilenameID(Filename);
1281 }
Richard Smith63078492015-09-01 07:41:55 +00001282 ++Idx;
Guy Benyei11169dd2012-12-18 14:30:41 +00001283
1284 // Parse the line entries
1285 std::vector<LineEntry> Entries;
1286 while (Idx < Record.size()) {
1287 int FID = Record[Idx++];
1288 assert(FID >= 0 && "Serialized line entries for non-local file.");
1289 // Remap FileID from 1-based old view.
1290 FID += F.SLocEntryBaseID - 1;
1291
1292 // Extract the line entries
1293 unsigned NumEntries = Record[Idx++];
Richard Smith63078492015-09-01 07:41:55 +00001294 assert(NumEntries && "no line entries for file ID");
Guy Benyei11169dd2012-12-18 14:30:41 +00001295 Entries.clear();
1296 Entries.reserve(NumEntries);
1297 for (unsigned I = 0; I != NumEntries; ++I) {
1298 unsigned FileOffset = Record[Idx++];
1299 unsigned LineNo = Record[Idx++];
1300 int FilenameID = FileIDs[Record[Idx++]];
Vedant Kumar48b4f762018-04-14 01:40:48 +00001301 SrcMgr::CharacteristicKind FileKind
1302 = (SrcMgr::CharacteristicKind)Record[Idx++];
Guy Benyei11169dd2012-12-18 14:30:41 +00001303 unsigned IncludeOffset = Record[Idx++];
1304 Entries.push_back(LineEntry::get(FileOffset, LineNo, FilenameID,
1305 FileKind, IncludeOffset));
1306 }
1307 LineTable.AddEntry(FileID::get(FID), Entries);
1308 }
1309
1310 return false;
1311}
1312
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00001313/// Read a source manager block
Guy Benyei11169dd2012-12-18 14:30:41 +00001314bool ASTReader::ReadSourceManagerBlock(ModuleFile &F) {
1315 using namespace SrcMgr;
1316
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001317 BitstreamCursor &SLocEntryCursor = F.SLocEntryCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00001318
1319 // Set the source-location entry cursor to the current position in
1320 // the stream. This cursor will be used to read the contents of the
1321 // source manager block initially, and then lazily read
1322 // source-location entries as needed.
1323 SLocEntryCursor = F.Stream;
1324
1325 // The stream itself is going to skip over the source manager block.
JF Bastien0e828952019-06-26 19:50:12 +00001326 if (llvm::Error Err = F.Stream.SkipBlock()) {
1327 Error(std::move(Err));
Guy Benyei11169dd2012-12-18 14:30:41 +00001328 return true;
1329 }
1330
1331 // Enter the source manager block.
JF Bastien0e828952019-06-26 19:50:12 +00001332 if (llvm::Error Err =
1333 SLocEntryCursor.EnterSubBlock(SOURCE_MANAGER_BLOCK_ID)) {
1334 Error(std::move(Err));
Guy Benyei11169dd2012-12-18 14:30:41 +00001335 return true;
1336 }
1337
1338 RecordData Record;
1339 while (true) {
JF Bastien0e828952019-06-26 19:50:12 +00001340 Expected<llvm::BitstreamEntry> MaybeE =
1341 SLocEntryCursor.advanceSkippingSubblocks();
1342 if (!MaybeE) {
1343 Error(MaybeE.takeError());
1344 return true;
1345 }
1346 llvm::BitstreamEntry E = MaybeE.get();
David L. Jonesc4808b9e2016-12-15 20:53:26 +00001347
Chris Lattnere7b154b2013-01-19 21:39:22 +00001348 switch (E.Kind) {
1349 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1350 case llvm::BitstreamEntry::Error:
1351 Error("malformed block record in AST file");
1352 return true;
1353 case llvm::BitstreamEntry::EndBlock:
Guy Benyei11169dd2012-12-18 14:30:41 +00001354 return false;
Chris Lattnere7b154b2013-01-19 21:39:22 +00001355 case llvm::BitstreamEntry::Record:
1356 // The interesting case.
1357 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00001358 }
David L. Jonesc4808b9e2016-12-15 20:53:26 +00001359
Guy Benyei11169dd2012-12-18 14:30:41 +00001360 // Read a record.
Guy Benyei11169dd2012-12-18 14:30:41 +00001361 Record.clear();
Chris Lattner15c3e7d2013-01-21 18:28:26 +00001362 StringRef Blob;
JF Bastien0e828952019-06-26 19:50:12 +00001363 Expected<unsigned> MaybeRecord =
1364 SLocEntryCursor.readRecord(E.ID, Record, &Blob);
1365 if (!MaybeRecord) {
1366 Error(MaybeRecord.takeError());
1367 return true;
1368 }
1369 switch (MaybeRecord.get()) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001370 default: // Default behavior: ignore.
1371 break;
1372
1373 case SM_SLOC_FILE_ENTRY:
1374 case SM_SLOC_BUFFER_ENTRY:
1375 case SM_SLOC_EXPANSION_ENTRY:
1376 // Once we hit one of the source location entries, we're done.
1377 return false;
1378 }
1379 }
1380}
1381
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00001382/// If a header file is not found at the path that we expect it to be
Guy Benyei11169dd2012-12-18 14:30:41 +00001383/// and the PCH file was moved from its original location, try to resolve the
1384/// file by assuming that header+PCH were moved together and the header is in
1385/// the same place relative to the PCH.
1386static std::string
1387resolveFileRelativeToOriginalDir(const std::string &Filename,
1388 const std::string &OriginalDir,
1389 const std::string &CurrDir) {
1390 assert(OriginalDir != CurrDir &&
1391 "No point trying to resolve the file if the PCH dir didn't change");
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00001392
Guy Benyei11169dd2012-12-18 14:30:41 +00001393 using namespace llvm::sys;
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00001394
Guy Benyei11169dd2012-12-18 14:30:41 +00001395 SmallString<128> filePath(Filename);
1396 fs::make_absolute(filePath);
1397 assert(path::is_absolute(OriginalDir));
1398 SmallString<128> currPCHPath(CurrDir);
1399
1400 path::const_iterator fileDirI = path::begin(path::parent_path(filePath)),
1401 fileDirE = path::end(path::parent_path(filePath));
1402 path::const_iterator origDirI = path::begin(OriginalDir),
1403 origDirE = path::end(OriginalDir);
1404 // Skip the common path components from filePath and OriginalDir.
1405 while (fileDirI != fileDirE && origDirI != origDirE &&
1406 *fileDirI == *origDirI) {
1407 ++fileDirI;
1408 ++origDirI;
1409 }
1410 for (; origDirI != origDirE; ++origDirI)
1411 path::append(currPCHPath, "..");
1412 path::append(currPCHPath, fileDirI, fileDirE);
1413 path::append(currPCHPath, path::filename(Filename));
Benjamin Krameradcd0262020-01-28 20:23:46 +01001414 return std::string(currPCHPath.str());
Guy Benyei11169dd2012-12-18 14:30:41 +00001415}
1416
1417bool ASTReader::ReadSLocEntry(int ID) {
1418 if (ID == 0)
1419 return false;
1420
1421 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1422 Error("source location entry ID out-of-range for AST file");
1423 return true;
1424 }
1425
Richard Smithaada85c2016-02-06 02:06:43 +00001426 // Local helper to read the (possibly-compressed) buffer data following the
1427 // entry record.
1428 auto ReadBuffer = [this](
1429 BitstreamCursor &SLocEntryCursor,
1430 StringRef Name) -> std::unique_ptr<llvm::MemoryBuffer> {
1431 RecordData Record;
1432 StringRef Blob;
JF Bastien0e828952019-06-26 19:50:12 +00001433 Expected<unsigned> MaybeCode = SLocEntryCursor.ReadCode();
1434 if (!MaybeCode) {
1435 Error(MaybeCode.takeError());
1436 return nullptr;
1437 }
1438 unsigned Code = MaybeCode.get();
1439
1440 Expected<unsigned> MaybeRecCode =
1441 SLocEntryCursor.readRecord(Code, Record, &Blob);
1442 if (!MaybeRecCode) {
1443 Error(MaybeRecCode.takeError());
1444 return nullptr;
1445 }
1446 unsigned RecCode = MaybeRecCode.get();
Richard Smithaada85c2016-02-06 02:06:43 +00001447
1448 if (RecCode == SM_SLOC_BUFFER_BLOB_COMPRESSED) {
George Rimarc39f5492017-01-17 15:45:31 +00001449 if (!llvm::zlib::isAvailable()) {
1450 Error("zlib is not available");
1451 return nullptr;
1452 }
Richard Smithaada85c2016-02-06 02:06:43 +00001453 SmallString<0> Uncompressed;
George Rimarc39f5492017-01-17 15:45:31 +00001454 if (llvm::Error E =
1455 llvm::zlib::uncompress(Blob, Uncompressed, Record[0])) {
1456 Error("could not decompress embedded file contents: " +
1457 llvm::toString(std::move(E)));
Richard Smithaada85c2016-02-06 02:06:43 +00001458 return nullptr;
1459 }
1460 return llvm::MemoryBuffer::getMemBufferCopy(Uncompressed, Name);
1461 } else if (RecCode == SM_SLOC_BUFFER_BLOB) {
1462 return llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name, true);
1463 } else {
1464 Error("AST record has invalid code");
1465 return nullptr;
1466 }
1467 };
1468
Guy Benyei11169dd2012-12-18 14:30:41 +00001469 ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second;
JF Bastien0e828952019-06-26 19:50:12 +00001470 if (llvm::Error Err = F->SLocEntryCursor.JumpToBit(
1471 F->SLocEntryOffsets[ID - F->SLocEntryBaseID])) {
1472 Error(std::move(Err));
1473 return true;
1474 }
1475
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001476 BitstreamCursor &SLocEntryCursor = F->SLocEntryCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00001477 unsigned BaseOffset = F->SLocEntryBaseOffset;
1478
1479 ++NumSLocEntriesRead;
JF Bastien0e828952019-06-26 19:50:12 +00001480 Expected<llvm::BitstreamEntry> MaybeEntry = SLocEntryCursor.advance();
1481 if (!MaybeEntry) {
1482 Error(MaybeEntry.takeError());
1483 return true;
1484 }
1485 llvm::BitstreamEntry Entry = MaybeEntry.get();
1486
Chris Lattnere7b154b2013-01-19 21:39:22 +00001487 if (Entry.Kind != llvm::BitstreamEntry::Record) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001488 Error("incorrectly-formatted source location entry in AST file");
1489 return true;
1490 }
David L. Jonesc4808b9e2016-12-15 20:53:26 +00001491
Guy Benyei11169dd2012-12-18 14:30:41 +00001492 RecordData Record;
Chris Lattner0e6c9402013-01-20 02:38:54 +00001493 StringRef Blob;
JF Bastien0e828952019-06-26 19:50:12 +00001494 Expected<unsigned> MaybeSLOC =
1495 SLocEntryCursor.readRecord(Entry.ID, Record, &Blob);
1496 if (!MaybeSLOC) {
1497 Error(MaybeSLOC.takeError());
1498 return true;
1499 }
1500 switch (MaybeSLOC.get()) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001501 default:
1502 Error("incorrectly-formatted source location entry in AST file");
1503 return true;
1504
1505 case SM_SLOC_FILE_ENTRY: {
1506 // We will detect whether a file changed and return 'Failure' for it, but
1507 // we will also try to fail gracefully by setting up the SLocEntry.
1508 unsigned InputID = Record[4];
1509 InputFile IF = getInputFile(*F, InputID);
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00001510 const FileEntry *File = IF.getFile();
1511 bool OverriddenBuffer = IF.isOverridden();
Guy Benyei11169dd2012-12-18 14:30:41 +00001512
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00001513 // Note that we only check if a File was returned. If it was out-of-date
1514 // we have complained but we will continue creating a FileID to recover
1515 // gracefully.
1516 if (!File)
Guy Benyei11169dd2012-12-18 14:30:41 +00001517 return true;
1518
1519 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
1520 if (IncludeLoc.isInvalid() && F->Kind != MK_MainFile) {
1521 // This is the module's main file.
1522 IncludeLoc = getImportLocation(F);
1523 }
Vedant Kumar48b4f762018-04-14 01:40:48 +00001524 SrcMgr::CharacteristicKind
1525 FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
Alex Lorenz4dc55732019-08-22 18:15:50 +00001526 // FIXME: The FileID should be created from the FileEntryRef.
Guy Benyei11169dd2012-12-18 14:30:41 +00001527 FileID FID = SourceMgr.createFileID(File, IncludeLoc, FileCharacter,
1528 ID, BaseOffset + Record[0]);
Vedant Kumar48b4f762018-04-14 01:40:48 +00001529 SrcMgr::FileInfo &FileInfo =
1530 const_cast<SrcMgr::FileInfo&>(SourceMgr.getSLocEntry(FID).getFile());
Guy Benyei11169dd2012-12-18 14:30:41 +00001531 FileInfo.NumCreatedFIDs = Record[5];
1532 if (Record[3])
1533 FileInfo.setHasLineDirectives();
1534
Guy Benyei11169dd2012-12-18 14:30:41 +00001535 unsigned NumFileDecls = Record[7];
Richard Smithdbafb6c2017-06-29 23:23:46 +00001536 if (NumFileDecls && ContextObj) {
Roman Lebedevbf4f1e02019-10-10 12:22:42 +00001537 const DeclID *FirstDecl = F->FileSortedDecls + Record[6];
Guy Benyei11169dd2012-12-18 14:30:41 +00001538 assert(F->FileSortedDecls && "FILE_SORTED_DECLS not encountered yet ?");
1539 FileDeclIDs[FID] = FileDeclsInfo(F, llvm::makeArrayRef(FirstDecl,
1540 NumFileDecls));
1541 }
Richard Smithaada85c2016-02-06 02:06:43 +00001542
Guy Benyei11169dd2012-12-18 14:30:41 +00001543 const SrcMgr::ContentCache *ContentCache
Richard Smithf3f84612017-06-29 02:19:42 +00001544 = SourceMgr.getOrCreateContentCache(File, isSystem(FileCharacter));
Guy Benyei11169dd2012-12-18 14:30:41 +00001545 if (OverriddenBuffer && !ContentCache->BufferOverridden &&
Richard Smitha8cfffa2015-11-26 02:04:16 +00001546 ContentCache->ContentsEntry == ContentCache->OrigEntry &&
1547 !ContentCache->getRawBuffer()) {
Richard Smithaada85c2016-02-06 02:06:43 +00001548 auto Buffer = ReadBuffer(SLocEntryCursor, File->getName());
1549 if (!Buffer)
Guy Benyei11169dd2012-12-18 14:30:41 +00001550 return true;
David Blaikie49cc3182014-08-27 20:54:45 +00001551 SourceMgr.overrideFileContents(File, std::move(Buffer));
Guy Benyei11169dd2012-12-18 14:30:41 +00001552 }
1553
1554 break;
1555 }
1556
1557 case SM_SLOC_BUFFER_ENTRY: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00001558 const char *Name = Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00001559 unsigned Offset = Record[0];
Vedant Kumar48b4f762018-04-14 01:40:48 +00001560 SrcMgr::CharacteristicKind
1561 FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
Guy Benyei11169dd2012-12-18 14:30:41 +00001562 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
Manman Ren11f2a472016-08-18 17:42:15 +00001563 if (IncludeLoc.isInvalid() && F->isModule()) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001564 IncludeLoc = getImportLocation(F);
1565 }
Guy Benyei11169dd2012-12-18 14:30:41 +00001566
Richard Smithaada85c2016-02-06 02:06:43 +00001567 auto Buffer = ReadBuffer(SLocEntryCursor, Name);
1568 if (!Buffer)
Guy Benyei11169dd2012-12-18 14:30:41 +00001569 return true;
David Blaikie50a5f972014-08-29 07:59:55 +00001570 SourceMgr.createFileID(std::move(Buffer), FileCharacter, ID,
Rafael Espindolad87f8d72014-08-27 20:03:29 +00001571 BaseOffset + Offset, IncludeLoc);
Guy Benyei11169dd2012-12-18 14:30:41 +00001572 break;
1573 }
1574
1575 case SM_SLOC_EXPANSION_ENTRY: {
1576 SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1]);
1577 SourceMgr.createExpansionLoc(SpellingLoc,
1578 ReadSourceLocation(*F, Record[2]),
1579 ReadSourceLocation(*F, Record[3]),
Richard Smithb5f81712018-04-30 05:25:48 +00001580 Record[5],
Guy Benyei11169dd2012-12-18 14:30:41 +00001581 Record[4],
1582 ID,
1583 BaseOffset + Record[0]);
1584 break;
1585 }
1586 }
1587
1588 return false;
1589}
1590
1591std::pair<SourceLocation, StringRef> ASTReader::getModuleImportLoc(int ID) {
1592 if (ID == 0)
1593 return std::make_pair(SourceLocation(), "");
1594
1595 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1596 Error("source location entry ID out-of-range for AST file");
1597 return std::make_pair(SourceLocation(), "");
1598 }
1599
1600 // Find which module file this entry lands in.
1601 ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second;
Manman Ren11f2a472016-08-18 17:42:15 +00001602 if (!M->isModule())
Guy Benyei11169dd2012-12-18 14:30:41 +00001603 return std::make_pair(SourceLocation(), "");
1604
1605 // FIXME: Can we map this down to a particular submodule? That would be
1606 // ideal.
Ben Langmuirbeee15e2014-04-14 18:00:01 +00001607 return std::make_pair(M->ImportLoc, StringRef(M->ModuleName));
Guy Benyei11169dd2012-12-18 14:30:41 +00001608}
1609
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00001610/// Find the location where the module F is imported.
Guy Benyei11169dd2012-12-18 14:30:41 +00001611SourceLocation ASTReader::getImportLocation(ModuleFile *F) {
1612 if (F->ImportLoc.isValid())
1613 return F->ImportLoc;
David L. Jonesc4808b9e2016-12-15 20:53:26 +00001614
Guy Benyei11169dd2012-12-18 14:30:41 +00001615 // Otherwise we have a PCH. It's considered to be "imported" at the first
1616 // location of its includer.
1617 if (F->ImportedBy.empty() || !F->ImportedBy[0]) {
Ben Langmuirbeee15e2014-04-14 18:00:01 +00001618 // Main file is the importer.
Yaron Keren8b563662015-10-03 10:46:20 +00001619 assert(SourceMgr.getMainFileID().isValid() && "missing main file");
Ben Langmuirbeee15e2014-04-14 18:00:01 +00001620 return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID());
Guy Benyei11169dd2012-12-18 14:30:41 +00001621 }
Guy Benyei11169dd2012-12-18 14:30:41 +00001622 return F->ImportedBy[0]->FirstLoc;
1623}
1624
JF Bastien0e828952019-06-26 19:50:12 +00001625/// Enter a subblock of the specified BlockID with the specified cursor. Read
1626/// the abbreviations that are at the top of the block and then leave the cursor
1627/// pointing into the block.
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001628bool ASTReader::ReadBlockAbbrevs(BitstreamCursor &Cursor, unsigned BlockID) {
JF Bastien0e828952019-06-26 19:50:12 +00001629 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) {
1630 // FIXME this drops errors on the floor.
1631 consumeError(std::move(Err));
Richard Smith0516b182015-09-08 19:40:14 +00001632 return true;
JF Bastien0e828952019-06-26 19:50:12 +00001633 }
Guy Benyei11169dd2012-12-18 14:30:41 +00001634
1635 while (true) {
1636 uint64_t Offset = Cursor.GetCurrentBitNo();
JF Bastien0e828952019-06-26 19:50:12 +00001637 Expected<unsigned> MaybeCode = Cursor.ReadCode();
1638 if (!MaybeCode) {
1639 // FIXME this drops errors on the floor.
1640 consumeError(MaybeCode.takeError());
1641 return true;
1642 }
1643 unsigned Code = MaybeCode.get();
Guy Benyei11169dd2012-12-18 14:30:41 +00001644
1645 // We expect all abbrevs to be at the start of the block.
1646 if (Code != llvm::bitc::DEFINE_ABBREV) {
JF Bastien0e828952019-06-26 19:50:12 +00001647 if (llvm::Error Err = Cursor.JumpToBit(Offset)) {
1648 // FIXME this drops errors on the floor.
1649 consumeError(std::move(Err));
1650 return true;
1651 }
Guy Benyei11169dd2012-12-18 14:30:41 +00001652 return false;
1653 }
JF Bastien0e828952019-06-26 19:50:12 +00001654 if (llvm::Error Err = Cursor.ReadAbbrevRecord()) {
1655 // FIXME this drops errors on the floor.
1656 consumeError(std::move(Err));
1657 return true;
1658 }
Guy Benyei11169dd2012-12-18 14:30:41 +00001659 }
1660}
1661
Richard Smithe40f2ba2013-08-07 21:41:30 +00001662Token ASTReader::ReadToken(ModuleFile &F, const RecordDataImpl &Record,
John McCallf413f5e2013-05-03 00:10:13 +00001663 unsigned &Idx) {
1664 Token Tok;
1665 Tok.startToken();
1666 Tok.setLocation(ReadSourceLocation(F, Record, Idx));
1667 Tok.setLength(Record[Idx++]);
1668 if (IdentifierInfo *II = getLocalIdentifier(F, Record[Idx++]))
1669 Tok.setIdentifierInfo(II);
1670 Tok.setKind((tok::TokenKind)Record[Idx++]);
1671 Tok.setFlag((Token::TokenFlags)Record[Idx++]);
1672 return Tok;
1673}
1674
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001675MacroInfo *ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001676 BitstreamCursor &Stream = F.MacroCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00001677
1678 // Keep track of where we are in the stream, then jump back there
1679 // after reading this macro.
1680 SavedStreamPosition SavedPosition(Stream);
1681
JF Bastien0e828952019-06-26 19:50:12 +00001682 if (llvm::Error Err = Stream.JumpToBit(Offset)) {
1683 // FIXME this drops errors on the floor.
1684 consumeError(std::move(Err));
1685 return nullptr;
1686 }
Guy Benyei11169dd2012-12-18 14:30:41 +00001687 RecordData Record;
Faisal Valiac506d72017-07-17 17:18:43 +00001688 SmallVector<IdentifierInfo*, 16> MacroParams;
Craig Toppera13603a2014-05-22 05:54:18 +00001689 MacroInfo *Macro = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00001690
Guy Benyei11169dd2012-12-18 14:30:41 +00001691 while (true) {
Chris Lattnerefa77172013-01-20 00:00:22 +00001692 // Advance to the next record, but if we get to the end of the block, don't
1693 // pop it (removing all the abbreviations from the cursor) since we want to
1694 // be able to reseek within the block and read entries.
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001695 unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd;
JF Bastien0e828952019-06-26 19:50:12 +00001696 Expected<llvm::BitstreamEntry> MaybeEntry =
1697 Stream.advanceSkippingSubblocks(Flags);
1698 if (!MaybeEntry) {
1699 Error(MaybeEntry.takeError());
1700 return Macro;
1701 }
1702 llvm::BitstreamEntry Entry = MaybeEntry.get();
David L. Jonesc4808b9e2016-12-15 20:53:26 +00001703
Chris Lattnerefa77172013-01-20 00:00:22 +00001704 switch (Entry.Kind) {
1705 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1706 case llvm::BitstreamEntry::Error:
1707 Error("malformed block record in AST file");
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001708 return Macro;
Chris Lattnerefa77172013-01-20 00:00:22 +00001709 case llvm::BitstreamEntry::EndBlock:
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001710 return Macro;
Chris Lattnerefa77172013-01-20 00:00:22 +00001711 case llvm::BitstreamEntry::Record:
1712 // The interesting case.
1713 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00001714 }
1715
1716 // Read a record.
Guy Benyei11169dd2012-12-18 14:30:41 +00001717 Record.clear();
JF Bastien0e828952019-06-26 19:50:12 +00001718 PreprocessorRecordTypes RecType;
1719 if (Expected<unsigned> MaybeRecType = Stream.readRecord(Entry.ID, Record))
1720 RecType = (PreprocessorRecordTypes)MaybeRecType.get();
1721 else {
1722 Error(MaybeRecType.takeError());
1723 return Macro;
1724 }
Guy Benyei11169dd2012-12-18 14:30:41 +00001725 switch (RecType) {
Richard Smithd7329392015-04-21 21:46:32 +00001726 case PP_MODULE_MACRO:
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001727 case PP_MACRO_DIRECTIVE_HISTORY:
1728 return Macro;
1729
Guy Benyei11169dd2012-12-18 14:30:41 +00001730 case PP_MACRO_OBJECT_LIKE:
1731 case PP_MACRO_FUNCTION_LIKE: {
1732 // If we already have a macro, that means that we've hit the end
1733 // of the definition of the macro we were looking for. We're
1734 // done.
1735 if (Macro)
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001736 return Macro;
Guy Benyei11169dd2012-12-18 14:30:41 +00001737
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001738 unsigned NextIndex = 1; // Skip identifier ID.
Guy Benyei11169dd2012-12-18 14:30:41 +00001739 SourceLocation Loc = ReadSourceLocation(F, Record, NextIndex);
Richard Smith3f6dd7a2017-05-12 23:40:52 +00001740 MacroInfo *MI = PP.AllocateMacroInfo(Loc);
Argyrios Kyrtzidis7572be22013-01-07 19:16:23 +00001741 MI->setDefinitionEndLoc(ReadSourceLocation(F, Record, NextIndex));
Guy Benyei11169dd2012-12-18 14:30:41 +00001742 MI->setIsUsed(Record[NextIndex++]);
Argyrios Kyrtzidis9ef53ce2014-04-09 18:21:23 +00001743 MI->setUsedForHeaderGuard(Record[NextIndex++]);
Guy Benyei11169dd2012-12-18 14:30:41 +00001744
Guy Benyei11169dd2012-12-18 14:30:41 +00001745 if (RecType == PP_MACRO_FUNCTION_LIKE) {
1746 // Decode function-like macro info.
1747 bool isC99VarArgs = Record[NextIndex++];
1748 bool isGNUVarArgs = Record[NextIndex++];
1749 bool hasCommaPasting = Record[NextIndex++];
Faisal Valiac506d72017-07-17 17:18:43 +00001750 MacroParams.clear();
Guy Benyei11169dd2012-12-18 14:30:41 +00001751 unsigned NumArgs = Record[NextIndex++];
1752 for (unsigned i = 0; i != NumArgs; ++i)
Faisal Valiac506d72017-07-17 17:18:43 +00001753 MacroParams.push_back(getLocalIdentifier(F, Record[NextIndex++]));
Guy Benyei11169dd2012-12-18 14:30:41 +00001754
1755 // Install function-like macro info.
1756 MI->setIsFunctionLike();
1757 if (isC99VarArgs) MI->setIsC99Varargs();
1758 if (isGNUVarArgs) MI->setIsGNUVarargs();
1759 if (hasCommaPasting) MI->setHasCommaPasting();
Faisal Valiac506d72017-07-17 17:18:43 +00001760 MI->setParameterList(MacroParams, PP.getPreprocessorAllocator());
Guy Benyei11169dd2012-12-18 14:30:41 +00001761 }
1762
Guy Benyei11169dd2012-12-18 14:30:41 +00001763 // Remember that we saw this macro last so that we add the tokens that
1764 // form its body to it.
1765 Macro = MI;
1766
1767 if (NextIndex + 1 == Record.size() && PP.getPreprocessingRecord() &&
1768 Record[NextIndex]) {
1769 // We have a macro definition. Register the association
1770 PreprocessedEntityID
1771 GlobalID = getGlobalPreprocessedEntityID(F, Record[NextIndex]);
1772 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
Richard Smith66a81862015-05-04 02:25:31 +00001773 PreprocessingRecord::PPEntityID PPID =
1774 PPRec.getPPEntityID(GlobalID - 1, /*isLoaded=*/true);
Vedant Kumar48b4f762018-04-14 01:40:48 +00001775 MacroDefinitionRecord *PPDef = cast_or_null<MacroDefinitionRecord>(
Richard Smith66a81862015-05-04 02:25:31 +00001776 PPRec.getPreprocessedEntity(PPID));
Argyrios Kyrtzidis832de9f2013-02-22 18:35:59 +00001777 if (PPDef)
1778 PPRec.RegisterMacroDefinition(Macro, PPDef);
Guy Benyei11169dd2012-12-18 14:30:41 +00001779 }
1780
1781 ++NumMacrosRead;
1782 break;
1783 }
1784
1785 case PP_TOKEN: {
1786 // If we see a TOKEN before a PP_MACRO_*, then the file is
1787 // erroneous, just pretend we didn't see this.
Craig Toppera13603a2014-05-22 05:54:18 +00001788 if (!Macro) break;
Guy Benyei11169dd2012-12-18 14:30:41 +00001789
John McCallf413f5e2013-05-03 00:10:13 +00001790 unsigned Idx = 0;
1791 Token Tok = ReadToken(F, Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00001792 Macro->AddTokenToBody(Tok);
1793 break;
1794 }
1795 }
1796 }
1797}
1798
David L. Jonesc4808b9e2016-12-15 20:53:26 +00001799PreprocessedEntityID
Richard Smith37a93df2017-02-18 00:32:02 +00001800ASTReader::getGlobalPreprocessedEntityID(ModuleFile &M,
1801 unsigned LocalID) const {
1802 if (!M.ModuleOffsetMap.empty())
1803 ReadModuleOffsetMap(M);
1804
David L. Jonesc4808b9e2016-12-15 20:53:26 +00001805 ContinuousRangeMap<uint32_t, int, 2>::const_iterator
Guy Benyei11169dd2012-12-18 14:30:41 +00001806 I = M.PreprocessedEntityRemap.find(LocalID - NUM_PREDEF_PP_ENTITY_IDS);
David L. Jonesc4808b9e2016-12-15 20:53:26 +00001807 assert(I != M.PreprocessedEntityRemap.end()
Guy Benyei11169dd2012-12-18 14:30:41 +00001808 && "Invalid index into preprocessed entity index remap");
David L. Jonesc4808b9e2016-12-15 20:53:26 +00001809
Guy Benyei11169dd2012-12-18 14:30:41 +00001810 return LocalID + I->second;
1811}
1812
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001813unsigned HeaderFileInfoTrait::ComputeHash(internal_key_ref ikey) {
1814 return llvm::hash_combine(ikey.Size, ikey.ModTime);
Guy Benyei11169dd2012-12-18 14:30:41 +00001815}
Richard Smith7ed1bc92014-12-05 22:42:13 +00001816
David L. Jonesc4808b9e2016-12-15 20:53:26 +00001817HeaderFileInfoTrait::internal_key_type
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001818HeaderFileInfoTrait::GetInternalKey(const FileEntry *FE) {
Richard Smithe75ee0f2015-08-17 07:13:32 +00001819 internal_key_type ikey = {FE->getSize(),
1820 M.HasTimestamps ? FE->getModificationTime() : 0,
1821 FE->getName(), /*Imported*/ false};
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001822 return ikey;
1823}
David L. Jonesc4808b9e2016-12-15 20:53:26 +00001824
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001825bool HeaderFileInfoTrait::EqualKey(internal_key_ref a, internal_key_ref b) {
Richard Smithe75ee0f2015-08-17 07:13:32 +00001826 if (a.Size != b.Size || (a.ModTime && b.ModTime && a.ModTime != b.ModTime))
Guy Benyei11169dd2012-12-18 14:30:41 +00001827 return false;
1828
Mehdi Amini004b9c72016-10-10 22:52:47 +00001829 if (llvm::sys::path::is_absolute(a.Filename) && a.Filename == b.Filename)
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001830 return true;
David L. Jonesc4808b9e2016-12-15 20:53:26 +00001831
Guy Benyei11169dd2012-12-18 14:30:41 +00001832 // Determine whether the actual files are equivalent.
Argyrios Kyrtzidis2a513e82013-03-04 20:33:40 +00001833 FileManager &FileMgr = Reader.getFileManager();
Richard Smith7ed1bc92014-12-05 22:42:13 +00001834 auto GetFile = [&](const internal_key_type &Key) -> const FileEntry* {
Harlan Haskins8d323d12019-08-01 21:31:56 +00001835 if (!Key.Imported) {
1836 if (auto File = FileMgr.getFile(Key.Filename))
1837 return *File;
1838 return nullptr;
1839 }
Richard Smith7ed1bc92014-12-05 22:42:13 +00001840
Benjamin Krameradcd0262020-01-28 20:23:46 +01001841 std::string Resolved = std::string(Key.Filename);
Richard Smith7ed1bc92014-12-05 22:42:13 +00001842 Reader.ResolveImportedPath(M, Resolved);
Harlan Haskins8d323d12019-08-01 21:31:56 +00001843 if (auto File = FileMgr.getFile(Resolved))
1844 return *File;
1845 return nullptr;
Richard Smith7ed1bc92014-12-05 22:42:13 +00001846 };
1847
1848 const FileEntry *FEA = GetFile(a);
1849 const FileEntry *FEB = GetFile(b);
1850 return FEA && FEA == FEB;
Guy Benyei11169dd2012-12-18 14:30:41 +00001851}
David L. Jonesc4808b9e2016-12-15 20:53:26 +00001852
Guy Benyei11169dd2012-12-18 14:30:41 +00001853std::pair<unsigned, unsigned>
1854HeaderFileInfoTrait::ReadKeyDataLength(const unsigned char*& d) {
Justin Bogner57ba0b22014-03-28 22:03:24 +00001855 using namespace llvm::support;
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00001856
Vedant Kumar48b4f762018-04-14 01:40:48 +00001857 unsigned KeyLen = (unsigned) endian::readNext<uint16_t, little, unaligned>(d);
1858 unsigned DataLen = (unsigned) *d++;
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001859 return std::make_pair(KeyLen, DataLen);
Guy Benyei11169dd2012-12-18 14:30:41 +00001860}
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001861
1862HeaderFileInfoTrait::internal_key_type
1863HeaderFileInfoTrait::ReadKey(const unsigned char *d, unsigned) {
Justin Bogner57ba0b22014-03-28 22:03:24 +00001864 using namespace llvm::support;
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00001865
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001866 internal_key_type ikey;
Justin Bogner57ba0b22014-03-28 22:03:24 +00001867 ikey.Size = off_t(endian::readNext<uint64_t, little, unaligned>(d));
1868 ikey.ModTime = time_t(endian::readNext<uint64_t, little, unaligned>(d));
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001869 ikey.Filename = (const char *)d;
Richard Smith7ed1bc92014-12-05 22:42:13 +00001870 ikey.Imported = true;
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001871 return ikey;
1872}
1873
David L. Jonesc4808b9e2016-12-15 20:53:26 +00001874HeaderFileInfoTrait::data_type
Argyrios Kyrtzidisb146baa2013-03-13 21:13:51 +00001875HeaderFileInfoTrait::ReadData(internal_key_ref key, const unsigned char *d,
Guy Benyei11169dd2012-12-18 14:30:41 +00001876 unsigned DataLen) {
Justin Bogner57ba0b22014-03-28 22:03:24 +00001877 using namespace llvm::support;
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00001878
1879 const unsigned char *End = d + DataLen;
Guy Benyei11169dd2012-12-18 14:30:41 +00001880 HeaderFileInfo HFI;
1881 unsigned Flags = *d++;
Richard Smith386bb072015-08-18 23:42:23 +00001882 // FIXME: Refactor with mergeHeaderFileInfo in HeaderSearch.cpp.
Richard Smithf3f84612017-06-29 02:19:42 +00001883 HFI.isImport |= (Flags >> 5) & 0x01;
1884 HFI.isPragmaOnce |= (Flags >> 4) & 0x01;
1885 HFI.DirInfo = (Flags >> 1) & 0x07;
Guy Benyei11169dd2012-12-18 14:30:41 +00001886 HFI.IndexHeaderMapHeader = Flags & 0x01;
Richard Smith386bb072015-08-18 23:42:23 +00001887 // FIXME: Find a better way to handle this. Maybe just store a
1888 // "has been included" flag?
1889 HFI.NumIncludes = std::max(endian::readNext<uint16_t, little, unaligned>(d),
1890 HFI.NumIncludes);
Justin Bogner57ba0b22014-03-28 22:03:24 +00001891 HFI.ControllingMacroID = Reader.getGlobalIdentifierID(
1892 M, endian::readNext<uint32_t, little, unaligned>(d));
1893 if (unsigned FrameworkOffset =
1894 endian::readNext<uint32_t, little, unaligned>(d)) {
David L. Jonesc4808b9e2016-12-15 20:53:26 +00001895 // The framework offset is 1 greater than the actual offset,
Guy Benyei11169dd2012-12-18 14:30:41 +00001896 // since 0 is used as an indicator for "no framework name".
1897 StringRef FrameworkName(FrameworkStrings + FrameworkOffset - 1);
1898 HFI.Framework = HS->getUniqueFrameworkName(FrameworkName);
1899 }
Richard Smith386bb072015-08-18 23:42:23 +00001900
1901 assert((End - d) % 4 == 0 &&
1902 "Wrong data length in HeaderFileInfo deserialization");
1903 while (d != End) {
Justin Bogner57ba0b22014-03-28 22:03:24 +00001904 uint32_t LocalSMID = endian::readNext<uint32_t, little, unaligned>(d);
Richard Smith386bb072015-08-18 23:42:23 +00001905 auto HeaderRole = static_cast<ModuleMap::ModuleHeaderRole>(LocalSMID & 3);
1906 LocalSMID >>= 2;
1907
1908 // This header is part of a module. Associate it with the module to enable
1909 // implicit module import.
1910 SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID);
1911 Module *Mod = Reader.getSubmodule(GlobalSMID);
1912 FileManager &FileMgr = Reader.getFileManager();
1913 ModuleMap &ModMap =
1914 Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap();
1915
Benjamin Krameradcd0262020-01-28 20:23:46 +01001916 std::string Filename = std::string(key.Filename);
Richard Smith386bb072015-08-18 23:42:23 +00001917 if (key.Imported)
1918 Reader.ResolveImportedPath(M, Filename);
1919 // FIXME: This is not always the right filename-as-written, but we're not
1920 // going to use this information to rebuild the module, so it doesn't make
1921 // a lot of difference.
Benjamin Krameradcd0262020-01-28 20:23:46 +01001922 Module::Header H = {std::string(key.Filename), *FileMgr.getFile(Filename)};
Richard Smithd8879c82015-08-24 21:59:32 +00001923 ModMap.addHeader(Mod, H, HeaderRole, /*Imported*/true);
1924 HFI.isModuleHeader |= !(HeaderRole & ModuleMap::TextualHeader);
Argyrios Kyrtzidisb146baa2013-03-13 21:13:51 +00001925 }
1926
Guy Benyei11169dd2012-12-18 14:30:41 +00001927 // This HeaderFileInfo was externally loaded.
1928 HFI.External = true;
Richard Smithd8879c82015-08-24 21:59:32 +00001929 HFI.IsValid = true;
Guy Benyei11169dd2012-12-18 14:30:41 +00001930 return HFI;
1931}
1932
Richard Smithd7329392015-04-21 21:46:32 +00001933void ASTReader::addPendingMacro(IdentifierInfo *II,
1934 ModuleFile *M,
1935 uint64_t MacroDirectivesOffset) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001936 assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard");
1937 PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset));
Guy Benyei11169dd2012-12-18 14:30:41 +00001938}
1939
1940void ASTReader::ReadDefinedMacros() {
1941 // Note that we are loading defined macros.
1942 Deserializing Macros(this);
1943
Vedant Kumar48b4f762018-04-14 01:40:48 +00001944 for (ModuleFile &I : llvm::reverse(ModuleMgr)) {
Duncan P. N. Exon Smith96a06e02017-01-28 22:15:22 +00001945 BitstreamCursor &MacroCursor = I.MacroCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00001946
1947 // If there was no preprocessor block, skip this file.
Peter Collingbourne77c89b62016-11-08 04:17:11 +00001948 if (MacroCursor.getBitcodeBytes().empty())
Guy Benyei11169dd2012-12-18 14:30:41 +00001949 continue;
1950
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001951 BitstreamCursor Cursor = MacroCursor;
JF Bastien0e828952019-06-26 19:50:12 +00001952 if (llvm::Error Err = Cursor.JumpToBit(I.MacroStartOffset)) {
1953 Error(std::move(Err));
1954 return;
1955 }
Guy Benyei11169dd2012-12-18 14:30:41 +00001956
1957 RecordData Record;
1958 while (true) {
JF Bastien0e828952019-06-26 19:50:12 +00001959 Expected<llvm::BitstreamEntry> MaybeE = Cursor.advanceSkippingSubblocks();
1960 if (!MaybeE) {
1961 Error(MaybeE.takeError());
1962 return;
1963 }
1964 llvm::BitstreamEntry E = MaybeE.get();
David L. Jonesc4808b9e2016-12-15 20:53:26 +00001965
Chris Lattnere7b154b2013-01-19 21:39:22 +00001966 switch (E.Kind) {
1967 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1968 case llvm::BitstreamEntry::Error:
1969 Error("malformed block record in AST file");
1970 return;
1971 case llvm::BitstreamEntry::EndBlock:
1972 goto NextCursor;
David L. Jonesc4808b9e2016-12-15 20:53:26 +00001973
JF Bastien0e828952019-06-26 19:50:12 +00001974 case llvm::BitstreamEntry::Record: {
Chris Lattnere7b154b2013-01-19 21:39:22 +00001975 Record.clear();
JF Bastien0e828952019-06-26 19:50:12 +00001976 Expected<unsigned> MaybeRecord = Cursor.readRecord(E.ID, Record);
1977 if (!MaybeRecord) {
1978 Error(MaybeRecord.takeError());
1979 return;
1980 }
1981 switch (MaybeRecord.get()) {
Chris Lattnere7b154b2013-01-19 21:39:22 +00001982 default: // Default behavior: ignore.
1983 break;
David L. Jonesc4808b9e2016-12-15 20:53:26 +00001984
Chris Lattnere7b154b2013-01-19 21:39:22 +00001985 case PP_MACRO_OBJECT_LIKE:
Sean Callananf3682a72016-05-14 06:24:14 +00001986 case PP_MACRO_FUNCTION_LIKE: {
Duncan P. N. Exon Smith96a06e02017-01-28 22:15:22 +00001987 IdentifierInfo *II = getLocalIdentifier(I, Record[0]);
Sean Callananf3682a72016-05-14 06:24:14 +00001988 if (II->isOutOfDate())
1989 updateOutOfDateIdentifier(*II);
Chris Lattnere7b154b2013-01-19 21:39:22 +00001990 break;
Sean Callananf3682a72016-05-14 06:24:14 +00001991 }
David L. Jonesc4808b9e2016-12-15 20:53:26 +00001992
Chris Lattnere7b154b2013-01-19 21:39:22 +00001993 case PP_TOKEN:
1994 // Ignore tokens.
1995 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00001996 }
Guy Benyei11169dd2012-12-18 14:30:41 +00001997 break;
1998 }
JF Bastien0e828952019-06-26 19:50:12 +00001999 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002000 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00002001 NextCursor: ;
Guy Benyei11169dd2012-12-18 14:30:41 +00002002 }
2003}
2004
2005namespace {
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00002006
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00002007 /// Visitor class used to look up identifirs in an AST file.
Guy Benyei11169dd2012-12-18 14:30:41 +00002008 class IdentifierLookupVisitor {
2009 StringRef Name;
Richard Smith3b637412015-07-14 18:42:41 +00002010 unsigned NameHash;
Guy Benyei11169dd2012-12-18 14:30:41 +00002011 unsigned PriorGeneration;
Douglas Gregor00a50f72013-01-25 00:38:33 +00002012 unsigned &NumIdentifierLookups;
2013 unsigned &NumIdentifierLookupHits;
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00002014 IdentifierInfo *Found = nullptr;
Douglas Gregor00a50f72013-01-25 00:38:33 +00002015
Guy Benyei11169dd2012-12-18 14:30:41 +00002016 public:
Douglas Gregor00a50f72013-01-25 00:38:33 +00002017 IdentifierLookupVisitor(StringRef Name, unsigned PriorGeneration,
2018 unsigned &NumIdentifierLookups,
2019 unsigned &NumIdentifierLookupHits)
Richard Smith3b637412015-07-14 18:42:41 +00002020 : Name(Name), NameHash(ASTIdentifierLookupTrait::ComputeHash(Name)),
2021 PriorGeneration(PriorGeneration),
Douglas Gregor00a50f72013-01-25 00:38:33 +00002022 NumIdentifierLookups(NumIdentifierLookups),
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00002023 NumIdentifierLookupHits(NumIdentifierLookupHits) {}
Benjamin Kramer9a9efba2015-07-25 12:14:04 +00002024
2025 bool operator()(ModuleFile &M) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002026 // If we've already searched this module file, skip it now.
Richard Smithbdf2d932015-07-30 03:37:16 +00002027 if (M.Generation <= PriorGeneration)
Guy Benyei11169dd2012-12-18 14:30:41 +00002028 return true;
Douglas Gregore060e572013-01-25 01:03:03 +00002029
Vedant Kumar48b4f762018-04-14 01:40:48 +00002030 ASTIdentifierLookupTable *IdTable
2031 = (ASTIdentifierLookupTable *)M.IdentifierLookupTable;
Guy Benyei11169dd2012-12-18 14:30:41 +00002032 if (!IdTable)
2033 return false;
Benjamin Kramer9a9efba2015-07-25 12:14:04 +00002034
2035 ASTIdentifierLookupTrait Trait(IdTable->getInfoObj().getReader(), M,
Richard Smithbdf2d932015-07-30 03:37:16 +00002036 Found);
2037 ++NumIdentifierLookups;
Richard Smith3b637412015-07-14 18:42:41 +00002038 ASTIdentifierLookupTable::iterator Pos =
Richard Smithbdf2d932015-07-30 03:37:16 +00002039 IdTable->find_hashed(Name, NameHash, &Trait);
Guy Benyei11169dd2012-12-18 14:30:41 +00002040 if (Pos == IdTable->end())
2041 return false;
David L. Jonesc4808b9e2016-12-15 20:53:26 +00002042
Guy Benyei11169dd2012-12-18 14:30:41 +00002043 // Dereferencing the iterator has the effect of building the
2044 // IdentifierInfo node and populating it with the various
2045 // declarations it needs.
Richard Smithbdf2d932015-07-30 03:37:16 +00002046 ++NumIdentifierLookupHits;
2047 Found = *Pos;
Guy Benyei11169dd2012-12-18 14:30:41 +00002048 return true;
2049 }
David L. Jonesc4808b9e2016-12-15 20:53:26 +00002050
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00002051 // Retrieve the identifier info found within the module
Guy Benyei11169dd2012-12-18 14:30:41 +00002052 // files.
2053 IdentifierInfo *getIdentifierInfo() const { return Found; }
2054 };
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00002055
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00002056} // namespace
Guy Benyei11169dd2012-12-18 14:30:41 +00002057
2058void ASTReader::updateOutOfDateIdentifier(IdentifierInfo &II) {
2059 // Note that we are loading an identifier.
2060 Deserializing AnIdentifier(this);
2061
2062 unsigned PriorGeneration = 0;
2063 if (getContext().getLangOpts().Modules)
2064 PriorGeneration = IdentifierGeneration[&II];
Douglas Gregore060e572013-01-25 01:03:03 +00002065
2066 // If there is a global index, look there first to determine which modules
2067 // provably do not have any results for this identifier.
Douglas Gregor7211ac12013-01-25 23:32:03 +00002068 GlobalModuleIndex::HitSet Hits;
Craig Toppera13603a2014-05-22 05:54:18 +00002069 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
Douglas Gregore060e572013-01-25 01:03:03 +00002070 if (!loadGlobalIndex()) {
Douglas Gregor7211ac12013-01-25 23:32:03 +00002071 if (GlobalIndex->lookupIdentifier(II.getName(), Hits)) {
2072 HitsPtr = &Hits;
Douglas Gregore060e572013-01-25 01:03:03 +00002073 }
2074 }
2075
Douglas Gregor7211ac12013-01-25 23:32:03 +00002076 IdentifierLookupVisitor Visitor(II.getName(), PriorGeneration,
Douglas Gregor00a50f72013-01-25 00:38:33 +00002077 NumIdentifierLookups,
2078 NumIdentifierLookupHits);
Benjamin Kramer9a9efba2015-07-25 12:14:04 +00002079 ModuleMgr.visit(Visitor, HitsPtr);
Guy Benyei11169dd2012-12-18 14:30:41 +00002080 markIdentifierUpToDate(&II);
2081}
2082
2083void ASTReader::markIdentifierUpToDate(IdentifierInfo *II) {
2084 if (!II)
2085 return;
David L. Jonesc4808b9e2016-12-15 20:53:26 +00002086
Guy Benyei11169dd2012-12-18 14:30:41 +00002087 II->setOutOfDate(false);
2088
2089 // Update the generation for this identifier.
2090 if (getContext().getLangOpts().Modules)
Richard Smith053f6c62014-05-16 23:01:30 +00002091 IdentifierGeneration[II] = getGeneration();
Guy Benyei11169dd2012-12-18 14:30:41 +00002092}
2093
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00002094void ASTReader::resolvePendingMacro(IdentifierInfo *II,
2095 const PendingMacroInfo &PMInfo) {
Richard Smithd7329392015-04-21 21:46:32 +00002096 ModuleFile &M = *PMInfo.M;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00002097
2098 BitstreamCursor &Cursor = M.MacroCursor;
2099 SavedStreamPosition SavedPosition(Cursor);
JF Bastien0e828952019-06-26 19:50:12 +00002100 if (llvm::Error Err = Cursor.JumpToBit(PMInfo.MacroDirectivesOffset)) {
2101 Error(std::move(Err));
2102 return;
2103 }
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00002104
Richard Smith713369b2015-04-23 20:40:50 +00002105 struct ModuleMacroRecord {
2106 SubmoduleID SubModID;
2107 MacroInfo *MI;
2108 SmallVector<SubmoduleID, 8> Overrides;
2109 };
2110 llvm::SmallVector<ModuleMacroRecord, 8> ModuleMacros;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00002111
Richard Smithd7329392015-04-21 21:46:32 +00002112 // We expect to see a sequence of PP_MODULE_MACRO records listing exported
2113 // macros, followed by a PP_MACRO_DIRECTIVE_HISTORY record with the complete
2114 // macro histroy.
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00002115 RecordData Record;
Richard Smithd7329392015-04-21 21:46:32 +00002116 while (true) {
JF Bastien0e828952019-06-26 19:50:12 +00002117 Expected<llvm::BitstreamEntry> MaybeEntry =
Richard Smithd7329392015-04-21 21:46:32 +00002118 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
JF Bastien0e828952019-06-26 19:50:12 +00002119 if (!MaybeEntry) {
2120 Error(MaybeEntry.takeError());
2121 return;
2122 }
2123 llvm::BitstreamEntry Entry = MaybeEntry.get();
2124
Richard Smithd7329392015-04-21 21:46:32 +00002125 if (Entry.Kind != llvm::BitstreamEntry::Record) {
2126 Error("malformed block record in AST file");
2127 return;
2128 }
2129
2130 Record.clear();
JF Bastien0e828952019-06-26 19:50:12 +00002131 Expected<unsigned> MaybePP = Cursor.readRecord(Entry.ID, Record);
2132 if (!MaybePP) {
2133 Error(MaybePP.takeError());
2134 return;
2135 }
2136 switch ((PreprocessorRecordTypes)MaybePP.get()) {
Richard Smithd7329392015-04-21 21:46:32 +00002137 case PP_MACRO_DIRECTIVE_HISTORY:
2138 break;
2139
2140 case PP_MODULE_MACRO: {
Richard Smith713369b2015-04-23 20:40:50 +00002141 ModuleMacros.push_back(ModuleMacroRecord());
2142 auto &Info = ModuleMacros.back();
Richard Smithe56c8bc2015-04-22 00:26:11 +00002143 Info.SubModID = getGlobalSubmoduleID(M, Record[0]);
2144 Info.MI = getMacro(getGlobalMacroID(M, Record[1]));
Richard Smith713369b2015-04-23 20:40:50 +00002145 for (int I = 2, N = Record.size(); I != N; ++I)
2146 Info.Overrides.push_back(getGlobalSubmoduleID(M, Record[I]));
Richard Smithd7329392015-04-21 21:46:32 +00002147 continue;
2148 }
2149
2150 default:
2151 Error("malformed block record in AST file");
2152 return;
2153 }
2154
2155 // We found the macro directive history; that's the last record
2156 // for this macro.
2157 break;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00002158 }
2159
Richard Smithd7329392015-04-21 21:46:32 +00002160 // Module macros are listed in reverse dependency order.
Richard Smithe56c8bc2015-04-22 00:26:11 +00002161 {
2162 std::reverse(ModuleMacros.begin(), ModuleMacros.end());
Richard Smithe56c8bc2015-04-22 00:26:11 +00002163 llvm::SmallVector<ModuleMacro*, 8> Overrides;
Richard Smith713369b2015-04-23 20:40:50 +00002164 for (auto &MMR : ModuleMacros) {
Richard Smithe56c8bc2015-04-22 00:26:11 +00002165 Overrides.clear();
Vedant Kumar48b4f762018-04-14 01:40:48 +00002166 for (unsigned ModID : MMR.Overrides) {
Richard Smithb8b2ed62015-04-23 18:18:26 +00002167 Module *Mod = getSubmodule(ModID);
2168 auto *Macro = PP.getModuleMacro(Mod, II);
Richard Smithe56c8bc2015-04-22 00:26:11 +00002169 assert(Macro && "missing definition for overridden macro");
Richard Smith5dbef922015-04-22 02:09:43 +00002170 Overrides.push_back(Macro);
Richard Smithe56c8bc2015-04-22 00:26:11 +00002171 }
2172
2173 bool Inserted = false;
Richard Smith713369b2015-04-23 20:40:50 +00002174 Module *Owner = getSubmodule(MMR.SubModID);
Richard Smith20e883e2015-04-29 23:20:19 +00002175 PP.addModuleMacro(Owner, II, MMR.MI, Overrides, Inserted);
Richard Smithd7329392015-04-21 21:46:32 +00002176 }
2177 }
2178
2179 // Don't read the directive history for a module; we don't have anywhere
2180 // to put it.
Manman Ren11f2a472016-08-18 17:42:15 +00002181 if (M.isModule())
Richard Smithd7329392015-04-21 21:46:32 +00002182 return;
2183
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00002184 // Deserialize the macro directives history in reverse source-order.
Craig Toppera13603a2014-05-22 05:54:18 +00002185 MacroDirective *Latest = nullptr, *Earliest = nullptr;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00002186 unsigned Idx = 0, N = Record.size();
2187 while (Idx < N) {
Craig Toppera13603a2014-05-22 05:54:18 +00002188 MacroDirective *MD = nullptr;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00002189 SourceLocation Loc = ReadSourceLocation(M, Record, Idx);
Vedant Kumar48b4f762018-04-14 01:40:48 +00002190 MacroDirective::Kind K = (MacroDirective::Kind)Record[Idx++];
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00002191 switch (K) {
2192 case MacroDirective::MD_Define: {
Richard Smith713369b2015-04-23 20:40:50 +00002193 MacroInfo *MI = getMacro(getGlobalMacroID(M, Record[Idx++]));
Richard Smith3981b172015-04-30 02:16:23 +00002194 MD = PP.AllocateDefMacroDirective(MI, Loc);
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00002195 break;
2196 }
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00002197 case MacroDirective::MD_Undefine:
Richard Smith3981b172015-04-30 02:16:23 +00002198 MD = PP.AllocateUndefMacroDirective(Loc);
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00002199 break;
Richard Smithdaa69e02014-07-25 04:40:03 +00002200 case MacroDirective::MD_Visibility:
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00002201 bool isPublic = Record[Idx++];
2202 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic);
2203 break;
2204 }
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00002205
2206 if (!Latest)
2207 Latest = MD;
2208 if (Earliest)
2209 Earliest->setPrevious(MD);
2210 Earliest = MD;
2211 }
2212
Richard Smithd6e8c0d2015-05-04 19:58:00 +00002213 if (Latest)
Nico Weberfd870702016-12-09 17:32:52 +00002214 PP.setLoadedMacroDirective(II, Earliest, Latest);
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00002215}
2216
Argyrios Kyrtzidisce9b49e2014-03-14 02:26:27 +00002217ASTReader::InputFileInfo
2218ASTReader::readInputFileInfo(ModuleFile &F, unsigned ID) {
Ben Langmuir198c1682014-03-07 07:27:49 +00002219 // Go find this input file.
2220 BitstreamCursor &Cursor = F.InputFilesCursor;
2221 SavedStreamPosition SavedPosition(Cursor);
JF Bastien0e828952019-06-26 19:50:12 +00002222 if (llvm::Error Err = Cursor.JumpToBit(F.InputFileOffsets[ID - 1])) {
2223 // FIXME this drops errors on the floor.
2224 consumeError(std::move(Err));
2225 }
Ben Langmuir198c1682014-03-07 07:27:49 +00002226
JF Bastien0e828952019-06-26 19:50:12 +00002227 Expected<unsigned> MaybeCode = Cursor.ReadCode();
2228 if (!MaybeCode) {
2229 // FIXME this drops errors on the floor.
2230 consumeError(MaybeCode.takeError());
2231 }
2232 unsigned Code = MaybeCode.get();
Ben Langmuir198c1682014-03-07 07:27:49 +00002233 RecordData Record;
2234 StringRef Blob;
2235
JF Bastien0e828952019-06-26 19:50:12 +00002236 if (Expected<unsigned> Maybe = Cursor.readRecord(Code, Record, &Blob))
2237 assert(static_cast<InputFileRecordTypes>(Maybe.get()) == INPUT_FILE &&
2238 "invalid record type for input file");
2239 else {
2240 // FIXME this drops errors on the floor.
2241 consumeError(Maybe.takeError());
2242 }
Ben Langmuir198c1682014-03-07 07:27:49 +00002243
2244 assert(Record[0] == ID && "Bogus stored ID or offset");
Richard Smitha8cfffa2015-11-26 02:04:16 +00002245 InputFileInfo R;
2246 R.StoredSize = static_cast<off_t>(Record[1]);
2247 R.StoredTime = static_cast<time_t>(Record[2]);
2248 R.Overridden = static_cast<bool>(Record[3]);
2249 R.Transient = static_cast<bool>(Record[4]);
Richard Smithf3f84612017-06-29 02:19:42 +00002250 R.TopLevelModuleMap = static_cast<bool>(Record[5]);
Benjamin Krameradcd0262020-01-28 20:23:46 +01002251 R.Filename = std::string(Blob);
Richard Smitha8cfffa2015-11-26 02:04:16 +00002252 ResolveImportedPath(F, R.Filename);
Bruno Cardoso Lopes1731fc82019-10-15 14:23:55 +00002253
2254 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance();
2255 if (!MaybeEntry) // FIXME this drops errors on the floor.
2256 consumeError(MaybeEntry.takeError());
2257 llvm::BitstreamEntry Entry = MaybeEntry.get();
2258 assert(Entry.Kind == llvm::BitstreamEntry::Record &&
2259 "expected record type for input file hash");
2260
2261 Record.clear();
2262 if (Expected<unsigned> Maybe = Cursor.readRecord(Entry.ID, Record))
2263 assert(static_cast<InputFileRecordTypes>(Maybe.get()) == INPUT_FILE_HASH &&
2264 "invalid record type for input file hash");
2265 else {
2266 // FIXME this drops errors on the floor.
2267 consumeError(Maybe.takeError());
2268 }
2269 R.ContentHash = (static_cast<uint64_t>(Record[1]) << 32) |
2270 static_cast<uint64_t>(Record[0]);
Hans Wennborg73945142014-03-14 17:45:06 +00002271 return R;
Ben Langmuir198c1682014-03-07 07:27:49 +00002272}
2273
Manman Renc8c94152016-10-21 23:35:03 +00002274static unsigned moduleKindForDiagnostic(ModuleKind Kind);
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00002275InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002276 // If this ID is bogus, just return an empty input file.
2277 if (ID == 0 || ID > F.InputFilesLoaded.size())
2278 return InputFile();
2279
2280 // If we've already loaded this input file, return it.
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00002281 if (F.InputFilesLoaded[ID-1].getFile())
Guy Benyei11169dd2012-12-18 14:30:41 +00002282 return F.InputFilesLoaded[ID-1];
2283
Argyrios Kyrtzidis9308f0a2014-01-08 19:13:34 +00002284 if (F.InputFilesLoaded[ID-1].isNotFound())
2285 return InputFile();
2286
Guy Benyei11169dd2012-12-18 14:30:41 +00002287 // Go find this input file.
Chris Lattner7fb3bef2013-01-20 00:56:42 +00002288 BitstreamCursor &Cursor = F.InputFilesCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00002289 SavedStreamPosition SavedPosition(Cursor);
JF Bastien0e828952019-06-26 19:50:12 +00002290 if (llvm::Error Err = Cursor.JumpToBit(F.InputFileOffsets[ID - 1])) {
2291 // FIXME this drops errors on the floor.
2292 consumeError(std::move(Err));
2293 }
David L. Jonesc4808b9e2016-12-15 20:53:26 +00002294
Argyrios Kyrtzidisce9b49e2014-03-14 02:26:27 +00002295 InputFileInfo FI = readInputFileInfo(F, ID);
2296 off_t StoredSize = FI.StoredSize;
2297 time_t StoredTime = FI.StoredTime;
2298 bool Overridden = FI.Overridden;
Richard Smitha8cfffa2015-11-26 02:04:16 +00002299 bool Transient = FI.Transient;
Argyrios Kyrtzidisce9b49e2014-03-14 02:26:27 +00002300 StringRef Filename = FI.Filename;
Bruno Cardoso Lopes1731fc82019-10-15 14:23:55 +00002301 uint64_t StoredContentHash = FI.ContentHash;
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00002302
Harlan Haskins8d323d12019-08-01 21:31:56 +00002303 const FileEntry *File = nullptr;
2304 if (auto FE = FileMgr.getFile(Filename, /*OpenFile=*/false))
2305 File = *FE;
2306
Ben Langmuir198c1682014-03-07 07:27:49 +00002307 // If we didn't find the file, resolve it relative to the
2308 // original directory from which this AST file was created.
Manuel Klimek1b29b4f2017-07-25 10:22:06 +00002309 if (File == nullptr && !F.OriginalDir.empty() && !F.BaseDirectory.empty() &&
2310 F.OriginalDir != F.BaseDirectory) {
2311 std::string Resolved = resolveFileRelativeToOriginalDir(
Benjamin Krameradcd0262020-01-28 20:23:46 +01002312 std::string(Filename), F.OriginalDir, F.BaseDirectory);
Ben Langmuir198c1682014-03-07 07:27:49 +00002313 if (!Resolved.empty())
Harlan Haskins8d323d12019-08-01 21:31:56 +00002314 if (auto FE = FileMgr.getFile(Resolved))
2315 File = *FE;
Ben Langmuir198c1682014-03-07 07:27:49 +00002316 }
2317
2318 // For an overridden file, create a virtual file with the stored
2319 // size/timestamp.
Richard Smitha8cfffa2015-11-26 02:04:16 +00002320 if ((Overridden || Transient) && File == nullptr)
Ben Langmuir198c1682014-03-07 07:27:49 +00002321 File = FileMgr.getVirtualFile(Filename, StoredSize, StoredTime);
Ben Langmuir198c1682014-03-07 07:27:49 +00002322
Craig Toppera13603a2014-05-22 05:54:18 +00002323 if (File == nullptr) {
Ben Langmuir198c1682014-03-07 07:27:49 +00002324 if (Complain) {
2325 std::string ErrorStr = "could not find file '";
2326 ErrorStr += Filename;
Richard Smith68142212015-10-13 01:26:26 +00002327 ErrorStr += "' referenced by AST file '";
2328 ErrorStr += F.FileName;
2329 ErrorStr += "'";
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00002330 Error(ErrorStr);
Guy Benyei11169dd2012-12-18 14:30:41 +00002331 }
Ben Langmuir198c1682014-03-07 07:27:49 +00002332 // Record that we didn't find the file.
2333 F.InputFilesLoaded[ID-1] = InputFile::getNotFound();
2334 return InputFile();
2335 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002336
Ben Langmuir198c1682014-03-07 07:27:49 +00002337 // Check if there was a request to override the contents of the file
Alexander Kornienko2a8c18d2018-04-06 15:14:32 +00002338 // that was part of the precompiled header. Overriding such a file
Ben Langmuir198c1682014-03-07 07:27:49 +00002339 // can lead to problems when lexing using the source locations from the
2340 // PCH.
2341 SourceManager &SM = getSourceManager();
Richard Smith64daf7b2015-12-01 03:32:49 +00002342 // FIXME: Reject if the overrides are different.
2343 if ((!Overridden && !Transient) && SM.isFileOverridden(File)) {
Ben Langmuir198c1682014-03-07 07:27:49 +00002344 if (Complain)
2345 Error(diag::err_fe_pch_file_overridden, Filename);
Duncan P. N. Exon Smithe1b7f222019-08-30 22:59:25 +00002346
2347 // After emitting the diagnostic, bypass the overriding file to recover
2348 // (this creates a separate FileEntry).
2349 File = SM.bypassFileContentsOverride(*File);
2350 if (!File) {
2351 F.InputFilesLoaded[ID - 1] = InputFile::getNotFound();
2352 return InputFile();
2353 }
Ben Langmuir198c1682014-03-07 07:27:49 +00002354 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002355
Bruno Cardoso Lopes1731fc82019-10-15 14:23:55 +00002356 enum ModificationType {
2357 Size,
2358 ModTime,
2359 Content,
2360 None,
2361 };
2362 auto HasInputFileChanged = [&]() {
2363 if (StoredSize != File->getSize())
2364 return ModificationType::Size;
2365 if (!DisableValidation && StoredTime &&
2366 StoredTime != File->getModificationTime()) {
2367 // In case the modification time changes but not the content,
2368 // accept the cached file as legit.
2369 if (ValidateASTInputFilesContent &&
2370 StoredContentHash != static_cast<uint64_t>(llvm::hash_code(-1))) {
2371 auto MemBuffOrError = FileMgr.getBufferForFile(File);
2372 if (!MemBuffOrError) {
2373 if (!Complain)
2374 return ModificationType::ModTime;
2375 std::string ErrorStr = "could not get buffer for file '";
2376 ErrorStr += File->getName();
2377 ErrorStr += "'";
2378 Error(ErrorStr);
2379 return ModificationType::ModTime;
2380 }
Eric Christopher3be91692019-10-14 23:14:24 +00002381
Bruno Cardoso Lopes1731fc82019-10-15 14:23:55 +00002382 auto ContentHash = hash_value(MemBuffOrError.get()->getBuffer());
2383 if (StoredContentHash == static_cast<uint64_t>(ContentHash))
2384 return ModificationType::None;
2385 return ModificationType::Content;
2386 }
2387 return ModificationType::ModTime;
2388 }
2389 return ModificationType::None;
2390 };
2391
2392 bool IsOutOfDate = false;
2393 auto FileChange = HasInputFileChanged();
Ben Langmuir198c1682014-03-07 07:27:49 +00002394 // For an overridden file, there is nothing to validate.
Bruno Cardoso Lopes1731fc82019-10-15 14:23:55 +00002395 if (!Overridden && FileChange != ModificationType::None) {
Ben Langmuir198c1682014-03-07 07:27:49 +00002396 if (Complain) {
2397 // Build a list of the PCH imports that got us here (in reverse).
2398 SmallVector<ModuleFile *, 4> ImportStack(1, &F);
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00002399 while (!ImportStack.back()->ImportedBy.empty())
Ben Langmuir198c1682014-03-07 07:27:49 +00002400 ImportStack.push_back(ImportStack.back()->ImportedBy[0]);
Ben Langmuire82630d2014-01-17 00:19:09 +00002401
Ben Langmuir198c1682014-03-07 07:27:49 +00002402 // The top-level PCH is stale.
2403 StringRef TopLevelPCHName(ImportStack.back()->FileName);
Bruno Cardoso Lopes1731fc82019-10-15 14:23:55 +00002404 unsigned DiagnosticKind =
2405 moduleKindForDiagnostic(ImportStack.back()->Kind);
Manman Renc8c94152016-10-21 23:35:03 +00002406 if (DiagnosticKind == 0)
Bruno Cardoso Lopes1731fc82019-10-15 14:23:55 +00002407 Error(diag::err_fe_pch_file_modified, Filename, TopLevelPCHName,
2408 (unsigned)FileChange);
Manman Renc8c94152016-10-21 23:35:03 +00002409 else if (DiagnosticKind == 1)
Bruno Cardoso Lopes1731fc82019-10-15 14:23:55 +00002410 Error(diag::err_fe_module_file_modified, Filename, TopLevelPCHName,
2411 (unsigned)FileChange);
Manman Renc8c94152016-10-21 23:35:03 +00002412 else
Bruno Cardoso Lopes1731fc82019-10-15 14:23:55 +00002413 Error(diag::err_fe_ast_file_modified, Filename, TopLevelPCHName,
2414 (unsigned)FileChange);
Ben Langmuire82630d2014-01-17 00:19:09 +00002415
Ben Langmuir198c1682014-03-07 07:27:49 +00002416 // Print the import stack.
2417 if (ImportStack.size() > 1 && !Diags.isDiagnosticInFlight()) {
2418 Diag(diag::note_pch_required_by)
2419 << Filename << ImportStack[0]->FileName;
2420 for (unsigned I = 1; I < ImportStack.size(); ++I)
Ben Langmuire82630d2014-01-17 00:19:09 +00002421 Diag(diag::note_pch_required_by)
Ben Langmuir198c1682014-03-07 07:27:49 +00002422 << ImportStack[I-1]->FileName << ImportStack[I]->FileName;
Douglas Gregor7029ce12013-03-19 00:28:20 +00002423 }
2424
Ben Langmuir198c1682014-03-07 07:27:49 +00002425 if (!Diags.isDiagnosticInFlight())
2426 Diag(diag::note_pch_rebuild_required) << TopLevelPCHName;
Guy Benyei11169dd2012-12-18 14:30:41 +00002427 }
2428
Ben Langmuir198c1682014-03-07 07:27:49 +00002429 IsOutOfDate = true;
Guy Benyei11169dd2012-12-18 14:30:41 +00002430 }
Richard Smitha8cfffa2015-11-26 02:04:16 +00002431 // FIXME: If the file is overridden and we've already opened it,
2432 // issue an error (or split it into a separate FileEntry).
Guy Benyei11169dd2012-12-18 14:30:41 +00002433
Richard Smitha8cfffa2015-11-26 02:04:16 +00002434 InputFile IF = InputFile(File, Overridden || Transient, IsOutOfDate);
Ben Langmuir198c1682014-03-07 07:27:49 +00002435
2436 // Note that we've loaded this input file.
2437 F.InputFilesLoaded[ID-1] = IF;
2438 return IF;
Guy Benyei11169dd2012-12-18 14:30:41 +00002439}
2440
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00002441/// If we are loading a relocatable PCH or module file, and the filename
Richard Smith7ed1bc92014-12-05 22:42:13 +00002442/// is not an absolute path, add the system or module root to the beginning of
2443/// the file name.
2444void ASTReader::ResolveImportedPath(ModuleFile &M, std::string &Filename) {
2445 // Resolve relative to the base directory, if we have one.
2446 if (!M.BaseDirectory.empty())
2447 return ResolveImportedPath(Filename, M.BaseDirectory);
Guy Benyei11169dd2012-12-18 14:30:41 +00002448}
2449
Richard Smith7ed1bc92014-12-05 22:42:13 +00002450void ASTReader::ResolveImportedPath(std::string &Filename, StringRef Prefix) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002451 if (Filename.empty() || llvm::sys::path::is_absolute(Filename))
2452 return;
2453
Richard Smith7ed1bc92014-12-05 22:42:13 +00002454 SmallString<128> Buffer;
2455 llvm::sys::path::append(Buffer, Prefix, Filename);
2456 Filename.assign(Buffer.begin(), Buffer.end());
Guy Benyei11169dd2012-12-18 14:30:41 +00002457}
2458
Richard Smith0f99d6a2015-08-09 08:48:41 +00002459static bool isDiagnosedResult(ASTReader::ASTReadResult ARR, unsigned Caps) {
2460 switch (ARR) {
2461 case ASTReader::Failure: return true;
2462 case ASTReader::Missing: return !(Caps & ASTReader::ARR_Missing);
2463 case ASTReader::OutOfDate: return !(Caps & ASTReader::ARR_OutOfDate);
2464 case ASTReader::VersionMismatch: return !(Caps & ASTReader::ARR_VersionMismatch);
2465 case ASTReader::ConfigurationMismatch:
2466 return !(Caps & ASTReader::ARR_ConfigurationMismatch);
2467 case ASTReader::HadErrors: return true;
2468 case ASTReader::Success: return false;
2469 }
2470
2471 llvm_unreachable("unknown ASTReadResult");
2472}
2473
Richard Smith0516b182015-09-08 19:40:14 +00002474ASTReader::ASTReadResult ASTReader::ReadOptionsBlock(
2475 BitstreamCursor &Stream, unsigned ClientLoadCapabilities,
2476 bool AllowCompatibleConfigurationMismatch, ASTReaderListener &Listener,
Duncan P. N. Exon Smith60fa2882017-03-13 18:45:08 +00002477 std::string &SuggestedPredefines) {
JF Bastien0e828952019-06-26 19:50:12 +00002478 if (llvm::Error Err = Stream.EnterSubBlock(OPTIONS_BLOCK_ID)) {
2479 // FIXME this drops errors on the floor.
2480 consumeError(std::move(Err));
Richard Smith0516b182015-09-08 19:40:14 +00002481 return Failure;
JF Bastien0e828952019-06-26 19:50:12 +00002482 }
Richard Smith0516b182015-09-08 19:40:14 +00002483
2484 // Read all of the records in the options block.
2485 RecordData Record;
2486 ASTReadResult Result = Success;
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00002487 while (true) {
JF Bastien0e828952019-06-26 19:50:12 +00002488 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
2489 if (!MaybeEntry) {
2490 // FIXME this drops errors on the floor.
2491 consumeError(MaybeEntry.takeError());
2492 return Failure;
2493 }
2494 llvm::BitstreamEntry Entry = MaybeEntry.get();
David L. Jonesc4808b9e2016-12-15 20:53:26 +00002495
Richard Smith0516b182015-09-08 19:40:14 +00002496 switch (Entry.Kind) {
2497 case llvm::BitstreamEntry::Error:
2498 case llvm::BitstreamEntry::SubBlock:
2499 return Failure;
2500
2501 case llvm::BitstreamEntry::EndBlock:
2502 return Result;
2503
2504 case llvm::BitstreamEntry::Record:
2505 // The interesting case.
2506 break;
2507 }
2508
2509 // Read and process a record.
2510 Record.clear();
JF Bastien0e828952019-06-26 19:50:12 +00002511 Expected<unsigned> MaybeRecordType = Stream.readRecord(Entry.ID, Record);
2512 if (!MaybeRecordType) {
2513 // FIXME this drops errors on the floor.
2514 consumeError(MaybeRecordType.takeError());
2515 return Failure;
2516 }
2517 switch ((OptionsRecordTypes)MaybeRecordType.get()) {
Richard Smith0516b182015-09-08 19:40:14 +00002518 case LANGUAGE_OPTIONS: {
2519 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2520 if (ParseLanguageOptions(Record, Complain, Listener,
2521 AllowCompatibleConfigurationMismatch))
2522 Result = ConfigurationMismatch;
2523 break;
2524 }
2525
2526 case TARGET_OPTIONS: {
2527 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2528 if (ParseTargetOptions(Record, Complain, Listener,
2529 AllowCompatibleConfigurationMismatch))
2530 Result = ConfigurationMismatch;
2531 break;
2532 }
2533
Richard Smith0516b182015-09-08 19:40:14 +00002534 case FILE_SYSTEM_OPTIONS: {
2535 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2536 if (!AllowCompatibleConfigurationMismatch &&
2537 ParseFileSystemOptions(Record, Complain, Listener))
2538 Result = ConfigurationMismatch;
2539 break;
2540 }
2541
2542 case HEADER_SEARCH_OPTIONS: {
2543 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2544 if (!AllowCompatibleConfigurationMismatch &&
2545 ParseHeaderSearchOptions(Record, Complain, Listener))
2546 Result = ConfigurationMismatch;
2547 break;
2548 }
2549
2550 case PREPROCESSOR_OPTIONS:
2551 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2552 if (!AllowCompatibleConfigurationMismatch &&
2553 ParsePreprocessorOptions(Record, Complain, Listener,
2554 SuggestedPredefines))
2555 Result = ConfigurationMismatch;
2556 break;
2557 }
2558 }
2559}
2560
Guy Benyei11169dd2012-12-18 14:30:41 +00002561ASTReader::ASTReadResult
2562ASTReader::ReadControlBlock(ModuleFile &F,
Dmitri Gribenkof8579502013-01-12 19:30:44 +00002563 SmallVectorImpl<ImportedModule> &Loaded,
Ben Langmuirbeee15e2014-04-14 18:00:01 +00002564 const ModuleFile *ImportedBy,
Guy Benyei11169dd2012-12-18 14:30:41 +00002565 unsigned ClientLoadCapabilities) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00002566 BitstreamCursor &Stream = F.Stream;
Guy Benyei11169dd2012-12-18 14:30:41 +00002567
JF Bastien0e828952019-06-26 19:50:12 +00002568 if (llvm::Error Err = Stream.EnterSubBlock(CONTROL_BLOCK_ID)) {
2569 Error(std::move(Err));
Guy Benyei11169dd2012-12-18 14:30:41 +00002570 return Failure;
2571 }
2572
Duncan P. N. Exon Smith60fa2882017-03-13 18:45:08 +00002573 // Lambda to read the unhashed control block the first time it's called.
2574 //
2575 // For PCM files, the unhashed control block cannot be read until after the
2576 // MODULE_NAME record. However, PCH files have no MODULE_NAME, and yet still
2577 // need to look ahead before reading the IMPORTS record. For consistency,
2578 // this block is always read somehow (see BitstreamEntry::EndBlock).
2579 bool HasReadUnhashedControlBlock = false;
2580 auto readUnhashedControlBlockOnce = [&]() {
2581 if (!HasReadUnhashedControlBlock) {
2582 HasReadUnhashedControlBlock = true;
2583 if (ASTReadResult Result =
2584 readUnhashedControlBlock(F, ImportedBy, ClientLoadCapabilities))
2585 return Result;
2586 }
2587 return Success;
2588 };
2589
Guy Benyei11169dd2012-12-18 14:30:41 +00002590 // Read all of the records and blocks in the control block.
2591 RecordData Record;
Richard Smitha1825302014-10-23 22:18:29 +00002592 unsigned NumInputs = 0;
2593 unsigned NumUserInputs = 0;
Duncan P. N. Exon Smith0a2be462019-03-09 17:44:01 +00002594 StringRef BaseDirectoryAsWritten;
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00002595 while (true) {
JF Bastien0e828952019-06-26 19:50:12 +00002596 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
2597 if (!MaybeEntry) {
2598 Error(MaybeEntry.takeError());
2599 return Failure;
2600 }
2601 llvm::BitstreamEntry Entry = MaybeEntry.get();
David L. Jonesc4808b9e2016-12-15 20:53:26 +00002602
Chris Lattnere7b154b2013-01-19 21:39:22 +00002603 switch (Entry.Kind) {
2604 case llvm::BitstreamEntry::Error:
2605 Error("malformed block record in AST file");
2606 return Failure;
Dmitri Gribenkof430da42014-02-12 10:33:14 +00002607 case llvm::BitstreamEntry::EndBlock: {
Duncan P. N. Exon Smith60fa2882017-03-13 18:45:08 +00002608 // Validate the module before returning. This call catches an AST with
2609 // no module name and no imports.
2610 if (ASTReadResult Result = readUnhashedControlBlockOnce())
2611 return Result;
2612
Dmitri Gribenkof430da42014-02-12 10:33:14 +00002613 // Validate input files.
2614 const HeaderSearchOptions &HSOpts =
2615 PP.getHeaderSearchInfo().getHeaderSearchOpts();
Ben Langmuircb69b572014-03-07 06:40:32 +00002616
Richard Smitha1825302014-10-23 22:18:29 +00002617 // All user input files reside at the index range [0, NumUserInputs), and
Richard Smith0f99d6a2015-08-09 08:48:41 +00002618 // system input files reside at [NumUserInputs, NumInputs). For explicitly
2619 // loaded module files, ignore missing inputs.
Manman Ren11f2a472016-08-18 17:42:15 +00002620 if (!DisableValidation && F.Kind != MK_ExplicitModule &&
2621 F.Kind != MK_PrebuiltModule) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002622 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
Ben Langmuircb69b572014-03-07 06:40:32 +00002623
Dmitri Gribenkof430da42014-02-12 10:33:14 +00002624 // If we are reading a module, we will create a verification timestamp,
2625 // so we verify all input files. Otherwise, verify only user input
2626 // files.
Ben Langmuircb69b572014-03-07 06:40:32 +00002627
2628 unsigned N = NumUserInputs;
2629 if (ValidateSystemInputs ||
Richard Smithe842a472014-10-22 02:05:46 +00002630 (HSOpts.ModulesValidateOncePerBuildSession &&
Ben Langmuiracb803e2014-11-10 22:13:10 +00002631 F.InputFilesValidationTimestamp <= HSOpts.BuildSessionTimestamp &&
Richard Smithe842a472014-10-22 02:05:46 +00002632 F.Kind == MK_ImplicitModule))
Ben Langmuircb69b572014-03-07 06:40:32 +00002633 N = NumInputs;
2634
Ben Langmuir3d4417c2014-02-07 17:31:11 +00002635 for (unsigned I = 0; I < N; ++I) {
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00002636 InputFile IF = getInputFile(F, I+1, Complain);
2637 if (!IF.getFile() || IF.isOutOfDate())
Guy Benyei11169dd2012-12-18 14:30:41 +00002638 return OutOfDate;
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00002639 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002640 }
Ben Langmuircb69b572014-03-07 06:40:32 +00002641
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +00002642 if (Listener)
Richard Smith216a3bd2015-08-13 17:57:10 +00002643 Listener->visitModuleFile(F.FileName, F.Kind);
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +00002644
Ben Langmuircb69b572014-03-07 06:40:32 +00002645 if (Listener && Listener->needsInputFileVisitation()) {
2646 unsigned N = Listener->needsSystemInputFileVisitation() ? NumInputs
2647 : NumUserInputs;
Argyrios Kyrtzidis68ccbe02014-03-14 02:26:31 +00002648 for (unsigned I = 0; I < N; ++I) {
2649 bool IsSystem = I >= NumUserInputs;
2650 InputFileInfo FI = readInputFileInfo(F, I+1);
Richard Smith216a3bd2015-08-13 17:57:10 +00002651 Listener->visitInputFile(FI.Filename, IsSystem, FI.Overridden,
Manman Ren11f2a472016-08-18 17:42:15 +00002652 F.Kind == MK_ExplicitModule ||
2653 F.Kind == MK_PrebuiltModule);
Argyrios Kyrtzidis68ccbe02014-03-14 02:26:31 +00002654 }
Ben Langmuircb69b572014-03-07 06:40:32 +00002655 }
2656
Duncan P. N. Exon Smith69242e92019-11-19 14:44:22 -08002657 return Success;
Dmitri Gribenkof430da42014-02-12 10:33:14 +00002658 }
2659
Chris Lattnere7b154b2013-01-19 21:39:22 +00002660 case llvm::BitstreamEntry::SubBlock:
2661 switch (Entry.ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002662 case INPUT_FILES_BLOCK_ID:
2663 F.InputFilesCursor = Stream;
JF Bastien0e828952019-06-26 19:50:12 +00002664 if (llvm::Error Err = Stream.SkipBlock()) {
2665 Error(std::move(Err));
2666 return Failure;
2667 }
2668 if (ReadBlockAbbrevs(F.InputFilesCursor, INPUT_FILES_BLOCK_ID)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002669 Error("malformed block record in AST file");
2670 return Failure;
2671 }
2672 continue;
Richard Smith0516b182015-09-08 19:40:14 +00002673
2674 case OPTIONS_BLOCK_ID:
2675 // If we're reading the first module for this group, check its options
2676 // are compatible with ours. For modules it imports, no further checking
2677 // is required, because we checked them when we built it.
2678 if (Listener && !ImportedBy) {
2679 // Should we allow the configuration of the module file to differ from
2680 // the configuration of the current translation unit in a compatible
2681 // way?
2682 //
2683 // FIXME: Allow this for files explicitly specified with -include-pch.
2684 bool AllowCompatibleConfigurationMismatch =
Manman Ren11f2a472016-08-18 17:42:15 +00002685 F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule;
Richard Smith0516b182015-09-08 19:40:14 +00002686
Duncan P. N. Exon Smith69242e92019-11-19 14:44:22 -08002687 ASTReadResult Result =
2688 ReadOptionsBlock(Stream, ClientLoadCapabilities,
2689 AllowCompatibleConfigurationMismatch, *Listener,
2690 SuggestedPredefines);
Richard Smith0516b182015-09-08 19:40:14 +00002691 if (Result == Failure) {
2692 Error("malformed block record in AST file");
2693 return Result;
2694 }
2695
Richard Smith8a308ec2015-11-05 00:54:55 +00002696 if (DisableValidation ||
2697 (AllowConfigurationMismatch && Result == ConfigurationMismatch))
2698 Result = Success;
2699
Ben Langmuir9b1e442e2016-02-11 18:54:02 +00002700 // If we can't load the module, exit early since we likely
2701 // will rebuild the module anyway. The stream may be in the
2702 // middle of a block.
2703 if (Result != Success)
Richard Smith0516b182015-09-08 19:40:14 +00002704 return Result;
JF Bastien0e828952019-06-26 19:50:12 +00002705 } else if (llvm::Error Err = Stream.SkipBlock()) {
2706 Error(std::move(Err));
Richard Smith0516b182015-09-08 19:40:14 +00002707 return Failure;
2708 }
2709 continue;
David L. Jonesc4808b9e2016-12-15 20:53:26 +00002710
Guy Benyei11169dd2012-12-18 14:30:41 +00002711 default:
JF Bastien0e828952019-06-26 19:50:12 +00002712 if (llvm::Error Err = Stream.SkipBlock()) {
2713 Error(std::move(Err));
Chris Lattnere7b154b2013-01-19 21:39:22 +00002714 return Failure;
2715 }
2716 continue;
Guy Benyei11169dd2012-12-18 14:30:41 +00002717 }
David L. Jonesc4808b9e2016-12-15 20:53:26 +00002718
Chris Lattnere7b154b2013-01-19 21:39:22 +00002719 case llvm::BitstreamEntry::Record:
2720 // The interesting case.
2721 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00002722 }
2723
2724 // Read and process a record.
2725 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00002726 StringRef Blob;
JF Bastien0e828952019-06-26 19:50:12 +00002727 Expected<unsigned> MaybeRecordType =
2728 Stream.readRecord(Entry.ID, Record, &Blob);
2729 if (!MaybeRecordType) {
2730 Error(MaybeRecordType.takeError());
2731 return Failure;
2732 }
2733 switch ((ControlRecordTypes)MaybeRecordType.get()) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002734 case METADATA: {
2735 if (Record[0] != VERSION_MAJOR && !DisableValidation) {
2736 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
Dmitri Gribenko2228cd32014-02-11 15:40:09 +00002737 Diag(Record[0] < VERSION_MAJOR? diag::err_pch_version_too_old
2738 : diag::err_pch_version_too_new);
Guy Benyei11169dd2012-12-18 14:30:41 +00002739 return VersionMismatch;
2740 }
2741
Hans Wennborg08c5a7b2018-06-25 13:23:49 +00002742 bool hasErrors = Record[7];
Guy Benyei11169dd2012-12-18 14:30:41 +00002743 if (hasErrors && !DisableValidation && !AllowASTWithCompilerErrors) {
2744 Diag(diag::err_pch_with_compiler_errors);
2745 return HadErrors;
2746 }
Argyrios Kyrtzidis70ec1c72016-07-13 20:35:26 +00002747 if (hasErrors) {
2748 Diags.ErrorOccurred = true;
2749 Diags.UncompilableErrorOccurred = true;
2750 Diags.UnrecoverableErrorOccurred = true;
2751 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002752
2753 F.RelocatablePCH = Record[4];
Richard Smith7ed1bc92014-12-05 22:42:13 +00002754 // Relative paths in a relocatable PCH are relative to our sysroot.
2755 if (F.RelocatablePCH)
2756 F.BaseDirectory = isysroot.empty() ? "/" : isysroot;
Guy Benyei11169dd2012-12-18 14:30:41 +00002757
Richard Smithe75ee0f2015-08-17 07:13:32 +00002758 F.HasTimestamps = Record[5];
2759
Hans Wennborg08c5a7b2018-06-25 13:23:49 +00002760 F.PCHHasObjectFile = Record[6];
2761
Guy Benyei11169dd2012-12-18 14:30:41 +00002762 const std::string &CurBranch = getClangFullRepositoryVersion();
Chris Lattner0e6c9402013-01-20 02:38:54 +00002763 StringRef ASTBranch = Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00002764 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) {
2765 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
Dmitri Gribenko2228cd32014-02-11 15:40:09 +00002766 Diag(diag::err_pch_different_branch) << ASTBranch << CurBranch;
Guy Benyei11169dd2012-12-18 14:30:41 +00002767 return VersionMismatch;
2768 }
2769 break;
2770 }
2771
2772 case IMPORTS: {
Duncan P. N. Exon Smith60fa2882017-03-13 18:45:08 +00002773 // Validate the AST before processing any imports (otherwise, untangling
2774 // them can be error-prone and expensive). A module will have a name and
2775 // will already have been validated, but this catches the PCH case.
2776 if (ASTReadResult Result = readUnhashedControlBlockOnce())
2777 return Result;
2778
David L. Jonesc4808b9e2016-12-15 20:53:26 +00002779 // Load each of the imported PCH files.
Guy Benyei11169dd2012-12-18 14:30:41 +00002780 unsigned Idx = 0, N = Record.size();
2781 while (Idx < N) {
2782 // Read information about the AST file.
Vedant Kumar48b4f762018-04-14 01:40:48 +00002783 ModuleKind ImportedKind = (ModuleKind)Record[Idx++];
Guy Benyei11169dd2012-12-18 14:30:41 +00002784 // The import location will be the local one for now; we will adjust
2785 // all import locations of module imports after the global source
Richard Smithb22a1d12016-03-27 20:13:24 +00002786 // location info are setup, in ReadAST.
Guy Benyei11169dd2012-12-18 14:30:41 +00002787 SourceLocation ImportLoc =
Richard Smithb22a1d12016-03-27 20:13:24 +00002788 ReadUntranslatedSourceLocation(Record[Idx++]);
Vedant Kumar48b4f762018-04-14 01:40:48 +00002789 off_t StoredSize = (off_t)Record[Idx++];
2790 time_t StoredModTime = (time_t)Record[Idx++];
Duncan P. N. Exon Smith60fa2882017-03-13 18:45:08 +00002791 ASTFileSignature StoredSignature = {
2792 {{(uint32_t)Record[Idx++], (uint32_t)Record[Idx++],
2793 (uint32_t)Record[Idx++], (uint32_t)Record[Idx++],
2794 (uint32_t)Record[Idx++]}}};
Boris Kolpackovd30446f2017-08-31 06:26:43 +00002795
2796 std::string ImportedName = ReadString(Record, Idx);
2797 std::string ImportedFile;
2798
2799 // For prebuilt and explicit modules first consult the file map for
2800 // an override. Note that here we don't search prebuilt module
2801 // directories, only the explicit name to file mappings. Also, we will
2802 // still verify the size/signature making sure it is essentially the
2803 // same file but perhaps in a different location.
2804 if (ImportedKind == MK_PrebuiltModule || ImportedKind == MK_ExplicitModule)
2805 ImportedFile = PP.getHeaderSearchInfo().getPrebuiltModuleFileName(
2806 ImportedName, /*FileMapOnly*/ true);
2807
2808 if (ImportedFile.empty())
Duncan P. N. Exon Smith0a2be462019-03-09 17:44:01 +00002809 // Use BaseDirectoryAsWritten to ensure we use the same path in the
2810 // ModuleCache as when writing.
2811 ImportedFile = ReadPath(BaseDirectoryAsWritten, Record, Idx);
Boris Kolpackovd30446f2017-08-31 06:26:43 +00002812 else
2813 SkipPath(Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00002814
Richard Smith0f99d6a2015-08-09 08:48:41 +00002815 // If our client can't cope with us being out of date, we can't cope with
2816 // our dependency being missing.
2817 unsigned Capabilities = ClientLoadCapabilities;
2818 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
2819 Capabilities &= ~ARR_Missing;
2820
Guy Benyei11169dd2012-12-18 14:30:41 +00002821 // Load the AST file.
Richard Smith0f99d6a2015-08-09 08:48:41 +00002822 auto Result = ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F,
2823 Loaded, StoredSize, StoredModTime,
2824 StoredSignature, Capabilities);
2825
2826 // If we diagnosed a problem, produce a backtrace.
2827 if (isDiagnosedResult(Result, Capabilities))
2828 Diag(diag::note_module_file_imported_by)
2829 << F.FileName << !F.ModuleName.empty() << F.ModuleName;
2830
2831 switch (Result) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002832 case Failure: return Failure;
2833 // If we have to ignore the dependency, we'll have to ignore this too.
Douglas Gregor2f1806e2013-03-19 00:38:50 +00002834 case Missing:
Guy Benyei11169dd2012-12-18 14:30:41 +00002835 case OutOfDate: return OutOfDate;
2836 case VersionMismatch: return VersionMismatch;
2837 case ConfigurationMismatch: return ConfigurationMismatch;
2838 case HadErrors: return HadErrors;
2839 case Success: break;
2840 }
2841 }
2842 break;
2843 }
2844
Guy Benyei11169dd2012-12-18 14:30:41 +00002845 case ORIGINAL_FILE:
2846 F.OriginalSourceFileID = FileID::get(Record[0]);
Benjamin Krameradcd0262020-01-28 20:23:46 +01002847 F.ActualOriginalSourceFileName = std::string(Blob);
Guy Benyei11169dd2012-12-18 14:30:41 +00002848 F.OriginalSourceFileName = F.ActualOriginalSourceFileName;
Richard Smith7ed1bc92014-12-05 22:42:13 +00002849 ResolveImportedPath(F, F.OriginalSourceFileName);
Guy Benyei11169dd2012-12-18 14:30:41 +00002850 break;
2851
2852 case ORIGINAL_FILE_ID:
2853 F.OriginalSourceFileID = FileID::get(Record[0]);
2854 break;
2855
2856 case ORIGINAL_PCH_DIR:
Benjamin Krameradcd0262020-01-28 20:23:46 +01002857 F.OriginalDir = std::string(Blob);
Guy Benyei11169dd2012-12-18 14:30:41 +00002858 break;
2859
Ben Langmuirbeee15e2014-04-14 18:00:01 +00002860 case MODULE_NAME:
Benjamin Krameradcd0262020-01-28 20:23:46 +01002861 F.ModuleName = std::string(Blob);
Duncan P. N. Exon Smith9dda8f52019-03-06 02:50:46 +00002862 Diag(diag::remark_module_import)
2863 << F.ModuleName << F.FileName << (ImportedBy ? true : false)
2864 << (ImportedBy ? StringRef(ImportedBy->ModuleName) : StringRef());
Ben Langmuir4f5212a2014-04-14 22:12:44 +00002865 if (Listener)
2866 Listener->ReadModuleName(F.ModuleName);
Duncan P. N. Exon Smith60fa2882017-03-13 18:45:08 +00002867
2868 // Validate the AST as soon as we have a name so we can exit early on
2869 // failure.
2870 if (ASTReadResult Result = readUnhashedControlBlockOnce())
2871 return Result;
Vedant Kumar48b4f762018-04-14 01:40:48 +00002872
Ben Langmuirbeee15e2014-04-14 18:00:01 +00002873 break;
2874
Richard Smith223d3f22014-12-06 03:21:08 +00002875 case MODULE_DIRECTORY: {
Duncan P. N. Exon Smith0a2be462019-03-09 17:44:01 +00002876 // Save the BaseDirectory as written in the PCM for computing the module
2877 // filename for the ModuleCache.
2878 BaseDirectoryAsWritten = Blob;
Richard Smith223d3f22014-12-06 03:21:08 +00002879 assert(!F.ModuleName.empty() &&
2880 "MODULE_DIRECTORY found before MODULE_NAME");
2881 // If we've already loaded a module map file covering this module, we may
2882 // have a better path for it (relative to the current build).
Bruno Cardoso Lopes52431f32018-07-18 23:21:19 +00002883 Module *M = PP.getHeaderSearchInfo().lookupModule(
2884 F.ModuleName, /*AllowSearch*/ true,
2885 /*AllowExtraModuleMapSearch*/ true);
Richard Smith223d3f22014-12-06 03:21:08 +00002886 if (M && M->Directory) {
2887 // If we're implicitly loading a module, the base directory can't
2888 // change between the build and use.
Yuka Takahashid8baec22018-08-01 09:50:02 +00002889 // Don't emit module relocation error if we have -fno-validate-pch
2890 if (!PP.getPreprocessorOpts().DisablePCHValidation &&
2891 F.Kind != MK_ExplicitModule && F.Kind != MK_PrebuiltModule) {
Harlan Haskins8d323d12019-08-01 21:31:56 +00002892 auto BuildDir = PP.getFileManager().getDirectory(Blob);
2893 if (!BuildDir || *BuildDir != M->Directory) {
Richard Smith223d3f22014-12-06 03:21:08 +00002894 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
2895 Diag(diag::err_imported_module_relocated)
2896 << F.ModuleName << Blob << M->Directory->getName();
2897 return OutOfDate;
2898 }
2899 }
Benjamin Krameradcd0262020-01-28 20:23:46 +01002900 F.BaseDirectory = std::string(M->Directory->getName());
Richard Smith223d3f22014-12-06 03:21:08 +00002901 } else {
Benjamin Krameradcd0262020-01-28 20:23:46 +01002902 F.BaseDirectory = std::string(Blob);
Richard Smith223d3f22014-12-06 03:21:08 +00002903 }
Richard Smith7ed1bc92014-12-05 22:42:13 +00002904 break;
Richard Smith223d3f22014-12-06 03:21:08 +00002905 }
Richard Smith7ed1bc92014-12-05 22:42:13 +00002906
Ben Langmuirbeee15e2014-04-14 18:00:01 +00002907 case MODULE_MAP_FILE:
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00002908 if (ASTReadResult Result =
2909 ReadModuleMapFileBlock(Record, F, ImportedBy, ClientLoadCapabilities))
2910 return Result;
Ben Langmuir264ea152014-11-08 00:06:39 +00002911 break;
2912
Justin Bognerca9c0cc2015-06-21 20:32:36 +00002913 case INPUT_FILE_OFFSETS:
Richard Smitha1825302014-10-23 22:18:29 +00002914 NumInputs = Record[0];
2915 NumUserInputs = Record[1];
Justin Bogner4c183242015-06-21 20:32:40 +00002916 F.InputFileOffsets =
2917 (const llvm::support::unaligned_uint64_t *)Blob.data();
Richard Smitha1825302014-10-23 22:18:29 +00002918 F.InputFilesLoaded.resize(NumInputs);
Argyrios Kyrtzidisa38cb202017-01-30 06:05:58 +00002919 F.NumUserInputFiles = NumUserInputs;
Guy Benyei11169dd2012-12-18 14:30:41 +00002920 break;
2921 }
2922 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002923}
2924
Ben Langmuir2c9af442014-04-10 17:57:43 +00002925ASTReader::ASTReadResult
2926ASTReader::ReadASTBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00002927 BitstreamCursor &Stream = F.Stream;
Guy Benyei11169dd2012-12-18 14:30:41 +00002928
JF Bastien0e828952019-06-26 19:50:12 +00002929 if (llvm::Error Err = Stream.EnterSubBlock(AST_BLOCK_ID)) {
2930 Error(std::move(Err));
Ben Langmuir2c9af442014-04-10 17:57:43 +00002931 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002932 }
2933
2934 // Read all of the records and blocks for the AST file.
2935 RecordData Record;
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00002936 while (true) {
JF Bastien0e828952019-06-26 19:50:12 +00002937 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
2938 if (!MaybeEntry) {
2939 Error(MaybeEntry.takeError());
2940 return Failure;
2941 }
2942 llvm::BitstreamEntry Entry = MaybeEntry.get();
David L. Jonesc4808b9e2016-12-15 20:53:26 +00002943
Chris Lattnere7b154b2013-01-19 21:39:22 +00002944 switch (Entry.Kind) {
2945 case llvm::BitstreamEntry::Error:
2946 Error("error at end of module block in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002947 return Failure;
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00002948 case llvm::BitstreamEntry::EndBlock:
Richard Smithc0fbba72013-04-03 22:49:41 +00002949 // Outside of C++, we do not store a lookup map for the translation unit.
2950 // Instead, mark it as needing a lookup map to be built if this module
2951 // contains any declarations lexically within it (which it always does!).
2952 // This usually has no cost, since we very rarely need the lookup map for
2953 // the translation unit outside C++.
Richard Smithdbafb6c2017-06-29 23:23:46 +00002954 if (ASTContext *Ctx = ContextObj) {
2955 DeclContext *DC = Ctx->getTranslationUnitDecl();
2956 if (DC->hasExternalLexicalStorage() && !Ctx->getLangOpts().CPlusPlus)
2957 DC->setMustBuildLookupTable();
2958 }
David L. Jonesc4808b9e2016-12-15 20:53:26 +00002959
Ben Langmuir2c9af442014-04-10 17:57:43 +00002960 return Success;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002961 case llvm::BitstreamEntry::SubBlock:
2962 switch (Entry.ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002963 case DECLTYPES_BLOCK_ID:
2964 // We lazily load the decls block, but we want to set up the
2965 // DeclsCursor cursor to point into it. Clone our current bitcode
2966 // cursor to it, enter the block and read the abbrevs in that block.
2967 // With the main cursor, we just skip over it.
2968 F.DeclsCursor = Stream;
JF Bastien0e828952019-06-26 19:50:12 +00002969 if (llvm::Error Err = Stream.SkipBlock()) {
2970 Error(std::move(Err));
2971 return Failure;
2972 }
2973 if (ReadBlockAbbrevs(F.DeclsCursor, DECLTYPES_BLOCK_ID)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002974 Error("malformed block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002975 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002976 }
2977 break;
Richard Smithb9eab6d2014-03-20 19:44:17 +00002978
Guy Benyei11169dd2012-12-18 14:30:41 +00002979 case PREPROCESSOR_BLOCK_ID:
2980 F.MacroCursor = Stream;
2981 if (!PP.getExternalSource())
2982 PP.setExternalSource(this);
David L. Jonesc4808b9e2016-12-15 20:53:26 +00002983
JF Bastien0e828952019-06-26 19:50:12 +00002984 if (llvm::Error Err = Stream.SkipBlock()) {
2985 Error(std::move(Err));
2986 return Failure;
2987 }
2988 if (ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002989 Error("malformed block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002990 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002991 }
2992 F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo();
2993 break;
David L. Jonesc4808b9e2016-12-15 20:53:26 +00002994
Guy Benyei11169dd2012-12-18 14:30:41 +00002995 case PREPROCESSOR_DETAIL_BLOCK_ID:
2996 F.PreprocessorDetailCursor = Stream;
JF Bastien0e828952019-06-26 19:50:12 +00002997
2998 if (llvm::Error Err = Stream.SkipBlock()) {
2999 Error(std::move(Err));
3000 return Failure;
3001 }
3002 if (ReadBlockAbbrevs(F.PreprocessorDetailCursor,
Guy Benyei11169dd2012-12-18 14:30:41 +00003003 PREPROCESSOR_DETAIL_BLOCK_ID)) {
JF Bastien0e828952019-06-26 19:50:12 +00003004 Error("malformed preprocessor detail record in AST file");
3005 return Failure;
3006 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003007 F.PreprocessorDetailStartOffset
Chris Lattnere7b154b2013-01-19 21:39:22 +00003008 = F.PreprocessorDetailCursor.GetCurrentBitNo();
David L. Jonesc4808b9e2016-12-15 20:53:26 +00003009
Guy Benyei11169dd2012-12-18 14:30:41 +00003010 if (!PP.getPreprocessingRecord())
3011 PP.createPreprocessingRecord();
3012 if (!PP.getPreprocessingRecord()->getExternalSource())
3013 PP.getPreprocessingRecord()->SetExternalSource(*this);
3014 break;
David L. Jonesc4808b9e2016-12-15 20:53:26 +00003015
Guy Benyei11169dd2012-12-18 14:30:41 +00003016 case SOURCE_MANAGER_BLOCK_ID:
3017 if (ReadSourceManagerBlock(F))
Ben Langmuir2c9af442014-04-10 17:57:43 +00003018 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003019 break;
David L. Jonesc4808b9e2016-12-15 20:53:26 +00003020
Guy Benyei11169dd2012-12-18 14:30:41 +00003021 case SUBMODULE_BLOCK_ID:
David Blaikie9ffe5a32017-01-30 05:00:26 +00003022 if (ASTReadResult Result =
3023 ReadSubmoduleBlock(F, ClientLoadCapabilities))
Ben Langmuir2c9af442014-04-10 17:57:43 +00003024 return Result;
Guy Benyei11169dd2012-12-18 14:30:41 +00003025 break;
David L. Jonesc4808b9e2016-12-15 20:53:26 +00003026
Guy Benyei11169dd2012-12-18 14:30:41 +00003027 case COMMENTS_BLOCK_ID: {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00003028 BitstreamCursor C = Stream;
JF Bastien0e828952019-06-26 19:50:12 +00003029
3030 if (llvm::Error Err = Stream.SkipBlock()) {
3031 Error(std::move(Err));
3032 return Failure;
3033 }
3034 if (ReadBlockAbbrevs(C, COMMENTS_BLOCK_ID)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003035 Error("malformed comments block in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003036 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003037 }
3038 CommentsCursors.push_back(std::make_pair(C, &F));
3039 break;
3040 }
David L. Jonesc4808b9e2016-12-15 20:53:26 +00003041
Guy Benyei11169dd2012-12-18 14:30:41 +00003042 default:
JF Bastien0e828952019-06-26 19:50:12 +00003043 if (llvm::Error Err = Stream.SkipBlock()) {
3044 Error(std::move(Err));
Ben Langmuir2c9af442014-04-10 17:57:43 +00003045 return Failure;
Chris Lattnere7b154b2013-01-19 21:39:22 +00003046 }
3047 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00003048 }
3049 continue;
David L. Jonesc4808b9e2016-12-15 20:53:26 +00003050
Chris Lattnere7b154b2013-01-19 21:39:22 +00003051 case llvm::BitstreamEntry::Record:
3052 // The interesting case.
3053 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00003054 }
3055
3056 // Read and process a record.
3057 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00003058 StringRef Blob;
JF Bastien0e828952019-06-26 19:50:12 +00003059 Expected<unsigned> MaybeRecordType =
3060 Stream.readRecord(Entry.ID, Record, &Blob);
3061 if (!MaybeRecordType) {
3062 Error(MaybeRecordType.takeError());
3063 return Failure;
3064 }
3065 ASTRecordTypes RecordType = (ASTRecordTypes)MaybeRecordType.get();
Richard Smithdbafb6c2017-06-29 23:23:46 +00003066
3067 // If we're not loading an AST context, we don't care about most records.
3068 if (!ContextObj) {
3069 switch (RecordType) {
3070 case IDENTIFIER_TABLE:
3071 case IDENTIFIER_OFFSET:
3072 case INTERESTING_IDENTIFIERS:
3073 case STATISTICS:
3074 case PP_CONDITIONAL_STACK:
3075 case PP_COUNTER_VALUE:
3076 case SOURCE_LOCATION_OFFSETS:
3077 case MODULE_OFFSET_MAP:
3078 case SOURCE_MANAGER_LINE_TABLE:
3079 case SOURCE_LOCATION_PRELOADS:
3080 case PPD_ENTITIES_OFFSETS:
3081 case HEADER_SEARCH_TABLE:
3082 case IMPORTED_MODULES:
3083 case MACRO_OFFSET:
3084 break;
3085 default:
3086 continue;
3087 }
3088 }
3089
3090 switch (RecordType) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003091 default: // Default behavior: ignore.
3092 break;
3093
3094 case TYPE_OFFSET: {
3095 if (F.LocalNumTypes != 0) {
3096 Error("duplicate TYPE_OFFSET record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003097 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003098 }
Chris Lattner0e6c9402013-01-20 02:38:54 +00003099 F.TypeOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003100 F.LocalNumTypes = Record[0];
3101 unsigned LocalBaseTypeIndex = Record[1];
3102 F.BaseTypeIndex = getTotalNumTypes();
David L. Jonesc4808b9e2016-12-15 20:53:26 +00003103
Guy Benyei11169dd2012-12-18 14:30:41 +00003104 if (F.LocalNumTypes > 0) {
3105 // Introduce the global -> local mapping for types within this module.
3106 GlobalTypeMap.insert(std::make_pair(getTotalNumTypes(), &F));
David L. Jonesc4808b9e2016-12-15 20:53:26 +00003107
Guy Benyei11169dd2012-12-18 14:30:41 +00003108 // Introduce the local -> global mapping for types within this module.
3109 F.TypeRemap.insertOrReplace(
David L. Jonesc4808b9e2016-12-15 20:53:26 +00003110 std::make_pair(LocalBaseTypeIndex,
Guy Benyei11169dd2012-12-18 14:30:41 +00003111 F.BaseTypeIndex - LocalBaseTypeIndex));
Ben Langmuir52ca6782014-10-20 16:27:32 +00003112
3113 TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes);
Guy Benyei11169dd2012-12-18 14:30:41 +00003114 }
3115 break;
3116 }
David L. Jonesc4808b9e2016-12-15 20:53:26 +00003117
Guy Benyei11169dd2012-12-18 14:30:41 +00003118 case DECL_OFFSET: {
3119 if (F.LocalNumDecls != 0) {
3120 Error("duplicate DECL_OFFSET record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003121 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003122 }
Chris Lattner0e6c9402013-01-20 02:38:54 +00003123 F.DeclOffsets = (const DeclOffset *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003124 F.LocalNumDecls = Record[0];
3125 unsigned LocalBaseDeclID = Record[1];
3126 F.BaseDeclID = getTotalNumDecls();
David L. Jonesc4808b9e2016-12-15 20:53:26 +00003127
Guy Benyei11169dd2012-12-18 14:30:41 +00003128 if (F.LocalNumDecls > 0) {
David L. Jonesc4808b9e2016-12-15 20:53:26 +00003129 // Introduce the global -> local mapping for declarations within this
Guy Benyei11169dd2012-12-18 14:30:41 +00003130 // module.
3131 GlobalDeclMap.insert(
3132 std::make_pair(getTotalNumDecls() + NUM_PREDEF_DECL_IDS, &F));
David L. Jonesc4808b9e2016-12-15 20:53:26 +00003133
Guy Benyei11169dd2012-12-18 14:30:41 +00003134 // Introduce the local -> global mapping for declarations within this
3135 // module.
3136 F.DeclRemap.insertOrReplace(
3137 std::make_pair(LocalBaseDeclID, F.BaseDeclID - LocalBaseDeclID));
David L. Jonesc4808b9e2016-12-15 20:53:26 +00003138
Guy Benyei11169dd2012-12-18 14:30:41 +00003139 // Introduce the global -> local mapping for declarations within this
3140 // module.
3141 F.GlobalToLocalDeclIDs[&F] = LocalBaseDeclID;
Ben Langmuirfe971d92014-08-16 04:54:18 +00003142
Ben Langmuir52ca6782014-10-20 16:27:32 +00003143 DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls);
3144 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003145 break;
3146 }
David L. Jonesc4808b9e2016-12-15 20:53:26 +00003147
Guy Benyei11169dd2012-12-18 14:30:41 +00003148 case TU_UPDATE_LEXICAL: {
Richard Smithdbafb6c2017-06-29 23:23:46 +00003149 DeclContext *TU = ContextObj->getTranslationUnitDecl();
Richard Smith82f8fcd2015-08-06 22:07:25 +00003150 LexicalContents Contents(
3151 reinterpret_cast<const llvm::support::unaligned_uint32_t *>(
3152 Blob.data()),
3153 static_cast<unsigned int>(Blob.size() / 4));
3154 TULexicalDecls.push_back(std::make_pair(&F, Contents));
Guy Benyei11169dd2012-12-18 14:30:41 +00003155 TU->setHasExternalLexicalStorage(true);
3156 break;
3157 }
3158
3159 case UPDATE_VISIBLE: {
3160 unsigned Idx = 0;
3161 serialization::DeclID ID = ReadDeclID(F, Record, Idx);
Richard Smith0f4e2c42015-08-06 04:23:48 +00003162 auto *Data = (const unsigned char*)Blob.data();
Richard Smithd88a7f12015-09-01 20:35:42 +00003163 PendingVisibleUpdates[ID].push_back(PendingVisibleUpdate{&F, Data});
Richard Smith0f4e2c42015-08-06 04:23:48 +00003164 // If we've already loaded the decl, perform the updates when we finish
3165 // loading this block.
3166 if (Decl *D = GetExistingDecl(ID))
Vassil Vassilev74c3e8c2017-05-19 16:46:06 +00003167 PendingUpdateRecords.push_back(
3168 PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
Guy Benyei11169dd2012-12-18 14:30:41 +00003169 break;
3170 }
3171
3172 case IDENTIFIER_TABLE:
Chris Lattner0e6c9402013-01-20 02:38:54 +00003173 F.IdentifierTableData = Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003174 if (Record[0]) {
Justin Bognerda4e6502014-04-14 16:34:29 +00003175 F.IdentifierLookupTable = ASTIdentifierLookupTable::Create(
3176 (const unsigned char *)F.IdentifierTableData + Record[0],
3177 (const unsigned char *)F.IdentifierTableData + sizeof(uint32_t),
3178 (const unsigned char *)F.IdentifierTableData,
3179 ASTIdentifierLookupTrait(*this, F));
David L. Jonesc4808b9e2016-12-15 20:53:26 +00003180
Guy Benyei11169dd2012-12-18 14:30:41 +00003181 PP.getIdentifierTable().setExternalIdentifierLookup(this);
3182 }
3183 break;
3184
3185 case IDENTIFIER_OFFSET: {
3186 if (F.LocalNumIdentifiers != 0) {
3187 Error("duplicate IDENTIFIER_OFFSET record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003188 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003189 }
Chris Lattner0e6c9402013-01-20 02:38:54 +00003190 F.IdentifierOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003191 F.LocalNumIdentifiers = Record[0];
3192 unsigned LocalBaseIdentifierID = Record[1];
3193 F.BaseIdentifierID = getTotalNumIdentifiers();
David L. Jonesc4808b9e2016-12-15 20:53:26 +00003194
Guy Benyei11169dd2012-12-18 14:30:41 +00003195 if (F.LocalNumIdentifiers > 0) {
3196 // Introduce the global -> local mapping for identifiers within this
3197 // module.
David L. Jonesc4808b9e2016-12-15 20:53:26 +00003198 GlobalIdentifierMap.insert(std::make_pair(getTotalNumIdentifiers() + 1,
Guy Benyei11169dd2012-12-18 14:30:41 +00003199 &F));
David L. Jonesc4808b9e2016-12-15 20:53:26 +00003200
Guy Benyei11169dd2012-12-18 14:30:41 +00003201 // Introduce the local -> global mapping for identifiers within this
3202 // module.
3203 F.IdentifierRemap.insertOrReplace(
3204 std::make_pair(LocalBaseIdentifierID,
3205 F.BaseIdentifierID - LocalBaseIdentifierID));
Ben Langmuirfe971d92014-08-16 04:54:18 +00003206
Ben Langmuir52ca6782014-10-20 16:27:32 +00003207 IdentifiersLoaded.resize(IdentifiersLoaded.size()
3208 + F.LocalNumIdentifiers);
3209 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003210 break;
3211 }
3212
Richard Smith33e0f7e2015-07-22 02:08:40 +00003213 case INTERESTING_IDENTIFIERS:
3214 F.PreloadIdentifierOffsets.assign(Record.begin(), Record.end());
3215 break;
3216
Ben Langmuir332aafe2014-01-31 01:06:56 +00003217 case EAGERLY_DESERIALIZED_DECLS:
Richard Smith9e2341d2015-03-23 03:25:59 +00003218 // FIXME: Skip reading this record if our ASTConsumer doesn't care
3219 // about "interesting" decls (for instance, if we're building a module).
Guy Benyei11169dd2012-12-18 14:30:41 +00003220 for (unsigned I = 0, N = Record.size(); I != N; ++I)
Ben Langmuir332aafe2014-01-31 01:06:56 +00003221 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I]));
Guy Benyei11169dd2012-12-18 14:30:41 +00003222 break;
3223
David Blaikie9ffe5a32017-01-30 05:00:26 +00003224 case MODULAR_CODEGEN_DECLS:
3225 // FIXME: Skip reading this record if our ASTConsumer doesn't care about
3226 // them (ie: if we're not codegenerating this module).
Hans Wennborg7ea9a6e2020-02-27 14:33:43 +01003227 if (F.Kind == MK_MainFile)
David Blaikie9ffe5a32017-01-30 05:00:26 +00003228 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3229 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I]));
3230 break;
3231
Guy Benyei11169dd2012-12-18 14:30:41 +00003232 case SPECIAL_TYPES:
Douglas Gregor44180f82013-02-01 23:45:03 +00003233 if (SpecialTypes.empty()) {
3234 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3235 SpecialTypes.push_back(getGlobalTypeID(F, Record[I]));
3236 break;
3237 }
3238
3239 if (SpecialTypes.size() != Record.size()) {
3240 Error("invalid special-types record");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003241 return Failure;
Douglas Gregor44180f82013-02-01 23:45:03 +00003242 }
3243
3244 for (unsigned I = 0, N = Record.size(); I != N; ++I) {
3245 serialization::TypeID ID = getGlobalTypeID(F, Record[I]);
3246 if (!SpecialTypes[I])
3247 SpecialTypes[I] = ID;
3248 // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate
3249 // merge step?
3250 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003251 break;
3252
3253 case STATISTICS:
3254 TotalNumStatements += Record[0];
3255 TotalNumMacros += Record[1];
3256 TotalLexicalDeclContexts += Record[2];
3257 TotalVisibleDeclContexts += Record[3];
3258 break;
3259
3260 case UNUSED_FILESCOPED_DECLS:
3261 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3262 UnusedFileScopedDecls.push_back(getGlobalDeclID(F, Record[I]));
3263 break;
3264
3265 case DELEGATING_CTORS:
3266 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3267 DelegatingCtorDecls.push_back(getGlobalDeclID(F, Record[I]));
3268 break;
3269
3270 case WEAK_UNDECLARED_IDENTIFIERS:
3271 if (Record.size() % 4 != 0) {
3272 Error("invalid weak identifiers record");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003273 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003274 }
David L. Jonesc4808b9e2016-12-15 20:53:26 +00003275
3276 // FIXME: Ignore weak undeclared identifiers from non-original PCH
Guy Benyei11169dd2012-12-18 14:30:41 +00003277 // files. This isn't the way to do it :)
3278 WeakUndeclaredIdentifiers.clear();
David L. Jonesc4808b9e2016-12-15 20:53:26 +00003279
Guy Benyei11169dd2012-12-18 14:30:41 +00003280 // Translate the weak, undeclared identifiers into global IDs.
3281 for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) {
3282 WeakUndeclaredIdentifiers.push_back(
3283 getGlobalIdentifierID(F, Record[I++]));
3284 WeakUndeclaredIdentifiers.push_back(
3285 getGlobalIdentifierID(F, Record[I++]));
3286 WeakUndeclaredIdentifiers.push_back(
3287 ReadSourceLocation(F, Record, I).getRawEncoding());
3288 WeakUndeclaredIdentifiers.push_back(Record[I++]);
3289 }
3290 break;
3291
Guy Benyei11169dd2012-12-18 14:30:41 +00003292 case SELECTOR_OFFSETS: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00003293 F.SelectorOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003294 F.LocalNumSelectors = Record[0];
3295 unsigned LocalBaseSelectorID = Record[1];
3296 F.BaseSelectorID = getTotalNumSelectors();
David L. Jonesc4808b9e2016-12-15 20:53:26 +00003297
Guy Benyei11169dd2012-12-18 14:30:41 +00003298 if (F.LocalNumSelectors > 0) {
David L. Jonesc4808b9e2016-12-15 20:53:26 +00003299 // Introduce the global -> local mapping for selectors within this
Guy Benyei11169dd2012-12-18 14:30:41 +00003300 // module.
3301 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F));
David L. Jonesc4808b9e2016-12-15 20:53:26 +00003302
3303 // Introduce the local -> global mapping for selectors within this
Guy Benyei11169dd2012-12-18 14:30:41 +00003304 // module.
3305 F.SelectorRemap.insertOrReplace(
3306 std::make_pair(LocalBaseSelectorID,
3307 F.BaseSelectorID - LocalBaseSelectorID));
Ben Langmuir52ca6782014-10-20 16:27:32 +00003308
3309 SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors);
Guy Benyei11169dd2012-12-18 14:30:41 +00003310 }
3311 break;
3312 }
David L. Jonesc4808b9e2016-12-15 20:53:26 +00003313
Guy Benyei11169dd2012-12-18 14:30:41 +00003314 case METHOD_POOL:
Chris Lattner0e6c9402013-01-20 02:38:54 +00003315 F.SelectorLookupTableData = (const unsigned char *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003316 if (Record[0])
3317 F.SelectorLookupTable
3318 = ASTSelectorLookupTable::Create(
3319 F.SelectorLookupTableData + Record[0],
3320 F.SelectorLookupTableData,
3321 ASTSelectorLookupTrait(*this, F));
3322 TotalNumMethodPoolEntries += Record[1];
3323 break;
3324
3325 case REFERENCED_SELECTOR_POOL:
3326 if (!Record.empty()) {
3327 for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) {
David L. Jonesc4808b9e2016-12-15 20:53:26 +00003328 ReferencedSelectorsData.push_back(getGlobalSelectorID(F,
Guy Benyei11169dd2012-12-18 14:30:41 +00003329 Record[Idx++]));
3330 ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx).
3331 getRawEncoding());
3332 }
3333 }
3334 break;
3335
Erik Verbruggenb34c79f2017-05-30 11:54:55 +00003336 case PP_CONDITIONAL_STACK:
3337 if (!Record.empty()) {
Erik Verbruggen4d1eb2d2017-11-03 09:40:07 +00003338 unsigned Idx = 0, End = Record.size() - 1;
3339 bool ReachedEOFWhileSkipping = Record[Idx++];
3340 llvm::Optional<Preprocessor::PreambleSkipInfo> SkipInfo;
3341 if (ReachedEOFWhileSkipping) {
3342 SourceLocation HashToken = ReadSourceLocation(F, Record, Idx);
3343 SourceLocation IfTokenLoc = ReadSourceLocation(F, Record, Idx);
3344 bool FoundNonSkipPortion = Record[Idx++];
3345 bool FoundElse = Record[Idx++];
3346 SourceLocation ElseLoc = ReadSourceLocation(F, Record, Idx);
3347 SkipInfo.emplace(HashToken, IfTokenLoc, FoundNonSkipPortion,
3348 FoundElse, ElseLoc);
3349 }
Erik Verbruggenb34c79f2017-05-30 11:54:55 +00003350 SmallVector<PPConditionalInfo, 4> ConditionalStack;
Erik Verbruggen4d1eb2d2017-11-03 09:40:07 +00003351 while (Idx < End) {
Erik Verbruggenb34c79f2017-05-30 11:54:55 +00003352 auto Loc = ReadSourceLocation(F, Record, Idx);
3353 bool WasSkipping = Record[Idx++];
3354 bool FoundNonSkip = Record[Idx++];
3355 bool FoundElse = Record[Idx++];
3356 ConditionalStack.push_back(
3357 {Loc, WasSkipping, FoundNonSkip, FoundElse});
3358 }
Erik Verbruggen4d1eb2d2017-11-03 09:40:07 +00003359 PP.setReplayablePreambleConditionalStack(ConditionalStack, SkipInfo);
Erik Verbruggenb34c79f2017-05-30 11:54:55 +00003360 }
3361 break;
3362
Guy Benyei11169dd2012-12-18 14:30:41 +00003363 case PP_COUNTER_VALUE:
3364 if (!Record.empty() && Listener)
3365 Listener->ReadCounter(F, Record[0]);
3366 break;
David L. Jonesc4808b9e2016-12-15 20:53:26 +00003367
Guy Benyei11169dd2012-12-18 14:30:41 +00003368 case FILE_SORTED_DECLS:
Chris Lattner0e6c9402013-01-20 02:38:54 +00003369 F.FileSortedDecls = (const DeclID *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003370 F.NumFileSortedDecls = Record[0];
3371 break;
3372
3373 case SOURCE_LOCATION_OFFSETS: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00003374 F.SLocEntryOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003375 F.LocalNumSLocEntries = Record[0];
3376 unsigned SLocSpaceSize = Record[1];
Benjamin Kramer867ea1d2014-03-02 13:01:17 +00003377 std::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) =
Ben Langmuir52ca6782014-10-20 16:27:32 +00003378 SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries,
Guy Benyei11169dd2012-12-18 14:30:41 +00003379 SLocSpaceSize);
Richard Smith78d81ec2015-08-12 22:25:24 +00003380 if (!F.SLocEntryBaseID) {
3381 Error("ran out of source locations");
3382 break;
3383 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003384 // Make our entry in the range map. BaseID is negative and growing, so
3385 // we invert it. Because we invert it, though, we need the other end of
3386 // the range.
3387 unsigned RangeStart =
3388 unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1;
3389 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F));
3390 F.FirstLoc = SourceLocation::getFromRawEncoding(F.SLocEntryBaseOffset);
3391
3392 // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing.
3393 assert((F.SLocEntryBaseOffset & (1U << 31U)) == 0);
3394 GlobalSLocOffsetMap.insert(
3395 std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset
3396 - SLocSpaceSize,&F));
3397
3398 // Initialize the remapping table.
3399 // Invalid stays invalid.
Richard Smithb9eab6d2014-03-20 19:44:17 +00003400 F.SLocRemap.insertOrReplace(std::make_pair(0U, 0));
Guy Benyei11169dd2012-12-18 14:30:41 +00003401 // This module. Base was 2 when being compiled.
Richard Smithb9eab6d2014-03-20 19:44:17 +00003402 F.SLocRemap.insertOrReplace(std::make_pair(2U,
Guy Benyei11169dd2012-12-18 14:30:41 +00003403 static_cast<int>(F.SLocEntryBaseOffset - 2)));
David L. Jonesc4808b9e2016-12-15 20:53:26 +00003404
Guy Benyei11169dd2012-12-18 14:30:41 +00003405 TotalNumSLocEntries += F.LocalNumSLocEntries;
3406 break;
3407 }
3408
Richard Smith37a93df2017-02-18 00:32:02 +00003409 case MODULE_OFFSET_MAP:
3410 F.ModuleOffsetMap = Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00003411 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00003412
3413 case SOURCE_MANAGER_LINE_TABLE:
Duncan P. N. Exon Smith8e2c1922019-11-10 11:07:20 -08003414 if (ParseLineTable(F, Record)) {
3415 Error("malformed SOURCE_MANAGER_LINE_TABLE in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003416 return Failure;
Duncan P. N. Exon Smith8e2c1922019-11-10 11:07:20 -08003417 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003418 break;
3419
3420 case SOURCE_LOCATION_PRELOADS: {
3421 // Need to transform from the local view (1-based IDs) to the global view,
3422 // which is based off F.SLocEntryBaseID.
3423 if (!F.PreloadSLocEntries.empty()) {
3424 Error("Multiple SOURCE_LOCATION_PRELOADS records in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003425 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003426 }
David L. Jonesc4808b9e2016-12-15 20:53:26 +00003427
Guy Benyei11169dd2012-12-18 14:30:41 +00003428 F.PreloadSLocEntries.swap(Record);
3429 break;
3430 }
3431
3432 case EXT_VECTOR_DECLS:
3433 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3434 ExtVectorDecls.push_back(getGlobalDeclID(F, Record[I]));
3435 break;
3436
3437 case VTABLE_USES:
3438 if (Record.size() % 3 != 0) {
3439 Error("Invalid VTABLE_USES record");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003440 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003441 }
David L. Jonesc4808b9e2016-12-15 20:53:26 +00003442
Guy Benyei11169dd2012-12-18 14:30:41 +00003443 // Later tables overwrite earlier ones.
3444 // FIXME: Modules will have some trouble with this. This is clearly not
3445 // the right way to do this.
3446 VTableUses.clear();
David L. Jonesc4808b9e2016-12-15 20:53:26 +00003447
Guy Benyei11169dd2012-12-18 14:30:41 +00003448 for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) {
3449 VTableUses.push_back(getGlobalDeclID(F, Record[Idx++]));
3450 VTableUses.push_back(
3451 ReadSourceLocation(F, Record, Idx).getRawEncoding());
3452 VTableUses.push_back(Record[Idx++]);
3453 }
3454 break;
3455
Guy Benyei11169dd2012-12-18 14:30:41 +00003456 case PENDING_IMPLICIT_INSTANTIATIONS:
3457 if (PendingInstantiations.size() % 2 != 0) {
3458 Error("Invalid existing PendingInstantiations");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003459 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003460 }
3461
3462 if (Record.size() % 2 != 0) {
3463 Error("Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003464 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003465 }
3466
3467 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
3468 PendingInstantiations.push_back(getGlobalDeclID(F, Record[I++]));
3469 PendingInstantiations.push_back(
3470 ReadSourceLocation(F, Record, I).getRawEncoding());
3471 }
3472 break;
3473
3474 case SEMA_DECL_REFS:
Richard Smith96269c52016-09-29 22:49:46 +00003475 if (Record.size() != 3) {
Richard Smith3d8e97e2013-10-18 06:54:39 +00003476 Error("Invalid SEMA_DECL_REFS block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003477 return Failure;
Richard Smith3d8e97e2013-10-18 06:54:39 +00003478 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003479 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3480 SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
3481 break;
3482
3483 case PPD_ENTITIES_OFFSETS: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00003484 F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data();
3485 assert(Blob.size() % sizeof(PPEntityOffset) == 0);
3486 F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset);
Guy Benyei11169dd2012-12-18 14:30:41 +00003487
3488 unsigned LocalBasePreprocessedEntityID = Record[0];
David L. Jonesc4808b9e2016-12-15 20:53:26 +00003489
Guy Benyei11169dd2012-12-18 14:30:41 +00003490 unsigned StartingID;
3491 if (!PP.getPreprocessingRecord())
3492 PP.createPreprocessingRecord();
3493 if (!PP.getPreprocessingRecord()->getExternalSource())
3494 PP.getPreprocessingRecord()->SetExternalSource(*this);
David L. Jonesc4808b9e2016-12-15 20:53:26 +00003495 StartingID
Guy Benyei11169dd2012-12-18 14:30:41 +00003496 = PP.getPreprocessingRecord()
Ben Langmuir52ca6782014-10-20 16:27:32 +00003497 ->allocateLoadedEntities(F.NumPreprocessedEntities);
Guy Benyei11169dd2012-12-18 14:30:41 +00003498 F.BasePreprocessedEntityID = StartingID;
3499
3500 if (F.NumPreprocessedEntities > 0) {
3501 // Introduce the global -> local mapping for preprocessed entities in
3502 // this module.
3503 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
David L. Jonesc4808b9e2016-12-15 20:53:26 +00003504
Guy Benyei11169dd2012-12-18 14:30:41 +00003505 // Introduce the local -> global mapping for preprocessed entities in
3506 // this module.
3507 F.PreprocessedEntityRemap.insertOrReplace(
3508 std::make_pair(LocalBasePreprocessedEntityID,
3509 F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID));
3510 }
3511
3512 break;
3513 }
David L. Jonesc4808b9e2016-12-15 20:53:26 +00003514
Cameron Desrochersb60f1b62018-01-15 19:14:16 +00003515 case PPD_SKIPPED_RANGES: {
3516 F.PreprocessedSkippedRangeOffsets = (const PPSkippedRange*)Blob.data();
3517 assert(Blob.size() % sizeof(PPSkippedRange) == 0);
3518 F.NumPreprocessedSkippedRanges = Blob.size() / sizeof(PPSkippedRange);
3519
3520 if (!PP.getPreprocessingRecord())
3521 PP.createPreprocessingRecord();
3522 if (!PP.getPreprocessingRecord()->getExternalSource())
3523 PP.getPreprocessingRecord()->SetExternalSource(*this);
3524 F.BasePreprocessedSkippedRangeID = PP.getPreprocessingRecord()
3525 ->allocateSkippedRanges(F.NumPreprocessedSkippedRanges);
Jonas Devlieghere560ce2c2018-02-26 15:16:42 +00003526
Cameron Desrochersb60f1b62018-01-15 19:14:16 +00003527 if (F.NumPreprocessedSkippedRanges > 0)
3528 GlobalSkippedRangeMap.insert(
3529 std::make_pair(F.BasePreprocessedSkippedRangeID, &F));
3530 break;
3531 }
3532
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00003533 case DECL_UPDATE_OFFSETS:
Guy Benyei11169dd2012-12-18 14:30:41 +00003534 if (Record.size() % 2 != 0) {
3535 Error("invalid DECL_UPDATE_OFFSETS block in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003536 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003537 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00003538 for (unsigned I = 0, N = Record.size(); I != N; I += 2) {
3539 GlobalDeclID ID = getGlobalDeclID(F, Record[I]);
3540 DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I + 1]));
3541
3542 // If we've already loaded the decl, perform the updates when we finish
3543 // loading this block.
3544 if (Decl *D = GetExistingDecl(ID))
Vassil Vassilev74c3e8c2017-05-19 16:46:06 +00003545 PendingUpdateRecords.push_back(
3546 PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
Richard Smithcd45dbc2014-04-19 03:48:30 +00003547 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003548 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00003549
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00003550 case OBJC_CATEGORIES_MAP:
Guy Benyei11169dd2012-12-18 14:30:41 +00003551 if (F.LocalNumObjCCategoriesInMap != 0) {
3552 Error("duplicate OBJC_CATEGORIES_MAP record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003553 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003554 }
David L. Jonesc4808b9e2016-12-15 20:53:26 +00003555
Guy Benyei11169dd2012-12-18 14:30:41 +00003556 F.LocalNumObjCCategoriesInMap = Record[0];
Chris Lattner0e6c9402013-01-20 02:38:54 +00003557 F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003558 break;
David L. Jonesc4808b9e2016-12-15 20:53:26 +00003559
Guy Benyei11169dd2012-12-18 14:30:41 +00003560 case OBJC_CATEGORIES:
3561 F.ObjCCategories.swap(Record);
3562 break;
Richard Smithc2bb8182015-03-24 06:36:48 +00003563
Guy Benyei11169dd2012-12-18 14:30:41 +00003564 case CUDA_SPECIAL_DECL_REFS:
3565 // Later tables overwrite earlier ones.
3566 // FIXME: Modules will have trouble with this.
3567 CUDASpecialDeclRefs.clear();
3568 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3569 CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
3570 break;
3571
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00003572 case HEADER_SEARCH_TABLE:
Chris Lattner0e6c9402013-01-20 02:38:54 +00003573 F.HeaderFileInfoTableData = Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003574 F.LocalNumHeaderFileInfos = Record[1];
Guy Benyei11169dd2012-12-18 14:30:41 +00003575 if (Record[0]) {
3576 F.HeaderFileInfoTable
3577 = HeaderFileInfoLookupTable::Create(
3578 (const unsigned char *)F.HeaderFileInfoTableData + Record[0],
3579 (const unsigned char *)F.HeaderFileInfoTableData,
David L. Jonesc4808b9e2016-12-15 20:53:26 +00003580 HeaderFileInfoTrait(*this, F,
Guy Benyei11169dd2012-12-18 14:30:41 +00003581 &PP.getHeaderSearchInfo(),
Chris Lattner0e6c9402013-01-20 02:38:54 +00003582 Blob.data() + Record[2]));
David L. Jonesc4808b9e2016-12-15 20:53:26 +00003583
Guy Benyei11169dd2012-12-18 14:30:41 +00003584 PP.getHeaderSearchInfo().SetExternalSource(this);
3585 if (!PP.getHeaderSearchInfo().getExternalLookup())
3586 PP.getHeaderSearchInfo().SetExternalLookup(this);
3587 }
3588 break;
David L. Jonesc4808b9e2016-12-15 20:53:26 +00003589
Guy Benyei11169dd2012-12-18 14:30:41 +00003590 case FP_PRAGMA_OPTIONS:
3591 // Later tables overwrite earlier ones.
3592 FPPragmaOptions.swap(Record);
3593 break;
3594
3595 case OPENCL_EXTENSIONS:
Yaxun Liu5b746652016-12-18 05:18:55 +00003596 for (unsigned I = 0, E = Record.size(); I != E; ) {
3597 auto Name = ReadString(Record, I);
3598 auto &Opt = OpenCLExtensions.OptMap[Name];
Yaxun Liucc2741c2016-12-18 06:35:06 +00003599 Opt.Supported = Record[I++] != 0;
3600 Opt.Enabled = Record[I++] != 0;
Yaxun Liu5b746652016-12-18 05:18:55 +00003601 Opt.Avail = Record[I++];
3602 Opt.Core = Record[I++];
3603 }
3604 break;
3605
3606 case OPENCL_EXTENSION_TYPES:
3607 for (unsigned I = 0, E = Record.size(); I != E;) {
3608 auto TypeID = static_cast<::TypeID>(Record[I++]);
3609 auto *Type = GetType(TypeID).getTypePtr();
3610 auto NumExt = static_cast<unsigned>(Record[I++]);
3611 for (unsigned II = 0; II != NumExt; ++II) {
3612 auto Ext = ReadString(Record, I);
3613 OpenCLTypeExtMap[Type].insert(Ext);
3614 }
3615 }
3616 break;
3617
3618 case OPENCL_EXTENSION_DECLS:
3619 for (unsigned I = 0, E = Record.size(); I != E;) {
3620 auto DeclID = static_cast<::DeclID>(Record[I++]);
3621 auto *Decl = GetDecl(DeclID);
3622 auto NumExt = static_cast<unsigned>(Record[I++]);
3623 for (unsigned II = 0; II != NumExt; ++II) {
3624 auto Ext = ReadString(Record, I);
3625 OpenCLDeclExtMap[Decl].insert(Ext);
3626 }
3627 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003628 break;
3629
3630 case TENTATIVE_DEFINITIONS:
3631 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3632 TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I]));
3633 break;
David L. Jonesc4808b9e2016-12-15 20:53:26 +00003634
Guy Benyei11169dd2012-12-18 14:30:41 +00003635 case KNOWN_NAMESPACES:
3636 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3637 KnownNamespaces.push_back(getGlobalDeclID(F, Record[I]));
3638 break;
Nick Lewycky8334af82013-01-26 00:35:08 +00003639
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00003640 case UNDEFINED_BUT_USED:
3641 if (UndefinedButUsed.size() % 2 != 0) {
3642 Error("Invalid existing UndefinedButUsed");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003643 return Failure;
Nick Lewycky8334af82013-01-26 00:35:08 +00003644 }
3645
3646 if (Record.size() % 2 != 0) {
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00003647 Error("invalid undefined-but-used record");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003648 return Failure;
Nick Lewycky8334af82013-01-26 00:35:08 +00003649 }
3650 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00003651 UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++]));
3652 UndefinedButUsed.push_back(
Nick Lewycky8334af82013-01-26 00:35:08 +00003653 ReadSourceLocation(F, Record, I).getRawEncoding());
3654 }
3655 break;
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00003656
Ismail Pazarbasie5768d12015-05-18 19:59:11 +00003657 case DELETE_EXPRS_TO_ANALYZE:
3658 for (unsigned I = 0, N = Record.size(); I != N;) {
3659 DelayedDeleteExprs.push_back(getGlobalDeclID(F, Record[I++]));
3660 const uint64_t Count = Record[I++];
3661 DelayedDeleteExprs.push_back(Count);
3662 for (uint64_t C = 0; C < Count; ++C) {
3663 DelayedDeleteExprs.push_back(ReadSourceLocation(F, Record, I).getRawEncoding());
3664 bool IsArrayForm = Record[I++] == 1;
3665 DelayedDeleteExprs.push_back(IsArrayForm);
3666 }
3667 }
3668 break;
Nick Lewycky8334af82013-01-26 00:35:08 +00003669
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00003670 case IMPORTED_MODULES:
Manman Ren11f2a472016-08-18 17:42:15 +00003671 if (!F.isModule()) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003672 // If we aren't loading a module (which has its own exports), make
3673 // all of the imported modules visible.
3674 // FIXME: Deal with macros-only imports.
Richard Smith56be7542014-03-21 00:33:59 +00003675 for (unsigned I = 0, N = Record.size(); I != N; /**/) {
3676 unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]);
3677 SourceLocation Loc = ReadSourceLocation(F, Record, I);
Graydon Hoare9c982442017-01-18 20:36:59 +00003678 if (GlobalID) {
Aaron Ballman4f45b712014-03-21 15:22:56 +00003679 ImportedModules.push_back(ImportedSubmodule(GlobalID, Loc));
Graydon Hoare9c982442017-01-18 20:36:59 +00003680 if (DeserializationListener)
3681 DeserializationListener->ModuleImportRead(GlobalID, Loc);
3682 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003683 }
3684 }
3685 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00003686
Guy Benyei11169dd2012-12-18 14:30:41 +00003687 case MACRO_OFFSET: {
3688 if (F.LocalNumMacros != 0) {
3689 Error("duplicate MACRO_OFFSET record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003690 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003691 }
Chris Lattner0e6c9402013-01-20 02:38:54 +00003692 F.MacroOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003693 F.LocalNumMacros = Record[0];
3694 unsigned LocalBaseMacroID = Record[1];
3695 F.BaseMacroID = getTotalNumMacros();
3696
3697 if (F.LocalNumMacros > 0) {
3698 // Introduce the global -> local mapping for macros within this module.
3699 GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F));
3700
3701 // Introduce the local -> global mapping for macros within this module.
3702 F.MacroRemap.insertOrReplace(
3703 std::make_pair(LocalBaseMacroID,
3704 F.BaseMacroID - LocalBaseMacroID));
Ben Langmuir52ca6782014-10-20 16:27:32 +00003705
3706 MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros);
Guy Benyei11169dd2012-12-18 14:30:41 +00003707 }
3708 break;
3709 }
3710
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00003711 case LATE_PARSED_TEMPLATE:
Richard Smithe40f2ba2013-08-07 21:41:30 +00003712 LateParsedTemplates.append(Record.begin(), Record.end());
3713 break;
Dario Domizioli13a0a382014-05-23 12:13:25 +00003714
3715 case OPTIMIZE_PRAGMA_OPTIONS:
3716 if (Record.size() != 1) {
3717 Error("invalid pragma optimize record");
3718 return Failure;
3719 }
3720 OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]);
3721 break;
Nico Weber72889432014-09-06 01:25:55 +00003722
Nico Weber779355f2016-03-02 23:22:00 +00003723 case MSSTRUCT_PRAGMA_OPTIONS:
3724 if (Record.size() != 1) {
3725 Error("invalid pragma ms_struct record");
3726 return Failure;
3727 }
3728 PragmaMSStructState = Record[0];
3729 break;
3730
Nico Weber42932312016-03-03 00:17:35 +00003731 case POINTERS_TO_MEMBERS_PRAGMA_OPTIONS:
3732 if (Record.size() != 2) {
3733 Error("invalid pragma ms_struct record");
3734 return Failure;
3735 }
3736 PragmaMSPointersToMembersState = Record[0];
3737 PointersToMembersPragmaLocation = ReadSourceLocation(F, Record[1]);
3738 break;
3739
Nico Weber72889432014-09-06 01:25:55 +00003740 case UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES:
3741 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3742 UnusedLocalTypedefNameCandidates.push_back(
3743 getGlobalDeclID(F, Record[I]));
3744 break;
Justin Lebar67a78a62016-10-08 22:15:58 +00003745
3746 case CUDA_PRAGMA_FORCE_HOST_DEVICE_DEPTH:
3747 if (Record.size() != 1) {
3748 Error("invalid cuda pragma options record");
3749 return Failure;
3750 }
3751 ForceCUDAHostDeviceDepth = Record[0];
3752 break;
Alex Lorenz7d7e1e02017-03-31 15:36:21 +00003753
3754 case PACK_PRAGMA_OPTIONS: {
3755 if (Record.size() < 3) {
3756 Error("invalid pragma pack record");
3757 return Failure;
3758 }
3759 PragmaPackCurrentValue = Record[0];
3760 PragmaPackCurrentLocation = ReadSourceLocation(F, Record[1]);
3761 unsigned NumStackEntries = Record[2];
3762 unsigned Idx = 3;
3763 // Reset the stack when importing a new module.
3764 PragmaPackStack.clear();
3765 for (unsigned I = 0; I < NumStackEntries; ++I) {
3766 PragmaPackStackEntry Entry;
3767 Entry.Value = Record[Idx++];
3768 Entry.Location = ReadSourceLocation(F, Record[Idx++]);
Alex Lorenz45b40142017-07-28 14:41:21 +00003769 Entry.PushLocation = ReadSourceLocation(F, Record[Idx++]);
Alex Lorenz7d7e1e02017-03-31 15:36:21 +00003770 PragmaPackStrings.push_back(ReadString(Record, Idx));
3771 Entry.SlotLabel = PragmaPackStrings.back();
3772 PragmaPackStack.push_back(Entry);
3773 }
3774 break;
3775 }
Yaxun (Sam) Liub670ab72020-02-26 10:57:39 -05003776
3777 case DECLS_TO_CHECK_FOR_DEFERRED_DIAGS:
3778 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3779 DeclsToCheckForDeferredDiags.push_back(getGlobalDeclID(F, Record[I]));
3780 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00003781 }
3782 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003783}
3784
Richard Smith37a93df2017-02-18 00:32:02 +00003785void ASTReader::ReadModuleOffsetMap(ModuleFile &F) const {
3786 assert(!F.ModuleOffsetMap.empty() && "no module offset map to read");
3787
3788 // Additional remapping information.
Vedant Kumar48b4f762018-04-14 01:40:48 +00003789 const unsigned char *Data = (const unsigned char*)F.ModuleOffsetMap.data();
Richard Smith37a93df2017-02-18 00:32:02 +00003790 const unsigned char *DataEnd = Data + F.ModuleOffsetMap.size();
3791 F.ModuleOffsetMap = StringRef();
3792
3793 // If we see this entry before SOURCE_LOCATION_OFFSETS, add placeholders.
3794 if (F.SLocRemap.find(0) == F.SLocRemap.end()) {
3795 F.SLocRemap.insert(std::make_pair(0U, 0));
3796 F.SLocRemap.insert(std::make_pair(2U, 1));
3797 }
3798
3799 // Continuous range maps we may be updating in our module.
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00003800 using RemapBuilder = ContinuousRangeMap<uint32_t, int, 2>::Builder;
Richard Smith37a93df2017-02-18 00:32:02 +00003801 RemapBuilder SLocRemap(F.SLocRemap);
3802 RemapBuilder IdentifierRemap(F.IdentifierRemap);
3803 RemapBuilder MacroRemap(F.MacroRemap);
3804 RemapBuilder PreprocessedEntityRemap(F.PreprocessedEntityRemap);
3805 RemapBuilder SubmoduleRemap(F.SubmoduleRemap);
3806 RemapBuilder SelectorRemap(F.SelectorRemap);
3807 RemapBuilder DeclRemap(F.DeclRemap);
3808 RemapBuilder TypeRemap(F.TypeRemap);
3809
3810 while (Data < DataEnd) {
Boris Kolpackovd30446f2017-08-31 06:26:43 +00003811 // FIXME: Looking up dependency modules by filename is horrible. Let's
3812 // start fixing this with prebuilt and explicit modules and see how it
3813 // goes...
Richard Smith37a93df2017-02-18 00:32:02 +00003814 using namespace llvm::support;
Vedant Kumar48b4f762018-04-14 01:40:48 +00003815 ModuleKind Kind = static_cast<ModuleKind>(
3816 endian::readNext<uint8_t, little, unaligned>(Data));
Richard Smith37a93df2017-02-18 00:32:02 +00003817 uint16_t Len = endian::readNext<uint16_t, little, unaligned>(Data);
3818 StringRef Name = StringRef((const char*)Data, Len);
3819 Data += Len;
Boris Kolpackovd30446f2017-08-31 06:26:43 +00003820 ModuleFile *OM = (Kind == MK_PrebuiltModule || Kind == MK_ExplicitModule
3821 ? ModuleMgr.lookupByModuleName(Name)
3822 : ModuleMgr.lookupByFileName(Name));
Richard Smith37a93df2017-02-18 00:32:02 +00003823 if (!OM) {
3824 std::string Msg =
3825 "SourceLocation remap refers to unknown module, cannot find ";
Benjamin Krameradcd0262020-01-28 20:23:46 +01003826 Msg.append(std::string(Name));
Richard Smith37a93df2017-02-18 00:32:02 +00003827 Error(Msg);
3828 return;
3829 }
3830
3831 uint32_t SLocOffset =
3832 endian::readNext<uint32_t, little, unaligned>(Data);
3833 uint32_t IdentifierIDOffset =
3834 endian::readNext<uint32_t, little, unaligned>(Data);
3835 uint32_t MacroIDOffset =
3836 endian::readNext<uint32_t, little, unaligned>(Data);
3837 uint32_t PreprocessedEntityIDOffset =
3838 endian::readNext<uint32_t, little, unaligned>(Data);
3839 uint32_t SubmoduleIDOffset =
3840 endian::readNext<uint32_t, little, unaligned>(Data);
3841 uint32_t SelectorIDOffset =
3842 endian::readNext<uint32_t, little, unaligned>(Data);
3843 uint32_t DeclIDOffset =
3844 endian::readNext<uint32_t, little, unaligned>(Data);
3845 uint32_t TypeIndexOffset =
3846 endian::readNext<uint32_t, little, unaligned>(Data);
3847
3848 uint32_t None = std::numeric_limits<uint32_t>::max();
3849
3850 auto mapOffset = [&](uint32_t Offset, uint32_t BaseOffset,
3851 RemapBuilder &Remap) {
3852 if (Offset != None)
3853 Remap.insert(std::make_pair(Offset,
3854 static_cast<int>(BaseOffset - Offset)));
3855 };
3856 mapOffset(SLocOffset, OM->SLocEntryBaseOffset, SLocRemap);
3857 mapOffset(IdentifierIDOffset, OM->BaseIdentifierID, IdentifierRemap);
3858 mapOffset(MacroIDOffset, OM->BaseMacroID, MacroRemap);
3859 mapOffset(PreprocessedEntityIDOffset, OM->BasePreprocessedEntityID,
3860 PreprocessedEntityRemap);
3861 mapOffset(SubmoduleIDOffset, OM->BaseSubmoduleID, SubmoduleRemap);
3862 mapOffset(SelectorIDOffset, OM->BaseSelectorID, SelectorRemap);
3863 mapOffset(DeclIDOffset, OM->BaseDeclID, DeclRemap);
3864 mapOffset(TypeIndexOffset, OM->BaseTypeIndex, TypeRemap);
3865
3866 // Global -> local mappings.
3867 F.GlobalToLocalDeclIDs[OM] = DeclIDOffset;
3868 }
3869}
3870
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003871ASTReader::ASTReadResult
3872ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F,
3873 const ModuleFile *ImportedBy,
3874 unsigned ClientLoadCapabilities) {
3875 unsigned Idx = 0;
Richard Smith7ed1bc92014-12-05 22:42:13 +00003876 F.ModuleMapPath = ReadPath(F, Record, Idx);
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003877
3878 // Try to resolve ModuleName in the current header search context and
3879 // verify that it is found in the same module map file as we saved. If the
3880 // top-level AST file is a main file, skip this check because there is no
3881 // usable header search context.
3882 assert(!F.ModuleName.empty() &&
Richard Smithe842a472014-10-22 02:05:46 +00003883 "MODULE_NAME should come before MODULE_MAP_FILE");
Duncan P. N. Exon Smith96a06e02017-01-28 22:15:22 +00003884 if (F.Kind == MK_ImplicitModule && ModuleMgr.begin()->Kind != MK_MainFile) {
Richard Smithe842a472014-10-22 02:05:46 +00003885 // An implicitly-loaded module file should have its module listed in some
3886 // module map file that we've already loaded.
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003887 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName);
Richard Smithe842a472014-10-22 02:05:46 +00003888 auto &Map = PP.getHeaderSearchInfo().getModuleMap();
3889 const FileEntry *ModMap = M ? Map.getModuleMapFileForUniquing(M) : nullptr;
Yuka Takahashid8baec22018-08-01 09:50:02 +00003890 // Don't emit module relocation error if we have -fno-validate-pch
3891 if (!PP.getPreprocessorOpts().DisablePCHValidation && !ModMap) {
Richard Smith0f99d6a2015-08-09 08:48:41 +00003892 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) {
Bruno Cardoso Lopesa66a3252017-11-17 03:24:11 +00003893 if (auto *ASTFE = M ? M->getASTFile() : nullptr) {
Richard Smith0f99d6a2015-08-09 08:48:41 +00003894 // This module was defined by an imported (explicit) module.
3895 Diag(diag::err_module_file_conflict) << F.ModuleName << F.FileName
3896 << ASTFE->getName();
Bruno Cardoso Lopesa66a3252017-11-17 03:24:11 +00003897 } else {
Richard Smith0f99d6a2015-08-09 08:48:41 +00003898 // This module was built with a different module map.
3899 Diag(diag::err_imported_module_not_found)
Bruno Cardoso Lopes4625c182019-08-29 23:14:08 +00003900 << F.ModuleName << F.FileName
3901 << (ImportedBy ? ImportedBy->FileName : "") << F.ModuleMapPath
3902 << !ImportedBy;
Bruno Cardoso Lopesa66a3252017-11-17 03:24:11 +00003903 // In case it was imported by a PCH, there's a chance the user is
3904 // just missing to include the search path to the directory containing
3905 // the modulemap.
Bruno Cardoso Lopes4625c182019-08-29 23:14:08 +00003906 if (ImportedBy && ImportedBy->Kind == MK_PCH)
Bruno Cardoso Lopesa66a3252017-11-17 03:24:11 +00003907 Diag(diag::note_imported_by_pch_module_not_found)
3908 << llvm::sys::path::parent_path(F.ModuleMapPath);
3909 }
Richard Smith0f99d6a2015-08-09 08:48:41 +00003910 }
3911 return OutOfDate;
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003912 }
3913
Richard Smithe842a472014-10-22 02:05:46 +00003914 assert(M->Name == F.ModuleName && "found module with different name");
3915
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003916 // Check the primary module map file.
Harlan Haskins8d323d12019-08-01 21:31:56 +00003917 auto StoredModMap = FileMgr.getFile(F.ModuleMapPath);
3918 if (!StoredModMap || *StoredModMap != ModMap) {
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003919 assert(ModMap && "found module is missing module map file");
Bruno Cardoso Lopes4625c182019-08-29 23:14:08 +00003920 assert((ImportedBy || F.Kind == MK_ImplicitModule) &&
3921 "top-level import should be verified");
3922 bool NotImported = F.Kind == MK_ImplicitModule && !ImportedBy;
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003923 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3924 Diag(diag::err_imported_module_modmap_changed)
Bruno Cardoso Lopes4625c182019-08-29 23:14:08 +00003925 << F.ModuleName << (NotImported ? F.FileName : ImportedBy->FileName)
3926 << ModMap->getName() << F.ModuleMapPath << NotImported;
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003927 return OutOfDate;
3928 }
3929
3930 llvm::SmallPtrSet<const FileEntry *, 1> AdditionalStoredMaps;
3931 for (unsigned I = 0, N = Record[Idx++]; I < N; ++I) {
3932 // FIXME: we should use input files rather than storing names.
Richard Smith7ed1bc92014-12-05 22:42:13 +00003933 std::string Filename = ReadPath(F, Record, Idx);
Harlan Haskins8d323d12019-08-01 21:31:56 +00003934 auto F = FileMgr.getFile(Filename, false, false);
3935 if (!F) {
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003936 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3937 Error("could not find file '" + Filename +"' referenced by AST file");
3938 return OutOfDate;
3939 }
Harlan Haskins8d323d12019-08-01 21:31:56 +00003940 AdditionalStoredMaps.insert(*F);
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003941 }
3942
3943 // Check any additional module map files (e.g. module.private.modulemap)
3944 // that are not in the pcm.
3945 if (auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) {
Vedant Kumar48b4f762018-04-14 01:40:48 +00003946 for (const FileEntry *ModMap : *AdditionalModuleMaps) {
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003947 // Remove files that match
3948 // Note: SmallPtrSet::erase is really remove
3949 if (!AdditionalStoredMaps.erase(ModMap)) {
3950 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3951 Diag(diag::err_module_different_modmap)
3952 << F.ModuleName << /*new*/0 << ModMap->getName();
3953 return OutOfDate;
3954 }
3955 }
3956 }
3957
3958 // Check any additional module map files that are in the pcm, but not
3959 // found in header search. Cases that match are already removed.
Vedant Kumar48b4f762018-04-14 01:40:48 +00003960 for (const FileEntry *ModMap : AdditionalStoredMaps) {
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003961 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3962 Diag(diag::err_module_different_modmap)
3963 << F.ModuleName << /*not new*/1 << ModMap->getName();
3964 return OutOfDate;
3965 }
3966 }
3967
3968 if (Listener)
3969 Listener->ReadModuleMapFile(F.ModuleMapPath);
3970 return Success;
3971}
3972
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00003973/// Move the given method to the back of the global list of methods.
Douglas Gregorc1489562013-02-12 23:36:21 +00003974static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) {
3975 // Find the entry for this selector in the method pool.
3976 Sema::GlobalMethodPool::iterator Known
3977 = S.MethodPool.find(Method->getSelector());
3978 if (Known == S.MethodPool.end())
3979 return;
3980
3981 // Retrieve the appropriate method list.
3982 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
3983 : Known->second.second;
3984 bool Found = false;
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00003985 for (ObjCMethodList *List = &Start; List; List = List->getNext()) {
Douglas Gregorc1489562013-02-12 23:36:21 +00003986 if (!Found) {
Nico Weber2e0c8f72014-12-27 03:58:08 +00003987 if (List->getMethod() == Method) {
Douglas Gregorc1489562013-02-12 23:36:21 +00003988 Found = true;
3989 } else {
3990 // Keep searching.
3991 continue;
3992 }
3993 }
3994
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00003995 if (List->getNext())
Nico Weber2e0c8f72014-12-27 03:58:08 +00003996 List->setMethod(List->getNext()->getMethod());
Douglas Gregorc1489562013-02-12 23:36:21 +00003997 else
Nico Weber2e0c8f72014-12-27 03:58:08 +00003998 List->setMethod(Method);
Douglas Gregorc1489562013-02-12 23:36:21 +00003999 }
4000}
4001
Richard Smithde711422015-04-23 21:20:19 +00004002void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner) {
Richard Smith10434f32015-05-02 02:08:26 +00004003 assert(Owner->NameVisibility != Module::Hidden && "nothing to make visible?");
Vedant Kumar48b4f762018-04-14 01:40:48 +00004004 for (Decl *D : Names) {
Richard Smith90dc5252017-06-23 01:04:34 +00004005 bool wasHidden = D->isHidden();
4006 D->setVisibleDespiteOwningModule();
Guy Benyei11169dd2012-12-18 14:30:41 +00004007
Vedant Kumar48b4f762018-04-14 01:40:48 +00004008 if (wasHidden && SemaObj) {
4009 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) {
Richard Smith49f906a2014-03-01 00:08:04 +00004010 moveMethodToBackOfGlobalList(*SemaObj, Method);
Vedant Kumar48b4f762018-04-14 01:40:48 +00004011 }
4012 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004013 }
4014}
4015
Richard Smith49f906a2014-03-01 00:08:04 +00004016void ASTReader::makeModuleVisible(Module *Mod,
Argyrios Kyrtzidis125df052013-02-01 16:36:12 +00004017 Module::NameVisibilityKind NameVisibility,
Richard Smitha7e2cc62015-05-01 01:53:09 +00004018 SourceLocation ImportLoc) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004019 llvm::SmallPtrSet<Module *, 4> Visited;
Dmitri Gribenkof8579502013-01-12 19:30:44 +00004020 SmallVector<Module *, 4> Stack;
Robert Wilhelm25284cc2013-08-23 16:11:15 +00004021 Stack.push_back(Mod);
Guy Benyei11169dd2012-12-18 14:30:41 +00004022 while (!Stack.empty()) {
Robert Wilhelm25284cc2013-08-23 16:11:15 +00004023 Mod = Stack.pop_back_val();
Guy Benyei11169dd2012-12-18 14:30:41 +00004024
4025 if (NameVisibility <= Mod->NameVisibility) {
Robert Wilhelm25284cc2013-08-23 16:11:15 +00004026 // This module already has this level of visibility (or greater), so
Guy Benyei11169dd2012-12-18 14:30:41 +00004027 // there is nothing more to do.
4028 continue;
4029 }
Richard Smith49f906a2014-03-01 00:08:04 +00004030
Guy Benyei11169dd2012-12-18 14:30:41 +00004031 if (!Mod->isAvailable()) {
4032 // Modules that aren't available cannot be made visible.
4033 continue;
4034 }
4035
4036 // Update the module's name visibility.
4037 Mod->NameVisibility = NameVisibility;
Richard Smith49f906a2014-03-01 00:08:04 +00004038
Guy Benyei11169dd2012-12-18 14:30:41 +00004039 // If we've already deserialized any names from this module,
4040 // mark them as visible.
4041 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
4042 if (Hidden != HiddenNamesMap.end()) {
Richard Smith57721ac2014-07-21 04:10:40 +00004043 auto HiddenNames = std::move(*Hidden);
Guy Benyei11169dd2012-12-18 14:30:41 +00004044 HiddenNamesMap.erase(Hidden);
Richard Smithde711422015-04-23 21:20:19 +00004045 makeNamesVisible(HiddenNames.second, HiddenNames.first);
Richard Smith57721ac2014-07-21 04:10:40 +00004046 assert(HiddenNamesMap.find(Mod) == HiddenNamesMap.end() &&
4047 "making names visible added hidden names");
Guy Benyei11169dd2012-12-18 14:30:41 +00004048 }
Dmitri Gribenkoe9bcf5b2013-11-04 21:51:33 +00004049
Guy Benyei11169dd2012-12-18 14:30:41 +00004050 // Push any exported modules onto the stack to be marked as visible.
Argyrios Kyrtzidis8739f7b2013-02-19 19:34:40 +00004051 SmallVector<Module *, 16> Exports;
4052 Mod->getExportedModules(Exports);
Vedant Kumar48b4f762018-04-14 01:40:48 +00004053 for (SmallVectorImpl<Module *>::iterator
4054 I = Exports.begin(), E = Exports.end(); I != E; ++I) {
4055 Module *Exported = *I;
David Blaikie82e95a32014-11-19 07:49:47 +00004056 if (Visited.insert(Exported).second)
Argyrios Kyrtzidis8739f7b2013-02-19 19:34:40 +00004057 Stack.push_back(Exported);
Vedant Kumar48b4f762018-04-14 01:40:48 +00004058 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004059 }
4060}
4061
Richard Smith6561f922016-09-12 21:06:40 +00004062/// We've merged the definition \p MergedDef into the existing definition
4063/// \p Def. Ensure that \p Def is made visible whenever \p MergedDef is made
4064/// visible.
4065void ASTReader::mergeDefinitionVisibility(NamedDecl *Def,
4066 NamedDecl *MergedDef) {
Richard Smith6561f922016-09-12 21:06:40 +00004067 if (Def->isHidden()) {
4068 // If MergedDef is visible or becomes visible, make the definition visible.
Benjamin Kramera72a70a2016-10-17 13:00:44 +00004069 if (!MergedDef->isHidden())
Richard Smith90dc5252017-06-23 01:04:34 +00004070 Def->setVisibleDespiteOwningModule();
Richard Smith13897eb2018-09-12 23:37:00 +00004071 else {
Benjamin Kramera72a70a2016-10-17 13:00:44 +00004072 getContext().mergeDefinitionIntoModule(
4073 Def, MergedDef->getImportedOwningModule(),
4074 /*NotifyListeners*/ false);
4075 PendingMergedDefinitionsToDeduplicate.insert(Def);
Benjamin Kramera72a70a2016-10-17 13:00:44 +00004076 }
Richard Smith6561f922016-09-12 21:06:40 +00004077 }
4078}
4079
Douglas Gregore060e572013-01-25 01:03:03 +00004080bool ASTReader::loadGlobalIndex() {
4081 if (GlobalIndex)
4082 return false;
4083
4084 if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
Richard Smithdbafb6c2017-06-29 23:23:46 +00004085 !PP.getLangOpts().Modules)
Douglas Gregore060e572013-01-25 01:03:03 +00004086 return true;
David L. Jonesc4808b9e2016-12-15 20:53:26 +00004087
Douglas Gregore060e572013-01-25 01:03:03 +00004088 // Try to load the global index.
4089 TriedLoadingGlobalIndex = true;
4090 StringRef ModuleCachePath
4091 = getPreprocessor().getHeaderSearchInfo().getModuleCachePath();
JF Bastien0e828952019-06-26 19:50:12 +00004092 std::pair<GlobalModuleIndex *, llvm::Error> Result =
4093 GlobalModuleIndex::readIndex(ModuleCachePath);
4094 if (llvm::Error Err = std::move(Result.second)) {
4095 assert(!Result.first);
4096 consumeError(std::move(Err)); // FIXME this drops errors on the floor.
Douglas Gregore060e572013-01-25 01:03:03 +00004097 return true;
JF Bastien0e828952019-06-26 19:50:12 +00004098 }
Douglas Gregore060e572013-01-25 01:03:03 +00004099
4100 GlobalIndex.reset(Result.first);
Douglas Gregor7211ac12013-01-25 23:32:03 +00004101 ModuleMgr.setGlobalIndex(GlobalIndex.get());
Douglas Gregore060e572013-01-25 01:03:03 +00004102 return false;
4103}
4104
4105bool ASTReader::isGlobalIndexUnavailable() const {
Richard Smithdbafb6c2017-06-29 23:23:46 +00004106 return PP.getLangOpts().Modules && UseGlobalIndex &&
Douglas Gregore060e572013-01-25 01:03:03 +00004107 !hasGlobalIndex() && TriedLoadingGlobalIndex;
4108}
4109
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004110static void updateModuleTimestamp(ModuleFile &MF) {
4111 // Overwrite the timestamp file contents so that file's mtime changes.
4112 std::string TimestampFilename = MF.getTimestampFilename();
Rafael Espindoladae941a2014-08-25 18:17:04 +00004113 std::error_code EC;
Fangrui Songd9b948b2019-08-05 05:43:48 +00004114 llvm::raw_fd_ostream OS(TimestampFilename, EC, llvm::sys::fs::OF_Text);
Rafael Espindoladae941a2014-08-25 18:17:04 +00004115 if (EC)
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004116 return;
4117 OS << "Timestamp file\n";
Alex Lorenz0bafa022017-06-02 10:36:56 +00004118 OS.close();
4119 OS.clear_error(); // Avoid triggering a fatal error.
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004120}
4121
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00004122/// Given a cursor at the start of an AST file, scan ahead and drop the
Douglas Gregor6623e1f2015-11-03 18:33:07 +00004123/// cursor into the start of the given block ID, returning false on success and
4124/// true on failure.
4125static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) {
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00004126 while (true) {
JF Bastien0e828952019-06-26 19:50:12 +00004127 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance();
4128 if (!MaybeEntry) {
4129 // FIXME this drops errors on the floor.
4130 consumeError(MaybeEntry.takeError());
4131 return true;
4132 }
4133 llvm::BitstreamEntry Entry = MaybeEntry.get();
4134
Douglas Gregor6623e1f2015-11-03 18:33:07 +00004135 switch (Entry.Kind) {
4136 case llvm::BitstreamEntry::Error:
4137 case llvm::BitstreamEntry::EndBlock:
4138 return true;
4139
4140 case llvm::BitstreamEntry::Record:
4141 // Ignore top-level records.
JF Bastien0e828952019-06-26 19:50:12 +00004142 if (Expected<unsigned> Skipped = Cursor.skipRecord(Entry.ID))
4143 break;
4144 else {
4145 // FIXME this drops errors on the floor.
4146 consumeError(Skipped.takeError());
4147 return true;
4148 }
Douglas Gregor6623e1f2015-11-03 18:33:07 +00004149
4150 case llvm::BitstreamEntry::SubBlock:
4151 if (Entry.ID == BlockID) {
JF Bastien0e828952019-06-26 19:50:12 +00004152 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) {
4153 // FIXME this drops the error on the floor.
4154 consumeError(std::move(Err));
Douglas Gregor6623e1f2015-11-03 18:33:07 +00004155 return true;
JF Bastien0e828952019-06-26 19:50:12 +00004156 }
Douglas Gregor6623e1f2015-11-03 18:33:07 +00004157 // Found it!
4158 return false;
4159 }
4160
JF Bastien0e828952019-06-26 19:50:12 +00004161 if (llvm::Error Err = Cursor.SkipBlock()) {
4162 // FIXME this drops the error on the floor.
4163 consumeError(std::move(Err));
Douglas Gregor6623e1f2015-11-03 18:33:07 +00004164 return true;
JF Bastien0e828952019-06-26 19:50:12 +00004165 }
Douglas Gregor6623e1f2015-11-03 18:33:07 +00004166 }
4167 }
4168}
4169
Benjamin Kramer0772c422016-02-13 13:42:54 +00004170ASTReader::ASTReadResult ASTReader::ReadAST(StringRef FileName,
Guy Benyei11169dd2012-12-18 14:30:41 +00004171 ModuleKind Type,
4172 SourceLocation ImportLoc,
Graydon Hoaree7196af2016-12-09 21:45:49 +00004173 unsigned ClientLoadCapabilities,
4174 SmallVectorImpl<ImportedSubmodule> *Imported) {
Argyrios Kyrtzidisdc9fdaf2013-05-24 05:44:08 +00004175 llvm::SaveAndRestore<SourceLocation>
4176 SetCurImportLocRAII(CurrentImportLoc, ImportLoc);
4177
Richard Smithd1c46742014-04-30 02:24:17 +00004178 // Defer any pending actions until we get to the end of reading the AST file.
4179 Deserializing AnASTFile(this);
4180
Guy Benyei11169dd2012-12-18 14:30:41 +00004181 // Bump the generation number.
Richard Smithdbafb6c2017-06-29 23:23:46 +00004182 unsigned PreviousGeneration = 0;
4183 if (ContextObj)
4184 PreviousGeneration = incrementGeneration(*ContextObj);
Guy Benyei11169dd2012-12-18 14:30:41 +00004185
4186 unsigned NumModules = ModuleMgr.size();
Duncan P. N. Exon Smithc46b3a22019-11-10 10:42:29 -08004187 auto removeModulesAndReturn = [&](ASTReadResult ReadResult) {
4188 assert(ReadResult && "expected to return error");
Duncan P. N. Exon Smith8e9e4332019-11-10 10:31:03 -08004189 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules,
Richard Smithdbafb6c2017-06-29 23:23:46 +00004190 PP.getLangOpts().Modules
Duncan P. N. Exon Smith8e6bc1972017-01-28 23:02:12 +00004191 ? &PP.getHeaderSearchInfo().getModuleMap()
4192 : nullptr);
Douglas Gregore060e572013-01-25 01:03:03 +00004193
4194 // If we find that any modules are unusable, the global index is going
4195 // to be out-of-date. Just remove it.
4196 GlobalIndex.reset();
Craig Toppera13603a2014-05-22 05:54:18 +00004197 ModuleMgr.setGlobalIndex(nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00004198 return ReadResult;
Duncan P. N. Exon Smithc46b3a22019-11-10 10:42:29 -08004199 };
4200
4201 SmallVector<ImportedModule, 4> Loaded;
4202 switch (ASTReadResult ReadResult =
4203 ReadASTCore(FileName, Type, ImportLoc,
4204 /*ImportedBy=*/nullptr, Loaded, 0, 0,
4205 ASTFileSignature(), ClientLoadCapabilities)) {
4206 case Failure:
4207 case Missing:
4208 case OutOfDate:
4209 case VersionMismatch:
4210 case ConfigurationMismatch:
4211 case HadErrors:
4212 return removeModulesAndReturn(ReadResult);
Guy Benyei11169dd2012-12-18 14:30:41 +00004213 case Success:
4214 break;
4215 }
4216
4217 // Here comes stuff that we only do once the entire chain is loaded.
4218
Duncan P. N. Exon Smith01782c32019-11-10 10:50:12 -08004219 // Load the AST blocks of all of the modules that we loaded. We can still
4220 // hit errors parsing the ASTs at this point.
Duncan P. N. Exon Smithbfd58fc2019-11-11 15:42:25 -08004221 for (ImportedModule &M : Loaded) {
4222 ModuleFile &F = *M.Mod;
Guy Benyei11169dd2012-12-18 14:30:41 +00004223
4224 // Read the AST block.
Ben Langmuir2c9af442014-04-10 17:57:43 +00004225 if (ASTReadResult Result = ReadASTBlock(F, ClientLoadCapabilities))
Duncan P. N. Exon Smithc46b3a22019-11-10 10:42:29 -08004226 return removeModulesAndReturn(Result);
Guy Benyei11169dd2012-12-18 14:30:41 +00004227
Duncan P. N. Exon Smith83dcb342019-11-10 13:14:52 -08004228 // The AST block should always have a definition for the main module.
4229 if (F.isModule() && !F.DidReadTopLevelSubmodule) {
4230 Error(diag::err_module_file_missing_top_level_submodule, F.FileName);
4231 return removeModulesAndReturn(Failure);
4232 }
4233
Douglas Gregor6623e1f2015-11-03 18:33:07 +00004234 // Read the extension blocks.
4235 while (!SkipCursorToBlock(F.Stream, EXTENSION_BLOCK_ID)) {
4236 if (ASTReadResult Result = ReadExtensionBlock(F))
Duncan P. N. Exon Smithc46b3a22019-11-10 10:42:29 -08004237 return removeModulesAndReturn(Result);
Douglas Gregor6623e1f2015-11-03 18:33:07 +00004238 }
4239
David L. Jonesc4808b9e2016-12-15 20:53:26 +00004240 // Once read, set the ModuleFile bit base offset and update the size in
Guy Benyei11169dd2012-12-18 14:30:41 +00004241 // bits of all files we've seen.
4242 F.GlobalBitOffset = TotalModulesSizeInBits;
4243 TotalModulesSizeInBits += F.SizeInBits;
4244 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F));
Duncan P. N. Exon Smith01782c32019-11-10 10:50:12 -08004245 }
4246
4247 // Preload source locations and interesting indentifiers.
4248 for (ImportedModule &M : Loaded) {
4249 ModuleFile &F = *M.Mod;
David L. Jonesc4808b9e2016-12-15 20:53:26 +00004250
Guy Benyei11169dd2012-12-18 14:30:41 +00004251 // Preload SLocEntries.
Vedant Kumar48b4f762018-04-14 01:40:48 +00004252 for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) {
4253 int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID;
Guy Benyei11169dd2012-12-18 14:30:41 +00004254 // Load it through the SourceManager and don't call ReadSLocEntry()
4255 // directly because the entry may have already been loaded in which case
4256 // calling ReadSLocEntry() directly would trigger an assertion in
4257 // SourceManager.
4258 SourceMgr.getLoadedSLocEntryByID(Index);
4259 }
Richard Smith33e0f7e2015-07-22 02:08:40 +00004260
Richard Smithea741482017-05-01 22:10:47 +00004261 // Map the original source file ID into the ID space of the current
4262 // compilation.
4263 if (F.OriginalSourceFileID.isValid()) {
4264 F.OriginalSourceFileID = FileID::get(
4265 F.SLocEntryBaseID + F.OriginalSourceFileID.getOpaqueValue() - 1);
4266 }
4267
Richard Smith33e0f7e2015-07-22 02:08:40 +00004268 // Preload all the pending interesting identifiers by marking them out of
4269 // date.
4270 for (auto Offset : F.PreloadIdentifierOffsets) {
Vedant Kumar48b4f762018-04-14 01:40:48 +00004271 const unsigned char *Data = reinterpret_cast<const unsigned char *>(
Richard Smith33e0f7e2015-07-22 02:08:40 +00004272 F.IdentifierTableData + Offset);
4273
4274 ASTIdentifierLookupTrait Trait(*this, F);
4275 auto KeyDataLen = Trait.ReadKeyDataLength(Data);
4276 auto Key = Trait.ReadKey(Data, KeyDataLen.first);
Richard Smith79bf9202015-08-24 03:33:22 +00004277 auto &II = PP.getIdentifierTable().getOwn(Key);
4278 II.setOutOfDate(true);
4279
4280 // Mark this identifier as being from an AST file so that we can track
4281 // whether we need to serialize it.
Richard Smitheb4b58f62016-02-05 01:40:54 +00004282 markIdentifierFromAST(*this, II);
Richard Smith79bf9202015-08-24 03:33:22 +00004283
4284 // Associate the ID with the identifier so that the writer can reuse it.
4285 auto ID = Trait.ReadIdentifierID(Data + KeyDataLen.first);
4286 SetIdentifierInfo(ID, &II);
Richard Smith33e0f7e2015-07-22 02:08:40 +00004287 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004288 }
4289
Douglas Gregor603cd862013-03-22 18:50:14 +00004290 // Setup the import locations and notify the module manager that we've
4291 // committed to these module files.
Duncan P. N. Exon Smithbfd58fc2019-11-11 15:42:25 -08004292 for (ImportedModule &M : Loaded) {
4293 ModuleFile &F = *M.Mod;
Douglas Gregor603cd862013-03-22 18:50:14 +00004294
4295 ModuleMgr.moduleFileAccepted(&F);
4296
4297 // Set the import location.
Argyrios Kyrtzidis71c1af82013-02-01 16:36:14 +00004298 F.DirectImportLoc = ImportLoc;
Richard Smithb22a1d12016-03-27 20:13:24 +00004299 // FIXME: We assume that locations from PCH / preamble do not need
4300 // any translation.
Duncan P. N. Exon Smithbfd58fc2019-11-11 15:42:25 -08004301 if (!M.ImportedBy)
4302 F.ImportLoc = M.ImportLoc;
Guy Benyei11169dd2012-12-18 14:30:41 +00004303 else
Duncan P. N. Exon Smithbfd58fc2019-11-11 15:42:25 -08004304 F.ImportLoc = TranslateSourceLocation(*M.ImportedBy, M.ImportLoc);
Guy Benyei11169dd2012-12-18 14:30:41 +00004305 }
4306
Richard Smithdbafb6c2017-06-29 23:23:46 +00004307 if (!PP.getLangOpts().CPlusPlus ||
Manman Ren11f2a472016-08-18 17:42:15 +00004308 (Type != MK_ImplicitModule && Type != MK_ExplicitModule &&
4309 Type != MK_PrebuiltModule)) {
Richard Smith33e0f7e2015-07-22 02:08:40 +00004310 // Mark all of the identifiers in the identifier table as being out of date,
4311 // so that various accessors know to check the loaded modules when the
4312 // identifier is used.
4313 //
4314 // For C++ modules, we don't need information on many identifiers (just
4315 // those that provide macros or are poisoned), so we mark all of
4316 // the interesting ones via PreloadIdentifierOffsets.
Vedant Kumar48b4f762018-04-14 01:40:48 +00004317 for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(),
4318 IdEnd = PP.getIdentifierTable().end();
4319 Id != IdEnd; ++Id)
4320 Id->second->setOutOfDate(true);
Richard Smith33e0f7e2015-07-22 02:08:40 +00004321 }
Manman Rena0f31a02016-04-29 19:04:05 +00004322 // Mark selectors as out of date.
4323 for (auto Sel : SelectorGeneration)
4324 SelectorOutOfDate[Sel.first] = true;
David L. Jonesc4808b9e2016-12-15 20:53:26 +00004325
Guy Benyei11169dd2012-12-18 14:30:41 +00004326 // Resolve any unresolved module exports.
Vedant Kumar48b4f762018-04-14 01:40:48 +00004327 for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) {
4328 UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I];
Guy Benyei11169dd2012-12-18 14:30:41 +00004329 SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID);
4330 Module *ResolvedMod = getSubmodule(GlobalID);
Douglas Gregorfb912652013-03-20 21:10:35 +00004331
4332 switch (Unresolved.Kind) {
4333 case UnresolvedModuleRef::Conflict:
4334 if (ResolvedMod) {
4335 Module::Conflict Conflict;
4336 Conflict.Other = ResolvedMod;
4337 Conflict.Message = Unresolved.String.str();
4338 Unresolved.Mod->Conflicts.push_back(Conflict);
4339 }
4340 continue;
4341
4342 case UnresolvedModuleRef::Import:
Guy Benyei11169dd2012-12-18 14:30:41 +00004343 if (ResolvedMod)
Richard Smith38477db2015-05-02 00:45:56 +00004344 Unresolved.Mod->Imports.insert(ResolvedMod);
Guy Benyei11169dd2012-12-18 14:30:41 +00004345 continue;
Guy Benyei11169dd2012-12-18 14:30:41 +00004346
Douglas Gregorfb912652013-03-20 21:10:35 +00004347 case UnresolvedModuleRef::Export:
4348 if (ResolvedMod || Unresolved.IsWildcard)
4349 Unresolved.Mod->Exports.push_back(
4350 Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard));
4351 continue;
4352 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004353 }
Douglas Gregorfb912652013-03-20 21:10:35 +00004354 UnresolvedModuleRefs.clear();
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004355
Graydon Hoaree7196af2016-12-09 21:45:49 +00004356 if (Imported)
4357 Imported->append(ImportedModules.begin(),
4358 ImportedModules.end());
4359
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004360 // FIXME: How do we load the 'use'd modules? They may not be submodules.
4361 // Might be unnecessary as use declarations are only used to build the
4362 // module itself.
David L. Jonesc4808b9e2016-12-15 20:53:26 +00004363
Richard Smithdbafb6c2017-06-29 23:23:46 +00004364 if (ContextObj)
4365 InitializeContext();
Guy Benyei11169dd2012-12-18 14:30:41 +00004366
Richard Smith3d8e97e2013-10-18 06:54:39 +00004367 if (SemaObj)
4368 UpdateSema();
4369
Guy Benyei11169dd2012-12-18 14:30:41 +00004370 if (DeserializationListener)
4371 DeserializationListener->ReaderInitialized(this);
4372
4373 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
Yaron Keren8b563662015-10-03 10:46:20 +00004374 if (PrimaryModule.OriginalSourceFileID.isValid()) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004375 // If this AST file is a precompiled preamble, then set the
4376 // preamble file ID of the source manager to the file source file
4377 // from which the preamble was built.
4378 if (Type == MK_Preamble) {
4379 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID);
4380 } else if (Type == MK_MainFile) {
4381 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID);
4382 }
4383 }
David L. Jonesc4808b9e2016-12-15 20:53:26 +00004384
Guy Benyei11169dd2012-12-18 14:30:41 +00004385 // For any Objective-C class definitions we have already loaded, make sure
4386 // that we load any additional categories.
Vedant Kumar48b4f762018-04-14 01:40:48 +00004387 if (ContextObj) {
4388 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
4389 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
4390 ObjCClassesLoaded[I],
Richard Smithdbafb6c2017-06-29 23:23:46 +00004391 PreviousGeneration);
Vedant Kumar48b4f762018-04-14 01:40:48 +00004392 }
4393 }
Douglas Gregore060e572013-01-25 01:03:03 +00004394
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004395 if (PP.getHeaderSearchInfo()
4396 .getHeaderSearchOpts()
4397 .ModulesValidateOncePerBuildSession) {
4398 // Now we are certain that the module and all modules it depends on are
4399 // up to date. Create or update timestamp files for modules that are
4400 // located in the module cache (not for PCH files that could be anywhere
4401 // in the filesystem).
Vedant Kumar48b4f762018-04-14 01:40:48 +00004402 for (unsigned I = 0, N = Loaded.size(); I != N; ++I) {
4403 ImportedModule &M = Loaded[I];
4404 if (M.Mod->Kind == MK_ImplicitModule) {
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004405 updateModuleTimestamp(*M.Mod);
Vedant Kumar48b4f762018-04-14 01:40:48 +00004406 }
4407 }
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004408 }
4409
Guy Benyei11169dd2012-12-18 14:30:41 +00004410 return Success;
4411}
4412
Peter Collingbourne77c89b62016-11-08 04:17:11 +00004413static ASTFileSignature readASTFileSignature(StringRef PCH);
Ben Langmuir487ea142014-10-23 18:05:36 +00004414
JF Bastien0e828952019-06-26 19:50:12 +00004415/// Whether \p Stream doesn't start with the AST/PCH file magic number 'CPCH'.
4416static llvm::Error doesntStartWithASTFileMagic(BitstreamCursor &Stream) {
4417 // FIXME checking magic headers is done in other places such as
4418 // SerializedDiagnosticReader and GlobalModuleIndex, but error handling isn't
4419 // always done the same. Unify it all with a helper.
4420 if (!Stream.canSkipToPos(4))
4421 return llvm::createStringError(std::errc::illegal_byte_sequence,
4422 "file too small to contain AST file magic");
4423 for (unsigned C : {'C', 'P', 'C', 'H'})
4424 if (Expected<llvm::SimpleBitstreamCursor::word_t> Res = Stream.Read(8)) {
4425 if (Res.get() != C)
4426 return llvm::createStringError(
4427 std::errc::illegal_byte_sequence,
4428 "file doesn't start with AST file magic");
4429 } else
4430 return Res.takeError();
4431 return llvm::Error::success();
Ben Langmuir70a1b812015-03-24 04:43:52 +00004432}
4433
Richard Smith0f99d6a2015-08-09 08:48:41 +00004434static unsigned moduleKindForDiagnostic(ModuleKind Kind) {
4435 switch (Kind) {
4436 case MK_PCH:
4437 return 0; // PCH
4438 case MK_ImplicitModule:
4439 case MK_ExplicitModule:
Manman Ren11f2a472016-08-18 17:42:15 +00004440 case MK_PrebuiltModule:
Richard Smith0f99d6a2015-08-09 08:48:41 +00004441 return 1; // module
4442 case MK_MainFile:
4443 case MK_Preamble:
4444 return 2; // main source file
4445 }
4446 llvm_unreachable("unknown module kind");
4447}
4448
Guy Benyei11169dd2012-12-18 14:30:41 +00004449ASTReader::ASTReadResult
4450ASTReader::ReadASTCore(StringRef FileName,
4451 ModuleKind Type,
4452 SourceLocation ImportLoc,
4453 ModuleFile *ImportedBy,
Dmitri Gribenkof8579502013-01-12 19:30:44 +00004454 SmallVectorImpl<ImportedModule> &Loaded,
Douglas Gregor7029ce12013-03-19 00:28:20 +00004455 off_t ExpectedSize, time_t ExpectedModTime,
Ben Langmuir487ea142014-10-23 18:05:36 +00004456 ASTFileSignature ExpectedSignature,
Guy Benyei11169dd2012-12-18 14:30:41 +00004457 unsigned ClientLoadCapabilities) {
4458 ModuleFile *M;
Guy Benyei11169dd2012-12-18 14:30:41 +00004459 std::string ErrorStr;
Douglas Gregor7029ce12013-03-19 00:28:20 +00004460 ModuleManager::AddModuleResult AddResult
4461 = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy,
Richard Smith053f6c62014-05-16 23:01:30 +00004462 getGeneration(), ExpectedSize, ExpectedModTime,
Ben Langmuir487ea142014-10-23 18:05:36 +00004463 ExpectedSignature, readASTFileSignature,
Douglas Gregor7029ce12013-03-19 00:28:20 +00004464 M, ErrorStr);
Guy Benyei11169dd2012-12-18 14:30:41 +00004465
Douglas Gregor7029ce12013-03-19 00:28:20 +00004466 switch (AddResult) {
4467 case ModuleManager::AlreadyLoaded:
Duncan P. N. Exon Smith9dda8f52019-03-06 02:50:46 +00004468 Diag(diag::remark_module_import)
4469 << M->ModuleName << M->FileName << (ImportedBy ? true : false)
4470 << (ImportedBy ? StringRef(ImportedBy->ModuleName) : StringRef());
Douglas Gregor7029ce12013-03-19 00:28:20 +00004471 return Success;
4472
4473 case ModuleManager::NewlyLoaded:
4474 // Load module file below.
4475 break;
4476
4477 case ModuleManager::Missing:
Richard Smithe842a472014-10-22 02:05:46 +00004478 // The module file was missing; if the client can handle that, return
Douglas Gregor7029ce12013-03-19 00:28:20 +00004479 // it.
4480 if (ClientLoadCapabilities & ARR_Missing)
4481 return Missing;
4482
4483 // Otherwise, return an error.
Richard Smith0f99d6a2015-08-09 08:48:41 +00004484 Diag(diag::err_module_file_not_found) << moduleKindForDiagnostic(Type)
Adrian Prantlb3b5a732016-08-29 20:46:59 +00004485 << FileName << !ErrorStr.empty()
Richard Smith0f99d6a2015-08-09 08:48:41 +00004486 << ErrorStr;
Douglas Gregor7029ce12013-03-19 00:28:20 +00004487 return Failure;
4488
4489 case ModuleManager::OutOfDate:
4490 // We couldn't load the module file because it is out-of-date. If the
4491 // client can handle out-of-date, return it.
4492 if (ClientLoadCapabilities & ARR_OutOfDate)
4493 return OutOfDate;
4494
4495 // Otherwise, return an error.
Richard Smith0f99d6a2015-08-09 08:48:41 +00004496 Diag(diag::err_module_file_out_of_date) << moduleKindForDiagnostic(Type)
Adrian Prantl9a06a882016-08-29 20:46:56 +00004497 << FileName << !ErrorStr.empty()
Richard Smith0f99d6a2015-08-09 08:48:41 +00004498 << ErrorStr;
Guy Benyei11169dd2012-12-18 14:30:41 +00004499 return Failure;
4500 }
4501
Douglas Gregor7029ce12013-03-19 00:28:20 +00004502 assert(M && "Missing module file");
Guy Benyei11169dd2012-12-18 14:30:41 +00004503
Duncan P. N. Exon Smith0a2be462019-03-09 17:44:01 +00004504 bool ShouldFinalizePCM = false;
4505 auto FinalizeOrDropPCM = llvm::make_scope_exit([&]() {
4506 auto &MC = getModuleManager().getModuleCache();
4507 if (ShouldFinalizePCM)
4508 MC.finalizePCM(FileName);
4509 else
Rumeet Dhindsa57a2eaf2020-03-10 10:59:26 -07004510 MC.tryToDropPCM(FileName);
Duncan P. N. Exon Smith0a2be462019-03-09 17:44:01 +00004511 });
Guy Benyei11169dd2012-12-18 14:30:41 +00004512 ModuleFile &F = *M;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004513 BitstreamCursor &Stream = F.Stream;
Peter Collingbourne77c89b62016-11-08 04:17:11 +00004514 Stream = BitstreamCursor(PCHContainerRdr.ExtractPCH(*F.Buffer));
Adrian Prantlcbc368c2015-02-25 02:44:04 +00004515 F.SizeInBits = F.Buffer->getBufferSize() * 8;
David L. Jonesc4808b9e2016-12-15 20:53:26 +00004516
Guy Benyei11169dd2012-12-18 14:30:41 +00004517 // Sniff for the signature.
JF Bastien0e828952019-06-26 19:50:12 +00004518 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
4519 Diag(diag::err_module_file_invalid)
4520 << moduleKindForDiagnostic(Type) << FileName << std::move(Err);
Guy Benyei11169dd2012-12-18 14:30:41 +00004521 return Failure;
4522 }
4523
4524 // This is used for compatibility with older PCH formats.
4525 bool HaveReadControlBlock = false;
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00004526 while (true) {
JF Bastien0e828952019-06-26 19:50:12 +00004527 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
4528 if (!MaybeEntry) {
4529 Error(MaybeEntry.takeError());
4530 return Failure;
4531 }
4532 llvm::BitstreamEntry Entry = MaybeEntry.get();
David L. Jonesc4808b9e2016-12-15 20:53:26 +00004533
Chris Lattnerefa77172013-01-20 00:00:22 +00004534 switch (Entry.Kind) {
4535 case llvm::BitstreamEntry::Error:
Chris Lattnerefa77172013-01-20 00:00:22 +00004536 case llvm::BitstreamEntry::Record:
Douglas Gregor6623e1f2015-11-03 18:33:07 +00004537 case llvm::BitstreamEntry::EndBlock:
Guy Benyei11169dd2012-12-18 14:30:41 +00004538 Error("invalid record at top-level of AST file");
4539 return Failure;
David L. Jonesc4808b9e2016-12-15 20:53:26 +00004540
Chris Lattnerefa77172013-01-20 00:00:22 +00004541 case llvm::BitstreamEntry::SubBlock:
4542 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004543 }
4544
Chris Lattnerefa77172013-01-20 00:00:22 +00004545 switch (Entry.ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004546 case CONTROL_BLOCK_ID:
4547 HaveReadControlBlock = true;
Ben Langmuirbeee15e2014-04-14 18:00:01 +00004548 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004549 case Success:
Richard Smith0f99d6a2015-08-09 08:48:41 +00004550 // Check that we didn't try to load a non-module AST file as a module.
4551 //
4552 // FIXME: Should we also perform the converse check? Loading a module as
4553 // a PCH file sort of works, but it's a bit wonky.
Manman Ren11f2a472016-08-18 17:42:15 +00004554 if ((Type == MK_ImplicitModule || Type == MK_ExplicitModule ||
4555 Type == MK_PrebuiltModule) &&
Richard Smith0f99d6a2015-08-09 08:48:41 +00004556 F.ModuleName.empty()) {
4557 auto Result = (Type == MK_ImplicitModule) ? OutOfDate : Failure;
4558 if (Result != OutOfDate ||
4559 (ClientLoadCapabilities & ARR_OutOfDate) == 0)
4560 Diag(diag::err_module_file_not_module) << FileName;
4561 return Result;
4562 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004563 break;
4564
4565 case Failure: return Failure;
Douglas Gregor7029ce12013-03-19 00:28:20 +00004566 case Missing: return Missing;
Guy Benyei11169dd2012-12-18 14:30:41 +00004567 case OutOfDate: return OutOfDate;
4568 case VersionMismatch: return VersionMismatch;
4569 case ConfigurationMismatch: return ConfigurationMismatch;
4570 case HadErrors: return HadErrors;
4571 }
4572 break;
Richard Smithf8c32552015-09-02 17:45:54 +00004573
Guy Benyei11169dd2012-12-18 14:30:41 +00004574 case AST_BLOCK_ID:
4575 if (!HaveReadControlBlock) {
4576 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
Dmitri Gribenko2228cd32014-02-11 15:40:09 +00004577 Diag(diag::err_pch_version_too_old);
Guy Benyei11169dd2012-12-18 14:30:41 +00004578 return VersionMismatch;
4579 }
4580
4581 // Record that we've loaded this module.
4582 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc));
Duncan P. N. Exon Smith0a2be462019-03-09 17:44:01 +00004583 ShouldFinalizePCM = true;
Guy Benyei11169dd2012-12-18 14:30:41 +00004584 return Success;
4585
Duncan P. N. Exon Smith60fa2882017-03-13 18:45:08 +00004586 case UNHASHED_CONTROL_BLOCK_ID:
4587 // This block is handled using look-ahead during ReadControlBlock. We
4588 // shouldn't get here!
4589 Error("malformed block record in AST file");
4590 return Failure;
4591
Guy Benyei11169dd2012-12-18 14:30:41 +00004592 default:
JF Bastien0e828952019-06-26 19:50:12 +00004593 if (llvm::Error Err = Stream.SkipBlock()) {
4594 Error(std::move(Err));
Guy Benyei11169dd2012-12-18 14:30:41 +00004595 return Failure;
4596 }
4597 break;
4598 }
4599 }
Douglas Gregor6623e1f2015-11-03 18:33:07 +00004600
Duncan P. N. Exon Smithfae03d82019-03-03 20:17:53 +00004601 llvm_unreachable("unexpected break; expected return");
Douglas Gregor6623e1f2015-11-03 18:33:07 +00004602}
4603
Duncan P. N. Exon Smith60fa2882017-03-13 18:45:08 +00004604ASTReader::ASTReadResult
4605ASTReader::readUnhashedControlBlock(ModuleFile &F, bool WasImportedBy,
4606 unsigned ClientLoadCapabilities) {
4607 const HeaderSearchOptions &HSOpts =
4608 PP.getHeaderSearchInfo().getHeaderSearchOpts();
4609 bool AllowCompatibleConfigurationMismatch =
4610 F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule;
4611
4612 ASTReadResult Result = readUnhashedControlBlockImpl(
4613 &F, F.Data, ClientLoadCapabilities, AllowCompatibleConfigurationMismatch,
4614 Listener.get(),
4615 WasImportedBy ? false : HSOpts.ModulesValidateDiagnosticOptions);
4616
Duncan P. N. Exon Smith030d7d62017-03-20 17:58:26 +00004617 // If F was directly imported by another module, it's implicitly validated by
4618 // the importing module.
Duncan P. N. Exon Smith60fa2882017-03-13 18:45:08 +00004619 if (DisableValidation || WasImportedBy ||
4620 (AllowConfigurationMismatch && Result == ConfigurationMismatch))
4621 return Success;
4622
Duncan P. N. Exon Smith030d7d62017-03-20 17:58:26 +00004623 if (Result == Failure) {
Duncan P. N. Exon Smith60fa2882017-03-13 18:45:08 +00004624 Error("malformed block record in AST file");
Duncan P. N. Exon Smith030d7d62017-03-20 17:58:26 +00004625 return Failure;
4626 }
4627
4628 if (Result == OutOfDate && F.Kind == MK_ImplicitModule) {
Duncan P. N. Exon Smith8bef5cd2019-03-09 17:33:56 +00004629 // If this module has already been finalized in the ModuleCache, we're stuck
Duncan P. N. Exon Smith030d7d62017-03-20 17:58:26 +00004630 // with it; we can only load a single version of each module.
4631 //
4632 // This can happen when a module is imported in two contexts: in one, as a
4633 // user module; in another, as a system module (due to an import from
4634 // another module marked with the [system] flag). It usually indicates a
4635 // bug in the module map: this module should also be marked with [system].
4636 //
4637 // If -Wno-system-headers (the default), and the first import is as a
4638 // system module, then validation will fail during the as-user import,
4639 // since -Werror flags won't have been validated. However, it's reasonable
4640 // to treat this consistently as a system module.
4641 //
4642 // If -Wsystem-headers, the PCM on disk was built with
4643 // -Wno-system-headers, and the first import is as a user module, then
4644 // validation will fail during the as-system import since the PCM on disk
4645 // doesn't guarantee that -Werror was respected. However, the -Werror
4646 // flags were checked during the initial as-user import.
Duncan P. N. Exon Smith0a2be462019-03-09 17:44:01 +00004647 if (getModuleManager().getModuleCache().isPCMFinal(F.FileName)) {
Duncan P. N. Exon Smith030d7d62017-03-20 17:58:26 +00004648 Diag(diag::warn_module_system_bit_conflict) << F.FileName;
4649 return Success;
4650 }
4651 }
Duncan P. N. Exon Smith60fa2882017-03-13 18:45:08 +00004652
4653 return Result;
4654}
4655
4656ASTReader::ASTReadResult ASTReader::readUnhashedControlBlockImpl(
4657 ModuleFile *F, llvm::StringRef StreamData, unsigned ClientLoadCapabilities,
4658 bool AllowCompatibleConfigurationMismatch, ASTReaderListener *Listener,
4659 bool ValidateDiagnosticOptions) {
4660 // Initialize a stream.
4661 BitstreamCursor Stream(StreamData);
4662
4663 // Sniff for the signature.
JF Bastien0e828952019-06-26 19:50:12 +00004664 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
4665 // FIXME this drops the error on the floor.
4666 consumeError(std::move(Err));
Duncan P. N. Exon Smith60fa2882017-03-13 18:45:08 +00004667 return Failure;
JF Bastien0e828952019-06-26 19:50:12 +00004668 }
Duncan P. N. Exon Smith60fa2882017-03-13 18:45:08 +00004669
4670 // Scan for the UNHASHED_CONTROL_BLOCK_ID block.
4671 if (SkipCursorToBlock(Stream, UNHASHED_CONTROL_BLOCK_ID))
4672 return Failure;
4673
4674 // Read all of the records in the options block.
4675 RecordData Record;
4676 ASTReadResult Result = Success;
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00004677 while (true) {
JF Bastien0e828952019-06-26 19:50:12 +00004678 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
4679 if (!MaybeEntry) {
4680 // FIXME this drops the error on the floor.
4681 consumeError(MaybeEntry.takeError());
4682 return Failure;
4683 }
4684 llvm::BitstreamEntry Entry = MaybeEntry.get();
Duncan P. N. Exon Smith60fa2882017-03-13 18:45:08 +00004685
4686 switch (Entry.Kind) {
4687 case llvm::BitstreamEntry::Error:
4688 case llvm::BitstreamEntry::SubBlock:
4689 return Failure;
4690
4691 case llvm::BitstreamEntry::EndBlock:
4692 return Result;
4693
4694 case llvm::BitstreamEntry::Record:
4695 // The interesting case.
4696 break;
4697 }
4698
4699 // Read and process a record.
4700 Record.clear();
JF Bastien0e828952019-06-26 19:50:12 +00004701 Expected<unsigned> MaybeRecordType = Stream.readRecord(Entry.ID, Record);
4702 if (!MaybeRecordType) {
4703 // FIXME this drops the error.
4704 return Failure;
4705 }
4706 switch ((UnhashedControlBlockRecordTypes)MaybeRecordType.get()) {
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00004707 case SIGNATURE:
Duncan P. N. Exon Smith60fa2882017-03-13 18:45:08 +00004708 if (F)
4709 std::copy(Record.begin(), Record.end(), F->Signature.data());
4710 break;
Duncan P. N. Exon Smith60fa2882017-03-13 18:45:08 +00004711 case DIAGNOSTIC_OPTIONS: {
4712 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
4713 if (Listener && ValidateDiagnosticOptions &&
4714 !AllowCompatibleConfigurationMismatch &&
4715 ParseDiagnosticOptions(Record, Complain, *Listener))
Duncan P. N. Exon Smith030d7d62017-03-20 17:58:26 +00004716 Result = OutOfDate; // Don't return early. Read the signature.
Duncan P. N. Exon Smith60fa2882017-03-13 18:45:08 +00004717 break;
4718 }
4719 case DIAG_PRAGMA_MAPPINGS:
4720 if (!F)
4721 break;
4722 if (F->PragmaDiagMappings.empty())
4723 F->PragmaDiagMappings.swap(Record);
4724 else
4725 F->PragmaDiagMappings.insert(F->PragmaDiagMappings.end(),
4726 Record.begin(), Record.end());
4727 break;
4728 }
4729 }
4730}
4731
Douglas Gregor6623e1f2015-11-03 18:33:07 +00004732/// Parse a record and blob containing module file extension metadata.
4733static bool parseModuleFileExtensionMetadata(
4734 const SmallVectorImpl<uint64_t> &Record,
4735 StringRef Blob,
4736 ModuleFileExtensionMetadata &Metadata) {
4737 if (Record.size() < 4) return true;
4738
4739 Metadata.MajorVersion = Record[0];
4740 Metadata.MinorVersion = Record[1];
4741
4742 unsigned BlockNameLen = Record[2];
4743 unsigned UserInfoLen = Record[3];
4744
4745 if (BlockNameLen + UserInfoLen > Blob.size()) return true;
4746
4747 Metadata.BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen);
4748 Metadata.UserInfo = std::string(Blob.data() + BlockNameLen,
4749 Blob.data() + BlockNameLen + UserInfoLen);
4750 return false;
4751}
4752
4753ASTReader::ASTReadResult ASTReader::ReadExtensionBlock(ModuleFile &F) {
4754 BitstreamCursor &Stream = F.Stream;
4755
4756 RecordData Record;
4757 while (true) {
JF Bastien0e828952019-06-26 19:50:12 +00004758 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
4759 if (!MaybeEntry) {
4760 Error(MaybeEntry.takeError());
4761 return Failure;
4762 }
4763 llvm::BitstreamEntry Entry = MaybeEntry.get();
4764
Douglas Gregor6623e1f2015-11-03 18:33:07 +00004765 switch (Entry.Kind) {
4766 case llvm::BitstreamEntry::SubBlock:
JF Bastien0e828952019-06-26 19:50:12 +00004767 if (llvm::Error Err = Stream.SkipBlock()) {
4768 Error(std::move(Err));
Douglas Gregor6623e1f2015-11-03 18:33:07 +00004769 return Failure;
JF Bastien0e828952019-06-26 19:50:12 +00004770 }
Douglas Gregor6623e1f2015-11-03 18:33:07 +00004771 continue;
4772
4773 case llvm::BitstreamEntry::EndBlock:
4774 return Success;
4775
4776 case llvm::BitstreamEntry::Error:
4777 return HadErrors;
4778
4779 case llvm::BitstreamEntry::Record:
4780 break;
4781 }
4782
4783 Record.clear();
4784 StringRef Blob;
JF Bastien0e828952019-06-26 19:50:12 +00004785 Expected<unsigned> MaybeRecCode =
4786 Stream.readRecord(Entry.ID, Record, &Blob);
4787 if (!MaybeRecCode) {
4788 Error(MaybeRecCode.takeError());
4789 return Failure;
4790 }
4791 switch (MaybeRecCode.get()) {
Douglas Gregor6623e1f2015-11-03 18:33:07 +00004792 case EXTENSION_METADATA: {
4793 ModuleFileExtensionMetadata Metadata;
Duncan P. N. Exon Smith8e2c1922019-11-10 11:07:20 -08004794 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata)) {
4795 Error("malformed EXTENSION_METADATA in AST file");
Douglas Gregor6623e1f2015-11-03 18:33:07 +00004796 return Failure;
Duncan P. N. Exon Smith8e2c1922019-11-10 11:07:20 -08004797 }
Douglas Gregor6623e1f2015-11-03 18:33:07 +00004798
4799 // Find a module file extension with this block name.
4800 auto Known = ModuleFileExtensions.find(Metadata.BlockName);
4801 if (Known == ModuleFileExtensions.end()) break;
4802
4803 // Form a reader.
4804 if (auto Reader = Known->second->createExtensionReader(Metadata, *this,
4805 F, Stream)) {
4806 F.ExtensionReaders.push_back(std::move(Reader));
4807 }
4808
4809 break;
4810 }
4811 }
4812 }
4813
4814 return Success;
Guy Benyei11169dd2012-12-18 14:30:41 +00004815}
4816
Richard Smitha7e2cc62015-05-01 01:53:09 +00004817void ASTReader::InitializeContext() {
Richard Smithdbafb6c2017-06-29 23:23:46 +00004818 assert(ContextObj && "no context to initialize");
4819 ASTContext &Context = *ContextObj;
4820
Guy Benyei11169dd2012-12-18 14:30:41 +00004821 // If there's a listener, notify them that we "read" the translation unit.
4822 if (DeserializationListener)
David L. Jonesc4808b9e2016-12-15 20:53:26 +00004823 DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID,
Guy Benyei11169dd2012-12-18 14:30:41 +00004824 Context.getTranslationUnitDecl());
4825
Guy Benyei11169dd2012-12-18 14:30:41 +00004826 // FIXME: Find a better way to deal with collisions between these
4827 // built-in types. Right now, we just ignore the problem.
David L. Jonesc4808b9e2016-12-15 20:53:26 +00004828
Guy Benyei11169dd2012-12-18 14:30:41 +00004829 // Load the special types.
4830 if (SpecialTypes.size() >= NumSpecialTypeIDs) {
4831 if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) {
4832 if (!Context.CFConstantStringTypeDecl)
4833 Context.setCFConstantStringType(GetType(String));
4834 }
David L. Jonesc4808b9e2016-12-15 20:53:26 +00004835
Guy Benyei11169dd2012-12-18 14:30:41 +00004836 if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) {
4837 QualType FileType = GetType(File);
4838 if (FileType.isNull()) {
4839 Error("FILE type is NULL");
4840 return;
4841 }
David L. Jonesc4808b9e2016-12-15 20:53:26 +00004842
Guy Benyei11169dd2012-12-18 14:30:41 +00004843 if (!Context.FILEDecl) {
Vedant Kumar48b4f762018-04-14 01:40:48 +00004844 if (const TypedefType *Typedef = FileType->getAs<TypedefType>())
Guy Benyei11169dd2012-12-18 14:30:41 +00004845 Context.setFILEDecl(Typedef->getDecl());
4846 else {
Vedant Kumar48b4f762018-04-14 01:40:48 +00004847 const TagType *Tag = FileType->getAs<TagType>();
Guy Benyei11169dd2012-12-18 14:30:41 +00004848 if (!Tag) {
4849 Error("Invalid FILE type in AST file");
4850 return;
4851 }
4852 Context.setFILEDecl(Tag->getDecl());
4853 }
4854 }
4855 }
David L. Jonesc4808b9e2016-12-15 20:53:26 +00004856
Guy Benyei11169dd2012-12-18 14:30:41 +00004857 if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) {
4858 QualType Jmp_bufType = GetType(Jmp_buf);
4859 if (Jmp_bufType.isNull()) {
4860 Error("jmp_buf type is NULL");
4861 return;
4862 }
David L. Jonesc4808b9e2016-12-15 20:53:26 +00004863
Guy Benyei11169dd2012-12-18 14:30:41 +00004864 if (!Context.jmp_bufDecl) {
Vedant Kumar48b4f762018-04-14 01:40:48 +00004865 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>())
Guy Benyei11169dd2012-12-18 14:30:41 +00004866 Context.setjmp_bufDecl(Typedef->getDecl());
4867 else {
Vedant Kumar48b4f762018-04-14 01:40:48 +00004868 const TagType *Tag = Jmp_bufType->getAs<TagType>();
Guy Benyei11169dd2012-12-18 14:30:41 +00004869 if (!Tag) {
4870 Error("Invalid jmp_buf type in AST file");
4871 return;
4872 }
4873 Context.setjmp_bufDecl(Tag->getDecl());
4874 }
4875 }
4876 }
David L. Jonesc4808b9e2016-12-15 20:53:26 +00004877
Guy Benyei11169dd2012-12-18 14:30:41 +00004878 if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) {
4879 QualType Sigjmp_bufType = GetType(Sigjmp_buf);
4880 if (Sigjmp_bufType.isNull()) {
4881 Error("sigjmp_buf type is NULL");
4882 return;
4883 }
David L. Jonesc4808b9e2016-12-15 20:53:26 +00004884
Guy Benyei11169dd2012-12-18 14:30:41 +00004885 if (!Context.sigjmp_bufDecl) {
Vedant Kumar48b4f762018-04-14 01:40:48 +00004886 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>())
Guy Benyei11169dd2012-12-18 14:30:41 +00004887 Context.setsigjmp_bufDecl(Typedef->getDecl());
4888 else {
Vedant Kumar48b4f762018-04-14 01:40:48 +00004889 const TagType *Tag = Sigjmp_bufType->getAs<TagType>();
Guy Benyei11169dd2012-12-18 14:30:41 +00004890 assert(Tag && "Invalid sigjmp_buf type in AST file");
4891 Context.setsigjmp_bufDecl(Tag->getDecl());
4892 }
4893 }
4894 }
4895
4896 if (unsigned ObjCIdRedef
4897 = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) {
4898 if (Context.ObjCIdRedefinitionType.isNull())
4899 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef);
4900 }
4901
4902 if (unsigned ObjCClassRedef
4903 = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) {
4904 if (Context.ObjCClassRedefinitionType.isNull())
4905 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef);
4906 }
4907
4908 if (unsigned ObjCSelRedef
4909 = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) {
4910 if (Context.ObjCSelRedefinitionType.isNull())
4911 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef);
4912 }
4913
4914 if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) {
4915 QualType Ucontext_tType = GetType(Ucontext_t);
4916 if (Ucontext_tType.isNull()) {
4917 Error("ucontext_t type is NULL");
4918 return;
4919 }
4920
4921 if (!Context.ucontext_tDecl) {
Vedant Kumar48b4f762018-04-14 01:40:48 +00004922 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>())
Guy Benyei11169dd2012-12-18 14:30:41 +00004923 Context.setucontext_tDecl(Typedef->getDecl());
4924 else {
Vedant Kumar48b4f762018-04-14 01:40:48 +00004925 const TagType *Tag = Ucontext_tType->getAs<TagType>();
Guy Benyei11169dd2012-12-18 14:30:41 +00004926 assert(Tag && "Invalid ucontext_t type in AST file");
4927 Context.setucontext_tDecl(Tag->getDecl());
4928 }
4929 }
4930 }
4931 }
David L. Jonesc4808b9e2016-12-15 20:53:26 +00004932
Guy Benyei11169dd2012-12-18 14:30:41 +00004933 ReadPragmaDiagnosticMappings(Context.getDiagnostics());
4934
4935 // If there were any CUDA special declarations, deserialize them.
4936 if (!CUDASpecialDeclRefs.empty()) {
4937 assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!");
4938 Context.setcudaConfigureCallDecl(
4939 cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0])));
4940 }
Richard Smith56be7542014-03-21 00:33:59 +00004941
Guy Benyei11169dd2012-12-18 14:30:41 +00004942 // Re-export any modules that were imported by a non-module AST file.
Richard Smitha7e2cc62015-05-01 01:53:09 +00004943 // FIXME: This does not make macro-only imports visible again.
Richard Smith56be7542014-03-21 00:33:59 +00004944 for (auto &Import : ImportedModules) {
Richard Smitha7e2cc62015-05-01 01:53:09 +00004945 if (Module *Imported = getSubmodule(Import.ID)) {
Argyrios Kyrtzidis125df052013-02-01 16:36:12 +00004946 makeModuleVisible(Imported, Module::AllVisible,
Richard Smitha7e2cc62015-05-01 01:53:09 +00004947 /*ImportLoc=*/Import.ImportLoc);
Ben Langmuir6d25fdc2016-02-11 17:04:42 +00004948 if (Import.ImportLoc.isValid())
4949 PP.makeModuleVisible(Imported, Import.ImportLoc);
4950 // FIXME: should we tell Sema to make the module visible too?
Richard Smitha7e2cc62015-05-01 01:53:09 +00004951 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004952 }
4953 ImportedModules.clear();
4954}
4955
4956void ASTReader::finalizeForWriting() {
Richard Smithde711422015-04-23 21:20:19 +00004957 // Nothing to do for now.
Guy Benyei11169dd2012-12-18 14:30:41 +00004958}
4959
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00004960/// Reads and return the signature record from \p PCH's control block, or
Peter Collingbourne77c89b62016-11-08 04:17:11 +00004961/// else returns 0.
4962static ASTFileSignature readASTFileSignature(StringRef PCH) {
4963 BitstreamCursor Stream(PCH);
JF Bastien0e828952019-06-26 19:50:12 +00004964 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
4965 // FIXME this drops the error on the floor.
4966 consumeError(std::move(Err));
Vedant Kumar48b4f762018-04-14 01:40:48 +00004967 return ASTFileSignature();
JF Bastien0e828952019-06-26 19:50:12 +00004968 }
Ben Langmuir487ea142014-10-23 18:05:36 +00004969
Duncan P. N. Exon Smith60fa2882017-03-13 18:45:08 +00004970 // Scan for the UNHASHED_CONTROL_BLOCK_ID block.
4971 if (SkipCursorToBlock(Stream, UNHASHED_CONTROL_BLOCK_ID))
Vedant Kumar48b4f762018-04-14 01:40:48 +00004972 return ASTFileSignature();
Ben Langmuir487ea142014-10-23 18:05:36 +00004973
Duncan P. N. Exon Smith60fa2882017-03-13 18:45:08 +00004974 // Scan for SIGNATURE inside the diagnostic options block.
Ben Langmuir487ea142014-10-23 18:05:36 +00004975 ASTReader::RecordData Record;
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00004976 while (true) {
JF Bastien0e828952019-06-26 19:50:12 +00004977 Expected<llvm::BitstreamEntry> MaybeEntry =
4978 Stream.advanceSkippingSubblocks();
4979 if (!MaybeEntry) {
4980 // FIXME this drops the error on the floor.
4981 consumeError(MaybeEntry.takeError());
4982 return ASTFileSignature();
4983 }
4984 llvm::BitstreamEntry Entry = MaybeEntry.get();
4985
Simon Pilgrim0b33f112016-11-16 16:11:08 +00004986 if (Entry.Kind != llvm::BitstreamEntry::Record)
Vedant Kumar48b4f762018-04-14 01:40:48 +00004987 return ASTFileSignature();
Ben Langmuir487ea142014-10-23 18:05:36 +00004988
4989 Record.clear();
4990 StringRef Blob;
JF Bastien0e828952019-06-26 19:50:12 +00004991 Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record, &Blob);
4992 if (!MaybeRecord) {
4993 // FIXME this drops the error on the floor.
4994 consumeError(MaybeRecord.takeError());
4995 return ASTFileSignature();
4996 }
4997 if (SIGNATURE == MaybeRecord.get())
Duncan P. N. Exon Smith60fa2882017-03-13 18:45:08 +00004998 return {{{(uint32_t)Record[0], (uint32_t)Record[1], (uint32_t)Record[2],
4999 (uint32_t)Record[3], (uint32_t)Record[4]}}};
Ben Langmuir487ea142014-10-23 18:05:36 +00005000 }
5001}
5002
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00005003/// Retrieve the name of the original source file name
Guy Benyei11169dd2012-12-18 14:30:41 +00005004/// directly from the AST file, without actually loading the AST
5005/// file.
Adrian Prantlbb165fb2015-06-20 18:53:08 +00005006std::string ASTReader::getOriginalSourceFile(
5007 const std::string &ASTFileName, FileManager &FileMgr,
Adrian Prantlfb2398d2015-07-17 01:19:54 +00005008 const PCHContainerReader &PCHContainerRdr, DiagnosticsEngine &Diags) {
Guy Benyei11169dd2012-12-18 14:30:41 +00005009 // Open the AST file.
Benjamin Kramera8857962014-10-26 22:44:13 +00005010 auto Buffer = FileMgr.getBufferForFile(ASTFileName);
Guy Benyei11169dd2012-12-18 14:30:41 +00005011 if (!Buffer) {
Benjamin Kramera8857962014-10-26 22:44:13 +00005012 Diags.Report(diag::err_fe_unable_to_read_pch_file)
5013 << ASTFileName << Buffer.getError().message();
Vedant Kumar48b4f762018-04-14 01:40:48 +00005014 return std::string();
Guy Benyei11169dd2012-12-18 14:30:41 +00005015 }
5016
5017 // Initialize the stream
Peter Collingbourne77c89b62016-11-08 04:17:11 +00005018 BitstreamCursor Stream(PCHContainerRdr.ExtractPCH(**Buffer));
Guy Benyei11169dd2012-12-18 14:30:41 +00005019
5020 // Sniff for the signature.
JF Bastien0e828952019-06-26 19:50:12 +00005021 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
5022 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName << std::move(Err);
Vedant Kumar48b4f762018-04-14 01:40:48 +00005023 return std::string();
Guy Benyei11169dd2012-12-18 14:30:41 +00005024 }
David L. Jonesc4808b9e2016-12-15 20:53:26 +00005025
Chris Lattnere7b154b2013-01-19 21:39:22 +00005026 // Scan for the CONTROL_BLOCK_ID block.
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00005027 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00005028 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
Vedant Kumar48b4f762018-04-14 01:40:48 +00005029 return std::string();
Chris Lattnere7b154b2013-01-19 21:39:22 +00005030 }
Guy Benyei11169dd2012-12-18 14:30:41 +00005031
Chris Lattner7fb3bef2013-01-20 00:56:42 +00005032 // Scan for ORIGINAL_FILE inside the control block.
5033 RecordData Record;
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00005034 while (true) {
JF Bastien0e828952019-06-26 19:50:12 +00005035 Expected<llvm::BitstreamEntry> MaybeEntry =
5036 Stream.advanceSkippingSubblocks();
5037 if (!MaybeEntry) {
5038 // FIXME this drops errors on the floor.
5039 consumeError(MaybeEntry.takeError());
5040 return std::string();
5041 }
5042 llvm::BitstreamEntry Entry = MaybeEntry.get();
5043
Chris Lattnere7b154b2013-01-19 21:39:22 +00005044 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
Vedant Kumar48b4f762018-04-14 01:40:48 +00005045 return std::string();
David L. Jonesc4808b9e2016-12-15 20:53:26 +00005046
Chris Lattnere7b154b2013-01-19 21:39:22 +00005047 if (Entry.Kind != llvm::BitstreamEntry::Record) {
5048 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
Vedant Kumar48b4f762018-04-14 01:40:48 +00005049 return std::string();
Guy Benyei11169dd2012-12-18 14:30:41 +00005050 }
David L. Jonesc4808b9e2016-12-15 20:53:26 +00005051
Guy Benyei11169dd2012-12-18 14:30:41 +00005052 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00005053 StringRef Blob;
JF Bastien0e828952019-06-26 19:50:12 +00005054 Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record, &Blob);
5055 if (!MaybeRecord) {
5056 // FIXME this drops the errors on the floor.
5057 consumeError(MaybeRecord.takeError());
5058 return std::string();
5059 }
5060 if (ORIGINAL_FILE == MaybeRecord.get())
Chris Lattner0e6c9402013-01-20 02:38:54 +00005061 return Blob.str();
Guy Benyei11169dd2012-12-18 14:30:41 +00005062 }
Guy Benyei11169dd2012-12-18 14:30:41 +00005063}
5064
5065namespace {
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00005066
Guy Benyei11169dd2012-12-18 14:30:41 +00005067 class SimplePCHValidator : public ASTReaderListener {
5068 const LangOptions &ExistingLangOpts;
5069 const TargetOptions &ExistingTargetOpts;
5070 const PreprocessorOptions &ExistingPPOpts;
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00005071 std::string ExistingModuleCachePath;
Guy Benyei11169dd2012-12-18 14:30:41 +00005072 FileManager &FileMgr;
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00005073
Guy Benyei11169dd2012-12-18 14:30:41 +00005074 public:
5075 SimplePCHValidator(const LangOptions &ExistingLangOpts,
5076 const TargetOptions &ExistingTargetOpts,
5077 const PreprocessorOptions &ExistingPPOpts,
Benjamin Krameradcd0262020-01-28 20:23:46 +01005078 StringRef ExistingModuleCachePath, FileManager &FileMgr)
5079 : ExistingLangOpts(ExistingLangOpts),
5080 ExistingTargetOpts(ExistingTargetOpts),
5081 ExistingPPOpts(ExistingPPOpts),
5082 ExistingModuleCachePath(ExistingModuleCachePath), FileMgr(FileMgr) {}
Guy Benyei11169dd2012-12-18 14:30:41 +00005083
Richard Smith1e2cf0d2014-10-31 02:28:58 +00005084 bool ReadLanguageOptions(const LangOptions &LangOpts, bool Complain,
5085 bool AllowCompatibleDifferences) override {
5086 return checkLanguageOptions(ExistingLangOpts, LangOpts, nullptr,
5087 AllowCompatibleDifferences);
Guy Benyei11169dd2012-12-18 14:30:41 +00005088 }
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00005089
Chandler Carruth0d745bc2015-03-14 04:47:43 +00005090 bool ReadTargetOptions(const TargetOptions &TargetOpts, bool Complain,
5091 bool AllowCompatibleDifferences) override {
5092 return checkTargetOptions(ExistingTargetOpts, TargetOpts, nullptr,
5093 AllowCompatibleDifferences);
Guy Benyei11169dd2012-12-18 14:30:41 +00005094 }
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00005095
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00005096 bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
5097 StringRef SpecificModuleCachePath,
5098 bool Complain) override {
5099 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
5100 ExistingModuleCachePath,
5101 nullptr, ExistingLangOpts);
5102 }
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00005103
Craig Topper3e89dfe2014-03-13 02:13:41 +00005104 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
5105 bool Complain,
5106 std::string &SuggestedPredefines) override {
Craig Toppera13603a2014-05-22 05:54:18 +00005107 return checkPreprocessorOptions(ExistingPPOpts, PPOpts, nullptr, FileMgr,
Argyrios Kyrtzidisd3afa0c2013-04-26 21:33:40 +00005108 SuggestedPredefines, ExistingLangOpts);
Guy Benyei11169dd2012-12-18 14:30:41 +00005109 }
5110 };
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00005111
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00005112} // namespace
Guy Benyei11169dd2012-12-18 14:30:41 +00005113
Adrian Prantlbb165fb2015-06-20 18:53:08 +00005114bool ASTReader::readASTFileControlBlock(
5115 StringRef Filename, FileManager &FileMgr,
Adrian Prantlfb2398d2015-07-17 01:19:54 +00005116 const PCHContainerReader &PCHContainerRdr,
Douglas Gregor6623e1f2015-11-03 18:33:07 +00005117 bool FindModuleFileExtensions,
Manman Ren47a44452016-07-26 17:12:17 +00005118 ASTReaderListener &Listener, bool ValidateDiagnosticOptions) {
Guy Benyei11169dd2012-12-18 14:30:41 +00005119 // Open the AST file.
Richard Smith7f330cd2015-03-18 01:42:29 +00005120 // FIXME: This allows use of the VFS; we do not allow use of the
5121 // VFS when actually loading a module.
Benjamin Kramera8857962014-10-26 22:44:13 +00005122 auto Buffer = FileMgr.getBufferForFile(Filename);
Guy Benyei11169dd2012-12-18 14:30:41 +00005123 if (!Buffer) {
5124 return true;
5125 }
5126
5127 // Initialize the stream
Duncan P. N. Exon Smith60fa2882017-03-13 18:45:08 +00005128 StringRef Bytes = PCHContainerRdr.ExtractPCH(**Buffer);
5129 BitstreamCursor Stream(Bytes);
Guy Benyei11169dd2012-12-18 14:30:41 +00005130
5131 // Sniff for the signature.
JF Bastien0e828952019-06-26 19:50:12 +00005132 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
5133 consumeError(std::move(Err)); // FIXME this drops errors on the floor.
Guy Benyei11169dd2012-12-18 14:30:41 +00005134 return true;
JF Bastien0e828952019-06-26 19:50:12 +00005135 }
Guy Benyei11169dd2012-12-18 14:30:41 +00005136
Chris Lattner7fb3bef2013-01-20 00:56:42 +00005137 // Scan for the CONTROL_BLOCK_ID block.
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00005138 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID))
Chris Lattner7fb3bef2013-01-20 00:56:42 +00005139 return true;
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00005140
5141 bool NeedsInputFiles = Listener.needsInputFileVisitation();
Ben Langmuircb69b572014-03-07 06:40:32 +00005142 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
Richard Smithd4b230b2014-10-27 23:01:16 +00005143 bool NeedsImports = Listener.needsImportVisitation();
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00005144 BitstreamCursor InputFilesCursor;
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00005145
Guy Benyei11169dd2012-12-18 14:30:41 +00005146 RecordData Record;
Richard Smith7ed1bc92014-12-05 22:42:13 +00005147 std::string ModuleDir;
Douglas Gregor6623e1f2015-11-03 18:33:07 +00005148 bool DoneWithControlBlock = false;
5149 while (!DoneWithControlBlock) {
JF Bastien0e828952019-06-26 19:50:12 +00005150 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5151 if (!MaybeEntry) {
5152 // FIXME this drops the error on the floor.
5153 consumeError(MaybeEntry.takeError());
5154 return true;
5155 }
5156 llvm::BitstreamEntry Entry = MaybeEntry.get();
Richard Smith0516b182015-09-08 19:40:14 +00005157
5158 switch (Entry.Kind) {
5159 case llvm::BitstreamEntry::SubBlock: {
5160 switch (Entry.ID) {
5161 case OPTIONS_BLOCK_ID: {
5162 std::string IgnoredSuggestedPredefines;
5163 if (ReadOptionsBlock(Stream, ARR_ConfigurationMismatch | ARR_OutOfDate,
5164 /*AllowCompatibleConfigurationMismatch*/ false,
Duncan P. N. Exon Smith60fa2882017-03-13 18:45:08 +00005165 Listener, IgnoredSuggestedPredefines) != Success)
Richard Smith0516b182015-09-08 19:40:14 +00005166 return true;
5167 break;
5168 }
5169
5170 case INPUT_FILES_BLOCK_ID:
5171 InputFilesCursor = Stream;
JF Bastien0e828952019-06-26 19:50:12 +00005172 if (llvm::Error Err = Stream.SkipBlock()) {
5173 // FIXME this drops the error on the floor.
5174 consumeError(std::move(Err));
5175 return true;
5176 }
5177 if (NeedsInputFiles &&
5178 ReadBlockAbbrevs(InputFilesCursor, INPUT_FILES_BLOCK_ID))
Richard Smith0516b182015-09-08 19:40:14 +00005179 return true;
5180 break;
5181
5182 default:
JF Bastien0e828952019-06-26 19:50:12 +00005183 if (llvm::Error Err = Stream.SkipBlock()) {
5184 // FIXME this drops the error on the floor.
5185 consumeError(std::move(Err));
Richard Smith0516b182015-09-08 19:40:14 +00005186 return true;
JF Bastien0e828952019-06-26 19:50:12 +00005187 }
Richard Smith0516b182015-09-08 19:40:14 +00005188 break;
5189 }
5190
5191 continue;
5192 }
5193
5194 case llvm::BitstreamEntry::EndBlock:
Douglas Gregor6623e1f2015-11-03 18:33:07 +00005195 DoneWithControlBlock = true;
5196 break;
Richard Smith0516b182015-09-08 19:40:14 +00005197
5198 case llvm::BitstreamEntry::Error:
Chris Lattner7fb3bef2013-01-20 00:56:42 +00005199 return true;
Richard Smith0516b182015-09-08 19:40:14 +00005200
5201 case llvm::BitstreamEntry::Record:
5202 break;
5203 }
5204
Douglas Gregor6623e1f2015-11-03 18:33:07 +00005205 if (DoneWithControlBlock) break;
5206
Guy Benyei11169dd2012-12-18 14:30:41 +00005207 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00005208 StringRef Blob;
JF Bastien0e828952019-06-26 19:50:12 +00005209 Expected<unsigned> MaybeRecCode =
5210 Stream.readRecord(Entry.ID, Record, &Blob);
5211 if (!MaybeRecCode) {
5212 // FIXME this drops the error.
5213 return Failure;
5214 }
5215 switch ((ControlRecordTypes)MaybeRecCode.get()) {
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00005216 case METADATA:
Chris Lattner7fb3bef2013-01-20 00:56:42 +00005217 if (Record[0] != VERSION_MAJOR)
5218 return true;
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005219 if (Listener.ReadFullVersionInformation(Blob))
Chris Lattner7fb3bef2013-01-20 00:56:42 +00005220 return true;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00005221 break;
Ben Langmuir4f5212a2014-04-14 22:12:44 +00005222 case MODULE_NAME:
5223 Listener.ReadModuleName(Blob);
5224 break;
Richard Smith7ed1bc92014-12-05 22:42:13 +00005225 case MODULE_DIRECTORY:
Benjamin Krameradcd0262020-01-28 20:23:46 +01005226 ModuleDir = std::string(Blob);
Richard Smith7ed1bc92014-12-05 22:42:13 +00005227 break;
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00005228 case MODULE_MAP_FILE: {
5229 unsigned Idx = 0;
Richard Smith7ed1bc92014-12-05 22:42:13 +00005230 auto Path = ReadString(Record, Idx);
5231 ResolveImportedPath(Path, ModuleDir);
5232 Listener.ReadModuleMapFile(Path);
Ben Langmuir4f5212a2014-04-14 22:12:44 +00005233 break;
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00005234 }
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00005235 case INPUT_FILE_OFFSETS: {
5236 if (!NeedsInputFiles)
5237 break;
5238
5239 unsigned NumInputFiles = Record[0];
5240 unsigned NumUserFiles = Record[1];
Raphael Isemanneb13d3d2018-05-23 09:02:40 +00005241 const llvm::support::unaligned_uint64_t *InputFileOffs =
5242 (const llvm::support::unaligned_uint64_t *)Blob.data();
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00005243 for (unsigned I = 0; I != NumInputFiles; ++I) {
5244 // Go find this input file.
5245 bool isSystemFile = I >= NumUserFiles;
Ben Langmuircb69b572014-03-07 06:40:32 +00005246
5247 if (isSystemFile && !NeedsSystemInputFiles)
5248 break; // the rest are system input files
5249
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00005250 BitstreamCursor &Cursor = InputFilesCursor;
5251 SavedStreamPosition SavedPosition(Cursor);
JF Bastien0e828952019-06-26 19:50:12 +00005252 if (llvm::Error Err = Cursor.JumpToBit(InputFileOffs[I])) {
5253 // FIXME this drops errors on the floor.
5254 consumeError(std::move(Err));
5255 }
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00005256
JF Bastien0e828952019-06-26 19:50:12 +00005257 Expected<unsigned> MaybeCode = Cursor.ReadCode();
5258 if (!MaybeCode) {
5259 // FIXME this drops errors on the floor.
5260 consumeError(MaybeCode.takeError());
5261 }
5262 unsigned Code = MaybeCode.get();
5263
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00005264 RecordData Record;
5265 StringRef Blob;
5266 bool shouldContinue = false;
JF Bastien0e828952019-06-26 19:50:12 +00005267 Expected<unsigned> MaybeRecordType =
5268 Cursor.readRecord(Code, Record, &Blob);
5269 if (!MaybeRecordType) {
5270 // FIXME this drops errors on the floor.
5271 consumeError(MaybeRecordType.takeError());
5272 }
5273 switch ((InputFileRecordTypes)MaybeRecordType.get()) {
Bruno Cardoso Lopes1731fc82019-10-15 14:23:55 +00005274 case INPUT_FILE_HASH:
5275 break;
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00005276 case INPUT_FILE:
Vedant Kumar48b4f762018-04-14 01:40:48 +00005277 bool Overridden = static_cast<bool>(Record[3]);
Benjamin Krameradcd0262020-01-28 20:23:46 +01005278 std::string Filename = std::string(Blob);
Richard Smith7ed1bc92014-12-05 22:42:13 +00005279 ResolveImportedPath(Filename, ModuleDir);
Richard Smith216a3bd2015-08-13 17:57:10 +00005280 shouldContinue = Listener.visitInputFile(
5281 Filename, isSystemFile, Overridden, /*IsExplicitModule*/false);
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00005282 break;
5283 }
5284 if (!shouldContinue)
5285 break;
5286 }
5287 break;
5288 }
5289
Richard Smithd4b230b2014-10-27 23:01:16 +00005290 case IMPORTS: {
5291 if (!NeedsImports)
5292 break;
5293
5294 unsigned Idx = 0, N = Record.size();
5295 while (Idx < N) {
5296 // Read information about the AST file.
Bruno Cardoso Lopes6fc8a562018-09-11 05:17:13 +00005297 Idx += 1+1+1+1+5; // Kind, ImportLoc, Size, ModTime, Signature
5298 std::string ModuleName = ReadString(Record, Idx);
Richard Smith7ed1bc92014-12-05 22:42:13 +00005299 std::string Filename = ReadString(Record, Idx);
5300 ResolveImportedPath(Filename, ModuleDir);
Bruno Cardoso Lopes6fc8a562018-09-11 05:17:13 +00005301 Listener.visitImport(ModuleName, Filename);
Richard Smithd4b230b2014-10-27 23:01:16 +00005302 }
5303 break;
5304 }
5305
Chris Lattner7fb3bef2013-01-20 00:56:42 +00005306 default:
5307 // No other validation to perform.
5308 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00005309 }
5310 }
Douglas Gregor6623e1f2015-11-03 18:33:07 +00005311
5312 // Look for module file extension blocks, if requested.
5313 if (FindModuleFileExtensions) {
Duncan P. N. Exon Smith60fa2882017-03-13 18:45:08 +00005314 BitstreamCursor SavedStream = Stream;
Douglas Gregor6623e1f2015-11-03 18:33:07 +00005315 while (!SkipCursorToBlock(Stream, EXTENSION_BLOCK_ID)) {
5316 bool DoneWithExtensionBlock = false;
5317 while (!DoneWithExtensionBlock) {
JF Bastien0e828952019-06-26 19:50:12 +00005318 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5319 if (!MaybeEntry) {
5320 // FIXME this drops the error.
5321 return true;
5322 }
5323 llvm::BitstreamEntry Entry = MaybeEntry.get();
Douglas Gregor6623e1f2015-11-03 18:33:07 +00005324
JF Bastien0e828952019-06-26 19:50:12 +00005325 switch (Entry.Kind) {
5326 case llvm::BitstreamEntry::SubBlock:
5327 if (llvm::Error Err = Stream.SkipBlock()) {
5328 // FIXME this drops the error on the floor.
5329 consumeError(std::move(Err));
5330 return true;
5331 }
5332 continue;
Douglas Gregor6623e1f2015-11-03 18:33:07 +00005333
JF Bastien0e828952019-06-26 19:50:12 +00005334 case llvm::BitstreamEntry::EndBlock:
5335 DoneWithExtensionBlock = true;
5336 continue;
Douglas Gregor6623e1f2015-11-03 18:33:07 +00005337
JF Bastien0e828952019-06-26 19:50:12 +00005338 case llvm::BitstreamEntry::Error:
5339 return true;
Douglas Gregor6623e1f2015-11-03 18:33:07 +00005340
JF Bastien0e828952019-06-26 19:50:12 +00005341 case llvm::BitstreamEntry::Record:
5342 break;
5343 }
Douglas Gregor6623e1f2015-11-03 18:33:07 +00005344
5345 Record.clear();
5346 StringRef Blob;
JF Bastien0e828952019-06-26 19:50:12 +00005347 Expected<unsigned> MaybeRecCode =
5348 Stream.readRecord(Entry.ID, Record, &Blob);
5349 if (!MaybeRecCode) {
5350 // FIXME this drops the error.
5351 return true;
5352 }
5353 switch (MaybeRecCode.get()) {
Douglas Gregor6623e1f2015-11-03 18:33:07 +00005354 case EXTENSION_METADATA: {
5355 ModuleFileExtensionMetadata Metadata;
5356 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata))
5357 return true;
5358
5359 Listener.readModuleFileExtension(Metadata);
5360 break;
5361 }
5362 }
5363 }
5364 }
Duncan P. N. Exon Smith60fa2882017-03-13 18:45:08 +00005365 Stream = SavedStream;
Douglas Gregor6623e1f2015-11-03 18:33:07 +00005366 }
5367
Duncan P. N. Exon Smith60fa2882017-03-13 18:45:08 +00005368 // Scan for the UNHASHED_CONTROL_BLOCK_ID block.
5369 if (readUnhashedControlBlockImpl(
5370 nullptr, Bytes, ARR_ConfigurationMismatch | ARR_OutOfDate,
5371 /*AllowCompatibleConfigurationMismatch*/ false, &Listener,
5372 ValidateDiagnosticOptions) != Success)
5373 return true;
5374
Douglas Gregor6623e1f2015-11-03 18:33:07 +00005375 return false;
Guy Benyei11169dd2012-12-18 14:30:41 +00005376}
5377
Benjamin Kramerf6021ec2017-03-21 21:35:04 +00005378bool ASTReader::isAcceptableASTFile(StringRef Filename, FileManager &FileMgr,
5379 const PCHContainerReader &PCHContainerRdr,
5380 const LangOptions &LangOpts,
5381 const TargetOptions &TargetOpts,
5382 const PreprocessorOptions &PPOpts,
5383 StringRef ExistingModuleCachePath) {
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00005384 SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts,
5385 ExistingModuleCachePath, FileMgr);
Adrian Prantlfb2398d2015-07-17 01:19:54 +00005386 return !readASTFileControlBlock(Filename, FileMgr, PCHContainerRdr,
Douglas Gregor6623e1f2015-11-03 18:33:07 +00005387 /*FindModuleFileExtensions=*/false,
Manman Ren47a44452016-07-26 17:12:17 +00005388 validator,
5389 /*ValidateDiagnosticOptions=*/true);
Guy Benyei11169dd2012-12-18 14:30:41 +00005390}
5391
Ben Langmuir2c9af442014-04-10 17:57:43 +00005392ASTReader::ASTReadResult
5393ASTReader::ReadSubmoduleBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
Guy Benyei11169dd2012-12-18 14:30:41 +00005394 // Enter the submodule block.
JF Bastien0e828952019-06-26 19:50:12 +00005395 if (llvm::Error Err = F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) {
5396 Error(std::move(Err));
Ben Langmuir2c9af442014-04-10 17:57:43 +00005397 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00005398 }
5399
5400 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
5401 bool First = true;
Craig Toppera13603a2014-05-22 05:54:18 +00005402 Module *CurrentModule = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00005403 RecordData Record;
5404 while (true) {
JF Bastien0e828952019-06-26 19:50:12 +00005405 Expected<llvm::BitstreamEntry> MaybeEntry =
5406 F.Stream.advanceSkippingSubblocks();
5407 if (!MaybeEntry) {
5408 Error(MaybeEntry.takeError());
5409 return Failure;
5410 }
5411 llvm::BitstreamEntry Entry = MaybeEntry.get();
David L. Jonesc4808b9e2016-12-15 20:53:26 +00005412
Chris Lattner7fb3bef2013-01-20 00:56:42 +00005413 switch (Entry.Kind) {
5414 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
5415 case llvm::BitstreamEntry::Error:
5416 Error("malformed block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00005417 return Failure;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00005418 case llvm::BitstreamEntry::EndBlock:
Ben Langmuir2c9af442014-04-10 17:57:43 +00005419 return Success;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00005420 case llvm::BitstreamEntry::Record:
5421 // The interesting case.
5422 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00005423 }
Chris Lattner7fb3bef2013-01-20 00:56:42 +00005424
Guy Benyei11169dd2012-12-18 14:30:41 +00005425 // Read a record.
Chris Lattner0e6c9402013-01-20 02:38:54 +00005426 StringRef Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00005427 Record.clear();
JF Bastien0e828952019-06-26 19:50:12 +00005428 Expected<unsigned> MaybeKind = F.Stream.readRecord(Entry.ID, Record, &Blob);
5429 if (!MaybeKind) {
5430 Error(MaybeKind.takeError());
5431 return Failure;
5432 }
5433 unsigned Kind = MaybeKind.get();
Richard Smith03478d92014-10-23 22:12:14 +00005434
5435 if ((Kind == SUBMODULE_METADATA) != First) {
5436 Error("submodule metadata record should be at beginning of block");
5437 return Failure;
5438 }
5439 First = false;
5440
5441 // Submodule information is only valid if we have a current module.
5442 // FIXME: Should we error on these cases?
5443 if (!CurrentModule && Kind != SUBMODULE_METADATA &&
5444 Kind != SUBMODULE_DEFINITION)
5445 continue;
5446
5447 switch (Kind) {
Guy Benyei11169dd2012-12-18 14:30:41 +00005448 default: // Default behavior: ignore.
5449 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00005450
Richard Smith03478d92014-10-23 22:12:14 +00005451 case SUBMODULE_DEFINITION: {
Jordan Rose90b0a1f2018-04-20 17:16:04 +00005452 if (Record.size() < 12) {
Guy Benyei11169dd2012-12-18 14:30:41 +00005453 Error("malformed module definition");
Ben Langmuir2c9af442014-04-10 17:57:43 +00005454 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00005455 }
Richard Smith03478d92014-10-23 22:12:14 +00005456
Chris Lattner0e6c9402013-01-20 02:38:54 +00005457 StringRef Name = Blob;
Richard Smith9bca2982014-03-08 00:03:56 +00005458 unsigned Idx = 0;
5459 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]);
5460 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]);
Vedant Kumar48b4f762018-04-14 01:40:48 +00005461 Module::ModuleKind Kind = (Module::ModuleKind)Record[Idx++];
Richard Smith9bca2982014-03-08 00:03:56 +00005462 bool IsFramework = Record[Idx++];
5463 bool IsExplicit = Record[Idx++];
5464 bool IsSystem = Record[Idx++];
5465 bool IsExternC = Record[Idx++];
5466 bool InferSubmodules = Record[Idx++];
5467 bool InferExplicitSubmodules = Record[Idx++];
5468 bool InferExportWildcard = Record[Idx++];
5469 bool ConfigMacrosExhaustive = Record[Idx++];
Jordan Rose90b0a1f2018-04-20 17:16:04 +00005470 bool ModuleMapIsPrivate = Record[Idx++];
Douglas Gregor8d932422013-03-20 03:59:18 +00005471
Ben Langmuirbeee15e2014-04-14 18:00:01 +00005472 Module *ParentModule = nullptr;
Ben Langmuir9d6448b2014-08-09 00:57:23 +00005473 if (Parent)
Guy Benyei11169dd2012-12-18 14:30:41 +00005474 ParentModule = getSubmodule(Parent);
Ben Langmuirbeee15e2014-04-14 18:00:01 +00005475
Guy Benyei11169dd2012-12-18 14:30:41 +00005476 // Retrieve this (sub)module from the module map, creating it if
5477 // necessary.
David Blaikie9ffe5a32017-01-30 05:00:26 +00005478 CurrentModule =
5479 ModMap.findOrCreateModule(Name, ParentModule, IsFramework, IsExplicit)
5480 .first;
Ben Langmuir9d6448b2014-08-09 00:57:23 +00005481
5482 // FIXME: set the definition loc for CurrentModule, or call
5483 // ModMap.setInferredModuleAllowedBy()
5484
Guy Benyei11169dd2012-12-18 14:30:41 +00005485 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS;
5486 if (GlobalIndex >= SubmodulesLoaded.size() ||
5487 SubmodulesLoaded[GlobalIndex]) {
5488 Error("too many submodules");
Ben Langmuir2c9af442014-04-10 17:57:43 +00005489 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00005490 }
Douglas Gregor8a114ab2013-02-06 22:40:31 +00005491
Douglas Gregor7029ce12013-03-19 00:28:20 +00005492 if (!ParentModule) {
5493 if (const FileEntry *CurFile = CurrentModule->getASTFile()) {
Yuka Takahashid8baec22018-08-01 09:50:02 +00005494 // Don't emit module relocation error if we have -fno-validate-pch
5495 if (!PP.getPreprocessorOpts().DisablePCHValidation &&
5496 CurFile != F.File) {
Duncan P. N. Exon Smitheef69022019-11-10 11:17:42 -08005497 Error(diag::err_module_file_conflict,
5498 CurrentModule->getTopLevelModuleName(), CurFile->getName(),
5499 F.File->getName());
Ben Langmuir2c9af442014-04-10 17:57:43 +00005500 return Failure;
Douglas Gregor8a114ab2013-02-06 22:40:31 +00005501 }
Douglas Gregor8a114ab2013-02-06 22:40:31 +00005502 }
Douglas Gregor7029ce12013-03-19 00:28:20 +00005503
Duncan P. N. Exon Smith83dcb342019-11-10 13:14:52 -08005504 F.DidReadTopLevelSubmodule = true;
Douglas Gregor7029ce12013-03-19 00:28:20 +00005505 CurrentModule->setASTFile(F.File);
Richard Smithab755972017-06-05 18:10:11 +00005506 CurrentModule->PresumedModuleMapFile = F.ModuleMapPath;
Douglas Gregor8a114ab2013-02-06 22:40:31 +00005507 }
Ben Langmuirbeee15e2014-04-14 18:00:01 +00005508
Richard Smithdd8b5332017-09-04 05:37:53 +00005509 CurrentModule->Kind = Kind;
Adrian Prantl15bcf702015-06-30 17:39:43 +00005510 CurrentModule->Signature = F.Signature;
Guy Benyei11169dd2012-12-18 14:30:41 +00005511 CurrentModule->IsFromModuleFile = true;
5512 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem;
Richard Smith9bca2982014-03-08 00:03:56 +00005513 CurrentModule->IsExternC = IsExternC;
Guy Benyei11169dd2012-12-18 14:30:41 +00005514 CurrentModule->InferSubmodules = InferSubmodules;
5515 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules;
5516 CurrentModule->InferExportWildcard = InferExportWildcard;
Douglas Gregor8d932422013-03-20 03:59:18 +00005517 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive;
Jordan Rose90b0a1f2018-04-20 17:16:04 +00005518 CurrentModule->ModuleMapIsPrivate = ModuleMapIsPrivate;
Guy Benyei11169dd2012-12-18 14:30:41 +00005519 if (DeserializationListener)
5520 DeserializationListener->ModuleRead(GlobalID, CurrentModule);
David L. Jonesc4808b9e2016-12-15 20:53:26 +00005521
Guy Benyei11169dd2012-12-18 14:30:41 +00005522 SubmodulesLoaded[GlobalIndex] = CurrentModule;
Douglas Gregor6ddfca92013-01-14 17:21:00 +00005523
Richard Smith8a3e39a2016-03-28 21:31:09 +00005524 // Clear out data that will be replaced by what is in the module file.
Douglas Gregor6ddfca92013-01-14 17:21:00 +00005525 CurrentModule->LinkLibraries.clear();
Douglas Gregor8d932422013-03-20 03:59:18 +00005526 CurrentModule->ConfigMacros.clear();
Douglas Gregorfb912652013-03-20 21:10:35 +00005527 CurrentModule->UnresolvedConflicts.clear();
5528 CurrentModule->Conflicts.clear();
Richard Smith8a3e39a2016-03-28 21:31:09 +00005529
5530 // The module is available unless it's missing a requirement; relevant
5531 // requirements will be (re-)added by SUBMODULE_REQUIRES records.
5532 // Missing headers that were present when the module was built do not
5533 // make it unavailable -- if we got this far, this must be an explicitly
5534 // imported module file.
5535 CurrentModule->Requirements.clear();
5536 CurrentModule->MissingHeaders.clear();
5537 CurrentModule->IsMissingRequirement =
5538 ParentModule && ParentModule->IsMissingRequirement;
5539 CurrentModule->IsAvailable = !CurrentModule->IsMissingRequirement;
Guy Benyei11169dd2012-12-18 14:30:41 +00005540 break;
5541 }
Richard Smith8a3e39a2016-03-28 21:31:09 +00005542
Guy Benyei11169dd2012-12-18 14:30:41 +00005543 case SUBMODULE_UMBRELLA_HEADER: {
Benjamin Krameradcd0262020-01-28 20:23:46 +01005544 std::string Filename = std::string(Blob);
Richard Smith2b63d152015-05-16 02:28:53 +00005545 ResolveImportedPath(F, Filename);
Harlan Haskins8d323d12019-08-01 21:31:56 +00005546 if (auto Umbrella = PP.getFileManager().getFile(Filename)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00005547 if (!CurrentModule->getUmbrellaHeader())
Harlan Haskins8d323d12019-08-01 21:31:56 +00005548 ModMap.setUmbrellaHeader(CurrentModule, *Umbrella, Blob);
5549 else if (CurrentModule->getUmbrellaHeader().Entry != *Umbrella) {
Bruno Cardoso Lopes573b13f2017-03-22 00:11:21 +00005550 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
5551 Error("mismatched umbrella headers in submodule");
5552 return OutOfDate;
Guy Benyei11169dd2012-12-18 14:30:41 +00005553 }
5554 }
5555 break;
5556 }
David L. Jonesc4808b9e2016-12-15 20:53:26 +00005557
Richard Smith202210b2014-10-24 20:23:01 +00005558 case SUBMODULE_HEADER:
5559 case SUBMODULE_EXCLUDED_HEADER:
5560 case SUBMODULE_PRIVATE_HEADER:
5561 // We lazily associate headers with their modules via the HeaderInfo table.
Argyrios Kyrtzidisb146baa2013-03-13 21:13:51 +00005562 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
5563 // of complete filenames or remove it entirely.
Richard Smith202210b2014-10-24 20:23:01 +00005564 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00005565
Richard Smith202210b2014-10-24 20:23:01 +00005566 case SUBMODULE_TEXTUAL_HEADER:
5567 case SUBMODULE_PRIVATE_TEXTUAL_HEADER:
5568 // FIXME: Textual headers are not marked in the HeaderInfo table. Load
5569 // them here.
5570 break;
Lawrence Crowlb53e5482013-06-20 21:14:14 +00005571
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00005572 case SUBMODULE_TOPHEADER:
Argyrios Kyrtzidis3c5305c2013-03-13 21:13:43 +00005573 CurrentModule->addTopHeaderFilename(Blob);
Guy Benyei11169dd2012-12-18 14:30:41 +00005574 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00005575
5576 case SUBMODULE_UMBRELLA_DIR: {
Benjamin Krameradcd0262020-01-28 20:23:46 +01005577 std::string Dirname = std::string(Blob);
Richard Smith2b63d152015-05-16 02:28:53 +00005578 ResolveImportedPath(F, Dirname);
Harlan Haskins8d323d12019-08-01 21:31:56 +00005579 if (auto Umbrella = PP.getFileManager().getDirectory(Dirname)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00005580 if (!CurrentModule->getUmbrellaDir())
Harlan Haskins8d323d12019-08-01 21:31:56 +00005581 ModMap.setUmbrellaDir(CurrentModule, *Umbrella, Blob);
5582 else if (CurrentModule->getUmbrellaDir().Entry != *Umbrella) {
Ben Langmuir2c9af442014-04-10 17:57:43 +00005583 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
5584 Error("mismatched umbrella directories in submodule");
5585 return OutOfDate;
Guy Benyei11169dd2012-12-18 14:30:41 +00005586 }
5587 }
5588 break;
5589 }
David L. Jonesc4808b9e2016-12-15 20:53:26 +00005590
Guy Benyei11169dd2012-12-18 14:30:41 +00005591 case SUBMODULE_METADATA: {
Guy Benyei11169dd2012-12-18 14:30:41 +00005592 F.BaseSubmoduleID = getTotalNumSubmodules();
5593 F.LocalNumSubmodules = Record[0];
5594 unsigned LocalBaseSubmoduleID = Record[1];
5595 if (F.LocalNumSubmodules > 0) {
David L. Jonesc4808b9e2016-12-15 20:53:26 +00005596 // Introduce the global -> local mapping for submodules within this
Guy Benyei11169dd2012-12-18 14:30:41 +00005597 // module.
5598 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F));
David L. Jonesc4808b9e2016-12-15 20:53:26 +00005599
5600 // Introduce the local -> global mapping for submodules within this
Guy Benyei11169dd2012-12-18 14:30:41 +00005601 // module.
5602 F.SubmoduleRemap.insertOrReplace(
5603 std::make_pair(LocalBaseSubmoduleID,
5604 F.BaseSubmoduleID - LocalBaseSubmoduleID));
Ben Langmuirfe971d92014-08-16 04:54:18 +00005605
Ben Langmuir52ca6782014-10-20 16:27:32 +00005606 SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules);
5607 }
Guy Benyei11169dd2012-12-18 14:30:41 +00005608 break;
5609 }
David L. Jonesc4808b9e2016-12-15 20:53:26 +00005610
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00005611 case SUBMODULE_IMPORTS:
Guy Benyei11169dd2012-12-18 14:30:41 +00005612 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) {
Douglas Gregorfb912652013-03-20 21:10:35 +00005613 UnresolvedModuleRef Unresolved;
Guy Benyei11169dd2012-12-18 14:30:41 +00005614 Unresolved.File = &F;
5615 Unresolved.Mod = CurrentModule;
5616 Unresolved.ID = Record[Idx];
Douglas Gregorfb912652013-03-20 21:10:35 +00005617 Unresolved.Kind = UnresolvedModuleRef::Import;
Guy Benyei11169dd2012-12-18 14:30:41 +00005618 Unresolved.IsWildcard = false;
Douglas Gregorfb912652013-03-20 21:10:35 +00005619 UnresolvedModuleRefs.push_back(Unresolved);
Guy Benyei11169dd2012-12-18 14:30:41 +00005620 }
5621 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00005622
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00005623 case SUBMODULE_EXPORTS:
Guy Benyei11169dd2012-12-18 14:30:41 +00005624 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) {
Douglas Gregorfb912652013-03-20 21:10:35 +00005625 UnresolvedModuleRef Unresolved;
Guy Benyei11169dd2012-12-18 14:30:41 +00005626 Unresolved.File = &F;
5627 Unresolved.Mod = CurrentModule;
5628 Unresolved.ID = Record[Idx];
Douglas Gregorfb912652013-03-20 21:10:35 +00005629 Unresolved.Kind = UnresolvedModuleRef::Export;
Guy Benyei11169dd2012-12-18 14:30:41 +00005630 Unresolved.IsWildcard = Record[Idx + 1];
Douglas Gregorfb912652013-03-20 21:10:35 +00005631 UnresolvedModuleRefs.push_back(Unresolved);
Guy Benyei11169dd2012-12-18 14:30:41 +00005632 }
David L. Jonesc4808b9e2016-12-15 20:53:26 +00005633
5634 // Once we've loaded the set of exports, there's no reason to keep
Guy Benyei11169dd2012-12-18 14:30:41 +00005635 // the parsed, unresolved exports around.
5636 CurrentModule->UnresolvedExports.clear();
5637 break;
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00005638
5639 case SUBMODULE_REQUIRES:
Richard Smithdbafb6c2017-06-29 23:23:46 +00005640 CurrentModule->addRequirement(Blob, Record[0], PP.getLangOpts(),
5641 PP.getTargetInfo());
Guy Benyei11169dd2012-12-18 14:30:41 +00005642 break;
Douglas Gregor6ddfca92013-01-14 17:21:00 +00005643
5644 case SUBMODULE_LINK_LIBRARY:
Bruno Cardoso Lopesa3b5f712018-04-16 19:42:32 +00005645 ModMap.resolveLinkAsDependencies(CurrentModule);
Douglas Gregor6ddfca92013-01-14 17:21:00 +00005646 CurrentModule->LinkLibraries.push_back(
Benjamin Krameradcd0262020-01-28 20:23:46 +01005647 Module::LinkLibrary(std::string(Blob), Record[0]));
Douglas Gregor6ddfca92013-01-14 17:21:00 +00005648 break;
Douglas Gregor35b13ec2013-03-20 00:22:05 +00005649
5650 case SUBMODULE_CONFIG_MACRO:
Douglas Gregor35b13ec2013-03-20 00:22:05 +00005651 CurrentModule->ConfigMacros.push_back(Blob.str());
5652 break;
Douglas Gregorfb912652013-03-20 21:10:35 +00005653
5654 case SUBMODULE_CONFLICT: {
Douglas Gregorfb912652013-03-20 21:10:35 +00005655 UnresolvedModuleRef Unresolved;
5656 Unresolved.File = &F;
5657 Unresolved.Mod = CurrentModule;
5658 Unresolved.ID = Record[0];
5659 Unresolved.Kind = UnresolvedModuleRef::Conflict;
5660 Unresolved.IsWildcard = false;
5661 Unresolved.String = Blob;
5662 UnresolvedModuleRefs.push_back(Unresolved);
5663 break;
5664 }
Richard Smithdc1f0422016-07-20 19:10:16 +00005665
Douglas Gregorf0b11de2017-09-14 23:38:44 +00005666 case SUBMODULE_INITIALIZERS: {
Richard Smithdbafb6c2017-06-29 23:23:46 +00005667 if (!ContextObj)
5668 break;
Richard Smithdc1f0422016-07-20 19:10:16 +00005669 SmallVector<uint32_t, 16> Inits;
5670 for (auto &ID : Record)
5671 Inits.push_back(getGlobalDeclID(F, ID));
Richard Smithdbafb6c2017-06-29 23:23:46 +00005672 ContextObj->addLazyModuleInitializers(CurrentModule, Inits);
Richard Smithdc1f0422016-07-20 19:10:16 +00005673 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00005674 }
Douglas Gregorf0b11de2017-09-14 23:38:44 +00005675
5676 case SUBMODULE_EXPORT_AS:
5677 CurrentModule->ExportAsModule = Blob.str();
Bruno Cardoso Lopesa3b5f712018-04-16 19:42:32 +00005678 ModMap.addLinkAsDependency(CurrentModule);
Douglas Gregorf0b11de2017-09-14 23:38:44 +00005679 break;
5680 }
Guy Benyei11169dd2012-12-18 14:30:41 +00005681 }
5682}
5683
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00005684/// Parse the record that corresponds to a LangOptions data
Guy Benyei11169dd2012-12-18 14:30:41 +00005685/// structure.
5686///
5687/// This routine parses the language options from the AST file and then gives
5688/// them to the AST listener if one is set.
5689///
5690/// \returns true if the listener deems the file unacceptable, false otherwise.
5691bool ASTReader::ParseLanguageOptions(const RecordData &Record,
5692 bool Complain,
Richard Smith1e2cf0d2014-10-31 02:28:58 +00005693 ASTReaderListener &Listener,
5694 bool AllowCompatibleDifferences) {
Guy Benyei11169dd2012-12-18 14:30:41 +00005695 LangOptions LangOpts;
5696 unsigned Idx = 0;
5697#define LANGOPT(Name, Bits, Default, Description) \
5698 LangOpts.Name = Record[Idx++];
5699#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
5700 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
5701#include "clang/Basic/LangOptions.def"
Alexey Samsonovedf99a92014-11-07 22:29:38 +00005702#define SANITIZER(NAME, ID) \
5703 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]);
Will Dietzf54319c2013-01-18 11:30:38 +00005704#include "clang/Basic/Sanitizers.def"
Guy Benyei11169dd2012-12-18 14:30:41 +00005705
Ben Langmuircd98cb72015-06-23 18:20:18 +00005706 for (unsigned N = Record[Idx++]; N; --N)
5707 LangOpts.ModuleFeatures.push_back(ReadString(Record, Idx));
5708
Vedant Kumar48b4f762018-04-14 01:40:48 +00005709 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++];
Guy Benyei11169dd2012-12-18 14:30:41 +00005710 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx);
5711 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005712
Ben Langmuird4a667a2015-06-23 18:20:23 +00005713 LangOpts.CurrentModule = ReadString(Record, Idx);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005714
5715 // Comment options.
5716 for (unsigned N = Record[Idx++]; N; --N) {
5717 LangOpts.CommentOpts.BlockCommandNames.push_back(
5718 ReadString(Record, Idx));
5719 }
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005720 LangOpts.CommentOpts.ParseAllComments = Record[Idx++];
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005721
Samuel Antaoee8fb302016-01-06 13:42:12 +00005722 // OpenMP offloading options.
5723 for (unsigned N = Record[Idx++]; N; --N) {
5724 LangOpts.OMPTargetTriples.push_back(llvm::Triple(ReadString(Record, Idx)));
5725 }
5726
5727 LangOpts.OMPHostIRFile = ReadString(Record, Idx);
5728
Richard Smith1e2cf0d2014-10-31 02:28:58 +00005729 return Listener.ReadLanguageOptions(LangOpts, Complain,
5730 AllowCompatibleDifferences);
Guy Benyei11169dd2012-12-18 14:30:41 +00005731}
5732
Chandler Carruth0d745bc2015-03-14 04:47:43 +00005733bool ASTReader::ParseTargetOptions(const RecordData &Record, bool Complain,
5734 ASTReaderListener &Listener,
5735 bool AllowCompatibleDifferences) {
Guy Benyei11169dd2012-12-18 14:30:41 +00005736 unsigned Idx = 0;
5737 TargetOptions TargetOpts;
5738 TargetOpts.Triple = ReadString(Record, Idx);
5739 TargetOpts.CPU = ReadString(Record, Idx);
5740 TargetOpts.ABI = ReadString(Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00005741 for (unsigned N = Record[Idx++]; N; --N) {
5742 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx));
5743 }
5744 for (unsigned N = Record[Idx++]; N; --N) {
5745 TargetOpts.Features.push_back(ReadString(Record, Idx));
5746 }
5747
Chandler Carruth0d745bc2015-03-14 04:47:43 +00005748 return Listener.ReadTargetOptions(TargetOpts, Complain,
5749 AllowCompatibleDifferences);
Guy Benyei11169dd2012-12-18 14:30:41 +00005750}
5751
5752bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain,
5753 ASTReaderListener &Listener) {
Ben Langmuirb92de022014-04-29 16:25:26 +00005754 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions);
Guy Benyei11169dd2012-12-18 14:30:41 +00005755 unsigned Idx = 0;
Ben Langmuirb92de022014-04-29 16:25:26 +00005756#define DIAGOPT(Name, Bits, Default) DiagOpts->Name = Record[Idx++];
Guy Benyei11169dd2012-12-18 14:30:41 +00005757#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
Ben Langmuirb92de022014-04-29 16:25:26 +00005758 DiagOpts->set##Name(static_cast<Type>(Record[Idx++]));
Guy Benyei11169dd2012-12-18 14:30:41 +00005759#include "clang/Basic/DiagnosticOptions.def"
5760
Richard Smith3be1cb22014-08-07 00:24:21 +00005761 for (unsigned N = Record[Idx++]; N; --N)
Ben Langmuirb92de022014-04-29 16:25:26 +00005762 DiagOpts->Warnings.push_back(ReadString(Record, Idx));
Richard Smith3be1cb22014-08-07 00:24:21 +00005763 for (unsigned N = Record[Idx++]; N; --N)
5764 DiagOpts->Remarks.push_back(ReadString(Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00005765
5766 return Listener.ReadDiagnosticOptions(DiagOpts, Complain);
5767}
5768
5769bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain,
5770 ASTReaderListener &Listener) {
5771 FileSystemOptions FSOpts;
5772 unsigned Idx = 0;
5773 FSOpts.WorkingDir = ReadString(Record, Idx);
5774 return Listener.ReadFileSystemOptions(FSOpts, Complain);
5775}
5776
5777bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record,
5778 bool Complain,
5779 ASTReaderListener &Listener) {
5780 HeaderSearchOptions HSOpts;
5781 unsigned Idx = 0;
5782 HSOpts.Sysroot = ReadString(Record, Idx);
5783
5784 // Include entries.
5785 for (unsigned N = Record[Idx++]; N; --N) {
5786 std::string Path = ReadString(Record, Idx);
Vedant Kumar48b4f762018-04-14 01:40:48 +00005787 frontend::IncludeDirGroup Group
5788 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]);
Guy Benyei11169dd2012-12-18 14:30:41 +00005789 bool IsFramework = Record[Idx++];
5790 bool IgnoreSysRoot = Record[Idx++];
Benjamin Kramer3204b152015-05-29 19:42:19 +00005791 HSOpts.UserEntries.emplace_back(std::move(Path), Group, IsFramework,
5792 IgnoreSysRoot);
Guy Benyei11169dd2012-12-18 14:30:41 +00005793 }
5794
5795 // System header prefixes.
5796 for (unsigned N = Record[Idx++]; N; --N) {
5797 std::string Prefix = ReadString(Record, Idx);
5798 bool IsSystemHeader = Record[Idx++];
Benjamin Kramer3204b152015-05-29 19:42:19 +00005799 HSOpts.SystemHeaderPrefixes.emplace_back(std::move(Prefix), IsSystemHeader);
Guy Benyei11169dd2012-12-18 14:30:41 +00005800 }
5801
5802 HSOpts.ResourceDir = ReadString(Record, Idx);
5803 HSOpts.ModuleCachePath = ReadString(Record, Idx);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00005804 HSOpts.ModuleUserBuildPath = ReadString(Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00005805 HSOpts.DisableModuleHash = Record[Idx++];
Richard Smith18934752017-06-06 00:32:01 +00005806 HSOpts.ImplicitModuleMaps = Record[Idx++];
5807 HSOpts.ModuleMapFileHomeIsCwd = Record[Idx++];
Guy Benyei11169dd2012-12-18 14:30:41 +00005808 HSOpts.UseBuiltinIncludes = Record[Idx++];
5809 HSOpts.UseStandardSystemIncludes = Record[Idx++];
5810 HSOpts.UseStandardCXXIncludes = Record[Idx++];
5811 HSOpts.UseLibcxx = Record[Idx++];
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00005812 std::string SpecificModuleCachePath = ReadString(Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00005813
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00005814 return Listener.ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
5815 Complain);
Guy Benyei11169dd2012-12-18 14:30:41 +00005816}
5817
5818bool ASTReader::ParsePreprocessorOptions(const RecordData &Record,
5819 bool Complain,
5820 ASTReaderListener &Listener,
5821 std::string &SuggestedPredefines) {
5822 PreprocessorOptions PPOpts;
5823 unsigned Idx = 0;
5824
5825 // Macro definitions/undefs
5826 for (unsigned N = Record[Idx++]; N; --N) {
5827 std::string Macro = ReadString(Record, Idx);
5828 bool IsUndef = Record[Idx++];
5829 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef));
5830 }
5831
5832 // Includes
5833 for (unsigned N = Record[Idx++]; N; --N) {
5834 PPOpts.Includes.push_back(ReadString(Record, Idx));
5835 }
5836
5837 // Macro Includes
5838 for (unsigned N = Record[Idx++]; N; --N) {
5839 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx));
5840 }
5841
5842 PPOpts.UsePredefines = Record[Idx++];
Argyrios Kyrtzidisd3afa0c2013-04-26 21:33:40 +00005843 PPOpts.DetailedRecord = Record[Idx++];
Guy Benyei11169dd2012-12-18 14:30:41 +00005844 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00005845 PPOpts.ObjCXXARCStandardLibrary =
5846 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]);
5847 SuggestedPredefines.clear();
5848 return Listener.ReadPreprocessorOptions(PPOpts, Complain,
5849 SuggestedPredefines);
5850}
5851
5852std::pair<ModuleFile *, unsigned>
5853ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) {
5854 GlobalPreprocessedEntityMapType::iterator
5855 I = GlobalPreprocessedEntityMap.find(GlobalIndex);
David L. Jonesc4808b9e2016-12-15 20:53:26 +00005856 assert(I != GlobalPreprocessedEntityMap.end() &&
Guy Benyei11169dd2012-12-18 14:30:41 +00005857 "Corrupted global preprocessed entity map");
5858 ModuleFile *M = I->second;
5859 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID;
5860 return std::make_pair(M, LocalIndex);
5861}
5862
Benjamin Kramerb4ef6682015-02-06 17:25:10 +00005863llvm::iterator_range<PreprocessingRecord::iterator>
Guy Benyei11169dd2012-12-18 14:30:41 +00005864ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const {
5865 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
5866 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID,
5867 Mod.NumPreprocessedEntities);
5868
Benjamin Kramerb4ef6682015-02-06 17:25:10 +00005869 return llvm::make_range(PreprocessingRecord::iterator(),
5870 PreprocessingRecord::iterator());
Guy Benyei11169dd2012-12-18 14:30:41 +00005871}
5872
Benjamin Kramerb4ef6682015-02-06 17:25:10 +00005873llvm::iterator_range<ASTReader::ModuleDeclIterator>
Guy Benyei11169dd2012-12-18 14:30:41 +00005874ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) {
Benjamin Kramerb4ef6682015-02-06 17:25:10 +00005875 return llvm::make_range(
5876 ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls),
5877 ModuleDeclIterator(this, &Mod,
5878 Mod.FileSortedDecls + Mod.NumFileSortedDecls));
Guy Benyei11169dd2012-12-18 14:30:41 +00005879}
5880
Cameron Desrochersb60f1b62018-01-15 19:14:16 +00005881SourceRange ASTReader::ReadSkippedRange(unsigned GlobalIndex) {
5882 auto I = GlobalSkippedRangeMap.find(GlobalIndex);
5883 assert(I != GlobalSkippedRangeMap.end() &&
5884 "Corrupted global skipped range map");
5885 ModuleFile *M = I->second;
5886 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedSkippedRangeID;
5887 assert(LocalIndex < M->NumPreprocessedSkippedRanges);
5888 PPSkippedRange RawRange = M->PreprocessedSkippedRangeOffsets[LocalIndex];
5889 SourceRange Range(TranslateSourceLocation(*M, RawRange.getBegin()),
5890 TranslateSourceLocation(*M, RawRange.getEnd()));
5891 assert(Range.isValid());
5892 return Range;
5893}
5894
Guy Benyei11169dd2012-12-18 14:30:41 +00005895PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) {
5896 PreprocessedEntityID PPID = Index+1;
5897 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
5898 ModuleFile &M = *PPInfo.first;
5899 unsigned LocalIndex = PPInfo.second;
5900 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
5901
Guy Benyei11169dd2012-12-18 14:30:41 +00005902 if (!PP.getPreprocessingRecord()) {
5903 Error("no preprocessing record");
Craig Toppera13603a2014-05-22 05:54:18 +00005904 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00005905 }
David L. Jonesc4808b9e2016-12-15 20:53:26 +00005906
5907 SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor);
JF Bastien0e828952019-06-26 19:50:12 +00005908 if (llvm::Error Err =
5909 M.PreprocessorDetailCursor.JumpToBit(PPOffs.BitOffset)) {
5910 Error(std::move(Err));
5911 return nullptr;
5912 }
Chris Lattner7fb3bef2013-01-20 00:56:42 +00005913
JF Bastien0e828952019-06-26 19:50:12 +00005914 Expected<llvm::BitstreamEntry> MaybeEntry =
5915 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
5916 if (!MaybeEntry) {
5917 Error(MaybeEntry.takeError());
5918 return nullptr;
5919 }
5920 llvm::BitstreamEntry Entry = MaybeEntry.get();
5921
Chris Lattner7fb3bef2013-01-20 00:56:42 +00005922 if (Entry.Kind != llvm::BitstreamEntry::Record)
Craig Toppera13603a2014-05-22 05:54:18 +00005923 return nullptr;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00005924
Guy Benyei11169dd2012-12-18 14:30:41 +00005925 // Read the record.
Richard Smithcb34bd32016-03-27 07:28:06 +00005926 SourceRange Range(TranslateSourceLocation(M, PPOffs.getBegin()),
5927 TranslateSourceLocation(M, PPOffs.getEnd()));
Guy Benyei11169dd2012-12-18 14:30:41 +00005928 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
Chris Lattner0e6c9402013-01-20 02:38:54 +00005929 StringRef Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00005930 RecordData Record;
JF Bastien0e828952019-06-26 19:50:12 +00005931 Expected<unsigned> MaybeRecType =
5932 M.PreprocessorDetailCursor.readRecord(Entry.ID, Record, &Blob);
5933 if (!MaybeRecType) {
5934 Error(MaybeRecType.takeError());
5935 return nullptr;
5936 }
5937 switch ((PreprocessorDetailRecordTypes)MaybeRecType.get()) {
Guy Benyei11169dd2012-12-18 14:30:41 +00005938 case PPD_MACRO_EXPANSION: {
5939 bool isBuiltin = Record[0];
Craig Toppera13603a2014-05-22 05:54:18 +00005940 IdentifierInfo *Name = nullptr;
Richard Smith66a81862015-05-04 02:25:31 +00005941 MacroDefinitionRecord *Def = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00005942 if (isBuiltin)
5943 Name = getLocalIdentifier(M, Record[1]);
5944 else {
Richard Smith66a81862015-05-04 02:25:31 +00005945 PreprocessedEntityID GlobalID =
5946 getGlobalPreprocessedEntityID(M, Record[1]);
5947 Def = cast<MacroDefinitionRecord>(
5948 PPRec.getLoadedPreprocessedEntity(GlobalID - 1));
Guy Benyei11169dd2012-12-18 14:30:41 +00005949 }
5950
5951 MacroExpansion *ME;
5952 if (isBuiltin)
5953 ME = new (PPRec) MacroExpansion(Name, Range);
5954 else
5955 ME = new (PPRec) MacroExpansion(Def, Range);
5956
5957 return ME;
5958 }
David L. Jonesc4808b9e2016-12-15 20:53:26 +00005959
Guy Benyei11169dd2012-12-18 14:30:41 +00005960 case PPD_MACRO_DEFINITION: {
5961 // Decode the identifier info and then check again; if the macro is
5962 // still defined and associated with the identifier,
5963 IdentifierInfo *II = getLocalIdentifier(M, Record[0]);
Vedant Kumar48b4f762018-04-14 01:40:48 +00005964 MacroDefinitionRecord *MD = new (PPRec) MacroDefinitionRecord(II, Range);
Guy Benyei11169dd2012-12-18 14:30:41 +00005965
5966 if (DeserializationListener)
5967 DeserializationListener->MacroDefinitionRead(PPID, MD);
5968
5969 return MD;
5970 }
David L. Jonesc4808b9e2016-12-15 20:53:26 +00005971
Guy Benyei11169dd2012-12-18 14:30:41 +00005972 case PPD_INCLUSION_DIRECTIVE: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00005973 const char *FullFileNameStart = Blob.data() + Record[0];
5974 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]);
Craig Toppera13603a2014-05-22 05:54:18 +00005975 const FileEntry *File = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00005976 if (!FullFileName.empty())
Harlan Haskins8d323d12019-08-01 21:31:56 +00005977 if (auto FE = PP.getFileManager().getFile(FullFileName))
5978 File = *FE;
David L. Jonesc4808b9e2016-12-15 20:53:26 +00005979
Guy Benyei11169dd2012-12-18 14:30:41 +00005980 // FIXME: Stable encoding
Vedant Kumar48b4f762018-04-14 01:40:48 +00005981 InclusionDirective::InclusionKind Kind
5982 = static_cast<InclusionDirective::InclusionKind>(Record[2]);
5983 InclusionDirective *ID
5984 = new (PPRec) InclusionDirective(PPRec, Kind,
Chris Lattner0e6c9402013-01-20 02:38:54 +00005985 StringRef(Blob.data(), Record[0]),
Guy Benyei11169dd2012-12-18 14:30:41 +00005986 Record[1], Record[3],
5987 File,
5988 Range);
5989 return ID;
5990 }
5991 }
5992
5993 llvm_unreachable("Invalid PreprocessorDetailRecordTypes");
5994}
5995
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00005996/// Find the next module that contains entities and return the ID
Guy Benyei11169dd2012-12-18 14:30:41 +00005997/// of the first entry.
NAKAMURA Takumi12ab07e2017-10-12 09:42:14 +00005998///
5999/// \param SLocMapI points at a chunk of a module that contains no
6000/// preprocessed entities or the entities it contains are not the ones we are
6001/// looking for.
Guy Benyei11169dd2012-12-18 14:30:41 +00006002PreprocessedEntityID ASTReader::findNextPreprocessedEntity(
6003 GlobalSLocOffsetMapType::const_iterator SLocMapI) const {
6004 ++SLocMapI;
6005 for (GlobalSLocOffsetMapType::const_iterator
6006 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
6007 ModuleFile &M = *SLocMapI->second;
6008 if (M.NumPreprocessedEntities)
6009 return M.BasePreprocessedEntityID;
6010 }
6011
6012 return getTotalNumPreprocessedEntities();
6013}
6014
6015namespace {
6016
Guy Benyei11169dd2012-12-18 14:30:41 +00006017struct PPEntityComp {
6018 const ASTReader &Reader;
6019 ModuleFile &M;
6020
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00006021 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) {}
Guy Benyei11169dd2012-12-18 14:30:41 +00006022
6023 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const {
6024 SourceLocation LHS = getLoc(L);
6025 SourceLocation RHS = getLoc(R);
6026 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6027 }
6028
6029 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const {
6030 SourceLocation LHS = getLoc(L);
6031 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6032 }
6033
6034 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const {
6035 SourceLocation RHS = getLoc(R);
6036 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6037 }
6038
6039 SourceLocation getLoc(const PPEntityOffset &PPE) const {
Richard Smithb22a1d12016-03-27 20:13:24 +00006040 return Reader.TranslateSourceLocation(M, PPE.getBegin());
Guy Benyei11169dd2012-12-18 14:30:41 +00006041 }
6042};
6043
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00006044} // namespace
Guy Benyei11169dd2012-12-18 14:30:41 +00006045
Alp Toker2e9ce4c2014-05-16 18:59:21 +00006046PreprocessedEntityID ASTReader::findPreprocessedEntity(SourceLocation Loc,
6047 bool EndsAfter) const {
6048 if (SourceMgr.isLocalSourceLocation(Loc))
Guy Benyei11169dd2012-12-18 14:30:41 +00006049 return getTotalNumPreprocessedEntities();
6050
Alp Toker2e9ce4c2014-05-16 18:59:21 +00006051 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
6052 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
Guy Benyei11169dd2012-12-18 14:30:41 +00006053 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
6054 "Corrupted global sloc offset map");
6055
6056 if (SLocMapI->second->NumPreprocessedEntities == 0)
6057 return findNextPreprocessedEntity(SLocMapI);
6058
6059 ModuleFile &M = *SLocMapI->second;
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00006060
6061 using pp_iterator = const PPEntityOffset *;
6062
Guy Benyei11169dd2012-12-18 14:30:41 +00006063 pp_iterator pp_begin = M.PreprocessedEntityOffsets;
6064 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities;
6065
6066 size_t Count = M.NumPreprocessedEntities;
6067 size_t Half;
6068 pp_iterator First = pp_begin;
6069 pp_iterator PPI;
6070
Alp Toker2e9ce4c2014-05-16 18:59:21 +00006071 if (EndsAfter) {
6072 PPI = std::upper_bound(pp_begin, pp_end, Loc,
Richard Smithb22a1d12016-03-27 20:13:24 +00006073 PPEntityComp(*this, M));
Alp Toker2e9ce4c2014-05-16 18:59:21 +00006074 } else {
6075 // Do a binary search manually instead of using std::lower_bound because
6076 // The end locations of entities may be unordered (when a macro expansion
6077 // is inside another macro argument), but for this case it is not important
6078 // whether we get the first macro expansion or its containing macro.
6079 while (Count > 0) {
6080 Half = Count / 2;
6081 PPI = First;
6082 std::advance(PPI, Half);
Richard Smithb22a1d12016-03-27 20:13:24 +00006083 if (SourceMgr.isBeforeInTranslationUnit(
6084 TranslateSourceLocation(M, PPI->getEnd()), Loc)) {
Alp Toker2e9ce4c2014-05-16 18:59:21 +00006085 First = PPI;
6086 ++First;
6087 Count = Count - Half - 1;
6088 } else
6089 Count = Half;
6090 }
Guy Benyei11169dd2012-12-18 14:30:41 +00006091 }
6092
6093 if (PPI == pp_end)
6094 return findNextPreprocessedEntity(SLocMapI);
6095
6096 return M.BasePreprocessedEntityID + (PPI - pp_begin);
6097}
6098
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00006099/// Returns a pair of [Begin, End) indices of preallocated
Guy Benyei11169dd2012-12-18 14:30:41 +00006100/// preprocessed entities that \arg Range encompasses.
6101std::pair<unsigned, unsigned>
6102 ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) {
6103 if (Range.isInvalid())
6104 return std::make_pair(0,0);
6105 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
6106
Alp Toker2e9ce4c2014-05-16 18:59:21 +00006107 PreprocessedEntityID BeginID =
6108 findPreprocessedEntity(Range.getBegin(), false);
6109 PreprocessedEntityID EndID = findPreprocessedEntity(Range.getEnd(), true);
Guy Benyei11169dd2012-12-18 14:30:41 +00006110 return std::make_pair(BeginID, EndID);
6111}
6112
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00006113/// Optionally returns true or false if the preallocated preprocessed
Guy Benyei11169dd2012-12-18 14:30:41 +00006114/// entity with index \arg Index came from file \arg FID.
David Blaikie05785d12013-02-20 22:23:23 +00006115Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index,
Guy Benyei11169dd2012-12-18 14:30:41 +00006116 FileID FID) {
6117 if (FID.isInvalid())
6118 return false;
6119
6120 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
6121 ModuleFile &M = *PPInfo.first;
6122 unsigned LocalIndex = PPInfo.second;
6123 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
David L. Jonesc4808b9e2016-12-15 20:53:26 +00006124
Richard Smithcb34bd32016-03-27 07:28:06 +00006125 SourceLocation Loc = TranslateSourceLocation(M, PPOffs.getBegin());
Guy Benyei11169dd2012-12-18 14:30:41 +00006126 if (Loc.isInvalid())
6127 return false;
David L. Jonesc4808b9e2016-12-15 20:53:26 +00006128
Guy Benyei11169dd2012-12-18 14:30:41 +00006129 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
6130 return true;
6131 else
6132 return false;
6133}
6134
6135namespace {
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00006136
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00006137 /// Visitor used to search for information about a header file.
Guy Benyei11169dd2012-12-18 14:30:41 +00006138 class HeaderFileInfoVisitor {
Guy Benyei11169dd2012-12-18 14:30:41 +00006139 const FileEntry *FE;
David Blaikie05785d12013-02-20 22:23:23 +00006140 Optional<HeaderFileInfo> HFI;
David L. Jonesc4808b9e2016-12-15 20:53:26 +00006141
Guy Benyei11169dd2012-12-18 14:30:41 +00006142 public:
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00006143 explicit HeaderFileInfoVisitor(const FileEntry *FE) : FE(FE) {}
Benjamin Kramer9a9efba2015-07-25 12:14:04 +00006144
6145 bool operator()(ModuleFile &M) {
Vedant Kumar48b4f762018-04-14 01:40:48 +00006146 HeaderFileInfoLookupTable *Table
6147 = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable);
Guy Benyei11169dd2012-12-18 14:30:41 +00006148 if (!Table)
6149 return false;
6150
6151 // Look in the on-disk hash table for an entry for this file name.
Richard Smithbdf2d932015-07-30 03:37:16 +00006152 HeaderFileInfoLookupTable::iterator Pos = Table->find(FE);
Guy Benyei11169dd2012-12-18 14:30:41 +00006153 if (Pos == Table->end())
6154 return false;
6155
Richard Smithbdf2d932015-07-30 03:37:16 +00006156 HFI = *Pos;
Guy Benyei11169dd2012-12-18 14:30:41 +00006157 return true;
6158 }
David L. Jonesc4808b9e2016-12-15 20:53:26 +00006159
David Blaikie05785d12013-02-20 22:23:23 +00006160 Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; }
Guy Benyei11169dd2012-12-18 14:30:41 +00006161 };
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00006162
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00006163} // namespace
Guy Benyei11169dd2012-12-18 14:30:41 +00006164
6165HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) {
Argyrios Kyrtzidis61a38962013-03-06 18:12:44 +00006166 HeaderFileInfoVisitor Visitor(FE);
Benjamin Kramer9a9efba2015-07-25 12:14:04 +00006167 ModuleMgr.visit(Visitor);
Argyrios Kyrtzidis1054bbf2013-05-08 23:46:55 +00006168 if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
Guy Benyei11169dd2012-12-18 14:30:41 +00006169 return *HFI;
David L. Jonesc4808b9e2016-12-15 20:53:26 +00006170
Guy Benyei11169dd2012-12-18 14:30:41 +00006171 return HeaderFileInfo();
6172}
6173
6174void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) {
Richard Smithd230de22017-01-26 01:01:01 +00006175 using DiagState = DiagnosticsEngine::DiagState;
6176 SmallVector<DiagState *, 32> DiagStates;
6177
Vedant Kumar48b4f762018-04-14 01:40:48 +00006178 for (ModuleFile &F : ModuleMgr) {
Guy Benyei11169dd2012-12-18 14:30:41 +00006179 unsigned Idx = 0;
Richard Smithd230de22017-01-26 01:01:01 +00006180 auto &Record = F.PragmaDiagMappings;
6181 if (Record.empty())
6182 continue;
David L. Jonesc4808b9e2016-12-15 20:53:26 +00006183
Richard Smithd230de22017-01-26 01:01:01 +00006184 DiagStates.clear();
6185
6186 auto ReadDiagState =
6187 [&](const DiagState &BasedOn, SourceLocation Loc,
6188 bool IncludeNonPragmaStates) -> DiagnosticsEngine::DiagState * {
6189 unsigned BackrefID = Record[Idx++];
6190 if (BackrefID != 0)
6191 return DiagStates[BackrefID - 1];
6192
Guy Benyei11169dd2012-12-18 14:30:41 +00006193 // A new DiagState was created here.
Richard Smithd230de22017-01-26 01:01:01 +00006194 Diag.DiagStates.push_back(BasedOn);
6195 DiagState *NewState = &Diag.DiagStates.back();
Guy Benyei11169dd2012-12-18 14:30:41 +00006196 DiagStates.push_back(NewState);
Duncan P. N. Exon Smith3cb183b2017-03-14 19:31:27 +00006197 unsigned Size = Record[Idx++];
6198 assert(Idx + Size * 2 <= Record.size() &&
6199 "Invalid data, not enough diag/map pairs");
6200 while (Size--) {
Richard Smithd230de22017-01-26 01:01:01 +00006201 unsigned DiagID = Record[Idx++];
Duncan P. N. Exon Smith900f8172017-04-12 03:58:58 +00006202 DiagnosticMapping NewMapping =
Richard Smithe37391c2017-05-03 00:28:49 +00006203 DiagnosticMapping::deserialize(Record[Idx++]);
Duncan P. N. Exon Smith900f8172017-04-12 03:58:58 +00006204 if (!NewMapping.isPragma() && !IncludeNonPragmaStates)
6205 continue;
6206
6207 DiagnosticMapping &Mapping = NewState->getOrAddMapping(DiagID);
6208
6209 // If this mapping was specified as a warning but the severity was
6210 // upgraded due to diagnostic settings, simulate the current diagnostic
6211 // settings (and use a warning).
Richard Smithe37391c2017-05-03 00:28:49 +00006212 if (NewMapping.wasUpgradedFromWarning() && !Mapping.isErrorOrFatal()) {
6213 NewMapping.setSeverity(diag::Severity::Warning);
6214 NewMapping.setUpgradedFromWarning(false);
Duncan P. N. Exon Smith900f8172017-04-12 03:58:58 +00006215 }
6216
Duncan P. N. Exon Smith900f8172017-04-12 03:58:58 +00006217 Mapping = NewMapping;
Richard Smithd230de22017-01-26 01:01:01 +00006218 }
Richard Smithd230de22017-01-26 01:01:01 +00006219 return NewState;
6220 };
6221
Duncan P. N. Exon Smitha351c102017-04-12 03:45:32 +00006222 // Read the first state.
Duncan P. N. Exon Smith900f8172017-04-12 03:58:58 +00006223 DiagState *FirstState;
6224 if (F.Kind == MK_ImplicitModule) {
6225 // Implicitly-built modules are reused with different diagnostic
6226 // settings. Use the initial diagnostic state from Diag to simulate this
6227 // compilation's diagnostic settings.
6228 FirstState = Diag.DiagStatesByLoc.FirstDiagState;
6229 DiagStates.push_back(FirstState);
6230
6231 // Skip the initial diagnostic state from the serialized module.
Richard Smithe37391c2017-05-03 00:28:49 +00006232 assert(Record[1] == 0 &&
Duncan P. N. Exon Smith900f8172017-04-12 03:58:58 +00006233 "Invalid data, unexpected backref in initial state");
Richard Smithe37391c2017-05-03 00:28:49 +00006234 Idx = 3 + Record[2] * 2;
Duncan P. N. Exon Smith900f8172017-04-12 03:58:58 +00006235 assert(Idx < Record.size() &&
6236 "Invalid data, not enough state change pairs in initial state");
Richard Smithe37391c2017-05-03 00:28:49 +00006237 } else if (F.isModule()) {
6238 // For an explicit module, preserve the flags from the module build
6239 // command line (-w, -Weverything, -Werror, ...) along with any explicit
6240 // -Wblah flags.
6241 unsigned Flags = Record[Idx++];
6242 DiagState Initial;
6243 Initial.SuppressSystemWarnings = Flags & 1; Flags >>= 1;
6244 Initial.ErrorsAsFatal = Flags & 1; Flags >>= 1;
6245 Initial.WarningsAsErrors = Flags & 1; Flags >>= 1;
6246 Initial.EnableAllWarnings = Flags & 1; Flags >>= 1;
6247 Initial.IgnoreAllWarnings = Flags & 1; Flags >>= 1;
6248 Initial.ExtBehavior = (diag::Severity)Flags;
6249 FirstState = ReadDiagState(Initial, SourceLocation(), true);
Richard Smithea741482017-05-01 22:10:47 +00006250
Richard Smith6c2b5a82018-02-09 01:15:13 +00006251 assert(F.OriginalSourceFileID.isValid());
6252
Richard Smithe37391c2017-05-03 00:28:49 +00006253 // Set up the root buffer of the module to start with the initial
6254 // diagnostic state of the module itself, to cover files that contain no
6255 // explicit transitions (for which we did not serialize anything).
6256 Diag.DiagStatesByLoc.Files[F.OriginalSourceFileID]
6257 .StateTransitions.push_back({FirstState, 0});
6258 } else {
6259 // For prefix ASTs, start with whatever the user configured on the
6260 // command line.
6261 Idx++; // Skip flags.
6262 FirstState = ReadDiagState(*Diag.DiagStatesByLoc.CurDiagState,
6263 SourceLocation(), false);
Duncan P. N. Exon Smith900f8172017-04-12 03:58:58 +00006264 }
Richard Smithd230de22017-01-26 01:01:01 +00006265
Duncan P. N. Exon Smitha351c102017-04-12 03:45:32 +00006266 // Read the state transitions.
6267 unsigned NumLocations = Record[Idx++];
6268 while (NumLocations--) {
6269 assert(Idx < Record.size() &&
6270 "Invalid data, missing pragma diagnostic states");
Richard Smithd230de22017-01-26 01:01:01 +00006271 SourceLocation Loc = ReadSourceLocation(F, Record[Idx++]);
6272 auto IDAndOffset = SourceMgr.getDecomposedLoc(Loc);
Richard Smith6c2b5a82018-02-09 01:15:13 +00006273 assert(IDAndOffset.first.isValid() && "invalid FileID for transition");
Richard Smithd230de22017-01-26 01:01:01 +00006274 assert(IDAndOffset.second == 0 && "not a start location for a FileID");
6275 unsigned Transitions = Record[Idx++];
6276
6277 // Note that we don't need to set up Parent/ParentOffset here, because
6278 // we won't be changing the diagnostic state within imported FileIDs
6279 // (other than perhaps appending to the main source file, which has no
6280 // parent).
6281 auto &F = Diag.DiagStatesByLoc.Files[IDAndOffset.first];
6282 F.StateTransitions.reserve(F.StateTransitions.size() + Transitions);
6283 for (unsigned I = 0; I != Transitions; ++I) {
6284 unsigned Offset = Record[Idx++];
6285 auto *State =
6286 ReadDiagState(*FirstState, Loc.getLocWithOffset(Offset), false);
6287 F.StateTransitions.push_back({State, Offset});
Guy Benyei11169dd2012-12-18 14:30:41 +00006288 }
6289 }
Richard Smithd230de22017-01-26 01:01:01 +00006290
Duncan P. N. Exon Smitha351c102017-04-12 03:45:32 +00006291 // Read the final state.
6292 assert(Idx < Record.size() &&
6293 "Invalid data, missing final pragma diagnostic state");
6294 SourceLocation CurStateLoc =
6295 ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]);
6296 auto *CurState = ReadDiagState(*FirstState, CurStateLoc, false);
6297
6298 if (!F.isModule()) {
6299 Diag.DiagStatesByLoc.CurDiagState = CurState;
6300 Diag.DiagStatesByLoc.CurDiagStateLoc = CurStateLoc;
6301
6302 // Preserve the property that the imaginary root file describes the
6303 // current state.
Simon Pilgrim22518632017-10-10 13:56:17 +00006304 FileID NullFile;
6305 auto &T = Diag.DiagStatesByLoc.Files[NullFile].StateTransitions;
Duncan P. N. Exon Smitha351c102017-04-12 03:45:32 +00006306 if (T.empty())
6307 T.push_back({CurState, 0});
6308 else
6309 T[0].State = CurState;
6310 }
6311
Richard Smithd230de22017-01-26 01:01:01 +00006312 // Don't try to read these mappings again.
6313 Record.clear();
Guy Benyei11169dd2012-12-18 14:30:41 +00006314 }
6315}
6316
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00006317/// Get the correct cursor and offset for loading a type.
Guy Benyei11169dd2012-12-18 14:30:41 +00006318ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) {
6319 GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index);
6320 assert(I != GlobalTypeMap.end() && "Corrupted global type map");
6321 ModuleFile *M = I->second;
6322 return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex]);
6323}
6324
John McCalld505e572019-12-13 21:54:44 -05006325static llvm::Optional<Type::TypeClass> getTypeClassForCode(TypeCode code) {
6326 switch (code) {
6327#define TYPE_BIT_CODE(CLASS_ID, CODE_ID, CODE_VALUE) \
6328 case TYPE_##CODE_ID: return Type::CLASS_ID;
6329#include "clang/Serialization/TypeBitCodes.def"
6330 default: return llvm::None;
6331 }
John McCall3ce3d232019-12-13 03:37:23 -05006332}
6333
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00006334/// Read and return the type with the given index..
Guy Benyei11169dd2012-12-18 14:30:41 +00006335///
6336/// The index is the type ID, shifted and minus the number of predefs. This
6337/// routine actually reads the record corresponding to the type at the given
6338/// location. It is a helper routine for GetType, which deals with reading type
6339/// IDs.
6340QualType ASTReader::readTypeRecord(unsigned Index) {
Richard Smithdbafb6c2017-06-29 23:23:46 +00006341 assert(ContextObj && "reading type with no AST context");
6342 ASTContext &Context = *ContextObj;
Guy Benyei11169dd2012-12-18 14:30:41 +00006343 RecordLocation Loc = TypeCursorForIndex(Index);
Chris Lattner7fb3bef2013-01-20 00:56:42 +00006344 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00006345
6346 // Keep track of where we are in the stream, then jump back there
6347 // after reading this type.
6348 SavedStreamPosition SavedPosition(DeclsCursor);
6349
6350 ReadingKindTracker ReadingKind(Read_Type, *this);
6351
6352 // Note that we are loading a type record.
6353 Deserializing AType(this);
6354
JF Bastien0e828952019-06-26 19:50:12 +00006355 if (llvm::Error Err = DeclsCursor.JumpToBit(Loc.Offset)) {
6356 Error(std::move(Err));
6357 return QualType();
6358 }
John McCall3ce3d232019-12-13 03:37:23 -05006359 Expected<unsigned> RawCode = DeclsCursor.ReadCode();
6360 if (!RawCode) {
6361 Error(RawCode.takeError());
JF Bastien0e828952019-06-26 19:50:12 +00006362 return QualType();
6363 }
JF Bastien0e828952019-06-26 19:50:12 +00006364
John McCall3ce3d232019-12-13 03:37:23 -05006365 ASTRecordReader Record(*this, *Loc.F);
6366 Expected<unsigned> Code = Record.readRecord(DeclsCursor, RawCode.get());
6367 if (!Code) {
6368 Error(Code.takeError());
JF Bastien0e828952019-06-26 19:50:12 +00006369 return QualType();
6370 }
John McCalld505e572019-12-13 21:54:44 -05006371 if (Code.get() == TYPE_EXT_QUAL) {
6372 QualType baseType = Record.readQualType();
6373 Qualifiers quals = Record.readQualifiers();
6374 return Context.getQualifiedType(baseType, quals);
Guy Benyei11169dd2012-12-18 14:30:41 +00006375 }
6376
John McCalld505e572019-12-13 21:54:44 -05006377 auto maybeClass = getTypeClassForCode((TypeCode) Code.get());
6378 if (!maybeClass) {
6379 Error("Unexpected code for type");
6380 return QualType();
Guy Benyei11169dd2012-12-18 14:30:41 +00006381 }
6382
John McCalld505e572019-12-13 21:54:44 -05006383 serialization::AbstractTypeReader<ASTRecordReader> TypeReader(Record);
6384 return TypeReader.read(*maybeClass);
Richard Smith564417a2014-03-20 21:47:22 +00006385}
6386
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00006387namespace clang {
6388
6389class TypeLocReader : public TypeLocVisitor<TypeLocReader> {
John McCall3ce3d232019-12-13 03:37:23 -05006390 ASTRecordReader &Reader;
Guy Benyei11169dd2012-12-18 14:30:41 +00006391
John McCall3ce3d232019-12-13 03:37:23 -05006392 SourceLocation readSourceLocation() {
6393 return Reader.readSourceLocation();
David L. Jonesbe1557a2016-12-21 00:17:49 +00006394 }
6395
6396 TypeSourceInfo *GetTypeSourceInfo() {
John McCall3ce3d232019-12-13 03:37:23 -05006397 return Reader.readTypeSourceInfo();
David L. Jonesbe1557a2016-12-21 00:17:49 +00006398 }
6399
6400 NestedNameSpecifierLoc ReadNestedNameSpecifierLoc() {
John McCall3ce3d232019-12-13 03:37:23 -05006401 return Reader.readNestedNameSpecifierLoc();
Guy Benyei11169dd2012-12-18 14:30:41 +00006402 }
6403
Richard Smithe43e2b32018-08-20 21:47:29 +00006404 Attr *ReadAttr() {
John McCall3ce3d232019-12-13 03:37:23 -05006405 return Reader.readAttr();
Richard Smithe43e2b32018-08-20 21:47:29 +00006406 }
6407
Guy Benyei11169dd2012-12-18 14:30:41 +00006408public:
John McCall3ce3d232019-12-13 03:37:23 -05006409 TypeLocReader(ASTRecordReader &Reader) : Reader(Reader) {}
Guy Benyei11169dd2012-12-18 14:30:41 +00006410
6411 // We want compile-time assurance that we've enumerated all of
6412 // these, so unfortunately we have to declare them first, then
6413 // define them out-of-line.
6414#define ABSTRACT_TYPELOC(CLASS, PARENT)
6415#define TYPELOC(CLASS, PARENT) \
6416 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
6417#include "clang/AST/TypeLocNodes.def"
6418
6419 void VisitFunctionTypeLoc(FunctionTypeLoc);
6420 void VisitArrayTypeLoc(ArrayTypeLoc);
6421};
6422
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00006423} // namespace clang
6424
Guy Benyei11169dd2012-12-18 14:30:41 +00006425void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
6426 // nothing to do
6427}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00006428
Guy Benyei11169dd2012-12-18 14:30:41 +00006429void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
John McCall3ce3d232019-12-13 03:37:23 -05006430 TL.setBuiltinLoc(readSourceLocation());
Guy Benyei11169dd2012-12-18 14:30:41 +00006431 if (TL.needsExtraLocalData()) {
John McCall3ce3d232019-12-13 03:37:23 -05006432 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Reader.readInt()));
6433 TL.setWrittenSignSpec(static_cast<DeclSpec::TSS>(Reader.readInt()));
6434 TL.setWrittenWidthSpec(static_cast<DeclSpec::TSW>(Reader.readInt()));
6435 TL.setModeAttr(Reader.readInt());
Guy Benyei11169dd2012-12-18 14:30:41 +00006436 }
6437}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00006438
Guy Benyei11169dd2012-12-18 14:30:41 +00006439void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
John McCall3ce3d232019-12-13 03:37:23 -05006440 TL.setNameLoc(readSourceLocation());
Guy Benyei11169dd2012-12-18 14:30:41 +00006441}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00006442
Guy Benyei11169dd2012-12-18 14:30:41 +00006443void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
John McCall3ce3d232019-12-13 03:37:23 -05006444 TL.setStarLoc(readSourceLocation());
Guy Benyei11169dd2012-12-18 14:30:41 +00006445}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00006446
Reid Kleckner8a365022013-06-24 17:51:48 +00006447void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
6448 // nothing to do
6449}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00006450
Reid Kleckner0503a872013-12-05 01:23:43 +00006451void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
6452 // nothing to do
6453}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00006454
Leonard Chanc72aaf62019-05-07 03:20:17 +00006455void TypeLocReader::VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) {
John McCall3ce3d232019-12-13 03:37:23 -05006456 TL.setExpansionLoc(readSourceLocation());
Leonard Chanc72aaf62019-05-07 03:20:17 +00006457}
6458
Guy Benyei11169dd2012-12-18 14:30:41 +00006459void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
John McCall3ce3d232019-12-13 03:37:23 -05006460 TL.setCaretLoc(readSourceLocation());
Guy Benyei11169dd2012-12-18 14:30:41 +00006461}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00006462
Guy Benyei11169dd2012-12-18 14:30:41 +00006463void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
John McCall3ce3d232019-12-13 03:37:23 -05006464 TL.setAmpLoc(readSourceLocation());
Guy Benyei11169dd2012-12-18 14:30:41 +00006465}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00006466
Guy Benyei11169dd2012-12-18 14:30:41 +00006467void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
John McCall3ce3d232019-12-13 03:37:23 -05006468 TL.setAmpAmpLoc(readSourceLocation());
Guy Benyei11169dd2012-12-18 14:30:41 +00006469}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00006470
Guy Benyei11169dd2012-12-18 14:30:41 +00006471void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
John McCall3ce3d232019-12-13 03:37:23 -05006472 TL.setStarLoc(readSourceLocation());
David L. Jonesbe1557a2016-12-21 00:17:49 +00006473 TL.setClassTInfo(GetTypeSourceInfo());
Guy Benyei11169dd2012-12-18 14:30:41 +00006474}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00006475
Guy Benyei11169dd2012-12-18 14:30:41 +00006476void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) {
John McCall3ce3d232019-12-13 03:37:23 -05006477 TL.setLBracketLoc(readSourceLocation());
6478 TL.setRBracketLoc(readSourceLocation());
6479 if (Reader.readBool())
6480 TL.setSizeExpr(Reader.readExpr());
Guy Benyei11169dd2012-12-18 14:30:41 +00006481 else
Craig Toppera13603a2014-05-22 05:54:18 +00006482 TL.setSizeExpr(nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00006483}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00006484
Guy Benyei11169dd2012-12-18 14:30:41 +00006485void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) {
6486 VisitArrayTypeLoc(TL);
6487}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00006488
Guy Benyei11169dd2012-12-18 14:30:41 +00006489void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) {
6490 VisitArrayTypeLoc(TL);
6491}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00006492
Guy Benyei11169dd2012-12-18 14:30:41 +00006493void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
6494 VisitArrayTypeLoc(TL);
6495}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00006496
Guy Benyei11169dd2012-12-18 14:30:41 +00006497void TypeLocReader::VisitDependentSizedArrayTypeLoc(
6498 DependentSizedArrayTypeLoc TL) {
6499 VisitArrayTypeLoc(TL);
6500}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00006501
Andrew Gozillon572bbb02017-10-02 06:25:51 +00006502void TypeLocReader::VisitDependentAddressSpaceTypeLoc(
6503 DependentAddressSpaceTypeLoc TL) {
6504
John McCall3ce3d232019-12-13 03:37:23 -05006505 TL.setAttrNameLoc(readSourceLocation());
6506 TL.setAttrOperandParensRange(Reader.readSourceRange());
6507 TL.setAttrExprOperand(Reader.readExpr());
Andrew Gozillon572bbb02017-10-02 06:25:51 +00006508}
6509
Guy Benyei11169dd2012-12-18 14:30:41 +00006510void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
6511 DependentSizedExtVectorTypeLoc TL) {
John McCall3ce3d232019-12-13 03:37:23 -05006512 TL.setNameLoc(readSourceLocation());
Guy Benyei11169dd2012-12-18 14:30:41 +00006513}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00006514
Guy Benyei11169dd2012-12-18 14:30:41 +00006515void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
John McCall3ce3d232019-12-13 03:37:23 -05006516 TL.setNameLoc(readSourceLocation());
Guy Benyei11169dd2012-12-18 14:30:41 +00006517}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00006518
Erich Keanef702b022018-07-13 19:46:04 +00006519void TypeLocReader::VisitDependentVectorTypeLoc(
6520 DependentVectorTypeLoc TL) {
John McCall3ce3d232019-12-13 03:37:23 -05006521 TL.setNameLoc(readSourceLocation());
Erich Keanef702b022018-07-13 19:46:04 +00006522}
6523
Guy Benyei11169dd2012-12-18 14:30:41 +00006524void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
John McCall3ce3d232019-12-13 03:37:23 -05006525 TL.setNameLoc(readSourceLocation());
Guy Benyei11169dd2012-12-18 14:30:41 +00006526}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00006527
Guy Benyei11169dd2012-12-18 14:30:41 +00006528void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) {
John McCall3ce3d232019-12-13 03:37:23 -05006529 TL.setLocalRangeBegin(readSourceLocation());
6530 TL.setLParenLoc(readSourceLocation());
6531 TL.setRParenLoc(readSourceLocation());
6532 TL.setExceptionSpecRange(Reader.readSourceRange());
6533 TL.setLocalRangeEnd(readSourceLocation());
Alp Tokerb3fd5cf2014-01-21 00:32:38 +00006534 for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) {
John McCall3ce3d232019-12-13 03:37:23 -05006535 TL.setParam(i, Reader.readDeclAs<ParmVarDecl>());
Guy Benyei11169dd2012-12-18 14:30:41 +00006536 }
6537}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00006538
Guy Benyei11169dd2012-12-18 14:30:41 +00006539void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) {
6540 VisitFunctionTypeLoc(TL);
6541}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00006542
Guy Benyei11169dd2012-12-18 14:30:41 +00006543void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) {
6544 VisitFunctionTypeLoc(TL);
6545}
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00006546
Guy Benyei11169dd2012-12-18 14:30:41 +00006547void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
John McCall3ce3d232019-12-13 03:37:23 -05006548 TL.setNameLoc(readSourceLocation());
Guy Benyei11169dd2012-12-18 14:30:41 +00006549}
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00006550
Guy Benyei11169dd2012-12-18 14:30:41 +00006551void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
John McCall3ce3d232019-12-13 03:37:23 -05006552 TL.setNameLoc(readSourceLocation());
Guy Benyei11169dd2012-12-18 14:30:41 +00006553}
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00006554
Guy Benyei11169dd2012-12-18 14:30:41 +00006555void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
John McCall3ce3d232019-12-13 03:37:23 -05006556 TL.setTypeofLoc(readSourceLocation());
6557 TL.setLParenLoc(readSourceLocation());
6558 TL.setRParenLoc(readSourceLocation());
Guy Benyei11169dd2012-12-18 14:30:41 +00006559}
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00006560
Guy Benyei11169dd2012-12-18 14:30:41 +00006561void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
John McCall3ce3d232019-12-13 03:37:23 -05006562 TL.setTypeofLoc(readSourceLocation());
6563 TL.setLParenLoc(readSourceLocation());
6564 TL.setRParenLoc(readSourceLocation());
David L. Jonesbe1557a2016-12-21 00:17:49 +00006565 TL.setUnderlyingTInfo(GetTypeSourceInfo());
Guy Benyei11169dd2012-12-18 14:30:41 +00006566}
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00006567
Guy Benyei11169dd2012-12-18 14:30:41 +00006568void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
John McCall3ce3d232019-12-13 03:37:23 -05006569 TL.setNameLoc(readSourceLocation());
Guy Benyei11169dd2012-12-18 14:30:41 +00006570}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00006571
Guy Benyei11169dd2012-12-18 14:30:41 +00006572void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
John McCall3ce3d232019-12-13 03:37:23 -05006573 TL.setKWLoc(readSourceLocation());
6574 TL.setLParenLoc(readSourceLocation());
6575 TL.setRParenLoc(readSourceLocation());
David L. Jonesbe1557a2016-12-21 00:17:49 +00006576 TL.setUnderlyingTInfo(GetTypeSourceInfo());
Guy Benyei11169dd2012-12-18 14:30:41 +00006577}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00006578
Guy Benyei11169dd2012-12-18 14:30:41 +00006579void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) {
John McCall3ce3d232019-12-13 03:37:23 -05006580 TL.setNameLoc(readSourceLocation());
Saar Razb481f022020-01-22 02:03:05 +02006581 if (Reader.readBool()) {
6582 TL.setNestedNameSpecifierLoc(ReadNestedNameSpecifierLoc());
6583 TL.setTemplateKWLoc(readSourceLocation());
6584 TL.setConceptNameLoc(readSourceLocation());
6585 TL.setFoundDecl(Reader.readDeclAs<NamedDecl>());
6586 TL.setLAngleLoc(readSourceLocation());
6587 TL.setRAngleLoc(readSourceLocation());
6588 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i)
6589 TL.setArgLocInfo(i, Reader.readTemplateArgumentLocInfo(
6590 TL.getTypePtr()->getArg(i).getKind()));
6591 }
Guy Benyei11169dd2012-12-18 14:30:41 +00006592}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00006593
Richard Smith600b5262017-01-26 20:40:47 +00006594void TypeLocReader::VisitDeducedTemplateSpecializationTypeLoc(
6595 DeducedTemplateSpecializationTypeLoc TL) {
John McCall3ce3d232019-12-13 03:37:23 -05006596 TL.setTemplateNameLoc(readSourceLocation());
Richard Smith600b5262017-01-26 20:40:47 +00006597}
6598
Guy Benyei11169dd2012-12-18 14:30:41 +00006599void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) {
John McCall3ce3d232019-12-13 03:37:23 -05006600 TL.setNameLoc(readSourceLocation());
Guy Benyei11169dd2012-12-18 14:30:41 +00006601}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00006602
Guy Benyei11169dd2012-12-18 14:30:41 +00006603void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) {
John McCall3ce3d232019-12-13 03:37:23 -05006604 TL.setNameLoc(readSourceLocation());
Guy Benyei11169dd2012-12-18 14:30:41 +00006605}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00006606
Guy Benyei11169dd2012-12-18 14:30:41 +00006607void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
Richard Smithe43e2b32018-08-20 21:47:29 +00006608 TL.setAttr(ReadAttr());
Guy Benyei11169dd2012-12-18 14:30:41 +00006609}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00006610
Guy Benyei11169dd2012-12-18 14:30:41 +00006611void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
John McCall3ce3d232019-12-13 03:37:23 -05006612 TL.setNameLoc(readSourceLocation());
Guy Benyei11169dd2012-12-18 14:30:41 +00006613}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00006614
Guy Benyei11169dd2012-12-18 14:30:41 +00006615void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
6616 SubstTemplateTypeParmTypeLoc TL) {
John McCall3ce3d232019-12-13 03:37:23 -05006617 TL.setNameLoc(readSourceLocation());
Guy Benyei11169dd2012-12-18 14:30:41 +00006618}
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00006619
Guy Benyei11169dd2012-12-18 14:30:41 +00006620void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
6621 SubstTemplateTypeParmPackTypeLoc TL) {
John McCall3ce3d232019-12-13 03:37:23 -05006622 TL.setNameLoc(readSourceLocation());
Guy Benyei11169dd2012-12-18 14:30:41 +00006623}
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00006624
Guy Benyei11169dd2012-12-18 14:30:41 +00006625void TypeLocReader::VisitTemplateSpecializationTypeLoc(
6626 TemplateSpecializationTypeLoc TL) {
John McCall3ce3d232019-12-13 03:37:23 -05006627 TL.setTemplateKeywordLoc(readSourceLocation());
6628 TL.setTemplateNameLoc(readSourceLocation());
6629 TL.setLAngleLoc(readSourceLocation());
6630 TL.setRAngleLoc(readSourceLocation());
Guy Benyei11169dd2012-12-18 14:30:41 +00006631 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i)
David L. Jonesbe1557a2016-12-21 00:17:49 +00006632 TL.setArgLocInfo(
6633 i,
John McCall3ce3d232019-12-13 03:37:23 -05006634 Reader.readTemplateArgumentLocInfo(
6635 TL.getTypePtr()->getArg(i).getKind()));
Guy Benyei11169dd2012-12-18 14:30:41 +00006636}
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00006637
Guy Benyei11169dd2012-12-18 14:30:41 +00006638void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
John McCall3ce3d232019-12-13 03:37:23 -05006639 TL.setLParenLoc(readSourceLocation());
6640 TL.setRParenLoc(readSourceLocation());
Guy Benyei11169dd2012-12-18 14:30:41 +00006641}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00006642
Guy Benyei11169dd2012-12-18 14:30:41 +00006643void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
John McCall3ce3d232019-12-13 03:37:23 -05006644 TL.setElaboratedKeywordLoc(readSourceLocation());
David L. Jonesbe1557a2016-12-21 00:17:49 +00006645 TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
Guy Benyei11169dd2012-12-18 14:30:41 +00006646}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00006647
Guy Benyei11169dd2012-12-18 14:30:41 +00006648void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
John McCall3ce3d232019-12-13 03:37:23 -05006649 TL.setNameLoc(readSourceLocation());
Guy Benyei11169dd2012-12-18 14:30:41 +00006650}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00006651
Guy Benyei11169dd2012-12-18 14:30:41 +00006652void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
John McCall3ce3d232019-12-13 03:37:23 -05006653 TL.setElaboratedKeywordLoc(readSourceLocation());
David L. Jonesbe1557a2016-12-21 00:17:49 +00006654 TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
John McCall3ce3d232019-12-13 03:37:23 -05006655 TL.setNameLoc(readSourceLocation());
Guy Benyei11169dd2012-12-18 14:30:41 +00006656}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00006657
Guy Benyei11169dd2012-12-18 14:30:41 +00006658void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc(
6659 DependentTemplateSpecializationTypeLoc TL) {
John McCall3ce3d232019-12-13 03:37:23 -05006660 TL.setElaboratedKeywordLoc(readSourceLocation());
David L. Jonesbe1557a2016-12-21 00:17:49 +00006661 TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
John McCall3ce3d232019-12-13 03:37:23 -05006662 TL.setTemplateKeywordLoc(readSourceLocation());
6663 TL.setTemplateNameLoc(readSourceLocation());
6664 TL.setLAngleLoc(readSourceLocation());
6665 TL.setRAngleLoc(readSourceLocation());
Guy Benyei11169dd2012-12-18 14:30:41 +00006666 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
David L. Jonesbe1557a2016-12-21 00:17:49 +00006667 TL.setArgLocInfo(
6668 I,
John McCall3ce3d232019-12-13 03:37:23 -05006669 Reader.readTemplateArgumentLocInfo(
6670 TL.getTypePtr()->getArg(I).getKind()));
Guy Benyei11169dd2012-12-18 14:30:41 +00006671}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00006672
Guy Benyei11169dd2012-12-18 14:30:41 +00006673void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
John McCall3ce3d232019-12-13 03:37:23 -05006674 TL.setEllipsisLoc(readSourceLocation());
Guy Benyei11169dd2012-12-18 14:30:41 +00006675}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00006676
Guy Benyei11169dd2012-12-18 14:30:41 +00006677void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
John McCall3ce3d232019-12-13 03:37:23 -05006678 TL.setNameLoc(readSourceLocation());
Guy Benyei11169dd2012-12-18 14:30:41 +00006679}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00006680
Manman Rene6be26c2016-09-13 17:25:08 +00006681void TypeLocReader::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) {
6682 if (TL.getNumProtocols()) {
John McCall3ce3d232019-12-13 03:37:23 -05006683 TL.setProtocolLAngleLoc(readSourceLocation());
6684 TL.setProtocolRAngleLoc(readSourceLocation());
Manman Rene6be26c2016-09-13 17:25:08 +00006685 }
6686 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
John McCall3ce3d232019-12-13 03:37:23 -05006687 TL.setProtocolLoc(i, readSourceLocation());
Manman Rene6be26c2016-09-13 17:25:08 +00006688}
6689
Guy Benyei11169dd2012-12-18 14:30:41 +00006690void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
John McCall3ce3d232019-12-13 03:37:23 -05006691 TL.setHasBaseTypeAsWritten(Reader.readBool());
6692 TL.setTypeArgsLAngleLoc(readSourceLocation());
6693 TL.setTypeArgsRAngleLoc(readSourceLocation());
Douglas Gregore9d95f12015-07-07 03:57:35 +00006694 for (unsigned i = 0, e = TL.getNumTypeArgs(); i != e; ++i)
David L. Jonesbe1557a2016-12-21 00:17:49 +00006695 TL.setTypeArgTInfo(i, GetTypeSourceInfo());
John McCall3ce3d232019-12-13 03:37:23 -05006696 TL.setProtocolLAngleLoc(readSourceLocation());
6697 TL.setProtocolRAngleLoc(readSourceLocation());
Guy Benyei11169dd2012-12-18 14:30:41 +00006698 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
John McCall3ce3d232019-12-13 03:37:23 -05006699 TL.setProtocolLoc(i, readSourceLocation());
Guy Benyei11169dd2012-12-18 14:30:41 +00006700}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00006701
Guy Benyei11169dd2012-12-18 14:30:41 +00006702void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
John McCall3ce3d232019-12-13 03:37:23 -05006703 TL.setStarLoc(readSourceLocation());
Guy Benyei11169dd2012-12-18 14:30:41 +00006704}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00006705
Guy Benyei11169dd2012-12-18 14:30:41 +00006706void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
John McCall3ce3d232019-12-13 03:37:23 -05006707 TL.setKWLoc(readSourceLocation());
6708 TL.setLParenLoc(readSourceLocation());
6709 TL.setRParenLoc(readSourceLocation());
Guy Benyei11169dd2012-12-18 14:30:41 +00006710}
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00006711
Xiuli Pan9c14e282016-01-09 12:53:17 +00006712void TypeLocReader::VisitPipeTypeLoc(PipeTypeLoc TL) {
John McCall3ce3d232019-12-13 03:37:23 -05006713 TL.setKWLoc(readSourceLocation());
Xiuli Pan9c14e282016-01-09 12:53:17 +00006714}
Guy Benyei11169dd2012-12-18 14:30:41 +00006715
John McCall3ce3d232019-12-13 03:37:23 -05006716void ASTRecordReader::readTypeLoc(TypeLoc TL) {
6717 TypeLocReader TLR(*this);
Richard Smithc23d7342018-06-29 20:46:25 +00006718 for (; !TL.isNull(); TL = TL.getNextTypeLoc())
6719 TLR.Visit(TL);
6720}
6721
John McCall3ce3d232019-12-13 03:37:23 -05006722TypeSourceInfo *ASTRecordReader::readTypeSourceInfo() {
6723 QualType InfoTy = readType();
Guy Benyei11169dd2012-12-18 14:30:41 +00006724 if (InfoTy.isNull())
Craig Toppera13603a2014-05-22 05:54:18 +00006725 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00006726
6727 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy);
John McCall3ce3d232019-12-13 03:37:23 -05006728 readTypeLoc(TInfo->getTypeLoc());
Guy Benyei11169dd2012-12-18 14:30:41 +00006729 return TInfo;
6730}
6731
6732QualType ASTReader::GetType(TypeID ID) {
Richard Smithdbafb6c2017-06-29 23:23:46 +00006733 assert(ContextObj && "reading type with no AST context");
6734 ASTContext &Context = *ContextObj;
6735
Guy Benyei11169dd2012-12-18 14:30:41 +00006736 unsigned FastQuals = ID & Qualifiers::FastMask;
6737 unsigned Index = ID >> Qualifiers::FastWidth;
6738
6739 if (Index < NUM_PREDEF_TYPE_IDS) {
6740 QualType T;
6741 switch ((PredefinedTypeIDs)Index) {
Alexey Baderbdf7c842015-09-15 12:18:29 +00006742 case PREDEF_TYPE_NULL_ID:
Vedant Kumar48b4f762018-04-14 01:40:48 +00006743 return QualType();
Alexey Baderbdf7c842015-09-15 12:18:29 +00006744 case PREDEF_TYPE_VOID_ID:
6745 T = Context.VoidTy;
6746 break;
6747 case PREDEF_TYPE_BOOL_ID:
6748 T = Context.BoolTy;
6749 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00006750 case PREDEF_TYPE_CHAR_U_ID:
6751 case PREDEF_TYPE_CHAR_S_ID:
6752 // FIXME: Check that the signedness of CharTy is correct!
6753 T = Context.CharTy;
6754 break;
Alexey Baderbdf7c842015-09-15 12:18:29 +00006755 case PREDEF_TYPE_UCHAR_ID:
6756 T = Context.UnsignedCharTy;
6757 break;
6758 case PREDEF_TYPE_USHORT_ID:
6759 T = Context.UnsignedShortTy;
6760 break;
6761 case PREDEF_TYPE_UINT_ID:
6762 T = Context.UnsignedIntTy;
6763 break;
6764 case PREDEF_TYPE_ULONG_ID:
6765 T = Context.UnsignedLongTy;
6766 break;
6767 case PREDEF_TYPE_ULONGLONG_ID:
6768 T = Context.UnsignedLongLongTy;
6769 break;
6770 case PREDEF_TYPE_UINT128_ID:
6771 T = Context.UnsignedInt128Ty;
6772 break;
6773 case PREDEF_TYPE_SCHAR_ID:
6774 T = Context.SignedCharTy;
6775 break;
6776 case PREDEF_TYPE_WCHAR_ID:
6777 T = Context.WCharTy;
6778 break;
6779 case PREDEF_TYPE_SHORT_ID:
6780 T = Context.ShortTy;
6781 break;
6782 case PREDEF_TYPE_INT_ID:
6783 T = Context.IntTy;
6784 break;
6785 case PREDEF_TYPE_LONG_ID:
6786 T = Context.LongTy;
6787 break;
6788 case PREDEF_TYPE_LONGLONG_ID:
6789 T = Context.LongLongTy;
6790 break;
6791 case PREDEF_TYPE_INT128_ID:
6792 T = Context.Int128Ty;
6793 break;
6794 case PREDEF_TYPE_HALF_ID:
6795 T = Context.HalfTy;
6796 break;
6797 case PREDEF_TYPE_FLOAT_ID:
6798 T = Context.FloatTy;
6799 break;
6800 case PREDEF_TYPE_DOUBLE_ID:
6801 T = Context.DoubleTy;
6802 break;
6803 case PREDEF_TYPE_LONGDOUBLE_ID:
6804 T = Context.LongDoubleTy;
6805 break;
Leonard Chanf921d852018-06-04 16:07:52 +00006806 case PREDEF_TYPE_SHORT_ACCUM_ID:
6807 T = Context.ShortAccumTy;
6808 break;
6809 case PREDEF_TYPE_ACCUM_ID:
6810 T = Context.AccumTy;
6811 break;
6812 case PREDEF_TYPE_LONG_ACCUM_ID:
6813 T = Context.LongAccumTy;
6814 break;
6815 case PREDEF_TYPE_USHORT_ACCUM_ID:
6816 T = Context.UnsignedShortAccumTy;
6817 break;
6818 case PREDEF_TYPE_UACCUM_ID:
6819 T = Context.UnsignedAccumTy;
6820 break;
6821 case PREDEF_TYPE_ULONG_ACCUM_ID:
6822 T = Context.UnsignedLongAccumTy;
6823 break;
Leonard Chanab80f3c2018-06-14 14:53:51 +00006824 case PREDEF_TYPE_SHORT_FRACT_ID:
6825 T = Context.ShortFractTy;
6826 break;
6827 case PREDEF_TYPE_FRACT_ID:
6828 T = Context.FractTy;
6829 break;
6830 case PREDEF_TYPE_LONG_FRACT_ID:
6831 T = Context.LongFractTy;
6832 break;
6833 case PREDEF_TYPE_USHORT_FRACT_ID:
6834 T = Context.UnsignedShortFractTy;
6835 break;
6836 case PREDEF_TYPE_UFRACT_ID:
6837 T = Context.UnsignedFractTy;
6838 break;
6839 case PREDEF_TYPE_ULONG_FRACT_ID:
6840 T = Context.UnsignedLongFractTy;
6841 break;
6842 case PREDEF_TYPE_SAT_SHORT_ACCUM_ID:
6843 T = Context.SatShortAccumTy;
6844 break;
6845 case PREDEF_TYPE_SAT_ACCUM_ID:
6846 T = Context.SatAccumTy;
6847 break;
6848 case PREDEF_TYPE_SAT_LONG_ACCUM_ID:
6849 T = Context.SatLongAccumTy;
6850 break;
6851 case PREDEF_TYPE_SAT_USHORT_ACCUM_ID:
6852 T = Context.SatUnsignedShortAccumTy;
6853 break;
6854 case PREDEF_TYPE_SAT_UACCUM_ID:
6855 T = Context.SatUnsignedAccumTy;
6856 break;
6857 case PREDEF_TYPE_SAT_ULONG_ACCUM_ID:
6858 T = Context.SatUnsignedLongAccumTy;
6859 break;
6860 case PREDEF_TYPE_SAT_SHORT_FRACT_ID:
6861 T = Context.SatShortFractTy;
6862 break;
6863 case PREDEF_TYPE_SAT_FRACT_ID:
6864 T = Context.SatFractTy;
6865 break;
6866 case PREDEF_TYPE_SAT_LONG_FRACT_ID:
6867 T = Context.SatLongFractTy;
6868 break;
6869 case PREDEF_TYPE_SAT_USHORT_FRACT_ID:
6870 T = Context.SatUnsignedShortFractTy;
6871 break;
6872 case PREDEF_TYPE_SAT_UFRACT_ID:
6873 T = Context.SatUnsignedFractTy;
6874 break;
6875 case PREDEF_TYPE_SAT_ULONG_FRACT_ID:
6876 T = Context.SatUnsignedLongFractTy;
6877 break;
Sjoerd Meijercc623ad2017-09-08 15:15:00 +00006878 case PREDEF_TYPE_FLOAT16_ID:
6879 T = Context.Float16Ty;
6880 break;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00006881 case PREDEF_TYPE_FLOAT128_ID:
6882 T = Context.Float128Ty;
6883 break;
Alexey Baderbdf7c842015-09-15 12:18:29 +00006884 case PREDEF_TYPE_OVERLOAD_ID:
6885 T = Context.OverloadTy;
6886 break;
6887 case PREDEF_TYPE_BOUND_MEMBER:
6888 T = Context.BoundMemberTy;
6889 break;
6890 case PREDEF_TYPE_PSEUDO_OBJECT:
6891 T = Context.PseudoObjectTy;
6892 break;
6893 case PREDEF_TYPE_DEPENDENT_ID:
6894 T = Context.DependentTy;
6895 break;
6896 case PREDEF_TYPE_UNKNOWN_ANY:
6897 T = Context.UnknownAnyTy;
6898 break;
6899 case PREDEF_TYPE_NULLPTR_ID:
6900 T = Context.NullPtrTy;
6901 break;
Richard Smith3a8244d2018-05-01 05:02:45 +00006902 case PREDEF_TYPE_CHAR8_ID:
6903 T = Context.Char8Ty;
6904 break;
Alexey Baderbdf7c842015-09-15 12:18:29 +00006905 case PREDEF_TYPE_CHAR16_ID:
6906 T = Context.Char16Ty;
6907 break;
6908 case PREDEF_TYPE_CHAR32_ID:
6909 T = Context.Char32Ty;
6910 break;
6911 case PREDEF_TYPE_OBJC_ID:
6912 T = Context.ObjCBuiltinIdTy;
6913 break;
6914 case PREDEF_TYPE_OBJC_CLASS:
6915 T = Context.ObjCBuiltinClassTy;
6916 break;
6917 case PREDEF_TYPE_OBJC_SEL:
6918 T = Context.ObjCBuiltinSelTy;
6919 break;
Alexey Bader954ba212016-04-08 13:40:33 +00006920#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
6921 case PREDEF_TYPE_##Id##_ID: \
6922 T = Context.SingletonId; \
Alexey Baderbdf7c842015-09-15 12:18:29 +00006923 break;
Alexey Baderb62f1442016-04-13 08:33:41 +00006924#include "clang/Basic/OpenCLImageTypes.def"
Andrew Savonichev3fee3512018-11-08 11:25:41 +00006925#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
6926 case PREDEF_TYPE_##Id##_ID: \
6927 T = Context.Id##Ty; \
6928 break;
6929#include "clang/Basic/OpenCLExtensionTypes.def"
Alexey Baderbdf7c842015-09-15 12:18:29 +00006930 case PREDEF_TYPE_SAMPLER_ID:
6931 T = Context.OCLSamplerTy;
6932 break;
6933 case PREDEF_TYPE_EVENT_ID:
6934 T = Context.OCLEventTy;
6935 break;
Alexey Bader9c8453f2015-09-15 11:18:52 +00006936 case PREDEF_TYPE_CLK_EVENT_ID:
6937 T = Context.OCLClkEventTy;
6938 break;
6939 case PREDEF_TYPE_QUEUE_ID:
6940 T = Context.OCLQueueTy;
6941 break;
Alexey Bader9c8453f2015-09-15 11:18:52 +00006942 case PREDEF_TYPE_RESERVE_ID_ID:
6943 T = Context.OCLReserveIDTy;
6944 break;
Alexey Baderbdf7c842015-09-15 12:18:29 +00006945 case PREDEF_TYPE_AUTO_DEDUCT:
6946 T = Context.getAutoDeductType();
6947 break;
Alexey Baderbdf7c842015-09-15 12:18:29 +00006948 case PREDEF_TYPE_AUTO_RREF_DEDUCT:
6949 T = Context.getAutoRRefDeductType();
Guy Benyei11169dd2012-12-18 14:30:41 +00006950 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00006951 case PREDEF_TYPE_ARC_UNBRIDGED_CAST:
6952 T = Context.ARCUnbridgedCastTy;
6953 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00006954 case PREDEF_TYPE_BUILTIN_FN:
6955 T = Context.BuiltinFnTy;
6956 break;
Alexey Bataev1a3320e2015-08-25 14:24:04 +00006957 case PREDEF_TYPE_OMP_ARRAY_SECTION:
6958 T = Context.OMPArraySectionTy;
6959 break;
Richard Sandifordeb485fb2019-08-09 08:52:54 +00006960#define SVE_TYPE(Name, Id, SingletonId) \
6961 case PREDEF_TYPE_##Id##_ID: \
6962 T = Context.SingletonId; \
6963 break;
6964#include "clang/Basic/AArch64SVEACLETypes.def"
Guy Benyei11169dd2012-12-18 14:30:41 +00006965 }
6966
6967 assert(!T.isNull() && "Unknown predefined type");
6968 return T.withFastQualifiers(FastQuals);
6969 }
6970
6971 Index -= NUM_PREDEF_TYPE_IDS;
6972 assert(Index < TypesLoaded.size() && "Type index out-of-range");
6973 if (TypesLoaded[Index].isNull()) {
6974 TypesLoaded[Index] = readTypeRecord(Index);
6975 if (TypesLoaded[Index].isNull())
Vedant Kumar48b4f762018-04-14 01:40:48 +00006976 return QualType();
Guy Benyei11169dd2012-12-18 14:30:41 +00006977
6978 TypesLoaded[Index]->setFromAST();
6979 if (DeserializationListener)
6980 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID),
6981 TypesLoaded[Index]);
6982 }
6983
6984 return TypesLoaded[Index].withFastQualifiers(FastQuals);
6985}
6986
6987QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) {
6988 return GetType(getGlobalTypeID(F, LocalID));
6989}
6990
David L. Jonesc4808b9e2016-12-15 20:53:26 +00006991serialization::TypeID
Guy Benyei11169dd2012-12-18 14:30:41 +00006992ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const {
6993 unsigned FastQuals = LocalID & Qualifiers::FastMask;
6994 unsigned LocalIndex = LocalID >> Qualifiers::FastWidth;
David L. Jonesc4808b9e2016-12-15 20:53:26 +00006995
Guy Benyei11169dd2012-12-18 14:30:41 +00006996 if (LocalIndex < NUM_PREDEF_TYPE_IDS)
6997 return LocalID;
6998
Richard Smith37a93df2017-02-18 00:32:02 +00006999 if (!F.ModuleOffsetMap.empty())
7000 ReadModuleOffsetMap(F);
7001
Guy Benyei11169dd2012-12-18 14:30:41 +00007002 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7003 = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS);
7004 assert(I != F.TypeRemap.end() && "Invalid index into type index remap");
David L. Jonesc4808b9e2016-12-15 20:53:26 +00007005
Guy Benyei11169dd2012-12-18 14:30:41 +00007006 unsigned GlobalIndex = LocalIndex + I->second;
7007 return (GlobalIndex << Qualifiers::FastWidth) | FastQuals;
7008}
7009
7010TemplateArgumentLocInfo
John McCall3ce3d232019-12-13 03:37:23 -05007011ASTRecordReader::readTemplateArgumentLocInfo(TemplateArgument::ArgKind Kind) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007012 switch (Kind) {
7013 case TemplateArgument::Expression:
John McCall3ce3d232019-12-13 03:37:23 -05007014 return readExpr();
Guy Benyei11169dd2012-12-18 14:30:41 +00007015 case TemplateArgument::Type:
John McCall3ce3d232019-12-13 03:37:23 -05007016 return readTypeSourceInfo();
Guy Benyei11169dd2012-12-18 14:30:41 +00007017 case TemplateArgument::Template: {
John McCall3ce3d232019-12-13 03:37:23 -05007018 NestedNameSpecifierLoc QualifierLoc =
7019 readNestedNameSpecifierLoc();
7020 SourceLocation TemplateNameLoc = readSourceLocation();
Guy Benyei11169dd2012-12-18 14:30:41 +00007021 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
7022 SourceLocation());
7023 }
7024 case TemplateArgument::TemplateExpansion: {
John McCall3ce3d232019-12-13 03:37:23 -05007025 NestedNameSpecifierLoc QualifierLoc = readNestedNameSpecifierLoc();
7026 SourceLocation TemplateNameLoc = readSourceLocation();
7027 SourceLocation EllipsisLoc = readSourceLocation();
David L. Jonesc4808b9e2016-12-15 20:53:26 +00007028 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
Guy Benyei11169dd2012-12-18 14:30:41 +00007029 EllipsisLoc);
7030 }
7031 case TemplateArgument::Null:
7032 case TemplateArgument::Integral:
7033 case TemplateArgument::Declaration:
7034 case TemplateArgument::NullPtr:
7035 case TemplateArgument::Pack:
7036 // FIXME: Is this right?
Vedant Kumar48b4f762018-04-14 01:40:48 +00007037 return TemplateArgumentLocInfo();
Guy Benyei11169dd2012-12-18 14:30:41 +00007038 }
7039 llvm_unreachable("unexpected template argument loc");
7040}
7041
John McCall3ce3d232019-12-13 03:37:23 -05007042TemplateArgumentLoc ASTRecordReader::readTemplateArgumentLoc() {
7043 TemplateArgument Arg = readTemplateArgument();
Guy Benyei11169dd2012-12-18 14:30:41 +00007044
7045 if (Arg.getKind() == TemplateArgument::Expression) {
John McCall3ce3d232019-12-13 03:37:23 -05007046 if (readBool()) // bool InfoHasSameExpr.
Guy Benyei11169dd2012-12-18 14:30:41 +00007047 return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr()));
7048 }
John McCall3ce3d232019-12-13 03:37:23 -05007049 return TemplateArgumentLoc(Arg, readTemplateArgumentLocInfo(Arg.getKind()));
Guy Benyei11169dd2012-12-18 14:30:41 +00007050}
7051
John McCall3ce3d232019-12-13 03:37:23 -05007052const ASTTemplateArgumentListInfo *
7053ASTRecordReader::readASTTemplateArgumentListInfo() {
7054 SourceLocation LAngleLoc = readSourceLocation();
7055 SourceLocation RAngleLoc = readSourceLocation();
7056 unsigned NumArgsAsWritten = readInt();
Enea Zaffanella6dbe1872013-08-10 07:24:53 +00007057 TemplateArgumentListInfo TemplArgsInfo(LAngleLoc, RAngleLoc);
7058 for (unsigned i = 0; i != NumArgsAsWritten; ++i)
John McCall3ce3d232019-12-13 03:37:23 -05007059 TemplArgsInfo.addArgument(readTemplateArgumentLoc());
Enea Zaffanella6dbe1872013-08-10 07:24:53 +00007060 return ASTTemplateArgumentListInfo::Create(getContext(), TemplArgsInfo);
7061}
7062
Guy Benyei11169dd2012-12-18 14:30:41 +00007063Decl *ASTReader::GetExternalDecl(uint32_t ID) {
7064 return GetDecl(ID);
7065}
7066
Richard Smith053f6c62014-05-16 23:01:30 +00007067void ASTReader::CompleteRedeclChain(const Decl *D) {
Richard Smith851072e2014-05-19 20:59:20 +00007068 if (NumCurrentElementsDeserializing) {
7069 // We arrange to not care about the complete redeclaration chain while we're
7070 // deserializing. Just remember that the AST has marked this one as complete
7071 // but that it's not actually complete yet, so we know we still need to
7072 // complete it later.
7073 PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D));
7074 return;
7075 }
7076
Richard Smith053f6c62014-05-16 23:01:30 +00007077 const DeclContext *DC = D->getDeclContext()->getRedeclContext();
7078
Richard Smith053f6c62014-05-16 23:01:30 +00007079 // If this is a named declaration, complete it by looking it up
7080 // within its context.
7081 //
Richard Smith01bdb7a2014-08-28 05:44:07 +00007082 // FIXME: Merging a function definition should merge
Richard Smith053f6c62014-05-16 23:01:30 +00007083 // all mergeable entities within it.
7084 if (isa<TranslationUnitDecl>(DC) || isa<NamespaceDecl>(DC) ||
7085 isa<CXXRecordDecl>(DC) || isa<EnumDecl>(DC)) {
7086 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) {
Richard Smitha534a312015-07-21 23:54:07 +00007087 if (!getContext().getLangOpts().CPlusPlus &&
7088 isa<TranslationUnitDecl>(DC)) {
Richard Smith053f6c62014-05-16 23:01:30 +00007089 // Outside of C++, we don't have a lookup table for the TU, so update
Richard Smitha534a312015-07-21 23:54:07 +00007090 // the identifier instead. (For C++ modules, we don't store decls
7091 // in the serialized identifier table, so we do the lookup in the TU.)
7092 auto *II = Name.getAsIdentifierInfo();
7093 assert(II && "non-identifier name in C?");
Richard Smith053f6c62014-05-16 23:01:30 +00007094 if (II->isOutOfDate())
7095 updateOutOfDateIdentifier(*II);
7096 } else
7097 DC->lookup(Name);
Richard Smith01bdb7a2014-08-28 05:44:07 +00007098 } else if (needsAnonymousDeclarationNumber(cast<NamedDecl>(D))) {
Richard Smith3cb15722015-08-05 22:41:45 +00007099 // Find all declarations of this kind from the relevant context.
7100 for (auto *DCDecl : cast<Decl>(D->getLexicalDeclContext())->redecls()) {
7101 auto *DC = cast<DeclContext>(DCDecl);
7102 SmallVector<Decl*, 8> Decls;
7103 FindExternalLexicalDecls(
7104 DC, [&](Decl::Kind K) { return K == D->getKind(); }, Decls);
7105 }
Richard Smith053f6c62014-05-16 23:01:30 +00007106 }
7107 }
Richard Smith50895422015-01-31 03:04:55 +00007108
7109 if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D))
7110 CTSD->getSpecializedTemplate()->LoadLazySpecializations();
7111 if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D))
7112 VTSD->getSpecializedTemplate()->LoadLazySpecializations();
7113 if (auto *FD = dyn_cast<FunctionDecl>(D)) {
7114 if (auto *Template = FD->getPrimaryTemplate())
7115 Template->LoadLazySpecializations();
7116 }
Richard Smith053f6c62014-05-16 23:01:30 +00007117}
7118
Richard Smithc2bb8182015-03-24 06:36:48 +00007119CXXCtorInitializer **
7120ASTReader::GetExternalCXXCtorInitializers(uint64_t Offset) {
7121 RecordLocation Loc = getLocalBitOffset(Offset);
7122 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
7123 SavedStreamPosition SavedPosition(Cursor);
JF Bastien0e828952019-06-26 19:50:12 +00007124 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
7125 Error(std::move(Err));
7126 return nullptr;
7127 }
Richard Smithc2bb8182015-03-24 06:36:48 +00007128 ReadingKindTracker ReadingKind(Read_Decl, *this);
7129
JF Bastien0e828952019-06-26 19:50:12 +00007130 Expected<unsigned> MaybeCode = Cursor.ReadCode();
7131 if (!MaybeCode) {
7132 Error(MaybeCode.takeError());
7133 return nullptr;
7134 }
7135 unsigned Code = MaybeCode.get();
7136
John McCall3ce3d232019-12-13 03:37:23 -05007137 ASTRecordReader Record(*this, *Loc.F);
7138 Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code);
JF Bastien0e828952019-06-26 19:50:12 +00007139 if (!MaybeRecCode) {
7140 Error(MaybeRecCode.takeError());
7141 return nullptr;
7142 }
7143 if (MaybeRecCode.get() != DECL_CXX_CTOR_INITIALIZERS) {
Richard Smithc2bb8182015-03-24 06:36:48 +00007144 Error("malformed AST file: missing C++ ctor initializers");
7145 return nullptr;
7146 }
7147
John McCall3ce3d232019-12-13 03:37:23 -05007148 return Record.readCXXCtorInitializers();
Richard Smithc2bb8182015-03-24 06:36:48 +00007149}
7150
Guy Benyei11169dd2012-12-18 14:30:41 +00007151CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) {
Richard Smithdbafb6c2017-06-29 23:23:46 +00007152 assert(ContextObj && "reading base specifiers with no AST context");
7153 ASTContext &Context = *ContextObj;
7154
Guy Benyei11169dd2012-12-18 14:30:41 +00007155 RecordLocation Loc = getLocalBitOffset(Offset);
Chris Lattner7fb3bef2013-01-20 00:56:42 +00007156 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00007157 SavedStreamPosition SavedPosition(Cursor);
JF Bastien0e828952019-06-26 19:50:12 +00007158 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
7159 Error(std::move(Err));
7160 return nullptr;
7161 }
Guy Benyei11169dd2012-12-18 14:30:41 +00007162 ReadingKindTracker ReadingKind(Read_Decl, *this);
JF Bastien0e828952019-06-26 19:50:12 +00007163
7164 Expected<unsigned> MaybeCode = Cursor.ReadCode();
7165 if (!MaybeCode) {
7166 Error(MaybeCode.takeError());
7167 return nullptr;
7168 }
7169 unsigned Code = MaybeCode.get();
7170
John McCall3ce3d232019-12-13 03:37:23 -05007171 ASTRecordReader Record(*this, *Loc.F);
7172 Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code);
JF Bastien0e828952019-06-26 19:50:12 +00007173 if (!MaybeRecCode) {
7174 Error(MaybeCode.takeError());
7175 return nullptr;
7176 }
7177 unsigned RecCode = MaybeRecCode.get();
7178
Guy Benyei11169dd2012-12-18 14:30:41 +00007179 if (RecCode != DECL_CXX_BASE_SPECIFIERS) {
Richard Smithcd45dbc2014-04-19 03:48:30 +00007180 Error("malformed AST file: missing C++ base specifiers");
Craig Toppera13603a2014-05-22 05:54:18 +00007181 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007182 }
7183
John McCall3ce3d232019-12-13 03:37:23 -05007184 unsigned NumBases = Record.readInt();
Guy Benyei11169dd2012-12-18 14:30:41 +00007185 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases);
Vedant Kumar48b4f762018-04-14 01:40:48 +00007186 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases];
Guy Benyei11169dd2012-12-18 14:30:41 +00007187 for (unsigned I = 0; I != NumBases; ++I)
John McCall3ce3d232019-12-13 03:37:23 -05007188 Bases[I] = Record.readCXXBaseSpecifier();
Guy Benyei11169dd2012-12-18 14:30:41 +00007189 return Bases;
7190}
7191
David L. Jonesc4808b9e2016-12-15 20:53:26 +00007192serialization::DeclID
Guy Benyei11169dd2012-12-18 14:30:41 +00007193ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const {
7194 if (LocalID < NUM_PREDEF_DECL_IDS)
7195 return LocalID;
7196
Richard Smith37a93df2017-02-18 00:32:02 +00007197 if (!F.ModuleOffsetMap.empty())
7198 ReadModuleOffsetMap(F);
7199
Guy Benyei11169dd2012-12-18 14:30:41 +00007200 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7201 = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS);
7202 assert(I != F.DeclRemap.end() && "Invalid index into decl index remap");
David L. Jonesc4808b9e2016-12-15 20:53:26 +00007203
Guy Benyei11169dd2012-12-18 14:30:41 +00007204 return LocalID + I->second;
7205}
7206
7207bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID,
7208 ModuleFile &M) const {
Richard Smithfe620d22015-03-05 23:24:12 +00007209 // Predefined decls aren't from any module.
7210 if (ID < NUM_PREDEF_DECL_IDS)
7211 return false;
7212
David L. Jonesc4808b9e2016-12-15 20:53:26 +00007213 return ID - NUM_PREDEF_DECL_IDS >= M.BaseDeclID &&
Richard Smithbcda1a92015-07-12 23:51:20 +00007214 ID - NUM_PREDEF_DECL_IDS < M.BaseDeclID + M.LocalNumDecls;
Guy Benyei11169dd2012-12-18 14:30:41 +00007215}
7216
Douglas Gregor9f782892013-01-21 15:25:38 +00007217ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007218 if (!D->isFromASTFile())
Craig Toppera13603a2014-05-22 05:54:18 +00007219 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007220 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID());
7221 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
7222 return I->second;
7223}
7224
7225SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) {
7226 if (ID < NUM_PREDEF_DECL_IDS)
Vedant Kumar48b4f762018-04-14 01:40:48 +00007227 return SourceLocation();
Richard Smithcd45dbc2014-04-19 03:48:30 +00007228
Guy Benyei11169dd2012-12-18 14:30:41 +00007229 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
7230
7231 if (Index > DeclsLoaded.size()) {
7232 Error("declaration ID out-of-range for AST file");
Vedant Kumar48b4f762018-04-14 01:40:48 +00007233 return SourceLocation();
Guy Benyei11169dd2012-12-18 14:30:41 +00007234 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00007235
Guy Benyei11169dd2012-12-18 14:30:41 +00007236 if (Decl *D = DeclsLoaded[Index])
7237 return D->getLocation();
7238
Richard Smithcb34bd32016-03-27 07:28:06 +00007239 SourceLocation Loc;
7240 DeclCursorForID(ID, Loc);
7241 return Loc;
Guy Benyei11169dd2012-12-18 14:30:41 +00007242}
7243
Richard Smithfe620d22015-03-05 23:24:12 +00007244static Decl *getPredefinedDecl(ASTContext &Context, PredefinedDeclIDs ID) {
7245 switch (ID) {
7246 case PREDEF_DECL_NULL_ID:
7247 return nullptr;
7248
7249 case PREDEF_DECL_TRANSLATION_UNIT_ID:
7250 return Context.getTranslationUnitDecl();
7251
7252 case PREDEF_DECL_OBJC_ID_ID:
7253 return Context.getObjCIdDecl();
7254
7255 case PREDEF_DECL_OBJC_SEL_ID:
7256 return Context.getObjCSelDecl();
7257
7258 case PREDEF_DECL_OBJC_CLASS_ID:
7259 return Context.getObjCClassDecl();
7260
7261 case PREDEF_DECL_OBJC_PROTOCOL_ID:
7262 return Context.getObjCProtocolDecl();
7263
7264 case PREDEF_DECL_INT_128_ID:
7265 return Context.getInt128Decl();
7266
7267 case PREDEF_DECL_UNSIGNED_INT_128_ID:
7268 return Context.getUInt128Decl();
7269
7270 case PREDEF_DECL_OBJC_INSTANCETYPE_ID:
7271 return Context.getObjCInstanceTypeDecl();
7272
7273 case PREDEF_DECL_BUILTIN_VA_LIST_ID:
7274 return Context.getBuiltinVaListDecl();
Richard Smithf19e1272015-03-07 00:04:49 +00007275
Richard Smith9b88a4c2015-07-27 05:40:23 +00007276 case PREDEF_DECL_VA_LIST_TAG:
7277 return Context.getVaListTagDecl();
7278
Charles Davisc7d5c942015-09-17 20:55:33 +00007279 case PREDEF_DECL_BUILTIN_MS_VA_LIST_ID:
7280 return Context.getBuiltinMSVaListDecl();
7281
Richard Smithf19e1272015-03-07 00:04:49 +00007282 case PREDEF_DECL_EXTERN_C_CONTEXT_ID:
7283 return Context.getExternCContextDecl();
David Majnemerd9b1a4f2015-11-04 03:40:30 +00007284
7285 case PREDEF_DECL_MAKE_INTEGER_SEQ_ID:
7286 return Context.getMakeIntegerSeqDecl();
Quentin Colombet043406b2016-02-03 22:41:00 +00007287
7288 case PREDEF_DECL_CF_CONSTANT_STRING_ID:
7289 return Context.getCFConstantStringDecl();
Ben Langmuirf5416742016-02-04 00:55:24 +00007290
7291 case PREDEF_DECL_CF_CONSTANT_STRING_TAG_ID:
7292 return Context.getCFConstantStringTagDecl();
Eric Fiselier6ad68552016-07-01 01:24:09 +00007293
7294 case PREDEF_DECL_TYPE_PACK_ELEMENT_ID:
7295 return Context.getTypePackElementDecl();
Richard Smithfe620d22015-03-05 23:24:12 +00007296 }
Yaron Keren322bdad2015-03-06 07:49:14 +00007297 llvm_unreachable("PredefinedDeclIDs unknown enum value");
Richard Smithfe620d22015-03-05 23:24:12 +00007298}
7299
Richard Smithcd45dbc2014-04-19 03:48:30 +00007300Decl *ASTReader::GetExistingDecl(DeclID ID) {
Richard Smithdbafb6c2017-06-29 23:23:46 +00007301 assert(ContextObj && "reading decl with no AST context");
Richard Smithcd45dbc2014-04-19 03:48:30 +00007302 if (ID < NUM_PREDEF_DECL_IDS) {
Richard Smithdbafb6c2017-06-29 23:23:46 +00007303 Decl *D = getPredefinedDecl(*ContextObj, (PredefinedDeclIDs)ID);
Richard Smithfe620d22015-03-05 23:24:12 +00007304 if (D) {
7305 // Track that we have merged the declaration with ID \p ID into the
7306 // pre-existing predefined declaration \p D.
Richard Smith5fc18a92015-07-12 23:43:21 +00007307 auto &Merged = KeyDecls[D->getCanonicalDecl()];
Richard Smithfe620d22015-03-05 23:24:12 +00007308 if (Merged.empty())
7309 Merged.push_back(ID);
Guy Benyei11169dd2012-12-18 14:30:41 +00007310 }
Richard Smithfe620d22015-03-05 23:24:12 +00007311 return D;
Guy Benyei11169dd2012-12-18 14:30:41 +00007312 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00007313
Guy Benyei11169dd2012-12-18 14:30:41 +00007314 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
7315
7316 if (Index >= DeclsLoaded.size()) {
7317 assert(0 && "declaration ID out-of-range for AST file");
7318 Error("declaration ID out-of-range for AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00007319 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007320 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00007321
7322 return DeclsLoaded[Index];
7323}
7324
7325Decl *ASTReader::GetDecl(DeclID ID) {
7326 if (ID < NUM_PREDEF_DECL_IDS)
7327 return GetExistingDecl(ID);
7328
7329 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
7330
7331 if (Index >= DeclsLoaded.size()) {
7332 assert(0 && "declaration ID out-of-range for AST file");
7333 Error("declaration ID out-of-range for AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00007334 return nullptr;
Richard Smithcd45dbc2014-04-19 03:48:30 +00007335 }
7336
Guy Benyei11169dd2012-12-18 14:30:41 +00007337 if (!DeclsLoaded[Index]) {
7338 ReadDeclRecord(ID);
7339 if (DeserializationListener)
7340 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
7341 }
7342
7343 return DeclsLoaded[Index];
7344}
7345
David L. Jonesc4808b9e2016-12-15 20:53:26 +00007346DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M,
Guy Benyei11169dd2012-12-18 14:30:41 +00007347 DeclID GlobalID) {
7348 if (GlobalID < NUM_PREDEF_DECL_IDS)
7349 return GlobalID;
David L. Jonesc4808b9e2016-12-15 20:53:26 +00007350
Guy Benyei11169dd2012-12-18 14:30:41 +00007351 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID);
7352 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
7353 ModuleFile *Owner = I->second;
7354
7355 llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos
7356 = M.GlobalToLocalDeclIDs.find(Owner);
7357 if (Pos == M.GlobalToLocalDeclIDs.end())
7358 return 0;
David L. Jonesc4808b9e2016-12-15 20:53:26 +00007359
Guy Benyei11169dd2012-12-18 14:30:41 +00007360 return GlobalID - Owner->BaseDeclID + Pos->second;
7361}
7362
David L. Jonesc4808b9e2016-12-15 20:53:26 +00007363serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F,
Guy Benyei11169dd2012-12-18 14:30:41 +00007364 const RecordData &Record,
7365 unsigned &Idx) {
7366 if (Idx >= Record.size()) {
7367 Error("Corrupted AST file");
7368 return 0;
7369 }
David L. Jonesc4808b9e2016-12-15 20:53:26 +00007370
Guy Benyei11169dd2012-12-18 14:30:41 +00007371 return getGlobalDeclID(F, Record[Idx++]);
7372}
7373
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00007374/// Resolve the offset of a statement into a statement.
Guy Benyei11169dd2012-12-18 14:30:41 +00007375///
7376/// This operation will read a new statement from the external
7377/// source each time it is called, and is meant to be used via a
7378/// LazyOffsetPtr (which is used by Decls for the body of functions, etc).
7379Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) {
7380 // Switch case IDs are per Decl.
7381 ClearSwitchCaseIDs();
7382
7383 // Offset here is a global offset across the entire chain.
7384 RecordLocation Loc = getLocalBitOffset(Offset);
JF Bastien0e828952019-06-26 19:50:12 +00007385 if (llvm::Error Err = Loc.F->DeclsCursor.JumpToBit(Loc.Offset)) {
7386 Error(std::move(Err));
7387 return nullptr;
7388 }
David Blaikie9fd16f82017-03-08 23:57:08 +00007389 assert(NumCurrentElementsDeserializing == 0 &&
7390 "should not be called while already deserializing");
7391 Deserializing D(this);
Guy Benyei11169dd2012-12-18 14:30:41 +00007392 return ReadStmtFromStream(*Loc.F);
7393}
7394
Richard Smith3cb15722015-08-05 22:41:45 +00007395void ASTReader::FindExternalLexicalDecls(
7396 const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant,
7397 SmallVectorImpl<Decl *> &Decls) {
Richard Smith82f8fcd2015-08-06 22:07:25 +00007398 bool PredefsVisited[NUM_PREDEF_DECL_IDS] = {};
7399
Richard Smith9ccdd932015-08-06 22:14:12 +00007400 auto Visit = [&] (ModuleFile *M, LexicalContents LexicalDecls) {
Richard Smith82f8fcd2015-08-06 22:07:25 +00007401 assert(LexicalDecls.size() % 2 == 0 && "expected an even number of entries");
7402 for (int I = 0, N = LexicalDecls.size(); I != N; I += 2) {
7403 auto K = (Decl::Kind)+LexicalDecls[I];
7404 if (!IsKindWeWant(K))
7405 continue;
7406
7407 auto ID = (serialization::DeclID)+LexicalDecls[I + 1];
7408
7409 // Don't add predefined declarations to the lexical context more
7410 // than once.
7411 if (ID < NUM_PREDEF_DECL_IDS) {
7412 if (PredefsVisited[ID])
7413 continue;
7414
7415 PredefsVisited[ID] = true;
7416 }
7417
7418 if (Decl *D = GetLocalDecl(*M, ID)) {
Richard Smith2317a3e2015-08-11 21:21:20 +00007419 assert(D->getKind() == K && "wrong kind for lexical decl");
Richard Smith82f8fcd2015-08-06 22:07:25 +00007420 if (!DC->isDeclInLexicalTraversal(D))
7421 Decls.push_back(D);
7422 }
7423 }
7424 };
7425
7426 if (isa<TranslationUnitDecl>(DC)) {
7427 for (auto Lexical : TULexicalDecls)
7428 Visit(Lexical.first, Lexical.second);
7429 } else {
7430 auto I = LexicalDecls.find(DC);
7431 if (I != LexicalDecls.end())
Richard Smith9c9173d2015-08-11 22:00:24 +00007432 Visit(I->second.first, I->second.second);
Richard Smith82f8fcd2015-08-06 22:07:25 +00007433 }
7434
Guy Benyei11169dd2012-12-18 14:30:41 +00007435 ++NumLexicalDeclContextsRead;
Guy Benyei11169dd2012-12-18 14:30:41 +00007436}
7437
7438namespace {
7439
7440class DeclIDComp {
7441 ASTReader &Reader;
7442 ModuleFile &Mod;
7443
7444public:
7445 DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {}
7446
7447 bool operator()(LocalDeclID L, LocalDeclID R) const {
7448 SourceLocation LHS = getLocation(L);
7449 SourceLocation RHS = getLocation(R);
7450 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
7451 }
7452
7453 bool operator()(SourceLocation LHS, LocalDeclID R) const {
7454 SourceLocation RHS = getLocation(R);
7455 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
7456 }
7457
7458 bool operator()(LocalDeclID L, SourceLocation RHS) const {
7459 SourceLocation LHS = getLocation(L);
7460 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
7461 }
7462
7463 SourceLocation getLocation(LocalDeclID ID) const {
7464 return Reader.getSourceManager().getFileLoc(
7465 Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID)));
7466 }
7467};
7468
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00007469} // namespace
Guy Benyei11169dd2012-12-18 14:30:41 +00007470
7471void ASTReader::FindFileRegionDecls(FileID File,
7472 unsigned Offset, unsigned Length,
7473 SmallVectorImpl<Decl *> &Decls) {
7474 SourceManager &SM = getSourceManager();
7475
7476 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File);
7477 if (I == FileDeclIDs.end())
7478 return;
7479
7480 FileDeclsInfo &DInfo = I->second;
7481 if (DInfo.Decls.empty())
7482 return;
7483
7484 SourceLocation
7485 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset);
7486 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length);
7487
7488 DeclIDComp DIDComp(*this, *DInfo.Mod);
Fangrui Song7264a472019-07-03 08:13:17 +00007489 ArrayRef<serialization::LocalDeclID>::iterator BeginIt =
7490 llvm::lower_bound(DInfo.Decls, BeginLoc, DIDComp);
Guy Benyei11169dd2012-12-18 14:30:41 +00007491 if (BeginIt != DInfo.Decls.begin())
7492 --BeginIt;
7493
7494 // If we are pointing at a top-level decl inside an objc container, we need
7495 // to backtrack until we find it otherwise we will fail to report that the
7496 // region overlaps with an objc container.
7497 while (BeginIt != DInfo.Decls.begin() &&
7498 GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt))
7499 ->isTopLevelDeclInObjCContainer())
7500 --BeginIt;
7501
Fangrui Song7264a472019-07-03 08:13:17 +00007502 ArrayRef<serialization::LocalDeclID>::iterator EndIt =
7503 llvm::upper_bound(DInfo.Decls, EndLoc, DIDComp);
Guy Benyei11169dd2012-12-18 14:30:41 +00007504 if (EndIt != DInfo.Decls.end())
7505 ++EndIt;
David L. Jonesc4808b9e2016-12-15 20:53:26 +00007506
Guy Benyei11169dd2012-12-18 14:30:41 +00007507 for (ArrayRef<serialization::LocalDeclID>::iterator
7508 DIt = BeginIt; DIt != EndIt; ++DIt)
7509 Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt)));
7510}
7511
Richard Smith9ce12e32013-02-07 03:30:24 +00007512bool
Guy Benyei11169dd2012-12-18 14:30:41 +00007513ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC,
7514 DeclarationName Name) {
Richard Smithd88a7f12015-09-01 20:35:42 +00007515 assert(DC->hasExternalVisibleStorage() && DC == DC->getPrimaryContext() &&
Guy Benyei11169dd2012-12-18 14:30:41 +00007516 "DeclContext has no visible decls in storage");
7517 if (!Name)
Richard Smith9ce12e32013-02-07 03:30:24 +00007518 return false;
Guy Benyei11169dd2012-12-18 14:30:41 +00007519
Richard Smithd88a7f12015-09-01 20:35:42 +00007520 auto It = Lookups.find(DC);
7521 if (It == Lookups.end())
7522 return false;
7523
Richard Smith8c913ec2014-08-14 02:21:01 +00007524 Deserializing LookupResults(this);
7525
Richard Smithd88a7f12015-09-01 20:35:42 +00007526 // Load the list of declarations.
Guy Benyei11169dd2012-12-18 14:30:41 +00007527 SmallVector<NamedDecl *, 64> Decls;
Vedant Kumar48b4f762018-04-14 01:40:48 +00007528 for (DeclID ID : It->second.Table.find(Name)) {
7529 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID));
Richard Smithd88a7f12015-09-01 20:35:42 +00007530 if (ND->getDeclName() == Name)
7531 Decls.push_back(ND);
7532 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00007533
Guy Benyei11169dd2012-12-18 14:30:41 +00007534 ++NumVisibleDeclContextsRead;
7535 SetExternalVisibleDeclsForName(DC, Name, Decls);
Richard Smith9ce12e32013-02-07 03:30:24 +00007536 return !Decls.empty();
Guy Benyei11169dd2012-12-18 14:30:41 +00007537}
7538
Guy Benyei11169dd2012-12-18 14:30:41 +00007539void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) {
7540 if (!DC->hasExternalVisibleStorage())
7541 return;
Richard Smithd88a7f12015-09-01 20:35:42 +00007542
7543 auto It = Lookups.find(DC);
7544 assert(It != Lookups.end() &&
7545 "have external visible storage but no lookup tables");
7546
Craig Topper79be4cd2013-07-05 04:33:53 +00007547 DeclsMap Decls;
Guy Benyei11169dd2012-12-18 14:30:41 +00007548
Vedant Kumar48b4f762018-04-14 01:40:48 +00007549 for (DeclID ID : It->second.Table.findAll()) {
7550 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID));
Richard Smithd88a7f12015-09-01 20:35:42 +00007551 Decls[ND->getDeclName()].push_back(ND);
Guy Benyei11169dd2012-12-18 14:30:41 +00007552 }
7553
Guy Benyei11169dd2012-12-18 14:30:41 +00007554 ++NumVisibleDeclContextsRead;
7555
Vedant Kumar48b4f762018-04-14 01:40:48 +00007556 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) {
7557 SetExternalVisibleDeclsForName(DC, I->first, I->second);
7558 }
Guy Benyei11169dd2012-12-18 14:30:41 +00007559 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false);
7560}
7561
Richard Smithd88a7f12015-09-01 20:35:42 +00007562const serialization::reader::DeclContextLookupTable *
7563ASTReader::getLoadedLookupTables(DeclContext *Primary) const {
7564 auto I = Lookups.find(Primary);
7565 return I == Lookups.end() ? nullptr : &I->second;
7566}
7567
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00007568/// Under non-PCH compilation the consumer receives the objc methods
Guy Benyei11169dd2012-12-18 14:30:41 +00007569/// before receiving the implementation, and codegen depends on this.
7570/// We simulate this by deserializing and passing to consumer the methods of the
7571/// implementation before passing the deserialized implementation decl.
7572static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD,
7573 ASTConsumer *Consumer) {
7574 assert(ImplD && Consumer);
7575
Aaron Ballmanaff18c02014-03-13 19:03:34 +00007576 for (auto *I : ImplD->methods())
7577 Consumer->HandleInterestingDecl(DeclGroupRef(I));
Guy Benyei11169dd2012-12-18 14:30:41 +00007578
7579 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD));
7580}
7581
Guy Benyei11169dd2012-12-18 14:30:41 +00007582void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
Vedant Kumar48b4f762018-04-14 01:40:48 +00007583 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
Guy Benyei11169dd2012-12-18 14:30:41 +00007584 PassObjCImplDeclToConsumer(ImplD, Consumer);
7585 else
7586 Consumer->HandleInterestingDecl(DeclGroupRef(D));
7587}
7588
7589void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) {
7590 this->Consumer = Consumer;
7591
Richard Smith9e2341d2015-03-23 03:25:59 +00007592 if (Consumer)
7593 PassInterestingDeclsToConsumer();
Richard Smith7f330cd2015-03-18 01:42:29 +00007594
7595 if (DeserializationListener)
7596 DeserializationListener->ReaderInitialized(this);
Guy Benyei11169dd2012-12-18 14:30:41 +00007597}
7598
7599void ASTReader::PrintStats() {
7600 std::fprintf(stderr, "*** AST File Statistics:\n");
7601
7602 unsigned NumTypesLoaded
7603 = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(),
7604 QualType());
7605 unsigned NumDeclsLoaded
7606 = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(),
Craig Toppera13603a2014-05-22 05:54:18 +00007607 (Decl *)nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00007608 unsigned NumIdentifiersLoaded
7609 = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(),
7610 IdentifiersLoaded.end(),
Craig Toppera13603a2014-05-22 05:54:18 +00007611 (IdentifierInfo *)nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00007612 unsigned NumMacrosLoaded
7613 = MacrosLoaded.size() - std::count(MacrosLoaded.begin(),
7614 MacrosLoaded.end(),
Craig Toppera13603a2014-05-22 05:54:18 +00007615 (MacroInfo *)nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00007616 unsigned NumSelectorsLoaded
7617 = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(),
7618 SelectorsLoaded.end(),
7619 Selector());
7620
7621 if (unsigned TotalNumSLocEntries = getTotalNumSLocs())
7622 std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n",
7623 NumSLocEntriesRead, TotalNumSLocEntries,
7624 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
7625 if (!TypesLoaded.empty())
7626 std::fprintf(stderr, " %u/%u types read (%f%%)\n",
7627 NumTypesLoaded, (unsigned)TypesLoaded.size(),
7628 ((float)NumTypesLoaded/TypesLoaded.size() * 100));
7629 if (!DeclsLoaded.empty())
7630 std::fprintf(stderr, " %u/%u declarations read (%f%%)\n",
7631 NumDeclsLoaded, (unsigned)DeclsLoaded.size(),
7632 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100));
7633 if (!IdentifiersLoaded.empty())
7634 std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n",
7635 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(),
7636 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
7637 if (!MacrosLoaded.empty())
7638 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
7639 NumMacrosLoaded, (unsigned)MacrosLoaded.size(),
7640 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100));
7641 if (!SelectorsLoaded.empty())
7642 std::fprintf(stderr, " %u/%u selectors read (%f%%)\n",
7643 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(),
7644 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
7645 if (TotalNumStatements)
7646 std::fprintf(stderr, " %u/%u statements read (%f%%)\n",
7647 NumStatementsRead, TotalNumStatements,
7648 ((float)NumStatementsRead/TotalNumStatements * 100));
7649 if (TotalNumMacros)
7650 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
7651 NumMacrosRead, TotalNumMacros,
7652 ((float)NumMacrosRead/TotalNumMacros * 100));
7653 if (TotalLexicalDeclContexts)
7654 std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n",
7655 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
7656 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
7657 * 100));
7658 if (TotalVisibleDeclContexts)
7659 std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n",
7660 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
7661 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
7662 * 100));
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00007663 if (TotalNumMethodPoolEntries)
Guy Benyei11169dd2012-12-18 14:30:41 +00007664 std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n",
7665 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
7666 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
7667 * 100));
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00007668 if (NumMethodPoolLookups)
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007669 std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n",
7670 NumMethodPoolHits, NumMethodPoolLookups,
7671 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00007672 if (NumMethodPoolTableLookups)
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007673 std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n",
7674 NumMethodPoolTableHits, NumMethodPoolTableLookups,
7675 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups
7676 * 100.0));
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00007677 if (NumIdentifierLookupHits)
Douglas Gregor00a50f72013-01-25 00:38:33 +00007678 std::fprintf(stderr,
7679 " %u / %u identifier table lookups succeeded (%f%%)\n",
7680 NumIdentifierLookupHits, NumIdentifierLookups,
7681 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
Douglas Gregor00a50f72013-01-25 00:38:33 +00007682
Douglas Gregore060e572013-01-25 01:03:03 +00007683 if (GlobalIndex) {
7684 std::fprintf(stderr, "\n");
7685 GlobalIndex->printStats();
7686 }
David L. Jonesc4808b9e2016-12-15 20:53:26 +00007687
Guy Benyei11169dd2012-12-18 14:30:41 +00007688 std::fprintf(stderr, "\n");
7689 dump();
7690 std::fprintf(stderr, "\n");
7691}
7692
7693template<typename Key, typename ModuleFile, unsigned InitialCapacity>
Vassil Vassilevb2710682017-03-02 18:13:19 +00007694LLVM_DUMP_METHOD static void
Guy Benyei11169dd2012-12-18 14:30:41 +00007695dumpModuleIDMap(StringRef Name,
David L. Jonesc4808b9e2016-12-15 20:53:26 +00007696 const ContinuousRangeMap<Key, ModuleFile *,
Guy Benyei11169dd2012-12-18 14:30:41 +00007697 InitialCapacity> &Map) {
7698 if (Map.begin() == Map.end())
7699 return;
David L. Jonesc4808b9e2016-12-15 20:53:26 +00007700
Vedant Kumar48b4f762018-04-14 01:40:48 +00007701 using MapType = ContinuousRangeMap<Key, ModuleFile *, InitialCapacity>;
7702
Guy Benyei11169dd2012-12-18 14:30:41 +00007703 llvm::errs() << Name << ":\n";
Vedant Kumar48b4f762018-04-14 01:40:48 +00007704 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
7705 I != IEnd; ++I) {
7706 llvm::errs() << " " << I->first << " -> " << I->second->FileName
7707 << "\n";
7708 }
Guy Benyei11169dd2012-12-18 14:30:41 +00007709}
7710
Yaron Kerencdae9412016-01-29 19:38:18 +00007711LLVM_DUMP_METHOD void ASTReader::dump() {
Guy Benyei11169dd2012-12-18 14:30:41 +00007712 llvm::errs() << "*** PCH/ModuleFile Remappings:\n";
7713 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap);
7714 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap);
7715 dumpModuleIDMap("Global type map", GlobalTypeMap);
7716 dumpModuleIDMap("Global declaration map", GlobalDeclMap);
7717 dumpModuleIDMap("Global identifier map", GlobalIdentifierMap);
7718 dumpModuleIDMap("Global macro map", GlobalMacroMap);
7719 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap);
7720 dumpModuleIDMap("Global selector map", GlobalSelectorMap);
David L. Jonesc4808b9e2016-12-15 20:53:26 +00007721 dumpModuleIDMap("Global preprocessed entity map",
Guy Benyei11169dd2012-12-18 14:30:41 +00007722 GlobalPreprocessedEntityMap);
David L. Jonesc4808b9e2016-12-15 20:53:26 +00007723
Guy Benyei11169dd2012-12-18 14:30:41 +00007724 llvm::errs() << "\n*** PCH/Modules Loaded:";
Vedant Kumar48b4f762018-04-14 01:40:48 +00007725 for (ModuleFile &M : ModuleMgr)
Duncan P. N. Exon Smith96a06e02017-01-28 22:15:22 +00007726 M.dump();
Guy Benyei11169dd2012-12-18 14:30:41 +00007727}
7728
7729/// Return the amount of memory used by memory buffers, breaking down
7730/// by heap-backed versus mmap'ed memory.
7731void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const {
Vedant Kumar48b4f762018-04-14 01:40:48 +00007732 for (ModuleFile &I : ModuleMgr) {
Duncan P. N. Exon Smith030d7d62017-03-20 17:58:26 +00007733 if (llvm::MemoryBuffer *buf = I.Buffer) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007734 size_t bytes = buf->getBufferSize();
7735 switch (buf->getBufferKind()) {
7736 case llvm::MemoryBuffer::MemoryBuffer_Malloc:
7737 sizes.malloc_bytes += bytes;
7738 break;
7739 case llvm::MemoryBuffer::MemoryBuffer_MMap:
7740 sizes.mmap_bytes += bytes;
7741 break;
7742 }
7743 }
7744 }
7745}
7746
7747void ASTReader::InitializeSema(Sema &S) {
7748 SemaObj = &S;
7749 S.addExternalSource(this);
7750
7751 // Makes sure any declarations that were deserialized "too early"
7752 // still get added to the identifier's declaration chains.
Vedant Kumar48b4f762018-04-14 01:40:48 +00007753 for (uint64_t ID : PreloadedDeclIDs) {
7754 NamedDecl *D = cast<NamedDecl>(GetDecl(ID));
Ben Langmuir5418f402014-09-10 21:29:41 +00007755 pushExternalDeclIntoScope(D, D->getDeclName());
Guy Benyei11169dd2012-12-18 14:30:41 +00007756 }
Ben Langmuir5418f402014-09-10 21:29:41 +00007757 PreloadedDeclIDs.clear();
Guy Benyei11169dd2012-12-18 14:30:41 +00007758
Richard Smith3d8e97e2013-10-18 06:54:39 +00007759 // FIXME: What happens if these are changed by a module import?
Guy Benyei11169dd2012-12-18 14:30:41 +00007760 if (!FPPragmaOptions.empty()) {
7761 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS");
Adam Nemet484aa452017-03-27 19:17:25 +00007762 SemaObj->FPFeatures = FPOptions(FPPragmaOptions[0]);
Guy Benyei11169dd2012-12-18 14:30:41 +00007763 }
7764
Yaxun Liu5b746652016-12-18 05:18:55 +00007765 SemaObj->OpenCLFeatures.copy(OpenCLExtensions);
7766 SemaObj->OpenCLTypeExtMap = OpenCLTypeExtMap;
7767 SemaObj->OpenCLDeclExtMap = OpenCLDeclExtMap;
Richard Smith3d8e97e2013-10-18 06:54:39 +00007768
7769 UpdateSema();
7770}
7771
7772void ASTReader::UpdateSema() {
7773 assert(SemaObj && "no Sema to update");
7774
7775 // Load the offsets of the declarations that Sema references.
7776 // They will be lazily deserialized when needed.
7777 if (!SemaDeclRefs.empty()) {
Richard Smith96269c52016-09-29 22:49:46 +00007778 assert(SemaDeclRefs.size() % 3 == 0);
7779 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 3) {
Richard Smith3d8e97e2013-10-18 06:54:39 +00007780 if (!SemaObj->StdNamespace)
7781 SemaObj->StdNamespace = SemaDeclRefs[I];
7782 if (!SemaObj->StdBadAlloc)
7783 SemaObj->StdBadAlloc = SemaDeclRefs[I+1];
Richard Smith96269c52016-09-29 22:49:46 +00007784 if (!SemaObj->StdAlignValT)
7785 SemaObj->StdAlignValT = SemaDeclRefs[I+2];
Richard Smith3d8e97e2013-10-18 06:54:39 +00007786 }
7787 SemaDeclRefs.clear();
7788 }
Dario Domizioli13a0a382014-05-23 12:13:25 +00007789
Nico Weber779355f2016-03-02 23:22:00 +00007790 // Update the state of pragmas. Use the same API as if we had encountered the
7791 // pragma in the source.
Dario Domizioli13a0a382014-05-23 12:13:25 +00007792 if(OptimizeOffPragmaLocation.isValid())
Rui Ueyama49a3ad22019-07-16 04:46:31 +00007793 SemaObj->ActOnPragmaOptimize(/* On = */ false, OptimizeOffPragmaLocation);
Nico Weber779355f2016-03-02 23:22:00 +00007794 if (PragmaMSStructState != -1)
7795 SemaObj->ActOnPragmaMSStruct((PragmaMSStructKind)PragmaMSStructState);
Nico Weber42932312016-03-03 00:17:35 +00007796 if (PointersToMembersPragmaLocation.isValid()) {
7797 SemaObj->ActOnPragmaMSPointersToMembers(
7798 (LangOptions::PragmaMSPointersToMembersKind)
7799 PragmaMSPointersToMembersState,
7800 PointersToMembersPragmaLocation);
7801 }
Justin Lebar67a78a62016-10-08 22:15:58 +00007802 SemaObj->ForceCUDAHostDeviceDepth = ForceCUDAHostDeviceDepth;
Alex Lorenz7d7e1e02017-03-31 15:36:21 +00007803
7804 if (PragmaPackCurrentValue) {
7805 // The bottom of the stack might have a default value. It must be adjusted
7806 // to the current value to ensure that the packing state is preserved after
7807 // popping entries that were included/imported from a PCH/module.
7808 bool DropFirst = false;
7809 if (!PragmaPackStack.empty() &&
7810 PragmaPackStack.front().Location.isInvalid()) {
7811 assert(PragmaPackStack.front().Value == SemaObj->PackStack.DefaultValue &&
7812 "Expected a default alignment value");
7813 SemaObj->PackStack.Stack.emplace_back(
7814 PragmaPackStack.front().SlotLabel, SemaObj->PackStack.CurrentValue,
Alex Lorenz45b40142017-07-28 14:41:21 +00007815 SemaObj->PackStack.CurrentPragmaLocation,
7816 PragmaPackStack.front().PushLocation);
Alex Lorenz7d7e1e02017-03-31 15:36:21 +00007817 DropFirst = true;
7818 }
7819 for (const auto &Entry :
7820 llvm::makeArrayRef(PragmaPackStack).drop_front(DropFirst ? 1 : 0))
7821 SemaObj->PackStack.Stack.emplace_back(Entry.SlotLabel, Entry.Value,
Alex Lorenz45b40142017-07-28 14:41:21 +00007822 Entry.Location, Entry.PushLocation);
Alex Lorenz7d7e1e02017-03-31 15:36:21 +00007823 if (PragmaPackCurrentLocation.isInvalid()) {
7824 assert(*PragmaPackCurrentValue == SemaObj->PackStack.DefaultValue &&
7825 "Expected a default alignment value");
7826 // Keep the current values.
7827 } else {
7828 SemaObj->PackStack.CurrentValue = *PragmaPackCurrentValue;
7829 SemaObj->PackStack.CurrentPragmaLocation = PragmaPackCurrentLocation;
7830 }
7831 }
Guy Benyei11169dd2012-12-18 14:30:41 +00007832}
7833
Richard Smitha8d5b6a2015-07-17 19:51:03 +00007834IdentifierInfo *ASTReader::get(StringRef Name) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007835 // Note that we are loading an identifier.
7836 Deserializing AnIdentifier(this);
Douglas Gregore060e572013-01-25 01:03:03 +00007837
Douglas Gregor7211ac12013-01-25 23:32:03 +00007838 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0,
Douglas Gregor00a50f72013-01-25 00:38:33 +00007839 NumIdentifierLookups,
7840 NumIdentifierLookupHits);
Richard Smith33e0f7e2015-07-22 02:08:40 +00007841
7842 // We don't need to do identifier table lookups in C++ modules (we preload
7843 // all interesting declarations, and don't need to use the scope for name
7844 // lookups). Perform the lookup in PCH files, though, since we don't build
7845 // a complete initial identifier table if we're carrying on from a PCH.
Richard Smithdbafb6c2017-06-29 23:23:46 +00007846 if (PP.getLangOpts().CPlusPlus) {
Richard Smith33e0f7e2015-07-22 02:08:40 +00007847 for (auto F : ModuleMgr.pch_modules())
Benjamin Kramer9a9efba2015-07-25 12:14:04 +00007848 if (Visitor(*F))
Richard Smith33e0f7e2015-07-22 02:08:40 +00007849 break;
7850 } else {
7851 // If there is a global index, look there first to determine which modules
7852 // provably do not have any results for this identifier.
7853 GlobalModuleIndex::HitSet Hits;
7854 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
7855 if (!loadGlobalIndex()) {
7856 if (GlobalIndex->lookupIdentifier(Name, Hits)) {
7857 HitsPtr = &Hits;
7858 }
7859 }
7860
Benjamin Kramer9a9efba2015-07-25 12:14:04 +00007861 ModuleMgr.visit(Visitor, HitsPtr);
Richard Smith33e0f7e2015-07-22 02:08:40 +00007862 }
7863
Guy Benyei11169dd2012-12-18 14:30:41 +00007864 IdentifierInfo *II = Visitor.getIdentifierInfo();
7865 markIdentifierUpToDate(II);
7866 return II;
7867}
7868
7869namespace clang {
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00007870
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00007871 /// An identifier-lookup iterator that enumerates all of the
Guy Benyei11169dd2012-12-18 14:30:41 +00007872 /// identifiers stored within a set of AST files.
7873 class ASTIdentifierIterator : public IdentifierIterator {
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00007874 /// The AST reader whose identifiers are being enumerated.
Guy Benyei11169dd2012-12-18 14:30:41 +00007875 const ASTReader &Reader;
7876
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00007877 /// The current index into the chain of AST files stored in
Guy Benyei11169dd2012-12-18 14:30:41 +00007878 /// the AST reader.
7879 unsigned Index;
7880
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00007881 /// The current position within the identifier lookup table
Guy Benyei11169dd2012-12-18 14:30:41 +00007882 /// of the current AST file.
7883 ASTIdentifierLookupTable::key_iterator Current;
7884
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00007885 /// The end position within the identifier lookup table of
Guy Benyei11169dd2012-12-18 14:30:41 +00007886 /// the current AST file.
7887 ASTIdentifierLookupTable::key_iterator End;
7888
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00007889 /// Whether to skip any modules in the ASTReader.
Ben Langmuir537c5b52016-05-04 00:53:13 +00007890 bool SkipModules;
7891
Guy Benyei11169dd2012-12-18 14:30:41 +00007892 public:
Ben Langmuir537c5b52016-05-04 00:53:13 +00007893 explicit ASTIdentifierIterator(const ASTReader &Reader,
7894 bool SkipModules = false);
Guy Benyei11169dd2012-12-18 14:30:41 +00007895
Craig Topper3e89dfe2014-03-13 02:13:41 +00007896 StringRef Next() override;
Guy Benyei11169dd2012-12-18 14:30:41 +00007897 };
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00007898
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00007899} // namespace clang
Guy Benyei11169dd2012-12-18 14:30:41 +00007900
Ben Langmuir537c5b52016-05-04 00:53:13 +00007901ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader,
7902 bool SkipModules)
7903 : Reader(Reader), Index(Reader.ModuleMgr.size()), SkipModules(SkipModules) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007904}
7905
7906StringRef ASTIdentifierIterator::Next() {
7907 while (Current == End) {
7908 // If we have exhausted all of our AST files, we're done.
7909 if (Index == 0)
Vedant Kumar48b4f762018-04-14 01:40:48 +00007910 return StringRef();
Guy Benyei11169dd2012-12-18 14:30:41 +00007911
7912 --Index;
Ben Langmuir537c5b52016-05-04 00:53:13 +00007913 ModuleFile &F = Reader.ModuleMgr[Index];
7914 if (SkipModules && F.isModule())
7915 continue;
7916
Vedant Kumar48b4f762018-04-14 01:40:48 +00007917 ASTIdentifierLookupTable *IdTable =
7918 (ASTIdentifierLookupTable *)F.IdentifierLookupTable;
Guy Benyei11169dd2012-12-18 14:30:41 +00007919 Current = IdTable->key_begin();
7920 End = IdTable->key_end();
7921 }
7922
7923 // We have any identifiers remaining in the current AST file; return
7924 // the next one.
Douglas Gregorbfd73d72013-01-23 18:53:14 +00007925 StringRef Result = *Current;
Guy Benyei11169dd2012-12-18 14:30:41 +00007926 ++Current;
Douglas Gregorbfd73d72013-01-23 18:53:14 +00007927 return Result;
Guy Benyei11169dd2012-12-18 14:30:41 +00007928}
7929
Ben Langmuir537c5b52016-05-04 00:53:13 +00007930namespace {
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00007931
Ben Langmuir537c5b52016-05-04 00:53:13 +00007932/// A utility for appending two IdentifierIterators.
7933class ChainedIdentifierIterator : public IdentifierIterator {
7934 std::unique_ptr<IdentifierIterator> Current;
7935 std::unique_ptr<IdentifierIterator> Queued;
7936
7937public:
7938 ChainedIdentifierIterator(std::unique_ptr<IdentifierIterator> First,
7939 std::unique_ptr<IdentifierIterator> Second)
7940 : Current(std::move(First)), Queued(std::move(Second)) {}
7941
7942 StringRef Next() override {
7943 if (!Current)
Vedant Kumar48b4f762018-04-14 01:40:48 +00007944 return StringRef();
Ben Langmuir537c5b52016-05-04 00:53:13 +00007945
7946 StringRef result = Current->Next();
7947 if (!result.empty())
7948 return result;
7949
7950 // Try the queued iterator, which may itself be empty.
7951 Current.reset();
7952 std::swap(Current, Queued);
7953 return Next();
7954 }
7955};
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00007956
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00007957} // namespace
Ben Langmuir537c5b52016-05-04 00:53:13 +00007958
Argyrios Kyrtzidis9aca3c62013-04-17 22:10:55 +00007959IdentifierIterator *ASTReader::getIdentifiers() {
Ben Langmuir537c5b52016-05-04 00:53:13 +00007960 if (!loadGlobalIndex()) {
7961 std::unique_ptr<IdentifierIterator> ReaderIter(
7962 new ASTIdentifierIterator(*this, /*SkipModules=*/true));
7963 std::unique_ptr<IdentifierIterator> ModulesIter(
7964 GlobalIndex->createIdentifierIterator());
7965 return new ChainedIdentifierIterator(std::move(ReaderIter),
7966 std::move(ModulesIter));
7967 }
Argyrios Kyrtzidis9aca3c62013-04-17 22:10:55 +00007968
Guy Benyei11169dd2012-12-18 14:30:41 +00007969 return new ASTIdentifierIterator(*this);
7970}
7971
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00007972namespace clang {
7973namespace serialization {
7974
Guy Benyei11169dd2012-12-18 14:30:41 +00007975 class ReadMethodPoolVisitor {
7976 ASTReader &Reader;
7977 Selector Sel;
7978 unsigned PriorGeneration;
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00007979 unsigned InstanceBits = 0;
7980 unsigned FactoryBits = 0;
7981 bool InstanceHasMoreThanOneDecl = false;
7982 bool FactoryHasMoreThanOneDecl = false;
Dmitri Gribenkof8579502013-01-12 19:30:44 +00007983 SmallVector<ObjCMethodDecl *, 4> InstanceMethods;
7984 SmallVector<ObjCMethodDecl *, 4> FactoryMethods;
Guy Benyei11169dd2012-12-18 14:30:41 +00007985
7986 public:
Nico Weber2e0c8f72014-12-27 03:58:08 +00007987 ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel,
Guy Benyei11169dd2012-12-18 14:30:41 +00007988 unsigned PriorGeneration)
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00007989 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) {}
Nico Weber2e0c8f72014-12-27 03:58:08 +00007990
Benjamin Kramer9a9efba2015-07-25 12:14:04 +00007991 bool operator()(ModuleFile &M) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007992 if (!M.SelectorLookupTable)
7993 return false;
David L. Jonesc4808b9e2016-12-15 20:53:26 +00007994
Guy Benyei11169dd2012-12-18 14:30:41 +00007995 // If we've already searched this module file, skip it now.
Richard Smithbdf2d932015-07-30 03:37:16 +00007996 if (M.Generation <= PriorGeneration)
Guy Benyei11169dd2012-12-18 14:30:41 +00007997 return true;
7998
Richard Smithbdf2d932015-07-30 03:37:16 +00007999 ++Reader.NumMethodPoolTableLookups;
Vedant Kumar48b4f762018-04-14 01:40:48 +00008000 ASTSelectorLookupTable *PoolTable
8001 = (ASTSelectorLookupTable*)M.SelectorLookupTable;
Richard Smithbdf2d932015-07-30 03:37:16 +00008002 ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel);
Guy Benyei11169dd2012-12-18 14:30:41 +00008003 if (Pos == PoolTable->end())
8004 return false;
Douglas Gregorad2f7a52013-01-28 17:54:36 +00008005
Richard Smithbdf2d932015-07-30 03:37:16 +00008006 ++Reader.NumMethodPoolTableHits;
8007 ++Reader.NumSelectorsRead;
Guy Benyei11169dd2012-12-18 14:30:41 +00008008 // FIXME: Not quite happy with the statistics here. We probably should
8009 // disable this tracking when called via LoadSelector.
8010 // Also, should entries without methods count as misses?
Richard Smithbdf2d932015-07-30 03:37:16 +00008011 ++Reader.NumMethodPoolEntriesRead;
Guy Benyei11169dd2012-12-18 14:30:41 +00008012 ASTSelectorLookupTrait::data_type Data = *Pos;
Richard Smithbdf2d932015-07-30 03:37:16 +00008013 if (Reader.DeserializationListener)
8014 Reader.DeserializationListener->SelectorRead(Data.ID, Sel);
Benjamin Kramer9a9efba2015-07-25 12:14:04 +00008015
Richard Smithbdf2d932015-07-30 03:37:16 +00008016 InstanceMethods.append(Data.Instance.begin(), Data.Instance.end());
8017 FactoryMethods.append(Data.Factory.begin(), Data.Factory.end());
8018 InstanceBits = Data.InstanceBits;
8019 FactoryBits = Data.FactoryBits;
8020 InstanceHasMoreThanOneDecl = Data.InstanceHasMoreThanOneDecl;
8021 FactoryHasMoreThanOneDecl = Data.FactoryHasMoreThanOneDecl;
Guy Benyei11169dd2012-12-18 14:30:41 +00008022 return true;
8023 }
David L. Jonesc4808b9e2016-12-15 20:53:26 +00008024
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00008025 /// Retrieve the instance methods found by this visitor.
David L. Jonesc4808b9e2016-12-15 20:53:26 +00008026 ArrayRef<ObjCMethodDecl *> getInstanceMethods() const {
8027 return InstanceMethods;
Guy Benyei11169dd2012-12-18 14:30:41 +00008028 }
8029
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00008030 /// Retrieve the instance methods found by this visitor.
David L. Jonesc4808b9e2016-12-15 20:53:26 +00008031 ArrayRef<ObjCMethodDecl *> getFactoryMethods() const {
Guy Benyei11169dd2012-12-18 14:30:41 +00008032 return FactoryMethods;
8033 }
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00008034
8035 unsigned getInstanceBits() const { return InstanceBits; }
8036 unsigned getFactoryBits() const { return FactoryBits; }
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00008037
Nico Weberff4b35e2014-12-27 22:14:15 +00008038 bool instanceHasMoreThanOneDecl() const {
8039 return InstanceHasMoreThanOneDecl;
8040 }
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00008041
Nico Weberff4b35e2014-12-27 22:14:15 +00008042 bool factoryHasMoreThanOneDecl() const { return FactoryHasMoreThanOneDecl; }
Guy Benyei11169dd2012-12-18 14:30:41 +00008043 };
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00008044
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00008045} // namespace serialization
8046} // namespace clang
Guy Benyei11169dd2012-12-18 14:30:41 +00008047
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00008048/// Add the given set of methods to the method list.
Guy Benyei11169dd2012-12-18 14:30:41 +00008049static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods,
8050 ObjCMethodList &List) {
Vedant Kumar48b4f762018-04-14 01:40:48 +00008051 for (unsigned I = 0, N = Methods.size(); I != N; ++I) {
8052 S.addMethodToGlobalList(&List, Methods[I]);
8053 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008054}
David L. Jonesc4808b9e2016-12-15 20:53:26 +00008055
Guy Benyei11169dd2012-12-18 14:30:41 +00008056void ASTReader::ReadMethodPool(Selector Sel) {
8057 // Get the selector generation and update it to the current generation.
8058 unsigned &Generation = SelectorGeneration[Sel];
8059 unsigned PriorGeneration = Generation;
Richard Smith053f6c62014-05-16 23:01:30 +00008060 Generation = getGeneration();
Manman Rena0f31a02016-04-29 19:04:05 +00008061 SelectorOutOfDate[Sel] = false;
David L. Jonesc4808b9e2016-12-15 20:53:26 +00008062
Guy Benyei11169dd2012-12-18 14:30:41 +00008063 // Search for methods defined with this selector.
Douglas Gregorad2f7a52013-01-28 17:54:36 +00008064 ++NumMethodPoolLookups;
Guy Benyei11169dd2012-12-18 14:30:41 +00008065 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration);
Benjamin Kramer9a9efba2015-07-25 12:14:04 +00008066 ModuleMgr.visit(Visitor);
8067
Guy Benyei11169dd2012-12-18 14:30:41 +00008068 if (Visitor.getInstanceMethods().empty() &&
Douglas Gregorad2f7a52013-01-28 17:54:36 +00008069 Visitor.getFactoryMethods().empty())
Guy Benyei11169dd2012-12-18 14:30:41 +00008070 return;
Douglas Gregorad2f7a52013-01-28 17:54:36 +00008071
8072 ++NumMethodPoolHits;
8073
Guy Benyei11169dd2012-12-18 14:30:41 +00008074 if (!getSema())
8075 return;
David L. Jonesc4808b9e2016-12-15 20:53:26 +00008076
Guy Benyei11169dd2012-12-18 14:30:41 +00008077 Sema &S = *getSema();
8078 Sema::GlobalMethodPool::iterator Pos
8079 = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first;
Ben Langmuira0c32e92015-01-12 19:27:00 +00008080
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00008081 Pos->second.first.setBits(Visitor.getInstanceBits());
Nico Weberff4b35e2014-12-27 22:14:15 +00008082 Pos->second.first.setHasMoreThanOneDecl(Visitor.instanceHasMoreThanOneDecl());
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00008083 Pos->second.second.setBits(Visitor.getFactoryBits());
Nico Weberff4b35e2014-12-27 22:14:15 +00008084 Pos->second.second.setHasMoreThanOneDecl(Visitor.factoryHasMoreThanOneDecl());
Ben Langmuira0c32e92015-01-12 19:27:00 +00008085
8086 // Add methods to the global pool *after* setting hasMoreThanOneDecl, since
8087 // when building a module we keep every method individually and may need to
8088 // update hasMoreThanOneDecl as we add the methods.
8089 addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first);
8090 addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second);
Guy Benyei11169dd2012-12-18 14:30:41 +00008091}
8092
Manman Rena0f31a02016-04-29 19:04:05 +00008093void ASTReader::updateOutOfDateSelector(Selector Sel) {
8094 if (SelectorOutOfDate[Sel])
8095 ReadMethodPool(Sel);
8096}
8097
Guy Benyei11169dd2012-12-18 14:30:41 +00008098void ASTReader::ReadKnownNamespaces(
8099 SmallVectorImpl<NamespaceDecl *> &Namespaces) {
8100 Namespaces.clear();
David L. Jonesc4808b9e2016-12-15 20:53:26 +00008101
Vedant Kumar48b4f762018-04-14 01:40:48 +00008102 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
8103 if (NamespaceDecl *Namespace
8104 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I])))
Guy Benyei11169dd2012-12-18 14:30:41 +00008105 Namespaces.push_back(Namespace);
Vedant Kumar48b4f762018-04-14 01:40:48 +00008106 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008107}
8108
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00008109void ASTReader::ReadUndefinedButUsed(
Richard Smithd6a04d72016-03-25 21:49:43 +00008110 llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) {
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00008111 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
Vedant Kumar48b4f762018-04-14 01:40:48 +00008112 NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++]));
Nick Lewycky8334af82013-01-26 00:35:08 +00008113 SourceLocation Loc =
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00008114 SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]);
Nick Lewycky8334af82013-01-26 00:35:08 +00008115 Undefined.insert(std::make_pair(D, Loc));
8116 }
8117}
Nick Lewycky8334af82013-01-26 00:35:08 +00008118
Ismail Pazarbasie5768d12015-05-18 19:59:11 +00008119void ASTReader::ReadMismatchingDeleteExpressions(llvm::MapVector<
8120 FieldDecl *, llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> &
8121 Exprs) {
8122 for (unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) {
Vedant Kumar48b4f762018-04-14 01:40:48 +00008123 FieldDecl *FD = cast<FieldDecl>(GetDecl(DelayedDeleteExprs[Idx++]));
Ismail Pazarbasie5768d12015-05-18 19:59:11 +00008124 uint64_t Count = DelayedDeleteExprs[Idx++];
8125 for (uint64_t C = 0; C < Count; ++C) {
8126 SourceLocation DeleteLoc =
8127 SourceLocation::getFromRawEncoding(DelayedDeleteExprs[Idx++]);
8128 const bool IsArrayForm = DelayedDeleteExprs[Idx++];
8129 Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm));
8130 }
8131 }
8132}
8133
Guy Benyei11169dd2012-12-18 14:30:41 +00008134void ASTReader::ReadTentativeDefinitions(
8135 SmallVectorImpl<VarDecl *> &TentativeDefs) {
Vedant Kumar48b4f762018-04-14 01:40:48 +00008136 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
8137 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I]));
Guy Benyei11169dd2012-12-18 14:30:41 +00008138 if (Var)
8139 TentativeDefs.push_back(Var);
8140 }
8141 TentativeDefinitions.clear();
8142}
8143
8144void ASTReader::ReadUnusedFileScopedDecls(
8145 SmallVectorImpl<const DeclaratorDecl *> &Decls) {
Vedant Kumar48b4f762018-04-14 01:40:48 +00008146 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
8147 DeclaratorDecl *D
8148 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I]));
Guy Benyei11169dd2012-12-18 14:30:41 +00008149 if (D)
8150 Decls.push_back(D);
8151 }
8152 UnusedFileScopedDecls.clear();
8153}
8154
8155void ASTReader::ReadDelegatingConstructors(
8156 SmallVectorImpl<CXXConstructorDecl *> &Decls) {
Vedant Kumar48b4f762018-04-14 01:40:48 +00008157 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
8158 CXXConstructorDecl *D
8159 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I]));
Guy Benyei11169dd2012-12-18 14:30:41 +00008160 if (D)
8161 Decls.push_back(D);
8162 }
8163 DelegatingCtorDecls.clear();
8164}
8165
8166void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) {
Vedant Kumar48b4f762018-04-14 01:40:48 +00008167 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
8168 TypedefNameDecl *D
8169 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I]));
Guy Benyei11169dd2012-12-18 14:30:41 +00008170 if (D)
8171 Decls.push_back(D);
8172 }
8173 ExtVectorDecls.clear();
8174}
8175
Nico Weber72889432014-09-06 01:25:55 +00008176void ASTReader::ReadUnusedLocalTypedefNameCandidates(
8177 llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) {
Vedant Kumar48b4f762018-04-14 01:40:48 +00008178 for (unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N;
8179 ++I) {
8180 TypedefNameDecl *D = dyn_cast_or_null<TypedefNameDecl>(
8181 GetDecl(UnusedLocalTypedefNameCandidates[I]));
Nico Weber72889432014-09-06 01:25:55 +00008182 if (D)
8183 Decls.insert(D);
8184 }
8185 UnusedLocalTypedefNameCandidates.clear();
8186}
8187
Yaxun (Sam) Liub670ab72020-02-26 10:57:39 -05008188void ASTReader::ReadDeclsToCheckForDeferredDiags(
8189 llvm::SmallVector<Decl *, 4> &Decls) {
8190 for (unsigned I = 0, N = DeclsToCheckForDeferredDiags.size(); I != N;
8191 ++I) {
8192 auto *D = dyn_cast_or_null<Decl>(
8193 GetDecl(DeclsToCheckForDeferredDiags[I]));
8194 if (D)
8195 Decls.push_back(D);
8196 }
8197 DeclsToCheckForDeferredDiags.clear();
8198}
8199
8200
Guy Benyei11169dd2012-12-18 14:30:41 +00008201void ASTReader::ReadReferencedSelectors(
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00008202 SmallVectorImpl<std::pair<Selector, SourceLocation>> &Sels) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008203 if (ReferencedSelectorsData.empty())
8204 return;
David L. Jonesc4808b9e2016-12-15 20:53:26 +00008205
Guy Benyei11169dd2012-12-18 14:30:41 +00008206 // If there are @selector references added them to its pool. This is for
8207 // implementation of -Wselector.
8208 unsigned int DataSize = ReferencedSelectorsData.size()-1;
8209 unsigned I = 0;
8210 while (I < DataSize) {
8211 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]);
8212 SourceLocation SelLoc
8213 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]);
8214 Sels.push_back(std::make_pair(Sel, SelLoc));
8215 }
8216 ReferencedSelectorsData.clear();
8217}
8218
8219void ASTReader::ReadWeakUndeclaredIdentifiers(
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00008220 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo>> &WeakIDs) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008221 if (WeakUndeclaredIdentifiers.empty())
8222 return;
8223
8224 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) {
David L. Jonesc4808b9e2016-12-15 20:53:26 +00008225 IdentifierInfo *WeakId
Guy Benyei11169dd2012-12-18 14:30:41 +00008226 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
David L. Jonesc4808b9e2016-12-15 20:53:26 +00008227 IdentifierInfo *AliasId
Guy Benyei11169dd2012-12-18 14:30:41 +00008228 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
8229 SourceLocation Loc
8230 = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]);
8231 bool Used = WeakUndeclaredIdentifiers[I++];
8232 WeakInfo WI(AliasId, Loc);
8233 WI.setUsed(Used);
8234 WeakIDs.push_back(std::make_pair(WeakId, WI));
8235 }
8236 WeakUndeclaredIdentifiers.clear();
8237}
8238
8239void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) {
8240 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) {
8241 ExternalVTableUse VT;
8242 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++]));
8243 VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]);
8244 VT.DefinitionRequired = VTableUses[Idx++];
8245 VTables.push_back(VT);
8246 }
David L. Jonesc4808b9e2016-12-15 20:53:26 +00008247
Guy Benyei11169dd2012-12-18 14:30:41 +00008248 VTableUses.clear();
8249}
8250
8251void ASTReader::ReadPendingInstantiations(
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00008252 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation>> &Pending) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008253 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
Vedant Kumar48b4f762018-04-14 01:40:48 +00008254 ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++]));
Guy Benyei11169dd2012-12-18 14:30:41 +00008255 SourceLocation Loc
8256 = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]);
8257
8258 Pending.push_back(std::make_pair(D, Loc));
David L. Jonesc4808b9e2016-12-15 20:53:26 +00008259 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008260 PendingInstantiations.clear();
8261}
8262
Richard Smithe40f2ba2013-08-07 21:41:30 +00008263void ASTReader::ReadLateParsedTemplates(
Justin Lebar28f09c52016-10-10 16:26:08 +00008264 llvm::MapVector<const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>
8265 &LPTMap) {
Richard Smithe40f2ba2013-08-07 21:41:30 +00008266 for (unsigned Idx = 0, N = LateParsedTemplates.size(); Idx < N;
8267 /* In loop */) {
Vedant Kumar48b4f762018-04-14 01:40:48 +00008268 FunctionDecl *FD = cast<FunctionDecl>(GetDecl(LateParsedTemplates[Idx++]));
Richard Smithe40f2ba2013-08-07 21:41:30 +00008269
Jonas Devlieghere2b3d49b2019-08-14 23:04:18 +00008270 auto LT = std::make_unique<LateParsedTemplate>();
Richard Smithe40f2ba2013-08-07 21:41:30 +00008271 LT->D = GetDecl(LateParsedTemplates[Idx++]);
8272
8273 ModuleFile *F = getOwningModuleFile(LT->D);
8274 assert(F && "No module");
8275
8276 unsigned TokN = LateParsedTemplates[Idx++];
8277 LT->Toks.reserve(TokN);
8278 for (unsigned T = 0; T < TokN; ++T)
8279 LT->Toks.push_back(ReadToken(*F, LateParsedTemplates, Idx));
8280
Justin Lebar28f09c52016-10-10 16:26:08 +00008281 LPTMap.insert(std::make_pair(FD, std::move(LT)));
Richard Smithe40f2ba2013-08-07 21:41:30 +00008282 }
8283
8284 LateParsedTemplates.clear();
8285}
8286
Guy Benyei11169dd2012-12-18 14:30:41 +00008287void ASTReader::LoadSelector(Selector Sel) {
8288 // It would be complicated to avoid reading the methods anyway. So don't.
8289 ReadMethodPool(Sel);
8290}
8291
8292void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) {
8293 assert(ID && "Non-zero identifier ID required");
8294 assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range");
8295 IdentifiersLoaded[ID - 1] = II;
8296 if (DeserializationListener)
8297 DeserializationListener->IdentifierRead(ID, II);
8298}
8299
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00008300/// Set the globally-visible declarations associated with the given
Guy Benyei11169dd2012-12-18 14:30:41 +00008301/// identifier.
8302///
8303/// If the AST reader is currently in a state where the given declaration IDs
8304/// cannot safely be resolved, they are queued until it is safe to resolve
8305/// them.
8306///
8307/// \param II an IdentifierInfo that refers to one or more globally-visible
8308/// declarations.
8309///
8310/// \param DeclIDs the set of declaration IDs with the name @p II that are
8311/// visible at global scope.
8312///
Douglas Gregor6168bd22013-02-18 15:53:43 +00008313/// \param Decls if non-null, this vector will be populated with the set of
8314/// deserialized declarations. These declarations will not be pushed into
8315/// scope.
Guy Benyei11169dd2012-12-18 14:30:41 +00008316void
8317ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II,
8318 const SmallVectorImpl<uint32_t> &DeclIDs,
Douglas Gregor6168bd22013-02-18 15:53:43 +00008319 SmallVectorImpl<Decl *> *Decls) {
8320 if (NumCurrentElementsDeserializing && !Decls) {
8321 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
Guy Benyei11169dd2012-12-18 14:30:41 +00008322 return;
8323 }
8324
Vedant Kumar48b4f762018-04-14 01:40:48 +00008325 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
Ben Langmuir5418f402014-09-10 21:29:41 +00008326 if (!SemaObj) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008327 // Queue this declaration so that it will be added to the
8328 // translation unit scope and identifier's declaration chain
8329 // once a Sema object is known.
Vedant Kumar48b4f762018-04-14 01:40:48 +00008330 PreloadedDeclIDs.push_back(DeclIDs[I]);
Ben Langmuir5418f402014-09-10 21:29:41 +00008331 continue;
Guy Benyei11169dd2012-12-18 14:30:41 +00008332 }
Ben Langmuir5418f402014-09-10 21:29:41 +00008333
Vedant Kumar48b4f762018-04-14 01:40:48 +00008334 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I]));
Ben Langmuir5418f402014-09-10 21:29:41 +00008335
8336 // If we're simply supposed to record the declarations, do so now.
8337 if (Decls) {
8338 Decls->push_back(D);
8339 continue;
8340 }
8341
8342 // Introduce this declaration into the translation-unit scope
8343 // and add it to the declaration chain for this identifier, so
8344 // that (unqualified) name lookup will find it.
8345 pushExternalDeclIntoScope(D, II);
Guy Benyei11169dd2012-12-18 14:30:41 +00008346 }
8347}
8348
Douglas Gregorc8a992f2013-01-21 16:52:34 +00008349IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008350 if (ID == 0)
Craig Toppera13603a2014-05-22 05:54:18 +00008351 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00008352
8353 if (IdentifiersLoaded.empty()) {
8354 Error("no identifier table in AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00008355 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00008356 }
8357
8358 ID -= 1;
8359 if (!IdentifiersLoaded[ID]) {
8360 GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1);
8361 assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map");
8362 ModuleFile *M = I->second;
8363 unsigned Index = ID - M->BaseIdentifierID;
8364 const char *Str = M->IdentifierTableData + M->IdentifierOffsets[Index];
8365
8366 // All of the strings in the AST file are preceded by a 16-bit length.
8367 // Extract that 16-bit length to avoid having to execute strlen().
8368 // NOTE: 'StrLenPtr' is an 'unsigned char*' so that we load bytes as
8369 // unsigned integers. This is important to avoid integer overflow when
8370 // we cast them to 'unsigned'.
8371 const unsigned char *StrLenPtr = (const unsigned char*) Str - 2;
8372 unsigned StrLen = (((unsigned) StrLenPtr[0])
8373 | (((unsigned) StrLenPtr[1]) << 8)) - 1;
Richard Smitheb4b58f62016-02-05 01:40:54 +00008374 auto &II = PP.getIdentifierTable().get(StringRef(Str, StrLen));
8375 IdentifiersLoaded[ID] = &II;
8376 markIdentifierFromAST(*this, II);
Guy Benyei11169dd2012-12-18 14:30:41 +00008377 if (DeserializationListener)
Richard Smitheb4b58f62016-02-05 01:40:54 +00008378 DeserializationListener->IdentifierRead(ID + 1, &II);
Guy Benyei11169dd2012-12-18 14:30:41 +00008379 }
8380
8381 return IdentifiersLoaded[ID];
8382}
8383
Douglas Gregorc8a992f2013-01-21 16:52:34 +00008384IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) {
8385 return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID));
Guy Benyei11169dd2012-12-18 14:30:41 +00008386}
8387
8388IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) {
8389 if (LocalID < NUM_PREDEF_IDENT_IDS)
8390 return LocalID;
David L. Jonesc4808b9e2016-12-15 20:53:26 +00008391
Richard Smith37a93df2017-02-18 00:32:02 +00008392 if (!M.ModuleOffsetMap.empty())
8393 ReadModuleOffsetMap(M);
8394
Guy Benyei11169dd2012-12-18 14:30:41 +00008395 ContinuousRangeMap<uint32_t, int, 2>::iterator I
8396 = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS);
David L. Jonesc4808b9e2016-12-15 20:53:26 +00008397 assert(I != M.IdentifierRemap.end()
Guy Benyei11169dd2012-12-18 14:30:41 +00008398 && "Invalid index into identifier index remap");
David L. Jonesc4808b9e2016-12-15 20:53:26 +00008399
Guy Benyei11169dd2012-12-18 14:30:41 +00008400 return LocalID + I->second;
8401}
8402
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008403MacroInfo *ASTReader::getMacro(MacroID ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008404 if (ID == 0)
Craig Toppera13603a2014-05-22 05:54:18 +00008405 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00008406
8407 if (MacrosLoaded.empty()) {
8408 Error("no macro table in AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00008409 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00008410 }
8411
8412 ID -= NUM_PREDEF_MACRO_IDS;
8413 if (!MacrosLoaded[ID]) {
8414 GlobalMacroMapType::iterator I
8415 = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS);
8416 assert(I != GlobalMacroMap.end() && "Corrupted global macro map");
8417 ModuleFile *M = I->second;
8418 unsigned Index = ID - M->BaseMacroID;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008419 MacrosLoaded[ID] = ReadMacroRecord(*M, M->MacroOffsets[Index]);
David L. Jonesc4808b9e2016-12-15 20:53:26 +00008420
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008421 if (DeserializationListener)
8422 DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS,
8423 MacrosLoaded[ID]);
Guy Benyei11169dd2012-12-18 14:30:41 +00008424 }
8425
8426 return MacrosLoaded[ID];
8427}
8428
8429MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) {
8430 if (LocalID < NUM_PREDEF_MACRO_IDS)
8431 return LocalID;
8432
Richard Smith37a93df2017-02-18 00:32:02 +00008433 if (!M.ModuleOffsetMap.empty())
8434 ReadModuleOffsetMap(M);
8435
Guy Benyei11169dd2012-12-18 14:30:41 +00008436 ContinuousRangeMap<uint32_t, int, 2>::iterator I
8437 = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS);
8438 assert(I != M.MacroRemap.end() && "Invalid index into macro index remap");
8439
8440 return LocalID + I->second;
8441}
8442
8443serialization::SubmoduleID
8444ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) {
8445 if (LocalID < NUM_PREDEF_SUBMODULE_IDS)
8446 return LocalID;
David L. Jonesc4808b9e2016-12-15 20:53:26 +00008447
Richard Smith37a93df2017-02-18 00:32:02 +00008448 if (!M.ModuleOffsetMap.empty())
8449 ReadModuleOffsetMap(M);
8450
Guy Benyei11169dd2012-12-18 14:30:41 +00008451 ContinuousRangeMap<uint32_t, int, 2>::iterator I
8452 = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS);
David L. Jonesc4808b9e2016-12-15 20:53:26 +00008453 assert(I != M.SubmoduleRemap.end()
Guy Benyei11169dd2012-12-18 14:30:41 +00008454 && "Invalid index into submodule index remap");
David L. Jonesc4808b9e2016-12-15 20:53:26 +00008455
Guy Benyei11169dd2012-12-18 14:30:41 +00008456 return LocalID + I->second;
8457}
8458
8459Module *ASTReader::getSubmodule(SubmoduleID GlobalID) {
8460 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) {
8461 assert(GlobalID == 0 && "Unhandled global submodule ID");
Craig Toppera13603a2014-05-22 05:54:18 +00008462 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00008463 }
David L. Jonesc4808b9e2016-12-15 20:53:26 +00008464
Guy Benyei11169dd2012-12-18 14:30:41 +00008465 if (GlobalID > SubmodulesLoaded.size()) {
8466 Error("submodule ID out of range in AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00008467 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00008468 }
David L. Jonesc4808b9e2016-12-15 20:53:26 +00008469
Guy Benyei11169dd2012-12-18 14:30:41 +00008470 return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS];
8471}
Douglas Gregorc147b0b2013-01-12 01:29:50 +00008472
8473Module *ASTReader::getModule(unsigned ID) {
8474 return getSubmodule(ID);
8475}
8476
Hans Wennborg08c5a7b2018-06-25 13:23:49 +00008477bool ASTReader::DeclIsFromPCHWithObjectFile(const Decl *D) {
8478 ModuleFile *MF = getOwningModuleFile(D);
8479 return MF && MF->PCHHasObjectFile;
8480}
8481
Richard Smithd88a7f12015-09-01 20:35:42 +00008482ModuleFile *ASTReader::getLocalModuleFile(ModuleFile &F, unsigned ID) {
8483 if (ID & 1) {
8484 // It's a module, look it up by submodule ID.
8485 auto I = GlobalSubmoduleMap.find(getGlobalSubmoduleID(F, ID >> 1));
8486 return I == GlobalSubmoduleMap.end() ? nullptr : I->second;
8487 } else {
8488 // It's a prefix (preamble, PCH, ...). Look it up by index.
8489 unsigned IndexFromEnd = ID >> 1;
8490 assert(IndexFromEnd && "got reference to unknown module file");
8491 return getModuleManager().pch_modules().end()[-IndexFromEnd];
8492 }
8493}
8494
8495unsigned ASTReader::getModuleFileID(ModuleFile *F) {
8496 if (!F)
8497 return 1;
8498
8499 // For a file representing a module, use the submodule ID of the top-level
8500 // module as the file ID. For any other kind of file, the number of such
8501 // files loaded beforehand will be the same on reload.
8502 // FIXME: Is this true even if we have an explicit module file and a PCH?
8503 if (F->isModule())
8504 return ((F->BaseSubmoduleID + NUM_PREDEF_SUBMODULE_IDS) << 1) | 1;
8505
8506 auto PCHModules = getModuleManager().pch_modules();
Fangrui Song75e74e02019-03-31 08:48:19 +00008507 auto I = llvm::find(PCHModules, F);
Richard Smithd88a7f12015-09-01 20:35:42 +00008508 assert(I != PCHModules.end() && "emitting reference to unknown file");
8509 return (I - PCHModules.end()) << 1;
8510}
8511
Reid Klecknerc915cb92020-02-27 18:13:54 -08008512llvm::Optional<ASTSourceDescriptor>
Adrian Prantl15bcf702015-06-30 17:39:43 +00008513ASTReader::getSourceDescriptor(unsigned ID) {
8514 if (const Module *M = getSubmodule(ID))
Reid Klecknerc915cb92020-02-27 18:13:54 -08008515 return ASTSourceDescriptor(*M);
Adrian Prantl15bcf702015-06-30 17:39:43 +00008516
8517 // If there is only a single PCH, return it instead.
Hiroshi Inoue3170de02017-07-01 08:46:43 +00008518 // Chained PCH are not supported.
Saleem Abdulrasool97d25552017-03-02 17:37:11 +00008519 const auto &PCHChain = ModuleMgr.pch_modules();
8520 if (std::distance(std::begin(PCHChain), std::end(PCHChain))) {
Adrian Prantl15bcf702015-06-30 17:39:43 +00008521 ModuleFile &MF = ModuleMgr.getPrimaryModule();
Adrian Prantl3a2d4942016-01-22 23:30:56 +00008522 StringRef ModuleName = llvm::sys::path::filename(MF.OriginalSourceFileName);
Adrian Prantl9bc3c4f2016-04-27 17:06:22 +00008523 StringRef FileName = llvm::sys::path::filename(MF.FileName);
Reid Klecknerc915cb92020-02-27 18:13:54 -08008524 return ASTSourceDescriptor(ModuleName, MF.OriginalDir, FileName,
8525 MF.Signature);
Adrian Prantl15bcf702015-06-30 17:39:43 +00008526 }
8527 return None;
8528}
8529
David Blaikie1ac9c982017-04-11 21:13:37 +00008530ExternalASTSource::ExtKind ASTReader::hasExternalDefinitions(const Decl *FD) {
Richard Smitha4653622017-09-06 20:01:14 +00008531 auto I = DefinitionSource.find(FD);
8532 if (I == DefinitionSource.end())
David Blaikie9ffe5a32017-01-30 05:00:26 +00008533 return EK_ReplyHazy;
David Blaikiee6b7c282017-04-11 20:46:34 +00008534 return I->second ? EK_Never : EK_Always;
David Blaikie9ffe5a32017-01-30 05:00:26 +00008535}
8536
Guy Benyei11169dd2012-12-18 14:30:41 +00008537Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) {
8538 return DecodeSelector(getGlobalSelectorID(M, LocalID));
8539}
8540
8541Selector ASTReader::DecodeSelector(serialization::SelectorID ID) {
8542 if (ID == 0)
Vedant Kumar48b4f762018-04-14 01:40:48 +00008543 return Selector();
Guy Benyei11169dd2012-12-18 14:30:41 +00008544
8545 if (ID > SelectorsLoaded.size()) {
8546 Error("selector ID out of range in AST file");
Vedant Kumar48b4f762018-04-14 01:40:48 +00008547 return Selector();
Guy Benyei11169dd2012-12-18 14:30:41 +00008548 }
8549
Craig Toppera13603a2014-05-22 05:54:18 +00008550 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008551 // Load this selector from the selector table.
8552 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID);
8553 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map");
8554 ModuleFile &M = *I->second;
8555 ASTSelectorLookupTrait Trait(*this, M);
8556 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS;
8557 SelectorsLoaded[ID - 1] =
8558 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0);
8559 if (DeserializationListener)
8560 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
8561 }
8562
8563 return SelectorsLoaded[ID - 1];
8564}
8565
8566Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) {
8567 return DecodeSelector(ID);
8568}
8569
8570uint32_t ASTReader::GetNumExternalSelectors() {
8571 // ID 0 (the null selector) is considered an external selector.
8572 return getTotalNumSelectors() + 1;
8573}
8574
8575serialization::SelectorID
8576ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const {
8577 if (LocalID < NUM_PREDEF_SELECTOR_IDS)
8578 return LocalID;
David L. Jonesc4808b9e2016-12-15 20:53:26 +00008579
Richard Smith37a93df2017-02-18 00:32:02 +00008580 if (!M.ModuleOffsetMap.empty())
8581 ReadModuleOffsetMap(M);
8582
Guy Benyei11169dd2012-12-18 14:30:41 +00008583 ContinuousRangeMap<uint32_t, int, 2>::iterator I
8584 = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS);
David L. Jonesc4808b9e2016-12-15 20:53:26 +00008585 assert(I != M.SelectorRemap.end()
Guy Benyei11169dd2012-12-18 14:30:41 +00008586 && "Invalid index into selector index remap");
David L. Jonesc4808b9e2016-12-15 20:53:26 +00008587
Guy Benyei11169dd2012-12-18 14:30:41 +00008588 return LocalID + I->second;
8589}
8590
John McCall3ce3d232019-12-13 03:37:23 -05008591DeclarationNameLoc
8592ASTRecordReader::readDeclarationNameLoc(DeclarationName Name) {
8593 DeclarationNameLoc DNLoc;
Guy Benyei11169dd2012-12-18 14:30:41 +00008594 switch (Name.getNameKind()) {
8595 case DeclarationName::CXXConstructorName:
8596 case DeclarationName::CXXDestructorName:
8597 case DeclarationName::CXXConversionFunctionName:
John McCall3ce3d232019-12-13 03:37:23 -05008598 DNLoc.NamedType.TInfo = readTypeSourceInfo();
Guy Benyei11169dd2012-12-18 14:30:41 +00008599 break;
8600
8601 case DeclarationName::CXXOperatorName:
8602 DNLoc.CXXOperatorName.BeginOpNameLoc
John McCall3ce3d232019-12-13 03:37:23 -05008603 = readSourceLocation().getRawEncoding();
Guy Benyei11169dd2012-12-18 14:30:41 +00008604 DNLoc.CXXOperatorName.EndOpNameLoc
John McCall3ce3d232019-12-13 03:37:23 -05008605 = readSourceLocation().getRawEncoding();
Guy Benyei11169dd2012-12-18 14:30:41 +00008606 break;
8607
8608 case DeclarationName::CXXLiteralOperatorName:
8609 DNLoc.CXXLiteralOperatorName.OpNameLoc
John McCall3ce3d232019-12-13 03:37:23 -05008610 = readSourceLocation().getRawEncoding();
Guy Benyei11169dd2012-12-18 14:30:41 +00008611 break;
8612
8613 case DeclarationName::Identifier:
8614 case DeclarationName::ObjCZeroArgSelector:
8615 case DeclarationName::ObjCOneArgSelector:
8616 case DeclarationName::ObjCMultiArgSelector:
8617 case DeclarationName::CXXUsingDirective:
Richard Smith35845152017-02-07 01:37:30 +00008618 case DeclarationName::CXXDeductionGuideName:
Guy Benyei11169dd2012-12-18 14:30:41 +00008619 break;
8620 }
John McCall3ce3d232019-12-13 03:37:23 -05008621 return DNLoc;
Guy Benyei11169dd2012-12-18 14:30:41 +00008622}
8623
John McCall3ce3d232019-12-13 03:37:23 -05008624DeclarationNameInfo ASTRecordReader::readDeclarationNameInfo() {
8625 DeclarationNameInfo NameInfo;
8626 NameInfo.setName(readDeclarationName());
8627 NameInfo.setLoc(readSourceLocation());
8628 NameInfo.setInfo(readDeclarationNameLoc(NameInfo.getName()));
8629 return NameInfo;
Guy Benyei11169dd2012-12-18 14:30:41 +00008630}
8631
John McCall3ce3d232019-12-13 03:37:23 -05008632void ASTRecordReader::readQualifierInfo(QualifierInfo &Info) {
8633 Info.QualifierLoc = readNestedNameSpecifierLoc();
8634 unsigned NumTPLists = readInt();
Guy Benyei11169dd2012-12-18 14:30:41 +00008635 Info.NumTemplParamLists = NumTPLists;
8636 if (NumTPLists) {
Richard Smithdbafb6c2017-06-29 23:23:46 +00008637 Info.TemplParamLists =
8638 new (getContext()) TemplateParameterList *[NumTPLists];
Eugene Zelenkoe95e7d52016-09-07 21:53:17 +00008639 for (unsigned i = 0; i != NumTPLists; ++i)
John McCall3ce3d232019-12-13 03:37:23 -05008640 Info.TemplParamLists[i] = readTemplateParameterList();
Guy Benyei11169dd2012-12-18 14:30:41 +00008641 }
8642}
8643
Guy Benyei11169dd2012-12-18 14:30:41 +00008644TemplateParameterList *
John McCall3ce3d232019-12-13 03:37:23 -05008645ASTRecordReader::readTemplateParameterList() {
8646 SourceLocation TemplateLoc = readSourceLocation();
8647 SourceLocation LAngleLoc = readSourceLocation();
8648 SourceLocation RAngleLoc = readSourceLocation();
Guy Benyei11169dd2012-12-18 14:30:41 +00008649
John McCall3ce3d232019-12-13 03:37:23 -05008650 unsigned NumParams = readInt();
Guy Benyei11169dd2012-12-18 14:30:41 +00008651 SmallVector<NamedDecl *, 16> Params;
8652 Params.reserve(NumParams);
8653 while (NumParams--)
John McCall3ce3d232019-12-13 03:37:23 -05008654 Params.push_back(readDeclAs<NamedDecl>());
Guy Benyei11169dd2012-12-18 14:30:41 +00008655
John McCall3ce3d232019-12-13 03:37:23 -05008656 bool HasRequiresClause = readBool();
8657 Expr *RequiresClause = HasRequiresClause ? readExpr() : nullptr;
Saar Raz0330fba2019-10-15 18:44:06 +00008658
Richard Smithdbafb6c2017-06-29 23:23:46 +00008659 TemplateParameterList *TemplateParams = TemplateParameterList::Create(
Saar Raz0330fba2019-10-15 18:44:06 +00008660 getContext(), TemplateLoc, LAngleLoc, Params, RAngleLoc, RequiresClause);
Guy Benyei11169dd2012-12-18 14:30:41 +00008661 return TemplateParams;
8662}
8663
John McCall3ce3d232019-12-13 03:37:23 -05008664void ASTRecordReader::readTemplateArgumentList(
8665 SmallVectorImpl<TemplateArgument> &TemplArgs,
8666 bool Canonicalize) {
8667 unsigned NumTemplateArgs = readInt();
Guy Benyei11169dd2012-12-18 14:30:41 +00008668 TemplArgs.reserve(NumTemplateArgs);
8669 while (NumTemplateArgs--)
John McCall3ce3d232019-12-13 03:37:23 -05008670 TemplArgs.push_back(readTemplateArgument(Canonicalize));
Guy Benyei11169dd2012-12-18 14:30:41 +00008671}
8672
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00008673/// Read a UnresolvedSet structure.
John McCall3ce3d232019-12-13 03:37:23 -05008674void ASTRecordReader::readUnresolvedSet(LazyASTUnresolvedSet &Set) {
8675 unsigned NumDecls = readInt();
Richard Smithdbafb6c2017-06-29 23:23:46 +00008676 Set.reserve(getContext(), NumDecls);
Guy Benyei11169dd2012-12-18 14:30:41 +00008677 while (NumDecls--) {
John McCall3ce3d232019-12-13 03:37:23 -05008678 DeclID ID = readDeclID();
8679 AccessSpecifier AS = (AccessSpecifier) readInt();
Richard Smithdbafb6c2017-06-29 23:23:46 +00008680 Set.addLazyDecl(getContext(), ID, AS);
Guy Benyei11169dd2012-12-18 14:30:41 +00008681 }
8682}
8683
8684CXXBaseSpecifier
John McCall3ce3d232019-12-13 03:37:23 -05008685ASTRecordReader::readCXXBaseSpecifier() {
8686 bool isVirtual = readBool();
8687 bool isBaseOfClass = readBool();
8688 AccessSpecifier AS = static_cast<AccessSpecifier>(readInt());
8689 bool inheritConstructors = readBool();
8690 TypeSourceInfo *TInfo = readTypeSourceInfo();
8691 SourceRange Range = readSourceRange();
8692 SourceLocation EllipsisLoc = readSourceLocation();
David L. Jonesc4808b9e2016-12-15 20:53:26 +00008693 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo,
Guy Benyei11169dd2012-12-18 14:30:41 +00008694 EllipsisLoc);
8695 Result.setInheritConstructors(inheritConstructors);
8696 return Result;
8697}
8698
Richard Smithc2bb8182015-03-24 06:36:48 +00008699CXXCtorInitializer **
John McCall3ce3d232019-12-13 03:37:23 -05008700ASTRecordReader::readCXXCtorInitializers() {
Richard Smithdbafb6c2017-06-29 23:23:46 +00008701 ASTContext &Context = getContext();
John McCall3ce3d232019-12-13 03:37:23 -05008702 unsigned NumInitializers = readInt();
Richard Smithc2bb8182015-03-24 06:36:48 +00008703 assert(NumInitializers && "wrote ctor initializers but have no inits");
Vedant Kumar48b4f762018-04-14 01:40:48 +00008704 auto **CtorInitializers = new (Context) CXXCtorInitializer*[NumInitializers];
Richard Smithc2bb8182015-03-24 06:36:48 +00008705 for (unsigned i = 0; i != NumInitializers; ++i) {
8706 TypeSourceInfo *TInfo = nullptr;
8707 bool IsBaseVirtual = false;
8708 FieldDecl *Member = nullptr;
8709 IndirectFieldDecl *IndirectMember = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00008710
John McCall3ce3d232019-12-13 03:37:23 -05008711 CtorInitializerType Type = (CtorInitializerType) readInt();
Richard Smithc2bb8182015-03-24 06:36:48 +00008712 switch (Type) {
8713 case CTOR_INITIALIZER_BASE:
John McCall3ce3d232019-12-13 03:37:23 -05008714 TInfo = readTypeSourceInfo();
8715 IsBaseVirtual = readBool();
Richard Smithc2bb8182015-03-24 06:36:48 +00008716 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00008717
Richard Smithc2bb8182015-03-24 06:36:48 +00008718 case CTOR_INITIALIZER_DELEGATING:
John McCall3ce3d232019-12-13 03:37:23 -05008719 TInfo = readTypeSourceInfo();
Richard Smithc2bb8182015-03-24 06:36:48 +00008720 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00008721
Richard Smithc2bb8182015-03-24 06:36:48 +00008722 case CTOR_INITIALIZER_MEMBER:
John McCall3ce3d232019-12-13 03:37:23 -05008723 Member = readDeclAs<FieldDecl>();
Richard Smithc2bb8182015-03-24 06:36:48 +00008724 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00008725
Richard Smithc2bb8182015-03-24 06:36:48 +00008726 case CTOR_INITIALIZER_INDIRECT_MEMBER:
John McCall3ce3d232019-12-13 03:37:23 -05008727 IndirectMember = readDeclAs<IndirectFieldDecl>();
Richard Smithc2bb8182015-03-24 06:36:48 +00008728 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00008729 }
Richard Smithc2bb8182015-03-24 06:36:48 +00008730
John McCall3ce3d232019-12-13 03:37:23 -05008731 SourceLocation MemberOrEllipsisLoc = readSourceLocation();
8732 Expr *Init = readExpr();
8733 SourceLocation LParenLoc = readSourceLocation();
8734 SourceLocation RParenLoc = readSourceLocation();
Richard Smithc2bb8182015-03-24 06:36:48 +00008735
8736 CXXCtorInitializer *BOMInit;
Richard Smith30e304e2016-12-14 00:03:17 +00008737 if (Type == CTOR_INITIALIZER_BASE)
Richard Smithc2bb8182015-03-24 06:36:48 +00008738 BOMInit = new (Context)
8739 CXXCtorInitializer(Context, TInfo, IsBaseVirtual, LParenLoc, Init,
8740 RParenLoc, MemberOrEllipsisLoc);
Richard Smith30e304e2016-12-14 00:03:17 +00008741 else if (Type == CTOR_INITIALIZER_DELEGATING)
Richard Smithc2bb8182015-03-24 06:36:48 +00008742 BOMInit = new (Context)
8743 CXXCtorInitializer(Context, TInfo, LParenLoc, Init, RParenLoc);
Richard Smith30e304e2016-12-14 00:03:17 +00008744 else if (Member)
8745 BOMInit = new (Context)
8746 CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc, LParenLoc,
8747 Init, RParenLoc);
8748 else
8749 BOMInit = new (Context)
8750 CXXCtorInitializer(Context, IndirectMember, MemberOrEllipsisLoc,
8751 LParenLoc, Init, RParenLoc);
8752
John McCall3ce3d232019-12-13 03:37:23 -05008753 if (/*IsWritten*/readBool()) {
8754 unsigned SourceOrder = readInt();
Richard Smith30e304e2016-12-14 00:03:17 +00008755 BOMInit->setSourceOrder(SourceOrder);
Richard Smithc2bb8182015-03-24 06:36:48 +00008756 }
8757
Richard Smithc2bb8182015-03-24 06:36:48 +00008758 CtorInitializers[i] = BOMInit;
Guy Benyei11169dd2012-12-18 14:30:41 +00008759 }
8760
Richard Smithc2bb8182015-03-24 06:36:48 +00008761 return CtorInitializers;
Guy Benyei11169dd2012-12-18 14:30:41 +00008762}
8763
Guy Benyei11169dd2012-12-18 14:30:41 +00008764NestedNameSpecifierLoc
John McCall3ce3d232019-12-13 03:37:23 -05008765ASTRecordReader::readNestedNameSpecifierLoc() {
Richard Smithdbafb6c2017-06-29 23:23:46 +00008766 ASTContext &Context = getContext();
John McCall3ce3d232019-12-13 03:37:23 -05008767 unsigned N = readInt();
Guy Benyei11169dd2012-12-18 14:30:41 +00008768 NestedNameSpecifierLocBuilder Builder;
8769 for (unsigned I = 0; I != N; ++I) {
John McCalld505e572019-12-13 21:54:44 -05008770 auto Kind = readNestedNameSpecifierKind();
Guy Benyei11169dd2012-12-18 14:30:41 +00008771 switch (Kind) {
8772 case NestedNameSpecifier::Identifier: {
John McCall3ce3d232019-12-13 03:37:23 -05008773 IdentifierInfo *II = readIdentifier();
8774 SourceRange Range = readSourceRange();
Guy Benyei11169dd2012-12-18 14:30:41 +00008775 Builder.Extend(Context, II, Range.getBegin(), Range.getEnd());
8776 break;
8777 }
8778
8779 case NestedNameSpecifier::Namespace: {
John McCall3ce3d232019-12-13 03:37:23 -05008780 NamespaceDecl *NS = readDeclAs<NamespaceDecl>();
8781 SourceRange Range = readSourceRange();
Guy Benyei11169dd2012-12-18 14:30:41 +00008782 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
8783 break;
8784 }
8785
8786 case NestedNameSpecifier::NamespaceAlias: {
John McCall3ce3d232019-12-13 03:37:23 -05008787 NamespaceAliasDecl *Alias = readDeclAs<NamespaceAliasDecl>();
8788 SourceRange Range = readSourceRange();
Guy Benyei11169dd2012-12-18 14:30:41 +00008789 Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd());
8790 break;
8791 }
8792
8793 case NestedNameSpecifier::TypeSpec:
8794 case NestedNameSpecifier::TypeSpecWithTemplate: {
John McCall3ce3d232019-12-13 03:37:23 -05008795 bool Template = readBool();
8796 TypeSourceInfo *T = readTypeSourceInfo();
Guy Benyei11169dd2012-12-18 14:30:41 +00008797 if (!T)
Vedant Kumar48b4f762018-04-14 01:40:48 +00008798 return NestedNameSpecifierLoc();
John McCall3ce3d232019-12-13 03:37:23 -05008799 SourceLocation ColonColonLoc = readSourceLocation();
Guy Benyei11169dd2012-12-18 14:30:41 +00008800
8801 // FIXME: 'template' keyword location not saved anywhere, so we fake it.
David L. Jonesc4808b9e2016-12-15 20:53:26 +00008802 Builder.Extend(Context,
Guy Benyei11169dd2012-12-18 14:30:41 +00008803 Template? T->getTypeLoc().getBeginLoc() : SourceLocation(),
8804 T->getTypeLoc(), ColonColonLoc);
8805 break;
8806 }
8807
8808 case NestedNameSpecifier::Global: {
John McCall3ce3d232019-12-13 03:37:23 -05008809 SourceLocation ColonColonLoc = readSourceLocation();
Guy Benyei11169dd2012-12-18 14:30:41 +00008810 Builder.MakeGlobal(Context, ColonColonLoc);
8811 break;
8812 }
Nikola Smiljanic67860242014-09-26 00:28:20 +00008813
8814 case NestedNameSpecifier::Super: {
John McCall3ce3d232019-12-13 03:37:23 -05008815 CXXRecordDecl *RD = readDeclAs<CXXRecordDecl>();
8816 SourceRange Range = readSourceRange();
Nikola Smiljanic67860242014-09-26 00:28:20 +00008817 Builder.MakeSuper(Context, RD, Range.getBegin(), Range.getEnd());
8818 break;
8819 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008820 }
8821 }
Nikola Smiljanic67860242014-09-26 00:28:20 +00008822
Guy Benyei11169dd2012-12-18 14:30:41 +00008823 return Builder.getWithLocInContext(Context);
8824}
8825
8826SourceRange
8827ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record,
8828 unsigned &Idx) {
8829 SourceLocation beg = ReadSourceLocation(F, Record, Idx);
8830 SourceLocation end = ReadSourceLocation(F, Record, Idx);
8831 return SourceRange(beg, end);
8832}
8833
Gauthier Harnisch83c7b612019-06-15 10:24:47 +00008834static FixedPointSemantics
8835ReadFixedPointSemantics(const SmallVectorImpl<uint64_t> &Record,
8836 unsigned &Idx) {
8837 unsigned Width = Record[Idx++];
8838 unsigned Scale = Record[Idx++];
8839 uint64_t Tmp = Record[Idx++];
8840 bool IsSigned = Tmp & 0x1;
8841 bool IsSaturated = Tmp & 0x2;
8842 bool HasUnsignedPadding = Tmp & 0x4;
8843 return FixedPointSemantics(Width, Scale, IsSigned, IsSaturated,
8844 HasUnsignedPadding);
8845}
8846
John McCall3ce3d232019-12-13 03:37:23 -05008847static const llvm::fltSemantics &
8848readAPFloatSemantics(ASTRecordReader &reader) {
8849 return llvm::APFloatBase::EnumToSemantics(
8850 static_cast<llvm::APFloatBase::Semantics>(reader.readInt()));
8851}
8852
8853APValue ASTRecordReader::readAPValue() {
8854 unsigned Kind = readInt();
John McCalld505e572019-12-13 21:54:44 -05008855 switch ((APValue::ValueKind) Kind) {
Gauthier Harnisch83c7b612019-06-15 10:24:47 +00008856 case APValue::None:
8857 return APValue();
8858 case APValue::Indeterminate:
8859 return APValue::IndeterminateValue();
8860 case APValue::Int:
John McCall3ce3d232019-12-13 03:37:23 -05008861 return APValue(readAPSInt());
Gauthier Harnisch83c7b612019-06-15 10:24:47 +00008862 case APValue::Float: {
John McCall3ce3d232019-12-13 03:37:23 -05008863 const llvm::fltSemantics &FloatSema = readAPFloatSemantics(*this);
8864 return APValue(readAPFloat(FloatSema));
Gauthier Harnisch83c7b612019-06-15 10:24:47 +00008865 }
8866 case APValue::FixedPoint: {
8867 FixedPointSemantics FPSema = ReadFixedPointSemantics(Record, Idx);
John McCall3ce3d232019-12-13 03:37:23 -05008868 return APValue(APFixedPoint(readAPInt(), FPSema));
Gauthier Harnisch83c7b612019-06-15 10:24:47 +00008869 }
8870 case APValue::ComplexInt: {
John McCall3ce3d232019-12-13 03:37:23 -05008871 llvm::APSInt First = readAPSInt();
8872 return APValue(std::move(First), readAPSInt());
Gauthier Harnisch83c7b612019-06-15 10:24:47 +00008873 }
8874 case APValue::ComplexFloat: {
John McCall3ce3d232019-12-13 03:37:23 -05008875 const llvm::fltSemantics &FloatSema1 = readAPFloatSemantics(*this);
8876 llvm::APFloat First = readAPFloat(FloatSema1);
8877 const llvm::fltSemantics &FloatSema2 = readAPFloatSemantics(*this);
8878 return APValue(std::move(First), readAPFloat(FloatSema2));
Gauthier Harnisch83c7b612019-06-15 10:24:47 +00008879 }
8880 case APValue::LValue:
8881 case APValue::Vector:
8882 case APValue::Array:
8883 case APValue::Struct:
8884 case APValue::Union:
8885 case APValue::MemberPointer:
8886 case APValue::AddrLabelDiff:
8887 // TODO : Handle all these APValue::ValueKind.
8888 return APValue();
8889 }
8890 llvm_unreachable("Invalid APValue::ValueKind");
8891}
8892
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00008893/// Read a floating-point value
John McCall3ce3d232019-12-13 03:37:23 -05008894llvm::APFloat ASTRecordReader::readAPFloat(const llvm::fltSemantics &Sem) {
8895 return llvm::APFloat(Sem, readAPInt());
Guy Benyei11169dd2012-12-18 14:30:41 +00008896}
8897
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00008898// Read a string
Guy Benyei11169dd2012-12-18 14:30:41 +00008899std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) {
8900 unsigned Len = Record[Idx++];
8901 std::string Result(Record.data() + Idx, Record.data() + Idx + Len);
8902 Idx += Len;
8903 return Result;
8904}
8905
Richard Smith7ed1bc92014-12-05 22:42:13 +00008906std::string ASTReader::ReadPath(ModuleFile &F, const RecordData &Record,
8907 unsigned &Idx) {
8908 std::string Filename = ReadString(Record, Idx);
8909 ResolveImportedPath(F, Filename);
8910 return Filename;
8911}
8912
Duncan P. N. Exon Smith0a2be462019-03-09 17:44:01 +00008913std::string ASTReader::ReadPath(StringRef BaseDirectory,
8914 const RecordData &Record, unsigned &Idx) {
8915 std::string Filename = ReadString(Record, Idx);
8916 if (!BaseDirectory.empty())
8917 ResolveImportedPath(Filename, BaseDirectory);
8918 return Filename;
8919}
8920
David L. Jonesc4808b9e2016-12-15 20:53:26 +00008921VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record,
Guy Benyei11169dd2012-12-18 14:30:41 +00008922 unsigned &Idx) {
8923 unsigned Major = Record[Idx++];
8924 unsigned Minor = Record[Idx++];
8925 unsigned Subminor = Record[Idx++];
8926 if (Minor == 0)
8927 return VersionTuple(Major);
8928 if (Subminor == 0)
8929 return VersionTuple(Major, Minor - 1);
8930 return VersionTuple(Major, Minor - 1, Subminor - 1);
8931}
8932
David L. Jonesc4808b9e2016-12-15 20:53:26 +00008933CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F,
Guy Benyei11169dd2012-12-18 14:30:41 +00008934 const RecordData &Record,
8935 unsigned &Idx) {
Vedant Kumar48b4f762018-04-14 01:40:48 +00008936 CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx);
Richard Smithdbafb6c2017-06-29 23:23:46 +00008937 return CXXTemporary::Create(getContext(), Decl);
Guy Benyei11169dd2012-12-18 14:30:41 +00008938}
8939
Richard Smith37a93df2017-02-18 00:32:02 +00008940DiagnosticBuilder ASTReader::Diag(unsigned DiagID) const {
Argyrios Kyrtzidisdc9fdaf2013-05-24 05:44:08 +00008941 return Diag(CurrentImportLoc, DiagID);
Guy Benyei11169dd2012-12-18 14:30:41 +00008942}
8943
Richard Smith37a93df2017-02-18 00:32:02 +00008944DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) const {
Guy Benyei11169dd2012-12-18 14:30:41 +00008945 return Diags.Report(Loc, DiagID);
8946}
8947
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00008948/// Retrieve the identifier table associated with the
Guy Benyei11169dd2012-12-18 14:30:41 +00008949/// preprocessor.
8950IdentifierTable &ASTReader::getIdentifierTable() {
8951 return PP.getIdentifierTable();
8952}
8953
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00008954/// Record that the given ID maps to the given switch-case
Guy Benyei11169dd2012-12-18 14:30:41 +00008955/// statement.
8956void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) {
Craig Toppera13603a2014-05-22 05:54:18 +00008957 assert((*CurrSwitchCaseStmts)[ID] == nullptr &&
Guy Benyei11169dd2012-12-18 14:30:41 +00008958 "Already have a SwitchCase with this ID");
8959 (*CurrSwitchCaseStmts)[ID] = SC;
8960}
8961
Adrian Prantl9fc8faf2018-05-09 01:00:01 +00008962/// Retrieve the switch-case statement with the given ID.
Guy Benyei11169dd2012-12-18 14:30:41 +00008963SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) {
Craig Toppera13603a2014-05-22 05:54:18 +00008964 assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID");
Guy Benyei11169dd2012-12-18 14:30:41 +00008965 return (*CurrSwitchCaseStmts)[ID];
8966}
8967
8968void ASTReader::ClearSwitchCaseIDs() {
8969 CurrSwitchCaseStmts->clear();
8970}
8971
8972void ASTReader::ReadComments() {
Richard Smithdbafb6c2017-06-29 23:23:46 +00008973 ASTContext &Context = getContext();
Guy Benyei11169dd2012-12-18 14:30:41 +00008974 std::vector<RawComment *> Comments;
Vedant Kumar48b4f762018-04-14 01:40:48 +00008975 for (SmallVectorImpl<std::pair<BitstreamCursor,
8976 serialization::ModuleFile *>>::iterator
8977 I = CommentsCursors.begin(),
8978 E = CommentsCursors.end();
8979 I != E; ++I) {
Dmitri Gribenko9ee0e302014-03-27 15:40:39 +00008980 Comments.clear();
Vedant Kumar48b4f762018-04-14 01:40:48 +00008981 BitstreamCursor &Cursor = I->first;
8982 serialization::ModuleFile &F = *I->second;
Guy Benyei11169dd2012-12-18 14:30:41 +00008983 SavedStreamPosition SavedPosition(Cursor);
8984
8985 RecordData Record;
8986 while (true) {
JF Bastien0e828952019-06-26 19:50:12 +00008987 Expected<llvm::BitstreamEntry> MaybeEntry =
8988 Cursor.advanceSkippingSubblocks(
8989 BitstreamCursor::AF_DontPopBlockAtEnd);
8990 if (!MaybeEntry) {
8991 Error(MaybeEntry.takeError());
8992 return;
8993 }
8994 llvm::BitstreamEntry Entry = MaybeEntry.get();
Dmitri Gribenko9ee0e302014-03-27 15:40:39 +00008995
Chris Lattner7fb3bef2013-01-20 00:56:42 +00008996 switch (Entry.Kind) {
8997 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
8998 case llvm::BitstreamEntry::Error:
8999 Error("malformed block record in AST file");
9000 return;
9001 case llvm::BitstreamEntry::EndBlock:
9002 goto NextCursor;
9003 case llvm::BitstreamEntry::Record:
9004 // The interesting case.
Guy Benyei11169dd2012-12-18 14:30:41 +00009005 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00009006 }
9007
9008 // Read a record.
9009 Record.clear();
JF Bastien0e828952019-06-26 19:50:12 +00009010 Expected<unsigned> MaybeComment = Cursor.readRecord(Entry.ID, Record);
9011 if (!MaybeComment) {
9012 Error(MaybeComment.takeError());
9013 return;
9014 }
9015 switch ((CommentRecordTypes)MaybeComment.get()) {
Guy Benyei11169dd2012-12-18 14:30:41 +00009016 case COMMENTS_RAW_COMMENT: {
9017 unsigned Idx = 0;
9018 SourceRange SR = ReadSourceRange(F, Record, Idx);
Vedant Kumar48b4f762018-04-14 01:40:48 +00009019 RawComment::CommentKind Kind =
9020 (RawComment::CommentKind) Record[Idx++];
Guy Benyei11169dd2012-12-18 14:30:41 +00009021 bool IsTrailingComment = Record[Idx++];
9022 bool IsAlmostTrailingComment = Record[Idx++];
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00009023 Comments.push_back(new (Context) RawComment(
David L. Jones13d5a872018-03-02 00:07:45 +00009024 SR, Kind, IsTrailingComment, IsAlmostTrailingComment));
Guy Benyei11169dd2012-12-18 14:30:41 +00009025 break;
9026 }
9027 }
9028 }
Dmitri Gribenko9ee0e302014-03-27 15:40:39 +00009029 NextCursor:
Jan Korousf31d8df2019-08-13 18:11:44 +00009030 llvm::DenseMap<FileID, std::map<unsigned, RawComment *>>
9031 FileToOffsetToComment;
9032 for (RawComment *C : Comments) {
9033 SourceLocation CommentLoc = C->getBeginLoc();
9034 if (CommentLoc.isValid()) {
9035 std::pair<FileID, unsigned> Loc =
9036 SourceMgr.getDecomposedLoc(CommentLoc);
9037 if (Loc.first.isValid())
9038 Context.Comments.OrderedComments[Loc.first].emplace(Loc.second, C);
9039 }
9040 }
Guy Benyei11169dd2012-12-18 14:30:41 +00009041 }
Guy Benyei11169dd2012-12-18 14:30:41 +00009042}
9043
Argyrios Kyrtzidisa38cb202017-01-30 06:05:58 +00009044void ASTReader::visitInputFiles(serialization::ModuleFile &MF,
9045 bool IncludeSystem, bool Complain,
9046 llvm::function_ref<void(const serialization::InputFile &IF,
9047 bool isSystem)> Visitor) {
9048 unsigned NumUserInputs = MF.NumUserInputFiles;
9049 unsigned NumInputs = MF.InputFilesLoaded.size();
9050 assert(NumUserInputs <= NumInputs);
9051 unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
9052 for (unsigned I = 0; I < N; ++I) {
9053 bool IsSystem = I >= NumUserInputs;
9054 InputFile IF = getInputFile(MF, I+1, Complain);
9055 Visitor(IF, IsSystem);
9056 }
9057}
9058
Richard Smithf3f84612017-06-29 02:19:42 +00009059void ASTReader::visitTopLevelModuleMaps(
9060 serialization::ModuleFile &MF,
9061 llvm::function_ref<void(const FileEntry *FE)> Visitor) {
9062 unsigned NumInputs = MF.InputFilesLoaded.size();
9063 for (unsigned I = 0; I < NumInputs; ++I) {
9064 InputFileInfo IFI = readInputFileInfo(MF, I + 1);
9065 if (IFI.TopLevelModuleMap)
9066 // FIXME: This unnecessarily re-reads the InputFileInfo.
9067 if (auto *FE = getInputFile(MF, I + 1).getFile())
9068 Visitor(FE);
9069 }
9070}
9071
Richard Smithcd45dbc2014-04-19 03:48:30 +00009072std::string ASTReader::getOwningModuleNameForDiagnostic(const Decl *D) {
9073 // If we know the owning module, use it.
Richard Smith42413142015-05-15 20:05:43 +00009074 if (Module *M = D->getImportedOwningModule())
Richard Smithcd45dbc2014-04-19 03:48:30 +00009075 return M->getFullModuleName();
9076
9077 // Otherwise, use the name of the top-level module the decl is within.
9078 if (ModuleFile *M = getOwningModuleFile(D))
9079 return M->ModuleName;
9080
9081 // Not from a module.
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00009082 return {};
Richard Smithcd45dbc2014-04-19 03:48:30 +00009083}
9084
Guy Benyei11169dd2012-12-18 14:30:41 +00009085void ASTReader::finishPendingActions() {
Richard Smitha62d1982018-08-03 01:00:01 +00009086 while (!PendingIdentifierInfos.empty() || !PendingFunctionTypes.empty() ||
Richard Smith851072e2014-05-19 20:59:20 +00009087 !PendingIncompleteDeclChains.empty() || !PendingDeclChains.empty() ||
Richard Smith2b9e3e32013-10-18 06:05:18 +00009088 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() ||
Richard Smitha0ce9c42014-07-29 23:23:27 +00009089 !PendingUpdateRecords.empty()) {
Guy Benyei11169dd2012-12-18 14:30:41 +00009090 // If any identifiers with corresponding top-level declarations have
9091 // been loaded, load those declarations now.
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +00009092 using TopLevelDeclsMap =
9093 llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2>>;
Craig Topper79be4cd2013-07-05 04:33:53 +00009094 TopLevelDeclsMap TopLevelDecls;
9095
Guy Benyei11169dd2012-12-18 14:30:41 +00009096 while (!PendingIdentifierInfos.empty()) {
Douglas Gregor6168bd22013-02-18 15:53:43 +00009097 IdentifierInfo *II = PendingIdentifierInfos.back().first;
Richard Smithf0ae3c2d2014-03-28 17:31:23 +00009098 SmallVector<uint32_t, 4> DeclIDs =
9099 std::move(PendingIdentifierInfos.back().second);
Douglas Gregorcb15f082013-02-19 18:26:28 +00009100 PendingIdentifierInfos.pop_back();
Douglas Gregor6168bd22013-02-18 15:53:43 +00009101
9102 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]);
Guy Benyei11169dd2012-12-18 14:30:41 +00009103 }
Richard Smithf0ae3c2d2014-03-28 17:31:23 +00009104
Richard Smitha62d1982018-08-03 01:00:01 +00009105 // Load each function type that we deferred loading because it was a
9106 // deduced type that might refer to a local type declared within itself.
9107 for (unsigned I = 0; I != PendingFunctionTypes.size(); ++I) {
9108 auto *FD = PendingFunctionTypes[I].first;
9109 FD->setType(GetType(PendingFunctionTypes[I].second));
9110
9111 // If we gave a function a deduced return type, remember that we need to
9112 // propagate that along the redeclaration chain.
9113 auto *DT = FD->getReturnType()->getContainedDeducedType();
9114 if (DT && DT->isDeduced())
9115 PendingDeducedTypeUpdates.insert(
9116 {FD->getCanonicalDecl(), FD->getReturnType()});
9117 }
9118 PendingFunctionTypes.clear();
9119
Richard Smith851072e2014-05-19 20:59:20 +00009120 // For each decl chain that we wanted to complete while deserializing, mark
9121 // it as "still needs to be completed".
Vedant Kumar48b4f762018-04-14 01:40:48 +00009122 for (unsigned I = 0; I != PendingIncompleteDeclChains.size(); ++I) {
9123 markIncompleteDeclChain(PendingIncompleteDeclChains[I]);
9124 }
Richard Smith851072e2014-05-19 20:59:20 +00009125 PendingIncompleteDeclChains.clear();
9126
Guy Benyei11169dd2012-12-18 14:30:41 +00009127 // Load pending declaration chains.
Vedant Kumar48b4f762018-04-14 01:40:48 +00009128 for (unsigned I = 0; I != PendingDeclChains.size(); ++I)
Richard Smitha62d1982018-08-03 01:00:01 +00009129 loadPendingDeclChain(PendingDeclChains[I].first,
9130 PendingDeclChains[I].second);
Guy Benyei11169dd2012-12-18 14:30:41 +00009131 PendingDeclChains.clear();
9132
Douglas Gregor6168bd22013-02-18 15:53:43 +00009133 // Make the most recent of the top-level declarations visible.
Vedant Kumar48b4f762018-04-14 01:40:48 +00009134 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
9135 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
9136 IdentifierInfo *II = TLD->first;
9137 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
9138 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II);
Douglas Gregor6168bd22013-02-18 15:53:43 +00009139 }
9140 }
9141
Guy Benyei11169dd2012-12-18 14:30:41 +00009142 // Load any pending macro definitions.
9143 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00009144 IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
9145 SmallVector<PendingMacroInfo, 2> GlobalIDs;
9146 GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
9147 // Initialize the macro history from chained-PCHs ahead of module imports.
Richard Smith49f906a2014-03-01 00:08:04 +00009148 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
Argyrios Kyrtzidis719736c2013-01-19 03:14:56 +00009149 ++IDIdx) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00009150 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
Manman Ren11f2a472016-08-18 17:42:15 +00009151 if (!Info.M->isModule())
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00009152 resolvePendingMacro(II, Info);
9153 }
9154 // Handle module imports.
Richard Smith49f906a2014-03-01 00:08:04 +00009155 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00009156 ++IDIdx) {
9157 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
Manman Ren11f2a472016-08-18 17:42:15 +00009158 if (Info.M->isModule())
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00009159 resolvePendingMacro(II, Info);
Guy Benyei11169dd2012-12-18 14:30:41 +00009160 }
9161 }
9162 PendingMacroIDs.clear();
Argyrios Kyrtzidis83a6e3b2013-02-16 00:48:59 +00009163
9164 // Wire up the DeclContexts for Decls that we delayed setting until
9165 // recursive loading is completed.
9166 while (!PendingDeclContextInfos.empty()) {
9167 PendingDeclContextInfo Info = PendingDeclContextInfos.front();
9168 PendingDeclContextInfos.pop_front();
Vedant Kumar48b4f762018-04-14 01:40:48 +00009169 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC));
9170 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC));
Argyrios Kyrtzidis83a6e3b2013-02-16 00:48:59 +00009171 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext());
9172 }
Richard Smith2b9e3e32013-10-18 06:05:18 +00009173
Richard Smithd1c46742014-04-30 02:24:17 +00009174 // Perform any pending declaration updates.
Richard Smithd6db68c2014-08-07 20:58:41 +00009175 while (!PendingUpdateRecords.empty()) {
Richard Smithd1c46742014-04-30 02:24:17 +00009176 auto Update = PendingUpdateRecords.pop_back_val();
9177 ReadingKindTracker ReadingKind(Read_Decl, *this);
Vassil Vassilev74c3e8c2017-05-19 16:46:06 +00009178 loadDeclUpdateRecords(Update);
Richard Smithd1c46742014-04-30 02:24:17 +00009179 }
Guy Benyei11169dd2012-12-18 14:30:41 +00009180 }
Richard Smith8a639892015-01-24 01:07:20 +00009181
9182 // At this point, all update records for loaded decls are in place, so any
9183 // fake class definitions should have become real.
9184 assert(PendingFakeDefinitionData.empty() &&
9185 "faked up a class definition but never saw the real one");
9186
Guy Benyei11169dd2012-12-18 14:30:41 +00009187 // If we deserialized any C++ or Objective-C class definitions, any
9188 // Objective-C protocol definitions, or any redeclarable templates, make sure
David L. Jonesc4808b9e2016-12-15 20:53:26 +00009189 // that all redeclarations point to the definitions. Note that this can only
Guy Benyei11169dd2012-12-18 14:30:41 +00009190 // happen now, after the redeclaration chains have been fully wired.
Vedant Kumar48b4f762018-04-14 01:40:48 +00009191 for (Decl *D : PendingDefinitions) {
9192 if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
9193 if (const TagType *TagT = dyn_cast<TagType>(TD->getTypeForDecl())) {
Guy Benyei11169dd2012-12-18 14:30:41 +00009194 // Make sure that the TagType points at the definition.
9195 const_cast<TagType*>(TagT)->decl = TD;
9196 }
Richard Smith8ce51082015-03-11 01:44:51 +00009197
Vedant Kumar48b4f762018-04-14 01:40:48 +00009198 if (auto RD = dyn_cast<CXXRecordDecl>(D)) {
Richard Smith8ce51082015-03-11 01:44:51 +00009199 for (auto *R = getMostRecentExistingDecl(RD); R;
9200 R = R->getPreviousDecl()) {
9201 assert((R == D) ==
9202 cast<CXXRecordDecl>(R)->isThisDeclarationADefinition() &&
Richard Smith2c381642014-08-27 23:11:59 +00009203 "declaration thinks it's the definition but it isn't");
Aaron Ballman86c93902014-03-06 23:45:36 +00009204 cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData;
Richard Smith2c381642014-08-27 23:11:59 +00009205 }
Guy Benyei11169dd2012-12-18 14:30:41 +00009206 }
9207
9208 continue;
9209 }
Richard Smith8ce51082015-03-11 01:44:51 +00009210
Vedant Kumar48b4f762018-04-14 01:40:48 +00009211 if (auto ID = dyn_cast<ObjCInterfaceDecl>(D)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00009212 // Make sure that the ObjCInterfaceType points at the definition.
9213 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl))
9214 ->Decl = ID;
Richard Smith8ce51082015-03-11 01:44:51 +00009215
9216 for (auto *R = getMostRecentExistingDecl(ID); R; R = R->getPreviousDecl())
9217 cast<ObjCInterfaceDecl>(R)->Data = ID->Data;
9218
Guy Benyei11169dd2012-12-18 14:30:41 +00009219 continue;
9220 }
Richard Smith8ce51082015-03-11 01:44:51 +00009221
Vedant Kumar48b4f762018-04-14 01:40:48 +00009222 if (auto PD = dyn_cast<ObjCProtocolDecl>(D)) {
Richard Smith8ce51082015-03-11 01:44:51 +00009223 for (auto *R = getMostRecentExistingDecl(PD); R; R = R->getPreviousDecl())
9224 cast<ObjCProtocolDecl>(R)->Data = PD->Data;
9225
Guy Benyei11169dd2012-12-18 14:30:41 +00009226 continue;
9227 }
Richard Smith8ce51082015-03-11 01:44:51 +00009228
Vedant Kumar48b4f762018-04-14 01:40:48 +00009229 auto RTD = cast<RedeclarableTemplateDecl>(D)->getCanonicalDecl();
Richard Smith8ce51082015-03-11 01:44:51 +00009230 for (auto *R = getMostRecentExistingDecl(RTD); R; R = R->getPreviousDecl())
9231 cast<RedeclarableTemplateDecl>(R)->Common = RTD->Common;
Guy Benyei11169dd2012-12-18 14:30:41 +00009232 }
9233 PendingDefinitions.clear();
9234
Daniel Jasper4a6d5b72017-10-11 07:47:54 +00009235 // Load the bodies of any functions or methods we've encountered. We do
9236 // this now (delayed) so that we can be sure that the declaration chains
9237 // have been fully wired up (hasBody relies on this).
9238 // FIXME: We shouldn't require complete redeclaration chains here.
Vedant Kumar48b4f762018-04-14 01:40:48 +00009239 for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
9240 PBEnd = PendingBodies.end();
9241 PB != PBEnd; ++PB) {
9242 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
Richard Smith0b70de12018-06-28 01:07:28 +00009243 // For a function defined inline within a class template, force the
9244 // canonical definition to be the one inside the canonical definition of
9245 // the template. This ensures that we instantiate from a correct view
9246 // of the template.
9247 //
9248 // Sadly we can't do this more generally: we can't be sure that all
9249 // copies of an arbitrary class definition will have the same members
9250 // defined (eg, some member functions may not be instantiated, and some
9251 // special members may or may not have been implicitly defined).
9252 if (auto *RD = dyn_cast<CXXRecordDecl>(FD->getLexicalParent()))
9253 if (RD->isDependentContext() && !RD->isThisDeclarationADefinition())
9254 continue;
9255
Daniel Jasper4a6d5b72017-10-11 07:47:54 +00009256 // FIXME: Check for =delete/=default?
9257 // FIXME: Complain about ODR violations here?
9258 const FunctionDecl *Defn = nullptr;
9259 if (!getContext().getLangOpts().Modules || !FD->hasBody(Defn)) {
Vedant Kumar48b4f762018-04-14 01:40:48 +00009260 FD->setLazyBody(PB->second);
Richard Trieue6caa262017-12-23 00:41:01 +00009261 } else {
Vedant Kumar48b4f762018-04-14 01:40:48 +00009262 auto *NonConstDefn = const_cast<FunctionDecl*>(Defn);
Richard Trieue6caa262017-12-23 00:41:01 +00009263 mergeDefinitionVisibility(NonConstDefn, FD);
9264
9265 if (!FD->isLateTemplateParsed() &&
9266 !NonConstDefn->isLateTemplateParsed() &&
9267 FD->getODRHash() != NonConstDefn->getODRHash()) {
Richard Trieu27c1b1a2018-07-10 01:40:50 +00009268 if (!isa<CXXMethodDecl>(FD)) {
9269 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
9270 } else if (FD->getLexicalParent()->isFileContext() &&
9271 NonConstDefn->getLexicalParent()->isFileContext()) {
9272 // Only diagnose out-of-line method definitions. If they are
9273 // in class definitions, then an error will be generated when
9274 // processing the class bodies.
9275 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
9276 }
Richard Trieue6caa262017-12-23 00:41:01 +00009277 }
9278 }
Daniel Jasper4a6d5b72017-10-11 07:47:54 +00009279 continue;
9280 }
9281
Vedant Kumar48b4f762018-04-14 01:40:48 +00009282 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first);
Daniel Jasper4a6d5b72017-10-11 07:47:54 +00009283 if (!getContext().getLangOpts().Modules || !MD->hasBody())
Vedant Kumar48b4f762018-04-14 01:40:48 +00009284 MD->setLazyBody(PB->second);
Daniel Jasper4a6d5b72017-10-11 07:47:54 +00009285 }
9286 PendingBodies.clear();
9287
Richard Smith42413142015-05-15 20:05:43 +00009288 // Do some cleanup.
9289 for (auto *ND : PendingMergedDefinitionsToDeduplicate)
9290 getContext().deduplicateMergedDefinitonsFor(ND);
9291 PendingMergedDefinitionsToDeduplicate.clear();
Richard Smitha0ce9c42014-07-29 23:23:27 +00009292}
9293
9294void ASTReader::diagnoseOdrViolations() {
Richard Trieue6caa262017-12-23 00:41:01 +00009295 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty() &&
Richard Trieuab4d7302018-07-25 22:52:05 +00009296 PendingFunctionOdrMergeFailures.empty() &&
9297 PendingEnumOdrMergeFailures.empty())
Richard Smithbb853c72014-08-13 01:23:33 +00009298 return;
9299
Richard Smitha0ce9c42014-07-29 23:23:27 +00009300 // Trigger the import of the full definition of each class that had any
9301 // odr-merging problems, so we can produce better diagnostics for them.
Richard Smithbb853c72014-08-13 01:23:33 +00009302 // These updates may in turn find and diagnose some ODR failures, so take
9303 // ownership of the set first.
9304 auto OdrMergeFailures = std::move(PendingOdrMergeFailures);
9305 PendingOdrMergeFailures.clear();
9306 for (auto &Merge : OdrMergeFailures) {
Richard Smitha0ce9c42014-07-29 23:23:27 +00009307 Merge.first->buildLookup();
9308 Merge.first->decls_begin();
9309 Merge.first->bases_begin();
9310 Merge.first->vbases_begin();
Richard Trieue13eabe2017-09-30 02:19:17 +00009311 for (auto &RecordPair : Merge.second) {
9312 auto *RD = RecordPair.first;
Richard Smitha0ce9c42014-07-29 23:23:27 +00009313 RD->decls_begin();
9314 RD->bases_begin();
9315 RD->vbases_begin();
9316 }
9317 }
9318
Richard Trieue6caa262017-12-23 00:41:01 +00009319 // Trigger the import of functions.
9320 auto FunctionOdrMergeFailures = std::move(PendingFunctionOdrMergeFailures);
9321 PendingFunctionOdrMergeFailures.clear();
9322 for (auto &Merge : FunctionOdrMergeFailures) {
9323 Merge.first->buildLookup();
9324 Merge.first->decls_begin();
9325 Merge.first->getBody();
9326 for (auto &FD : Merge.second) {
9327 FD->buildLookup();
9328 FD->decls_begin();
9329 FD->getBody();
9330 }
9331 }
9332
Richard Trieuab4d7302018-07-25 22:52:05 +00009333 // Trigger the import of enums.
9334 auto EnumOdrMergeFailures = std::move(PendingEnumOdrMergeFailures);
9335 PendingEnumOdrMergeFailures.clear();
9336 for (auto &Merge : EnumOdrMergeFailures) {
9337 Merge.first->decls_begin();
9338 for (auto &Enum : Merge.second) {
9339 Enum->decls_begin();
9340 }
9341 }
9342
Richard Smitha0ce9c42014-07-29 23:23:27 +00009343 // For each declaration from a merged context, check that the canonical
9344 // definition of that context also contains a declaration of the same
9345 // entity.
9346 //
9347 // Caution: this loop does things that might invalidate iterators into
9348 // PendingOdrMergeChecks. Don't turn this into a range-based for loop!
9349 while (!PendingOdrMergeChecks.empty()) {
9350 NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
9351
9352 // FIXME: Skip over implicit declarations for now. This matters for things
9353 // like implicitly-declared special member functions. This isn't entirely
9354 // correct; we can end up with multiple unmerged declarations of the same
9355 // implicit entity.
9356 if (D->isImplicit())
9357 continue;
9358
9359 DeclContext *CanonDef = D->getDeclContext();
Richard Smitha0ce9c42014-07-29 23:23:27 +00009360
9361 bool Found = false;
9362 const Decl *DCanon = D->getCanonicalDecl();
9363
Richard Smith01bdb7a2014-08-28 05:44:07 +00009364 for (auto RI : D->redecls()) {
9365 if (RI->getLexicalDeclContext() == CanonDef) {
9366 Found = true;
9367 break;
9368 }
9369 }
9370 if (Found)
9371 continue;
9372
Richard Smith0f4e2c42015-08-06 04:23:48 +00009373 // Quick check failed, time to do the slow thing. Note, we can't just
9374 // look up the name of D in CanonDef here, because the member that is
9375 // in CanonDef might not be found by name lookup (it might have been
9376 // replaced by a more recent declaration in the lookup table), and we
9377 // can't necessarily find it in the redeclaration chain because it might
9378 // be merely mergeable, not redeclarable.
Richard Smitha0ce9c42014-07-29 23:23:27 +00009379 llvm::SmallVector<const NamedDecl*, 4> Candidates;
Richard Smith0f4e2c42015-08-06 04:23:48 +00009380 for (auto *CanonMember : CanonDef->decls()) {
9381 if (CanonMember->getCanonicalDecl() == DCanon) {
9382 // This can happen if the declaration is merely mergeable and not
9383 // actually redeclarable (we looked for redeclarations earlier).
9384 //
9385 // FIXME: We should be able to detect this more efficiently, without
9386 // pulling in all of the members of CanonDef.
9387 Found = true;
9388 break;
Richard Smitha0ce9c42014-07-29 23:23:27 +00009389 }
Richard Smith0f4e2c42015-08-06 04:23:48 +00009390 if (auto *ND = dyn_cast<NamedDecl>(CanonMember))
9391 if (ND->getDeclName() == D->getDeclName())
9392 Candidates.push_back(ND);
Richard Smitha0ce9c42014-07-29 23:23:27 +00009393 }
9394
9395 if (!Found) {
Richard Smithd08aeb62014-08-28 01:33:39 +00009396 // The AST doesn't like TagDecls becoming invalid after they've been
9397 // completed. We only really need to mark FieldDecls as invalid here.
9398 if (!isa<TagDecl>(D))
9399 D->setInvalidDecl();
David L. Jonesc4808b9e2016-12-15 20:53:26 +00009400
Richard Smith4ab3dbd2015-02-13 22:43:51 +00009401 // Ensure we don't accidentally recursively enter deserialization while
9402 // we're producing our diagnostic.
9403 Deserializing RecursionGuard(this);
Richard Smitha0ce9c42014-07-29 23:23:27 +00009404
9405 std::string CanonDefModule =
9406 getOwningModuleNameForDiagnostic(cast<Decl>(CanonDef));
9407 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl)
9408 << D << getOwningModuleNameForDiagnostic(D)
9409 << CanonDef << CanonDefModule.empty() << CanonDefModule;
9410
9411 if (Candidates.empty())
9412 Diag(cast<Decl>(CanonDef)->getLocation(),
9413 diag::note_module_odr_violation_no_possible_decls) << D;
9414 else {
Vedant Kumar48b4f762018-04-14 01:40:48 +00009415 for (unsigned I = 0, N = Candidates.size(); I != N; ++I)
9416 Diag(Candidates[I]->getLocation(),
Richard Smitha0ce9c42014-07-29 23:23:27 +00009417 diag::note_module_odr_violation_possible_decl)
Vedant Kumar48b4f762018-04-14 01:40:48 +00009418 << Candidates[I];
Richard Smitha0ce9c42014-07-29 23:23:27 +00009419 }
9420
9421 DiagnosedOdrMergeFailures.insert(CanonDef);
9422 }
9423 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00009424
Richard Trieuab4d7302018-07-25 22:52:05 +00009425 if (OdrMergeFailures.empty() && FunctionOdrMergeFailures.empty() &&
9426 EnumOdrMergeFailures.empty())
Richard Smith4ab3dbd2015-02-13 22:43:51 +00009427 return;
9428
9429 // Ensure we don't accidentally recursively enter deserialization while
9430 // we're producing our diagnostics.
9431 Deserializing RecursionGuard(this);
9432
Richard Trieue6caa262017-12-23 00:41:01 +00009433 // Common code for hashing helpers.
9434 ODRHash Hash;
9435 auto ComputeQualTypeODRHash = [&Hash](QualType Ty) {
9436 Hash.clear();
9437 Hash.AddQualType(Ty);
9438 return Hash.CalculateHash();
9439 };
9440
9441 auto ComputeODRHash = [&Hash](const Stmt *S) {
9442 assert(S);
9443 Hash.clear();
9444 Hash.AddStmt(S);
9445 return Hash.CalculateHash();
9446 };
9447
9448 auto ComputeSubDeclODRHash = [&Hash](const Decl *D) {
9449 assert(D);
9450 Hash.clear();
9451 Hash.AddSubDecl(D);
9452 return Hash.CalculateHash();
9453 };
9454
Richard Trieu7282d322018-04-25 00:31:15 +00009455 auto ComputeTemplateArgumentODRHash = [&Hash](const TemplateArgument &TA) {
9456 Hash.clear();
9457 Hash.AddTemplateArgument(TA);
9458 return Hash.CalculateHash();
9459 };
9460
Richard Trieu9359e8f2018-05-30 01:12:26 +00009461 auto ComputeTemplateParameterListODRHash =
9462 [&Hash](const TemplateParameterList *TPL) {
9463 assert(TPL);
9464 Hash.clear();
9465 Hash.AddTemplateParameterList(TPL);
9466 return Hash.CalculateHash();
9467 };
9468
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -08009469 // Used with err_module_odr_violation_mismatch_decl and
9470 // note_module_odr_violation_mismatch_decl
9471 // This list should be the same Decl's as in ODRHash::isWhiteListedDecl
9472 enum ODRMismatchDecl {
9473 EndOfClass,
9474 PublicSpecifer,
9475 PrivateSpecifer,
9476 ProtectedSpecifer,
9477 StaticAssert,
9478 Field,
9479 CXXMethod,
9480 TypeAlias,
9481 TypeDef,
9482 Var,
9483 Friend,
9484 FunctionTemplate,
9485 Other
9486 };
9487
9488 // Used with err_module_odr_violation_mismatch_decl_diff and
9489 // note_module_odr_violation_mismatch_decl_diff
9490 enum ODRMismatchDeclDifference {
9491 StaticAssertCondition,
9492 StaticAssertMessage,
9493 StaticAssertOnlyMessage,
9494 FieldName,
9495 FieldTypeName,
9496 FieldSingleBitField,
9497 FieldDifferentWidthBitField,
9498 FieldSingleMutable,
9499 FieldSingleInitializer,
9500 FieldDifferentInitializers,
9501 MethodName,
9502 MethodDeleted,
9503 MethodDefaulted,
9504 MethodVirtual,
9505 MethodStatic,
9506 MethodVolatile,
9507 MethodConst,
9508 MethodInline,
9509 MethodNumberParameters,
9510 MethodParameterType,
9511 MethodParameterName,
9512 MethodParameterSingleDefaultArgument,
9513 MethodParameterDifferentDefaultArgument,
9514 MethodNoTemplateArguments,
9515 MethodDifferentNumberTemplateArguments,
9516 MethodDifferentTemplateArgument,
9517 MethodSingleBody,
9518 MethodDifferentBody,
9519 TypedefName,
9520 TypedefType,
9521 VarName,
9522 VarType,
9523 VarSingleInitializer,
9524 VarDifferentInitializer,
9525 VarConstexpr,
9526 FriendTypeFunction,
9527 FriendType,
9528 FriendFunction,
9529 FunctionTemplateDifferentNumberParameters,
9530 FunctionTemplateParameterDifferentKind,
9531 FunctionTemplateParameterName,
9532 FunctionTemplateParameterSingleDefaultArgument,
9533 FunctionTemplateParameterDifferentDefaultArgument,
9534 FunctionTemplateParameterDifferentType,
9535 FunctionTemplatePackParameter,
9536 };
9537
9538 // These lambdas have the common portions of the ODR diagnostics. This
9539 // has the same return as Diag(), so addition parameters can be passed
9540 // in with operator<<
9541 auto ODRDiagDeclError = [this](NamedDecl *FirstRecord, StringRef FirstModule,
9542 SourceLocation Loc, SourceRange Range,
9543 ODRMismatchDeclDifference DiffType) {
9544 return Diag(Loc, diag::err_module_odr_violation_mismatch_decl_diff)
9545 << FirstRecord << FirstModule.empty() << FirstModule << Range
9546 << DiffType;
9547 };
9548 auto ODRDiagDeclNote = [this](StringRef SecondModule, SourceLocation Loc,
9549 SourceRange Range, ODRMismatchDeclDifference DiffType) {
9550 return Diag(Loc, diag::note_module_odr_violation_mismatch_decl_diff)
9551 << SecondModule << Range << DiffType;
9552 };
9553
9554 auto ODRDiagField = [this, &ODRDiagDeclError, &ODRDiagDeclNote,
9555 &ComputeQualTypeODRHash, &ComputeODRHash](
9556 NamedDecl *FirstRecord, StringRef FirstModule,
9557 StringRef SecondModule, FieldDecl *FirstField,
9558 FieldDecl *SecondField) {
9559 IdentifierInfo *FirstII = FirstField->getIdentifier();
9560 IdentifierInfo *SecondII = SecondField->getIdentifier();
9561 if (FirstII->getName() != SecondII->getName()) {
9562 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(),
9563 FirstField->getSourceRange(), FieldName)
9564 << FirstII;
9565 ODRDiagDeclNote(SecondModule, SecondField->getLocation(),
9566 SecondField->getSourceRange(), FieldName)
9567 << SecondII;
9568
9569 return true;
9570 }
9571
9572 assert(getContext().hasSameType(FirstField->getType(),
9573 SecondField->getType()));
9574
9575 QualType FirstType = FirstField->getType();
9576 QualType SecondType = SecondField->getType();
9577 if (ComputeQualTypeODRHash(FirstType) !=
9578 ComputeQualTypeODRHash(SecondType)) {
9579 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(),
9580 FirstField->getSourceRange(), FieldTypeName)
9581 << FirstII << FirstType;
9582 ODRDiagDeclNote(SecondModule, SecondField->getLocation(),
9583 SecondField->getSourceRange(), FieldTypeName)
9584 << SecondII << SecondType;
9585
9586 return true;
9587 }
9588
9589 const bool IsFirstBitField = FirstField->isBitField();
9590 const bool IsSecondBitField = SecondField->isBitField();
9591 if (IsFirstBitField != IsSecondBitField) {
9592 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(),
9593 FirstField->getSourceRange(), FieldSingleBitField)
9594 << FirstII << IsFirstBitField;
9595 ODRDiagDeclNote(SecondModule, SecondField->getLocation(),
9596 SecondField->getSourceRange(), FieldSingleBitField)
9597 << SecondII << IsSecondBitField;
9598 return true;
9599 }
9600
9601 if (IsFirstBitField && IsSecondBitField) {
9602 unsigned FirstBitWidthHash =
9603 ComputeODRHash(FirstField->getBitWidth());
9604 unsigned SecondBitWidthHash =
9605 ComputeODRHash(SecondField->getBitWidth());
9606 if (FirstBitWidthHash != SecondBitWidthHash) {
9607 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(),
9608 FirstField->getSourceRange(),
9609 FieldDifferentWidthBitField)
9610 << FirstII << FirstField->getBitWidth()->getSourceRange();
9611 ODRDiagDeclNote(SecondModule, SecondField->getLocation(),
9612 SecondField->getSourceRange(),
9613 FieldDifferentWidthBitField)
9614 << SecondII << SecondField->getBitWidth()->getSourceRange();
9615 return true;
9616 }
9617 }
9618
9619 if (!PP.getLangOpts().CPlusPlus)
9620 return false;
9621
9622 const bool IsFirstMutable = FirstField->isMutable();
9623 const bool IsSecondMutable = SecondField->isMutable();
9624 if (IsFirstMutable != IsSecondMutable) {
9625 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(),
9626 FirstField->getSourceRange(), FieldSingleMutable)
9627 << FirstII << IsFirstMutable;
9628 ODRDiagDeclNote(SecondModule, SecondField->getLocation(),
9629 SecondField->getSourceRange(), FieldSingleMutable)
9630 << SecondII << IsSecondMutable;
9631 return true;
9632 }
9633
9634 const Expr *FirstInitializer = FirstField->getInClassInitializer();
9635 const Expr *SecondInitializer = SecondField->getInClassInitializer();
9636 if ((!FirstInitializer && SecondInitializer) ||
9637 (FirstInitializer && !SecondInitializer)) {
9638 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(),
9639 FirstField->getSourceRange(), FieldSingleInitializer)
9640 << FirstII << (FirstInitializer != nullptr);
9641 ODRDiagDeclNote(SecondModule, SecondField->getLocation(),
9642 SecondField->getSourceRange(), FieldSingleInitializer)
9643 << SecondII << (SecondInitializer != nullptr);
9644 return true;
9645 }
9646
9647 if (FirstInitializer && SecondInitializer) {
9648 unsigned FirstInitHash = ComputeODRHash(FirstInitializer);
9649 unsigned SecondInitHash = ComputeODRHash(SecondInitializer);
9650 if (FirstInitHash != SecondInitHash) {
9651 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(),
9652 FirstField->getSourceRange(),
9653 FieldDifferentInitializers)
9654 << FirstII << FirstInitializer->getSourceRange();
9655 ODRDiagDeclNote(SecondModule, SecondField->getLocation(),
9656 SecondField->getSourceRange(),
9657 FieldDifferentInitializers)
9658 << SecondII << SecondInitializer->getSourceRange();
9659 return true;
9660 }
9661 }
9662
9663 return false;
9664 };
9665
9666 auto ODRDiagTypeDefOrAlias =
9667 [&ODRDiagDeclError, &ODRDiagDeclNote, &ComputeQualTypeODRHash](
9668 NamedDecl *FirstRecord, StringRef FirstModule, StringRef SecondModule,
9669 TypedefNameDecl *FirstTD, TypedefNameDecl *SecondTD,
9670 bool IsTypeAlias) {
9671 auto FirstName = FirstTD->getDeclName();
9672 auto SecondName = SecondTD->getDeclName();
9673 if (FirstName != SecondName) {
9674 ODRDiagDeclError(FirstRecord, FirstModule, FirstTD->getLocation(),
9675 FirstTD->getSourceRange(), TypedefName)
9676 << IsTypeAlias << FirstName;
9677 ODRDiagDeclNote(SecondModule, SecondTD->getLocation(),
9678 SecondTD->getSourceRange(), TypedefName)
9679 << IsTypeAlias << SecondName;
9680 return true;
9681 }
9682
9683 QualType FirstType = FirstTD->getUnderlyingType();
9684 QualType SecondType = SecondTD->getUnderlyingType();
9685 if (ComputeQualTypeODRHash(FirstType) !=
9686 ComputeQualTypeODRHash(SecondType)) {
9687 ODRDiagDeclError(FirstRecord, FirstModule, FirstTD->getLocation(),
9688 FirstTD->getSourceRange(), TypedefType)
9689 << IsTypeAlias << FirstName << FirstType;
9690 ODRDiagDeclNote(SecondModule, SecondTD->getLocation(),
9691 SecondTD->getSourceRange(), TypedefType)
9692 << IsTypeAlias << SecondName << SecondType;
9693 return true;
9694 }
9695
9696 return false;
9697 };
9698
9699 auto ODRDiagVar = [&ODRDiagDeclError, &ODRDiagDeclNote,
9700 &ComputeQualTypeODRHash, &ComputeODRHash,
9701 this](NamedDecl *FirstRecord, StringRef FirstModule,
9702 StringRef SecondModule, VarDecl *FirstVD,
9703 VarDecl *SecondVD) {
9704 auto FirstName = FirstVD->getDeclName();
9705 auto SecondName = SecondVD->getDeclName();
9706 if (FirstName != SecondName) {
9707 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(),
9708 FirstVD->getSourceRange(), VarName)
9709 << FirstName;
9710 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(),
9711 SecondVD->getSourceRange(), VarName)
9712 << SecondName;
9713 return true;
9714 }
9715
9716 QualType FirstType = FirstVD->getType();
9717 QualType SecondType = SecondVD->getType();
9718 if (ComputeQualTypeODRHash(FirstType) !=
9719 ComputeQualTypeODRHash(SecondType)) {
9720 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(),
9721 FirstVD->getSourceRange(), VarType)
9722 << FirstName << FirstType;
9723 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(),
9724 SecondVD->getSourceRange(), VarType)
9725 << SecondName << SecondType;
9726 return true;
9727 }
9728
9729 if (!PP.getLangOpts().CPlusPlus)
9730 return false;
9731
9732 const Expr *FirstInit = FirstVD->getInit();
9733 const Expr *SecondInit = SecondVD->getInit();
9734 if ((FirstInit == nullptr) != (SecondInit == nullptr)) {
9735 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(),
9736 FirstVD->getSourceRange(), VarSingleInitializer)
9737 << FirstName << (FirstInit == nullptr)
9738 << (FirstInit ? FirstInit->getSourceRange() : SourceRange());
9739 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(),
9740 SecondVD->getSourceRange(), VarSingleInitializer)
9741 << SecondName << (SecondInit == nullptr)
9742 << (SecondInit ? SecondInit->getSourceRange() : SourceRange());
9743 return true;
9744 }
9745
9746 if (FirstInit && SecondInit &&
9747 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) {
9748 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(),
9749 FirstVD->getSourceRange(), VarDifferentInitializer)
9750 << FirstName << FirstInit->getSourceRange();
9751 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(),
9752 SecondVD->getSourceRange(), VarDifferentInitializer)
9753 << SecondName << SecondInit->getSourceRange();
9754 return true;
9755 }
9756
9757 const bool FirstIsConstexpr = FirstVD->isConstexpr();
9758 const bool SecondIsConstexpr = SecondVD->isConstexpr();
9759 if (FirstIsConstexpr != SecondIsConstexpr) {
9760 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(),
9761 FirstVD->getSourceRange(), VarConstexpr)
9762 << FirstName << FirstIsConstexpr;
9763 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(),
9764 SecondVD->getSourceRange(), VarConstexpr)
9765 << SecondName << SecondIsConstexpr;
9766 return true;
9767 }
9768 return false;
9769 };
9770
9771 auto DifferenceSelector = [](Decl *D) {
9772 assert(D && "valid Decl required");
9773 switch (D->getKind()) {
9774 default:
9775 return Other;
9776 case Decl::AccessSpec:
9777 switch (D->getAccess()) {
9778 case AS_public:
9779 return PublicSpecifer;
9780 case AS_private:
9781 return PrivateSpecifer;
9782 case AS_protected:
9783 return ProtectedSpecifer;
9784 case AS_none:
9785 break;
9786 }
9787 llvm_unreachable("Invalid access specifier");
9788 case Decl::StaticAssert:
9789 return StaticAssert;
9790 case Decl::Field:
9791 return Field;
9792 case Decl::CXXMethod:
9793 case Decl::CXXConstructor:
9794 case Decl::CXXDestructor:
9795 return CXXMethod;
9796 case Decl::TypeAlias:
9797 return TypeAlias;
9798 case Decl::Typedef:
9799 return TypeDef;
9800 case Decl::Var:
9801 return Var;
9802 case Decl::Friend:
9803 return Friend;
9804 case Decl::FunctionTemplate:
9805 return FunctionTemplate;
9806 }
9807 };
9808
9809 using DeclHashes = llvm::SmallVector<std::pair<Decl *, unsigned>, 4>;
9810 auto PopulateHashes = [&ComputeSubDeclODRHash](DeclHashes &Hashes,
9811 RecordDecl *Record,
9812 const DeclContext *DC) {
9813 for (auto *D : Record->decls()) {
9814 if (!ODRHash::isWhitelistedDecl(D, DC))
9815 continue;
9816 Hashes.emplace_back(D, ComputeSubDeclODRHash(D));
9817 }
9818 };
9819
9820 struct DiffResult {
9821 Decl *FirstDecl = nullptr, *SecondDecl = nullptr;
9822 ODRMismatchDecl FirstDiffType = Other, SecondDiffType = Other;
9823 };
9824
9825 // If there is a diagnoseable difference, FirstDiffType and
9826 // SecondDiffType will not be Other and FirstDecl and SecondDecl will be
9827 // filled in if not EndOfClass.
9828 auto FindTypeDiffs = [&DifferenceSelector](DeclHashes &FirstHashes,
9829 DeclHashes &SecondHashes) {
9830 DiffResult DR;
9831 auto FirstIt = FirstHashes.begin();
9832 auto SecondIt = SecondHashes.begin();
9833 while (FirstIt != FirstHashes.end() || SecondIt != SecondHashes.end()) {
9834 if (FirstIt != FirstHashes.end() && SecondIt != SecondHashes.end() &&
9835 FirstIt->second == SecondIt->second) {
9836 ++FirstIt;
9837 ++SecondIt;
9838 continue;
9839 }
9840
9841 DR.FirstDecl = FirstIt == FirstHashes.end() ? nullptr : FirstIt->first;
9842 DR.SecondDecl =
9843 SecondIt == SecondHashes.end() ? nullptr : SecondIt->first;
9844
9845 DR.FirstDiffType =
9846 DR.FirstDecl ? DifferenceSelector(DR.FirstDecl) : EndOfClass;
9847 DR.SecondDiffType =
9848 DR.SecondDecl ? DifferenceSelector(DR.SecondDecl) : EndOfClass;
9849 return DR;
9850 }
9851 return DR;
9852 };
9853
9854 // Use this to diagnose that an unexpected Decl was encountered
9855 // or no difference was detected. This causes a generic error
9856 // message to be emitted.
9857 auto DiagnoseODRUnexpected = [this](DiffResult &DR, NamedDecl *FirstRecord,
9858 StringRef FirstModule,
9859 NamedDecl *SecondRecord,
9860 StringRef SecondModule) {
9861 Diag(FirstRecord->getLocation(),
9862 diag::err_module_odr_violation_different_definitions)
9863 << FirstRecord << FirstModule.empty() << FirstModule;
9864
9865 if (DR.FirstDecl) {
9866 Diag(DR.FirstDecl->getLocation(), diag::note_first_module_difference)
9867 << FirstRecord << DR.FirstDecl->getSourceRange();
9868 }
9869
9870 Diag(SecondRecord->getLocation(),
9871 diag::note_module_odr_violation_different_definitions)
9872 << SecondModule;
9873
9874 if (DR.SecondDecl) {
9875 Diag(DR.SecondDecl->getLocation(), diag::note_second_module_difference)
9876 << DR.SecondDecl->getSourceRange();
9877 }
9878 };
9879
9880 auto DiagnoseODRMismatch =
9881 [this](DiffResult &DR, NamedDecl *FirstRecord, StringRef FirstModule,
9882 NamedDecl *SecondRecord, StringRef SecondModule) {
9883 SourceLocation FirstLoc;
9884 SourceRange FirstRange;
9885 auto *FirstTag = dyn_cast<TagDecl>(FirstRecord);
9886 if (DR.FirstDiffType == EndOfClass && FirstTag) {
9887 FirstLoc = FirstTag->getBraceRange().getEnd();
9888 } else {
9889 FirstLoc = DR.FirstDecl->getLocation();
9890 FirstRange = DR.FirstDecl->getSourceRange();
9891 }
9892 Diag(FirstLoc, diag::err_module_odr_violation_mismatch_decl)
9893 << FirstRecord << FirstModule.empty() << FirstModule << FirstRange
9894 << DR.FirstDiffType;
9895
9896 SourceLocation SecondLoc;
9897 SourceRange SecondRange;
9898 auto *SecondTag = dyn_cast<TagDecl>(SecondRecord);
9899 if (DR.SecondDiffType == EndOfClass && SecondTag) {
9900 SecondLoc = SecondTag->getBraceRange().getEnd();
9901 } else {
9902 SecondLoc = DR.SecondDecl->getLocation();
9903 SecondRange = DR.SecondDecl->getSourceRange();
9904 }
9905 Diag(SecondLoc, diag::note_module_odr_violation_mismatch_decl)
9906 << SecondModule << SecondRange << DR.SecondDiffType;
9907 };
9908
Richard Smithcd45dbc2014-04-19 03:48:30 +00009909 // Issue any pending ODR-failure diagnostics.
Richard Smithbb853c72014-08-13 01:23:33 +00009910 for (auto &Merge : OdrMergeFailures) {
Richard Smitha0ce9c42014-07-29 23:23:27 +00009911 // If we've already pointed out a specific problem with this class, don't
9912 // bother issuing a general "something's different" diagnostic.
David Blaikie82e95a32014-11-19 07:49:47 +00009913 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
Richard Smithcd45dbc2014-04-19 03:48:30 +00009914 continue;
9915
9916 bool Diagnosed = false;
Richard Trieue7f7ed22017-02-22 01:11:25 +00009917 CXXRecordDecl *FirstRecord = Merge.first;
9918 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstRecord);
Richard Trieue13eabe2017-09-30 02:19:17 +00009919 for (auto &RecordPair : Merge.second) {
9920 CXXRecordDecl *SecondRecord = RecordPair.first;
Richard Smithcd45dbc2014-04-19 03:48:30 +00009921 // Multiple different declarations got merged together; tell the user
9922 // where they came from.
Richard Trieue7f7ed22017-02-22 01:11:25 +00009923 if (FirstRecord == SecondRecord)
9924 continue;
9925
9926 std::string SecondModule = getOwningModuleNameForDiagnostic(SecondRecord);
Richard Trieue13eabe2017-09-30 02:19:17 +00009927
9928 auto *FirstDD = FirstRecord->DefinitionData;
9929 auto *SecondDD = RecordPair.second;
9930
9931 assert(FirstDD && SecondDD && "Definitions without DefinitionData");
9932
9933 // Diagnostics from DefinitionData are emitted here.
9934 if (FirstDD != SecondDD) {
9935 enum ODRDefinitionDataDifference {
9936 NumBases,
9937 NumVBases,
9938 BaseType,
9939 BaseVirtual,
9940 BaseAccess,
9941 };
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -08009942 auto ODRDiagBaseError = [FirstRecord, &FirstModule,
9943 this](SourceLocation Loc, SourceRange Range,
9944 ODRDefinitionDataDifference DiffType) {
Richard Trieue13eabe2017-09-30 02:19:17 +00009945 return Diag(Loc, diag::err_module_odr_violation_definition_data)
9946 << FirstRecord << FirstModule.empty() << FirstModule << Range
9947 << DiffType;
9948 };
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -08009949 auto ODRDiagBaseNote = [&SecondModule,
9950 this](SourceLocation Loc, SourceRange Range,
9951 ODRDefinitionDataDifference DiffType) {
Richard Trieue13eabe2017-09-30 02:19:17 +00009952 return Diag(Loc, diag::note_module_odr_violation_definition_data)
9953 << SecondModule << Range << DiffType;
9954 };
9955
Richard Trieue13eabe2017-09-30 02:19:17 +00009956 unsigned FirstNumBases = FirstDD->NumBases;
9957 unsigned FirstNumVBases = FirstDD->NumVBases;
9958 unsigned SecondNumBases = SecondDD->NumBases;
9959 unsigned SecondNumVBases = SecondDD->NumVBases;
9960
9961 auto GetSourceRange = [](struct CXXRecordDecl::DefinitionData *DD) {
9962 unsigned NumBases = DD->NumBases;
9963 if (NumBases == 0) return SourceRange();
9964 auto bases = DD->bases();
Stephen Kellyf2ceec42018-08-09 21:08:08 +00009965 return SourceRange(bases[0].getBeginLoc(),
Stephen Kelly1c301dc2018-08-09 21:09:38 +00009966 bases[NumBases - 1].getEndLoc());
Richard Trieue13eabe2017-09-30 02:19:17 +00009967 };
9968
9969 if (FirstNumBases != SecondNumBases) {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -08009970 ODRDiagBaseError(FirstRecord->getLocation(), GetSourceRange(FirstDD),
9971 NumBases)
Richard Trieue13eabe2017-09-30 02:19:17 +00009972 << FirstNumBases;
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -08009973 ODRDiagBaseNote(SecondRecord->getLocation(), GetSourceRange(SecondDD),
9974 NumBases)
Richard Trieue13eabe2017-09-30 02:19:17 +00009975 << SecondNumBases;
9976 Diagnosed = true;
9977 break;
9978 }
9979
9980 if (FirstNumVBases != SecondNumVBases) {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -08009981 ODRDiagBaseError(FirstRecord->getLocation(), GetSourceRange(FirstDD),
9982 NumVBases)
Richard Trieue13eabe2017-09-30 02:19:17 +00009983 << FirstNumVBases;
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -08009984 ODRDiagBaseNote(SecondRecord->getLocation(), GetSourceRange(SecondDD),
9985 NumVBases)
Richard Trieue13eabe2017-09-30 02:19:17 +00009986 << SecondNumVBases;
9987 Diagnosed = true;
9988 break;
9989 }
9990
9991 auto FirstBases = FirstDD->bases();
9992 auto SecondBases = SecondDD->bases();
9993 unsigned i = 0;
9994 for (i = 0; i < FirstNumBases; ++i) {
9995 auto FirstBase = FirstBases[i];
9996 auto SecondBase = SecondBases[i];
9997 if (ComputeQualTypeODRHash(FirstBase.getType()) !=
9998 ComputeQualTypeODRHash(SecondBase.getType())) {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -08009999 ODRDiagBaseError(FirstRecord->getLocation(),
10000 FirstBase.getSourceRange(), BaseType)
Richard Trieue13eabe2017-09-30 02:19:17 +000010001 << (i + 1) << FirstBase.getType();
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010002 ODRDiagBaseNote(SecondRecord->getLocation(),
10003 SecondBase.getSourceRange(), BaseType)
Richard Trieue13eabe2017-09-30 02:19:17 +000010004 << (i + 1) << SecondBase.getType();
10005 break;
10006 }
10007
10008 if (FirstBase.isVirtual() != SecondBase.isVirtual()) {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010009 ODRDiagBaseError(FirstRecord->getLocation(),
10010 FirstBase.getSourceRange(), BaseVirtual)
Richard Trieue13eabe2017-09-30 02:19:17 +000010011 << (i + 1) << FirstBase.isVirtual() << FirstBase.getType();
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010012 ODRDiagBaseNote(SecondRecord->getLocation(),
10013 SecondBase.getSourceRange(), BaseVirtual)
Richard Trieue13eabe2017-09-30 02:19:17 +000010014 << (i + 1) << SecondBase.isVirtual() << SecondBase.getType();
10015 break;
10016 }
10017
10018 if (FirstBase.getAccessSpecifierAsWritten() !=
10019 SecondBase.getAccessSpecifierAsWritten()) {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010020 ODRDiagBaseError(FirstRecord->getLocation(),
10021 FirstBase.getSourceRange(), BaseAccess)
Richard Trieue13eabe2017-09-30 02:19:17 +000010022 << (i + 1) << FirstBase.getType()
10023 << (int)FirstBase.getAccessSpecifierAsWritten();
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010024 ODRDiagBaseNote(SecondRecord->getLocation(),
10025 SecondBase.getSourceRange(), BaseAccess)
Richard Trieue13eabe2017-09-30 02:19:17 +000010026 << (i + 1) << SecondBase.getType()
10027 << (int)SecondBase.getAccessSpecifierAsWritten();
10028 break;
10029 }
10030 }
10031
10032 if (i != FirstNumBases) {
10033 Diagnosed = true;
10034 break;
10035 }
10036 }
10037
Richard Trieu498117b2017-08-23 02:43:59 +000010038 const ClassTemplateDecl *FirstTemplate =
10039 FirstRecord->getDescribedClassTemplate();
10040 const ClassTemplateDecl *SecondTemplate =
10041 SecondRecord->getDescribedClassTemplate();
10042
10043 assert(!FirstTemplate == !SecondTemplate &&
10044 "Both pointers should be null or non-null");
10045
10046 enum ODRTemplateDifference {
10047 ParamEmptyName,
10048 ParamName,
10049 ParamSingleDefaultArgument,
10050 ParamDifferentDefaultArgument,
10051 };
10052
10053 if (FirstTemplate && SecondTemplate) {
10054 DeclHashes FirstTemplateHashes;
10055 DeclHashes SecondTemplateHashes;
Richard Trieu498117b2017-08-23 02:43:59 +000010056
10057 auto PopulateTemplateParameterHashs =
Richard Trieue6caa262017-12-23 00:41:01 +000010058 [&ComputeSubDeclODRHash](DeclHashes &Hashes,
10059 const ClassTemplateDecl *TD) {
Richard Trieu498117b2017-08-23 02:43:59 +000010060 for (auto *D : TD->getTemplateParameters()->asArray()) {
Richard Trieue6caa262017-12-23 00:41:01 +000010061 Hashes.emplace_back(D, ComputeSubDeclODRHash(D));
Richard Trieu498117b2017-08-23 02:43:59 +000010062 }
10063 };
10064
10065 PopulateTemplateParameterHashs(FirstTemplateHashes, FirstTemplate);
10066 PopulateTemplateParameterHashs(SecondTemplateHashes, SecondTemplate);
10067
10068 assert(FirstTemplateHashes.size() == SecondTemplateHashes.size() &&
10069 "Number of template parameters should be equal.");
10070
10071 auto FirstIt = FirstTemplateHashes.begin();
10072 auto FirstEnd = FirstTemplateHashes.end();
10073 auto SecondIt = SecondTemplateHashes.begin();
10074 for (; FirstIt != FirstEnd; ++FirstIt, ++SecondIt) {
10075 if (FirstIt->second == SecondIt->second)
10076 continue;
10077
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010078 auto ODRDiagTemplateError = [FirstRecord, &FirstModule, this](
10079 SourceLocation Loc, SourceRange Range,
10080 ODRTemplateDifference DiffType) {
Richard Trieu498117b2017-08-23 02:43:59 +000010081 return Diag(Loc, diag::err_module_odr_violation_template_parameter)
10082 << FirstRecord << FirstModule.empty() << FirstModule << Range
10083 << DiffType;
10084 };
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010085 auto ODRDiagTemplateNote = [&SecondModule, this](
10086 SourceLocation Loc, SourceRange Range,
10087 ODRTemplateDifference DiffType) {
Richard Trieu498117b2017-08-23 02:43:59 +000010088 return Diag(Loc, diag::note_module_odr_violation_template_parameter)
10089 << SecondModule << Range << DiffType;
10090 };
10091
Vedant Kumar48b4f762018-04-14 01:40:48 +000010092 const NamedDecl* FirstDecl = cast<NamedDecl>(FirstIt->first);
10093 const NamedDecl* SecondDecl = cast<NamedDecl>(SecondIt->first);
Richard Trieu498117b2017-08-23 02:43:59 +000010094
10095 assert(FirstDecl->getKind() == SecondDecl->getKind() &&
10096 "Parameter Decl's should be the same kind.");
10097
10098 DeclarationName FirstName = FirstDecl->getDeclName();
10099 DeclarationName SecondName = SecondDecl->getDeclName();
10100
10101 if (FirstName != SecondName) {
10102 const bool FirstNameEmpty =
10103 FirstName.isIdentifier() && !FirstName.getAsIdentifierInfo();
10104 const bool SecondNameEmpty =
10105 SecondName.isIdentifier() && !SecondName.getAsIdentifierInfo();
10106 assert((!FirstNameEmpty || !SecondNameEmpty) &&
10107 "Both template parameters cannot be unnamed.");
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010108 ODRDiagTemplateError(FirstDecl->getLocation(),
10109 FirstDecl->getSourceRange(),
10110 FirstNameEmpty ? ParamEmptyName : ParamName)
Richard Trieu498117b2017-08-23 02:43:59 +000010111 << FirstName;
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010112 ODRDiagTemplateNote(SecondDecl->getLocation(),
10113 SecondDecl->getSourceRange(),
10114 SecondNameEmpty ? ParamEmptyName : ParamName)
Richard Trieu498117b2017-08-23 02:43:59 +000010115 << SecondName;
10116 break;
10117 }
10118
10119 switch (FirstDecl->getKind()) {
10120 default:
10121 llvm_unreachable("Invalid template parameter type.");
10122 case Decl::TemplateTypeParm: {
10123 const auto *FirstParam = cast<TemplateTypeParmDecl>(FirstDecl);
10124 const auto *SecondParam = cast<TemplateTypeParmDecl>(SecondDecl);
10125 const bool HasFirstDefaultArgument =
10126 FirstParam->hasDefaultArgument() &&
10127 !FirstParam->defaultArgumentWasInherited();
10128 const bool HasSecondDefaultArgument =
10129 SecondParam->hasDefaultArgument() &&
10130 !SecondParam->defaultArgumentWasInherited();
10131
10132 if (HasFirstDefaultArgument != HasSecondDefaultArgument) {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010133 ODRDiagTemplateError(FirstDecl->getLocation(),
10134 FirstDecl->getSourceRange(),
10135 ParamSingleDefaultArgument)
Richard Trieu498117b2017-08-23 02:43:59 +000010136 << HasFirstDefaultArgument;
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010137 ODRDiagTemplateNote(SecondDecl->getLocation(),
10138 SecondDecl->getSourceRange(),
10139 ParamSingleDefaultArgument)
Richard Trieu498117b2017-08-23 02:43:59 +000010140 << HasSecondDefaultArgument;
10141 break;
10142 }
10143
10144 assert(HasFirstDefaultArgument && HasSecondDefaultArgument &&
10145 "Expecting default arguments.");
10146
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010147 ODRDiagTemplateError(FirstDecl->getLocation(),
10148 FirstDecl->getSourceRange(),
10149 ParamDifferentDefaultArgument);
10150 ODRDiagTemplateNote(SecondDecl->getLocation(),
10151 SecondDecl->getSourceRange(),
10152 ParamDifferentDefaultArgument);
Richard Trieu498117b2017-08-23 02:43:59 +000010153
10154 break;
10155 }
10156 case Decl::NonTypeTemplateParm: {
10157 const auto *FirstParam = cast<NonTypeTemplateParmDecl>(FirstDecl);
10158 const auto *SecondParam = cast<NonTypeTemplateParmDecl>(SecondDecl);
10159 const bool HasFirstDefaultArgument =
10160 FirstParam->hasDefaultArgument() &&
10161 !FirstParam->defaultArgumentWasInherited();
10162 const bool HasSecondDefaultArgument =
10163 SecondParam->hasDefaultArgument() &&
10164 !SecondParam->defaultArgumentWasInherited();
10165
10166 if (HasFirstDefaultArgument != HasSecondDefaultArgument) {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010167 ODRDiagTemplateError(FirstDecl->getLocation(),
10168 FirstDecl->getSourceRange(),
10169 ParamSingleDefaultArgument)
Richard Trieu498117b2017-08-23 02:43:59 +000010170 << HasFirstDefaultArgument;
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010171 ODRDiagTemplateNote(SecondDecl->getLocation(),
10172 SecondDecl->getSourceRange(),
10173 ParamSingleDefaultArgument)
Richard Trieu498117b2017-08-23 02:43:59 +000010174 << HasSecondDefaultArgument;
10175 break;
10176 }
10177
10178 assert(HasFirstDefaultArgument && HasSecondDefaultArgument &&
10179 "Expecting default arguments.");
10180
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010181 ODRDiagTemplateError(FirstDecl->getLocation(),
10182 FirstDecl->getSourceRange(),
10183 ParamDifferentDefaultArgument);
10184 ODRDiagTemplateNote(SecondDecl->getLocation(),
10185 SecondDecl->getSourceRange(),
10186 ParamDifferentDefaultArgument);
Richard Trieu498117b2017-08-23 02:43:59 +000010187
10188 break;
10189 }
10190 case Decl::TemplateTemplateParm: {
10191 const auto *FirstParam = cast<TemplateTemplateParmDecl>(FirstDecl);
10192 const auto *SecondParam =
10193 cast<TemplateTemplateParmDecl>(SecondDecl);
10194 const bool HasFirstDefaultArgument =
10195 FirstParam->hasDefaultArgument() &&
10196 !FirstParam->defaultArgumentWasInherited();
10197 const bool HasSecondDefaultArgument =
10198 SecondParam->hasDefaultArgument() &&
10199 !SecondParam->defaultArgumentWasInherited();
10200
10201 if (HasFirstDefaultArgument != HasSecondDefaultArgument) {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010202 ODRDiagTemplateError(FirstDecl->getLocation(),
10203 FirstDecl->getSourceRange(),
10204 ParamSingleDefaultArgument)
Richard Trieu498117b2017-08-23 02:43:59 +000010205 << HasFirstDefaultArgument;
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010206 ODRDiagTemplateNote(SecondDecl->getLocation(),
10207 SecondDecl->getSourceRange(),
10208 ParamSingleDefaultArgument)
Richard Trieu498117b2017-08-23 02:43:59 +000010209 << HasSecondDefaultArgument;
10210 break;
10211 }
10212
10213 assert(HasFirstDefaultArgument && HasSecondDefaultArgument &&
10214 "Expecting default arguments.");
10215
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010216 ODRDiagTemplateError(FirstDecl->getLocation(),
10217 FirstDecl->getSourceRange(),
10218 ParamDifferentDefaultArgument);
10219 ODRDiagTemplateNote(SecondDecl->getLocation(),
10220 SecondDecl->getSourceRange(),
10221 ParamDifferentDefaultArgument);
Richard Trieu498117b2017-08-23 02:43:59 +000010222
10223 break;
10224 }
10225 }
10226
10227 break;
10228 }
10229
10230 if (FirstIt != FirstEnd) {
10231 Diagnosed = true;
10232 break;
10233 }
10234 }
10235
Richard Trieue7f7ed22017-02-22 01:11:25 +000010236 DeclHashes FirstHashes;
10237 DeclHashes SecondHashes;
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010238 const DeclContext *DC = FirstRecord;
10239 PopulateHashes(FirstHashes, FirstRecord, DC);
10240 PopulateHashes(SecondHashes, SecondRecord, DC);
Richard Trieue7f7ed22017-02-22 01:11:25 +000010241
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010242 auto DR = FindTypeDiffs(FirstHashes, SecondHashes);
10243 ODRMismatchDecl FirstDiffType = DR.FirstDiffType;
10244 ODRMismatchDecl SecondDiffType = DR.SecondDiffType;
10245 Decl *FirstDecl = DR.FirstDecl;
10246 Decl *SecondDecl = DR.SecondDecl;
Richard Trieue7f7ed22017-02-22 01:11:25 +000010247
10248 if (FirstDiffType == Other || SecondDiffType == Other) {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010249 DiagnoseODRUnexpected(DR, FirstRecord, FirstModule, SecondRecord,
10250 SecondModule);
Richard Trieue7f7ed22017-02-22 01:11:25 +000010251 Diagnosed = true;
10252 break;
10253 }
10254
10255 if (FirstDiffType != SecondDiffType) {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010256 DiagnoseODRMismatch(DR, FirstRecord, FirstModule, SecondRecord,
10257 SecondModule);
Richard Trieue7f7ed22017-02-22 01:11:25 +000010258 Diagnosed = true;
10259 break;
10260 }
10261
Richard Trieu639d7b62017-02-22 22:22:42 +000010262 assert(FirstDiffType == SecondDiffType);
10263
Richard Trieu639d7b62017-02-22 22:22:42 +000010264 switch (FirstDiffType) {
10265 case Other:
10266 case EndOfClass:
10267 case PublicSpecifer:
10268 case PrivateSpecifer:
10269 case ProtectedSpecifer:
10270 llvm_unreachable("Invalid diff type");
10271
10272 case StaticAssert: {
Vedant Kumar48b4f762018-04-14 01:40:48 +000010273 StaticAssertDecl *FirstSA = cast<StaticAssertDecl>(FirstDecl);
10274 StaticAssertDecl *SecondSA = cast<StaticAssertDecl>(SecondDecl);
Richard Trieu639d7b62017-02-22 22:22:42 +000010275
10276 Expr *FirstExpr = FirstSA->getAssertExpr();
10277 Expr *SecondExpr = SecondSA->getAssertExpr();
10278 unsigned FirstODRHash = ComputeODRHash(FirstExpr);
10279 unsigned SecondODRHash = ComputeODRHash(SecondExpr);
10280 if (FirstODRHash != SecondODRHash) {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010281 ODRDiagDeclError(FirstRecord, FirstModule, FirstExpr->getBeginLoc(),
10282 FirstExpr->getSourceRange(), StaticAssertCondition);
10283 ODRDiagDeclNote(SecondModule, SecondExpr->getBeginLoc(),
10284 SecondExpr->getSourceRange(), StaticAssertCondition);
Richard Trieu639d7b62017-02-22 22:22:42 +000010285 Diagnosed = true;
10286 break;
10287 }
10288
10289 StringLiteral *FirstStr = FirstSA->getMessage();
10290 StringLiteral *SecondStr = SecondSA->getMessage();
10291 assert((FirstStr || SecondStr) && "Both messages cannot be empty");
10292 if ((FirstStr && !SecondStr) || (!FirstStr && SecondStr)) {
10293 SourceLocation FirstLoc, SecondLoc;
10294 SourceRange FirstRange, SecondRange;
10295 if (FirstStr) {
Stephen Kellyf2ceec42018-08-09 21:08:08 +000010296 FirstLoc = FirstStr->getBeginLoc();
Richard Trieu639d7b62017-02-22 22:22:42 +000010297 FirstRange = FirstStr->getSourceRange();
10298 } else {
Stephen Kellyf2ceec42018-08-09 21:08:08 +000010299 FirstLoc = FirstSA->getBeginLoc();
Richard Trieu639d7b62017-02-22 22:22:42 +000010300 FirstRange = FirstSA->getSourceRange();
10301 }
10302 if (SecondStr) {
Stephen Kellyf2ceec42018-08-09 21:08:08 +000010303 SecondLoc = SecondStr->getBeginLoc();
Richard Trieu639d7b62017-02-22 22:22:42 +000010304 SecondRange = SecondStr->getSourceRange();
10305 } else {
Stephen Kellyf2ceec42018-08-09 21:08:08 +000010306 SecondLoc = SecondSA->getBeginLoc();
Richard Trieu639d7b62017-02-22 22:22:42 +000010307 SecondRange = SecondSA->getSourceRange();
10308 }
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010309 ODRDiagDeclError(FirstRecord, FirstModule, FirstLoc, FirstRange,
10310 StaticAssertOnlyMessage)
Richard Trieu639d7b62017-02-22 22:22:42 +000010311 << (FirstStr == nullptr);
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010312 ODRDiagDeclNote(SecondModule, SecondLoc, SecondRange,
10313 StaticAssertOnlyMessage)
Richard Trieu639d7b62017-02-22 22:22:42 +000010314 << (SecondStr == nullptr);
10315 Diagnosed = true;
10316 break;
10317 }
10318
10319 if (FirstStr && SecondStr &&
10320 FirstStr->getString() != SecondStr->getString()) {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010321 ODRDiagDeclError(FirstRecord, FirstModule, FirstStr->getBeginLoc(),
10322 FirstStr->getSourceRange(), StaticAssertMessage);
10323 ODRDiagDeclNote(SecondModule, SecondStr->getBeginLoc(),
10324 SecondStr->getSourceRange(), StaticAssertMessage);
Richard Trieu639d7b62017-02-22 22:22:42 +000010325 Diagnosed = true;
10326 break;
10327 }
10328 break;
10329 }
Richard Trieud0786092017-02-23 00:23:01 +000010330 case Field: {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010331 Diagnosed = ODRDiagField(FirstRecord, FirstModule, SecondModule,
10332 cast<FieldDecl>(FirstDecl),
10333 cast<FieldDecl>(SecondDecl));
Richard Trieud0786092017-02-23 00:23:01 +000010334 break;
10335 }
Richard Trieu48143742017-02-28 21:24:38 +000010336 case CXXMethod: {
Richard Trieu1c71d512017-07-15 02:55:13 +000010337 enum {
10338 DiagMethod,
10339 DiagConstructor,
10340 DiagDestructor,
10341 } FirstMethodType,
10342 SecondMethodType;
10343 auto GetMethodTypeForDiagnostics = [](const CXXMethodDecl* D) {
10344 if (isa<CXXConstructorDecl>(D)) return DiagConstructor;
10345 if (isa<CXXDestructorDecl>(D)) return DiagDestructor;
10346 return DiagMethod;
10347 };
Vedant Kumar48b4f762018-04-14 01:40:48 +000010348 const CXXMethodDecl *FirstMethod = cast<CXXMethodDecl>(FirstDecl);
10349 const CXXMethodDecl *SecondMethod = cast<CXXMethodDecl>(SecondDecl);
Richard Trieu1c71d512017-07-15 02:55:13 +000010350 FirstMethodType = GetMethodTypeForDiagnostics(FirstMethod);
10351 SecondMethodType = GetMethodTypeForDiagnostics(SecondMethod);
Richard Trieu583e2c12017-03-04 00:08:58 +000010352 auto FirstName = FirstMethod->getDeclName();
10353 auto SecondName = SecondMethod->getDeclName();
Richard Trieu1c71d512017-07-15 02:55:13 +000010354 if (FirstMethodType != SecondMethodType || FirstName != SecondName) {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010355 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(),
10356 FirstMethod->getSourceRange(), MethodName)
Richard Trieu1c71d512017-07-15 02:55:13 +000010357 << FirstMethodType << FirstName;
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010358 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10359 SecondMethod->getSourceRange(), MethodName)
Richard Trieu1c71d512017-07-15 02:55:13 +000010360 << SecondMethodType << SecondName;
Richard Trieu48143742017-02-28 21:24:38 +000010361
10362 Diagnosed = true;
10363 break;
10364 }
10365
Richard Trieu27c1b1a2018-07-10 01:40:50 +000010366 const bool FirstDeleted = FirstMethod->isDeletedAsWritten();
10367 const bool SecondDeleted = SecondMethod->isDeletedAsWritten();
Richard Trieu583e2c12017-03-04 00:08:58 +000010368 if (FirstDeleted != SecondDeleted) {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010369 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(),
10370 FirstMethod->getSourceRange(), MethodDeleted)
Richard Trieu1c71d512017-07-15 02:55:13 +000010371 << FirstMethodType << FirstName << FirstDeleted;
Richard Trieu583e2c12017-03-04 00:08:58 +000010372
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010373 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10374 SecondMethod->getSourceRange(), MethodDeleted)
Richard Trieu1c71d512017-07-15 02:55:13 +000010375 << SecondMethodType << SecondName << SecondDeleted;
Richard Trieu583e2c12017-03-04 00:08:58 +000010376 Diagnosed = true;
10377 break;
10378 }
10379
Richard Trieu27c1b1a2018-07-10 01:40:50 +000010380 const bool FirstDefaulted = FirstMethod->isExplicitlyDefaulted();
10381 const bool SecondDefaulted = SecondMethod->isExplicitlyDefaulted();
10382 if (FirstDefaulted != SecondDefaulted) {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010383 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(),
10384 FirstMethod->getSourceRange(), MethodDefaulted)
Richard Trieu27c1b1a2018-07-10 01:40:50 +000010385 << FirstMethodType << FirstName << FirstDefaulted;
10386
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010387 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10388 SecondMethod->getSourceRange(), MethodDefaulted)
Richard Trieu27c1b1a2018-07-10 01:40:50 +000010389 << SecondMethodType << SecondName << SecondDefaulted;
10390 Diagnosed = true;
10391 break;
10392 }
10393
Richard Trieu583e2c12017-03-04 00:08:58 +000010394 const bool FirstVirtual = FirstMethod->isVirtualAsWritten();
10395 const bool SecondVirtual = SecondMethod->isVirtualAsWritten();
10396 const bool FirstPure = FirstMethod->isPure();
10397 const bool SecondPure = SecondMethod->isPure();
10398 if ((FirstVirtual || SecondVirtual) &&
10399 (FirstVirtual != SecondVirtual || FirstPure != SecondPure)) {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010400 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(),
10401 FirstMethod->getSourceRange(), MethodVirtual)
Richard Trieu1c71d512017-07-15 02:55:13 +000010402 << FirstMethodType << FirstName << FirstPure << FirstVirtual;
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010403 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10404 SecondMethod->getSourceRange(), MethodVirtual)
Richard Trieu1c71d512017-07-15 02:55:13 +000010405 << SecondMethodType << SecondName << SecondPure << SecondVirtual;
Richard Trieu583e2c12017-03-04 00:08:58 +000010406 Diagnosed = true;
10407 break;
10408 }
10409
10410 // CXXMethodDecl::isStatic uses the canonical Decl. With Decl merging,
10411 // FirstDecl is the canonical Decl of SecondDecl, so the storage
10412 // class needs to be checked instead.
10413 const auto FirstStorage = FirstMethod->getStorageClass();
10414 const auto SecondStorage = SecondMethod->getStorageClass();
10415 const bool FirstStatic = FirstStorage == SC_Static;
10416 const bool SecondStatic = SecondStorage == SC_Static;
10417 if (FirstStatic != SecondStatic) {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010418 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(),
10419 FirstMethod->getSourceRange(), MethodStatic)
Richard Trieu1c71d512017-07-15 02:55:13 +000010420 << FirstMethodType << FirstName << FirstStatic;
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010421 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10422 SecondMethod->getSourceRange(), MethodStatic)
Richard Trieu1c71d512017-07-15 02:55:13 +000010423 << SecondMethodType << SecondName << SecondStatic;
Richard Trieu583e2c12017-03-04 00:08:58 +000010424 Diagnosed = true;
10425 break;
10426 }
10427
10428 const bool FirstVolatile = FirstMethod->isVolatile();
10429 const bool SecondVolatile = SecondMethod->isVolatile();
10430 if (FirstVolatile != SecondVolatile) {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010431 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(),
10432 FirstMethod->getSourceRange(), MethodVolatile)
Richard Trieu1c71d512017-07-15 02:55:13 +000010433 << FirstMethodType << FirstName << FirstVolatile;
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010434 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10435 SecondMethod->getSourceRange(), MethodVolatile)
Richard Trieu1c71d512017-07-15 02:55:13 +000010436 << SecondMethodType << SecondName << SecondVolatile;
Richard Trieu583e2c12017-03-04 00:08:58 +000010437 Diagnosed = true;
10438 break;
10439 }
10440
10441 const bool FirstConst = FirstMethod->isConst();
10442 const bool SecondConst = SecondMethod->isConst();
10443 if (FirstConst != SecondConst) {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010444 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(),
10445 FirstMethod->getSourceRange(), MethodConst)
Richard Trieu1c71d512017-07-15 02:55:13 +000010446 << FirstMethodType << FirstName << FirstConst;
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010447 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10448 SecondMethod->getSourceRange(), MethodConst)
Richard Trieu1c71d512017-07-15 02:55:13 +000010449 << SecondMethodType << SecondName << SecondConst;
Richard Trieu583e2c12017-03-04 00:08:58 +000010450 Diagnosed = true;
10451 break;
10452 }
10453
10454 const bool FirstInline = FirstMethod->isInlineSpecified();
10455 const bool SecondInline = SecondMethod->isInlineSpecified();
10456 if (FirstInline != SecondInline) {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010457 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(),
10458 FirstMethod->getSourceRange(), MethodInline)
Richard Trieu1c71d512017-07-15 02:55:13 +000010459 << FirstMethodType << FirstName << FirstInline;
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010460 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10461 SecondMethod->getSourceRange(), MethodInline)
Richard Trieu1c71d512017-07-15 02:55:13 +000010462 << SecondMethodType << SecondName << SecondInline;
Richard Trieu583e2c12017-03-04 00:08:58 +000010463 Diagnosed = true;
10464 break;
10465 }
10466
Richard Trieu02552272017-05-02 23:58:52 +000010467 const unsigned FirstNumParameters = FirstMethod->param_size();
10468 const unsigned SecondNumParameters = SecondMethod->param_size();
10469 if (FirstNumParameters != SecondNumParameters) {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010470 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(),
10471 FirstMethod->getSourceRange(),
10472 MethodNumberParameters)
Richard Trieu1c71d512017-07-15 02:55:13 +000010473 << FirstMethodType << FirstName << FirstNumParameters;
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010474 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10475 SecondMethod->getSourceRange(),
10476 MethodNumberParameters)
Richard Trieu1c71d512017-07-15 02:55:13 +000010477 << SecondMethodType << SecondName << SecondNumParameters;
Richard Trieu02552272017-05-02 23:58:52 +000010478 Diagnosed = true;
10479 break;
10480 }
10481
10482 // Need this status boolean to know when break out of the switch.
10483 bool ParameterMismatch = false;
10484 for (unsigned I = 0; I < FirstNumParameters; ++I) {
10485 const ParmVarDecl *FirstParam = FirstMethod->getParamDecl(I);
10486 const ParmVarDecl *SecondParam = SecondMethod->getParamDecl(I);
10487
10488 QualType FirstParamType = FirstParam->getType();
10489 QualType SecondParamType = SecondParam->getType();
10490 if (FirstParamType != SecondParamType &&
10491 ComputeQualTypeODRHash(FirstParamType) !=
10492 ComputeQualTypeODRHash(SecondParamType)) {
Vedant Kumar48b4f762018-04-14 01:40:48 +000010493 if (const DecayedType *ParamDecayedType =
Richard Trieu02552272017-05-02 23:58:52 +000010494 FirstParamType->getAs<DecayedType>()) {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010495 ODRDiagDeclError(
10496 FirstRecord, FirstModule, FirstMethod->getLocation(),
10497 FirstMethod->getSourceRange(), MethodParameterType)
Richard Trieu1c71d512017-07-15 02:55:13 +000010498 << FirstMethodType << FirstName << (I + 1) << FirstParamType
10499 << true << ParamDecayedType->getOriginalType();
Richard Trieu02552272017-05-02 23:58:52 +000010500 } else {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010501 ODRDiagDeclError(
10502 FirstRecord, FirstModule, FirstMethod->getLocation(),
10503 FirstMethod->getSourceRange(), MethodParameterType)
Richard Trieu1c71d512017-07-15 02:55:13 +000010504 << FirstMethodType << FirstName << (I + 1) << FirstParamType
10505 << false;
Richard Trieu02552272017-05-02 23:58:52 +000010506 }
10507
Vedant Kumar48b4f762018-04-14 01:40:48 +000010508 if (const DecayedType *ParamDecayedType =
Richard Trieu02552272017-05-02 23:58:52 +000010509 SecondParamType->getAs<DecayedType>()) {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010510 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10511 SecondMethod->getSourceRange(),
10512 MethodParameterType)
Richard Trieu1c71d512017-07-15 02:55:13 +000010513 << SecondMethodType << SecondName << (I + 1)
10514 << SecondParamType << true
Richard Trieu02552272017-05-02 23:58:52 +000010515 << ParamDecayedType->getOriginalType();
10516 } else {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010517 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10518 SecondMethod->getSourceRange(),
10519 MethodParameterType)
Richard Trieu1c71d512017-07-15 02:55:13 +000010520 << SecondMethodType << SecondName << (I + 1)
10521 << SecondParamType << false;
Richard Trieu02552272017-05-02 23:58:52 +000010522 }
10523 ParameterMismatch = true;
10524 break;
10525 }
10526
10527 DeclarationName FirstParamName = FirstParam->getDeclName();
10528 DeclarationName SecondParamName = SecondParam->getDeclName();
10529 if (FirstParamName != SecondParamName) {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010530 ODRDiagDeclError(FirstRecord, FirstModule,
10531 FirstMethod->getLocation(),
10532 FirstMethod->getSourceRange(), MethodParameterName)
Richard Trieu1c71d512017-07-15 02:55:13 +000010533 << FirstMethodType << FirstName << (I + 1) << FirstParamName;
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010534 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10535 SecondMethod->getSourceRange(), MethodParameterName)
Richard Trieu1c71d512017-07-15 02:55:13 +000010536 << SecondMethodType << SecondName << (I + 1) << SecondParamName;
Richard Trieu02552272017-05-02 23:58:52 +000010537 ParameterMismatch = true;
10538 break;
10539 }
Richard Trieu6e13ff32017-06-16 02:44:29 +000010540
10541 const Expr *FirstInit = FirstParam->getInit();
10542 const Expr *SecondInit = SecondParam->getInit();
10543 if ((FirstInit == nullptr) != (SecondInit == nullptr)) {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010544 ODRDiagDeclError(FirstRecord, FirstModule,
10545 FirstMethod->getLocation(),
10546 FirstMethod->getSourceRange(),
10547 MethodParameterSingleDefaultArgument)
Richard Trieu1c71d512017-07-15 02:55:13 +000010548 << FirstMethodType << FirstName << (I + 1)
10549 << (FirstInit == nullptr)
Richard Trieu6e13ff32017-06-16 02:44:29 +000010550 << (FirstInit ? FirstInit->getSourceRange() : SourceRange());
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010551 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10552 SecondMethod->getSourceRange(),
10553 MethodParameterSingleDefaultArgument)
Richard Trieu1c71d512017-07-15 02:55:13 +000010554 << SecondMethodType << SecondName << (I + 1)
10555 << (SecondInit == nullptr)
Richard Trieu6e13ff32017-06-16 02:44:29 +000010556 << (SecondInit ? SecondInit->getSourceRange() : SourceRange());
10557 ParameterMismatch = true;
10558 break;
10559 }
10560
10561 if (FirstInit && SecondInit &&
10562 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010563 ODRDiagDeclError(FirstRecord, FirstModule,
10564 FirstMethod->getLocation(),
10565 FirstMethod->getSourceRange(),
10566 MethodParameterDifferentDefaultArgument)
Richard Trieu1c71d512017-07-15 02:55:13 +000010567 << FirstMethodType << FirstName << (I + 1)
10568 << FirstInit->getSourceRange();
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010569 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10570 SecondMethod->getSourceRange(),
10571 MethodParameterDifferentDefaultArgument)
Richard Trieu1c71d512017-07-15 02:55:13 +000010572 << SecondMethodType << SecondName << (I + 1)
10573 << SecondInit->getSourceRange();
Richard Trieu6e13ff32017-06-16 02:44:29 +000010574 ParameterMismatch = true;
10575 break;
10576
10577 }
Richard Trieu02552272017-05-02 23:58:52 +000010578 }
10579
10580 if (ParameterMismatch) {
10581 Diagnosed = true;
10582 break;
10583 }
10584
Richard Trieu7282d322018-04-25 00:31:15 +000010585 const auto *FirstTemplateArgs =
10586 FirstMethod->getTemplateSpecializationArgs();
10587 const auto *SecondTemplateArgs =
10588 SecondMethod->getTemplateSpecializationArgs();
10589
10590 if ((FirstTemplateArgs && !SecondTemplateArgs) ||
10591 (!FirstTemplateArgs && SecondTemplateArgs)) {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010592 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(),
10593 FirstMethod->getSourceRange(),
10594 MethodNoTemplateArguments)
Richard Trieu7282d322018-04-25 00:31:15 +000010595 << FirstMethodType << FirstName << (FirstTemplateArgs != nullptr);
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010596 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10597 SecondMethod->getSourceRange(),
10598 MethodNoTemplateArguments)
Richard Trieu7282d322018-04-25 00:31:15 +000010599 << SecondMethodType << SecondName
10600 << (SecondTemplateArgs != nullptr);
10601
10602 Diagnosed = true;
10603 break;
10604 }
10605
10606 if (FirstTemplateArgs && SecondTemplateArgs) {
10607 // Remove pack expansions from argument list.
10608 auto ExpandTemplateArgumentList =
10609 [](const TemplateArgumentList *TAL) {
10610 llvm::SmallVector<const TemplateArgument *, 8> ExpandedList;
10611 for (const TemplateArgument &TA : TAL->asArray()) {
10612 if (TA.getKind() != TemplateArgument::Pack) {
10613 ExpandedList.push_back(&TA);
10614 continue;
10615 }
10616 for (const TemplateArgument &PackTA : TA.getPackAsArray()) {
10617 ExpandedList.push_back(&PackTA);
10618 }
10619 }
10620 return ExpandedList;
10621 };
10622 llvm::SmallVector<const TemplateArgument *, 8> FirstExpandedList =
10623 ExpandTemplateArgumentList(FirstTemplateArgs);
10624 llvm::SmallVector<const TemplateArgument *, 8> SecondExpandedList =
10625 ExpandTemplateArgumentList(SecondTemplateArgs);
10626
10627 if (FirstExpandedList.size() != SecondExpandedList.size()) {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010628 ODRDiagDeclError(FirstRecord, FirstModule,
10629 FirstMethod->getLocation(),
10630 FirstMethod->getSourceRange(),
10631 MethodDifferentNumberTemplateArguments)
Richard Trieu7282d322018-04-25 00:31:15 +000010632 << FirstMethodType << FirstName
10633 << (unsigned)FirstExpandedList.size();
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010634 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10635 SecondMethod->getSourceRange(),
10636 MethodDifferentNumberTemplateArguments)
Richard Trieu7282d322018-04-25 00:31:15 +000010637 << SecondMethodType << SecondName
10638 << (unsigned)SecondExpandedList.size();
10639
10640 Diagnosed = true;
10641 break;
10642 }
10643
10644 bool TemplateArgumentMismatch = false;
10645 for (unsigned i = 0, e = FirstExpandedList.size(); i != e; ++i) {
10646 const TemplateArgument &FirstTA = *FirstExpandedList[i],
10647 &SecondTA = *SecondExpandedList[i];
10648 if (ComputeTemplateArgumentODRHash(FirstTA) ==
10649 ComputeTemplateArgumentODRHash(SecondTA)) {
10650 continue;
10651 }
10652
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010653 ODRDiagDeclError(
10654 FirstRecord, FirstModule, FirstMethod->getLocation(),
10655 FirstMethod->getSourceRange(), MethodDifferentTemplateArgument)
Richard Trieu7282d322018-04-25 00:31:15 +000010656 << FirstMethodType << FirstName << FirstTA << i + 1;
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010657 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10658 SecondMethod->getSourceRange(),
10659 MethodDifferentTemplateArgument)
Richard Trieu7282d322018-04-25 00:31:15 +000010660 << SecondMethodType << SecondName << SecondTA << i + 1;
10661
10662 TemplateArgumentMismatch = true;
10663 break;
10664 }
10665
10666 if (TemplateArgumentMismatch) {
10667 Diagnosed = true;
10668 break;
10669 }
10670 }
Richard Trieu27c1b1a2018-07-10 01:40:50 +000010671
10672 // Compute the hash of the method as if it has no body.
10673 auto ComputeCXXMethodODRHash = [&Hash](const CXXMethodDecl *D) {
10674 Hash.clear();
10675 Hash.AddFunctionDecl(D, true /*SkipBody*/);
10676 return Hash.CalculateHash();
10677 };
10678
10679 // Compare the hash generated to the hash stored. A difference means
10680 // that a body was present in the original source. Due to merging,
10681 // the stardard way of detecting a body will not work.
10682 const bool HasFirstBody =
10683 ComputeCXXMethodODRHash(FirstMethod) != FirstMethod->getODRHash();
10684 const bool HasSecondBody =
10685 ComputeCXXMethodODRHash(SecondMethod) != SecondMethod->getODRHash();
10686
10687 if (HasFirstBody != HasSecondBody) {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010688 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(),
10689 FirstMethod->getSourceRange(), MethodSingleBody)
Richard Trieu27c1b1a2018-07-10 01:40:50 +000010690 << FirstMethodType << FirstName << HasFirstBody;
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010691 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10692 SecondMethod->getSourceRange(), MethodSingleBody)
Richard Trieu27c1b1a2018-07-10 01:40:50 +000010693 << SecondMethodType << SecondName << HasSecondBody;
10694 Diagnosed = true;
10695 break;
10696 }
10697
10698 if (HasFirstBody && HasSecondBody) {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010699 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(),
10700 FirstMethod->getSourceRange(), MethodDifferentBody)
Richard Trieu27c1b1a2018-07-10 01:40:50 +000010701 << FirstMethodType << FirstName;
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010702 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10703 SecondMethod->getSourceRange(), MethodDifferentBody)
Richard Trieu27c1b1a2018-07-10 01:40:50 +000010704 << SecondMethodType << SecondName;
10705 Diagnosed = true;
10706 break;
10707 }
10708
Richard Trieu48143742017-02-28 21:24:38 +000010709 break;
10710 }
Richard Trieu11d566a2017-06-12 21:58:22 +000010711 case TypeAlias:
10712 case TypeDef: {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010713 Diagnosed = ODRDiagTypeDefOrAlias(
10714 FirstRecord, FirstModule, SecondModule,
10715 cast<TypedefNameDecl>(FirstDecl), cast<TypedefNameDecl>(SecondDecl),
10716 FirstDiffType == TypeAlias);
Richard Trieu11d566a2017-06-12 21:58:22 +000010717 break;
10718 }
Richard Trieu6e13ff32017-06-16 02:44:29 +000010719 case Var: {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010720 Diagnosed =
10721 ODRDiagVar(FirstRecord, FirstModule, SecondModule,
10722 cast<VarDecl>(FirstDecl), cast<VarDecl>(SecondDecl));
Richard Trieu6e13ff32017-06-16 02:44:29 +000010723 break;
10724 }
Richard Trieuac6a1b62017-07-08 02:04:42 +000010725 case Friend: {
Vedant Kumar48b4f762018-04-14 01:40:48 +000010726 FriendDecl *FirstFriend = cast<FriendDecl>(FirstDecl);
10727 FriendDecl *SecondFriend = cast<FriendDecl>(SecondDecl);
Richard Trieuac6a1b62017-07-08 02:04:42 +000010728
10729 NamedDecl *FirstND = FirstFriend->getFriendDecl();
10730 NamedDecl *SecondND = SecondFriend->getFriendDecl();
10731
10732 TypeSourceInfo *FirstTSI = FirstFriend->getFriendType();
10733 TypeSourceInfo *SecondTSI = SecondFriend->getFriendType();
10734
10735 if (FirstND && SecondND) {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010736 ODRDiagDeclError(FirstRecord, FirstModule,
10737 FirstFriend->getFriendLoc(),
10738 FirstFriend->getSourceRange(), FriendFunction)
Richard Trieuac6a1b62017-07-08 02:04:42 +000010739 << FirstND;
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010740 ODRDiagDeclNote(SecondModule, SecondFriend->getFriendLoc(),
10741 SecondFriend->getSourceRange(), FriendFunction)
Richard Trieuac6a1b62017-07-08 02:04:42 +000010742 << SecondND;
10743
10744 Diagnosed = true;
10745 break;
10746 }
10747
10748 if (FirstTSI && SecondTSI) {
10749 QualType FirstFriendType = FirstTSI->getType();
10750 QualType SecondFriendType = SecondTSI->getType();
10751 assert(ComputeQualTypeODRHash(FirstFriendType) !=
10752 ComputeQualTypeODRHash(SecondFriendType));
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010753 ODRDiagDeclError(FirstRecord, FirstModule,
10754 FirstFriend->getFriendLoc(),
10755 FirstFriend->getSourceRange(), FriendType)
Richard Trieuac6a1b62017-07-08 02:04:42 +000010756 << FirstFriendType;
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010757 ODRDiagDeclNote(SecondModule, SecondFriend->getFriendLoc(),
10758 SecondFriend->getSourceRange(), FriendType)
Richard Trieuac6a1b62017-07-08 02:04:42 +000010759 << SecondFriendType;
10760 Diagnosed = true;
10761 break;
10762 }
10763
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010764 ODRDiagDeclError(FirstRecord, FirstModule, FirstFriend->getFriendLoc(),
10765 FirstFriend->getSourceRange(), FriendTypeFunction)
Richard Trieuac6a1b62017-07-08 02:04:42 +000010766 << (FirstTSI == nullptr);
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010767 ODRDiagDeclNote(SecondModule, SecondFriend->getFriendLoc(),
10768 SecondFriend->getSourceRange(), FriendTypeFunction)
Richard Trieuac6a1b62017-07-08 02:04:42 +000010769 << (SecondTSI == nullptr);
10770
10771 Diagnosed = true;
10772 break;
10773 }
Richard Trieu9359e8f2018-05-30 01:12:26 +000010774 case FunctionTemplate: {
10775 FunctionTemplateDecl *FirstTemplate =
10776 cast<FunctionTemplateDecl>(FirstDecl);
10777 FunctionTemplateDecl *SecondTemplate =
10778 cast<FunctionTemplateDecl>(SecondDecl);
10779
10780 TemplateParameterList *FirstTPL =
10781 FirstTemplate->getTemplateParameters();
10782 TemplateParameterList *SecondTPL =
10783 SecondTemplate->getTemplateParameters();
10784
10785 if (FirstTPL->size() != SecondTPL->size()) {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010786 ODRDiagDeclError(FirstRecord, FirstModule,
10787 FirstTemplate->getLocation(),
10788 FirstTemplate->getSourceRange(),
10789 FunctionTemplateDifferentNumberParameters)
Richard Trieu9359e8f2018-05-30 01:12:26 +000010790 << FirstTemplate << FirstTPL->size();
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010791 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(),
10792 SecondTemplate->getSourceRange(),
10793 FunctionTemplateDifferentNumberParameters)
10794 << SecondTemplate << SecondTPL->size();
Richard Trieu9359e8f2018-05-30 01:12:26 +000010795
10796 Diagnosed = true;
10797 break;
10798 }
10799
10800 bool ParameterMismatch = false;
10801 for (unsigned i = 0, e = FirstTPL->size(); i != e; ++i) {
10802 NamedDecl *FirstParam = FirstTPL->getParam(i);
10803 NamedDecl *SecondParam = SecondTPL->getParam(i);
10804
10805 if (FirstParam->getKind() != SecondParam->getKind()) {
10806 enum {
10807 TemplateTypeParameter,
10808 NonTypeTemplateParameter,
10809 TemplateTemplateParameter,
10810 };
10811 auto GetParamType = [](NamedDecl *D) {
10812 switch (D->getKind()) {
10813 default:
10814 llvm_unreachable("Unexpected template parameter type");
10815 case Decl::TemplateTypeParm:
10816 return TemplateTypeParameter;
10817 case Decl::NonTypeTemplateParm:
10818 return NonTypeTemplateParameter;
10819 case Decl::TemplateTemplateParm:
10820 return TemplateTemplateParameter;
10821 }
10822 };
10823
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010824 ODRDiagDeclError(FirstRecord, FirstModule,
10825 FirstTemplate->getLocation(),
10826 FirstTemplate->getSourceRange(),
10827 FunctionTemplateParameterDifferentKind)
Richard Trieu9359e8f2018-05-30 01:12:26 +000010828 << FirstTemplate << (i + 1) << GetParamType(FirstParam);
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010829 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(),
10830 SecondTemplate->getSourceRange(),
10831 FunctionTemplateParameterDifferentKind)
Richard Trieu9359e8f2018-05-30 01:12:26 +000010832 << SecondTemplate << (i + 1) << GetParamType(SecondParam);
10833
10834 ParameterMismatch = true;
10835 break;
10836 }
10837
10838 if (FirstParam->getName() != SecondParam->getName()) {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010839 ODRDiagDeclError(
10840 FirstRecord, FirstModule, FirstTemplate->getLocation(),
10841 FirstTemplate->getSourceRange(), FunctionTemplateParameterName)
Richard Trieu9359e8f2018-05-30 01:12:26 +000010842 << FirstTemplate << (i + 1) << (bool)FirstParam->getIdentifier()
10843 << FirstParam;
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010844 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(),
10845 SecondTemplate->getSourceRange(),
10846 FunctionTemplateParameterName)
Richard Trieu9359e8f2018-05-30 01:12:26 +000010847 << SecondTemplate << (i + 1)
10848 << (bool)SecondParam->getIdentifier() << SecondParam;
10849 ParameterMismatch = true;
10850 break;
10851 }
10852
10853 if (isa<TemplateTypeParmDecl>(FirstParam) &&
10854 isa<TemplateTypeParmDecl>(SecondParam)) {
10855 TemplateTypeParmDecl *FirstTTPD =
10856 cast<TemplateTypeParmDecl>(FirstParam);
10857 TemplateTypeParmDecl *SecondTTPD =
10858 cast<TemplateTypeParmDecl>(SecondParam);
10859 bool HasFirstDefaultArgument =
10860 FirstTTPD->hasDefaultArgument() &&
10861 !FirstTTPD->defaultArgumentWasInherited();
10862 bool HasSecondDefaultArgument =
10863 SecondTTPD->hasDefaultArgument() &&
10864 !SecondTTPD->defaultArgumentWasInherited();
10865 if (HasFirstDefaultArgument != HasSecondDefaultArgument) {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010866 ODRDiagDeclError(FirstRecord, FirstModule,
10867 FirstTemplate->getLocation(),
10868 FirstTemplate->getSourceRange(),
10869 FunctionTemplateParameterSingleDefaultArgument)
Richard Trieu9359e8f2018-05-30 01:12:26 +000010870 << FirstTemplate << (i + 1) << HasFirstDefaultArgument;
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010871 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(),
10872 SecondTemplate->getSourceRange(),
10873 FunctionTemplateParameterSingleDefaultArgument)
Richard Trieu9359e8f2018-05-30 01:12:26 +000010874 << SecondTemplate << (i + 1) << HasSecondDefaultArgument;
10875 ParameterMismatch = true;
10876 break;
10877 }
10878
10879 if (HasFirstDefaultArgument && HasSecondDefaultArgument) {
10880 QualType FirstType = FirstTTPD->getDefaultArgument();
10881 QualType SecondType = SecondTTPD->getDefaultArgument();
10882 if (ComputeQualTypeODRHash(FirstType) !=
10883 ComputeQualTypeODRHash(SecondType)) {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010884 ODRDiagDeclError(
10885 FirstRecord, FirstModule, FirstTemplate->getLocation(),
10886 FirstTemplate->getSourceRange(),
10887 FunctionTemplateParameterDifferentDefaultArgument)
Richard Trieu9359e8f2018-05-30 01:12:26 +000010888 << FirstTemplate << (i + 1) << FirstType;
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010889 ODRDiagDeclNote(
10890 SecondModule, SecondTemplate->getLocation(),
10891 SecondTemplate->getSourceRange(),
10892 FunctionTemplateParameterDifferentDefaultArgument)
Richard Trieu9359e8f2018-05-30 01:12:26 +000010893 << SecondTemplate << (i + 1) << SecondType;
10894 ParameterMismatch = true;
10895 break;
10896 }
10897 }
10898
10899 if (FirstTTPD->isParameterPack() !=
10900 SecondTTPD->isParameterPack()) {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010901 ODRDiagDeclError(FirstRecord, FirstModule,
10902 FirstTemplate->getLocation(),
10903 FirstTemplate->getSourceRange(),
10904 FunctionTemplatePackParameter)
Richard Trieu9359e8f2018-05-30 01:12:26 +000010905 << FirstTemplate << (i + 1) << FirstTTPD->isParameterPack();
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010906 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(),
10907 SecondTemplate->getSourceRange(),
10908 FunctionTemplatePackParameter)
Richard Trieu9359e8f2018-05-30 01:12:26 +000010909 << SecondTemplate << (i + 1) << SecondTTPD->isParameterPack();
10910 ParameterMismatch = true;
10911 break;
10912 }
10913 }
10914
10915 if (isa<TemplateTemplateParmDecl>(FirstParam) &&
10916 isa<TemplateTemplateParmDecl>(SecondParam)) {
10917 TemplateTemplateParmDecl *FirstTTPD =
10918 cast<TemplateTemplateParmDecl>(FirstParam);
10919 TemplateTemplateParmDecl *SecondTTPD =
10920 cast<TemplateTemplateParmDecl>(SecondParam);
10921
10922 TemplateParameterList *FirstTPL =
10923 FirstTTPD->getTemplateParameters();
10924 TemplateParameterList *SecondTPL =
10925 SecondTTPD->getTemplateParameters();
10926
10927 if (ComputeTemplateParameterListODRHash(FirstTPL) !=
10928 ComputeTemplateParameterListODRHash(SecondTPL)) {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010929 ODRDiagDeclError(FirstRecord, FirstModule,
10930 FirstTemplate->getLocation(),
10931 FirstTemplate->getSourceRange(),
10932 FunctionTemplateParameterDifferentType)
Richard Trieu9359e8f2018-05-30 01:12:26 +000010933 << FirstTemplate << (i + 1);
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010934 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(),
10935 SecondTemplate->getSourceRange(),
10936 FunctionTemplateParameterDifferentType)
Richard Trieu9359e8f2018-05-30 01:12:26 +000010937 << SecondTemplate << (i + 1);
10938 ParameterMismatch = true;
10939 break;
10940 }
10941
10942 bool HasFirstDefaultArgument =
10943 FirstTTPD->hasDefaultArgument() &&
10944 !FirstTTPD->defaultArgumentWasInherited();
10945 bool HasSecondDefaultArgument =
10946 SecondTTPD->hasDefaultArgument() &&
10947 !SecondTTPD->defaultArgumentWasInherited();
10948 if (HasFirstDefaultArgument != HasSecondDefaultArgument) {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010949 ODRDiagDeclError(FirstRecord, FirstModule,
10950 FirstTemplate->getLocation(),
10951 FirstTemplate->getSourceRange(),
10952 FunctionTemplateParameterSingleDefaultArgument)
Richard Trieu9359e8f2018-05-30 01:12:26 +000010953 << FirstTemplate << (i + 1) << HasFirstDefaultArgument;
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010954 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(),
10955 SecondTemplate->getSourceRange(),
10956 FunctionTemplateParameterSingleDefaultArgument)
Richard Trieu9359e8f2018-05-30 01:12:26 +000010957 << SecondTemplate << (i + 1) << HasSecondDefaultArgument;
10958 ParameterMismatch = true;
10959 break;
10960 }
10961
10962 if (HasFirstDefaultArgument && HasSecondDefaultArgument) {
10963 TemplateArgument FirstTA =
10964 FirstTTPD->getDefaultArgument().getArgument();
10965 TemplateArgument SecondTA =
10966 SecondTTPD->getDefaultArgument().getArgument();
10967 if (ComputeTemplateArgumentODRHash(FirstTA) !=
10968 ComputeTemplateArgumentODRHash(SecondTA)) {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010969 ODRDiagDeclError(
10970 FirstRecord, FirstModule, FirstTemplate->getLocation(),
10971 FirstTemplate->getSourceRange(),
10972 FunctionTemplateParameterDifferentDefaultArgument)
Richard Trieu9359e8f2018-05-30 01:12:26 +000010973 << FirstTemplate << (i + 1) << FirstTA;
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010974 ODRDiagDeclNote(
10975 SecondModule, SecondTemplate->getLocation(),
10976 SecondTemplate->getSourceRange(),
10977 FunctionTemplateParameterDifferentDefaultArgument)
Richard Trieu9359e8f2018-05-30 01:12:26 +000010978 << SecondTemplate << (i + 1) << SecondTA;
10979 ParameterMismatch = true;
10980 break;
10981 }
10982 }
10983
10984 if (FirstTTPD->isParameterPack() !=
10985 SecondTTPD->isParameterPack()) {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010986 ODRDiagDeclError(FirstRecord, FirstModule,
10987 FirstTemplate->getLocation(),
10988 FirstTemplate->getSourceRange(),
10989 FunctionTemplatePackParameter)
Richard Trieu9359e8f2018-05-30 01:12:26 +000010990 << FirstTemplate << (i + 1) << FirstTTPD->isParameterPack();
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080010991 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(),
10992 SecondTemplate->getSourceRange(),
10993 FunctionTemplatePackParameter)
Richard Trieu9359e8f2018-05-30 01:12:26 +000010994 << SecondTemplate << (i + 1) << SecondTTPD->isParameterPack();
10995 ParameterMismatch = true;
10996 break;
10997 }
10998 }
10999
11000 if (isa<NonTypeTemplateParmDecl>(FirstParam) &&
11001 isa<NonTypeTemplateParmDecl>(SecondParam)) {
11002 NonTypeTemplateParmDecl *FirstNTTPD =
11003 cast<NonTypeTemplateParmDecl>(FirstParam);
11004 NonTypeTemplateParmDecl *SecondNTTPD =
11005 cast<NonTypeTemplateParmDecl>(SecondParam);
11006
11007 QualType FirstType = FirstNTTPD->getType();
11008 QualType SecondType = SecondNTTPD->getType();
11009 if (ComputeQualTypeODRHash(FirstType) !=
11010 ComputeQualTypeODRHash(SecondType)) {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080011011 ODRDiagDeclError(FirstRecord, FirstModule,
11012 FirstTemplate->getLocation(),
11013 FirstTemplate->getSourceRange(),
11014 FunctionTemplateParameterDifferentType)
Richard Trieu9359e8f2018-05-30 01:12:26 +000011015 << FirstTemplate << (i + 1);
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080011016 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(),
11017 SecondTemplate->getSourceRange(),
11018 FunctionTemplateParameterDifferentType)
Richard Trieu9359e8f2018-05-30 01:12:26 +000011019 << SecondTemplate << (i + 1);
11020 ParameterMismatch = true;
11021 break;
11022 }
11023
11024 bool HasFirstDefaultArgument =
11025 FirstNTTPD->hasDefaultArgument() &&
11026 !FirstNTTPD->defaultArgumentWasInherited();
11027 bool HasSecondDefaultArgument =
11028 SecondNTTPD->hasDefaultArgument() &&
11029 !SecondNTTPD->defaultArgumentWasInherited();
11030 if (HasFirstDefaultArgument != HasSecondDefaultArgument) {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080011031 ODRDiagDeclError(FirstRecord, FirstModule,
11032 FirstTemplate->getLocation(),
11033 FirstTemplate->getSourceRange(),
11034 FunctionTemplateParameterSingleDefaultArgument)
Richard Trieu9359e8f2018-05-30 01:12:26 +000011035 << FirstTemplate << (i + 1) << HasFirstDefaultArgument;
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080011036 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(),
11037 SecondTemplate->getSourceRange(),
11038 FunctionTemplateParameterSingleDefaultArgument)
Richard Trieu9359e8f2018-05-30 01:12:26 +000011039 << SecondTemplate << (i + 1) << HasSecondDefaultArgument;
11040 ParameterMismatch = true;
11041 break;
11042 }
11043
11044 if (HasFirstDefaultArgument && HasSecondDefaultArgument) {
11045 Expr *FirstDefaultArgument = FirstNTTPD->getDefaultArgument();
11046 Expr *SecondDefaultArgument = SecondNTTPD->getDefaultArgument();
11047 if (ComputeODRHash(FirstDefaultArgument) !=
11048 ComputeODRHash(SecondDefaultArgument)) {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080011049 ODRDiagDeclError(
11050 FirstRecord, FirstModule, FirstTemplate->getLocation(),
11051 FirstTemplate->getSourceRange(),
11052 FunctionTemplateParameterDifferentDefaultArgument)
Richard Trieu9359e8f2018-05-30 01:12:26 +000011053 << FirstTemplate << (i + 1) << FirstDefaultArgument;
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080011054 ODRDiagDeclNote(
11055 SecondModule, SecondTemplate->getLocation(),
11056 SecondTemplate->getSourceRange(),
11057 FunctionTemplateParameterDifferentDefaultArgument)
Richard Trieu9359e8f2018-05-30 01:12:26 +000011058 << SecondTemplate << (i + 1) << SecondDefaultArgument;
11059 ParameterMismatch = true;
11060 break;
11061 }
11062 }
11063
11064 if (FirstNTTPD->isParameterPack() !=
11065 SecondNTTPD->isParameterPack()) {
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080011066 ODRDiagDeclError(FirstRecord, FirstModule,
11067 FirstTemplate->getLocation(),
11068 FirstTemplate->getSourceRange(),
11069 FunctionTemplatePackParameter)
Richard Trieu9359e8f2018-05-30 01:12:26 +000011070 << FirstTemplate << (i + 1) << FirstNTTPD->isParameterPack();
Bruno Cardoso Lopes90f58ea2020-01-22 12:43:19 -080011071 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(),
11072 SecondTemplate->getSourceRange(),
11073 FunctionTemplatePackParameter)
Richard Trieu9359e8f2018-05-30 01:12:26 +000011074 << SecondTemplate << (i + 1)
11075 << SecondNTTPD->isParameterPack();
11076 ParameterMismatch = true;
11077 break;
11078 }
11079 }
11080 }
11081
11082 if (ParameterMismatch) {
11083 Diagnosed = true;
11084 break;
11085 }
11086
11087 break;
11088 }
Richard Trieu639d7b62017-02-22 22:22:42 +000011089 }
11090
Eugene Zelenkob8c9e2a2017-11-08 01:03:16 +000011091 if (Diagnosed)
Richard Trieue7f7ed22017-02-22 01:11:25 +000011092 continue;
11093
Richard Trieu708859a2017-06-08 00:56:21 +000011094 Diag(FirstDecl->getLocation(),
11095 diag::err_module_odr_violation_mismatch_decl_unknown)
11096 << FirstRecord << FirstModule.empty() << FirstModule << FirstDiffType
11097 << FirstDecl->getSourceRange();
11098 Diag(SecondDecl->getLocation(),
11099 diag::note_module_odr_violation_mismatch_decl_unknown)
11100 << SecondModule << FirstDiffType << SecondDecl->getSourceRange();
Richard Trieue7f7ed22017-02-22 01:11:25 +000011101 Diagnosed = true;
Richard Smithcd45dbc2014-04-19 03:48:30 +000011102 }
11103
11104 if (!Diagnosed) {
11105 // All definitions are updates to the same declaration. This happens if a
11106 // module instantiates the declaration of a class template specialization
11107 // and two or more other modules instantiate its definition.
11108 //
11109 // FIXME: Indicate which modules had instantiations of this definition.
11110 // FIXME: How can this even happen?
11111 Diag(Merge.first->getLocation(),
11112 diag::err_module_odr_violation_different_instantiations)
11113 << Merge.first;
11114 }
11115 }
Richard Trieue6caa262017-12-23 00:41:01 +000011116
11117 // Issue ODR failures diagnostics for functions.
11118 for (auto &Merge : FunctionOdrMergeFailures) {
11119 enum ODRFunctionDifference {
11120 ReturnType,
11121 ParameterName,
11122 ParameterType,
11123 ParameterSingleDefaultArgument,
11124 ParameterDifferentDefaultArgument,
11125 FunctionBody,
11126 };
11127
11128 FunctionDecl *FirstFunction = Merge.first;
11129 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstFunction);
11130
11131 bool Diagnosed = false;
11132 for (auto &SecondFunction : Merge.second) {
Vedant Kumar48b4f762018-04-14 01:40:48 +000011133
Richard Trieue6caa262017-12-23 00:41:01 +000011134 if (FirstFunction == SecondFunction)
11135 continue;
11136
11137 std::string SecondModule =
11138 getOwningModuleNameForDiagnostic(SecondFunction);
11139
11140 auto ODRDiagError = [FirstFunction, &FirstModule,
11141 this](SourceLocation Loc, SourceRange Range,
11142 ODRFunctionDifference DiffType) {
11143 return Diag(Loc, diag::err_module_odr_violation_function)
11144 << FirstFunction << FirstModule.empty() << FirstModule << Range
11145 << DiffType;
11146 };
11147 auto ODRDiagNote = [&SecondModule, this](SourceLocation Loc,
11148 SourceRange Range,
11149 ODRFunctionDifference DiffType) {
11150 return Diag(Loc, diag::note_module_odr_violation_function)
11151 << SecondModule << Range << DiffType;
11152 };
11153
11154 if (ComputeQualTypeODRHash(FirstFunction->getReturnType()) !=
11155 ComputeQualTypeODRHash(SecondFunction->getReturnType())) {
11156 ODRDiagError(FirstFunction->getReturnTypeSourceRange().getBegin(),
11157 FirstFunction->getReturnTypeSourceRange(), ReturnType)
11158 << FirstFunction->getReturnType();
11159 ODRDiagNote(SecondFunction->getReturnTypeSourceRange().getBegin(),
11160 SecondFunction->getReturnTypeSourceRange(), ReturnType)
11161 << SecondFunction->getReturnType();
11162 Diagnosed = true;
11163 break;
11164 }
11165
11166 assert(FirstFunction->param_size() == SecondFunction->param_size() &&
11167 "Merged functions with different number of parameters");
11168
11169 auto ParamSize = FirstFunction->param_size();
11170 bool ParameterMismatch = false;
11171 for (unsigned I = 0; I < ParamSize; ++I) {
11172 auto *FirstParam = FirstFunction->getParamDecl(I);
11173 auto *SecondParam = SecondFunction->getParamDecl(I);
11174
11175 assert(getContext().hasSameType(FirstParam->getType(),
11176 SecondParam->getType()) &&
11177 "Merged function has different parameter types.");
11178
11179 if (FirstParam->getDeclName() != SecondParam->getDeclName()) {
11180 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(),
11181 ParameterName)
11182 << I + 1 << FirstParam->getDeclName();
11183 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(),
11184 ParameterName)
11185 << I + 1 << SecondParam->getDeclName();
11186 ParameterMismatch = true;
11187 break;
11188 };
11189
11190 QualType FirstParamType = FirstParam->getType();
11191 QualType SecondParamType = SecondParam->getType();
11192 if (FirstParamType != SecondParamType &&
11193 ComputeQualTypeODRHash(FirstParamType) !=
11194 ComputeQualTypeODRHash(SecondParamType)) {
Vedant Kumar48b4f762018-04-14 01:40:48 +000011195 if (const DecayedType *ParamDecayedType =
Richard Trieue6caa262017-12-23 00:41:01 +000011196 FirstParamType->getAs<DecayedType>()) {
11197 ODRDiagError(FirstParam->getLocation(),
11198 FirstParam->getSourceRange(), ParameterType)
11199 << (I + 1) << FirstParamType << true
11200 << ParamDecayedType->getOriginalType();
11201 } else {
11202 ODRDiagError(FirstParam->getLocation(),
11203 FirstParam->getSourceRange(), ParameterType)
11204 << (I + 1) << FirstParamType << false;
11205 }
11206
Vedant Kumar48b4f762018-04-14 01:40:48 +000011207 if (const DecayedType *ParamDecayedType =
Richard Trieue6caa262017-12-23 00:41:01 +000011208 SecondParamType->getAs<DecayedType>()) {
11209 ODRDiagNote(SecondParam->getLocation(),
11210 SecondParam->getSourceRange(), ParameterType)
11211 << (I + 1) << SecondParamType << true
11212 << ParamDecayedType->getOriginalType();
11213 } else {
11214 ODRDiagNote(SecondParam->getLocation(),
11215 SecondParam->getSourceRange(), ParameterType)
11216 << (I + 1) << SecondParamType << false;
11217 }
11218 ParameterMismatch = true;
11219 break;
11220 }
11221
11222 const Expr *FirstInit = FirstParam->getInit();
11223 const Expr *SecondInit = SecondParam->getInit();
11224 if ((FirstInit == nullptr) != (SecondInit == nullptr)) {
11225 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(),
11226 ParameterSingleDefaultArgument)
11227 << (I + 1) << (FirstInit == nullptr)
11228 << (FirstInit ? FirstInit->getSourceRange() : SourceRange());
11229 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(),
11230 ParameterSingleDefaultArgument)
11231 << (I + 1) << (SecondInit == nullptr)
11232 << (SecondInit ? SecondInit->getSourceRange() : SourceRange());
11233 ParameterMismatch = true;
11234 break;
11235 }
11236
11237 if (FirstInit && SecondInit &&
11238 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) {
11239 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(),
11240 ParameterDifferentDefaultArgument)
11241 << (I + 1) << FirstInit->getSourceRange();
11242 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(),
11243 ParameterDifferentDefaultArgument)
11244 << (I + 1) << SecondInit->getSourceRange();
11245 ParameterMismatch = true;
11246 break;
11247 }
11248
11249 assert(ComputeSubDeclODRHash(FirstParam) ==
11250 ComputeSubDeclODRHash(SecondParam) &&
11251 "Undiagnosed parameter difference.");
11252 }
11253
11254 if (ParameterMismatch) {
11255 Diagnosed = true;
11256 break;
11257 }
11258
11259 // If no error has been generated before now, assume the problem is in
11260 // the body and generate a message.
11261 ODRDiagError(FirstFunction->getLocation(),
11262 FirstFunction->getSourceRange(), FunctionBody);
11263 ODRDiagNote(SecondFunction->getLocation(),
11264 SecondFunction->getSourceRange(), FunctionBody);
11265 Diagnosed = true;
11266 break;
11267 }
Evgeny Stupachenkobf25d672018-01-05 02:22:52 +000011268 (void)Diagnosed;
Richard Trieue6caa262017-12-23 00:41:01 +000011269 assert(Diagnosed && "Unable to emit ODR diagnostic.");
11270 }
Richard Trieuab4d7302018-07-25 22:52:05 +000011271
11272 // Issue ODR failures diagnostics for enums.
11273 for (auto &Merge : EnumOdrMergeFailures) {
11274 enum ODREnumDifference {
11275 SingleScopedEnum,
11276 EnumTagKeywordMismatch,
11277 SingleSpecifiedType,
11278 DifferentSpecifiedTypes,
11279 DifferentNumberEnumConstants,
11280 EnumConstantName,
11281 EnumConstantSingleInitilizer,
11282 EnumConstantDifferentInitilizer,
11283 };
11284
11285 // If we've already pointed out a specific problem with this enum, don't
11286 // bother issuing a general "something's different" diagnostic.
11287 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11288 continue;
11289
11290 EnumDecl *FirstEnum = Merge.first;
11291 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstEnum);
11292
11293 using DeclHashes =
11294 llvm::SmallVector<std::pair<EnumConstantDecl *, unsigned>, 4>;
11295 auto PopulateHashes = [&ComputeSubDeclODRHash, FirstEnum](
11296 DeclHashes &Hashes, EnumDecl *Enum) {
11297 for (auto *D : Enum->decls()) {
11298 // Due to decl merging, the first EnumDecl is the parent of
11299 // Decls in both records.
11300 if (!ODRHash::isWhitelistedDecl(D, FirstEnum))
11301 continue;
11302 assert(isa<EnumConstantDecl>(D) && "Unexpected Decl kind");
11303 Hashes.emplace_back(cast<EnumConstantDecl>(D),
11304 ComputeSubDeclODRHash(D));
11305 }
11306 };
11307 DeclHashes FirstHashes;
11308 PopulateHashes(FirstHashes, FirstEnum);
11309 bool Diagnosed = false;
11310 for (auto &SecondEnum : Merge.second) {
11311
11312 if (FirstEnum == SecondEnum)
11313 continue;
11314
11315 std::string SecondModule =
11316 getOwningModuleNameForDiagnostic(SecondEnum);
11317
11318 auto ODRDiagError = [FirstEnum, &FirstModule,
11319 this](SourceLocation Loc, SourceRange Range,
11320 ODREnumDifference DiffType) {
11321 return Diag(Loc, diag::err_module_odr_violation_enum)
11322 << FirstEnum << FirstModule.empty() << FirstModule << Range
11323 << DiffType;
11324 };
11325 auto ODRDiagNote = [&SecondModule, this](SourceLocation Loc,
11326 SourceRange Range,
11327 ODREnumDifference DiffType) {
11328 return Diag(Loc, diag::note_module_odr_violation_enum)
11329 << SecondModule << Range << DiffType;
11330 };
11331
11332 if (FirstEnum->isScoped() != SecondEnum->isScoped()) {
11333 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(),
11334 SingleScopedEnum)
11335 << FirstEnum->isScoped();
11336 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(),
11337 SingleScopedEnum)
11338 << SecondEnum->isScoped();
11339 Diagnosed = true;
11340 continue;
11341 }
11342
11343 if (FirstEnum->isScoped() && SecondEnum->isScoped()) {
11344 if (FirstEnum->isScopedUsingClassTag() !=
11345 SecondEnum->isScopedUsingClassTag()) {
11346 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(),
11347 EnumTagKeywordMismatch)
11348 << FirstEnum->isScopedUsingClassTag();
11349 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(),
11350 EnumTagKeywordMismatch)
11351 << SecondEnum->isScopedUsingClassTag();
11352 Diagnosed = true;
11353 continue;
11354 }
11355 }
11356
11357 QualType FirstUnderlyingType =
11358 FirstEnum->getIntegerTypeSourceInfo()
11359 ? FirstEnum->getIntegerTypeSourceInfo()->getType()
11360 : QualType();
11361 QualType SecondUnderlyingType =
11362 SecondEnum->getIntegerTypeSourceInfo()
11363 ? SecondEnum->getIntegerTypeSourceInfo()->getType()
11364 : QualType();
11365 if (FirstUnderlyingType.isNull() != SecondUnderlyingType.isNull()) {
11366 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(),
11367 SingleSpecifiedType)
11368 << !FirstUnderlyingType.isNull();
11369 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(),
11370 SingleSpecifiedType)
11371 << !SecondUnderlyingType.isNull();
11372 Diagnosed = true;
11373 continue;
11374 }
11375
11376 if (!FirstUnderlyingType.isNull() && !SecondUnderlyingType.isNull()) {
11377 if (ComputeQualTypeODRHash(FirstUnderlyingType) !=
11378 ComputeQualTypeODRHash(SecondUnderlyingType)) {
11379 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(),
11380 DifferentSpecifiedTypes)
11381 << FirstUnderlyingType;
11382 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(),
11383 DifferentSpecifiedTypes)
11384 << SecondUnderlyingType;
11385 Diagnosed = true;
11386 continue;
11387 }
11388 }
11389
11390 DeclHashes SecondHashes;
11391 PopulateHashes(SecondHashes, SecondEnum);
11392
11393 if (FirstHashes.size() != SecondHashes.size()) {
11394 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(),
11395 DifferentNumberEnumConstants)
11396 << (int)FirstHashes.size();
11397 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(),
11398 DifferentNumberEnumConstants)
11399 << (int)SecondHashes.size();
11400 Diagnosed = true;
11401 continue;
11402 }
11403
11404 for (unsigned I = 0; I < FirstHashes.size(); ++I) {
11405 if (FirstHashes[I].second == SecondHashes[I].second)
11406 continue;
11407 const EnumConstantDecl *FirstEnumConstant = FirstHashes[I].first;
11408 const EnumConstantDecl *SecondEnumConstant = SecondHashes[I].first;
11409
11410 if (FirstEnumConstant->getDeclName() !=
11411 SecondEnumConstant->getDeclName()) {
11412
11413 ODRDiagError(FirstEnumConstant->getLocation(),
11414 FirstEnumConstant->getSourceRange(), EnumConstantName)
11415 << I + 1 << FirstEnumConstant;
11416 ODRDiagNote(SecondEnumConstant->getLocation(),
11417 SecondEnumConstant->getSourceRange(), EnumConstantName)
11418 << I + 1 << SecondEnumConstant;
11419 Diagnosed = true;
11420 break;
11421 }
11422
11423 const Expr *FirstInit = FirstEnumConstant->getInitExpr();
11424 const Expr *SecondInit = SecondEnumConstant->getInitExpr();
11425 if (!FirstInit && !SecondInit)
11426 continue;
11427
11428 if (!FirstInit || !SecondInit) {
11429 ODRDiagError(FirstEnumConstant->getLocation(),
11430 FirstEnumConstant->getSourceRange(),
11431 EnumConstantSingleInitilizer)
11432 << I + 1 << FirstEnumConstant << (FirstInit != nullptr);
11433 ODRDiagNote(SecondEnumConstant->getLocation(),
11434 SecondEnumConstant->getSourceRange(),
11435 EnumConstantSingleInitilizer)
11436 << I + 1 << SecondEnumConstant << (SecondInit != nullptr);
11437 Diagnosed = true;
11438 break;
11439 }
11440
11441 if (ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) {
11442 ODRDiagError(FirstEnumConstant->getLocation(),
11443 FirstEnumConstant->getSourceRange(),
11444 EnumConstantDifferentInitilizer)
11445 << I + 1 << FirstEnumConstant;
11446 ODRDiagNote(SecondEnumConstant->getLocation(),
11447 SecondEnumConstant->getSourceRange(),
11448 EnumConstantDifferentInitilizer)
11449 << I + 1 << SecondEnumConstant;
11450 Diagnosed = true;
11451 break;
11452 }
11453 }
11454 }
11455
11456 (void)Diagnosed;
11457 assert(Diagnosed && "Unable to emit ODR diagnostic.");
11458 }
Guy Benyei11169dd2012-12-18 14:30:41 +000011459}
11460
Richard Smithce18a182015-07-14 00:26:00 +000011461void ASTReader::StartedDeserializing() {
David L. Jonesc4808b9e2016-12-15 20:53:26 +000011462 if (++NumCurrentElementsDeserializing == 1 && ReadTimer.get())
Richard Smithce18a182015-07-14 00:26:00 +000011463 ReadTimer->startTimer();
11464}
11465
Guy Benyei11169dd2012-12-18 14:30:41 +000011466void ASTReader::FinishedDeserializing() {
11467 assert(NumCurrentElementsDeserializing &&
11468 "FinishedDeserializing not paired with StartedDeserializing");
11469 if (NumCurrentElementsDeserializing == 1) {
11470 // We decrease NumCurrentElementsDeserializing only after pending actions
11471 // are finished, to avoid recursively re-calling finishPendingActions().
11472 finishPendingActions();
11473 }
11474 --NumCurrentElementsDeserializing;
11475
Richard Smitha0ce9c42014-07-29 23:23:27 +000011476 if (NumCurrentElementsDeserializing == 0) {
Richard Smitha62d1982018-08-03 01:00:01 +000011477 // Propagate exception specification and deduced type updates along
11478 // redeclaration chains.
11479 //
11480 // We do this now rather than in finishPendingActions because we want to
11481 // be able to walk the complete redeclaration chains of the updated decls.
11482 while (!PendingExceptionSpecUpdates.empty() ||
11483 !PendingDeducedTypeUpdates.empty()) {
11484 auto ESUpdates = std::move(PendingExceptionSpecUpdates);
Richard Smith7226f2a2015-03-23 19:54:56 +000011485 PendingExceptionSpecUpdates.clear();
Richard Smitha62d1982018-08-03 01:00:01 +000011486 for (auto Update : ESUpdates) {
Vassil Vassilev19765fb2016-07-22 21:08:24 +000011487 ProcessingUpdatesRAIIObj ProcessingUpdates(*this);
Richard Smith7226f2a2015-03-23 19:54:56 +000011488 auto *FPT = Update.second->getType()->castAs<FunctionProtoType>();
Richard Smith1d0f1992015-08-19 21:09:32 +000011489 auto ESI = FPT->getExtProtoInfo().ExceptionSpec;
Richard Smithdbafb6c2017-06-29 23:23:46 +000011490 if (auto *Listener = getContext().getASTMutationListener())
Richard Smithd88a7f12015-09-01 20:35:42 +000011491 Listener->ResolvedExceptionSpec(cast<FunctionDecl>(Update.second));
Richard Smith1d0f1992015-08-19 21:09:32 +000011492 for (auto *Redecl : Update.second->redecls())
Richard Smithdbafb6c2017-06-29 23:23:46 +000011493 getContext().adjustExceptionSpec(cast<FunctionDecl>(Redecl), ESI);
Richard Smith7226f2a2015-03-23 19:54:56 +000011494 }
Richard Smitha62d1982018-08-03 01:00:01 +000011495
11496 auto DTUpdates = std::move(PendingDeducedTypeUpdates);
11497 PendingDeducedTypeUpdates.clear();
11498 for (auto Update : DTUpdates) {
11499 ProcessingUpdatesRAIIObj ProcessingUpdates(*this);
11500 // FIXME: If the return type is already deduced, check that it matches.
11501 getContext().adjustDeducedFunctionResultType(Update.first,
11502 Update.second);
11503 }
Richard Smith9e2341d2015-03-23 03:25:59 +000011504 }
11505
Richard Smithce18a182015-07-14 00:26:00 +000011506 if (ReadTimer)
11507 ReadTimer->stopTimer();
11508
Richard Smith0f4e2c42015-08-06 04:23:48 +000011509 diagnoseOdrViolations();
11510
Richard Smith04d05b52014-03-23 00:27:18 +000011511 // We are not in recursive loading, so it's safe to pass the "interesting"
11512 // decls to the consumer.
Richard Smitha0ce9c42014-07-29 23:23:27 +000011513 if (Consumer)
11514 PassInterestingDeclsToConsumer();
Guy Benyei11169dd2012-12-18 14:30:41 +000011515 }
11516}
11517
Argyrios Kyrtzidise5edbf92013-04-26 21:33:35 +000011518void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) {
Richard Smith9e2341d2015-03-23 03:25:59 +000011519 if (IdentifierInfo *II = Name.getAsIdentifierInfo()) {
11520 // Remove any fake results before adding any real ones.
11521 auto It = PendingFakeLookupResults.find(II);
11522 if (It != PendingFakeLookupResults.end()) {
Richard Smitha534a312015-07-21 23:54:07 +000011523 for (auto *ND : It->second)
Richard Smith9e2341d2015-03-23 03:25:59 +000011524 SemaObj->IdResolver.RemoveDecl(ND);
Ben Langmuireb8bd2d2015-04-10 22:25:42 +000011525 // FIXME: this works around module+PCH performance issue.
11526 // Rather than erase the result from the map, which is O(n), just clear
11527 // the vector of NamedDecls.
11528 It->second.clear();
Richard Smith9e2341d2015-03-23 03:25:59 +000011529 }
11530 }
Argyrios Kyrtzidise5edbf92013-04-26 21:33:35 +000011531
11532 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
11533 SemaObj->TUScope->AddDecl(D);
11534 } else if (SemaObj->TUScope) {
11535 // Adding the decl to IdResolver may have failed because it was already in
11536 // (even though it was not added in scope). If it is already in, make sure
11537 // it gets in the scope as well.
11538 if (std::find(SemaObj->IdResolver.begin(Name),
11539 SemaObj->IdResolver.end(), D) != SemaObj->IdResolver.end())
11540 SemaObj->TUScope->AddDecl(D);
11541 }
11542}
11543
Duncan P. N. Exon Smith8bef5cd2019-03-09 17:33:56 +000011544ASTReader::ASTReader(Preprocessor &PP, InMemoryModuleCache &ModuleCache,
11545 ASTContext *Context,
David Blaikie61137e12017-01-05 18:23:18 +000011546 const PCHContainerReader &PCHContainerRdr,
11547 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
11548 StringRef isysroot, bool DisableValidation,
11549 bool AllowASTWithCompilerErrors,
11550 bool AllowConfigurationMismatch, bool ValidateSystemInputs,
Bruno Cardoso Lopes1731fc82019-10-15 14:23:55 +000011551 bool ValidateASTInputFilesContent, bool UseGlobalIndex,
David Blaikie61137e12017-01-05 18:23:18 +000011552 std::unique_ptr<llvm::Timer> ReadTimer)
11553 : Listener(DisableValidation
11554 ? cast<ASTReaderListener>(new SimpleASTReaderListener(PP))
11555 : cast<ASTReaderListener>(new PCHValidator(PP, *this))),
David Blaikie61137e12017-01-05 18:23:18 +000011556 SourceMgr(PP.getSourceManager()), FileMgr(PP.getFileManager()),
David Blaikie9d7c1ba2017-01-05 18:45:43 +000011557 PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()), PP(PP),
Duncan P. N. Exon Smith8bef5cd2019-03-09 17:33:56 +000011558 ContextObj(Context), ModuleMgr(PP.getFileManager(), ModuleCache,
11559 PCHContainerRdr, PP.getHeaderSearchInfo()),
11560 DummyIdResolver(PP), ReadTimer(std::move(ReadTimer)), isysroot(isysroot),
David Blaikie61137e12017-01-05 18:23:18 +000011561 DisableValidation(DisableValidation),
Nico Weber824285e2014-05-08 04:26:47 +000011562 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
11563 AllowConfigurationMismatch(AllowConfigurationMismatch),
11564 ValidateSystemInputs(ValidateSystemInputs),
Bruno Cardoso Lopes1731fc82019-10-15 14:23:55 +000011565 ValidateASTInputFilesContent(ValidateASTInputFilesContent),
David Blaikie9d7c1ba2017-01-05 18:45:43 +000011566 UseGlobalIndex(UseGlobalIndex), CurrSwitchCaseStmts(&SwitchCaseStmts) {
Guy Benyei11169dd2012-12-18 14:30:41 +000011567 SourceMgr.setExternalSLocEntrySource(this);
Douglas Gregor6623e1f2015-11-03 18:33:07 +000011568
11569 for (const auto &Ext : Extensions) {
11570 auto BlockName = Ext->getExtensionMetadata().BlockName;
11571 auto Known = ModuleFileExtensions.find(BlockName);
11572 if (Known != ModuleFileExtensions.end()) {
11573 Diags.Report(diag::warn_duplicate_module_file_extension)
11574 << BlockName;
11575 continue;
11576 }
11577
11578 ModuleFileExtensions.insert({BlockName, Ext});
11579 }
Guy Benyei11169dd2012-12-18 14:30:41 +000011580}
11581
11582ASTReader::~ASTReader() {
Nico Weber824285e2014-05-08 04:26:47 +000011583 if (OwnsDeserializationListener)
11584 delete DeserializationListener;
Guy Benyei11169dd2012-12-18 14:30:41 +000011585}
Richard Smith10379092016-05-06 23:14:07 +000011586
11587IdentifierResolver &ASTReader::getIdResolver() {
11588 return SemaObj ? SemaObj->IdResolver : DummyIdResolver;
11589}
David L. Jonesbe1557a2016-12-21 00:17:49 +000011590
JF Bastien0e828952019-06-26 19:50:12 +000011591Expected<unsigned> ASTRecordReader::readRecord(llvm::BitstreamCursor &Cursor,
11592 unsigned AbbrevID) {
David L. Jonesbe1557a2016-12-21 00:17:49 +000011593 Idx = 0;
11594 Record.clear();
11595 return Cursor.readRecord(AbbrevID, Record);
11596}
Kelvin Libe286f52018-09-15 13:54:15 +000011597//===----------------------------------------------------------------------===//
11598//// OMPClauseReader implementation
11599////===----------------------------------------------------------------------===//
11600
John McCallc2f18312019-12-14 03:01:28 -050011601// This has to be in namespace clang because it's friended by all
11602// of the OMP clauses.
11603namespace clang {
11604
11605class OMPClauseReader : public OMPClauseVisitor<OMPClauseReader> {
11606 ASTRecordReader &Record;
11607 ASTContext &Context;
11608
11609public:
11610 OMPClauseReader(ASTRecordReader &Record)
11611 : Record(Record), Context(Record.getContext()) {}
11612
11613#define OPENMP_CLAUSE(Name, Class) void Visit##Class(Class *C);
11614#include "clang/Basic/OpenMPKinds.def"
11615 OMPClause *readClause();
11616 void VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C);
11617 void VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C);
11618};
11619
11620} // end namespace clang
11621
11622OMPClause *ASTRecordReader::readOMPClause() {
11623 return OMPClauseReader(*this).readClause();
11624}
11625
Kelvin Libe286f52018-09-15 13:54:15 +000011626OMPClause *OMPClauseReader::readClause() {
Simon Pilgrim556fbfe2019-09-15 16:05:20 +000011627 OMPClause *C = nullptr;
Kelvin Libe286f52018-09-15 13:54:15 +000011628 switch (Record.readInt()) {
11629 case OMPC_if:
11630 C = new (Context) OMPIfClause();
11631 break;
11632 case OMPC_final:
11633 C = new (Context) OMPFinalClause();
11634 break;
11635 case OMPC_num_threads:
11636 C = new (Context) OMPNumThreadsClause();
11637 break;
11638 case OMPC_safelen:
11639 C = new (Context) OMPSafelenClause();
11640 break;
11641 case OMPC_simdlen:
11642 C = new (Context) OMPSimdlenClause();
11643 break;
Alexey Bataev9cc10fc2019-03-12 18:52:33 +000011644 case OMPC_allocator:
11645 C = new (Context) OMPAllocatorClause();
11646 break;
Kelvin Libe286f52018-09-15 13:54:15 +000011647 case OMPC_collapse:
11648 C = new (Context) OMPCollapseClause();
11649 break;
11650 case OMPC_default:
11651 C = new (Context) OMPDefaultClause();
11652 break;
11653 case OMPC_proc_bind:
11654 C = new (Context) OMPProcBindClause();
11655 break;
11656 case OMPC_schedule:
11657 C = new (Context) OMPScheduleClause();
11658 break;
11659 case OMPC_ordered:
11660 C = OMPOrderedClause::CreateEmpty(Context, Record.readInt());
11661 break;
11662 case OMPC_nowait:
11663 C = new (Context) OMPNowaitClause();
11664 break;
11665 case OMPC_untied:
11666 C = new (Context) OMPUntiedClause();
11667 break;
11668 case OMPC_mergeable:
11669 C = new (Context) OMPMergeableClause();
11670 break;
11671 case OMPC_read:
11672 C = new (Context) OMPReadClause();
11673 break;
11674 case OMPC_write:
11675 C = new (Context) OMPWriteClause();
11676 break;
11677 case OMPC_update:
Alexey Bataev82f7c202020-03-03 13:22:35 -050011678 C = OMPUpdateClause::CreateEmpty(Context, Record.readInt());
Kelvin Libe286f52018-09-15 13:54:15 +000011679 break;
11680 case OMPC_capture:
11681 C = new (Context) OMPCaptureClause();
11682 break;
11683 case OMPC_seq_cst:
11684 C = new (Context) OMPSeqCstClause();
11685 break;
Alexey Bataevea9166b2020-02-06 16:30:23 -050011686 case OMPC_acq_rel:
11687 C = new (Context) OMPAcqRelClause();
11688 break;
Alexey Bataev04a830f2020-02-10 14:30:39 -050011689 case OMPC_acquire:
11690 C = new (Context) OMPAcquireClause();
11691 break;
Alexey Bataev95598342020-02-10 15:49:05 -050011692 case OMPC_release:
11693 C = new (Context) OMPReleaseClause();
11694 break;
Alexey Bataev9a8defc2020-02-11 11:10:43 -050011695 case OMPC_relaxed:
11696 C = new (Context) OMPRelaxedClause();
11697 break;
Kelvin Libe286f52018-09-15 13:54:15 +000011698 case OMPC_threads:
11699 C = new (Context) OMPThreadsClause();
11700 break;
11701 case OMPC_simd:
11702 C = new (Context) OMPSIMDClause();
11703 break;
11704 case OMPC_nogroup:
11705 C = new (Context) OMPNogroupClause();
11706 break;
Kelvin Li1408f912018-09-26 04:28:39 +000011707 case OMPC_unified_address:
11708 C = new (Context) OMPUnifiedAddressClause();
11709 break;
Patrick Lyster4a370b92018-10-01 13:47:43 +000011710 case OMPC_unified_shared_memory:
11711 C = new (Context) OMPUnifiedSharedMemoryClause();
11712 break;
Patrick Lyster6bdf63b2018-10-03 20:07:58 +000011713 case OMPC_reverse_offload:
11714 C = new (Context) OMPReverseOffloadClause();
11715 break;
Patrick Lyster3fe9e392018-10-11 14:41:10 +000011716 case OMPC_dynamic_allocators:
11717 C = new (Context) OMPDynamicAllocatorsClause();
11718 break;
Patrick Lyster7a2a27c2018-11-02 12:18:11 +000011719 case OMPC_atomic_default_mem_order:
11720 C = new (Context) OMPAtomicDefaultMemOrderClause();
11721 break;
11722 case OMPC_private:
Kelvin Libe286f52018-09-15 13:54:15 +000011723 C = OMPPrivateClause::CreateEmpty(Context, Record.readInt());
11724 break;
11725 case OMPC_firstprivate:
11726 C = OMPFirstprivateClause::CreateEmpty(Context, Record.readInt());
11727 break;
11728 case OMPC_lastprivate:
11729 C = OMPLastprivateClause::CreateEmpty(Context, Record.readInt());
11730 break;
11731 case OMPC_shared:
11732 C = OMPSharedClause::CreateEmpty(Context, Record.readInt());
11733 break;
11734 case OMPC_reduction:
11735 C = OMPReductionClause::CreateEmpty(Context, Record.readInt());
11736 break;
11737 case OMPC_task_reduction:
11738 C = OMPTaskReductionClause::CreateEmpty(Context, Record.readInt());
11739 break;
11740 case OMPC_in_reduction:
11741 C = OMPInReductionClause::CreateEmpty(Context, Record.readInt());
11742 break;
11743 case OMPC_linear:
11744 C = OMPLinearClause::CreateEmpty(Context, Record.readInt());
11745 break;
11746 case OMPC_aligned:
11747 C = OMPAlignedClause::CreateEmpty(Context, Record.readInt());
11748 break;
11749 case OMPC_copyin:
11750 C = OMPCopyinClause::CreateEmpty(Context, Record.readInt());
11751 break;
11752 case OMPC_copyprivate:
11753 C = OMPCopyprivateClause::CreateEmpty(Context, Record.readInt());
11754 break;
11755 case OMPC_flush:
11756 C = OMPFlushClause::CreateEmpty(Context, Record.readInt());
11757 break;
Alexey Bataevc112e942020-02-28 09:52:15 -050011758 case OMPC_depobj:
11759 C = OMPDepobjClause::CreateEmpty(Context);
11760 break;
Kelvin Libe286f52018-09-15 13:54:15 +000011761 case OMPC_depend: {
11762 unsigned NumVars = Record.readInt();
11763 unsigned NumLoops = Record.readInt();
11764 C = OMPDependClause::CreateEmpty(Context, NumVars, NumLoops);
11765 break;
11766 }
11767 case OMPC_device:
11768 C = new (Context) OMPDeviceClause();
11769 break;
11770 case OMPC_map: {
Michael Kruse4304e9d2019-02-19 16:38:20 +000011771 OMPMappableExprListSizeTy Sizes;
11772 Sizes.NumVars = Record.readInt();
11773 Sizes.NumUniqueDeclarations = Record.readInt();
11774 Sizes.NumComponentLists = Record.readInt();
11775 Sizes.NumComponents = Record.readInt();
11776 C = OMPMapClause::CreateEmpty(Context, Sizes);
Kelvin Libe286f52018-09-15 13:54:15 +000011777 break;
11778 }
11779 case OMPC_num_teams:
11780 C = new (Context) OMPNumTeamsClause();
11781 break;
11782 case OMPC_thread_limit:
11783 C = new (Context) OMPThreadLimitClause();
11784 break;
11785 case OMPC_priority:
11786 C = new (Context) OMPPriorityClause();
11787 break;
11788 case OMPC_grainsize:
11789 C = new (Context) OMPGrainsizeClause();
11790 break;
11791 case OMPC_num_tasks:
11792 C = new (Context) OMPNumTasksClause();
11793 break;
11794 case OMPC_hint:
11795 C = new (Context) OMPHintClause();
11796 break;
11797 case OMPC_dist_schedule:
11798 C = new (Context) OMPDistScheduleClause();
11799 break;
11800 case OMPC_defaultmap:
11801 C = new (Context) OMPDefaultmapClause();
11802 break;
11803 case OMPC_to: {
Michael Kruse4304e9d2019-02-19 16:38:20 +000011804 OMPMappableExprListSizeTy Sizes;
11805 Sizes.NumVars = Record.readInt();
11806 Sizes.NumUniqueDeclarations = Record.readInt();
11807 Sizes.NumComponentLists = Record.readInt();
11808 Sizes.NumComponents = Record.readInt();
11809 C = OMPToClause::CreateEmpty(Context, Sizes);
Kelvin Libe286f52018-09-15 13:54:15 +000011810 break;
11811 }
11812 case OMPC_from: {
Michael Kruse4304e9d2019-02-19 16:38:20 +000011813 OMPMappableExprListSizeTy Sizes;
11814 Sizes.NumVars = Record.readInt();
11815 Sizes.NumUniqueDeclarations = Record.readInt();
11816 Sizes.NumComponentLists = Record.readInt();
11817 Sizes.NumComponents = Record.readInt();
11818 C = OMPFromClause::CreateEmpty(Context, Sizes);
Kelvin Libe286f52018-09-15 13:54:15 +000011819 break;
11820 }
11821 case OMPC_use_device_ptr: {
Michael Kruse4304e9d2019-02-19 16:38:20 +000011822 OMPMappableExprListSizeTy Sizes;
11823 Sizes.NumVars = Record.readInt();
11824 Sizes.NumUniqueDeclarations = Record.readInt();
11825 Sizes.NumComponentLists = Record.readInt();
11826 Sizes.NumComponents = Record.readInt();
11827 C = OMPUseDevicePtrClause::CreateEmpty(Context, Sizes);
Kelvin Libe286f52018-09-15 13:54:15 +000011828 break;
11829 }
11830 case OMPC_is_device_ptr: {
Michael Kruse4304e9d2019-02-19 16:38:20 +000011831 OMPMappableExprListSizeTy Sizes;
11832 Sizes.NumVars = Record.readInt();
11833 Sizes.NumUniqueDeclarations = Record.readInt();
11834 Sizes.NumComponentLists = Record.readInt();
11835 Sizes.NumComponents = Record.readInt();
11836 C = OMPIsDevicePtrClause::CreateEmpty(Context, Sizes);
Kelvin Libe286f52018-09-15 13:54:15 +000011837 break;
11838 }
Alexey Bataeve04483e2019-03-27 14:14:31 +000011839 case OMPC_allocate:
11840 C = OMPAllocateClause::CreateEmpty(Context, Record.readInt());
11841 break;
Alexey Bataevb6e70842019-12-16 15:54:17 -050011842 case OMPC_nontemporal:
11843 C = OMPNontemporalClause::CreateEmpty(Context, Record.readInt());
11844 break;
Alexey Bataev06dea732020-03-20 09:41:22 -040011845 case OMPC_inclusive:
11846 C = OMPInclusiveClause::CreateEmpty(Context, Record.readInt());
11847 break;
Alexey Bataev63828a32020-03-23 10:41:08 -040011848 case OMPC_exclusive:
11849 C = OMPExclusiveClause::CreateEmpty(Context, Record.readInt());
11850 break;
Alexey Bataevcb8e6912020-01-31 16:09:26 -050011851 case OMPC_order:
11852 C = new (Context) OMPOrderClause();
11853 break;
Alexey Bataev375437a2020-03-02 14:21:20 -050011854 case OMPC_destroy:
11855 C = new (Context) OMPDestroyClause();
11856 break;
Alexey Bataev0f0564b2020-03-17 09:17:42 -040011857 case OMPC_detach:
11858 C = new (Context) OMPDetachClause();
11859 break;
Kelvin Libe286f52018-09-15 13:54:15 +000011860 }
Simon Pilgrim556fbfe2019-09-15 16:05:20 +000011861 assert(C && "Unknown OMPClause type");
11862
Kelvin Libe286f52018-09-15 13:54:15 +000011863 Visit(C);
11864 C->setLocStart(Record.readSourceLocation());
11865 C->setLocEnd(Record.readSourceLocation());
11866
11867 return C;
11868}
11869
11870void OMPClauseReader::VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C) {
11871 C->setPreInitStmt(Record.readSubStmt(),
11872 static_cast<OpenMPDirectiveKind>(Record.readInt()));
11873}
11874
11875void OMPClauseReader::VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C) {
11876 VisitOMPClauseWithPreInit(C);
11877 C->setPostUpdateExpr(Record.readSubExpr());
11878}
11879
11880void OMPClauseReader::VisitOMPIfClause(OMPIfClause *C) {
11881 VisitOMPClauseWithPreInit(C);
11882 C->setNameModifier(static_cast<OpenMPDirectiveKind>(Record.readInt()));
11883 C->setNameModifierLoc(Record.readSourceLocation());
11884 C->setColonLoc(Record.readSourceLocation());
11885 C->setCondition(Record.readSubExpr());
11886 C->setLParenLoc(Record.readSourceLocation());
11887}
11888
11889void OMPClauseReader::VisitOMPFinalClause(OMPFinalClause *C) {
Alexey Bataev3a842ec2019-10-15 19:37:05 +000011890 VisitOMPClauseWithPreInit(C);
Kelvin Libe286f52018-09-15 13:54:15 +000011891 C->setCondition(Record.readSubExpr());
11892 C->setLParenLoc(Record.readSourceLocation());
11893}
11894
11895void OMPClauseReader::VisitOMPNumThreadsClause(OMPNumThreadsClause *C) {
11896 VisitOMPClauseWithPreInit(C);
11897 C->setNumThreads(Record.readSubExpr());
11898 C->setLParenLoc(Record.readSourceLocation());
11899}
11900
11901void OMPClauseReader::VisitOMPSafelenClause(OMPSafelenClause *C) {
11902 C->setSafelen(Record.readSubExpr());
11903 C->setLParenLoc(Record.readSourceLocation());
11904}
11905
11906void OMPClauseReader::VisitOMPSimdlenClause(OMPSimdlenClause *C) {
11907 C->setSimdlen(Record.readSubExpr());
11908 C->setLParenLoc(Record.readSourceLocation());
11909}
11910
Alexey Bataev9cc10fc2019-03-12 18:52:33 +000011911void OMPClauseReader::VisitOMPAllocatorClause(OMPAllocatorClause *C) {
11912 C->setAllocator(Record.readExpr());
11913 C->setLParenLoc(Record.readSourceLocation());
11914}
11915
Kelvin Libe286f52018-09-15 13:54:15 +000011916void OMPClauseReader::VisitOMPCollapseClause(OMPCollapseClause *C) {
11917 C->setNumForLoops(Record.readSubExpr());
11918 C->setLParenLoc(Record.readSourceLocation());
11919}
11920
11921void OMPClauseReader::VisitOMPDefaultClause(OMPDefaultClause *C) {
Atmn Patel577c9b02020-02-14 21:45:49 -060011922 C->setDefaultKind(static_cast<llvm::omp::DefaultKind>(Record.readInt()));
Kelvin Libe286f52018-09-15 13:54:15 +000011923 C->setLParenLoc(Record.readSourceLocation());
11924 C->setDefaultKindKwLoc(Record.readSourceLocation());
11925}
11926
11927void OMPClauseReader::VisitOMPProcBindClause(OMPProcBindClause *C) {
Johannes Doerfert6c5d1f402019-12-25 18:15:36 -060011928 C->setProcBindKind(static_cast<llvm::omp::ProcBindKind>(Record.readInt()));
Kelvin Libe286f52018-09-15 13:54:15 +000011929 C->setLParenLoc(Record.readSourceLocation());
11930 C->setProcBindKindKwLoc(Record.readSourceLocation());
11931}
11932
11933void OMPClauseReader::VisitOMPScheduleClause(OMPScheduleClause *C) {
11934 VisitOMPClauseWithPreInit(C);
11935 C->setScheduleKind(
11936 static_cast<OpenMPScheduleClauseKind>(Record.readInt()));
11937 C->setFirstScheduleModifier(
11938 static_cast<OpenMPScheduleClauseModifier>(Record.readInt()));
11939 C->setSecondScheduleModifier(
11940 static_cast<OpenMPScheduleClauseModifier>(Record.readInt()));
11941 C->setChunkSize(Record.readSubExpr());
11942 C->setLParenLoc(Record.readSourceLocation());
11943 C->setFirstScheduleModifierLoc(Record.readSourceLocation());
11944 C->setSecondScheduleModifierLoc(Record.readSourceLocation());
11945 C->setScheduleKindLoc(Record.readSourceLocation());
11946 C->setCommaLoc(Record.readSourceLocation());
11947}
11948
11949void OMPClauseReader::VisitOMPOrderedClause(OMPOrderedClause *C) {
11950 C->setNumForLoops(Record.readSubExpr());
11951 for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I)
11952 C->setLoopNumIterations(I, Record.readSubExpr());
11953 for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I)
11954 C->setLoopCounter(I, Record.readSubExpr());
11955 C->setLParenLoc(Record.readSourceLocation());
11956}
11957
Alexey Bataev0f0564b2020-03-17 09:17:42 -040011958void OMPClauseReader::VisitOMPDetachClause(OMPDetachClause *C) {
11959 C->setEventHandler(Record.readSubExpr());
11960 C->setLParenLoc(Record.readSourceLocation());
11961}
11962
Kelvin Libe286f52018-09-15 13:54:15 +000011963void OMPClauseReader::VisitOMPNowaitClause(OMPNowaitClause *) {}
11964
11965void OMPClauseReader::VisitOMPUntiedClause(OMPUntiedClause *) {}
11966
11967void OMPClauseReader::VisitOMPMergeableClause(OMPMergeableClause *) {}
11968
11969void OMPClauseReader::VisitOMPReadClause(OMPReadClause *) {}
11970
11971void OMPClauseReader::VisitOMPWriteClause(OMPWriteClause *) {}
11972
Alexey Bataev82f7c202020-03-03 13:22:35 -050011973void OMPClauseReader::VisitOMPUpdateClause(OMPUpdateClause *C) {
11974 if (C->isExtended()) {
11975 C->setLParenLoc(Record.readSourceLocation());
11976 C->setArgumentLoc(Record.readSourceLocation());
11977 C->setDependencyKind(Record.readEnum<OpenMPDependClauseKind>());
11978 }
11979}
Kelvin Libe286f52018-09-15 13:54:15 +000011980
11981void OMPClauseReader::VisitOMPCaptureClause(OMPCaptureClause *) {}
11982
11983void OMPClauseReader::VisitOMPSeqCstClause(OMPSeqCstClause *) {}
11984
Alexey Bataevea9166b2020-02-06 16:30:23 -050011985void OMPClauseReader::VisitOMPAcqRelClause(OMPAcqRelClause *) {}
11986
Alexey Bataev04a830f2020-02-10 14:30:39 -050011987void OMPClauseReader::VisitOMPAcquireClause(OMPAcquireClause *) {}
11988
Alexey Bataev95598342020-02-10 15:49:05 -050011989void OMPClauseReader::VisitOMPReleaseClause(OMPReleaseClause *) {}
11990
Alexey Bataev9a8defc2020-02-11 11:10:43 -050011991void OMPClauseReader::VisitOMPRelaxedClause(OMPRelaxedClause *) {}
11992
Kelvin Libe286f52018-09-15 13:54:15 +000011993void OMPClauseReader::VisitOMPThreadsClause(OMPThreadsClause *) {}
11994
11995void OMPClauseReader::VisitOMPSIMDClause(OMPSIMDClause *) {}
11996
11997void OMPClauseReader::VisitOMPNogroupClause(OMPNogroupClause *) {}
11998
Alexey Bataev375437a2020-03-02 14:21:20 -050011999void OMPClauseReader::VisitOMPDestroyClause(OMPDestroyClause *) {}
12000
Kelvin Li1408f912018-09-26 04:28:39 +000012001void OMPClauseReader::VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *) {}
12002
Patrick Lyster4a370b92018-10-01 13:47:43 +000012003void OMPClauseReader::VisitOMPUnifiedSharedMemoryClause(
12004 OMPUnifiedSharedMemoryClause *) {}
12005
Patrick Lyster6bdf63b2018-10-03 20:07:58 +000012006void OMPClauseReader::VisitOMPReverseOffloadClause(OMPReverseOffloadClause *) {}
12007
Patrick Lyster3fe9e392018-10-11 14:41:10 +000012008void
12009OMPClauseReader::VisitOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause *) {
12010}
12011
Patrick Lyster7a2a27c2018-11-02 12:18:11 +000012012void OMPClauseReader::VisitOMPAtomicDefaultMemOrderClause(
12013 OMPAtomicDefaultMemOrderClause *C) {
12014 C->setAtomicDefaultMemOrderKind(
12015 static_cast<OpenMPAtomicDefaultMemOrderClauseKind>(Record.readInt()));
12016 C->setLParenLoc(Record.readSourceLocation());
12017 C->setAtomicDefaultMemOrderKindKwLoc(Record.readSourceLocation());
12018}
12019
Kelvin Libe286f52018-09-15 13:54:15 +000012020void OMPClauseReader::VisitOMPPrivateClause(OMPPrivateClause *C) {
12021 C->setLParenLoc(Record.readSourceLocation());
12022 unsigned NumVars = C->varlist_size();
12023 SmallVector<Expr *, 16> Vars;
12024 Vars.reserve(NumVars);
12025 for (unsigned i = 0; i != NumVars; ++i)
12026 Vars.push_back(Record.readSubExpr());
12027 C->setVarRefs(Vars);
12028 Vars.clear();
12029 for (unsigned i = 0; i != NumVars; ++i)
12030 Vars.push_back(Record.readSubExpr());
12031 C->setPrivateCopies(Vars);
12032}
12033
12034void OMPClauseReader::VisitOMPFirstprivateClause(OMPFirstprivateClause *C) {
12035 VisitOMPClauseWithPreInit(C);
12036 C->setLParenLoc(Record.readSourceLocation());
12037 unsigned NumVars = C->varlist_size();
12038 SmallVector<Expr *, 16> Vars;
12039 Vars.reserve(NumVars);
12040 for (unsigned i = 0; i != NumVars; ++i)
12041 Vars.push_back(Record.readSubExpr());
12042 C->setVarRefs(Vars);
12043 Vars.clear();
12044 for (unsigned i = 0; i != NumVars; ++i)
12045 Vars.push_back(Record.readSubExpr());
12046 C->setPrivateCopies(Vars);
12047 Vars.clear();
12048 for (unsigned i = 0; i != NumVars; ++i)
12049 Vars.push_back(Record.readSubExpr());
12050 C->setInits(Vars);
12051}
12052
12053void OMPClauseReader::VisitOMPLastprivateClause(OMPLastprivateClause *C) {
12054 VisitOMPClauseWithPostUpdate(C);
12055 C->setLParenLoc(Record.readSourceLocation());
Alexey Bataev93dc40d2019-12-20 11:04:57 -050012056 C->setKind(Record.readEnum<OpenMPLastprivateModifier>());
12057 C->setKindLoc(Record.readSourceLocation());
12058 C->setColonLoc(Record.readSourceLocation());
Kelvin Libe286f52018-09-15 13:54:15 +000012059 unsigned NumVars = C->varlist_size();
12060 SmallVector<Expr *, 16> Vars;
12061 Vars.reserve(NumVars);
12062 for (unsigned i = 0; i != NumVars; ++i)
12063 Vars.push_back(Record.readSubExpr());
12064 C->setVarRefs(Vars);
12065 Vars.clear();
12066 for (unsigned i = 0; i != NumVars; ++i)
12067 Vars.push_back(Record.readSubExpr());
12068 C->setPrivateCopies(Vars);
12069 Vars.clear();
12070 for (unsigned i = 0; i != NumVars; ++i)
12071 Vars.push_back(Record.readSubExpr());
12072 C->setSourceExprs(Vars);
12073 Vars.clear();
12074 for (unsigned i = 0; i != NumVars; ++i)
12075 Vars.push_back(Record.readSubExpr());
12076 C->setDestinationExprs(Vars);
12077 Vars.clear();
12078 for (unsigned i = 0; i != NumVars; ++i)
12079 Vars.push_back(Record.readSubExpr());
12080 C->setAssignmentOps(Vars);
12081}
12082
12083void OMPClauseReader::VisitOMPSharedClause(OMPSharedClause *C) {
12084 C->setLParenLoc(Record.readSourceLocation());
12085 unsigned NumVars = C->varlist_size();
12086 SmallVector<Expr *, 16> Vars;
12087 Vars.reserve(NumVars);
12088 for (unsigned i = 0; i != NumVars; ++i)
12089 Vars.push_back(Record.readSubExpr());
12090 C->setVarRefs(Vars);
12091}
12092
12093void OMPClauseReader::VisitOMPReductionClause(OMPReductionClause *C) {
12094 VisitOMPClauseWithPostUpdate(C);
12095 C->setLParenLoc(Record.readSourceLocation());
12096 C->setColonLoc(Record.readSourceLocation());
12097 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
John McCall3ce3d232019-12-13 03:37:23 -050012098 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
Kelvin Libe286f52018-09-15 13:54:15 +000012099 C->setQualifierLoc(NNSL);
12100 C->setNameInfo(DNI);
12101
12102 unsigned NumVars = C->varlist_size();
12103 SmallVector<Expr *, 16> Vars;
12104 Vars.reserve(NumVars);
12105 for (unsigned i = 0; i != NumVars; ++i)
12106 Vars.push_back(Record.readSubExpr());
12107 C->setVarRefs(Vars);
12108 Vars.clear();
12109 for (unsigned i = 0; i != NumVars; ++i)
12110 Vars.push_back(Record.readSubExpr());
12111 C->setPrivates(Vars);
12112 Vars.clear();
12113 for (unsigned i = 0; i != NumVars; ++i)
12114 Vars.push_back(Record.readSubExpr());
12115 C->setLHSExprs(Vars);
12116 Vars.clear();
12117 for (unsigned i = 0; i != NumVars; ++i)
12118 Vars.push_back(Record.readSubExpr());
12119 C->setRHSExprs(Vars);
12120 Vars.clear();
12121 for (unsigned i = 0; i != NumVars; ++i)
12122 Vars.push_back(Record.readSubExpr());
12123 C->setReductionOps(Vars);
12124}
12125
12126void OMPClauseReader::VisitOMPTaskReductionClause(OMPTaskReductionClause *C) {
12127 VisitOMPClauseWithPostUpdate(C);
12128 C->setLParenLoc(Record.readSourceLocation());
12129 C->setColonLoc(Record.readSourceLocation());
12130 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
John McCall3ce3d232019-12-13 03:37:23 -050012131 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
Kelvin Libe286f52018-09-15 13:54:15 +000012132 C->setQualifierLoc(NNSL);
12133 C->setNameInfo(DNI);
12134
12135 unsigned NumVars = C->varlist_size();
12136 SmallVector<Expr *, 16> Vars;
12137 Vars.reserve(NumVars);
12138 for (unsigned I = 0; I != NumVars; ++I)
12139 Vars.push_back(Record.readSubExpr());
12140 C->setVarRefs(Vars);
12141 Vars.clear();
12142 for (unsigned I = 0; I != NumVars; ++I)
12143 Vars.push_back(Record.readSubExpr());
12144 C->setPrivates(Vars);
12145 Vars.clear();
12146 for (unsigned I = 0; I != NumVars; ++I)
12147 Vars.push_back(Record.readSubExpr());
12148 C->setLHSExprs(Vars);
12149 Vars.clear();
12150 for (unsigned I = 0; I != NumVars; ++I)
12151 Vars.push_back(Record.readSubExpr());
12152 C->setRHSExprs(Vars);
12153 Vars.clear();
12154 for (unsigned I = 0; I != NumVars; ++I)
12155 Vars.push_back(Record.readSubExpr());
12156 C->setReductionOps(Vars);
12157}
12158
12159void OMPClauseReader::VisitOMPInReductionClause(OMPInReductionClause *C) {
12160 VisitOMPClauseWithPostUpdate(C);
12161 C->setLParenLoc(Record.readSourceLocation());
12162 C->setColonLoc(Record.readSourceLocation());
12163 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
John McCall3ce3d232019-12-13 03:37:23 -050012164 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
Kelvin Libe286f52018-09-15 13:54:15 +000012165 C->setQualifierLoc(NNSL);
12166 C->setNameInfo(DNI);
12167
12168 unsigned NumVars = C->varlist_size();
12169 SmallVector<Expr *, 16> Vars;
12170 Vars.reserve(NumVars);
12171 for (unsigned I = 0; I != NumVars; ++I)
12172 Vars.push_back(Record.readSubExpr());
12173 C->setVarRefs(Vars);
12174 Vars.clear();
12175 for (unsigned I = 0; I != NumVars; ++I)
12176 Vars.push_back(Record.readSubExpr());
12177 C->setPrivates(Vars);
12178 Vars.clear();
12179 for (unsigned I = 0; I != NumVars; ++I)
12180 Vars.push_back(Record.readSubExpr());
12181 C->setLHSExprs(Vars);
12182 Vars.clear();
12183 for (unsigned I = 0; I != NumVars; ++I)
12184 Vars.push_back(Record.readSubExpr());
12185 C->setRHSExprs(Vars);
12186 Vars.clear();
12187 for (unsigned I = 0; I != NumVars; ++I)
12188 Vars.push_back(Record.readSubExpr());
12189 C->setReductionOps(Vars);
12190 Vars.clear();
12191 for (unsigned I = 0; I != NumVars; ++I)
12192 Vars.push_back(Record.readSubExpr());
12193 C->setTaskgroupDescriptors(Vars);
12194}
12195
12196void OMPClauseReader::VisitOMPLinearClause(OMPLinearClause *C) {
12197 VisitOMPClauseWithPostUpdate(C);
12198 C->setLParenLoc(Record.readSourceLocation());
12199 C->setColonLoc(Record.readSourceLocation());
12200 C->setModifier(static_cast<OpenMPLinearClauseKind>(Record.readInt()));
12201 C->setModifierLoc(Record.readSourceLocation());
12202 unsigned NumVars = C->varlist_size();
12203 SmallVector<Expr *, 16> Vars;
12204 Vars.reserve(NumVars);
12205 for (unsigned i = 0; i != NumVars; ++i)
12206 Vars.push_back(Record.readSubExpr());
12207 C->setVarRefs(Vars);
12208 Vars.clear();
12209 for (unsigned i = 0; i != NumVars; ++i)
12210 Vars.push_back(Record.readSubExpr());
12211 C->setPrivates(Vars);
12212 Vars.clear();
12213 for (unsigned i = 0; i != NumVars; ++i)
12214 Vars.push_back(Record.readSubExpr());
12215 C->setInits(Vars);
12216 Vars.clear();
12217 for (unsigned i = 0; i != NumVars; ++i)
12218 Vars.push_back(Record.readSubExpr());
12219 C->setUpdates(Vars);
12220 Vars.clear();
12221 for (unsigned i = 0; i != NumVars; ++i)
12222 Vars.push_back(Record.readSubExpr());
12223 C->setFinals(Vars);
12224 C->setStep(Record.readSubExpr());
12225 C->setCalcStep(Record.readSubExpr());
Alexey Bataev195ae902019-08-08 13:42:45 +000012226 Vars.clear();
12227 for (unsigned I = 0; I != NumVars + 1; ++I)
12228 Vars.push_back(Record.readSubExpr());
12229 C->setUsedExprs(Vars);
Kelvin Libe286f52018-09-15 13:54:15 +000012230}
12231
12232void OMPClauseReader::VisitOMPAlignedClause(OMPAlignedClause *C) {
12233 C->setLParenLoc(Record.readSourceLocation());
12234 C->setColonLoc(Record.readSourceLocation());
12235 unsigned NumVars = C->varlist_size();
12236 SmallVector<Expr *, 16> Vars;
12237 Vars.reserve(NumVars);
12238 for (unsigned i = 0; i != NumVars; ++i)
12239 Vars.push_back(Record.readSubExpr());
12240 C->setVarRefs(Vars);
12241 C->setAlignment(Record.readSubExpr());
12242}
12243
12244void OMPClauseReader::VisitOMPCopyinClause(OMPCopyinClause *C) {
12245 C->setLParenLoc(Record.readSourceLocation());
12246 unsigned NumVars = C->varlist_size();
12247 SmallVector<Expr *, 16> Exprs;
12248 Exprs.reserve(NumVars);
12249 for (unsigned i = 0; i != NumVars; ++i)
12250 Exprs.push_back(Record.readSubExpr());
12251 C->setVarRefs(Exprs);
12252 Exprs.clear();
12253 for (unsigned i = 0; i != NumVars; ++i)
12254 Exprs.push_back(Record.readSubExpr());
12255 C->setSourceExprs(Exprs);
12256 Exprs.clear();
12257 for (unsigned i = 0; i != NumVars; ++i)
12258 Exprs.push_back(Record.readSubExpr());
12259 C->setDestinationExprs(Exprs);
12260 Exprs.clear();
12261 for (unsigned i = 0; i != NumVars; ++i)
12262 Exprs.push_back(Record.readSubExpr());
12263 C->setAssignmentOps(Exprs);
12264}
12265
12266void OMPClauseReader::VisitOMPCopyprivateClause(OMPCopyprivateClause *C) {
12267 C->setLParenLoc(Record.readSourceLocation());
12268 unsigned NumVars = C->varlist_size();
12269 SmallVector<Expr *, 16> Exprs;
12270 Exprs.reserve(NumVars);
12271 for (unsigned i = 0; i != NumVars; ++i)
12272 Exprs.push_back(Record.readSubExpr());
12273 C->setVarRefs(Exprs);
12274 Exprs.clear();
12275 for (unsigned i = 0; i != NumVars; ++i)
12276 Exprs.push_back(Record.readSubExpr());
12277 C->setSourceExprs(Exprs);
12278 Exprs.clear();
12279 for (unsigned i = 0; i != NumVars; ++i)
12280 Exprs.push_back(Record.readSubExpr());
12281 C->setDestinationExprs(Exprs);
12282 Exprs.clear();
12283 for (unsigned i = 0; i != NumVars; ++i)
12284 Exprs.push_back(Record.readSubExpr());
12285 C->setAssignmentOps(Exprs);
12286}
12287
12288void OMPClauseReader::VisitOMPFlushClause(OMPFlushClause *C) {
12289 C->setLParenLoc(Record.readSourceLocation());
12290 unsigned NumVars = C->varlist_size();
12291 SmallVector<Expr *, 16> Vars;
12292 Vars.reserve(NumVars);
12293 for (unsigned i = 0; i != NumVars; ++i)
12294 Vars.push_back(Record.readSubExpr());
12295 C->setVarRefs(Vars);
12296}
12297
Alexey Bataevc112e942020-02-28 09:52:15 -050012298void OMPClauseReader::VisitOMPDepobjClause(OMPDepobjClause *C) {
12299 C->setDepobj(Record.readSubExpr());
12300 C->setLParenLoc(Record.readSourceLocation());
12301}
12302
Kelvin Libe286f52018-09-15 13:54:15 +000012303void OMPClauseReader::VisitOMPDependClause(OMPDependClause *C) {
12304 C->setLParenLoc(Record.readSourceLocation());
12305 C->setDependencyKind(
12306 static_cast<OpenMPDependClauseKind>(Record.readInt()));
12307 C->setDependencyLoc(Record.readSourceLocation());
12308 C->setColonLoc(Record.readSourceLocation());
12309 unsigned NumVars = C->varlist_size();
12310 SmallVector<Expr *, 16> Vars;
12311 Vars.reserve(NumVars);
12312 for (unsigned I = 0; I != NumVars; ++I)
12313 Vars.push_back(Record.readSubExpr());
12314 C->setVarRefs(Vars);
12315 for (unsigned I = 0, E = C->getNumLoops(); I < E; ++I)
12316 C->setLoopData(I, Record.readSubExpr());
12317}
12318
12319void OMPClauseReader::VisitOMPDeviceClause(OMPDeviceClause *C) {
12320 VisitOMPClauseWithPreInit(C);
Alexey Bataev2f8894a2020-03-18 15:01:15 -040012321 C->setModifier(Record.readEnum<OpenMPDeviceClauseModifier>());
Kelvin Libe286f52018-09-15 13:54:15 +000012322 C->setDevice(Record.readSubExpr());
Alexey Bataev2f8894a2020-03-18 15:01:15 -040012323 C->setModifierLoc(Record.readSourceLocation());
Kelvin Libe286f52018-09-15 13:54:15 +000012324 C->setLParenLoc(Record.readSourceLocation());
12325}
12326
12327void OMPClauseReader::VisitOMPMapClause(OMPMapClause *C) {
12328 C->setLParenLoc(Record.readSourceLocation());
Kelvin Lief579432018-12-18 22:18:41 +000012329 for (unsigned I = 0; I < OMPMapClause::NumberOfModifiers; ++I) {
12330 C->setMapTypeModifier(
12331 I, static_cast<OpenMPMapModifierKind>(Record.readInt()));
12332 C->setMapTypeModifierLoc(I, Record.readSourceLocation());
12333 }
Michael Kruse4304e9d2019-02-19 16:38:20 +000012334 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
John McCall3ce3d232019-12-13 03:37:23 -050012335 C->setMapperIdInfo(Record.readDeclarationNameInfo());
Kelvin Libe286f52018-09-15 13:54:15 +000012336 C->setMapType(
12337 static_cast<OpenMPMapClauseKind>(Record.readInt()));
12338 C->setMapLoc(Record.readSourceLocation());
12339 C->setColonLoc(Record.readSourceLocation());
12340 auto NumVars = C->varlist_size();
12341 auto UniqueDecls = C->getUniqueDeclarationsNum();
12342 auto TotalLists = C->getTotalComponentListNum();
12343 auto TotalComponents = C->getTotalComponentsNum();
12344
12345 SmallVector<Expr *, 16> Vars;
12346 Vars.reserve(NumVars);
12347 for (unsigned i = 0; i != NumVars; ++i)
Michael Kruse251e1482019-02-01 20:25:04 +000012348 Vars.push_back(Record.readExpr());
Kelvin Libe286f52018-09-15 13:54:15 +000012349 C->setVarRefs(Vars);
12350
Michael Kruse4304e9d2019-02-19 16:38:20 +000012351 SmallVector<Expr *, 16> UDMappers;
12352 UDMappers.reserve(NumVars);
12353 for (unsigned I = 0; I < NumVars; ++I)
12354 UDMappers.push_back(Record.readExpr());
12355 C->setUDMapperRefs(UDMappers);
12356
Kelvin Libe286f52018-09-15 13:54:15 +000012357 SmallVector<ValueDecl *, 16> Decls;
12358 Decls.reserve(UniqueDecls);
12359 for (unsigned i = 0; i < UniqueDecls; ++i)
12360 Decls.push_back(Record.readDeclAs<ValueDecl>());
12361 C->setUniqueDecls(Decls);
12362
12363 SmallVector<unsigned, 16> ListsPerDecl;
12364 ListsPerDecl.reserve(UniqueDecls);
12365 for (unsigned i = 0; i < UniqueDecls; ++i)
12366 ListsPerDecl.push_back(Record.readInt());
12367 C->setDeclNumLists(ListsPerDecl);
12368
12369 SmallVector<unsigned, 32> ListSizes;
12370 ListSizes.reserve(TotalLists);
12371 for (unsigned i = 0; i < TotalLists; ++i)
12372 ListSizes.push_back(Record.readInt());
12373 C->setComponentListSizes(ListSizes);
12374
12375 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12376 Components.reserve(TotalComponents);
12377 for (unsigned i = 0; i < TotalComponents; ++i) {
Michael Kruse251e1482019-02-01 20:25:04 +000012378 Expr *AssociatedExpr = Record.readExpr();
Kelvin Libe286f52018-09-15 13:54:15 +000012379 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12380 Components.push_back(OMPClauseMappableExprCommon::MappableComponent(
12381 AssociatedExpr, AssociatedDecl));
12382 }
12383 C->setComponents(Components, ListSizes);
12384}
12385
Alexey Bataeve04483e2019-03-27 14:14:31 +000012386void OMPClauseReader::VisitOMPAllocateClause(OMPAllocateClause *C) {
12387 C->setLParenLoc(Record.readSourceLocation());
12388 C->setColonLoc(Record.readSourceLocation());
12389 C->setAllocator(Record.readSubExpr());
12390 unsigned NumVars = C->varlist_size();
12391 SmallVector<Expr *, 16> Vars;
12392 Vars.reserve(NumVars);
12393 for (unsigned i = 0; i != NumVars; ++i)
12394 Vars.push_back(Record.readSubExpr());
12395 C->setVarRefs(Vars);
12396}
12397
Kelvin Libe286f52018-09-15 13:54:15 +000012398void OMPClauseReader::VisitOMPNumTeamsClause(OMPNumTeamsClause *C) {
12399 VisitOMPClauseWithPreInit(C);
12400 C->setNumTeams(Record.readSubExpr());
12401 C->setLParenLoc(Record.readSourceLocation());
12402}
12403
12404void OMPClauseReader::VisitOMPThreadLimitClause(OMPThreadLimitClause *C) {
12405 VisitOMPClauseWithPreInit(C);
12406 C->setThreadLimit(Record.readSubExpr());
12407 C->setLParenLoc(Record.readSourceLocation());
12408}
12409
12410void OMPClauseReader::VisitOMPPriorityClause(OMPPriorityClause *C) {
Alexey Bataev31ba4762019-10-16 18:09:37 +000012411 VisitOMPClauseWithPreInit(C);
Kelvin Libe286f52018-09-15 13:54:15 +000012412 C->setPriority(Record.readSubExpr());
12413 C->setLParenLoc(Record.readSourceLocation());
12414}
12415
12416void OMPClauseReader::VisitOMPGrainsizeClause(OMPGrainsizeClause *C) {
Alexey Bataevb9c55e22019-10-14 19:29:52 +000012417 VisitOMPClauseWithPreInit(C);
Kelvin Libe286f52018-09-15 13:54:15 +000012418 C->setGrainsize(Record.readSubExpr());
12419 C->setLParenLoc(Record.readSourceLocation());
12420}
12421
12422void OMPClauseReader::VisitOMPNumTasksClause(OMPNumTasksClause *C) {
Alexey Bataevd88c7de2019-10-14 20:44:34 +000012423 VisitOMPClauseWithPreInit(C);
Kelvin Libe286f52018-09-15 13:54:15 +000012424 C->setNumTasks(Record.readSubExpr());
12425 C->setLParenLoc(Record.readSourceLocation());
12426}
12427
12428void OMPClauseReader::VisitOMPHintClause(OMPHintClause *C) {
12429 C->setHint(Record.readSubExpr());
12430 C->setLParenLoc(Record.readSourceLocation());
12431}
12432
12433void OMPClauseReader::VisitOMPDistScheduleClause(OMPDistScheduleClause *C) {
12434 VisitOMPClauseWithPreInit(C);
12435 C->setDistScheduleKind(
12436 static_cast<OpenMPDistScheduleClauseKind>(Record.readInt()));
12437 C->setChunkSize(Record.readSubExpr());
12438 C->setLParenLoc(Record.readSourceLocation());
12439 C->setDistScheduleKindLoc(Record.readSourceLocation());
12440 C->setCommaLoc(Record.readSourceLocation());
12441}
12442
12443void OMPClauseReader::VisitOMPDefaultmapClause(OMPDefaultmapClause *C) {
12444 C->setDefaultmapKind(
12445 static_cast<OpenMPDefaultmapClauseKind>(Record.readInt()));
12446 C->setDefaultmapModifier(
12447 static_cast<OpenMPDefaultmapClauseModifier>(Record.readInt()));
12448 C->setLParenLoc(Record.readSourceLocation());
12449 C->setDefaultmapModifierLoc(Record.readSourceLocation());
12450 C->setDefaultmapKindLoc(Record.readSourceLocation());
12451}
12452
12453void OMPClauseReader::VisitOMPToClause(OMPToClause *C) {
12454 C->setLParenLoc(Record.readSourceLocation());
Michael Kruse01f670d2019-02-22 22:29:42 +000012455 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
John McCall3ce3d232019-12-13 03:37:23 -050012456 C->setMapperIdInfo(Record.readDeclarationNameInfo());
Kelvin Libe286f52018-09-15 13:54:15 +000012457 auto NumVars = C->varlist_size();
12458 auto UniqueDecls = C->getUniqueDeclarationsNum();
12459 auto TotalLists = C->getTotalComponentListNum();
12460 auto TotalComponents = C->getTotalComponentsNum();
12461
12462 SmallVector<Expr *, 16> Vars;
12463 Vars.reserve(NumVars);
12464 for (unsigned i = 0; i != NumVars; ++i)
12465 Vars.push_back(Record.readSubExpr());
12466 C->setVarRefs(Vars);
12467
Michael Kruse01f670d2019-02-22 22:29:42 +000012468 SmallVector<Expr *, 16> UDMappers;
12469 UDMappers.reserve(NumVars);
12470 for (unsigned I = 0; I < NumVars; ++I)
12471 UDMappers.push_back(Record.readSubExpr());
12472 C->setUDMapperRefs(UDMappers);
12473
Kelvin Libe286f52018-09-15 13:54:15 +000012474 SmallVector<ValueDecl *, 16> Decls;
12475 Decls.reserve(UniqueDecls);
12476 for (unsigned i = 0; i < UniqueDecls; ++i)
12477 Decls.push_back(Record.readDeclAs<ValueDecl>());
12478 C->setUniqueDecls(Decls);
12479
12480 SmallVector<unsigned, 16> ListsPerDecl;
12481 ListsPerDecl.reserve(UniqueDecls);
12482 for (unsigned i = 0; i < UniqueDecls; ++i)
12483 ListsPerDecl.push_back(Record.readInt());
12484 C->setDeclNumLists(ListsPerDecl);
12485
12486 SmallVector<unsigned, 32> ListSizes;
12487 ListSizes.reserve(TotalLists);
12488 for (unsigned i = 0; i < TotalLists; ++i)
12489 ListSizes.push_back(Record.readInt());
12490 C->setComponentListSizes(ListSizes);
12491
12492 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12493 Components.reserve(TotalComponents);
12494 for (unsigned i = 0; i < TotalComponents; ++i) {
12495 Expr *AssociatedExpr = Record.readSubExpr();
12496 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12497 Components.push_back(OMPClauseMappableExprCommon::MappableComponent(
12498 AssociatedExpr, AssociatedDecl));
12499 }
12500 C->setComponents(Components, ListSizes);
12501}
12502
12503void OMPClauseReader::VisitOMPFromClause(OMPFromClause *C) {
12504 C->setLParenLoc(Record.readSourceLocation());
Michael Kruse0336c752019-02-25 20:34:15 +000012505 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
John McCall3ce3d232019-12-13 03:37:23 -050012506 C->setMapperIdInfo(Record.readDeclarationNameInfo());
Kelvin Libe286f52018-09-15 13:54:15 +000012507 auto NumVars = C->varlist_size();
12508 auto UniqueDecls = C->getUniqueDeclarationsNum();
12509 auto TotalLists = C->getTotalComponentListNum();
12510 auto TotalComponents = C->getTotalComponentsNum();
12511
12512 SmallVector<Expr *, 16> Vars;
12513 Vars.reserve(NumVars);
12514 for (unsigned i = 0; i != NumVars; ++i)
12515 Vars.push_back(Record.readSubExpr());
12516 C->setVarRefs(Vars);
12517
Michael Kruse0336c752019-02-25 20:34:15 +000012518 SmallVector<Expr *, 16> UDMappers;
12519 UDMappers.reserve(NumVars);
12520 for (unsigned I = 0; I < NumVars; ++I)
12521 UDMappers.push_back(Record.readSubExpr());
12522 C->setUDMapperRefs(UDMappers);
12523
Kelvin Libe286f52018-09-15 13:54:15 +000012524 SmallVector<ValueDecl *, 16> Decls;
12525 Decls.reserve(UniqueDecls);
12526 for (unsigned i = 0; i < UniqueDecls; ++i)
12527 Decls.push_back(Record.readDeclAs<ValueDecl>());
12528 C->setUniqueDecls(Decls);
12529
12530 SmallVector<unsigned, 16> ListsPerDecl;
12531 ListsPerDecl.reserve(UniqueDecls);
12532 for (unsigned i = 0; i < UniqueDecls; ++i)
12533 ListsPerDecl.push_back(Record.readInt());
12534 C->setDeclNumLists(ListsPerDecl);
12535
12536 SmallVector<unsigned, 32> ListSizes;
12537 ListSizes.reserve(TotalLists);
12538 for (unsigned i = 0; i < TotalLists; ++i)
12539 ListSizes.push_back(Record.readInt());
12540 C->setComponentListSizes(ListSizes);
12541
12542 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12543 Components.reserve(TotalComponents);
12544 for (unsigned i = 0; i < TotalComponents; ++i) {
12545 Expr *AssociatedExpr = Record.readSubExpr();
12546 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12547 Components.push_back(OMPClauseMappableExprCommon::MappableComponent(
12548 AssociatedExpr, AssociatedDecl));
12549 }
12550 C->setComponents(Components, ListSizes);
12551}
12552
12553void OMPClauseReader::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *C) {
12554 C->setLParenLoc(Record.readSourceLocation());
12555 auto NumVars = C->varlist_size();
12556 auto UniqueDecls = C->getUniqueDeclarationsNum();
12557 auto TotalLists = C->getTotalComponentListNum();
12558 auto TotalComponents = C->getTotalComponentsNum();
12559
12560 SmallVector<Expr *, 16> Vars;
12561 Vars.reserve(NumVars);
12562 for (unsigned i = 0; i != NumVars; ++i)
12563 Vars.push_back(Record.readSubExpr());
12564 C->setVarRefs(Vars);
12565 Vars.clear();
12566 for (unsigned i = 0; i != NumVars; ++i)
12567 Vars.push_back(Record.readSubExpr());
12568 C->setPrivateCopies(Vars);
12569 Vars.clear();
12570 for (unsigned i = 0; i != NumVars; ++i)
12571 Vars.push_back(Record.readSubExpr());
12572 C->setInits(Vars);
12573
12574 SmallVector<ValueDecl *, 16> Decls;
12575 Decls.reserve(UniqueDecls);
12576 for (unsigned i = 0; i < UniqueDecls; ++i)
12577 Decls.push_back(Record.readDeclAs<ValueDecl>());
12578 C->setUniqueDecls(Decls);
12579
12580 SmallVector<unsigned, 16> ListsPerDecl;
12581 ListsPerDecl.reserve(UniqueDecls);
12582 for (unsigned i = 0; i < UniqueDecls; ++i)
12583 ListsPerDecl.push_back(Record.readInt());
12584 C->setDeclNumLists(ListsPerDecl);
12585
12586 SmallVector<unsigned, 32> ListSizes;
12587 ListSizes.reserve(TotalLists);
12588 for (unsigned i = 0; i < TotalLists; ++i)
12589 ListSizes.push_back(Record.readInt());
12590 C->setComponentListSizes(ListSizes);
12591
12592 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12593 Components.reserve(TotalComponents);
12594 for (unsigned i = 0; i < TotalComponents; ++i) {
12595 Expr *AssociatedExpr = Record.readSubExpr();
12596 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12597 Components.push_back(OMPClauseMappableExprCommon::MappableComponent(
12598 AssociatedExpr, AssociatedDecl));
12599 }
12600 C->setComponents(Components, ListSizes);
12601}
12602
12603void OMPClauseReader::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
12604 C->setLParenLoc(Record.readSourceLocation());
12605 auto NumVars = C->varlist_size();
12606 auto UniqueDecls = C->getUniqueDeclarationsNum();
12607 auto TotalLists = C->getTotalComponentListNum();
12608 auto TotalComponents = C->getTotalComponentsNum();
12609
12610 SmallVector<Expr *, 16> Vars;
12611 Vars.reserve(NumVars);
12612 for (unsigned i = 0; i != NumVars; ++i)
12613 Vars.push_back(Record.readSubExpr());
12614 C->setVarRefs(Vars);
12615 Vars.clear();
12616
12617 SmallVector<ValueDecl *, 16> Decls;
12618 Decls.reserve(UniqueDecls);
12619 for (unsigned i = 0; i < UniqueDecls; ++i)
12620 Decls.push_back(Record.readDeclAs<ValueDecl>());
12621 C->setUniqueDecls(Decls);
12622
12623 SmallVector<unsigned, 16> ListsPerDecl;
12624 ListsPerDecl.reserve(UniqueDecls);
12625 for (unsigned i = 0; i < UniqueDecls; ++i)
12626 ListsPerDecl.push_back(Record.readInt());
12627 C->setDeclNumLists(ListsPerDecl);
12628
12629 SmallVector<unsigned, 32> ListSizes;
12630 ListSizes.reserve(TotalLists);
12631 for (unsigned i = 0; i < TotalLists; ++i)
12632 ListSizes.push_back(Record.readInt());
12633 C->setComponentListSizes(ListSizes);
12634
12635 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12636 Components.reserve(TotalComponents);
12637 for (unsigned i = 0; i < TotalComponents; ++i) {
12638 Expr *AssociatedExpr = Record.readSubExpr();
12639 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12640 Components.push_back(OMPClauseMappableExprCommon::MappableComponent(
12641 AssociatedExpr, AssociatedDecl));
12642 }
12643 C->setComponents(Components, ListSizes);
12644}
Alexey Bataevb6e70842019-12-16 15:54:17 -050012645
12646void OMPClauseReader::VisitOMPNontemporalClause(OMPNontemporalClause *C) {
12647 C->setLParenLoc(Record.readSourceLocation());
12648 unsigned NumVars = C->varlist_size();
12649 SmallVector<Expr *, 16> Vars;
12650 Vars.reserve(NumVars);
12651 for (unsigned i = 0; i != NumVars; ++i)
12652 Vars.push_back(Record.readSubExpr());
12653 C->setVarRefs(Vars);
Alexey Bataev0860db92019-12-19 10:01:10 -050012654 Vars.clear();
12655 Vars.reserve(NumVars);
12656 for (unsigned i = 0; i != NumVars; ++i)
12657 Vars.push_back(Record.readSubExpr());
12658 C->setPrivateRefs(Vars);
Alexey Bataevb6e70842019-12-16 15:54:17 -050012659}
Alexey Bataevcb8e6912020-01-31 16:09:26 -050012660
Alexey Bataev06dea732020-03-20 09:41:22 -040012661void OMPClauseReader::VisitOMPInclusiveClause(OMPInclusiveClause *C) {
12662 C->setLParenLoc(Record.readSourceLocation());
12663 unsigned NumVars = C->varlist_size();
12664 SmallVector<Expr *, 16> Vars;
12665 Vars.reserve(NumVars);
12666 for (unsigned i = 0; i != NumVars; ++i)
12667 Vars.push_back(Record.readSubExpr());
12668 C->setVarRefs(Vars);
12669}
12670
Alexey Bataev63828a32020-03-23 10:41:08 -040012671void OMPClauseReader::VisitOMPExclusiveClause(OMPExclusiveClause *C) {
12672 C->setLParenLoc(Record.readSourceLocation());
12673 unsigned NumVars = C->varlist_size();
12674 SmallVector<Expr *, 16> Vars;
12675 Vars.reserve(NumVars);
12676 for (unsigned i = 0; i != NumVars; ++i)
12677 Vars.push_back(Record.readSubExpr());
12678 C->setVarRefs(Vars);
12679}
12680
Alexey Bataevcb8e6912020-01-31 16:09:26 -050012681void OMPClauseReader::VisitOMPOrderClause(OMPOrderClause *C) {
12682 C->setKind(Record.readEnum<OpenMPOrderClauseKind>());
12683 C->setLParenLoc(Record.readSourceLocation());
12684 C->setKindKwLoc(Record.readSourceLocation());
12685}
Johannes Doerfert1228d422019-12-19 20:42:12 -060012686
Johannes Doerfertb86bf832020-02-15 18:07:42 -060012687OMPTraitInfo ASTRecordReader::readOMPTraitInfo() {
12688 OMPTraitInfo TI;
12689 TI.Sets.resize(readUInt32());
12690 for (auto &Set : TI.Sets) {
Johannes Doerfert1228d422019-12-19 20:42:12 -060012691 Set.Kind = readEnum<llvm::omp::TraitSet>();
12692 Set.Selectors.resize(readUInt32());
12693 for (auto &Selector : Set.Selectors) {
12694 Selector.Kind = readEnum<llvm::omp::TraitSelector>();
12695 Selector.ScoreOrCondition = nullptr;
12696 if (readBool())
12697 Selector.ScoreOrCondition = readExprRef();
12698 Selector.Properties.resize(readUInt32());
12699 for (auto &Property : Selector.Properties)
12700 Property.Kind = readEnum<llvm::omp::TraitProperty>();
12701 }
12702 }
12703 return TI;
12704}