Bug Summary

File:tools/clang/lib/Serialization/ASTReader.cpp
Warning:line 11850, column 3
1st function call argument is an uninitialized value

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -disable-llvm-verifier -discard-value-names -main-file-name ASTReader.cpp -analyzer-store=region -analyzer-opt-analyze-nested-blocks -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=cplusplus -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -mrelocation-model pic -pic-level 2 -mthread-model posix -relaxed-aliasing -fmath-errno -masm-verbose -mconstructor-aliases -munwind-tables -fuse-init-array -target-cpu x86-64 -dwarf-column-info -debugger-tuning=gdb -momit-leaf-frame-pointer -ffunction-sections -fdata-sections -resource-dir /usr/lib/llvm-8/lib/clang/8.0.0 -D _DEBUG -D _GNU_SOURCE -D __STDC_CONSTANT_MACROS -D __STDC_FORMAT_MACROS -D __STDC_LIMIT_MACROS -I /build/llvm-toolchain-snapshot-8~svn345461/build-llvm/tools/clang/lib/Serialization -I /build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization -I /build/llvm-toolchain-snapshot-8~svn345461/tools/clang/include -I /build/llvm-toolchain-snapshot-8~svn345461/build-llvm/tools/clang/include -I /build/llvm-toolchain-snapshot-8~svn345461/build-llvm/include -I /build/llvm-toolchain-snapshot-8~svn345461/include -U NDEBUG -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/6.3.0/../../../../include/c++/6.3.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/6.3.0/../../../../include/x86_64-linux-gnu/c++/6.3.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/6.3.0/../../../../include/x86_64-linux-gnu/c++/6.3.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/6.3.0/../../../../include/c++/6.3.0/backward -internal-isystem /usr/include/clang/8.0.0/include/ -internal-isystem /usr/local/include -internal-isystem /usr/lib/llvm-8/lib/clang/8.0.0/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -O2 -Wno-unused-parameter -Wwrite-strings -Wno-missing-field-initializers -Wno-long-long -Wno-maybe-uninitialized -Wno-comment -std=c++11 -fdeprecated-macro -fdebug-compilation-dir /build/llvm-toolchain-snapshot-8~svn345461/build-llvm/tools/clang/lib/Serialization -ferror-limit 19 -fmessage-length 0 -fvisibility-inlines-hidden -fobjc-runtime=gcc -fno-common -fdiagnostics-show-option -vectorize-loops -vectorize-slp -analyzer-output=html -analyzer-config stable-report-filename=true -o /tmp/scan-build-2018-10-27-211344-32123-1 -x c++ /build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp -faddrsig
1//===- ASTReader.cpp - AST File Reader ------------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines the ASTReader class, which reads AST files.
11//
12//===----------------------------------------------------------------------===//
13
14#include "clang/Serialization/ASTReader.h"
15#include "ASTCommon.h"
16#include "ASTReaderInternals.h"
17#include "clang/AST/ASTConsumer.h"
18#include "clang/AST/ASTContext.h"
19#include "clang/AST/ASTMutationListener.h"
20#include "clang/AST/ASTUnresolvedSet.h"
21#include "clang/AST/Decl.h"
22#include "clang/AST/DeclBase.h"
23#include "clang/AST/DeclCXX.h"
24#include "clang/AST/DeclFriend.h"
25#include "clang/AST/DeclGroup.h"
26#include "clang/AST/DeclObjC.h"
27#include "clang/AST/DeclTemplate.h"
28#include "clang/AST/DeclarationName.h"
29#include "clang/AST/Expr.h"
30#include "clang/AST/ExprCXX.h"
31#include "clang/AST/ExternalASTSource.h"
32#include "clang/AST/NestedNameSpecifier.h"
33#include "clang/AST/ODRHash.h"
34#include "clang/AST/RawCommentList.h"
35#include "clang/AST/TemplateBase.h"
36#include "clang/AST/TemplateName.h"
37#include "clang/AST/Type.h"
38#include "clang/AST/TypeLoc.h"
39#include "clang/AST/TypeLocVisitor.h"
40#include "clang/AST/UnresolvedSet.h"
41#include "clang/Basic/CommentOptions.h"
42#include "clang/Basic/Diagnostic.h"
43#include "clang/Basic/DiagnosticOptions.h"
44#include "clang/Basic/ExceptionSpecificationType.h"
45#include "clang/Basic/FileManager.h"
46#include "clang/Basic/FileSystemOptions.h"
47#include "clang/Basic/IdentifierTable.h"
48#include "clang/Basic/LLVM.h"
49#include "clang/Basic/LangOptions.h"
50#include "clang/Basic/MemoryBufferCache.h"
51#include "clang/Basic/Module.h"
52#include "clang/Basic/ObjCRuntime.h"
53#include "clang/Basic/OperatorKinds.h"
54#include "clang/Basic/PragmaKinds.h"
55#include "clang/Basic/Sanitizers.h"
56#include "clang/Basic/SourceLocation.h"
57#include "clang/Basic/SourceManager.h"
58#include "clang/Basic/SourceManagerInternals.h"
59#include "clang/Basic/Specifiers.h"
60#include "clang/Basic/TargetInfo.h"
61#include "clang/Basic/TargetOptions.h"
62#include "clang/Basic/TokenKinds.h"
63#include "clang/Basic/Version.h"
64#include "clang/Frontend/PCHContainerOperations.h"
65#include "clang/Lex/HeaderSearch.h"
66#include "clang/Lex/HeaderSearchOptions.h"
67#include "clang/Lex/MacroInfo.h"
68#include "clang/Lex/ModuleMap.h"
69#include "clang/Lex/PreprocessingRecord.h"
70#include "clang/Lex/Preprocessor.h"
71#include "clang/Lex/PreprocessorOptions.h"
72#include "clang/Lex/Token.h"
73#include "clang/Sema/ObjCMethodList.h"
74#include "clang/Sema/Scope.h"
75#include "clang/Sema/Sema.h"
76#include "clang/Sema/Weak.h"
77#include "clang/Serialization/ASTBitCodes.h"
78#include "clang/Serialization/ASTDeserializationListener.h"
79#include "clang/Serialization/ContinuousRangeMap.h"
80#include "clang/Serialization/GlobalModuleIndex.h"
81#include "clang/Serialization/Module.h"
82#include "clang/Serialization/ModuleFileExtension.h"
83#include "clang/Serialization/ModuleManager.h"
84#include "clang/Serialization/SerializationDiagnostic.h"
85#include "llvm/ADT/APFloat.h"
86#include "llvm/ADT/APInt.h"
87#include "llvm/ADT/APSInt.h"
88#include "llvm/ADT/ArrayRef.h"
89#include "llvm/ADT/DenseMap.h"
90#include "llvm/ADT/FoldingSet.h"
91#include "llvm/ADT/Hashing.h"
92#include "llvm/ADT/IntrusiveRefCntPtr.h"
93#include "llvm/ADT/None.h"
94#include "llvm/ADT/Optional.h"
95#include "llvm/ADT/STLExtras.h"
96#include "llvm/ADT/SmallPtrSet.h"
97#include "llvm/ADT/SmallString.h"
98#include "llvm/ADT/SmallVector.h"
99#include "llvm/ADT/StringExtras.h"
100#include "llvm/ADT/StringMap.h"
101#include "llvm/ADT/StringRef.h"
102#include "llvm/ADT/Triple.h"
103#include "llvm/ADT/iterator_range.h"
104#include "llvm/Bitcode/BitstreamReader.h"
105#include "llvm/Support/Casting.h"
106#include "llvm/Support/Compiler.h"
107#include "llvm/Support/Compression.h"
108#include "llvm/Support/DJB.h"
109#include "llvm/Support/Endian.h"
110#include "llvm/Support/Error.h"
111#include "llvm/Support/ErrorHandling.h"
112#include "llvm/Support/FileSystem.h"
113#include "llvm/Support/MemoryBuffer.h"
114#include "llvm/Support/Path.h"
115#include "llvm/Support/SaveAndRestore.h"
116#include "llvm/Support/Timer.h"
117#include "llvm/Support/VersionTuple.h"
118#include "llvm/Support/raw_ostream.h"
119#include <algorithm>
120#include <cassert>
121#include <cstddef>
122#include <cstdint>
123#include <cstdio>
124#include <ctime>
125#include <iterator>
126#include <limits>
127#include <map>
128#include <memory>
129#include <string>
130#include <system_error>
131#include <tuple>
132#include <utility>
133#include <vector>
134
135using namespace clang;
136using namespace clang::serialization;
137using namespace clang::serialization::reader;
138using llvm::BitstreamCursor;
139
140//===----------------------------------------------------------------------===//
141// ChainedASTReaderListener implementation
142//===----------------------------------------------------------------------===//
143
144bool
145ChainedASTReaderListener::ReadFullVersionInformation(StringRef FullVersion) {
146 return First->ReadFullVersionInformation(FullVersion) ||
147 Second->ReadFullVersionInformation(FullVersion);
148}
149
150void ChainedASTReaderListener::ReadModuleName(StringRef ModuleName) {
151 First->ReadModuleName(ModuleName);
152 Second->ReadModuleName(ModuleName);
153}
154
155void ChainedASTReaderListener::ReadModuleMapFile(StringRef ModuleMapPath) {
156 First->ReadModuleMapFile(ModuleMapPath);
157 Second->ReadModuleMapFile(ModuleMapPath);
158}
159
160bool
161ChainedASTReaderListener::ReadLanguageOptions(const LangOptions &LangOpts,
162 bool Complain,
163 bool AllowCompatibleDifferences) {
164 return First->ReadLanguageOptions(LangOpts, Complain,
165 AllowCompatibleDifferences) ||
166 Second->ReadLanguageOptions(LangOpts, Complain,
167 AllowCompatibleDifferences);
168}
169
170bool ChainedASTReaderListener::ReadTargetOptions(
171 const TargetOptions &TargetOpts, bool Complain,
172 bool AllowCompatibleDifferences) {
173 return First->ReadTargetOptions(TargetOpts, Complain,
174 AllowCompatibleDifferences) ||
175 Second->ReadTargetOptions(TargetOpts, Complain,
176 AllowCompatibleDifferences);
177}
178
179bool ChainedASTReaderListener::ReadDiagnosticOptions(
180 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) {
181 return First->ReadDiagnosticOptions(DiagOpts, Complain) ||
182 Second->ReadDiagnosticOptions(DiagOpts, Complain);
183}
184
185bool
186ChainedASTReaderListener::ReadFileSystemOptions(const FileSystemOptions &FSOpts,
187 bool Complain) {
188 return First->ReadFileSystemOptions(FSOpts, Complain) ||
189 Second->ReadFileSystemOptions(FSOpts, Complain);
190}
191
192bool ChainedASTReaderListener::ReadHeaderSearchOptions(
193 const HeaderSearchOptions &HSOpts, StringRef SpecificModuleCachePath,
194 bool Complain) {
195 return First->ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
196 Complain) ||
197 Second->ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
198 Complain);
199}
200
201bool ChainedASTReaderListener::ReadPreprocessorOptions(
202 const PreprocessorOptions &PPOpts, bool Complain,
203 std::string &SuggestedPredefines) {
204 return First->ReadPreprocessorOptions(PPOpts, Complain,
205 SuggestedPredefines) ||
206 Second->ReadPreprocessorOptions(PPOpts, Complain, SuggestedPredefines);
207}
208
209void ChainedASTReaderListener::ReadCounter(const serialization::ModuleFile &M,
210 unsigned Value) {
211 First->ReadCounter(M, Value);
212 Second->ReadCounter(M, Value);
213}
214
215bool ChainedASTReaderListener::needsInputFileVisitation() {
216 return First->needsInputFileVisitation() ||
217 Second->needsInputFileVisitation();
218}
219
220bool ChainedASTReaderListener::needsSystemInputFileVisitation() {
221 return First->needsSystemInputFileVisitation() ||
222 Second->needsSystemInputFileVisitation();
223}
224
225void ChainedASTReaderListener::visitModuleFile(StringRef Filename,
226 ModuleKind Kind) {
227 First->visitModuleFile(Filename, Kind);
228 Second->visitModuleFile(Filename, Kind);
229}
230
231bool ChainedASTReaderListener::visitInputFile(StringRef Filename,
232 bool isSystem,
233 bool isOverridden,
234 bool isExplicitModule) {
235 bool Continue = false;
236 if (First->needsInputFileVisitation() &&
237 (!isSystem || First->needsSystemInputFileVisitation()))
238 Continue |= First->visitInputFile(Filename, isSystem, isOverridden,
239 isExplicitModule);
240 if (Second->needsInputFileVisitation() &&
241 (!isSystem || Second->needsSystemInputFileVisitation()))
242 Continue |= Second->visitInputFile(Filename, isSystem, isOverridden,
243 isExplicitModule);
244 return Continue;
245}
246
247void ChainedASTReaderListener::readModuleFileExtension(
248 const ModuleFileExtensionMetadata &Metadata) {
249 First->readModuleFileExtension(Metadata);
250 Second->readModuleFileExtension(Metadata);
251}
252
253//===----------------------------------------------------------------------===//
254// PCH validator implementation
255//===----------------------------------------------------------------------===//
256
257ASTReaderListener::~ASTReaderListener() = default;
258
259/// Compare the given set of language options against an existing set of
260/// language options.
261///
262/// \param Diags If non-NULL, diagnostics will be emitted via this engine.
263/// \param AllowCompatibleDifferences If true, differences between compatible
264/// language options will be permitted.
265///
266/// \returns true if the languagae options mis-match, false otherwise.
267static bool checkLanguageOptions(const LangOptions &LangOpts,
268 const LangOptions &ExistingLangOpts,
269 DiagnosticsEngine *Diags,
270 bool AllowCompatibleDifferences = true) {
271#define LANGOPT(Name, Bits, Default, Description) \
272 if (ExistingLangOpts.Name != LangOpts.Name) { \
273 if (Diags) \
274 Diags->Report(diag::err_pch_langopt_mismatch) \
275 << Description << LangOpts.Name << ExistingLangOpts.Name; \
276 return true; \
277 }
278
279#define VALUE_LANGOPT(Name, Bits, Default, Description) \
280 if (ExistingLangOpts.Name != LangOpts.Name) { \
281 if (Diags) \
282 Diags->Report(diag::err_pch_langopt_value_mismatch) \
283 << Description; \
284 return true; \
285 }
286
287#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
288 if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \
289 if (Diags) \
290 Diags->Report(diag::err_pch_langopt_value_mismatch) \
291 << Description; \
292 return true; \
293 }
294
295#define COMPATIBLE_LANGOPT(Name, Bits, Default, Description) \
296 if (!AllowCompatibleDifferences) \
297 LANGOPT(Name, Bits, Default, Description)
298
299#define COMPATIBLE_ENUM_LANGOPT(Name, Bits, Default, Description) \
300 if (!AllowCompatibleDifferences) \
301 ENUM_LANGOPT(Name, Bits, Default, Description)
302
303#define COMPATIBLE_VALUE_LANGOPT(Name, Bits, Default, Description) \
304 if (!AllowCompatibleDifferences) \
305 VALUE_LANGOPT(Name, Bits, Default, Description)
306
307#define BENIGN_LANGOPT(Name, Bits, Default, Description)
308#define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description)
309#define BENIGN_VALUE_LANGOPT(Name, Type, Bits, Default, Description)
310#include "clang/Basic/LangOptions.def"
311
312 if (ExistingLangOpts.ModuleFeatures != LangOpts.ModuleFeatures) {
313 if (Diags)
314 Diags->Report(diag::err_pch_langopt_value_mismatch) << "module features";
315 return true;
316 }
317
318 if (ExistingLangOpts.ObjCRuntime != LangOpts.ObjCRuntime) {
319 if (Diags)
320 Diags->Report(diag::err_pch_langopt_value_mismatch)
321 << "target Objective-C runtime";
322 return true;
323 }
324
325 if (ExistingLangOpts.CommentOpts.BlockCommandNames !=
326 LangOpts.CommentOpts.BlockCommandNames) {
327 if (Diags)
328 Diags->Report(diag::err_pch_langopt_value_mismatch)
329 << "block command names";
330 return true;
331 }
332
333 // Sanitizer feature mismatches are treated as compatible differences. If
334 // compatible differences aren't allowed, we still only want to check for
335 // mismatches of non-modular sanitizers (the only ones which can affect AST
336 // generation).
337 if (!AllowCompatibleDifferences) {
338 SanitizerMask ModularSanitizers = getPPTransparentSanitizers();
339 SanitizerSet ExistingSanitizers = ExistingLangOpts.Sanitize;
340 SanitizerSet ImportedSanitizers = LangOpts.Sanitize;
341 ExistingSanitizers.clear(ModularSanitizers);
342 ImportedSanitizers.clear(ModularSanitizers);
343 if (ExistingSanitizers.Mask != ImportedSanitizers.Mask) {
344 const std::string Flag = "-fsanitize=";
345 if (Diags) {
346#define SANITIZER(NAME, ID) \
347 { \
348 bool InExistingModule = ExistingSanitizers.has(SanitizerKind::ID); \
349 bool InImportedModule = ImportedSanitizers.has(SanitizerKind::ID); \
350 if (InExistingModule != InImportedModule) \
351 Diags->Report(diag::err_pch_targetopt_feature_mismatch) \
352 << InExistingModule << (Flag + NAME); \
353 }
354#include "clang/Basic/Sanitizers.def"
355 }
356 return true;
357 }
358 }
359
360 return false;
361}
362
363/// Compare the given set of target options against an existing set of
364/// target options.
365///
366/// \param Diags If non-NULL, diagnostics will be emitted via this engine.
367///
368/// \returns true if the target options mis-match, false otherwise.
369static bool checkTargetOptions(const TargetOptions &TargetOpts,
370 const TargetOptions &ExistingTargetOpts,
371 DiagnosticsEngine *Diags,
372 bool AllowCompatibleDifferences = true) {
373#define CHECK_TARGET_OPT(Field, Name) \
374 if (TargetOpts.Field != ExistingTargetOpts.Field) { \
375 if (Diags) \
376 Diags->Report(diag::err_pch_targetopt_mismatch) \
377 << Name << TargetOpts.Field << ExistingTargetOpts.Field; \
378 return true; \
379 }
380
381 // The triple and ABI must match exactly.
382 CHECK_TARGET_OPT(Triple, "target");
383 CHECK_TARGET_OPT(ABI, "target ABI");
384
385 // We can tolerate different CPUs in many cases, notably when one CPU
386 // supports a strict superset of another. When allowing compatible
387 // differences skip this check.
388 if (!AllowCompatibleDifferences)
389 CHECK_TARGET_OPT(CPU, "target CPU");
390
391#undef CHECK_TARGET_OPT
392
393 // Compare feature sets.
394 SmallVector<StringRef, 4> ExistingFeatures(
395 ExistingTargetOpts.FeaturesAsWritten.begin(),
396 ExistingTargetOpts.FeaturesAsWritten.end());
397 SmallVector<StringRef, 4> ReadFeatures(TargetOpts.FeaturesAsWritten.begin(),
398 TargetOpts.FeaturesAsWritten.end());
399 llvm::sort(ExistingFeatures);
400 llvm::sort(ReadFeatures);
401
402 // We compute the set difference in both directions explicitly so that we can
403 // diagnose the differences differently.
404 SmallVector<StringRef, 4> UnmatchedExistingFeatures, UnmatchedReadFeatures;
405 std::set_difference(
406 ExistingFeatures.begin(), ExistingFeatures.end(), ReadFeatures.begin(),
407 ReadFeatures.end(), std::back_inserter(UnmatchedExistingFeatures));
408 std::set_difference(ReadFeatures.begin(), ReadFeatures.end(),
409 ExistingFeatures.begin(), ExistingFeatures.end(),
410 std::back_inserter(UnmatchedReadFeatures));
411
412 // If we are allowing compatible differences and the read feature set is
413 // a strict subset of the existing feature set, there is nothing to diagnose.
414 if (AllowCompatibleDifferences && UnmatchedReadFeatures.empty())
415 return false;
416
417 if (Diags) {
418 for (StringRef Feature : UnmatchedReadFeatures)
419 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
420 << /* is-existing-feature */ false << Feature;
421 for (StringRef Feature : UnmatchedExistingFeatures)
422 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
423 << /* is-existing-feature */ true << Feature;
424 }
425
426 return !UnmatchedReadFeatures.empty() || !UnmatchedExistingFeatures.empty();
427}
428
429bool
430PCHValidator::ReadLanguageOptions(const LangOptions &LangOpts,
431 bool Complain,
432 bool AllowCompatibleDifferences) {
433 const LangOptions &ExistingLangOpts = PP.getLangOpts();
434 return checkLanguageOptions(LangOpts, ExistingLangOpts,
435 Complain ? &Reader.Diags : nullptr,
436 AllowCompatibleDifferences);
437}
438
439bool PCHValidator::ReadTargetOptions(const TargetOptions &TargetOpts,
440 bool Complain,
441 bool AllowCompatibleDifferences) {
442 const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts();
443 return checkTargetOptions(TargetOpts, ExistingTargetOpts,
444 Complain ? &Reader.Diags : nullptr,
445 AllowCompatibleDifferences);
446}
447
448namespace {
449
450using MacroDefinitionsMap =
451 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/>>;
452using DeclsMap = llvm::DenseMap<DeclarationName, SmallVector<NamedDecl *, 8>>;
453
454} // namespace
455
456static bool checkDiagnosticGroupMappings(DiagnosticsEngine &StoredDiags,
457 DiagnosticsEngine &Diags,
458 bool Complain) {
459 using Level = DiagnosticsEngine::Level;
460
461 // Check current mappings for new -Werror mappings, and the stored mappings
462 // for cases that were explicitly mapped to *not* be errors that are now
463 // errors because of options like -Werror.
464 DiagnosticsEngine *MappingSources[] = { &Diags, &StoredDiags };
465
466 for (DiagnosticsEngine *MappingSource : MappingSources) {
467 for (auto DiagIDMappingPair : MappingSource->getDiagnosticMappings()) {
468 diag::kind DiagID = DiagIDMappingPair.first;
469 Level CurLevel = Diags.getDiagnosticLevel(DiagID, SourceLocation());
470 if (CurLevel < DiagnosticsEngine::Error)
471 continue; // not significant
472 Level StoredLevel =
473 StoredDiags.getDiagnosticLevel(DiagID, SourceLocation());
474 if (StoredLevel < DiagnosticsEngine::Error) {
475 if (Complain)
476 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror=" +
477 Diags.getDiagnosticIDs()->getWarningOptionForDiag(DiagID).str();
478 return true;
479 }
480 }
481 }
482
483 return false;
484}
485
486static bool isExtHandlingFromDiagsError(DiagnosticsEngine &Diags) {
487 diag::Severity Ext = Diags.getExtensionHandlingBehavior();
488 if (Ext == diag::Severity::Warning && Diags.getWarningsAsErrors())
489 return true;
490 return Ext >= diag::Severity::Error;
491}
492
493static bool checkDiagnosticMappings(DiagnosticsEngine &StoredDiags,
494 DiagnosticsEngine &Diags,
495 bool IsSystem, bool Complain) {
496 // Top-level options
497 if (IsSystem) {
498 if (Diags.getSuppressSystemWarnings())
499 return false;
500 // If -Wsystem-headers was not enabled before, be conservative
501 if (StoredDiags.getSuppressSystemWarnings()) {
502 if (Complain)
503 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Wsystem-headers";
504 return true;
505 }
506 }
507
508 if (Diags.getWarningsAsErrors() && !StoredDiags.getWarningsAsErrors()) {
509 if (Complain)
510 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror";
511 return true;
512 }
513
514 if (Diags.getWarningsAsErrors() && Diags.getEnableAllWarnings() &&
515 !StoredDiags.getEnableAllWarnings()) {
516 if (Complain)
517 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Weverything -Werror";
518 return true;
519 }
520
521 if (isExtHandlingFromDiagsError(Diags) &&
522 !isExtHandlingFromDiagsError(StoredDiags)) {
523 if (Complain)
524 Diags.Report(diag::err_pch_diagopt_mismatch) << "-pedantic-errors";
525 return true;
526 }
527
528 return checkDiagnosticGroupMappings(StoredDiags, Diags, Complain);
529}
530
531/// Return the top import module if it is implicit, nullptr otherwise.
532static Module *getTopImportImplicitModule(ModuleManager &ModuleMgr,
533 Preprocessor &PP) {
534 // If the original import came from a file explicitly generated by the user,
535 // don't check the diagnostic mappings.
536 // FIXME: currently this is approximated by checking whether this is not a
537 // module import of an implicitly-loaded module file.
538 // Note: ModuleMgr.rbegin() may not be the current module, but it must be in
539 // the transitive closure of its imports, since unrelated modules cannot be
540 // imported until after this module finishes validation.
541 ModuleFile *TopImport = &*ModuleMgr.rbegin();
542 while (!TopImport->ImportedBy.empty())
543 TopImport = TopImport->ImportedBy[0];
544 if (TopImport->Kind != MK_ImplicitModule)
545 return nullptr;
546
547 StringRef ModuleName = TopImport->ModuleName;
548 assert(!ModuleName.empty() && "diagnostic options read before module name")((!ModuleName.empty() && "diagnostic options read before module name"
) ? static_cast<void> (0) : __assert_fail ("!ModuleName.empty() && \"diagnostic options read before module name\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 548, __PRETTY_FUNCTION__))
;
549
550 Module *M = PP.getHeaderSearchInfo().lookupModule(ModuleName);
551 assert(M && "missing module")((M && "missing module") ? static_cast<void> (0
) : __assert_fail ("M && \"missing module\"", "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 551, __PRETTY_FUNCTION__))
;
552 return M;
553}
554
555bool PCHValidator::ReadDiagnosticOptions(
556 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) {
557 DiagnosticsEngine &ExistingDiags = PP.getDiagnostics();
558 IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(ExistingDiags.getDiagnosticIDs());
559 IntrusiveRefCntPtr<DiagnosticsEngine> Diags(
560 new DiagnosticsEngine(DiagIDs, DiagOpts.get()));
561 // This should never fail, because we would have processed these options
562 // before writing them to an ASTFile.
563 ProcessWarningOptions(*Diags, *DiagOpts, /*Report*/false);
564
565 ModuleManager &ModuleMgr = Reader.getModuleManager();
566 assert(ModuleMgr.size() >= 1 && "what ASTFile is this then")((ModuleMgr.size() >= 1 && "what ASTFile is this then"
) ? static_cast<void> (0) : __assert_fail ("ModuleMgr.size() >= 1 && \"what ASTFile is this then\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 566, __PRETTY_FUNCTION__))
;
567
568 Module *TopM = getTopImportImplicitModule(ModuleMgr, PP);
569 if (!TopM)
570 return false;
571
572 // FIXME: if the diagnostics are incompatible, save a DiagnosticOptions that
573 // contains the union of their flags.
574 return checkDiagnosticMappings(*Diags, ExistingDiags, TopM->IsSystem,
575 Complain);
576}
577
578/// Collect the macro definitions provided by the given preprocessor
579/// options.
580static void
581collectMacroDefinitions(const PreprocessorOptions &PPOpts,
582 MacroDefinitionsMap &Macros,
583 SmallVectorImpl<StringRef> *MacroNames = nullptr) {
584 for (unsigned I = 0, N = PPOpts.Macros.size(); I != N; ++I) {
585 StringRef Macro = PPOpts.Macros[I].first;
586 bool IsUndef = PPOpts.Macros[I].second;
587
588 std::pair<StringRef, StringRef> MacroPair = Macro.split('=');
589 StringRef MacroName = MacroPair.first;
590 StringRef MacroBody = MacroPair.second;
591
592 // For an #undef'd macro, we only care about the name.
593 if (IsUndef) {
594 if (MacroNames && !Macros.count(MacroName))
595 MacroNames->push_back(MacroName);
596
597 Macros[MacroName] = std::make_pair("", true);
598 continue;
599 }
600
601 // For a #define'd macro, figure out the actual definition.
602 if (MacroName.size() == Macro.size())
603 MacroBody = "1";
604 else {
605 // Note: GCC drops anything following an end-of-line character.
606 StringRef::size_type End = MacroBody.find_first_of("\n\r");
607 MacroBody = MacroBody.substr(0, End);
608 }
609
610 if (MacroNames && !Macros.count(MacroName))
611 MacroNames->push_back(MacroName);
612 Macros[MacroName] = std::make_pair(MacroBody, false);
613 }
614}
615
616/// Check the preprocessor options deserialized from the control block
617/// against the preprocessor options in an existing preprocessor.
618///
619/// \param Diags If non-null, produce diagnostics for any mismatches incurred.
620/// \param Validate If true, validate preprocessor options. If false, allow
621/// macros defined by \p ExistingPPOpts to override those defined by
622/// \p PPOpts in SuggestedPredefines.
623static bool checkPreprocessorOptions(const PreprocessorOptions &PPOpts,
624 const PreprocessorOptions &ExistingPPOpts,
625 DiagnosticsEngine *Diags,
626 FileManager &FileMgr,
627 std::string &SuggestedPredefines,
628 const LangOptions &LangOpts,
629 bool Validate = true) {
630 // Check macro definitions.
631 MacroDefinitionsMap ASTFileMacros;
632 collectMacroDefinitions(PPOpts, ASTFileMacros);
633 MacroDefinitionsMap ExistingMacros;
634 SmallVector<StringRef, 4> ExistingMacroNames;
635 collectMacroDefinitions(ExistingPPOpts, ExistingMacros, &ExistingMacroNames);
636
637 for (unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) {
638 // Dig out the macro definition in the existing preprocessor options.
639 StringRef MacroName = ExistingMacroNames[I];
640 std::pair<StringRef, bool> Existing = ExistingMacros[MacroName];
641
642 // Check whether we know anything about this macro name or not.
643 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/>>::iterator Known =
644 ASTFileMacros.find(MacroName);
645 if (!Validate || Known == ASTFileMacros.end()) {
646 // FIXME: Check whether this identifier was referenced anywhere in the
647 // AST file. If so, we should reject the AST file. Unfortunately, this
648 // information isn't in the control block. What shall we do about it?
649
650 if (Existing.second) {
651 SuggestedPredefines += "#undef ";
652 SuggestedPredefines += MacroName.str();
653 SuggestedPredefines += '\n';
654 } else {
655 SuggestedPredefines += "#define ";
656 SuggestedPredefines += MacroName.str();
657 SuggestedPredefines += ' ';
658 SuggestedPredefines += Existing.first.str();
659 SuggestedPredefines += '\n';
660 }
661 continue;
662 }
663
664 // If the macro was defined in one but undef'd in the other, we have a
665 // conflict.
666 if (Existing.second != Known->second.second) {
667 if (Diags) {
668 Diags->Report(diag::err_pch_macro_def_undef)
669 << MacroName << Known->second.second;
670 }
671 return true;
672 }
673
674 // If the macro was #undef'd in both, or if the macro bodies are identical,
675 // it's fine.
676 if (Existing.second || Existing.first == Known->second.first)
677 continue;
678
679 // The macro bodies differ; complain.
680 if (Diags) {
681 Diags->Report(diag::err_pch_macro_def_conflict)
682 << MacroName << Known->second.first << Existing.first;
683 }
684 return true;
685 }
686
687 // Check whether we're using predefines.
688 if (PPOpts.UsePredefines != ExistingPPOpts.UsePredefines && Validate) {
689 if (Diags) {
690 Diags->Report(diag::err_pch_undef) << ExistingPPOpts.UsePredefines;
691 }
692 return true;
693 }
694
695 // Detailed record is important since it is used for the module cache hash.
696 if (LangOpts.Modules &&
697 PPOpts.DetailedRecord != ExistingPPOpts.DetailedRecord && Validate) {
698 if (Diags) {
699 Diags->Report(diag::err_pch_pp_detailed_record) << PPOpts.DetailedRecord;
700 }
701 return true;
702 }
703
704 // Compute the #include and #include_macros lines we need.
705 for (unsigned I = 0, N = ExistingPPOpts.Includes.size(); I != N; ++I) {
706 StringRef File = ExistingPPOpts.Includes[I];
707
708 if (!ExistingPPOpts.ImplicitPCHInclude.empty() &&
709 !ExistingPPOpts.PCHThroughHeader.empty()) {
710 // In case the through header is an include, we must add all the includes
711 // to the predefines so the start point can be determined.
712 SuggestedPredefines += "#include \"";
713 SuggestedPredefines += File;
714 SuggestedPredefines += "\"\n";
715 continue;
716 }
717
718 if (File == ExistingPPOpts.ImplicitPCHInclude)
719 continue;
720
721 if (std::find(PPOpts.Includes.begin(), PPOpts.Includes.end(), File)
722 != PPOpts.Includes.end())
723 continue;
724
725 SuggestedPredefines += "#include \"";
726 SuggestedPredefines += File;
727 SuggestedPredefines += "\"\n";
728 }
729
730 for (unsigned I = 0, N = ExistingPPOpts.MacroIncludes.size(); I != N; ++I) {
731 StringRef File = ExistingPPOpts.MacroIncludes[I];
732 if (std::find(PPOpts.MacroIncludes.begin(), PPOpts.MacroIncludes.end(),
733 File)
734 != PPOpts.MacroIncludes.end())
735 continue;
736
737 SuggestedPredefines += "#__include_macros \"";
738 SuggestedPredefines += File;
739 SuggestedPredefines += "\"\n##\n";
740 }
741
742 return false;
743}
744
745bool PCHValidator::ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
746 bool Complain,
747 std::string &SuggestedPredefines) {
748 const PreprocessorOptions &ExistingPPOpts = PP.getPreprocessorOpts();
749
750 return checkPreprocessorOptions(PPOpts, ExistingPPOpts,
751 Complain? &Reader.Diags : nullptr,
752 PP.getFileManager(),
753 SuggestedPredefines,
754 PP.getLangOpts());
755}
756
757bool SimpleASTReaderListener::ReadPreprocessorOptions(
758 const PreprocessorOptions &PPOpts,
759 bool Complain,
760 std::string &SuggestedPredefines) {
761 return checkPreprocessorOptions(PPOpts,
762 PP.getPreprocessorOpts(),
763 nullptr,
764 PP.getFileManager(),
765 SuggestedPredefines,
766 PP.getLangOpts(),
767 false);
768}
769
770/// Check the header search options deserialized from the control block
771/// against the header search options in an existing preprocessor.
772///
773/// \param Diags If non-null, produce diagnostics for any mismatches incurred.
774static bool checkHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
775 StringRef SpecificModuleCachePath,
776 StringRef ExistingModuleCachePath,
777 DiagnosticsEngine *Diags,
778 const LangOptions &LangOpts) {
779 if (LangOpts.Modules) {
780 if (SpecificModuleCachePath != ExistingModuleCachePath) {
781 if (Diags)
782 Diags->Report(diag::err_pch_modulecache_mismatch)
783 << SpecificModuleCachePath << ExistingModuleCachePath;
784 return true;
785 }
786 }
787
788 return false;
789}
790
791bool PCHValidator::ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
792 StringRef SpecificModuleCachePath,
793 bool Complain) {
794 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
795 PP.getHeaderSearchInfo().getModuleCachePath(),
796 Complain ? &Reader.Diags : nullptr,
797 PP.getLangOpts());
798}
799
800void PCHValidator::ReadCounter(const ModuleFile &M, unsigned Value) {
801 PP.setCounterValue(Value);
802}
803
804//===----------------------------------------------------------------------===//
805// AST reader implementation
806//===----------------------------------------------------------------------===//
807
808void ASTReader::setDeserializationListener(ASTDeserializationListener *Listener,
809 bool TakeOwnership) {
810 DeserializationListener = Listener;
811 OwnsDeserializationListener = TakeOwnership;
812}
813
814unsigned ASTSelectorLookupTrait::ComputeHash(Selector Sel) {
815 return serialization::ComputeHash(Sel);
816}
817
818std::pair<unsigned, unsigned>
819ASTSelectorLookupTrait::ReadKeyDataLength(const unsigned char*& d) {
820 using namespace llvm::support;
821
822 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
823 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
824 return std::make_pair(KeyLen, DataLen);
825}
826
827ASTSelectorLookupTrait::internal_key_type
828ASTSelectorLookupTrait::ReadKey(const unsigned char* d, unsigned) {
829 using namespace llvm::support;
830
831 SelectorTable &SelTable = Reader.getContext().Selectors;
832 unsigned N = endian::readNext<uint16_t, little, unaligned>(d);
833 IdentifierInfo *FirstII = Reader.getLocalIdentifier(
834 F, endian::readNext<uint32_t, little, unaligned>(d));
835 if (N == 0)
836 return SelTable.getNullarySelector(FirstII);
837 else if (N == 1)
838 return SelTable.getUnarySelector(FirstII);
839
840 SmallVector<IdentifierInfo *, 16> Args;
841 Args.push_back(FirstII);
842 for (unsigned I = 1; I != N; ++I)
843 Args.push_back(Reader.getLocalIdentifier(
844 F, endian::readNext<uint32_t, little, unaligned>(d)));
845
846 return SelTable.getSelector(N, Args.data());
847}
848
849ASTSelectorLookupTrait::data_type
850ASTSelectorLookupTrait::ReadData(Selector, const unsigned char* d,
851 unsigned DataLen) {
852 using namespace llvm::support;
853
854 data_type Result;
855
856 Result.ID = Reader.getGlobalSelectorID(
857 F, endian::readNext<uint32_t, little, unaligned>(d));
858 unsigned FullInstanceBits = endian::readNext<uint16_t, little, unaligned>(d);
859 unsigned FullFactoryBits = endian::readNext<uint16_t, little, unaligned>(d);
860 Result.InstanceBits = FullInstanceBits & 0x3;
861 Result.InstanceHasMoreThanOneDecl = (FullInstanceBits >> 2) & 0x1;
862 Result.FactoryBits = FullFactoryBits & 0x3;
863 Result.FactoryHasMoreThanOneDecl = (FullFactoryBits >> 2) & 0x1;
864 unsigned NumInstanceMethods = FullInstanceBits >> 3;
865 unsigned NumFactoryMethods = FullFactoryBits >> 3;
866
867 // Load instance methods
868 for (unsigned I = 0; I != NumInstanceMethods; ++I) {
869 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
870 F, endian::readNext<uint32_t, little, unaligned>(d)))
871 Result.Instance.push_back(Method);
872 }
873
874 // Load factory methods
875 for (unsigned I = 0; I != NumFactoryMethods; ++I) {
876 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
877 F, endian::readNext<uint32_t, little, unaligned>(d)))
878 Result.Factory.push_back(Method);
879 }
880
881 return Result;
882}
883
884unsigned ASTIdentifierLookupTraitBase::ComputeHash(const internal_key_type& a) {
885 return llvm::djbHash(a);
886}
887
888std::pair<unsigned, unsigned>
889ASTIdentifierLookupTraitBase::ReadKeyDataLength(const unsigned char*& d) {
890 using namespace llvm::support;
891
892 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
893 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
894 return std::make_pair(KeyLen, DataLen);
895}
896
897ASTIdentifierLookupTraitBase::internal_key_type
898ASTIdentifierLookupTraitBase::ReadKey(const unsigned char* d, unsigned n) {
899 assert(n >= 2 && d[n-1] == '\0')((n >= 2 && d[n-1] == '\0') ? static_cast<void>
(0) : __assert_fail ("n >= 2 && d[n-1] == '\\0'",
"/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 899, __PRETTY_FUNCTION__))
;
900 return StringRef((const char*) d, n-1);
901}
902
903/// Whether the given identifier is "interesting".
904static bool isInterestingIdentifier(ASTReader &Reader, IdentifierInfo &II,
905 bool IsModule) {
906 return II.hadMacroDefinition() ||
907 II.isPoisoned() ||
908 (IsModule ? II.hasRevertedBuiltin() : II.getObjCOrBuiltinID()) ||
909 II.hasRevertedTokenIDToIdentifier() ||
910 (!(IsModule && Reader.getPreprocessor().getLangOpts().CPlusPlus) &&
911 II.getFETokenInfo());
912}
913
914static bool readBit(unsigned &Bits) {
915 bool Value = Bits & 0x1;
916 Bits >>= 1;
917 return Value;
918}
919
920IdentID ASTIdentifierLookupTrait::ReadIdentifierID(const unsigned char *d) {
921 using namespace llvm::support;
922
923 unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d);
924 return Reader.getGlobalIdentifierID(F, RawID >> 1);
925}
926
927static void markIdentifierFromAST(ASTReader &Reader, IdentifierInfo &II) {
928 if (!II.isFromAST()) {
929 II.setIsFromAST();
930 bool IsModule = Reader.getPreprocessor().getCurrentModule() != nullptr;
931 if (isInterestingIdentifier(Reader, II, IsModule))
932 II.setChangedSinceDeserialization();
933 }
934}
935
936IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k,
937 const unsigned char* d,
938 unsigned DataLen) {
939 using namespace llvm::support;
940
941 unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d);
942 bool IsInteresting = RawID & 0x01;
943
944 // Wipe out the "is interesting" bit.
945 RawID = RawID >> 1;
946
947 // Build the IdentifierInfo and link the identifier ID with it.
948 IdentifierInfo *II = KnownII;
949 if (!II) {
950 II = &Reader.getIdentifierTable().getOwn(k);
951 KnownII = II;
952 }
953 markIdentifierFromAST(Reader, *II);
954 Reader.markIdentifierUpToDate(II);
955
956 IdentID ID = Reader.getGlobalIdentifierID(F, RawID);
957 if (!IsInteresting) {
958 // For uninteresting identifiers, there's nothing else to do. Just notify
959 // the reader that we've finished loading this identifier.
960 Reader.SetIdentifierInfo(ID, II);
961 return II;
962 }
963
964 unsigned ObjCOrBuiltinID = endian::readNext<uint16_t, little, unaligned>(d);
965 unsigned Bits = endian::readNext<uint16_t, little, unaligned>(d);
966 bool CPlusPlusOperatorKeyword = readBit(Bits);
967 bool HasRevertedTokenIDToIdentifier = readBit(Bits);
968 bool HasRevertedBuiltin = readBit(Bits);
969 bool Poisoned = readBit(Bits);
970 bool ExtensionToken = readBit(Bits);
971 bool HadMacroDefinition = readBit(Bits);
972
973 assert(Bits == 0 && "Extra bits in the identifier?")((Bits == 0 && "Extra bits in the identifier?") ? static_cast
<void> (0) : __assert_fail ("Bits == 0 && \"Extra bits in the identifier?\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 973, __PRETTY_FUNCTION__))
;
974 DataLen -= 8;
975
976 // Set or check the various bits in the IdentifierInfo structure.
977 // Token IDs are read-only.
978 if (HasRevertedTokenIDToIdentifier && II->getTokenID() != tok::identifier)
979 II->revertTokenIDToIdentifier();
980 if (!F.isModule())
981 II->setObjCOrBuiltinID(ObjCOrBuiltinID);
982 else if (HasRevertedBuiltin && II->getBuiltinID()) {
983 II->revertBuiltin();
984 assert((II->hasRevertedBuiltin() ||(((II->hasRevertedBuiltin() || II->getObjCOrBuiltinID()
== ObjCOrBuiltinID) && "Incorrect ObjC keyword or builtin ID"
) ? static_cast<void> (0) : __assert_fail ("(II->hasRevertedBuiltin() || II->getObjCOrBuiltinID() == ObjCOrBuiltinID) && \"Incorrect ObjC keyword or builtin ID\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 986, __PRETTY_FUNCTION__))
985 II->getObjCOrBuiltinID() == ObjCOrBuiltinID) &&(((II->hasRevertedBuiltin() || II->getObjCOrBuiltinID()
== ObjCOrBuiltinID) && "Incorrect ObjC keyword or builtin ID"
) ? static_cast<void> (0) : __assert_fail ("(II->hasRevertedBuiltin() || II->getObjCOrBuiltinID() == ObjCOrBuiltinID) && \"Incorrect ObjC keyword or builtin ID\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 986, __PRETTY_FUNCTION__))
986 "Incorrect ObjC keyword or builtin ID")(((II->hasRevertedBuiltin() || II->getObjCOrBuiltinID()
== ObjCOrBuiltinID) && "Incorrect ObjC keyword or builtin ID"
) ? static_cast<void> (0) : __assert_fail ("(II->hasRevertedBuiltin() || II->getObjCOrBuiltinID() == ObjCOrBuiltinID) && \"Incorrect ObjC keyword or builtin ID\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 986, __PRETTY_FUNCTION__))
;
987 }
988 assert(II->isExtensionToken() == ExtensionToken &&((II->isExtensionToken() == ExtensionToken && "Incorrect extension token flag"
) ? static_cast<void> (0) : __assert_fail ("II->isExtensionToken() == ExtensionToken && \"Incorrect extension token flag\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 989, __PRETTY_FUNCTION__))
989 "Incorrect extension token flag")((II->isExtensionToken() == ExtensionToken && "Incorrect extension token flag"
) ? static_cast<void> (0) : __assert_fail ("II->isExtensionToken() == ExtensionToken && \"Incorrect extension token flag\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 989, __PRETTY_FUNCTION__))
;
990 (void)ExtensionToken;
991 if (Poisoned)
992 II->setIsPoisoned(true);
993 assert(II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword &&((II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword
&& "Incorrect C++ operator keyword flag") ? static_cast
<void> (0) : __assert_fail ("II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword && \"Incorrect C++ operator keyword flag\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 994, __PRETTY_FUNCTION__))
994 "Incorrect C++ operator keyword flag")((II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword
&& "Incorrect C++ operator keyword flag") ? static_cast
<void> (0) : __assert_fail ("II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword && \"Incorrect C++ operator keyword flag\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 994, __PRETTY_FUNCTION__))
;
995 (void)CPlusPlusOperatorKeyword;
996
997 // If this identifier is a macro, deserialize the macro
998 // definition.
999 if (HadMacroDefinition) {
1000 uint32_t MacroDirectivesOffset =
1001 endian::readNext<uint32_t, little, unaligned>(d);
1002 DataLen -= 4;
1003
1004 Reader.addPendingMacro(II, &F, MacroDirectivesOffset);
1005 }
1006
1007 Reader.SetIdentifierInfo(ID, II);
1008
1009 // Read all of the declarations visible at global scope with this
1010 // name.
1011 if (DataLen > 0) {
1012 SmallVector<uint32_t, 4> DeclIDs;
1013 for (; DataLen > 0; DataLen -= 4)
1014 DeclIDs.push_back(Reader.getGlobalDeclID(
1015 F, endian::readNext<uint32_t, little, unaligned>(d)));
1016 Reader.SetGloballyVisibleDecls(II, DeclIDs);
1017 }
1018
1019 return II;
1020}
1021
1022DeclarationNameKey::DeclarationNameKey(DeclarationName Name)
1023 : Kind(Name.getNameKind()) {
1024 switch (Kind) {
1025 case DeclarationName::Identifier:
1026 Data = (uint64_t)Name.getAsIdentifierInfo();
1027 break;
1028 case DeclarationName::ObjCZeroArgSelector:
1029 case DeclarationName::ObjCOneArgSelector:
1030 case DeclarationName::ObjCMultiArgSelector:
1031 Data = (uint64_t)Name.getObjCSelector().getAsOpaquePtr();
1032 break;
1033 case DeclarationName::CXXOperatorName:
1034 Data = Name.getCXXOverloadedOperator();
1035 break;
1036 case DeclarationName::CXXLiteralOperatorName:
1037 Data = (uint64_t)Name.getCXXLiteralIdentifier();
1038 break;
1039 case DeclarationName::CXXDeductionGuideName:
1040 Data = (uint64_t)Name.getCXXDeductionGuideTemplate()
1041 ->getDeclName().getAsIdentifierInfo();
1042 break;
1043 case DeclarationName::CXXConstructorName:
1044 case DeclarationName::CXXDestructorName:
1045 case DeclarationName::CXXConversionFunctionName:
1046 case DeclarationName::CXXUsingDirective:
1047 Data = 0;
1048 break;
1049 }
1050}
1051
1052unsigned DeclarationNameKey::getHash() const {
1053 llvm::FoldingSetNodeID ID;
1054 ID.AddInteger(Kind);
1055
1056 switch (Kind) {
1057 case DeclarationName::Identifier:
1058 case DeclarationName::CXXLiteralOperatorName:
1059 case DeclarationName::CXXDeductionGuideName:
1060 ID.AddString(((IdentifierInfo*)Data)->getName());
1061 break;
1062 case DeclarationName::ObjCZeroArgSelector:
1063 case DeclarationName::ObjCOneArgSelector:
1064 case DeclarationName::ObjCMultiArgSelector:
1065 ID.AddInteger(serialization::ComputeHash(Selector(Data)));
1066 break;
1067 case DeclarationName::CXXOperatorName:
1068 ID.AddInteger((OverloadedOperatorKind)Data);
1069 break;
1070 case DeclarationName::CXXConstructorName:
1071 case DeclarationName::CXXDestructorName:
1072 case DeclarationName::CXXConversionFunctionName:
1073 case DeclarationName::CXXUsingDirective:
1074 break;
1075 }
1076
1077 return ID.ComputeHash();
1078}
1079
1080ModuleFile *
1081ASTDeclContextNameLookupTrait::ReadFileRef(const unsigned char *&d) {
1082 using namespace llvm::support;
1083
1084 uint32_t ModuleFileID = endian::readNext<uint32_t, little, unaligned>(d);
1085 return Reader.getLocalModuleFile(F, ModuleFileID);
1086}
1087
1088std::pair<unsigned, unsigned>
1089ASTDeclContextNameLookupTrait::ReadKeyDataLength(const unsigned char *&d) {
1090 using namespace llvm::support;
1091
1092 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
1093 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
1094 return std::make_pair(KeyLen, DataLen);
1095}
1096
1097ASTDeclContextNameLookupTrait::internal_key_type
1098ASTDeclContextNameLookupTrait::ReadKey(const unsigned char *d, unsigned) {
1099 using namespace llvm::support;
1100
1101 auto Kind = (DeclarationName::NameKind)*d++;
1102 uint64_t Data;
1103 switch (Kind) {
1104 case DeclarationName::Identifier:
1105 case DeclarationName::CXXLiteralOperatorName:
1106 case DeclarationName::CXXDeductionGuideName:
1107 Data = (uint64_t)Reader.getLocalIdentifier(
1108 F, endian::readNext<uint32_t, little, unaligned>(d));
1109 break;
1110 case DeclarationName::ObjCZeroArgSelector:
1111 case DeclarationName::ObjCOneArgSelector:
1112 case DeclarationName::ObjCMultiArgSelector:
1113 Data =
1114 (uint64_t)Reader.getLocalSelector(
1115 F, endian::readNext<uint32_t, little, unaligned>(
1116 d)).getAsOpaquePtr();
1117 break;
1118 case DeclarationName::CXXOperatorName:
1119 Data = *d++; // OverloadedOperatorKind
1120 break;
1121 case DeclarationName::CXXConstructorName:
1122 case DeclarationName::CXXDestructorName:
1123 case DeclarationName::CXXConversionFunctionName:
1124 case DeclarationName::CXXUsingDirective:
1125 Data = 0;
1126 break;
1127 }
1128
1129 return DeclarationNameKey(Kind, Data);
1130}
1131
1132void ASTDeclContextNameLookupTrait::ReadDataInto(internal_key_type,
1133 const unsigned char *d,
1134 unsigned DataLen,
1135 data_type_builder &Val) {
1136 using namespace llvm::support;
1137
1138 for (unsigned NumDecls = DataLen / 4; NumDecls; --NumDecls) {
1139 uint32_t LocalID = endian::readNext<uint32_t, little, unaligned>(d);
1140 Val.insert(Reader.getGlobalDeclID(F, LocalID));
1141 }
1142}
1143
1144bool ASTReader::ReadLexicalDeclContextStorage(ModuleFile &M,
1145 BitstreamCursor &Cursor,
1146 uint64_t Offset,
1147 DeclContext *DC) {
1148 assert(Offset != 0)((Offset != 0) ? static_cast<void> (0) : __assert_fail (
"Offset != 0", "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 1148, __PRETTY_FUNCTION__))
;
1149
1150 SavedStreamPosition SavedPosition(Cursor);
1151 Cursor.JumpToBit(Offset);
1152
1153 RecordData Record;
1154 StringRef Blob;
1155 unsigned Code = Cursor.ReadCode();
1156 unsigned RecCode = Cursor.readRecord(Code, Record, &Blob);
1157 if (RecCode != DECL_CONTEXT_LEXICAL) {
1158 Error("Expected lexical block");
1159 return true;
1160 }
1161
1162 assert(!isa<TranslationUnitDecl>(DC) &&((!isa<TranslationUnitDecl>(DC) && "expected a TU_UPDATE_LEXICAL record for TU"
) ? static_cast<void> (0) : __assert_fail ("!isa<TranslationUnitDecl>(DC) && \"expected a TU_UPDATE_LEXICAL record for TU\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 1163, __PRETTY_FUNCTION__))
1163 "expected a TU_UPDATE_LEXICAL record for TU")((!isa<TranslationUnitDecl>(DC) && "expected a TU_UPDATE_LEXICAL record for TU"
) ? static_cast<void> (0) : __assert_fail ("!isa<TranslationUnitDecl>(DC) && \"expected a TU_UPDATE_LEXICAL record for TU\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 1163, __PRETTY_FUNCTION__))
;
1164 // If we are handling a C++ class template instantiation, we can see multiple
1165 // lexical updates for the same record. It's important that we select only one
1166 // of them, so that field numbering works properly. Just pick the first one we
1167 // see.
1168 auto &Lex = LexicalDecls[DC];
1169 if (!Lex.first) {
1170 Lex = std::make_pair(
1171 &M, llvm::makeArrayRef(
1172 reinterpret_cast<const llvm::support::unaligned_uint32_t *>(
1173 Blob.data()),
1174 Blob.size() / 4));
1175 }
1176 DC->setHasExternalLexicalStorage(true);
1177 return false;
1178}
1179
1180bool ASTReader::ReadVisibleDeclContextStorage(ModuleFile &M,
1181 BitstreamCursor &Cursor,
1182 uint64_t Offset,
1183 DeclID ID) {
1184 assert(Offset != 0)((Offset != 0) ? static_cast<void> (0) : __assert_fail (
"Offset != 0", "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 1184, __PRETTY_FUNCTION__))
;
1185
1186 SavedStreamPosition SavedPosition(Cursor);
1187 Cursor.JumpToBit(Offset);
1188
1189 RecordData Record;
1190 StringRef Blob;
1191 unsigned Code = Cursor.ReadCode();
1192 unsigned RecCode = Cursor.readRecord(Code, Record, &Blob);
1193 if (RecCode != DECL_CONTEXT_VISIBLE) {
1194 Error("Expected visible lookup table block");
1195 return true;
1196 }
1197
1198 // We can't safely determine the primary context yet, so delay attaching the
1199 // lookup table until we're done with recursive deserialization.
1200 auto *Data = (const unsigned char*)Blob.data();
1201 PendingVisibleUpdates[ID].push_back(PendingVisibleUpdate{&M, Data});
1202 return false;
1203}
1204
1205void ASTReader::Error(StringRef Msg) const {
1206 Error(diag::err_fe_pch_malformed, Msg);
1207 if (PP.getLangOpts().Modules && !Diags.isDiagnosticInFlight() &&
1208 !PP.getHeaderSearchInfo().getModuleCachePath().empty()) {
1209 Diag(diag::note_module_cache_path)
1210 << PP.getHeaderSearchInfo().getModuleCachePath();
1211 }
1212}
1213
1214void ASTReader::Error(unsigned DiagID,
1215 StringRef Arg1, StringRef Arg2) const {
1216 if (Diags.isDiagnosticInFlight())
1217 Diags.SetDelayedDiagnostic(DiagID, Arg1, Arg2);
1218 else
1219 Diag(DiagID) << Arg1 << Arg2;
1220}
1221
1222//===----------------------------------------------------------------------===//
1223// Source Manager Deserialization
1224//===----------------------------------------------------------------------===//
1225
1226/// Read the line table in the source manager block.
1227/// \returns true if there was an error.
1228bool ASTReader::ParseLineTable(ModuleFile &F,
1229 const RecordData &Record) {
1230 unsigned Idx = 0;
1231 LineTableInfo &LineTable = SourceMgr.getLineTable();
1232
1233 // Parse the file names
1234 std::map<int, int> FileIDs;
1235 FileIDs[-1] = -1; // For unspecified filenames.
1236 for (unsigned I = 0; Record[Idx]; ++I) {
1237 // Extract the file name
1238 auto Filename = ReadPath(F, Record, Idx);
1239 FileIDs[I] = LineTable.getLineTableFilenameID(Filename);
1240 }
1241 ++Idx;
1242
1243 // Parse the line entries
1244 std::vector<LineEntry> Entries;
1245 while (Idx < Record.size()) {
1246 int FID = Record[Idx++];
1247 assert(FID >= 0 && "Serialized line entries for non-local file.")((FID >= 0 && "Serialized line entries for non-local file."
) ? static_cast<void> (0) : __assert_fail ("FID >= 0 && \"Serialized line entries for non-local file.\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 1247, __PRETTY_FUNCTION__))
;
1248 // Remap FileID from 1-based old view.
1249 FID += F.SLocEntryBaseID - 1;
1250
1251 // Extract the line entries
1252 unsigned NumEntries = Record[Idx++];
1253 assert(NumEntries && "no line entries for file ID")((NumEntries && "no line entries for file ID") ? static_cast
<void> (0) : __assert_fail ("NumEntries && \"no line entries for file ID\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 1253, __PRETTY_FUNCTION__))
;
1254 Entries.clear();
1255 Entries.reserve(NumEntries);
1256 for (unsigned I = 0; I != NumEntries; ++I) {
1257 unsigned FileOffset = Record[Idx++];
1258 unsigned LineNo = Record[Idx++];
1259 int FilenameID = FileIDs[Record[Idx++]];
1260 SrcMgr::CharacteristicKind FileKind
1261 = (SrcMgr::CharacteristicKind)Record[Idx++];
1262 unsigned IncludeOffset = Record[Idx++];
1263 Entries.push_back(LineEntry::get(FileOffset, LineNo, FilenameID,
1264 FileKind, IncludeOffset));
1265 }
1266 LineTable.AddEntry(FileID::get(FID), Entries);
1267 }
1268
1269 return false;
1270}
1271
1272/// Read a source manager block
1273bool ASTReader::ReadSourceManagerBlock(ModuleFile &F) {
1274 using namespace SrcMgr;
1275
1276 BitstreamCursor &SLocEntryCursor = F.SLocEntryCursor;
1277
1278 // Set the source-location entry cursor to the current position in
1279 // the stream. This cursor will be used to read the contents of the
1280 // source manager block initially, and then lazily read
1281 // source-location entries as needed.
1282 SLocEntryCursor = F.Stream;
1283
1284 // The stream itself is going to skip over the source manager block.
1285 if (F.Stream.SkipBlock()) {
1286 Error("malformed block record in AST file");
1287 return true;
1288 }
1289
1290 // Enter the source manager block.
1291 if (SLocEntryCursor.EnterSubBlock(SOURCE_MANAGER_BLOCK_ID)) {
1292 Error("malformed source manager block record in AST file");
1293 return true;
1294 }
1295
1296 RecordData Record;
1297 while (true) {
1298 llvm::BitstreamEntry E = SLocEntryCursor.advanceSkippingSubblocks();
1299
1300 switch (E.Kind) {
1301 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1302 case llvm::BitstreamEntry::Error:
1303 Error("malformed block record in AST file");
1304 return true;
1305 case llvm::BitstreamEntry::EndBlock:
1306 return false;
1307 case llvm::BitstreamEntry::Record:
1308 // The interesting case.
1309 break;
1310 }
1311
1312 // Read a record.
1313 Record.clear();
1314 StringRef Blob;
1315 switch (SLocEntryCursor.readRecord(E.ID, Record, &Blob)) {
1316 default: // Default behavior: ignore.
1317 break;
1318
1319 case SM_SLOC_FILE_ENTRY:
1320 case SM_SLOC_BUFFER_ENTRY:
1321 case SM_SLOC_EXPANSION_ENTRY:
1322 // Once we hit one of the source location entries, we're done.
1323 return false;
1324 }
1325 }
1326}
1327
1328/// If a header file is not found at the path that we expect it to be
1329/// and the PCH file was moved from its original location, try to resolve the
1330/// file by assuming that header+PCH were moved together and the header is in
1331/// the same place relative to the PCH.
1332static std::string
1333resolveFileRelativeToOriginalDir(const std::string &Filename,
1334 const std::string &OriginalDir,
1335 const std::string &CurrDir) {
1336 assert(OriginalDir != CurrDir &&((OriginalDir != CurrDir && "No point trying to resolve the file if the PCH dir didn't change"
) ? static_cast<void> (0) : __assert_fail ("OriginalDir != CurrDir && \"No point trying to resolve the file if the PCH dir didn't change\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 1337, __PRETTY_FUNCTION__))
1337 "No point trying to resolve the file if the PCH dir didn't change")((OriginalDir != CurrDir && "No point trying to resolve the file if the PCH dir didn't change"
) ? static_cast<void> (0) : __assert_fail ("OriginalDir != CurrDir && \"No point trying to resolve the file if the PCH dir didn't change\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 1337, __PRETTY_FUNCTION__))
;
1338
1339 using namespace llvm::sys;
1340
1341 SmallString<128> filePath(Filename);
1342 fs::make_absolute(filePath);
1343 assert(path::is_absolute(OriginalDir))((path::is_absolute(OriginalDir)) ? static_cast<void> (
0) : __assert_fail ("path::is_absolute(OriginalDir)", "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 1343, __PRETTY_FUNCTION__))
;
1344 SmallString<128> currPCHPath(CurrDir);
1345
1346 path::const_iterator fileDirI = path::begin(path::parent_path(filePath)),
1347 fileDirE = path::end(path::parent_path(filePath));
1348 path::const_iterator origDirI = path::begin(OriginalDir),
1349 origDirE = path::end(OriginalDir);
1350 // Skip the common path components from filePath and OriginalDir.
1351 while (fileDirI != fileDirE && origDirI != origDirE &&
1352 *fileDirI == *origDirI) {
1353 ++fileDirI;
1354 ++origDirI;
1355 }
1356 for (; origDirI != origDirE; ++origDirI)
1357 path::append(currPCHPath, "..");
1358 path::append(currPCHPath, fileDirI, fileDirE);
1359 path::append(currPCHPath, path::filename(Filename));
1360 return currPCHPath.str();
1361}
1362
1363bool ASTReader::ReadSLocEntry(int ID) {
1364 if (ID == 0)
1365 return false;
1366
1367 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1368 Error("source location entry ID out-of-range for AST file");
1369 return true;
1370 }
1371
1372 // Local helper to read the (possibly-compressed) buffer data following the
1373 // entry record.
1374 auto ReadBuffer = [this](
1375 BitstreamCursor &SLocEntryCursor,
1376 StringRef Name) -> std::unique_ptr<llvm::MemoryBuffer> {
1377 RecordData Record;
1378 StringRef Blob;
1379 unsigned Code = SLocEntryCursor.ReadCode();
1380 unsigned RecCode = SLocEntryCursor.readRecord(Code, Record, &Blob);
1381
1382 if (RecCode == SM_SLOC_BUFFER_BLOB_COMPRESSED) {
1383 if (!llvm::zlib::isAvailable()) {
1384 Error("zlib is not available");
1385 return nullptr;
1386 }
1387 SmallString<0> Uncompressed;
1388 if (llvm::Error E =
1389 llvm::zlib::uncompress(Blob, Uncompressed, Record[0])) {
1390 Error("could not decompress embedded file contents: " +
1391 llvm::toString(std::move(E)));
1392 return nullptr;
1393 }
1394 return llvm::MemoryBuffer::getMemBufferCopy(Uncompressed, Name);
1395 } else if (RecCode == SM_SLOC_BUFFER_BLOB) {
1396 return llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name, true);
1397 } else {
1398 Error("AST record has invalid code");
1399 return nullptr;
1400 }
1401 };
1402
1403 ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second;
1404 F->SLocEntryCursor.JumpToBit(F->SLocEntryOffsets[ID - F->SLocEntryBaseID]);
1405 BitstreamCursor &SLocEntryCursor = F->SLocEntryCursor;
1406 unsigned BaseOffset = F->SLocEntryBaseOffset;
1407
1408 ++NumSLocEntriesRead;
1409 llvm::BitstreamEntry Entry = SLocEntryCursor.advance();
1410 if (Entry.Kind != llvm::BitstreamEntry::Record) {
1411 Error("incorrectly-formatted source location entry in AST file");
1412 return true;
1413 }
1414
1415 RecordData Record;
1416 StringRef Blob;
1417 switch (SLocEntryCursor.readRecord(Entry.ID, Record, &Blob)) {
1418 default:
1419 Error("incorrectly-formatted source location entry in AST file");
1420 return true;
1421
1422 case SM_SLOC_FILE_ENTRY: {
1423 // We will detect whether a file changed and return 'Failure' for it, but
1424 // we will also try to fail gracefully by setting up the SLocEntry.
1425 unsigned InputID = Record[4];
1426 InputFile IF = getInputFile(*F, InputID);
1427 const FileEntry *File = IF.getFile();
1428 bool OverriddenBuffer = IF.isOverridden();
1429
1430 // Note that we only check if a File was returned. If it was out-of-date
1431 // we have complained but we will continue creating a FileID to recover
1432 // gracefully.
1433 if (!File)
1434 return true;
1435
1436 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
1437 if (IncludeLoc.isInvalid() && F->Kind != MK_MainFile) {
1438 // This is the module's main file.
1439 IncludeLoc = getImportLocation(F);
1440 }
1441 SrcMgr::CharacteristicKind
1442 FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
1443 FileID FID = SourceMgr.createFileID(File, IncludeLoc, FileCharacter,
1444 ID, BaseOffset + Record[0]);
1445 SrcMgr::FileInfo &FileInfo =
1446 const_cast<SrcMgr::FileInfo&>(SourceMgr.getSLocEntry(FID).getFile());
1447 FileInfo.NumCreatedFIDs = Record[5];
1448 if (Record[3])
1449 FileInfo.setHasLineDirectives();
1450
1451 const DeclID *FirstDecl = F->FileSortedDecls + Record[6];
1452 unsigned NumFileDecls = Record[7];
1453 if (NumFileDecls && ContextObj) {
1454 assert(F->FileSortedDecls && "FILE_SORTED_DECLS not encountered yet ?")((F->FileSortedDecls && "FILE_SORTED_DECLS not encountered yet ?"
) ? static_cast<void> (0) : __assert_fail ("F->FileSortedDecls && \"FILE_SORTED_DECLS not encountered yet ?\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 1454, __PRETTY_FUNCTION__))
;
1455 FileDeclIDs[FID] = FileDeclsInfo(F, llvm::makeArrayRef(FirstDecl,
1456 NumFileDecls));
1457 }
1458
1459 const SrcMgr::ContentCache *ContentCache
1460 = SourceMgr.getOrCreateContentCache(File, isSystem(FileCharacter));
1461 if (OverriddenBuffer && !ContentCache->BufferOverridden &&
1462 ContentCache->ContentsEntry == ContentCache->OrigEntry &&
1463 !ContentCache->getRawBuffer()) {
1464 auto Buffer = ReadBuffer(SLocEntryCursor, File->getName());
1465 if (!Buffer)
1466 return true;
1467 SourceMgr.overrideFileContents(File, std::move(Buffer));
1468 }
1469
1470 break;
1471 }
1472
1473 case SM_SLOC_BUFFER_ENTRY: {
1474 const char *Name = Blob.data();
1475 unsigned Offset = Record[0];
1476 SrcMgr::CharacteristicKind
1477 FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
1478 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
1479 if (IncludeLoc.isInvalid() && F->isModule()) {
1480 IncludeLoc = getImportLocation(F);
1481 }
1482
1483 auto Buffer = ReadBuffer(SLocEntryCursor, Name);
1484 if (!Buffer)
1485 return true;
1486 SourceMgr.createFileID(std::move(Buffer), FileCharacter, ID,
1487 BaseOffset + Offset, IncludeLoc);
1488 break;
1489 }
1490
1491 case SM_SLOC_EXPANSION_ENTRY: {
1492 SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1]);
1493 SourceMgr.createExpansionLoc(SpellingLoc,
1494 ReadSourceLocation(*F, Record[2]),
1495 ReadSourceLocation(*F, Record[3]),
1496 Record[5],
1497 Record[4],
1498 ID,
1499 BaseOffset + Record[0]);
1500 break;
1501 }
1502 }
1503
1504 return false;
1505}
1506
1507std::pair<SourceLocation, StringRef> ASTReader::getModuleImportLoc(int ID) {
1508 if (ID == 0)
1509 return std::make_pair(SourceLocation(), "");
1510
1511 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1512 Error("source location entry ID out-of-range for AST file");
1513 return std::make_pair(SourceLocation(), "");
1514 }
1515
1516 // Find which module file this entry lands in.
1517 ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second;
1518 if (!M->isModule())
1519 return std::make_pair(SourceLocation(), "");
1520
1521 // FIXME: Can we map this down to a particular submodule? That would be
1522 // ideal.
1523 return std::make_pair(M->ImportLoc, StringRef(M->ModuleName));
1524}
1525
1526/// Find the location where the module F is imported.
1527SourceLocation ASTReader::getImportLocation(ModuleFile *F) {
1528 if (F->ImportLoc.isValid())
1529 return F->ImportLoc;
1530
1531 // Otherwise we have a PCH. It's considered to be "imported" at the first
1532 // location of its includer.
1533 if (F->ImportedBy.empty() || !F->ImportedBy[0]) {
1534 // Main file is the importer.
1535 assert(SourceMgr.getMainFileID().isValid() && "missing main file")((SourceMgr.getMainFileID().isValid() && "missing main file"
) ? static_cast<void> (0) : __assert_fail ("SourceMgr.getMainFileID().isValid() && \"missing main file\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 1535, __PRETTY_FUNCTION__))
;
1536 return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID());
1537 }
1538 return F->ImportedBy[0]->FirstLoc;
1539}
1540
1541/// ReadBlockAbbrevs - Enter a subblock of the specified BlockID with the
1542/// specified cursor. Read the abbreviations that are at the top of the block
1543/// and then leave the cursor pointing into the block.
1544bool ASTReader::ReadBlockAbbrevs(BitstreamCursor &Cursor, unsigned BlockID) {
1545 if (Cursor.EnterSubBlock(BlockID))
1546 return true;
1547
1548 while (true) {
1549 uint64_t Offset = Cursor.GetCurrentBitNo();
1550 unsigned Code = Cursor.ReadCode();
1551
1552 // We expect all abbrevs to be at the start of the block.
1553 if (Code != llvm::bitc::DEFINE_ABBREV) {
1554 Cursor.JumpToBit(Offset);
1555 return false;
1556 }
1557 Cursor.ReadAbbrevRecord();
1558 }
1559}
1560
1561Token ASTReader::ReadToken(ModuleFile &F, const RecordDataImpl &Record,
1562 unsigned &Idx) {
1563 Token Tok;
1564 Tok.startToken();
1565 Tok.setLocation(ReadSourceLocation(F, Record, Idx));
1566 Tok.setLength(Record[Idx++]);
1567 if (IdentifierInfo *II = getLocalIdentifier(F, Record[Idx++]))
1568 Tok.setIdentifierInfo(II);
1569 Tok.setKind((tok::TokenKind)Record[Idx++]);
1570 Tok.setFlag((Token::TokenFlags)Record[Idx++]);
1571 return Tok;
1572}
1573
1574MacroInfo *ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) {
1575 BitstreamCursor &Stream = F.MacroCursor;
1576
1577 // Keep track of where we are in the stream, then jump back there
1578 // after reading this macro.
1579 SavedStreamPosition SavedPosition(Stream);
1580
1581 Stream.JumpToBit(Offset);
1582 RecordData Record;
1583 SmallVector<IdentifierInfo*, 16> MacroParams;
1584 MacroInfo *Macro = nullptr;
1585
1586 while (true) {
1587 // Advance to the next record, but if we get to the end of the block, don't
1588 // pop it (removing all the abbreviations from the cursor) since we want to
1589 // be able to reseek within the block and read entries.
1590 unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd;
1591 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks(Flags);
1592
1593 switch (Entry.Kind) {
1594 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1595 case llvm::BitstreamEntry::Error:
1596 Error("malformed block record in AST file");
1597 return Macro;
1598 case llvm::BitstreamEntry::EndBlock:
1599 return Macro;
1600 case llvm::BitstreamEntry::Record:
1601 // The interesting case.
1602 break;
1603 }
1604
1605 // Read a record.
1606 Record.clear();
1607 PreprocessorRecordTypes RecType =
1608 (PreprocessorRecordTypes)Stream.readRecord(Entry.ID, Record);
1609 switch (RecType) {
1610 case PP_MODULE_MACRO:
1611 case PP_MACRO_DIRECTIVE_HISTORY:
1612 return Macro;
1613
1614 case PP_MACRO_OBJECT_LIKE:
1615 case PP_MACRO_FUNCTION_LIKE: {
1616 // If we already have a macro, that means that we've hit the end
1617 // of the definition of the macro we were looking for. We're
1618 // done.
1619 if (Macro)
1620 return Macro;
1621
1622 unsigned NextIndex = 1; // Skip identifier ID.
1623 SourceLocation Loc = ReadSourceLocation(F, Record, NextIndex);
1624 MacroInfo *MI = PP.AllocateMacroInfo(Loc);
1625 MI->setDefinitionEndLoc(ReadSourceLocation(F, Record, NextIndex));
1626 MI->setIsUsed(Record[NextIndex++]);
1627 MI->setUsedForHeaderGuard(Record[NextIndex++]);
1628
1629 if (RecType == PP_MACRO_FUNCTION_LIKE) {
1630 // Decode function-like macro info.
1631 bool isC99VarArgs = Record[NextIndex++];
1632 bool isGNUVarArgs = Record[NextIndex++];
1633 bool hasCommaPasting = Record[NextIndex++];
1634 MacroParams.clear();
1635 unsigned NumArgs = Record[NextIndex++];
1636 for (unsigned i = 0; i != NumArgs; ++i)
1637 MacroParams.push_back(getLocalIdentifier(F, Record[NextIndex++]));
1638
1639 // Install function-like macro info.
1640 MI->setIsFunctionLike();
1641 if (isC99VarArgs) MI->setIsC99Varargs();
1642 if (isGNUVarArgs) MI->setIsGNUVarargs();
1643 if (hasCommaPasting) MI->setHasCommaPasting();
1644 MI->setParameterList(MacroParams, PP.getPreprocessorAllocator());
1645 }
1646
1647 // Remember that we saw this macro last so that we add the tokens that
1648 // form its body to it.
1649 Macro = MI;
1650
1651 if (NextIndex + 1 == Record.size() && PP.getPreprocessingRecord() &&
1652 Record[NextIndex]) {
1653 // We have a macro definition. Register the association
1654 PreprocessedEntityID
1655 GlobalID = getGlobalPreprocessedEntityID(F, Record[NextIndex]);
1656 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
1657 PreprocessingRecord::PPEntityID PPID =
1658 PPRec.getPPEntityID(GlobalID - 1, /*isLoaded=*/true);
1659 MacroDefinitionRecord *PPDef = cast_or_null<MacroDefinitionRecord>(
1660 PPRec.getPreprocessedEntity(PPID));
1661 if (PPDef)
1662 PPRec.RegisterMacroDefinition(Macro, PPDef);
1663 }
1664
1665 ++NumMacrosRead;
1666 break;
1667 }
1668
1669 case PP_TOKEN: {
1670 // If we see a TOKEN before a PP_MACRO_*, then the file is
1671 // erroneous, just pretend we didn't see this.
1672 if (!Macro) break;
1673
1674 unsigned Idx = 0;
1675 Token Tok = ReadToken(F, Record, Idx);
1676 Macro->AddTokenToBody(Tok);
1677 break;
1678 }
1679 }
1680 }
1681}
1682
1683PreprocessedEntityID
1684ASTReader::getGlobalPreprocessedEntityID(ModuleFile &M,
1685 unsigned LocalID) const {
1686 if (!M.ModuleOffsetMap.empty())
1687 ReadModuleOffsetMap(M);
1688
1689 ContinuousRangeMap<uint32_t, int, 2>::const_iterator
1690 I = M.PreprocessedEntityRemap.find(LocalID - NUM_PREDEF_PP_ENTITY_IDS);
1691 assert(I != M.PreprocessedEntityRemap.end()((I != M.PreprocessedEntityRemap.end() && "Invalid index into preprocessed entity index remap"
) ? static_cast<void> (0) : __assert_fail ("I != M.PreprocessedEntityRemap.end() && \"Invalid index into preprocessed entity index remap\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 1692, __PRETTY_FUNCTION__))
1692 && "Invalid index into preprocessed entity index remap")((I != M.PreprocessedEntityRemap.end() && "Invalid index into preprocessed entity index remap"
) ? static_cast<void> (0) : __assert_fail ("I != M.PreprocessedEntityRemap.end() && \"Invalid index into preprocessed entity index remap\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 1692, __PRETTY_FUNCTION__))
;
1693
1694 return LocalID + I->second;
1695}
1696
1697unsigned HeaderFileInfoTrait::ComputeHash(internal_key_ref ikey) {
1698 return llvm::hash_combine(ikey.Size, ikey.ModTime);
1699}
1700
1701HeaderFileInfoTrait::internal_key_type
1702HeaderFileInfoTrait::GetInternalKey(const FileEntry *FE) {
1703 internal_key_type ikey = {FE->getSize(),
1704 M.HasTimestamps ? FE->getModificationTime() : 0,
1705 FE->getName(), /*Imported*/ false};
1706 return ikey;
1707}
1708
1709bool HeaderFileInfoTrait::EqualKey(internal_key_ref a, internal_key_ref b) {
1710 if (a.Size != b.Size || (a.ModTime && b.ModTime && a.ModTime != b.ModTime))
1711 return false;
1712
1713 if (llvm::sys::path::is_absolute(a.Filename) && a.Filename == b.Filename)
1714 return true;
1715
1716 // Determine whether the actual files are equivalent.
1717 FileManager &FileMgr = Reader.getFileManager();
1718 auto GetFile = [&](const internal_key_type &Key) -> const FileEntry* {
1719 if (!Key.Imported)
1720 return FileMgr.getFile(Key.Filename);
1721
1722 std::string Resolved = Key.Filename;
1723 Reader.ResolveImportedPath(M, Resolved);
1724 return FileMgr.getFile(Resolved);
1725 };
1726
1727 const FileEntry *FEA = GetFile(a);
1728 const FileEntry *FEB = GetFile(b);
1729 return FEA && FEA == FEB;
1730}
1731
1732std::pair<unsigned, unsigned>
1733HeaderFileInfoTrait::ReadKeyDataLength(const unsigned char*& d) {
1734 using namespace llvm::support;
1735
1736 unsigned KeyLen = (unsigned) endian::readNext<uint16_t, little, unaligned>(d);
1737 unsigned DataLen = (unsigned) *d++;
1738 return std::make_pair(KeyLen, DataLen);
1739}
1740
1741HeaderFileInfoTrait::internal_key_type
1742HeaderFileInfoTrait::ReadKey(const unsigned char *d, unsigned) {
1743 using namespace llvm::support;
1744
1745 internal_key_type ikey;
1746 ikey.Size = off_t(endian::readNext<uint64_t, little, unaligned>(d));
1747 ikey.ModTime = time_t(endian::readNext<uint64_t, little, unaligned>(d));
1748 ikey.Filename = (const char *)d;
1749 ikey.Imported = true;
1750 return ikey;
1751}
1752
1753HeaderFileInfoTrait::data_type
1754HeaderFileInfoTrait::ReadData(internal_key_ref key, const unsigned char *d,
1755 unsigned DataLen) {
1756 using namespace llvm::support;
1757
1758 const unsigned char *End = d + DataLen;
1759 HeaderFileInfo HFI;
1760 unsigned Flags = *d++;
1761 // FIXME: Refactor with mergeHeaderFileInfo in HeaderSearch.cpp.
1762 HFI.isImport |= (Flags >> 5) & 0x01;
1763 HFI.isPragmaOnce |= (Flags >> 4) & 0x01;
1764 HFI.DirInfo = (Flags >> 1) & 0x07;
1765 HFI.IndexHeaderMapHeader = Flags & 0x01;
1766 // FIXME: Find a better way to handle this. Maybe just store a
1767 // "has been included" flag?
1768 HFI.NumIncludes = std::max(endian::readNext<uint16_t, little, unaligned>(d),
1769 HFI.NumIncludes);
1770 HFI.ControllingMacroID = Reader.getGlobalIdentifierID(
1771 M, endian::readNext<uint32_t, little, unaligned>(d));
1772 if (unsigned FrameworkOffset =
1773 endian::readNext<uint32_t, little, unaligned>(d)) {
1774 // The framework offset is 1 greater than the actual offset,
1775 // since 0 is used as an indicator for "no framework name".
1776 StringRef FrameworkName(FrameworkStrings + FrameworkOffset - 1);
1777 HFI.Framework = HS->getUniqueFrameworkName(FrameworkName);
1778 }
1779
1780 assert((End - d) % 4 == 0 &&(((End - d) % 4 == 0 && "Wrong data length in HeaderFileInfo deserialization"
) ? static_cast<void> (0) : __assert_fail ("(End - d) % 4 == 0 && \"Wrong data length in HeaderFileInfo deserialization\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 1781, __PRETTY_FUNCTION__))
1781 "Wrong data length in HeaderFileInfo deserialization")(((End - d) % 4 == 0 && "Wrong data length in HeaderFileInfo deserialization"
) ? static_cast<void> (0) : __assert_fail ("(End - d) % 4 == 0 && \"Wrong data length in HeaderFileInfo deserialization\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 1781, __PRETTY_FUNCTION__))
;
1782 while (d != End) {
1783 uint32_t LocalSMID = endian::readNext<uint32_t, little, unaligned>(d);
1784 auto HeaderRole = static_cast<ModuleMap::ModuleHeaderRole>(LocalSMID & 3);
1785 LocalSMID >>= 2;
1786
1787 // This header is part of a module. Associate it with the module to enable
1788 // implicit module import.
1789 SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID);
1790 Module *Mod = Reader.getSubmodule(GlobalSMID);
1791 FileManager &FileMgr = Reader.getFileManager();
1792 ModuleMap &ModMap =
1793 Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap();
1794
1795 std::string Filename = key.Filename;
1796 if (key.Imported)
1797 Reader.ResolveImportedPath(M, Filename);
1798 // FIXME: This is not always the right filename-as-written, but we're not
1799 // going to use this information to rebuild the module, so it doesn't make
1800 // a lot of difference.
1801 Module::Header H = { key.Filename, FileMgr.getFile(Filename) };
1802 ModMap.addHeader(Mod, H, HeaderRole, /*Imported*/true);
1803 HFI.isModuleHeader |= !(HeaderRole & ModuleMap::TextualHeader);
1804 }
1805
1806 // This HeaderFileInfo was externally loaded.
1807 HFI.External = true;
1808 HFI.IsValid = true;
1809 return HFI;
1810}
1811
1812void ASTReader::addPendingMacro(IdentifierInfo *II,
1813 ModuleFile *M,
1814 uint64_t MacroDirectivesOffset) {
1815 assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard")((NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard"
) ? static_cast<void> (0) : __assert_fail ("NumCurrentElementsDeserializing > 0 &&\"Missing deserialization guard\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 1815, __PRETTY_FUNCTION__))
;
1816 PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset));
1817}
1818
1819void ASTReader::ReadDefinedMacros() {
1820 // Note that we are loading defined macros.
1821 Deserializing Macros(this);
1822
1823 for (ModuleFile &I : llvm::reverse(ModuleMgr)) {
1824 BitstreamCursor &MacroCursor = I.MacroCursor;
1825
1826 // If there was no preprocessor block, skip this file.
1827 if (MacroCursor.getBitcodeBytes().empty())
1828 continue;
1829
1830 BitstreamCursor Cursor = MacroCursor;
1831 Cursor.JumpToBit(I.MacroStartOffset);
1832
1833 RecordData Record;
1834 while (true) {
1835 llvm::BitstreamEntry E = Cursor.advanceSkippingSubblocks();
1836
1837 switch (E.Kind) {
1838 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1839 case llvm::BitstreamEntry::Error:
1840 Error("malformed block record in AST file");
1841 return;
1842 case llvm::BitstreamEntry::EndBlock:
1843 goto NextCursor;
1844
1845 case llvm::BitstreamEntry::Record:
1846 Record.clear();
1847 switch (Cursor.readRecord(E.ID, Record)) {
1848 default: // Default behavior: ignore.
1849 break;
1850
1851 case PP_MACRO_OBJECT_LIKE:
1852 case PP_MACRO_FUNCTION_LIKE: {
1853 IdentifierInfo *II = getLocalIdentifier(I, Record[0]);
1854 if (II->isOutOfDate())
1855 updateOutOfDateIdentifier(*II);
1856 break;
1857 }
1858
1859 case PP_TOKEN:
1860 // Ignore tokens.
1861 break;
1862 }
1863 break;
1864 }
1865 }
1866 NextCursor: ;
1867 }
1868}
1869
1870namespace {
1871
1872 /// Visitor class used to look up identifirs in an AST file.
1873 class IdentifierLookupVisitor {
1874 StringRef Name;
1875 unsigned NameHash;
1876 unsigned PriorGeneration;
1877 unsigned &NumIdentifierLookups;
1878 unsigned &NumIdentifierLookupHits;
1879 IdentifierInfo *Found = nullptr;
1880
1881 public:
1882 IdentifierLookupVisitor(StringRef Name, unsigned PriorGeneration,
1883 unsigned &NumIdentifierLookups,
1884 unsigned &NumIdentifierLookupHits)
1885 : Name(Name), NameHash(ASTIdentifierLookupTrait::ComputeHash(Name)),
1886 PriorGeneration(PriorGeneration),
1887 NumIdentifierLookups(NumIdentifierLookups),
1888 NumIdentifierLookupHits(NumIdentifierLookupHits) {}
1889
1890 bool operator()(ModuleFile &M) {
1891 // If we've already searched this module file, skip it now.
1892 if (M.Generation <= PriorGeneration)
1893 return true;
1894
1895 ASTIdentifierLookupTable *IdTable
1896 = (ASTIdentifierLookupTable *)M.IdentifierLookupTable;
1897 if (!IdTable)
1898 return false;
1899
1900 ASTIdentifierLookupTrait Trait(IdTable->getInfoObj().getReader(), M,
1901 Found);
1902 ++NumIdentifierLookups;
1903 ASTIdentifierLookupTable::iterator Pos =
1904 IdTable->find_hashed(Name, NameHash, &Trait);
1905 if (Pos == IdTable->end())
1906 return false;
1907
1908 // Dereferencing the iterator has the effect of building the
1909 // IdentifierInfo node and populating it with the various
1910 // declarations it needs.
1911 ++NumIdentifierLookupHits;
1912 Found = *Pos;
1913 return true;
1914 }
1915
1916 // Retrieve the identifier info found within the module
1917 // files.
1918 IdentifierInfo *getIdentifierInfo() const { return Found; }
1919 };
1920
1921} // namespace
1922
1923void ASTReader::updateOutOfDateIdentifier(IdentifierInfo &II) {
1924 // Note that we are loading an identifier.
1925 Deserializing AnIdentifier(this);
1926
1927 unsigned PriorGeneration = 0;
1928 if (getContext().getLangOpts().Modules)
1929 PriorGeneration = IdentifierGeneration[&II];
1930
1931 // If there is a global index, look there first to determine which modules
1932 // provably do not have any results for this identifier.
1933 GlobalModuleIndex::HitSet Hits;
1934 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
1935 if (!loadGlobalIndex()) {
1936 if (GlobalIndex->lookupIdentifier(II.getName(), Hits)) {
1937 HitsPtr = &Hits;
1938 }
1939 }
1940
1941 IdentifierLookupVisitor Visitor(II.getName(), PriorGeneration,
1942 NumIdentifierLookups,
1943 NumIdentifierLookupHits);
1944 ModuleMgr.visit(Visitor, HitsPtr);
1945 markIdentifierUpToDate(&II);
1946}
1947
1948void ASTReader::markIdentifierUpToDate(IdentifierInfo *II) {
1949 if (!II)
1950 return;
1951
1952 II->setOutOfDate(false);
1953
1954 // Update the generation for this identifier.
1955 if (getContext().getLangOpts().Modules)
1956 IdentifierGeneration[II] = getGeneration();
1957}
1958
1959void ASTReader::resolvePendingMacro(IdentifierInfo *II,
1960 const PendingMacroInfo &PMInfo) {
1961 ModuleFile &M = *PMInfo.M;
1962
1963 BitstreamCursor &Cursor = M.MacroCursor;
1964 SavedStreamPosition SavedPosition(Cursor);
1965 Cursor.JumpToBit(PMInfo.MacroDirectivesOffset);
1966
1967 struct ModuleMacroRecord {
1968 SubmoduleID SubModID;
1969 MacroInfo *MI;
1970 SmallVector<SubmoduleID, 8> Overrides;
1971 };
1972 llvm::SmallVector<ModuleMacroRecord, 8> ModuleMacros;
1973
1974 // We expect to see a sequence of PP_MODULE_MACRO records listing exported
1975 // macros, followed by a PP_MACRO_DIRECTIVE_HISTORY record with the complete
1976 // macro histroy.
1977 RecordData Record;
1978 while (true) {
1979 llvm::BitstreamEntry Entry =
1980 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
1981 if (Entry.Kind != llvm::BitstreamEntry::Record) {
1982 Error("malformed block record in AST file");
1983 return;
1984 }
1985
1986 Record.clear();
1987 switch ((PreprocessorRecordTypes)Cursor.readRecord(Entry.ID, Record)) {
1988 case PP_MACRO_DIRECTIVE_HISTORY:
1989 break;
1990
1991 case PP_MODULE_MACRO: {
1992 ModuleMacros.push_back(ModuleMacroRecord());
1993 auto &Info = ModuleMacros.back();
1994 Info.SubModID = getGlobalSubmoduleID(M, Record[0]);
1995 Info.MI = getMacro(getGlobalMacroID(M, Record[1]));
1996 for (int I = 2, N = Record.size(); I != N; ++I)
1997 Info.Overrides.push_back(getGlobalSubmoduleID(M, Record[I]));
1998 continue;
1999 }
2000
2001 default:
2002 Error("malformed block record in AST file");
2003 return;
2004 }
2005
2006 // We found the macro directive history; that's the last record
2007 // for this macro.
2008 break;
2009 }
2010
2011 // Module macros are listed in reverse dependency order.
2012 {
2013 std::reverse(ModuleMacros.begin(), ModuleMacros.end());
2014 llvm::SmallVector<ModuleMacro*, 8> Overrides;
2015 for (auto &MMR : ModuleMacros) {
2016 Overrides.clear();
2017 for (unsigned ModID : MMR.Overrides) {
2018 Module *Mod = getSubmodule(ModID);
2019 auto *Macro = PP.getModuleMacro(Mod, II);
2020 assert(Macro && "missing definition for overridden macro")((Macro && "missing definition for overridden macro")
? static_cast<void> (0) : __assert_fail ("Macro && \"missing definition for overridden macro\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 2020, __PRETTY_FUNCTION__))
;
2021 Overrides.push_back(Macro);
2022 }
2023
2024 bool Inserted = false;
2025 Module *Owner = getSubmodule(MMR.SubModID);
2026 PP.addModuleMacro(Owner, II, MMR.MI, Overrides, Inserted);
2027 }
2028 }
2029
2030 // Don't read the directive history for a module; we don't have anywhere
2031 // to put it.
2032 if (M.isModule())
2033 return;
2034
2035 // Deserialize the macro directives history in reverse source-order.
2036 MacroDirective *Latest = nullptr, *Earliest = nullptr;
2037 unsigned Idx = 0, N = Record.size();
2038 while (Idx < N) {
2039 MacroDirective *MD = nullptr;
2040 SourceLocation Loc = ReadSourceLocation(M, Record, Idx);
2041 MacroDirective::Kind K = (MacroDirective::Kind)Record[Idx++];
2042 switch (K) {
2043 case MacroDirective::MD_Define: {
2044 MacroInfo *MI = getMacro(getGlobalMacroID(M, Record[Idx++]));
2045 MD = PP.AllocateDefMacroDirective(MI, Loc);
2046 break;
2047 }
2048 case MacroDirective::MD_Undefine:
2049 MD = PP.AllocateUndefMacroDirective(Loc);
2050 break;
2051 case MacroDirective::MD_Visibility:
2052 bool isPublic = Record[Idx++];
2053 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic);
2054 break;
2055 }
2056
2057 if (!Latest)
2058 Latest = MD;
2059 if (Earliest)
2060 Earliest->setPrevious(MD);
2061 Earliest = MD;
2062 }
2063
2064 if (Latest)
2065 PP.setLoadedMacroDirective(II, Earliest, Latest);
2066}
2067
2068ASTReader::InputFileInfo
2069ASTReader::readInputFileInfo(ModuleFile &F, unsigned ID) {
2070 // Go find this input file.
2071 BitstreamCursor &Cursor = F.InputFilesCursor;
2072 SavedStreamPosition SavedPosition(Cursor);
2073 Cursor.JumpToBit(F.InputFileOffsets[ID-1]);
2074
2075 unsigned Code = Cursor.ReadCode();
2076 RecordData Record;
2077 StringRef Blob;
2078
2079 unsigned Result = Cursor.readRecord(Code, Record, &Blob);
2080 assert(static_cast<InputFileRecordTypes>(Result) == INPUT_FILE &&((static_cast<InputFileRecordTypes>(Result) == INPUT_FILE
&& "invalid record type for input file") ? static_cast
<void> (0) : __assert_fail ("static_cast<InputFileRecordTypes>(Result) == INPUT_FILE && \"invalid record type for input file\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 2081, __PRETTY_FUNCTION__))
2081 "invalid record type for input file")((static_cast<InputFileRecordTypes>(Result) == INPUT_FILE
&& "invalid record type for input file") ? static_cast
<void> (0) : __assert_fail ("static_cast<InputFileRecordTypes>(Result) == INPUT_FILE && \"invalid record type for input file\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 2081, __PRETTY_FUNCTION__))
;
2082 (void)Result;
2083
2084 assert(Record[0] == ID && "Bogus stored ID or offset")((Record[0] == ID && "Bogus stored ID or offset") ? static_cast
<void> (0) : __assert_fail ("Record[0] == ID && \"Bogus stored ID or offset\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 2084, __PRETTY_FUNCTION__))
;
2085 InputFileInfo R;
2086 R.StoredSize = static_cast<off_t>(Record[1]);
2087 R.StoredTime = static_cast<time_t>(Record[2]);
2088 R.Overridden = static_cast<bool>(Record[3]);
2089 R.Transient = static_cast<bool>(Record[4]);
2090 R.TopLevelModuleMap = static_cast<bool>(Record[5]);
2091 R.Filename = Blob;
2092 ResolveImportedPath(F, R.Filename);
2093 return R;
2094}
2095
2096static unsigned moduleKindForDiagnostic(ModuleKind Kind);
2097InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) {
2098 // If this ID is bogus, just return an empty input file.
2099 if (ID == 0 || ID > F.InputFilesLoaded.size())
2100 return InputFile();
2101
2102 // If we've already loaded this input file, return it.
2103 if (F.InputFilesLoaded[ID-1].getFile())
2104 return F.InputFilesLoaded[ID-1];
2105
2106 if (F.InputFilesLoaded[ID-1].isNotFound())
2107 return InputFile();
2108
2109 // Go find this input file.
2110 BitstreamCursor &Cursor = F.InputFilesCursor;
2111 SavedStreamPosition SavedPosition(Cursor);
2112 Cursor.JumpToBit(F.InputFileOffsets[ID-1]);
2113
2114 InputFileInfo FI = readInputFileInfo(F, ID);
2115 off_t StoredSize = FI.StoredSize;
2116 time_t StoredTime = FI.StoredTime;
2117 bool Overridden = FI.Overridden;
2118 bool Transient = FI.Transient;
2119 StringRef Filename = FI.Filename;
2120
2121 const FileEntry *File = FileMgr.getFile(Filename, /*OpenFile=*/false);
2122 // If we didn't find the file, resolve it relative to the
2123 // original directory from which this AST file was created.
2124 if (File == nullptr && !F.OriginalDir.empty() && !F.BaseDirectory.empty() &&
2125 F.OriginalDir != F.BaseDirectory) {
2126 std::string Resolved = resolveFileRelativeToOriginalDir(
2127 Filename, F.OriginalDir, F.BaseDirectory);
2128 if (!Resolved.empty())
2129 File = FileMgr.getFile(Resolved);
2130 }
2131
2132 // For an overridden file, create a virtual file with the stored
2133 // size/timestamp.
2134 if ((Overridden || Transient) && File == nullptr)
2135 File = FileMgr.getVirtualFile(Filename, StoredSize, StoredTime);
2136
2137 if (File == nullptr) {
2138 if (Complain) {
2139 std::string ErrorStr = "could not find file '";
2140 ErrorStr += Filename;
2141 ErrorStr += "' referenced by AST file '";
2142 ErrorStr += F.FileName;
2143 ErrorStr += "'";
2144 Error(ErrorStr);
2145 }
2146 // Record that we didn't find the file.
2147 F.InputFilesLoaded[ID-1] = InputFile::getNotFound();
2148 return InputFile();
2149 }
2150
2151 // Check if there was a request to override the contents of the file
2152 // that was part of the precompiled header. Overriding such a file
2153 // can lead to problems when lexing using the source locations from the
2154 // PCH.
2155 SourceManager &SM = getSourceManager();
2156 // FIXME: Reject if the overrides are different.
2157 if ((!Overridden && !Transient) && SM.isFileOverridden(File)) {
2158 if (Complain)
2159 Error(diag::err_fe_pch_file_overridden, Filename);
2160 // After emitting the diagnostic, recover by disabling the override so
2161 // that the original file will be used.
2162 //
2163 // FIXME: This recovery is just as broken as the original state; there may
2164 // be another precompiled module that's using the overridden contents, or
2165 // we might be half way through parsing it. Instead, we should treat the
2166 // overridden contents as belonging to a separate FileEntry.
2167 SM.disableFileContentsOverride(File);
2168 // The FileEntry is a virtual file entry with the size of the contents
2169 // that would override the original contents. Set it to the original's
2170 // size/time.
2171 FileMgr.modifyFileEntry(const_cast<FileEntry*>(File),
2172 StoredSize, StoredTime);
2173 }
2174
2175 bool IsOutOfDate = false;
2176
2177 // For an overridden file, there is nothing to validate.
2178 if (!Overridden && //
2179 (StoredSize != File->getSize() ||
2180 (StoredTime && StoredTime != File->getModificationTime() &&
2181 !DisableValidation)
2182 )) {
2183 if (Complain) {
2184 // Build a list of the PCH imports that got us here (in reverse).
2185 SmallVector<ModuleFile *, 4> ImportStack(1, &F);
2186 while (!ImportStack.back()->ImportedBy.empty())
2187 ImportStack.push_back(ImportStack.back()->ImportedBy[0]);
2188
2189 // The top-level PCH is stale.
2190 StringRef TopLevelPCHName(ImportStack.back()->FileName);
2191 unsigned DiagnosticKind = moduleKindForDiagnostic(ImportStack.back()->Kind);
2192 if (DiagnosticKind == 0)
2193 Error(diag::err_fe_pch_file_modified, Filename, TopLevelPCHName);
2194 else if (DiagnosticKind == 1)
2195 Error(diag::err_fe_module_file_modified, Filename, TopLevelPCHName);
2196 else
2197 Error(diag::err_fe_ast_file_modified, Filename, TopLevelPCHName);
2198
2199 // Print the import stack.
2200 if (ImportStack.size() > 1 && !Diags.isDiagnosticInFlight()) {
2201 Diag(diag::note_pch_required_by)
2202 << Filename << ImportStack[0]->FileName;
2203 for (unsigned I = 1; I < ImportStack.size(); ++I)
2204 Diag(diag::note_pch_required_by)
2205 << ImportStack[I-1]->FileName << ImportStack[I]->FileName;
2206 }
2207
2208 if (!Diags.isDiagnosticInFlight())
2209 Diag(diag::note_pch_rebuild_required) << TopLevelPCHName;
2210 }
2211
2212 IsOutOfDate = true;
2213 }
2214 // FIXME: If the file is overridden and we've already opened it,
2215 // issue an error (or split it into a separate FileEntry).
2216
2217 InputFile IF = InputFile(File, Overridden || Transient, IsOutOfDate);
2218
2219 // Note that we've loaded this input file.
2220 F.InputFilesLoaded[ID-1] = IF;
2221 return IF;
2222}
2223
2224/// If we are loading a relocatable PCH or module file, and the filename
2225/// is not an absolute path, add the system or module root to the beginning of
2226/// the file name.
2227void ASTReader::ResolveImportedPath(ModuleFile &M, std::string &Filename) {
2228 // Resolve relative to the base directory, if we have one.
2229 if (!M.BaseDirectory.empty())
2230 return ResolveImportedPath(Filename, M.BaseDirectory);
2231}
2232
2233void ASTReader::ResolveImportedPath(std::string &Filename, StringRef Prefix) {
2234 if (Filename.empty() || llvm::sys::path::is_absolute(Filename))
2235 return;
2236
2237 SmallString<128> Buffer;
2238 llvm::sys::path::append(Buffer, Prefix, Filename);
2239 Filename.assign(Buffer.begin(), Buffer.end());
2240}
2241
2242static bool isDiagnosedResult(ASTReader::ASTReadResult ARR, unsigned Caps) {
2243 switch (ARR) {
2244 case ASTReader::Failure: return true;
2245 case ASTReader::Missing: return !(Caps & ASTReader::ARR_Missing);
2246 case ASTReader::OutOfDate: return !(Caps & ASTReader::ARR_OutOfDate);
2247 case ASTReader::VersionMismatch: return !(Caps & ASTReader::ARR_VersionMismatch);
2248 case ASTReader::ConfigurationMismatch:
2249 return !(Caps & ASTReader::ARR_ConfigurationMismatch);
2250 case ASTReader::HadErrors: return true;
2251 case ASTReader::Success: return false;
2252 }
2253
2254 llvm_unreachable("unknown ASTReadResult")::llvm::llvm_unreachable_internal("unknown ASTReadResult", "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 2254)
;
2255}
2256
2257ASTReader::ASTReadResult ASTReader::ReadOptionsBlock(
2258 BitstreamCursor &Stream, unsigned ClientLoadCapabilities,
2259 bool AllowCompatibleConfigurationMismatch, ASTReaderListener &Listener,
2260 std::string &SuggestedPredefines) {
2261 if (Stream.EnterSubBlock(OPTIONS_BLOCK_ID))
2262 return Failure;
2263
2264 // Read all of the records in the options block.
2265 RecordData Record;
2266 ASTReadResult Result = Success;
2267 while (true) {
2268 llvm::BitstreamEntry Entry = Stream.advance();
2269
2270 switch (Entry.Kind) {
2271 case llvm::BitstreamEntry::Error:
2272 case llvm::BitstreamEntry::SubBlock:
2273 return Failure;
2274
2275 case llvm::BitstreamEntry::EndBlock:
2276 return Result;
2277
2278 case llvm::BitstreamEntry::Record:
2279 // The interesting case.
2280 break;
2281 }
2282
2283 // Read and process a record.
2284 Record.clear();
2285 switch ((OptionsRecordTypes)Stream.readRecord(Entry.ID, Record)) {
2286 case LANGUAGE_OPTIONS: {
2287 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2288 if (ParseLanguageOptions(Record, Complain, Listener,
2289 AllowCompatibleConfigurationMismatch))
2290 Result = ConfigurationMismatch;
2291 break;
2292 }
2293
2294 case TARGET_OPTIONS: {
2295 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2296 if (ParseTargetOptions(Record, Complain, Listener,
2297 AllowCompatibleConfigurationMismatch))
2298 Result = ConfigurationMismatch;
2299 break;
2300 }
2301
2302 case FILE_SYSTEM_OPTIONS: {
2303 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2304 if (!AllowCompatibleConfigurationMismatch &&
2305 ParseFileSystemOptions(Record, Complain, Listener))
2306 Result = ConfigurationMismatch;
2307 break;
2308 }
2309
2310 case HEADER_SEARCH_OPTIONS: {
2311 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2312 if (!AllowCompatibleConfigurationMismatch &&
2313 ParseHeaderSearchOptions(Record, Complain, Listener))
2314 Result = ConfigurationMismatch;
2315 break;
2316 }
2317
2318 case PREPROCESSOR_OPTIONS:
2319 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2320 if (!AllowCompatibleConfigurationMismatch &&
2321 ParsePreprocessorOptions(Record, Complain, Listener,
2322 SuggestedPredefines))
2323 Result = ConfigurationMismatch;
2324 break;
2325 }
2326 }
2327}
2328
2329ASTReader::ASTReadResult
2330ASTReader::ReadControlBlock(ModuleFile &F,
2331 SmallVectorImpl<ImportedModule> &Loaded,
2332 const ModuleFile *ImportedBy,
2333 unsigned ClientLoadCapabilities) {
2334 BitstreamCursor &Stream = F.Stream;
2335 ASTReadResult Result = Success;
2336
2337 if (Stream.EnterSubBlock(CONTROL_BLOCK_ID)) {
2338 Error("malformed block record in AST file");
2339 return Failure;
2340 }
2341
2342 // Lambda to read the unhashed control block the first time it's called.
2343 //
2344 // For PCM files, the unhashed control block cannot be read until after the
2345 // MODULE_NAME record. However, PCH files have no MODULE_NAME, and yet still
2346 // need to look ahead before reading the IMPORTS record. For consistency,
2347 // this block is always read somehow (see BitstreamEntry::EndBlock).
2348 bool HasReadUnhashedControlBlock = false;
2349 auto readUnhashedControlBlockOnce = [&]() {
2350 if (!HasReadUnhashedControlBlock) {
2351 HasReadUnhashedControlBlock = true;
2352 if (ASTReadResult Result =
2353 readUnhashedControlBlock(F, ImportedBy, ClientLoadCapabilities))
2354 return Result;
2355 }
2356 return Success;
2357 };
2358
2359 // Read all of the records and blocks in the control block.
2360 RecordData Record;
2361 unsigned NumInputs = 0;
2362 unsigned NumUserInputs = 0;
2363 while (true) {
2364 llvm::BitstreamEntry Entry = Stream.advance();
2365
2366 switch (Entry.Kind) {
2367 case llvm::BitstreamEntry::Error:
2368 Error("malformed block record in AST file");
2369 return Failure;
2370 case llvm::BitstreamEntry::EndBlock: {
2371 // Validate the module before returning. This call catches an AST with
2372 // no module name and no imports.
2373 if (ASTReadResult Result = readUnhashedControlBlockOnce())
2374 return Result;
2375
2376 // Validate input files.
2377 const HeaderSearchOptions &HSOpts =
2378 PP.getHeaderSearchInfo().getHeaderSearchOpts();
2379
2380 // All user input files reside at the index range [0, NumUserInputs), and
2381 // system input files reside at [NumUserInputs, NumInputs). For explicitly
2382 // loaded module files, ignore missing inputs.
2383 if (!DisableValidation && F.Kind != MK_ExplicitModule &&
2384 F.Kind != MK_PrebuiltModule) {
2385 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
2386
2387 // If we are reading a module, we will create a verification timestamp,
2388 // so we verify all input files. Otherwise, verify only user input
2389 // files.
2390
2391 unsigned N = NumUserInputs;
2392 if (ValidateSystemInputs ||
2393 (HSOpts.ModulesValidateOncePerBuildSession &&
2394 F.InputFilesValidationTimestamp <= HSOpts.BuildSessionTimestamp &&
2395 F.Kind == MK_ImplicitModule))
2396 N = NumInputs;
2397
2398 for (unsigned I = 0; I < N; ++I) {
2399 InputFile IF = getInputFile(F, I+1, Complain);
2400 if (!IF.getFile() || IF.isOutOfDate())
2401 return OutOfDate;
2402 }
2403 }
2404
2405 if (Listener)
2406 Listener->visitModuleFile(F.FileName, F.Kind);
2407
2408 if (Listener && Listener->needsInputFileVisitation()) {
2409 unsigned N = Listener->needsSystemInputFileVisitation() ? NumInputs
2410 : NumUserInputs;
2411 for (unsigned I = 0; I < N; ++I) {
2412 bool IsSystem = I >= NumUserInputs;
2413 InputFileInfo FI = readInputFileInfo(F, I+1);
2414 Listener->visitInputFile(FI.Filename, IsSystem, FI.Overridden,
2415 F.Kind == MK_ExplicitModule ||
2416 F.Kind == MK_PrebuiltModule);
2417 }
2418 }
2419
2420 return Result;
2421 }
2422
2423 case llvm::BitstreamEntry::SubBlock:
2424 switch (Entry.ID) {
2425 case INPUT_FILES_BLOCK_ID:
2426 F.InputFilesCursor = Stream;
2427 if (Stream.SkipBlock() || // Skip with the main cursor
2428 // Read the abbreviations
2429 ReadBlockAbbrevs(F.InputFilesCursor, INPUT_FILES_BLOCK_ID)) {
2430 Error("malformed block record in AST file");
2431 return Failure;
2432 }
2433 continue;
2434
2435 case OPTIONS_BLOCK_ID:
2436 // If we're reading the first module for this group, check its options
2437 // are compatible with ours. For modules it imports, no further checking
2438 // is required, because we checked them when we built it.
2439 if (Listener && !ImportedBy) {
2440 // Should we allow the configuration of the module file to differ from
2441 // the configuration of the current translation unit in a compatible
2442 // way?
2443 //
2444 // FIXME: Allow this for files explicitly specified with -include-pch.
2445 bool AllowCompatibleConfigurationMismatch =
2446 F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule;
2447
2448 Result = ReadOptionsBlock(Stream, ClientLoadCapabilities,
2449 AllowCompatibleConfigurationMismatch,
2450 *Listener, SuggestedPredefines);
2451 if (Result == Failure) {
2452 Error("malformed block record in AST file");
2453 return Result;
2454 }
2455
2456 if (DisableValidation ||
2457 (AllowConfigurationMismatch && Result == ConfigurationMismatch))
2458 Result = Success;
2459
2460 // If we can't load the module, exit early since we likely
2461 // will rebuild the module anyway. The stream may be in the
2462 // middle of a block.
2463 if (Result != Success)
2464 return Result;
2465 } else if (Stream.SkipBlock()) {
2466 Error("malformed block record in AST file");
2467 return Failure;
2468 }
2469 continue;
2470
2471 default:
2472 if (Stream.SkipBlock()) {
2473 Error("malformed block record in AST file");
2474 return Failure;
2475 }
2476 continue;
2477 }
2478
2479 case llvm::BitstreamEntry::Record:
2480 // The interesting case.
2481 break;
2482 }
2483
2484 // Read and process a record.
2485 Record.clear();
2486 StringRef Blob;
2487 switch ((ControlRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob)) {
2488 case METADATA: {
2489 if (Record[0] != VERSION_MAJOR && !DisableValidation) {
2490 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
2491 Diag(Record[0] < VERSION_MAJOR? diag::err_pch_version_too_old
2492 : diag::err_pch_version_too_new);
2493 return VersionMismatch;
2494 }
2495
2496 bool hasErrors = Record[7];
2497 if (hasErrors && !DisableValidation && !AllowASTWithCompilerErrors) {
2498 Diag(diag::err_pch_with_compiler_errors);
2499 return HadErrors;
2500 }
2501 if (hasErrors) {
2502 Diags.ErrorOccurred = true;
2503 Diags.UncompilableErrorOccurred = true;
2504 Diags.UnrecoverableErrorOccurred = true;
2505 }
2506
2507 F.RelocatablePCH = Record[4];
2508 // Relative paths in a relocatable PCH are relative to our sysroot.
2509 if (F.RelocatablePCH)
2510 F.BaseDirectory = isysroot.empty() ? "/" : isysroot;
2511
2512 F.HasTimestamps = Record[5];
2513
2514 F.PCHHasObjectFile = Record[6];
2515
2516 const std::string &CurBranch = getClangFullRepositoryVersion();
2517 StringRef ASTBranch = Blob;
2518 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) {
2519 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
2520 Diag(diag::err_pch_different_branch) << ASTBranch << CurBranch;
2521 return VersionMismatch;
2522 }
2523 break;
2524 }
2525
2526 case IMPORTS: {
2527 // Validate the AST before processing any imports (otherwise, untangling
2528 // them can be error-prone and expensive). A module will have a name and
2529 // will already have been validated, but this catches the PCH case.
2530 if (ASTReadResult Result = readUnhashedControlBlockOnce())
2531 return Result;
2532
2533 // Load each of the imported PCH files.
2534 unsigned Idx = 0, N = Record.size();
2535 while (Idx < N) {
2536 // Read information about the AST file.
2537 ModuleKind ImportedKind = (ModuleKind)Record[Idx++];
2538 // The import location will be the local one for now; we will adjust
2539 // all import locations of module imports after the global source
2540 // location info are setup, in ReadAST.
2541 SourceLocation ImportLoc =
2542 ReadUntranslatedSourceLocation(Record[Idx++]);
2543 off_t StoredSize = (off_t)Record[Idx++];
2544 time_t StoredModTime = (time_t)Record[Idx++];
2545 ASTFileSignature StoredSignature = {
2546 {{(uint32_t)Record[Idx++], (uint32_t)Record[Idx++],
2547 (uint32_t)Record[Idx++], (uint32_t)Record[Idx++],
2548 (uint32_t)Record[Idx++]}}};
2549
2550 std::string ImportedName = ReadString(Record, Idx);
2551 std::string ImportedFile;
2552
2553 // For prebuilt and explicit modules first consult the file map for
2554 // an override. Note that here we don't search prebuilt module
2555 // directories, only the explicit name to file mappings. Also, we will
2556 // still verify the size/signature making sure it is essentially the
2557 // same file but perhaps in a different location.
2558 if (ImportedKind == MK_PrebuiltModule || ImportedKind == MK_ExplicitModule)
2559 ImportedFile = PP.getHeaderSearchInfo().getPrebuiltModuleFileName(
2560 ImportedName, /*FileMapOnly*/ true);
2561
2562 if (ImportedFile.empty())
2563 ImportedFile = ReadPath(F, Record, Idx);
2564 else
2565 SkipPath(Record, Idx);
2566
2567 // If our client can't cope with us being out of date, we can't cope with
2568 // our dependency being missing.
2569 unsigned Capabilities = ClientLoadCapabilities;
2570 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
2571 Capabilities &= ~ARR_Missing;
2572
2573 // Load the AST file.
2574 auto Result = ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F,
2575 Loaded, StoredSize, StoredModTime,
2576 StoredSignature, Capabilities);
2577
2578 // If we diagnosed a problem, produce a backtrace.
2579 if (isDiagnosedResult(Result, Capabilities))
2580 Diag(diag::note_module_file_imported_by)
2581 << F.FileName << !F.ModuleName.empty() << F.ModuleName;
2582
2583 switch (Result) {
2584 case Failure: return Failure;
2585 // If we have to ignore the dependency, we'll have to ignore this too.
2586 case Missing:
2587 case OutOfDate: return OutOfDate;
2588 case VersionMismatch: return VersionMismatch;
2589 case ConfigurationMismatch: return ConfigurationMismatch;
2590 case HadErrors: return HadErrors;
2591 case Success: break;
2592 }
2593 }
2594 break;
2595 }
2596
2597 case ORIGINAL_FILE:
2598 F.OriginalSourceFileID = FileID::get(Record[0]);
2599 F.ActualOriginalSourceFileName = Blob;
2600 F.OriginalSourceFileName = F.ActualOriginalSourceFileName;
2601 ResolveImportedPath(F, F.OriginalSourceFileName);
2602 break;
2603
2604 case ORIGINAL_FILE_ID:
2605 F.OriginalSourceFileID = FileID::get(Record[0]);
2606 break;
2607
2608 case ORIGINAL_PCH_DIR:
2609 F.OriginalDir = Blob;
2610 break;
2611
2612 case MODULE_NAME:
2613 F.ModuleName = Blob;
2614 if (Listener)
2615 Listener->ReadModuleName(F.ModuleName);
2616
2617 // Validate the AST as soon as we have a name so we can exit early on
2618 // failure.
2619 if (ASTReadResult Result = readUnhashedControlBlockOnce())
2620 return Result;
2621
2622 break;
2623
2624 case MODULE_DIRECTORY: {
2625 assert(!F.ModuleName.empty() &&((!F.ModuleName.empty() && "MODULE_DIRECTORY found before MODULE_NAME"
) ? static_cast<void> (0) : __assert_fail ("!F.ModuleName.empty() && \"MODULE_DIRECTORY found before MODULE_NAME\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 2626, __PRETTY_FUNCTION__))
2626 "MODULE_DIRECTORY found before MODULE_NAME")((!F.ModuleName.empty() && "MODULE_DIRECTORY found before MODULE_NAME"
) ? static_cast<void> (0) : __assert_fail ("!F.ModuleName.empty() && \"MODULE_DIRECTORY found before MODULE_NAME\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 2626, __PRETTY_FUNCTION__))
;
2627 // If we've already loaded a module map file covering this module, we may
2628 // have a better path for it (relative to the current build).
2629 Module *M = PP.getHeaderSearchInfo().lookupModule(
2630 F.ModuleName, /*AllowSearch*/ true,
2631 /*AllowExtraModuleMapSearch*/ true);
2632 if (M && M->Directory) {
2633 // If we're implicitly loading a module, the base directory can't
2634 // change between the build and use.
2635 // Don't emit module relocation error if we have -fno-validate-pch
2636 if (!PP.getPreprocessorOpts().DisablePCHValidation &&
2637 F.Kind != MK_ExplicitModule && F.Kind != MK_PrebuiltModule) {
2638 const DirectoryEntry *BuildDir =
2639 PP.getFileManager().getDirectory(Blob);
2640 if (!BuildDir || BuildDir != M->Directory) {
2641 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
2642 Diag(diag::err_imported_module_relocated)
2643 << F.ModuleName << Blob << M->Directory->getName();
2644 return OutOfDate;
2645 }
2646 }
2647 F.BaseDirectory = M->Directory->getName();
2648 } else {
2649 F.BaseDirectory = Blob;
2650 }
2651 break;
2652 }
2653
2654 case MODULE_MAP_FILE:
2655 if (ASTReadResult Result =
2656 ReadModuleMapFileBlock(Record, F, ImportedBy, ClientLoadCapabilities))
2657 return Result;
2658 break;
2659
2660 case INPUT_FILE_OFFSETS:
2661 NumInputs = Record[0];
2662 NumUserInputs = Record[1];
2663 F.InputFileOffsets =
2664 (const llvm::support::unaligned_uint64_t *)Blob.data();
2665 F.InputFilesLoaded.resize(NumInputs);
2666 F.NumUserInputFiles = NumUserInputs;
2667 break;
2668 }
2669 }
2670}
2671
2672ASTReader::ASTReadResult
2673ASTReader::ReadASTBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
2674 BitstreamCursor &Stream = F.Stream;
2675
2676 if (Stream.EnterSubBlock(AST_BLOCK_ID)) {
2677 Error("malformed block record in AST file");
2678 return Failure;
2679 }
2680
2681 // Read all of the records and blocks for the AST file.
2682 RecordData Record;
2683 while (true) {
2684 llvm::BitstreamEntry Entry = Stream.advance();
2685
2686 switch (Entry.Kind) {
2687 case llvm::BitstreamEntry::Error:
2688 Error("error at end of module block in AST file");
2689 return Failure;
2690 case llvm::BitstreamEntry::EndBlock:
2691 // Outside of C++, we do not store a lookup map for the translation unit.
2692 // Instead, mark it as needing a lookup map to be built if this module
2693 // contains any declarations lexically within it (which it always does!).
2694 // This usually has no cost, since we very rarely need the lookup map for
2695 // the translation unit outside C++.
2696 if (ASTContext *Ctx = ContextObj) {
2697 DeclContext *DC = Ctx->getTranslationUnitDecl();
2698 if (DC->hasExternalLexicalStorage() && !Ctx->getLangOpts().CPlusPlus)
2699 DC->setMustBuildLookupTable();
2700 }
2701
2702 return Success;
2703 case llvm::BitstreamEntry::SubBlock:
2704 switch (Entry.ID) {
2705 case DECLTYPES_BLOCK_ID:
2706 // We lazily load the decls block, but we want to set up the
2707 // DeclsCursor cursor to point into it. Clone our current bitcode
2708 // cursor to it, enter the block and read the abbrevs in that block.
2709 // With the main cursor, we just skip over it.
2710 F.DeclsCursor = Stream;
2711 if (Stream.SkipBlock() || // Skip with the main cursor.
2712 // Read the abbrevs.
2713 ReadBlockAbbrevs(F.DeclsCursor, DECLTYPES_BLOCK_ID)) {
2714 Error("malformed block record in AST file");
2715 return Failure;
2716 }
2717 break;
2718
2719 case PREPROCESSOR_BLOCK_ID:
2720 F.MacroCursor = Stream;
2721 if (!PP.getExternalSource())
2722 PP.setExternalSource(this);
2723
2724 if (Stream.SkipBlock() ||
2725 ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID)) {
2726 Error("malformed block record in AST file");
2727 return Failure;
2728 }
2729 F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo();
2730 break;
2731
2732 case PREPROCESSOR_DETAIL_BLOCK_ID:
2733 F.PreprocessorDetailCursor = Stream;
2734 if (Stream.SkipBlock() ||
2735 ReadBlockAbbrevs(F.PreprocessorDetailCursor,
2736 PREPROCESSOR_DETAIL_BLOCK_ID)) {
2737 Error("malformed preprocessor detail record in AST file");
2738 return Failure;
2739 }
2740 F.PreprocessorDetailStartOffset
2741 = F.PreprocessorDetailCursor.GetCurrentBitNo();
2742
2743 if (!PP.getPreprocessingRecord())
2744 PP.createPreprocessingRecord();
2745 if (!PP.getPreprocessingRecord()->getExternalSource())
2746 PP.getPreprocessingRecord()->SetExternalSource(*this);
2747 break;
2748
2749 case SOURCE_MANAGER_BLOCK_ID:
2750 if (ReadSourceManagerBlock(F))
2751 return Failure;
2752 break;
2753
2754 case SUBMODULE_BLOCK_ID:
2755 if (ASTReadResult Result =
2756 ReadSubmoduleBlock(F, ClientLoadCapabilities))
2757 return Result;
2758 break;
2759
2760 case COMMENTS_BLOCK_ID: {
2761 BitstreamCursor C = Stream;
2762 if (Stream.SkipBlock() ||
2763 ReadBlockAbbrevs(C, COMMENTS_BLOCK_ID)) {
2764 Error("malformed comments block in AST file");
2765 return Failure;
2766 }
2767 CommentsCursors.push_back(std::make_pair(C, &F));
2768 break;
2769 }
2770
2771 default:
2772 if (Stream.SkipBlock()) {
2773 Error("malformed block record in AST file");
2774 return Failure;
2775 }
2776 break;
2777 }
2778 continue;
2779
2780 case llvm::BitstreamEntry::Record:
2781 // The interesting case.
2782 break;
2783 }
2784
2785 // Read and process a record.
2786 Record.clear();
2787 StringRef Blob;
2788 auto RecordType =
2789 (ASTRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob);
2790
2791 // If we're not loading an AST context, we don't care about most records.
2792 if (!ContextObj) {
2793 switch (RecordType) {
2794 case IDENTIFIER_TABLE:
2795 case IDENTIFIER_OFFSET:
2796 case INTERESTING_IDENTIFIERS:
2797 case STATISTICS:
2798 case PP_CONDITIONAL_STACK:
2799 case PP_COUNTER_VALUE:
2800 case SOURCE_LOCATION_OFFSETS:
2801 case MODULE_OFFSET_MAP:
2802 case SOURCE_MANAGER_LINE_TABLE:
2803 case SOURCE_LOCATION_PRELOADS:
2804 case PPD_ENTITIES_OFFSETS:
2805 case HEADER_SEARCH_TABLE:
2806 case IMPORTED_MODULES:
2807 case MACRO_OFFSET:
2808 break;
2809 default:
2810 continue;
2811 }
2812 }
2813
2814 switch (RecordType) {
2815 default: // Default behavior: ignore.
2816 break;
2817
2818 case TYPE_OFFSET: {
2819 if (F.LocalNumTypes != 0) {
2820 Error("duplicate TYPE_OFFSET record in AST file");
2821 return Failure;
2822 }
2823 F.TypeOffsets = (const uint32_t *)Blob.data();
2824 F.LocalNumTypes = Record[0];
2825 unsigned LocalBaseTypeIndex = Record[1];
2826 F.BaseTypeIndex = getTotalNumTypes();
2827
2828 if (F.LocalNumTypes > 0) {
2829 // Introduce the global -> local mapping for types within this module.
2830 GlobalTypeMap.insert(std::make_pair(getTotalNumTypes(), &F));
2831
2832 // Introduce the local -> global mapping for types within this module.
2833 F.TypeRemap.insertOrReplace(
2834 std::make_pair(LocalBaseTypeIndex,
2835 F.BaseTypeIndex - LocalBaseTypeIndex));
2836
2837 TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes);
2838 }
2839 break;
2840 }
2841
2842 case DECL_OFFSET: {
2843 if (F.LocalNumDecls != 0) {
2844 Error("duplicate DECL_OFFSET record in AST file");
2845 return Failure;
2846 }
2847 F.DeclOffsets = (const DeclOffset *)Blob.data();
2848 F.LocalNumDecls = Record[0];
2849 unsigned LocalBaseDeclID = Record[1];
2850 F.BaseDeclID = getTotalNumDecls();
2851
2852 if (F.LocalNumDecls > 0) {
2853 // Introduce the global -> local mapping for declarations within this
2854 // module.
2855 GlobalDeclMap.insert(
2856 std::make_pair(getTotalNumDecls() + NUM_PREDEF_DECL_IDS, &F));
2857
2858 // Introduce the local -> global mapping for declarations within this
2859 // module.
2860 F.DeclRemap.insertOrReplace(
2861 std::make_pair(LocalBaseDeclID, F.BaseDeclID - LocalBaseDeclID));
2862
2863 // Introduce the global -> local mapping for declarations within this
2864 // module.
2865 F.GlobalToLocalDeclIDs[&F] = LocalBaseDeclID;
2866
2867 DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls);
2868 }
2869 break;
2870 }
2871
2872 case TU_UPDATE_LEXICAL: {
2873 DeclContext *TU = ContextObj->getTranslationUnitDecl();
2874 LexicalContents Contents(
2875 reinterpret_cast<const llvm::support::unaligned_uint32_t *>(
2876 Blob.data()),
2877 static_cast<unsigned int>(Blob.size() / 4));
2878 TULexicalDecls.push_back(std::make_pair(&F, Contents));
2879 TU->setHasExternalLexicalStorage(true);
2880 break;
2881 }
2882
2883 case UPDATE_VISIBLE: {
2884 unsigned Idx = 0;
2885 serialization::DeclID ID = ReadDeclID(F, Record, Idx);
2886 auto *Data = (const unsigned char*)Blob.data();
2887 PendingVisibleUpdates[ID].push_back(PendingVisibleUpdate{&F, Data});
2888 // If we've already loaded the decl, perform the updates when we finish
2889 // loading this block.
2890 if (Decl *D = GetExistingDecl(ID))
2891 PendingUpdateRecords.push_back(
2892 PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
2893 break;
2894 }
2895
2896 case IDENTIFIER_TABLE:
2897 F.IdentifierTableData = Blob.data();
2898 if (Record[0]) {
2899 F.IdentifierLookupTable = ASTIdentifierLookupTable::Create(
2900 (const unsigned char *)F.IdentifierTableData + Record[0],
2901 (const unsigned char *)F.IdentifierTableData + sizeof(uint32_t),
2902 (const unsigned char *)F.IdentifierTableData,
2903 ASTIdentifierLookupTrait(*this, F));
2904
2905 PP.getIdentifierTable().setExternalIdentifierLookup(this);
2906 }
2907 break;
2908
2909 case IDENTIFIER_OFFSET: {
2910 if (F.LocalNumIdentifiers != 0) {
2911 Error("duplicate IDENTIFIER_OFFSET record in AST file");
2912 return Failure;
2913 }
2914 F.IdentifierOffsets = (const uint32_t *)Blob.data();
2915 F.LocalNumIdentifiers = Record[0];
2916 unsigned LocalBaseIdentifierID = Record[1];
2917 F.BaseIdentifierID = getTotalNumIdentifiers();
2918
2919 if (F.LocalNumIdentifiers > 0) {
2920 // Introduce the global -> local mapping for identifiers within this
2921 // module.
2922 GlobalIdentifierMap.insert(std::make_pair(getTotalNumIdentifiers() + 1,
2923 &F));
2924
2925 // Introduce the local -> global mapping for identifiers within this
2926 // module.
2927 F.IdentifierRemap.insertOrReplace(
2928 std::make_pair(LocalBaseIdentifierID,
2929 F.BaseIdentifierID - LocalBaseIdentifierID));
2930
2931 IdentifiersLoaded.resize(IdentifiersLoaded.size()
2932 + F.LocalNumIdentifiers);
2933 }
2934 break;
2935 }
2936
2937 case INTERESTING_IDENTIFIERS:
2938 F.PreloadIdentifierOffsets.assign(Record.begin(), Record.end());
2939 break;
2940
2941 case EAGERLY_DESERIALIZED_DECLS:
2942 // FIXME: Skip reading this record if our ASTConsumer doesn't care
2943 // about "interesting" decls (for instance, if we're building a module).
2944 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2945 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I]));
2946 break;
2947
2948 case MODULAR_CODEGEN_DECLS:
2949 // FIXME: Skip reading this record if our ASTConsumer doesn't care about
2950 // them (ie: if we're not codegenerating this module).
2951 if (F.Kind == MK_MainFile)
2952 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2953 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I]));
2954 break;
2955
2956 case SPECIAL_TYPES:
2957 if (SpecialTypes.empty()) {
2958 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2959 SpecialTypes.push_back(getGlobalTypeID(F, Record[I]));
2960 break;
2961 }
2962
2963 if (SpecialTypes.size() != Record.size()) {
2964 Error("invalid special-types record");
2965 return Failure;
2966 }
2967
2968 for (unsigned I = 0, N = Record.size(); I != N; ++I) {
2969 serialization::TypeID ID = getGlobalTypeID(F, Record[I]);
2970 if (!SpecialTypes[I])
2971 SpecialTypes[I] = ID;
2972 // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate
2973 // merge step?
2974 }
2975 break;
2976
2977 case STATISTICS:
2978 TotalNumStatements += Record[0];
2979 TotalNumMacros += Record[1];
2980 TotalLexicalDeclContexts += Record[2];
2981 TotalVisibleDeclContexts += Record[3];
2982 break;
2983
2984 case UNUSED_FILESCOPED_DECLS:
2985 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2986 UnusedFileScopedDecls.push_back(getGlobalDeclID(F, Record[I]));
2987 break;
2988
2989 case DELEGATING_CTORS:
2990 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2991 DelegatingCtorDecls.push_back(getGlobalDeclID(F, Record[I]));
2992 break;
2993
2994 case WEAK_UNDECLARED_IDENTIFIERS:
2995 if (Record.size() % 4 != 0) {
2996 Error("invalid weak identifiers record");
2997 return Failure;
2998 }
2999
3000 // FIXME: Ignore weak undeclared identifiers from non-original PCH
3001 // files. This isn't the way to do it :)
3002 WeakUndeclaredIdentifiers.clear();
3003
3004 // Translate the weak, undeclared identifiers into global IDs.
3005 for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) {
3006 WeakUndeclaredIdentifiers.push_back(
3007 getGlobalIdentifierID(F, Record[I++]));
3008 WeakUndeclaredIdentifiers.push_back(
3009 getGlobalIdentifierID(F, Record[I++]));
3010 WeakUndeclaredIdentifiers.push_back(
3011 ReadSourceLocation(F, Record, I).getRawEncoding());
3012 WeakUndeclaredIdentifiers.push_back(Record[I++]);
3013 }
3014 break;
3015
3016 case SELECTOR_OFFSETS: {
3017 F.SelectorOffsets = (const uint32_t *)Blob.data();
3018 F.LocalNumSelectors = Record[0];
3019 unsigned LocalBaseSelectorID = Record[1];
3020 F.BaseSelectorID = getTotalNumSelectors();
3021
3022 if (F.LocalNumSelectors > 0) {
3023 // Introduce the global -> local mapping for selectors within this
3024 // module.
3025 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F));
3026
3027 // Introduce the local -> global mapping for selectors within this
3028 // module.
3029 F.SelectorRemap.insertOrReplace(
3030 std::make_pair(LocalBaseSelectorID,
3031 F.BaseSelectorID - LocalBaseSelectorID));
3032
3033 SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors);
3034 }
3035 break;
3036 }
3037
3038 case METHOD_POOL:
3039 F.SelectorLookupTableData = (const unsigned char *)Blob.data();
3040 if (Record[0])
3041 F.SelectorLookupTable
3042 = ASTSelectorLookupTable::Create(
3043 F.SelectorLookupTableData + Record[0],
3044 F.SelectorLookupTableData,
3045 ASTSelectorLookupTrait(*this, F));
3046 TotalNumMethodPoolEntries += Record[1];
3047 break;
3048
3049 case REFERENCED_SELECTOR_POOL:
3050 if (!Record.empty()) {
3051 for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) {
3052 ReferencedSelectorsData.push_back(getGlobalSelectorID(F,
3053 Record[Idx++]));
3054 ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx).
3055 getRawEncoding());
3056 }
3057 }
3058 break;
3059
3060 case PP_CONDITIONAL_STACK:
3061 if (!Record.empty()) {
3062 unsigned Idx = 0, End = Record.size() - 1;
3063 bool ReachedEOFWhileSkipping = Record[Idx++];
3064 llvm::Optional<Preprocessor::PreambleSkipInfo> SkipInfo;
3065 if (ReachedEOFWhileSkipping) {
3066 SourceLocation HashToken = ReadSourceLocation(F, Record, Idx);
3067 SourceLocation IfTokenLoc = ReadSourceLocation(F, Record, Idx);
3068 bool FoundNonSkipPortion = Record[Idx++];
3069 bool FoundElse = Record[Idx++];
3070 SourceLocation ElseLoc = ReadSourceLocation(F, Record, Idx);
3071 SkipInfo.emplace(HashToken, IfTokenLoc, FoundNonSkipPortion,
3072 FoundElse, ElseLoc);
3073 }
3074 SmallVector<PPConditionalInfo, 4> ConditionalStack;
3075 while (Idx < End) {
3076 auto Loc = ReadSourceLocation(F, Record, Idx);
3077 bool WasSkipping = Record[Idx++];
3078 bool FoundNonSkip = Record[Idx++];
3079 bool FoundElse = Record[Idx++];
3080 ConditionalStack.push_back(
3081 {Loc, WasSkipping, FoundNonSkip, FoundElse});
3082 }
3083 PP.setReplayablePreambleConditionalStack(ConditionalStack, SkipInfo);
3084 }
3085 break;
3086
3087 case PP_COUNTER_VALUE:
3088 if (!Record.empty() && Listener)
3089 Listener->ReadCounter(F, Record[0]);
3090 break;
3091
3092 case FILE_SORTED_DECLS:
3093 F.FileSortedDecls = (const DeclID *)Blob.data();
3094 F.NumFileSortedDecls = Record[0];
3095 break;
3096
3097 case SOURCE_LOCATION_OFFSETS: {
3098 F.SLocEntryOffsets = (const uint32_t *)Blob.data();
3099 F.LocalNumSLocEntries = Record[0];
3100 unsigned SLocSpaceSize = Record[1];
3101 std::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) =
3102 SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries,
3103 SLocSpaceSize);
3104 if (!F.SLocEntryBaseID) {
3105 Error("ran out of source locations");
3106 break;
3107 }
3108 // Make our entry in the range map. BaseID is negative and growing, so
3109 // we invert it. Because we invert it, though, we need the other end of
3110 // the range.
3111 unsigned RangeStart =
3112 unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1;
3113 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F));
3114 F.FirstLoc = SourceLocation::getFromRawEncoding(F.SLocEntryBaseOffset);
3115
3116 // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing.
3117 assert((F.SLocEntryBaseOffset & (1U << 31U)) == 0)(((F.SLocEntryBaseOffset & (1U << 31U)) == 0) ? static_cast
<void> (0) : __assert_fail ("(F.SLocEntryBaseOffset & (1U << 31U)) == 0"
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 3117, __PRETTY_FUNCTION__))
;
3118 GlobalSLocOffsetMap.insert(
3119 std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset
3120 - SLocSpaceSize,&F));
3121
3122 // Initialize the remapping table.
3123 // Invalid stays invalid.
3124 F.SLocRemap.insertOrReplace(std::make_pair(0U, 0));
3125 // This module. Base was 2 when being compiled.
3126 F.SLocRemap.insertOrReplace(std::make_pair(2U,
3127 static_cast<int>(F.SLocEntryBaseOffset - 2)));
3128
3129 TotalNumSLocEntries += F.LocalNumSLocEntries;
3130 break;
3131 }
3132
3133 case MODULE_OFFSET_MAP:
3134 F.ModuleOffsetMap = Blob;
3135 break;
3136
3137 case SOURCE_MANAGER_LINE_TABLE:
3138 if (ParseLineTable(F, Record))
3139 return Failure;
3140 break;
3141
3142 case SOURCE_LOCATION_PRELOADS: {
3143 // Need to transform from the local view (1-based IDs) to the global view,
3144 // which is based off F.SLocEntryBaseID.
3145 if (!F.PreloadSLocEntries.empty()) {
3146 Error("Multiple SOURCE_LOCATION_PRELOADS records in AST file");
3147 return Failure;
3148 }
3149
3150 F.PreloadSLocEntries.swap(Record);
3151 break;
3152 }
3153
3154 case EXT_VECTOR_DECLS:
3155 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3156 ExtVectorDecls.push_back(getGlobalDeclID(F, Record[I]));
3157 break;
3158
3159 case VTABLE_USES:
3160 if (Record.size() % 3 != 0) {
3161 Error("Invalid VTABLE_USES record");
3162 return Failure;
3163 }
3164
3165 // Later tables overwrite earlier ones.
3166 // FIXME: Modules will have some trouble with this. This is clearly not
3167 // the right way to do this.
3168 VTableUses.clear();
3169
3170 for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) {
3171 VTableUses.push_back(getGlobalDeclID(F, Record[Idx++]));
3172 VTableUses.push_back(
3173 ReadSourceLocation(F, Record, Idx).getRawEncoding());
3174 VTableUses.push_back(Record[Idx++]);
3175 }
3176 break;
3177
3178 case PENDING_IMPLICIT_INSTANTIATIONS:
3179 if (PendingInstantiations.size() % 2 != 0) {
3180 Error("Invalid existing PendingInstantiations");
3181 return Failure;
3182 }
3183
3184 if (Record.size() % 2 != 0) {
3185 Error("Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
3186 return Failure;
3187 }
3188
3189 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
3190 PendingInstantiations.push_back(getGlobalDeclID(F, Record[I++]));
3191 PendingInstantiations.push_back(
3192 ReadSourceLocation(F, Record, I).getRawEncoding());
3193 }
3194 break;
3195
3196 case SEMA_DECL_REFS:
3197 if (Record.size() != 3) {
3198 Error("Invalid SEMA_DECL_REFS block");
3199 return Failure;
3200 }
3201 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3202 SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
3203 break;
3204
3205 case PPD_ENTITIES_OFFSETS: {
3206 F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data();
3207 assert(Blob.size() % sizeof(PPEntityOffset) == 0)((Blob.size() % sizeof(PPEntityOffset) == 0) ? static_cast<
void> (0) : __assert_fail ("Blob.size() % sizeof(PPEntityOffset) == 0"
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 3207, __PRETTY_FUNCTION__))
;
3208 F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset);
3209
3210 unsigned LocalBasePreprocessedEntityID = Record[0];
3211
3212 unsigned StartingID;
3213 if (!PP.getPreprocessingRecord())
3214 PP.createPreprocessingRecord();
3215 if (!PP.getPreprocessingRecord()->getExternalSource())
3216 PP.getPreprocessingRecord()->SetExternalSource(*this);
3217 StartingID
3218 = PP.getPreprocessingRecord()
3219 ->allocateLoadedEntities(F.NumPreprocessedEntities);
3220 F.BasePreprocessedEntityID = StartingID;
3221
3222 if (F.NumPreprocessedEntities > 0) {
3223 // Introduce the global -> local mapping for preprocessed entities in
3224 // this module.
3225 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
3226
3227 // Introduce the local -> global mapping for preprocessed entities in
3228 // this module.
3229 F.PreprocessedEntityRemap.insertOrReplace(
3230 std::make_pair(LocalBasePreprocessedEntityID,
3231 F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID));
3232 }
3233
3234 break;
3235 }
3236
3237 case PPD_SKIPPED_RANGES: {
3238 F.PreprocessedSkippedRangeOffsets = (const PPSkippedRange*)Blob.data();
3239 assert(Blob.size() % sizeof(PPSkippedRange) == 0)((Blob.size() % sizeof(PPSkippedRange) == 0) ? static_cast<
void> (0) : __assert_fail ("Blob.size() % sizeof(PPSkippedRange) == 0"
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 3239, __PRETTY_FUNCTION__))
;
3240 F.NumPreprocessedSkippedRanges = Blob.size() / sizeof(PPSkippedRange);
3241
3242 if (!PP.getPreprocessingRecord())
3243 PP.createPreprocessingRecord();
3244 if (!PP.getPreprocessingRecord()->getExternalSource())
3245 PP.getPreprocessingRecord()->SetExternalSource(*this);
3246 F.BasePreprocessedSkippedRangeID = PP.getPreprocessingRecord()
3247 ->allocateSkippedRanges(F.NumPreprocessedSkippedRanges);
3248
3249 if (F.NumPreprocessedSkippedRanges > 0)
3250 GlobalSkippedRangeMap.insert(
3251 std::make_pair(F.BasePreprocessedSkippedRangeID, &F));
3252 break;
3253 }
3254
3255 case DECL_UPDATE_OFFSETS:
3256 if (Record.size() % 2 != 0) {
3257 Error("invalid DECL_UPDATE_OFFSETS block in AST file");
3258 return Failure;
3259 }
3260 for (unsigned I = 0, N = Record.size(); I != N; I += 2) {
3261 GlobalDeclID ID = getGlobalDeclID(F, Record[I]);
3262 DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I + 1]));
3263
3264 // If we've already loaded the decl, perform the updates when we finish
3265 // loading this block.
3266 if (Decl *D = GetExistingDecl(ID))
3267 PendingUpdateRecords.push_back(
3268 PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
3269 }
3270 break;
3271
3272 case OBJC_CATEGORIES_MAP:
3273 if (F.LocalNumObjCCategoriesInMap != 0) {
3274 Error("duplicate OBJC_CATEGORIES_MAP record in AST file");
3275 return Failure;
3276 }
3277
3278 F.LocalNumObjCCategoriesInMap = Record[0];
3279 F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data();
3280 break;
3281
3282 case OBJC_CATEGORIES:
3283 F.ObjCCategories.swap(Record);
3284 break;
3285
3286 case CUDA_SPECIAL_DECL_REFS:
3287 // Later tables overwrite earlier ones.
3288 // FIXME: Modules will have trouble with this.
3289 CUDASpecialDeclRefs.clear();
3290 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3291 CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
3292 break;
3293
3294 case HEADER_SEARCH_TABLE:
3295 F.HeaderFileInfoTableData = Blob.data();
3296 F.LocalNumHeaderFileInfos = Record[1];
3297 if (Record[0]) {
3298 F.HeaderFileInfoTable
3299 = HeaderFileInfoLookupTable::Create(
3300 (const unsigned char *)F.HeaderFileInfoTableData + Record[0],
3301 (const unsigned char *)F.HeaderFileInfoTableData,
3302 HeaderFileInfoTrait(*this, F,
3303 &PP.getHeaderSearchInfo(),
3304 Blob.data() + Record[2]));
3305
3306 PP.getHeaderSearchInfo().SetExternalSource(this);
3307 if (!PP.getHeaderSearchInfo().getExternalLookup())
3308 PP.getHeaderSearchInfo().SetExternalLookup(this);
3309 }
3310 break;
3311
3312 case FP_PRAGMA_OPTIONS:
3313 // Later tables overwrite earlier ones.
3314 FPPragmaOptions.swap(Record);
3315 break;
3316
3317 case OPENCL_EXTENSIONS:
3318 for (unsigned I = 0, E = Record.size(); I != E; ) {
3319 auto Name = ReadString(Record, I);
3320 auto &Opt = OpenCLExtensions.OptMap[Name];
3321 Opt.Supported = Record[I++] != 0;
3322 Opt.Enabled = Record[I++] != 0;
3323 Opt.Avail = Record[I++];
3324 Opt.Core = Record[I++];
3325 }
3326 break;
3327
3328 case OPENCL_EXTENSION_TYPES:
3329 for (unsigned I = 0, E = Record.size(); I != E;) {
3330 auto TypeID = static_cast<::TypeID>(Record[I++]);
3331 auto *Type = GetType(TypeID).getTypePtr();
3332 auto NumExt = static_cast<unsigned>(Record[I++]);
3333 for (unsigned II = 0; II != NumExt; ++II) {
3334 auto Ext = ReadString(Record, I);
3335 OpenCLTypeExtMap[Type].insert(Ext);
3336 }
3337 }
3338 break;
3339
3340 case OPENCL_EXTENSION_DECLS:
3341 for (unsigned I = 0, E = Record.size(); I != E;) {
3342 auto DeclID = static_cast<::DeclID>(Record[I++]);
3343 auto *Decl = GetDecl(DeclID);
3344 auto NumExt = static_cast<unsigned>(Record[I++]);
3345 for (unsigned II = 0; II != NumExt; ++II) {
3346 auto Ext = ReadString(Record, I);
3347 OpenCLDeclExtMap[Decl].insert(Ext);
3348 }
3349 }
3350 break;
3351
3352 case TENTATIVE_DEFINITIONS:
3353 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3354 TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I]));
3355 break;
3356
3357 case KNOWN_NAMESPACES:
3358 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3359 KnownNamespaces.push_back(getGlobalDeclID(F, Record[I]));
3360 break;
3361
3362 case UNDEFINED_BUT_USED:
3363 if (UndefinedButUsed.size() % 2 != 0) {
3364 Error("Invalid existing UndefinedButUsed");
3365 return Failure;
3366 }
3367
3368 if (Record.size() % 2 != 0) {
3369 Error("invalid undefined-but-used record");
3370 return Failure;
3371 }
3372 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
3373 UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++]));
3374 UndefinedButUsed.push_back(
3375 ReadSourceLocation(F, Record, I).getRawEncoding());
3376 }
3377 break;
3378
3379 case DELETE_EXPRS_TO_ANALYZE:
3380 for (unsigned I = 0, N = Record.size(); I != N;) {
3381 DelayedDeleteExprs.push_back(getGlobalDeclID(F, Record[I++]));
3382 const uint64_t Count = Record[I++];
3383 DelayedDeleteExprs.push_back(Count);
3384 for (uint64_t C = 0; C < Count; ++C) {
3385 DelayedDeleteExprs.push_back(ReadSourceLocation(F, Record, I).getRawEncoding());
3386 bool IsArrayForm = Record[I++] == 1;
3387 DelayedDeleteExprs.push_back(IsArrayForm);
3388 }
3389 }
3390 break;
3391
3392 case IMPORTED_MODULES:
3393 if (!F.isModule()) {
3394 // If we aren't loading a module (which has its own exports), make
3395 // all of the imported modules visible.
3396 // FIXME: Deal with macros-only imports.
3397 for (unsigned I = 0, N = Record.size(); I != N; /**/) {
3398 unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]);
3399 SourceLocation Loc = ReadSourceLocation(F, Record, I);
3400 if (GlobalID) {
3401 ImportedModules.push_back(ImportedSubmodule(GlobalID, Loc));
3402 if (DeserializationListener)
3403 DeserializationListener->ModuleImportRead(GlobalID, Loc);
3404 }
3405 }
3406 }
3407 break;
3408
3409 case MACRO_OFFSET: {
3410 if (F.LocalNumMacros != 0) {
3411 Error("duplicate MACRO_OFFSET record in AST file");
3412 return Failure;
3413 }
3414 F.MacroOffsets = (const uint32_t *)Blob.data();
3415 F.LocalNumMacros = Record[0];
3416 unsigned LocalBaseMacroID = Record[1];
3417 F.BaseMacroID = getTotalNumMacros();
3418
3419 if (F.LocalNumMacros > 0) {
3420 // Introduce the global -> local mapping for macros within this module.
3421 GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F));
3422
3423 // Introduce the local -> global mapping for macros within this module.
3424 F.MacroRemap.insertOrReplace(
3425 std::make_pair(LocalBaseMacroID,
3426 F.BaseMacroID - LocalBaseMacroID));
3427
3428 MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros);
3429 }
3430 break;
3431 }
3432
3433 case LATE_PARSED_TEMPLATE:
3434 LateParsedTemplates.append(Record.begin(), Record.end());
3435 break;
3436
3437 case OPTIMIZE_PRAGMA_OPTIONS:
3438 if (Record.size() != 1) {
3439 Error("invalid pragma optimize record");
3440 return Failure;
3441 }
3442 OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]);
3443 break;
3444
3445 case MSSTRUCT_PRAGMA_OPTIONS:
3446 if (Record.size() != 1) {
3447 Error("invalid pragma ms_struct record");
3448 return Failure;
3449 }
3450 PragmaMSStructState = Record[0];
3451 break;
3452
3453 case POINTERS_TO_MEMBERS_PRAGMA_OPTIONS:
3454 if (Record.size() != 2) {
3455 Error("invalid pragma ms_struct record");
3456 return Failure;
3457 }
3458 PragmaMSPointersToMembersState = Record[0];
3459 PointersToMembersPragmaLocation = ReadSourceLocation(F, Record[1]);
3460 break;
3461
3462 case UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES:
3463 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3464 UnusedLocalTypedefNameCandidates.push_back(
3465 getGlobalDeclID(F, Record[I]));
3466 break;
3467
3468 case CUDA_PRAGMA_FORCE_HOST_DEVICE_DEPTH:
3469 if (Record.size() != 1) {
3470 Error("invalid cuda pragma options record");
3471 return Failure;
3472 }
3473 ForceCUDAHostDeviceDepth = Record[0];
3474 break;
3475
3476 case PACK_PRAGMA_OPTIONS: {
3477 if (Record.size() < 3) {
3478 Error("invalid pragma pack record");
3479 return Failure;
3480 }
3481 PragmaPackCurrentValue = Record[0];
3482 PragmaPackCurrentLocation = ReadSourceLocation(F, Record[1]);
3483 unsigned NumStackEntries = Record[2];
3484 unsigned Idx = 3;
3485 // Reset the stack when importing a new module.
3486 PragmaPackStack.clear();
3487 for (unsigned I = 0; I < NumStackEntries; ++I) {
3488 PragmaPackStackEntry Entry;
3489 Entry.Value = Record[Idx++];
3490 Entry.Location = ReadSourceLocation(F, Record[Idx++]);
3491 Entry.PushLocation = ReadSourceLocation(F, Record[Idx++]);
3492 PragmaPackStrings.push_back(ReadString(Record, Idx));
3493 Entry.SlotLabel = PragmaPackStrings.back();
3494 PragmaPackStack.push_back(Entry);
3495 }
3496 break;
3497 }
3498 }
3499 }
3500}
3501
3502void ASTReader::ReadModuleOffsetMap(ModuleFile &F) const {
3503 assert(!F.ModuleOffsetMap.empty() && "no module offset map to read")((!F.ModuleOffsetMap.empty() && "no module offset map to read"
) ? static_cast<void> (0) : __assert_fail ("!F.ModuleOffsetMap.empty() && \"no module offset map to read\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 3503, __PRETTY_FUNCTION__))
;
3504
3505 // Additional remapping information.
3506 const unsigned char *Data = (const unsigned char*)F.ModuleOffsetMap.data();
3507 const unsigned char *DataEnd = Data + F.ModuleOffsetMap.size();
3508 F.ModuleOffsetMap = StringRef();
3509
3510 // If we see this entry before SOURCE_LOCATION_OFFSETS, add placeholders.
3511 if (F.SLocRemap.find(0) == F.SLocRemap.end()) {
3512 F.SLocRemap.insert(std::make_pair(0U, 0));
3513 F.SLocRemap.insert(std::make_pair(2U, 1));
3514 }
3515
3516 // Continuous range maps we may be updating in our module.
3517 using RemapBuilder = ContinuousRangeMap<uint32_t, int, 2>::Builder;
3518 RemapBuilder SLocRemap(F.SLocRemap);
3519 RemapBuilder IdentifierRemap(F.IdentifierRemap);
3520 RemapBuilder MacroRemap(F.MacroRemap);
3521 RemapBuilder PreprocessedEntityRemap(F.PreprocessedEntityRemap);
3522 RemapBuilder SubmoduleRemap(F.SubmoduleRemap);
3523 RemapBuilder SelectorRemap(F.SelectorRemap);
3524 RemapBuilder DeclRemap(F.DeclRemap);
3525 RemapBuilder TypeRemap(F.TypeRemap);
3526
3527 while (Data < DataEnd) {
3528 // FIXME: Looking up dependency modules by filename is horrible. Let's
3529 // start fixing this with prebuilt and explicit modules and see how it
3530 // goes...
3531 using namespace llvm::support;
3532 ModuleKind Kind = static_cast<ModuleKind>(
3533 endian::readNext<uint8_t, little, unaligned>(Data));
3534 uint16_t Len = endian::readNext<uint16_t, little, unaligned>(Data);
3535 StringRef Name = StringRef((const char*)Data, Len);
3536 Data += Len;
3537 ModuleFile *OM = (Kind == MK_PrebuiltModule || Kind == MK_ExplicitModule
3538 ? ModuleMgr.lookupByModuleName(Name)
3539 : ModuleMgr.lookupByFileName(Name));
3540 if (!OM) {
3541 std::string Msg =
3542 "SourceLocation remap refers to unknown module, cannot find ";
3543 Msg.append(Name);
3544 Error(Msg);
3545 return;
3546 }
3547
3548 uint32_t SLocOffset =
3549 endian::readNext<uint32_t, little, unaligned>(Data);
3550 uint32_t IdentifierIDOffset =
3551 endian::readNext<uint32_t, little, unaligned>(Data);
3552 uint32_t MacroIDOffset =
3553 endian::readNext<uint32_t, little, unaligned>(Data);
3554 uint32_t PreprocessedEntityIDOffset =
3555 endian::readNext<uint32_t, little, unaligned>(Data);
3556 uint32_t SubmoduleIDOffset =
3557 endian::readNext<uint32_t, little, unaligned>(Data);
3558 uint32_t SelectorIDOffset =
3559 endian::readNext<uint32_t, little, unaligned>(Data);
3560 uint32_t DeclIDOffset =
3561 endian::readNext<uint32_t, little, unaligned>(Data);
3562 uint32_t TypeIndexOffset =
3563 endian::readNext<uint32_t, little, unaligned>(Data);
3564
3565 uint32_t None = std::numeric_limits<uint32_t>::max();
3566
3567 auto mapOffset = [&](uint32_t Offset, uint32_t BaseOffset,
3568 RemapBuilder &Remap) {
3569 if (Offset != None)
3570 Remap.insert(std::make_pair(Offset,
3571 static_cast<int>(BaseOffset - Offset)));
3572 };
3573 mapOffset(SLocOffset, OM->SLocEntryBaseOffset, SLocRemap);
3574 mapOffset(IdentifierIDOffset, OM->BaseIdentifierID, IdentifierRemap);
3575 mapOffset(MacroIDOffset, OM->BaseMacroID, MacroRemap);
3576 mapOffset(PreprocessedEntityIDOffset, OM->BasePreprocessedEntityID,
3577 PreprocessedEntityRemap);
3578 mapOffset(SubmoduleIDOffset, OM->BaseSubmoduleID, SubmoduleRemap);
3579 mapOffset(SelectorIDOffset, OM->BaseSelectorID, SelectorRemap);
3580 mapOffset(DeclIDOffset, OM->BaseDeclID, DeclRemap);
3581 mapOffset(TypeIndexOffset, OM->BaseTypeIndex, TypeRemap);
3582
3583 // Global -> local mappings.
3584 F.GlobalToLocalDeclIDs[OM] = DeclIDOffset;
3585 }
3586}
3587
3588ASTReader::ASTReadResult
3589ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F,
3590 const ModuleFile *ImportedBy,
3591 unsigned ClientLoadCapabilities) {
3592 unsigned Idx = 0;
3593 F.ModuleMapPath = ReadPath(F, Record, Idx);
3594
3595 // Try to resolve ModuleName in the current header search context and
3596 // verify that it is found in the same module map file as we saved. If the
3597 // top-level AST file is a main file, skip this check because there is no
3598 // usable header search context.
3599 assert(!F.ModuleName.empty() &&((!F.ModuleName.empty() && "MODULE_NAME should come before MODULE_MAP_FILE"
) ? static_cast<void> (0) : __assert_fail ("!F.ModuleName.empty() && \"MODULE_NAME should come before MODULE_MAP_FILE\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 3600, __PRETTY_FUNCTION__))
3600 "MODULE_NAME should come before MODULE_MAP_FILE")((!F.ModuleName.empty() && "MODULE_NAME should come before MODULE_MAP_FILE"
) ? static_cast<void> (0) : __assert_fail ("!F.ModuleName.empty() && \"MODULE_NAME should come before MODULE_MAP_FILE\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 3600, __PRETTY_FUNCTION__))
;
3601 if (F.Kind == MK_ImplicitModule && ModuleMgr.begin()->Kind != MK_MainFile) {
3602 // An implicitly-loaded module file should have its module listed in some
3603 // module map file that we've already loaded.
3604 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName);
3605 auto &Map = PP.getHeaderSearchInfo().getModuleMap();
3606 const FileEntry *ModMap = M ? Map.getModuleMapFileForUniquing(M) : nullptr;
3607 // Don't emit module relocation error if we have -fno-validate-pch
3608 if (!PP.getPreprocessorOpts().DisablePCHValidation && !ModMap) {
3609 assert(ImportedBy && "top-level import should be verified")((ImportedBy && "top-level import should be verified"
) ? static_cast<void> (0) : __assert_fail ("ImportedBy && \"top-level import should be verified\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 3609, __PRETTY_FUNCTION__))
;
3610 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) {
3611 if (auto *ASTFE = M ? M->getASTFile() : nullptr) {
3612 // This module was defined by an imported (explicit) module.
3613 Diag(diag::err_module_file_conflict) << F.ModuleName << F.FileName
3614 << ASTFE->getName();
3615 } else {
3616 // This module was built with a different module map.
3617 Diag(diag::err_imported_module_not_found)
3618 << F.ModuleName << F.FileName << ImportedBy->FileName
3619 << F.ModuleMapPath;
3620 // In case it was imported by a PCH, there's a chance the user is
3621 // just missing to include the search path to the directory containing
3622 // the modulemap.
3623 if (ImportedBy->Kind == MK_PCH)
3624 Diag(diag::note_imported_by_pch_module_not_found)
3625 << llvm::sys::path::parent_path(F.ModuleMapPath);
3626 }
3627 }
3628 return OutOfDate;
3629 }
3630
3631 assert(M->Name == F.ModuleName && "found module with different name")((M->Name == F.ModuleName && "found module with different name"
) ? static_cast<void> (0) : __assert_fail ("M->Name == F.ModuleName && \"found module with different name\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 3631, __PRETTY_FUNCTION__))
;
3632
3633 // Check the primary module map file.
3634 const FileEntry *StoredModMap = FileMgr.getFile(F.ModuleMapPath);
3635 if (StoredModMap == nullptr || StoredModMap != ModMap) {
3636 assert(ModMap && "found module is missing module map file")((ModMap && "found module is missing module map file"
) ? static_cast<void> (0) : __assert_fail ("ModMap && \"found module is missing module map file\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 3636, __PRETTY_FUNCTION__))
;
3637 assert(ImportedBy && "top-level import should be verified")((ImportedBy && "top-level import should be verified"
) ? static_cast<void> (0) : __assert_fail ("ImportedBy && \"top-level import should be verified\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 3637, __PRETTY_FUNCTION__))
;
3638 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3639 Diag(diag::err_imported_module_modmap_changed)
3640 << F.ModuleName << ImportedBy->FileName
3641 << ModMap->getName() << F.ModuleMapPath;
3642 return OutOfDate;
3643 }
3644
3645 llvm::SmallPtrSet<const FileEntry *, 1> AdditionalStoredMaps;
3646 for (unsigned I = 0, N = Record[Idx++]; I < N; ++I) {
3647 // FIXME: we should use input files rather than storing names.
3648 std::string Filename = ReadPath(F, Record, Idx);
3649 const FileEntry *F =
3650 FileMgr.getFile(Filename, false, false);
3651 if (F == nullptr) {
3652 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3653 Error("could not find file '" + Filename +"' referenced by AST file");
3654 return OutOfDate;
3655 }
3656 AdditionalStoredMaps.insert(F);
3657 }
3658
3659 // Check any additional module map files (e.g. module.private.modulemap)
3660 // that are not in the pcm.
3661 if (auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) {
3662 for (const FileEntry *ModMap : *AdditionalModuleMaps) {
3663 // Remove files that match
3664 // Note: SmallPtrSet::erase is really remove
3665 if (!AdditionalStoredMaps.erase(ModMap)) {
3666 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3667 Diag(diag::err_module_different_modmap)
3668 << F.ModuleName << /*new*/0 << ModMap->getName();
3669 return OutOfDate;
3670 }
3671 }
3672 }
3673
3674 // Check any additional module map files that are in the pcm, but not
3675 // found in header search. Cases that match are already removed.
3676 for (const FileEntry *ModMap : AdditionalStoredMaps) {
3677 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3678 Diag(diag::err_module_different_modmap)
3679 << F.ModuleName << /*not new*/1 << ModMap->getName();
3680 return OutOfDate;
3681 }
3682 }
3683
3684 if (Listener)
3685 Listener->ReadModuleMapFile(F.ModuleMapPath);
3686 return Success;
3687}
3688
3689/// Move the given method to the back of the global list of methods.
3690static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) {
3691 // Find the entry for this selector in the method pool.
3692 Sema::GlobalMethodPool::iterator Known
3693 = S.MethodPool.find(Method->getSelector());
3694 if (Known == S.MethodPool.end())
3695 return;
3696
3697 // Retrieve the appropriate method list.
3698 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
3699 : Known->second.second;
3700 bool Found = false;
3701 for (ObjCMethodList *List = &Start; List; List = List->getNext()) {
3702 if (!Found) {
3703 if (List->getMethod() == Method) {
3704 Found = true;
3705 } else {
3706 // Keep searching.
3707 continue;
3708 }
3709 }
3710
3711 if (List->getNext())
3712 List->setMethod(List->getNext()->getMethod());
3713 else
3714 List->setMethod(Method);
3715 }
3716}
3717
3718void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner) {
3719 assert(Owner->NameVisibility != Module::Hidden && "nothing to make visible?")((Owner->NameVisibility != Module::Hidden && "nothing to make visible?"
) ? static_cast<void> (0) : __assert_fail ("Owner->NameVisibility != Module::Hidden && \"nothing to make visible?\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 3719, __PRETTY_FUNCTION__))
;
3720 for (Decl *D : Names) {
3721 bool wasHidden = D->isHidden();
3722 D->setVisibleDespiteOwningModule();
3723
3724 if (wasHidden && SemaObj) {
3725 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) {
3726 moveMethodToBackOfGlobalList(*SemaObj, Method);
3727 }
3728 }
3729 }
3730}
3731
3732void ASTReader::makeModuleVisible(Module *Mod,
3733 Module::NameVisibilityKind NameVisibility,
3734 SourceLocation ImportLoc) {
3735 llvm::SmallPtrSet<Module *, 4> Visited;
3736 SmallVector<Module *, 4> Stack;
3737 Stack.push_back(Mod);
3738 while (!Stack.empty()) {
3739 Mod = Stack.pop_back_val();
3740
3741 if (NameVisibility <= Mod->NameVisibility) {
3742 // This module already has this level of visibility (or greater), so
3743 // there is nothing more to do.
3744 continue;
3745 }
3746
3747 if (!Mod->isAvailable()) {
3748 // Modules that aren't available cannot be made visible.
3749 continue;
3750 }
3751
3752 // Update the module's name visibility.
3753 Mod->NameVisibility = NameVisibility;
3754
3755 // If we've already deserialized any names from this module,
3756 // mark them as visible.
3757 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
3758 if (Hidden != HiddenNamesMap.end()) {
3759 auto HiddenNames = std::move(*Hidden);
3760 HiddenNamesMap.erase(Hidden);
3761 makeNamesVisible(HiddenNames.second, HiddenNames.first);
3762 assert(HiddenNamesMap.find(Mod) == HiddenNamesMap.end() &&((HiddenNamesMap.find(Mod) == HiddenNamesMap.end() &&
"making names visible added hidden names") ? static_cast<
void> (0) : __assert_fail ("HiddenNamesMap.find(Mod) == HiddenNamesMap.end() && \"making names visible added hidden names\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 3763, __PRETTY_FUNCTION__))
3763 "making names visible added hidden names")((HiddenNamesMap.find(Mod) == HiddenNamesMap.end() &&
"making names visible added hidden names") ? static_cast<
void> (0) : __assert_fail ("HiddenNamesMap.find(Mod) == HiddenNamesMap.end() && \"making names visible added hidden names\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 3763, __PRETTY_FUNCTION__))
;
3764 }
3765
3766 // Push any exported modules onto the stack to be marked as visible.
3767 SmallVector<Module *, 16> Exports;
3768 Mod->getExportedModules(Exports);
3769 for (SmallVectorImpl<Module *>::iterator
3770 I = Exports.begin(), E = Exports.end(); I != E; ++I) {
3771 Module *Exported = *I;
3772 if (Visited.insert(Exported).second)
3773 Stack.push_back(Exported);
3774 }
3775 }
3776}
3777
3778/// We've merged the definition \p MergedDef into the existing definition
3779/// \p Def. Ensure that \p Def is made visible whenever \p MergedDef is made
3780/// visible.
3781void ASTReader::mergeDefinitionVisibility(NamedDecl *Def,
3782 NamedDecl *MergedDef) {
3783 if (Def->isHidden()) {
3784 // If MergedDef is visible or becomes visible, make the definition visible.
3785 if (!MergedDef->isHidden())
3786 Def->setVisibleDespiteOwningModule();
3787 else {
3788 getContext().mergeDefinitionIntoModule(
3789 Def, MergedDef->getImportedOwningModule(),
3790 /*NotifyListeners*/ false);
3791 PendingMergedDefinitionsToDeduplicate.insert(Def);
3792 }
3793 }
3794}
3795
3796bool ASTReader::loadGlobalIndex() {
3797 if (GlobalIndex)
3798 return false;
3799
3800 if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
3801 !PP.getLangOpts().Modules)
3802 return true;
3803
3804 // Try to load the global index.
3805 TriedLoadingGlobalIndex = true;
3806 StringRef ModuleCachePath
3807 = getPreprocessor().getHeaderSearchInfo().getModuleCachePath();
3808 std::pair<GlobalModuleIndex *, GlobalModuleIndex::ErrorCode> Result
3809 = GlobalModuleIndex::readIndex(ModuleCachePath);
3810 if (!Result.first)
3811 return true;
3812
3813 GlobalIndex.reset(Result.first);
3814 ModuleMgr.setGlobalIndex(GlobalIndex.get());
3815 return false;
3816}
3817
3818bool ASTReader::isGlobalIndexUnavailable() const {
3819 return PP.getLangOpts().Modules && UseGlobalIndex &&
3820 !hasGlobalIndex() && TriedLoadingGlobalIndex;
3821}
3822
3823static void updateModuleTimestamp(ModuleFile &MF) {
3824 // Overwrite the timestamp file contents so that file's mtime changes.
3825 std::string TimestampFilename = MF.getTimestampFilename();
3826 std::error_code EC;
3827 llvm::raw_fd_ostream OS(TimestampFilename, EC, llvm::sys::fs::F_Text);
3828 if (EC)
3829 return;
3830 OS << "Timestamp file\n";
3831 OS.close();
3832 OS.clear_error(); // Avoid triggering a fatal error.
3833}
3834
3835/// Given a cursor at the start of an AST file, scan ahead and drop the
3836/// cursor into the start of the given block ID, returning false on success and
3837/// true on failure.
3838static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) {
3839 while (true) {
3840 llvm::BitstreamEntry Entry = Cursor.advance();
3841 switch (Entry.Kind) {
3842 case llvm::BitstreamEntry::Error:
3843 case llvm::BitstreamEntry::EndBlock:
3844 return true;
3845
3846 case llvm::BitstreamEntry::Record:
3847 // Ignore top-level records.
3848 Cursor.skipRecord(Entry.ID);
3849 break;
3850
3851 case llvm::BitstreamEntry::SubBlock:
3852 if (Entry.ID == BlockID) {
3853 if (Cursor.EnterSubBlock(BlockID))
3854 return true;
3855 // Found it!
3856 return false;
3857 }
3858
3859 if (Cursor.SkipBlock())
3860 return true;
3861 }
3862 }
3863}
3864
3865ASTReader::ASTReadResult ASTReader::ReadAST(StringRef FileName,
3866 ModuleKind Type,
3867 SourceLocation ImportLoc,
3868 unsigned ClientLoadCapabilities,
3869 SmallVectorImpl<ImportedSubmodule> *Imported) {
3870 llvm::SaveAndRestore<SourceLocation>
3871 SetCurImportLocRAII(CurrentImportLoc, ImportLoc);
3872
3873 // Defer any pending actions until we get to the end of reading the AST file.
3874 Deserializing AnASTFile(this);
3875
3876 // Bump the generation number.
3877 unsigned PreviousGeneration = 0;
3878 if (ContextObj)
3879 PreviousGeneration = incrementGeneration(*ContextObj);
3880
3881 unsigned NumModules = ModuleMgr.size();
3882 SmallVector<ImportedModule, 4> Loaded;
3883 switch (ASTReadResult ReadResult =
3884 ReadASTCore(FileName, Type, ImportLoc,
3885 /*ImportedBy=*/nullptr, Loaded, 0, 0,
3886 ASTFileSignature(), ClientLoadCapabilities)) {
3887 case Failure:
3888 case Missing:
3889 case OutOfDate:
3890 case VersionMismatch:
3891 case ConfigurationMismatch:
3892 case HadErrors: {
3893 llvm::SmallPtrSet<ModuleFile *, 4> LoadedSet;
3894 for (const ImportedModule &IM : Loaded)
3895 LoadedSet.insert(IM.Mod);
3896
3897 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, LoadedSet,
3898 PP.getLangOpts().Modules
3899 ? &PP.getHeaderSearchInfo().getModuleMap()
3900 : nullptr);
3901
3902 // If we find that any modules are unusable, the global index is going
3903 // to be out-of-date. Just remove it.
3904 GlobalIndex.reset();
3905 ModuleMgr.setGlobalIndex(nullptr);
3906 return ReadResult;
3907 }
3908 case Success:
3909 break;
3910 }
3911
3912 // Here comes stuff that we only do once the entire chain is loaded.
3913
3914 // Load the AST blocks of all of the modules that we loaded.
3915 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
3916 MEnd = Loaded.end();
3917 M != MEnd; ++M) {
3918 ModuleFile &F = *M->Mod;
3919
3920 // Read the AST block.
3921 if (ASTReadResult Result = ReadASTBlock(F, ClientLoadCapabilities))
3922 return Result;
3923
3924 // Read the extension blocks.
3925 while (!SkipCursorToBlock(F.Stream, EXTENSION_BLOCK_ID)) {
3926 if (ASTReadResult Result = ReadExtensionBlock(F))
3927 return Result;
3928 }
3929
3930 // Once read, set the ModuleFile bit base offset and update the size in
3931 // bits of all files we've seen.
3932 F.GlobalBitOffset = TotalModulesSizeInBits;
3933 TotalModulesSizeInBits += F.SizeInBits;
3934 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F));
3935
3936 // Preload SLocEntries.
3937 for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) {
3938 int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID;
3939 // Load it through the SourceManager and don't call ReadSLocEntry()
3940 // directly because the entry may have already been loaded in which case
3941 // calling ReadSLocEntry() directly would trigger an assertion in
3942 // SourceManager.
3943 SourceMgr.getLoadedSLocEntryByID(Index);
3944 }
3945
3946 // Map the original source file ID into the ID space of the current
3947 // compilation.
3948 if (F.OriginalSourceFileID.isValid()) {
3949 F.OriginalSourceFileID = FileID::get(
3950 F.SLocEntryBaseID + F.OriginalSourceFileID.getOpaqueValue() - 1);
3951 }
3952
3953 // Preload all the pending interesting identifiers by marking them out of
3954 // date.
3955 for (auto Offset : F.PreloadIdentifierOffsets) {
3956 const unsigned char *Data = reinterpret_cast<const unsigned char *>(
3957 F.IdentifierTableData + Offset);
3958
3959 ASTIdentifierLookupTrait Trait(*this, F);
3960 auto KeyDataLen = Trait.ReadKeyDataLength(Data);
3961 auto Key = Trait.ReadKey(Data, KeyDataLen.first);
3962 auto &II = PP.getIdentifierTable().getOwn(Key);
3963 II.setOutOfDate(true);
3964
3965 // Mark this identifier as being from an AST file so that we can track
3966 // whether we need to serialize it.
3967 markIdentifierFromAST(*this, II);
3968
3969 // Associate the ID with the identifier so that the writer can reuse it.
3970 auto ID = Trait.ReadIdentifierID(Data + KeyDataLen.first);
3971 SetIdentifierInfo(ID, &II);
3972 }
3973 }
3974
3975 // Setup the import locations and notify the module manager that we've
3976 // committed to these module files.
3977 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
3978 MEnd = Loaded.end();
3979 M != MEnd; ++M) {
3980 ModuleFile &F = *M->Mod;
3981
3982 ModuleMgr.moduleFileAccepted(&F);
3983
3984 // Set the import location.
3985 F.DirectImportLoc = ImportLoc;
3986 // FIXME: We assume that locations from PCH / preamble do not need
3987 // any translation.
3988 if (!M->ImportedBy)
3989 F.ImportLoc = M->ImportLoc;
3990 else
3991 F.ImportLoc = TranslateSourceLocation(*M->ImportedBy, M->ImportLoc);
3992 }
3993
3994 if (!PP.getLangOpts().CPlusPlus ||
3995 (Type != MK_ImplicitModule && Type != MK_ExplicitModule &&
3996 Type != MK_PrebuiltModule)) {
3997 // Mark all of the identifiers in the identifier table as being out of date,
3998 // so that various accessors know to check the loaded modules when the
3999 // identifier is used.
4000 //
4001 // For C++ modules, we don't need information on many identifiers (just
4002 // those that provide macros or are poisoned), so we mark all of
4003 // the interesting ones via PreloadIdentifierOffsets.
4004 for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(),
4005 IdEnd = PP.getIdentifierTable().end();
4006 Id != IdEnd; ++Id)
4007 Id->second->setOutOfDate(true);
4008 }
4009 // Mark selectors as out of date.
4010 for (auto Sel : SelectorGeneration)
4011 SelectorOutOfDate[Sel.first] = true;
4012
4013 // Resolve any unresolved module exports.
4014 for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) {
4015 UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I];
4016 SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID);
4017 Module *ResolvedMod = getSubmodule(GlobalID);
4018
4019 switch (Unresolved.Kind) {
4020 case UnresolvedModuleRef::Conflict:
4021 if (ResolvedMod) {
4022 Module::Conflict Conflict;
4023 Conflict.Other = ResolvedMod;
4024 Conflict.Message = Unresolved.String.str();
4025 Unresolved.Mod->Conflicts.push_back(Conflict);
4026 }
4027 continue;
4028
4029 case UnresolvedModuleRef::Import:
4030 if (ResolvedMod)
4031 Unresolved.Mod->Imports.insert(ResolvedMod);
4032 continue;
4033
4034 case UnresolvedModuleRef::Export:
4035 if (ResolvedMod || Unresolved.IsWildcard)
4036 Unresolved.Mod->Exports.push_back(
4037 Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard));
4038 continue;
4039 }
4040 }
4041 UnresolvedModuleRefs.clear();
4042
4043 if (Imported)
4044 Imported->append(ImportedModules.begin(),
4045 ImportedModules.end());
4046
4047 // FIXME: How do we load the 'use'd modules? They may not be submodules.
4048 // Might be unnecessary as use declarations are only used to build the
4049 // module itself.
4050
4051 if (ContextObj)
4052 InitializeContext();
4053
4054 if (SemaObj)
4055 UpdateSema();
4056
4057 if (DeserializationListener)
4058 DeserializationListener->ReaderInitialized(this);
4059
4060 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
4061 if (PrimaryModule.OriginalSourceFileID.isValid()) {
4062 // If this AST file is a precompiled preamble, then set the
4063 // preamble file ID of the source manager to the file source file
4064 // from which the preamble was built.
4065 if (Type == MK_Preamble) {
4066 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID);
4067 } else if (Type == MK_MainFile) {
4068 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID);
4069 }
4070 }
4071
4072 // For any Objective-C class definitions we have already loaded, make sure
4073 // that we load any additional categories.
4074 if (ContextObj) {
4075 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
4076 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
4077 ObjCClassesLoaded[I],
4078 PreviousGeneration);
4079 }
4080 }
4081
4082 if (PP.getHeaderSearchInfo()
4083 .getHeaderSearchOpts()
4084 .ModulesValidateOncePerBuildSession) {
4085 // Now we are certain that the module and all modules it depends on are
4086 // up to date. Create or update timestamp files for modules that are
4087 // located in the module cache (not for PCH files that could be anywhere
4088 // in the filesystem).
4089 for (unsigned I = 0, N = Loaded.size(); I != N; ++I) {
4090 ImportedModule &M = Loaded[I];
4091 if (M.Mod->Kind == MK_ImplicitModule) {
4092 updateModuleTimestamp(*M.Mod);
4093 }
4094 }
4095 }
4096
4097 return Success;
4098}
4099
4100static ASTFileSignature readASTFileSignature(StringRef PCH);
4101
4102/// Whether \p Stream starts with the AST/PCH file magic number 'CPCH'.
4103static bool startsWithASTFileMagic(BitstreamCursor &Stream) {
4104 return Stream.canSkipToPos(4) &&
4105 Stream.Read(8) == 'C' &&
4106 Stream.Read(8) == 'P' &&
4107 Stream.Read(8) == 'C' &&
4108 Stream.Read(8) == 'H';
4109}
4110
4111static unsigned moduleKindForDiagnostic(ModuleKind Kind) {
4112 switch (Kind) {
4113 case MK_PCH:
4114 return 0; // PCH
4115 case MK_ImplicitModule:
4116 case MK_ExplicitModule:
4117 case MK_PrebuiltModule:
4118 return 1; // module
4119 case MK_MainFile:
4120 case MK_Preamble:
4121 return 2; // main source file
4122 }
4123 llvm_unreachable("unknown module kind")::llvm::llvm_unreachable_internal("unknown module kind", "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 4123)
;
4124}
4125
4126ASTReader::ASTReadResult
4127ASTReader::ReadASTCore(StringRef FileName,
4128 ModuleKind Type,
4129 SourceLocation ImportLoc,
4130 ModuleFile *ImportedBy,
4131 SmallVectorImpl<ImportedModule> &Loaded,
4132 off_t ExpectedSize, time_t ExpectedModTime,
4133 ASTFileSignature ExpectedSignature,
4134 unsigned ClientLoadCapabilities) {
4135 ModuleFile *M;
4136 std::string ErrorStr;
4137 ModuleManager::AddModuleResult AddResult
4138 = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy,
4139 getGeneration(), ExpectedSize, ExpectedModTime,
4140 ExpectedSignature, readASTFileSignature,
4141 M, ErrorStr);
4142
4143 switch (AddResult) {
4144 case ModuleManager::AlreadyLoaded:
4145 return Success;
4146
4147 case ModuleManager::NewlyLoaded:
4148 // Load module file below.
4149 break;
4150
4151 case ModuleManager::Missing:
4152 // The module file was missing; if the client can handle that, return
4153 // it.
4154 if (ClientLoadCapabilities & ARR_Missing)
4155 return Missing;
4156
4157 // Otherwise, return an error.
4158 Diag(diag::err_module_file_not_found) << moduleKindForDiagnostic(Type)
4159 << FileName << !ErrorStr.empty()
4160 << ErrorStr;
4161 return Failure;
4162
4163 case ModuleManager::OutOfDate:
4164 // We couldn't load the module file because it is out-of-date. If the
4165 // client can handle out-of-date, return it.
4166 if (ClientLoadCapabilities & ARR_OutOfDate)
4167 return OutOfDate;
4168
4169 // Otherwise, return an error.
4170 Diag(diag::err_module_file_out_of_date) << moduleKindForDiagnostic(Type)
4171 << FileName << !ErrorStr.empty()
4172 << ErrorStr;
4173 return Failure;
4174 }
4175
4176 assert(M && "Missing module file")((M && "Missing module file") ? static_cast<void>
(0) : __assert_fail ("M && \"Missing module file\"",
"/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 4176, __PRETTY_FUNCTION__))
;
4177
4178 ModuleFile &F = *M;
4179 BitstreamCursor &Stream = F.Stream;
4180 Stream = BitstreamCursor(PCHContainerRdr.ExtractPCH(*F.Buffer));
4181 F.SizeInBits = F.Buffer->getBufferSize() * 8;
4182
4183 // Sniff for the signature.
4184 if (!startsWithASTFileMagic(Stream)) {
4185 Diag(diag::err_module_file_invalid) << moduleKindForDiagnostic(Type)
4186 << FileName;
4187 return Failure;
4188 }
4189
4190 // This is used for compatibility with older PCH formats.
4191 bool HaveReadControlBlock = false;
4192 while (true) {
4193 llvm::BitstreamEntry Entry = Stream.advance();
4194
4195 switch (Entry.Kind) {
4196 case llvm::BitstreamEntry::Error:
4197 case llvm::BitstreamEntry::Record:
4198 case llvm::BitstreamEntry::EndBlock:
4199 Error("invalid record at top-level of AST file");
4200 return Failure;
4201
4202 case llvm::BitstreamEntry::SubBlock:
4203 break;
4204 }
4205
4206 switch (Entry.ID) {
4207 case CONTROL_BLOCK_ID:
4208 HaveReadControlBlock = true;
4209 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
4210 case Success:
4211 // Check that we didn't try to load a non-module AST file as a module.
4212 //
4213 // FIXME: Should we also perform the converse check? Loading a module as
4214 // a PCH file sort of works, but it's a bit wonky.
4215 if ((Type == MK_ImplicitModule || Type == MK_ExplicitModule ||
4216 Type == MK_PrebuiltModule) &&
4217 F.ModuleName.empty()) {
4218 auto Result = (Type == MK_ImplicitModule) ? OutOfDate : Failure;
4219 if (Result != OutOfDate ||
4220 (ClientLoadCapabilities & ARR_OutOfDate) == 0)
4221 Diag(diag::err_module_file_not_module) << FileName;
4222 return Result;
4223 }
4224 break;
4225
4226 case Failure: return Failure;
4227 case Missing: return Missing;
4228 case OutOfDate: return OutOfDate;
4229 case VersionMismatch: return VersionMismatch;
4230 case ConfigurationMismatch: return ConfigurationMismatch;
4231 case HadErrors: return HadErrors;
4232 }
4233 break;
4234
4235 case AST_BLOCK_ID:
4236 if (!HaveReadControlBlock) {
4237 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
4238 Diag(diag::err_pch_version_too_old);
4239 return VersionMismatch;
4240 }
4241
4242 // Record that we've loaded this module.
4243 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc));
4244 return Success;
4245
4246 case UNHASHED_CONTROL_BLOCK_ID:
4247 // This block is handled using look-ahead during ReadControlBlock. We
4248 // shouldn't get here!
4249 Error("malformed block record in AST file");
4250 return Failure;
4251
4252 default:
4253 if (Stream.SkipBlock()) {
4254 Error("malformed block record in AST file");
4255 return Failure;
4256 }
4257 break;
4258 }
4259 }
4260
4261 return Success;
4262}
4263
4264ASTReader::ASTReadResult
4265ASTReader::readUnhashedControlBlock(ModuleFile &F, bool WasImportedBy,
4266 unsigned ClientLoadCapabilities) {
4267 const HeaderSearchOptions &HSOpts =
4268 PP.getHeaderSearchInfo().getHeaderSearchOpts();
4269 bool AllowCompatibleConfigurationMismatch =
4270 F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule;
4271
4272 ASTReadResult Result = readUnhashedControlBlockImpl(
4273 &F, F.Data, ClientLoadCapabilities, AllowCompatibleConfigurationMismatch,
4274 Listener.get(),
4275 WasImportedBy ? false : HSOpts.ModulesValidateDiagnosticOptions);
4276
4277 // If F was directly imported by another module, it's implicitly validated by
4278 // the importing module.
4279 if (DisableValidation || WasImportedBy ||
4280 (AllowConfigurationMismatch && Result == ConfigurationMismatch))
4281 return Success;
4282
4283 if (Result == Failure) {
4284 Error("malformed block record in AST file");
4285 return Failure;
4286 }
4287
4288 if (Result == OutOfDate && F.Kind == MK_ImplicitModule) {
4289 // If this module has already been finalized in the PCMCache, we're stuck
4290 // with it; we can only load a single version of each module.
4291 //
4292 // This can happen when a module is imported in two contexts: in one, as a
4293 // user module; in another, as a system module (due to an import from
4294 // another module marked with the [system] flag). It usually indicates a
4295 // bug in the module map: this module should also be marked with [system].
4296 //
4297 // If -Wno-system-headers (the default), and the first import is as a
4298 // system module, then validation will fail during the as-user import,
4299 // since -Werror flags won't have been validated. However, it's reasonable
4300 // to treat this consistently as a system module.
4301 //
4302 // If -Wsystem-headers, the PCM on disk was built with
4303 // -Wno-system-headers, and the first import is as a user module, then
4304 // validation will fail during the as-system import since the PCM on disk
4305 // doesn't guarantee that -Werror was respected. However, the -Werror
4306 // flags were checked during the initial as-user import.
4307 if (PCMCache.isBufferFinal(F.FileName)) {
4308 Diag(diag::warn_module_system_bit_conflict) << F.FileName;
4309 return Success;
4310 }
4311 }
4312
4313 return Result;
4314}
4315
4316ASTReader::ASTReadResult ASTReader::readUnhashedControlBlockImpl(
4317 ModuleFile *F, llvm::StringRef StreamData, unsigned ClientLoadCapabilities,
4318 bool AllowCompatibleConfigurationMismatch, ASTReaderListener *Listener,
4319 bool ValidateDiagnosticOptions) {
4320 // Initialize a stream.
4321 BitstreamCursor Stream(StreamData);
4322
4323 // Sniff for the signature.
4324 if (!startsWithASTFileMagic(Stream))
4325 return Failure;
4326
4327 // Scan for the UNHASHED_CONTROL_BLOCK_ID block.
4328 if (SkipCursorToBlock(Stream, UNHASHED_CONTROL_BLOCK_ID))
4329 return Failure;
4330
4331 // Read all of the records in the options block.
4332 RecordData Record;
4333 ASTReadResult Result = Success;
4334 while (true) {
4335 llvm::BitstreamEntry Entry = Stream.advance();
4336
4337 switch (Entry.Kind) {
4338 case llvm::BitstreamEntry::Error:
4339 case llvm::BitstreamEntry::SubBlock:
4340 return Failure;
4341
4342 case llvm::BitstreamEntry::EndBlock:
4343 return Result;
4344
4345 case llvm::BitstreamEntry::Record:
4346 // The interesting case.
4347 break;
4348 }
4349
4350 // Read and process a record.
4351 Record.clear();
4352 switch (
4353 (UnhashedControlBlockRecordTypes)Stream.readRecord(Entry.ID, Record)) {
4354 case SIGNATURE:
4355 if (F)
4356 std::copy(Record.begin(), Record.end(), F->Signature.data());
4357 break;
4358 case DIAGNOSTIC_OPTIONS: {
4359 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
4360 if (Listener && ValidateDiagnosticOptions &&
4361 !AllowCompatibleConfigurationMismatch &&
4362 ParseDiagnosticOptions(Record, Complain, *Listener))
4363 Result = OutOfDate; // Don't return early. Read the signature.
4364 break;
4365 }
4366 case DIAG_PRAGMA_MAPPINGS:
4367 if (!F)
4368 break;
4369 if (F->PragmaDiagMappings.empty())
4370 F->PragmaDiagMappings.swap(Record);
4371 else
4372 F->PragmaDiagMappings.insert(F->PragmaDiagMappings.end(),
4373 Record.begin(), Record.end());
4374 break;
4375 }
4376 }
4377}
4378
4379/// Parse a record and blob containing module file extension metadata.
4380static bool parseModuleFileExtensionMetadata(
4381 const SmallVectorImpl<uint64_t> &Record,
4382 StringRef Blob,
4383 ModuleFileExtensionMetadata &Metadata) {
4384 if (Record.size() < 4) return true;
4385
4386 Metadata.MajorVersion = Record[0];
4387 Metadata.MinorVersion = Record[1];
4388
4389 unsigned BlockNameLen = Record[2];
4390 unsigned UserInfoLen = Record[3];
4391
4392 if (BlockNameLen + UserInfoLen > Blob.size()) return true;
4393
4394 Metadata.BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen);
4395 Metadata.UserInfo = std::string(Blob.data() + BlockNameLen,
4396 Blob.data() + BlockNameLen + UserInfoLen);
4397 return false;
4398}
4399
4400ASTReader::ASTReadResult ASTReader::ReadExtensionBlock(ModuleFile &F) {
4401 BitstreamCursor &Stream = F.Stream;
4402
4403 RecordData Record;
4404 while (true) {
4405 llvm::BitstreamEntry Entry = Stream.advance();
4406 switch (Entry.Kind) {
4407 case llvm::BitstreamEntry::SubBlock:
4408 if (Stream.SkipBlock())
4409 return Failure;
4410
4411 continue;
4412
4413 case llvm::BitstreamEntry::EndBlock:
4414 return Success;
4415
4416 case llvm::BitstreamEntry::Error:
4417 return HadErrors;
4418
4419 case llvm::BitstreamEntry::Record:
4420 break;
4421 }
4422
4423 Record.clear();
4424 StringRef Blob;
4425 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob);
4426 switch (RecCode) {
4427 case EXTENSION_METADATA: {
4428 ModuleFileExtensionMetadata Metadata;
4429 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata))
4430 return Failure;
4431
4432 // Find a module file extension with this block name.
4433 auto Known = ModuleFileExtensions.find(Metadata.BlockName);
4434 if (Known == ModuleFileExtensions.end()) break;
4435
4436 // Form a reader.
4437 if (auto Reader = Known->second->createExtensionReader(Metadata, *this,
4438 F, Stream)) {
4439 F.ExtensionReaders.push_back(std::move(Reader));
4440 }
4441
4442 break;
4443 }
4444 }
4445 }
4446
4447 return Success;
4448}
4449
4450void ASTReader::InitializeContext() {
4451 assert(ContextObj && "no context to initialize")((ContextObj && "no context to initialize") ? static_cast
<void> (0) : __assert_fail ("ContextObj && \"no context to initialize\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 4451, __PRETTY_FUNCTION__))
;
4452 ASTContext &Context = *ContextObj;
4453
4454 // If there's a listener, notify them that we "read" the translation unit.
4455 if (DeserializationListener)
4456 DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID,
4457 Context.getTranslationUnitDecl());
4458
4459 // FIXME: Find a better way to deal with collisions between these
4460 // built-in types. Right now, we just ignore the problem.
4461
4462 // Load the special types.
4463 if (SpecialTypes.size() >= NumSpecialTypeIDs) {
4464 if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) {
4465 if (!Context.CFConstantStringTypeDecl)
4466 Context.setCFConstantStringType(GetType(String));
4467 }
4468
4469 if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) {
4470 QualType FileType = GetType(File);
4471 if (FileType.isNull()) {
4472 Error("FILE type is NULL");
4473 return;
4474 }
4475
4476 if (!Context.FILEDecl) {
4477 if (const TypedefType *Typedef = FileType->getAs<TypedefType>())
4478 Context.setFILEDecl(Typedef->getDecl());
4479 else {
4480 const TagType *Tag = FileType->getAs<TagType>();
4481 if (!Tag) {
4482 Error("Invalid FILE type in AST file");
4483 return;
4484 }
4485 Context.setFILEDecl(Tag->getDecl());
4486 }
4487 }
4488 }
4489
4490 if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) {
4491 QualType Jmp_bufType = GetType(Jmp_buf);
4492 if (Jmp_bufType.isNull()) {
4493 Error("jmp_buf type is NULL");
4494 return;
4495 }
4496
4497 if (!Context.jmp_bufDecl) {
4498 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>())
4499 Context.setjmp_bufDecl(Typedef->getDecl());
4500 else {
4501 const TagType *Tag = Jmp_bufType->getAs<TagType>();
4502 if (!Tag) {
4503 Error("Invalid jmp_buf type in AST file");
4504 return;
4505 }
4506 Context.setjmp_bufDecl(Tag->getDecl());
4507 }
4508 }
4509 }
4510
4511 if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) {
4512 QualType Sigjmp_bufType = GetType(Sigjmp_buf);
4513 if (Sigjmp_bufType.isNull()) {
4514 Error("sigjmp_buf type is NULL");
4515 return;
4516 }
4517
4518 if (!Context.sigjmp_bufDecl) {
4519 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>())
4520 Context.setsigjmp_bufDecl(Typedef->getDecl());
4521 else {
4522 const TagType *Tag = Sigjmp_bufType->getAs<TagType>();
4523 assert(Tag && "Invalid sigjmp_buf type in AST file")((Tag && "Invalid sigjmp_buf type in AST file") ? static_cast
<void> (0) : __assert_fail ("Tag && \"Invalid sigjmp_buf type in AST file\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 4523, __PRETTY_FUNCTION__))
;
4524 Context.setsigjmp_bufDecl(Tag->getDecl());
4525 }
4526 }
4527 }
4528
4529 if (unsigned ObjCIdRedef
4530 = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) {
4531 if (Context.ObjCIdRedefinitionType.isNull())
4532 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef);
4533 }
4534
4535 if (unsigned ObjCClassRedef
4536 = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) {
4537 if (Context.ObjCClassRedefinitionType.isNull())
4538 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef);
4539 }
4540
4541 if (unsigned ObjCSelRedef
4542 = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) {
4543 if (Context.ObjCSelRedefinitionType.isNull())
4544 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef);
4545 }
4546
4547 if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) {
4548 QualType Ucontext_tType = GetType(Ucontext_t);
4549 if (Ucontext_tType.isNull()) {
4550 Error("ucontext_t type is NULL");
4551 return;
4552 }
4553
4554 if (!Context.ucontext_tDecl) {
4555 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>())
4556 Context.setucontext_tDecl(Typedef->getDecl());
4557 else {
4558 const TagType *Tag = Ucontext_tType->getAs<TagType>();
4559 assert(Tag && "Invalid ucontext_t type in AST file")((Tag && "Invalid ucontext_t type in AST file") ? static_cast
<void> (0) : __assert_fail ("Tag && \"Invalid ucontext_t type in AST file\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 4559, __PRETTY_FUNCTION__))
;
4560 Context.setucontext_tDecl(Tag->getDecl());
4561 }
4562 }
4563 }
4564 }
4565
4566 ReadPragmaDiagnosticMappings(Context.getDiagnostics());
4567
4568 // If there were any CUDA special declarations, deserialize them.
4569 if (!CUDASpecialDeclRefs.empty()) {
4570 assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!")((CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!"
) ? static_cast<void> (0) : __assert_fail ("CUDASpecialDeclRefs.size() == 1 && \"More decl refs than expected!\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 4570, __PRETTY_FUNCTION__))
;
4571 Context.setcudaConfigureCallDecl(
4572 cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0])));
4573 }
4574
4575 // Re-export any modules that were imported by a non-module AST file.
4576 // FIXME: This does not make macro-only imports visible again.
4577 for (auto &Import : ImportedModules) {
4578 if (Module *Imported = getSubmodule(Import.ID)) {
4579 makeModuleVisible(Imported, Module::AllVisible,
4580 /*ImportLoc=*/Import.ImportLoc);
4581 if (Import.ImportLoc.isValid())
4582 PP.makeModuleVisible(Imported, Import.ImportLoc);
4583 // FIXME: should we tell Sema to make the module visible too?
4584 }
4585 }
4586 ImportedModules.clear();
4587}
4588
4589void ASTReader::finalizeForWriting() {
4590 // Nothing to do for now.
4591}
4592
4593/// Reads and return the signature record from \p PCH's control block, or
4594/// else returns 0.
4595static ASTFileSignature readASTFileSignature(StringRef PCH) {
4596 BitstreamCursor Stream(PCH);
4597 if (!startsWithASTFileMagic(Stream))
4598 return ASTFileSignature();
4599
4600 // Scan for the UNHASHED_CONTROL_BLOCK_ID block.
4601 if (SkipCursorToBlock(Stream, UNHASHED_CONTROL_BLOCK_ID))
4602 return ASTFileSignature();
4603
4604 // Scan for SIGNATURE inside the diagnostic options block.
4605 ASTReader::RecordData Record;
4606 while (true) {
4607 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
4608 if (Entry.Kind != llvm::BitstreamEntry::Record)
4609 return ASTFileSignature();
4610
4611 Record.clear();
4612 StringRef Blob;
4613 if (SIGNATURE == Stream.readRecord(Entry.ID, Record, &Blob))
4614 return {{{(uint32_t)Record[0], (uint32_t)Record[1], (uint32_t)Record[2],
4615 (uint32_t)Record[3], (uint32_t)Record[4]}}};
4616 }
4617}
4618
4619/// Retrieve the name of the original source file name
4620/// directly from the AST file, without actually loading the AST
4621/// file.
4622std::string ASTReader::getOriginalSourceFile(
4623 const std::string &ASTFileName, FileManager &FileMgr,
4624 const PCHContainerReader &PCHContainerRdr, DiagnosticsEngine &Diags) {
4625 // Open the AST file.
4626 auto Buffer = FileMgr.getBufferForFile(ASTFileName);
4627 if (!Buffer) {
4628 Diags.Report(diag::err_fe_unable_to_read_pch_file)
4629 << ASTFileName << Buffer.getError().message();
4630 return std::string();
4631 }
4632
4633 // Initialize the stream
4634 BitstreamCursor Stream(PCHContainerRdr.ExtractPCH(**Buffer));
4635
4636 // Sniff for the signature.
4637 if (!startsWithASTFileMagic(Stream)) {
4638 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName;
4639 return std::string();
4640 }
4641
4642 // Scan for the CONTROL_BLOCK_ID block.
4643 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) {
4644 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
4645 return std::string();
4646 }
4647
4648 // Scan for ORIGINAL_FILE inside the control block.
4649 RecordData Record;
4650 while (true) {
4651 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
4652 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
4653 return std::string();
4654
4655 if (Entry.Kind != llvm::BitstreamEntry::Record) {
4656 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
4657 return std::string();
4658 }
4659
4660 Record.clear();
4661 StringRef Blob;
4662 if (Stream.readRecord(Entry.ID, Record, &Blob) == ORIGINAL_FILE)
4663 return Blob.str();
4664 }
4665}
4666
4667namespace {
4668
4669 class SimplePCHValidator : public ASTReaderListener {
4670 const LangOptions &ExistingLangOpts;
4671 const TargetOptions &ExistingTargetOpts;
4672 const PreprocessorOptions &ExistingPPOpts;
4673 std::string ExistingModuleCachePath;
4674 FileManager &FileMgr;
4675
4676 public:
4677 SimplePCHValidator(const LangOptions &ExistingLangOpts,
4678 const TargetOptions &ExistingTargetOpts,
4679 const PreprocessorOptions &ExistingPPOpts,
4680 StringRef ExistingModuleCachePath,
4681 FileManager &FileMgr)
4682 : ExistingLangOpts(ExistingLangOpts),
4683 ExistingTargetOpts(ExistingTargetOpts),
4684 ExistingPPOpts(ExistingPPOpts),
4685 ExistingModuleCachePath(ExistingModuleCachePath),
4686 FileMgr(FileMgr) {}
4687
4688 bool ReadLanguageOptions(const LangOptions &LangOpts, bool Complain,
4689 bool AllowCompatibleDifferences) override {
4690 return checkLanguageOptions(ExistingLangOpts, LangOpts, nullptr,
4691 AllowCompatibleDifferences);
4692 }
4693
4694 bool ReadTargetOptions(const TargetOptions &TargetOpts, bool Complain,
4695 bool AllowCompatibleDifferences) override {
4696 return checkTargetOptions(ExistingTargetOpts, TargetOpts, nullptr,
4697 AllowCompatibleDifferences);
4698 }
4699
4700 bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
4701 StringRef SpecificModuleCachePath,
4702 bool Complain) override {
4703 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
4704 ExistingModuleCachePath,
4705 nullptr, ExistingLangOpts);
4706 }
4707
4708 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
4709 bool Complain,
4710 std::string &SuggestedPredefines) override {
4711 return checkPreprocessorOptions(ExistingPPOpts, PPOpts, nullptr, FileMgr,
4712 SuggestedPredefines, ExistingLangOpts);
4713 }
4714 };
4715
4716} // namespace
4717
4718bool ASTReader::readASTFileControlBlock(
4719 StringRef Filename, FileManager &FileMgr,
4720 const PCHContainerReader &PCHContainerRdr,
4721 bool FindModuleFileExtensions,
4722 ASTReaderListener &Listener, bool ValidateDiagnosticOptions) {
4723 // Open the AST file.
4724 // FIXME: This allows use of the VFS; we do not allow use of the
4725 // VFS when actually loading a module.
4726 auto Buffer = FileMgr.getBufferForFile(Filename);
4727 if (!Buffer) {
4728 return true;
4729 }
4730
4731 // Initialize the stream
4732 StringRef Bytes = PCHContainerRdr.ExtractPCH(**Buffer);
4733 BitstreamCursor Stream(Bytes);
4734
4735 // Sniff for the signature.
4736 if (!startsWithASTFileMagic(Stream))
4737 return true;
4738
4739 // Scan for the CONTROL_BLOCK_ID block.
4740 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID))
4741 return true;
4742
4743 bool NeedsInputFiles = Listener.needsInputFileVisitation();
4744 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
4745 bool NeedsImports = Listener.needsImportVisitation();
4746 BitstreamCursor InputFilesCursor;
4747
4748 RecordData Record;
4749 std::string ModuleDir;
4750 bool DoneWithControlBlock = false;
4751 while (!DoneWithControlBlock) {
4752 llvm::BitstreamEntry Entry = Stream.advance();
4753
4754 switch (Entry.Kind) {
4755 case llvm::BitstreamEntry::SubBlock: {
4756 switch (Entry.ID) {
4757 case OPTIONS_BLOCK_ID: {
4758 std::string IgnoredSuggestedPredefines;
4759 if (ReadOptionsBlock(Stream, ARR_ConfigurationMismatch | ARR_OutOfDate,
4760 /*AllowCompatibleConfigurationMismatch*/ false,
4761 Listener, IgnoredSuggestedPredefines) != Success)
4762 return true;
4763 break;
4764 }
4765
4766 case INPUT_FILES_BLOCK_ID:
4767 InputFilesCursor = Stream;
4768 if (Stream.SkipBlock() ||
4769 (NeedsInputFiles &&
4770 ReadBlockAbbrevs(InputFilesCursor, INPUT_FILES_BLOCK_ID)))
4771 return true;
4772 break;
4773
4774 default:
4775 if (Stream.SkipBlock())
4776 return true;
4777 break;
4778 }
4779
4780 continue;
4781 }
4782
4783 case llvm::BitstreamEntry::EndBlock:
4784 DoneWithControlBlock = true;
4785 break;
4786
4787 case llvm::BitstreamEntry::Error:
4788 return true;
4789
4790 case llvm::BitstreamEntry::Record:
4791 break;
4792 }
4793
4794 if (DoneWithControlBlock) break;
4795
4796 Record.clear();
4797 StringRef Blob;
4798 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob);
4799 switch ((ControlRecordTypes)RecCode) {
4800 case METADATA:
4801 if (Record[0] != VERSION_MAJOR)
4802 return true;
4803 if (Listener.ReadFullVersionInformation(Blob))
4804 return true;
4805 break;
4806 case MODULE_NAME:
4807 Listener.ReadModuleName(Blob);
4808 break;
4809 case MODULE_DIRECTORY:
4810 ModuleDir = Blob;
4811 break;
4812 case MODULE_MAP_FILE: {
4813 unsigned Idx = 0;
4814 auto Path = ReadString(Record, Idx);
4815 ResolveImportedPath(Path, ModuleDir);
4816 Listener.ReadModuleMapFile(Path);
4817 break;
4818 }
4819 case INPUT_FILE_OFFSETS: {
4820 if (!NeedsInputFiles)
4821 break;
4822
4823 unsigned NumInputFiles = Record[0];
4824 unsigned NumUserFiles = Record[1];
4825 const llvm::support::unaligned_uint64_t *InputFileOffs =
4826 (const llvm::support::unaligned_uint64_t *)Blob.data();
4827 for (unsigned I = 0; I != NumInputFiles; ++I) {
4828 // Go find this input file.
4829 bool isSystemFile = I >= NumUserFiles;
4830
4831 if (isSystemFile && !NeedsSystemInputFiles)
4832 break; // the rest are system input files
4833
4834 BitstreamCursor &Cursor = InputFilesCursor;
4835 SavedStreamPosition SavedPosition(Cursor);
4836 Cursor.JumpToBit(InputFileOffs[I]);
4837
4838 unsigned Code = Cursor.ReadCode();
4839 RecordData Record;
4840 StringRef Blob;
4841 bool shouldContinue = false;
4842 switch ((InputFileRecordTypes)Cursor.readRecord(Code, Record, &Blob)) {
4843 case INPUT_FILE:
4844 bool Overridden = static_cast<bool>(Record[3]);
4845 std::string Filename = Blob;
4846 ResolveImportedPath(Filename, ModuleDir);
4847 shouldContinue = Listener.visitInputFile(
4848 Filename, isSystemFile, Overridden, /*IsExplicitModule*/false);
4849 break;
4850 }
4851 if (!shouldContinue)
4852 break;
4853 }
4854 break;
4855 }
4856
4857 case IMPORTS: {
4858 if (!NeedsImports)
4859 break;
4860
4861 unsigned Idx = 0, N = Record.size();
4862 while (Idx < N) {
4863 // Read information about the AST file.
4864 Idx += 1+1+1+1+5; // Kind, ImportLoc, Size, ModTime, Signature
4865 std::string ModuleName = ReadString(Record, Idx);
4866 std::string Filename = ReadString(Record, Idx);
4867 ResolveImportedPath(Filename, ModuleDir);
4868 Listener.visitImport(ModuleName, Filename);
4869 }
4870 break;
4871 }
4872
4873 default:
4874 // No other validation to perform.
4875 break;
4876 }
4877 }
4878
4879 // Look for module file extension blocks, if requested.
4880 if (FindModuleFileExtensions) {
4881 BitstreamCursor SavedStream = Stream;
4882 while (!SkipCursorToBlock(Stream, EXTENSION_BLOCK_ID)) {
4883 bool DoneWithExtensionBlock = false;
4884 while (!DoneWithExtensionBlock) {
4885 llvm::BitstreamEntry Entry = Stream.advance();
4886
4887 switch (Entry.Kind) {
4888 case llvm::BitstreamEntry::SubBlock:
4889 if (Stream.SkipBlock())
4890 return true;
4891
4892 continue;
4893
4894 case llvm::BitstreamEntry::EndBlock:
4895 DoneWithExtensionBlock = true;
4896 continue;
4897
4898 case llvm::BitstreamEntry::Error:
4899 return true;
4900
4901 case llvm::BitstreamEntry::Record:
4902 break;
4903 }
4904
4905 Record.clear();
4906 StringRef Blob;
4907 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob);
4908 switch (RecCode) {
4909 case EXTENSION_METADATA: {
4910 ModuleFileExtensionMetadata Metadata;
4911 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata))
4912 return true;
4913
4914 Listener.readModuleFileExtension(Metadata);
4915 break;
4916 }
4917 }
4918 }
4919 }
4920 Stream = SavedStream;
4921 }
4922
4923 // Scan for the UNHASHED_CONTROL_BLOCK_ID block.
4924 if (readUnhashedControlBlockImpl(
4925 nullptr, Bytes, ARR_ConfigurationMismatch | ARR_OutOfDate,
4926 /*AllowCompatibleConfigurationMismatch*/ false, &Listener,
4927 ValidateDiagnosticOptions) != Success)
4928 return true;
4929
4930 return false;
4931}
4932
4933bool ASTReader::isAcceptableASTFile(StringRef Filename, FileManager &FileMgr,
4934 const PCHContainerReader &PCHContainerRdr,
4935 const LangOptions &LangOpts,
4936 const TargetOptions &TargetOpts,
4937 const PreprocessorOptions &PPOpts,
4938 StringRef ExistingModuleCachePath) {
4939 SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts,
4940 ExistingModuleCachePath, FileMgr);
4941 return !readASTFileControlBlock(Filename, FileMgr, PCHContainerRdr,
4942 /*FindModuleFileExtensions=*/false,
4943 validator,
4944 /*ValidateDiagnosticOptions=*/true);
4945}
4946
4947ASTReader::ASTReadResult
4948ASTReader::ReadSubmoduleBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
4949 // Enter the submodule block.
4950 if (F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) {
4951 Error("malformed submodule block record in AST file");
4952 return Failure;
4953 }
4954
4955 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
4956 bool First = true;
4957 Module *CurrentModule = nullptr;
4958 RecordData Record;
4959 while (true) {
4960 llvm::BitstreamEntry Entry = F.Stream.advanceSkippingSubblocks();
4961
4962 switch (Entry.Kind) {
4963 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
4964 case llvm::BitstreamEntry::Error:
4965 Error("malformed block record in AST file");
4966 return Failure;
4967 case llvm::BitstreamEntry::EndBlock:
4968 return Success;
4969 case llvm::BitstreamEntry::Record:
4970 // The interesting case.
4971 break;
4972 }
4973
4974 // Read a record.
4975 StringRef Blob;
4976 Record.clear();
4977 auto Kind = F.Stream.readRecord(Entry.ID, Record, &Blob);
4978
4979 if ((Kind == SUBMODULE_METADATA) != First) {
4980 Error("submodule metadata record should be at beginning of block");
4981 return Failure;
4982 }
4983 First = false;
4984
4985 // Submodule information is only valid if we have a current module.
4986 // FIXME: Should we error on these cases?
4987 if (!CurrentModule && Kind != SUBMODULE_METADATA &&
4988 Kind != SUBMODULE_DEFINITION)
4989 continue;
4990
4991 switch (Kind) {
4992 default: // Default behavior: ignore.
4993 break;
4994
4995 case SUBMODULE_DEFINITION: {
4996 if (Record.size() < 12) {
4997 Error("malformed module definition");
4998 return Failure;
4999 }
5000
5001 StringRef Name = Blob;
5002 unsigned Idx = 0;
5003 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]);
5004 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]);
5005 Module::ModuleKind Kind = (Module::ModuleKind)Record[Idx++];
5006 bool IsFramework = Record[Idx++];
5007 bool IsExplicit = Record[Idx++];
5008 bool IsSystem = Record[Idx++];
5009 bool IsExternC = Record[Idx++];
5010 bool InferSubmodules = Record[Idx++];
5011 bool InferExplicitSubmodules = Record[Idx++];
5012 bool InferExportWildcard = Record[Idx++];
5013 bool ConfigMacrosExhaustive = Record[Idx++];
5014 bool ModuleMapIsPrivate = Record[Idx++];
5015
5016 Module *ParentModule = nullptr;
5017 if (Parent)
5018 ParentModule = getSubmodule(Parent);
5019
5020 // Retrieve this (sub)module from the module map, creating it if
5021 // necessary.
5022 CurrentModule =
5023 ModMap.findOrCreateModule(Name, ParentModule, IsFramework, IsExplicit)
5024 .first;
5025
5026 // FIXME: set the definition loc for CurrentModule, or call
5027 // ModMap.setInferredModuleAllowedBy()
5028
5029 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS;
5030 if (GlobalIndex >= SubmodulesLoaded.size() ||
5031 SubmodulesLoaded[GlobalIndex]) {
5032 Error("too many submodules");
5033 return Failure;
5034 }
5035
5036 if (!ParentModule) {
5037 if (const FileEntry *CurFile = CurrentModule->getASTFile()) {
5038 // Don't emit module relocation error if we have -fno-validate-pch
5039 if (!PP.getPreprocessorOpts().DisablePCHValidation &&
5040 CurFile != F.File) {
5041 if (!Diags.isDiagnosticInFlight()) {
5042 Diag(diag::err_module_file_conflict)
5043 << CurrentModule->getTopLevelModuleName()
5044 << CurFile->getName()
5045 << F.File->getName();
5046 }
5047 return Failure;
5048 }
5049 }
5050
5051 CurrentModule->setASTFile(F.File);
5052 CurrentModule->PresumedModuleMapFile = F.ModuleMapPath;
5053 }
5054
5055 CurrentModule->Kind = Kind;
5056 CurrentModule->Signature = F.Signature;
5057 CurrentModule->IsFromModuleFile = true;
5058 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem;
5059 CurrentModule->IsExternC = IsExternC;
5060 CurrentModule->InferSubmodules = InferSubmodules;
5061 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules;
5062 CurrentModule->InferExportWildcard = InferExportWildcard;
5063 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive;
5064 CurrentModule->ModuleMapIsPrivate = ModuleMapIsPrivate;
5065 if (DeserializationListener)
5066 DeserializationListener->ModuleRead(GlobalID, CurrentModule);
5067
5068 SubmodulesLoaded[GlobalIndex] = CurrentModule;
5069
5070 // Clear out data that will be replaced by what is in the module file.
5071 CurrentModule->LinkLibraries.clear();
5072 CurrentModule->ConfigMacros.clear();
5073 CurrentModule->UnresolvedConflicts.clear();
5074 CurrentModule->Conflicts.clear();
5075
5076 // The module is available unless it's missing a requirement; relevant
5077 // requirements will be (re-)added by SUBMODULE_REQUIRES records.
5078 // Missing headers that were present when the module was built do not
5079 // make it unavailable -- if we got this far, this must be an explicitly
5080 // imported module file.
5081 CurrentModule->Requirements.clear();
5082 CurrentModule->MissingHeaders.clear();
5083 CurrentModule->IsMissingRequirement =
5084 ParentModule && ParentModule->IsMissingRequirement;
5085 CurrentModule->IsAvailable = !CurrentModule->IsMissingRequirement;
5086 break;
5087 }
5088
5089 case SUBMODULE_UMBRELLA_HEADER: {
5090 std::string Filename = Blob;
5091 ResolveImportedPath(F, Filename);
5092 if (auto *Umbrella = PP.getFileManager().getFile(Filename)) {
5093 if (!CurrentModule->getUmbrellaHeader())
5094 ModMap.setUmbrellaHeader(CurrentModule, Umbrella, Blob);
5095 else if (CurrentModule->getUmbrellaHeader().Entry != Umbrella) {
5096 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
5097 Error("mismatched umbrella headers in submodule");
5098 return OutOfDate;
5099 }
5100 }
5101 break;
5102 }
5103
5104 case SUBMODULE_HEADER:
5105 case SUBMODULE_EXCLUDED_HEADER:
5106 case SUBMODULE_PRIVATE_HEADER:
5107 // We lazily associate headers with their modules via the HeaderInfo table.
5108 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
5109 // of complete filenames or remove it entirely.
5110 break;
5111
5112 case SUBMODULE_TEXTUAL_HEADER:
5113 case SUBMODULE_PRIVATE_TEXTUAL_HEADER:
5114 // FIXME: Textual headers are not marked in the HeaderInfo table. Load
5115 // them here.
5116 break;
5117
5118 case SUBMODULE_TOPHEADER:
5119 CurrentModule->addTopHeaderFilename(Blob);
5120 break;
5121
5122 case SUBMODULE_UMBRELLA_DIR: {
5123 std::string Dirname = Blob;
5124 ResolveImportedPath(F, Dirname);
5125 if (auto *Umbrella = PP.getFileManager().getDirectory(Dirname)) {
5126 if (!CurrentModule->getUmbrellaDir())
5127 ModMap.setUmbrellaDir(CurrentModule, Umbrella, Blob);
5128 else if (CurrentModule->getUmbrellaDir().Entry != Umbrella) {
5129 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
5130 Error("mismatched umbrella directories in submodule");
5131 return OutOfDate;
5132 }
5133 }
5134 break;
5135 }
5136
5137 case SUBMODULE_METADATA: {
5138 F.BaseSubmoduleID = getTotalNumSubmodules();
5139 F.LocalNumSubmodules = Record[0];
5140 unsigned LocalBaseSubmoduleID = Record[1];
5141 if (F.LocalNumSubmodules > 0) {
5142 // Introduce the global -> local mapping for submodules within this
5143 // module.
5144 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F));
5145
5146 // Introduce the local -> global mapping for submodules within this
5147 // module.
5148 F.SubmoduleRemap.insertOrReplace(
5149 std::make_pair(LocalBaseSubmoduleID,
5150 F.BaseSubmoduleID - LocalBaseSubmoduleID));
5151
5152 SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules);
5153 }
5154 break;
5155 }
5156
5157 case SUBMODULE_IMPORTS:
5158 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) {
5159 UnresolvedModuleRef Unresolved;
5160 Unresolved.File = &F;
5161 Unresolved.Mod = CurrentModule;
5162 Unresolved.ID = Record[Idx];
5163 Unresolved.Kind = UnresolvedModuleRef::Import;
5164 Unresolved.IsWildcard = false;
5165 UnresolvedModuleRefs.push_back(Unresolved);
5166 }
5167 break;
5168
5169 case SUBMODULE_EXPORTS:
5170 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) {
5171 UnresolvedModuleRef Unresolved;
5172 Unresolved.File = &F;
5173 Unresolved.Mod = CurrentModule;
5174 Unresolved.ID = Record[Idx];
5175 Unresolved.Kind = UnresolvedModuleRef::Export;
5176 Unresolved.IsWildcard = Record[Idx + 1];
5177 UnresolvedModuleRefs.push_back(Unresolved);
5178 }
5179
5180 // Once we've loaded the set of exports, there's no reason to keep
5181 // the parsed, unresolved exports around.
5182 CurrentModule->UnresolvedExports.clear();
5183 break;
5184
5185 case SUBMODULE_REQUIRES:
5186 CurrentModule->addRequirement(Blob, Record[0], PP.getLangOpts(),
5187 PP.getTargetInfo());
5188 break;
5189
5190 case SUBMODULE_LINK_LIBRARY:
5191 ModMap.resolveLinkAsDependencies(CurrentModule);
5192 CurrentModule->LinkLibraries.push_back(
5193 Module::LinkLibrary(Blob, Record[0]));
5194 break;
5195
5196 case SUBMODULE_CONFIG_MACRO:
5197 CurrentModule->ConfigMacros.push_back(Blob.str());
5198 break;
5199
5200 case SUBMODULE_CONFLICT: {
5201 UnresolvedModuleRef Unresolved;
5202 Unresolved.File = &F;
5203 Unresolved.Mod = CurrentModule;
5204 Unresolved.ID = Record[0];
5205 Unresolved.Kind = UnresolvedModuleRef::Conflict;
5206 Unresolved.IsWildcard = false;
5207 Unresolved.String = Blob;
5208 UnresolvedModuleRefs.push_back(Unresolved);
5209 break;
5210 }
5211
5212 case SUBMODULE_INITIALIZERS: {
5213 if (!ContextObj)
5214 break;
5215 SmallVector<uint32_t, 16> Inits;
5216 for (auto &ID : Record)
5217 Inits.push_back(getGlobalDeclID(F, ID));
5218 ContextObj->addLazyModuleInitializers(CurrentModule, Inits);
5219 break;
5220 }
5221
5222 case SUBMODULE_EXPORT_AS:
5223 CurrentModule->ExportAsModule = Blob.str();
5224 ModMap.addLinkAsDependency(CurrentModule);
5225 break;
5226 }
5227 }
5228}
5229
5230/// Parse the record that corresponds to a LangOptions data
5231/// structure.
5232///
5233/// This routine parses the language options from the AST file and then gives
5234/// them to the AST listener if one is set.
5235///
5236/// \returns true if the listener deems the file unacceptable, false otherwise.
5237bool ASTReader::ParseLanguageOptions(const RecordData &Record,
5238 bool Complain,
5239 ASTReaderListener &Listener,
5240 bool AllowCompatibleDifferences) {
5241 LangOptions LangOpts;
5242 unsigned Idx = 0;
5243#define LANGOPT(Name, Bits, Default, Description) \
5244 LangOpts.Name = Record[Idx++];
5245#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
5246 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
5247#include "clang/Basic/LangOptions.def"
5248#define SANITIZER(NAME, ID) \
5249 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]);
5250#include "clang/Basic/Sanitizers.def"
5251
5252 for (unsigned N = Record[Idx++]; N; --N)
5253 LangOpts.ModuleFeatures.push_back(ReadString(Record, Idx));
5254
5255 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++];
5256 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx);
5257 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion);
5258
5259 LangOpts.CurrentModule = ReadString(Record, Idx);
5260
5261 // Comment options.
5262 for (unsigned N = Record[Idx++]; N; --N) {
5263 LangOpts.CommentOpts.BlockCommandNames.push_back(
5264 ReadString(Record, Idx));
5265 }
5266 LangOpts.CommentOpts.ParseAllComments = Record[Idx++];
5267
5268 // OpenMP offloading options.
5269 for (unsigned N = Record[Idx++]; N; --N) {
5270 LangOpts.OMPTargetTriples.push_back(llvm::Triple(ReadString(Record, Idx)));
5271 }
5272
5273 LangOpts.OMPHostIRFile = ReadString(Record, Idx);
5274
5275 return Listener.ReadLanguageOptions(LangOpts, Complain,
5276 AllowCompatibleDifferences);
5277}
5278
5279bool ASTReader::ParseTargetOptions(const RecordData &Record, bool Complain,
5280 ASTReaderListener &Listener,
5281 bool AllowCompatibleDifferences) {
5282 unsigned Idx = 0;
5283 TargetOptions TargetOpts;
5284 TargetOpts.Triple = ReadString(Record, Idx);
5285 TargetOpts.CPU = ReadString(Record, Idx);
5286 TargetOpts.ABI = ReadString(Record, Idx);
5287 for (unsigned N = Record[Idx++]; N; --N) {
5288 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx));
5289 }
5290 for (unsigned N = Record[Idx++]; N; --N) {
5291 TargetOpts.Features.push_back(ReadString(Record, Idx));
5292 }
5293
5294 return Listener.ReadTargetOptions(TargetOpts, Complain,
5295 AllowCompatibleDifferences);
5296}
5297
5298bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain,
5299 ASTReaderListener &Listener) {
5300 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions);
5301 unsigned Idx = 0;
5302#define DIAGOPT(Name, Bits, Default) DiagOpts->Name = Record[Idx++];
5303#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
5304 DiagOpts->set##Name(static_cast<Type>(Record[Idx++]));
5305#include "clang/Basic/DiagnosticOptions.def"
5306
5307 for (unsigned N = Record[Idx++]; N; --N)
5308 DiagOpts->Warnings.push_back(ReadString(Record, Idx));
5309 for (unsigned N = Record[Idx++]; N; --N)
5310 DiagOpts->Remarks.push_back(ReadString(Record, Idx));
5311
5312 return Listener.ReadDiagnosticOptions(DiagOpts, Complain);
5313}
5314
5315bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain,
5316 ASTReaderListener &Listener) {
5317 FileSystemOptions FSOpts;
5318 unsigned Idx = 0;
5319 FSOpts.WorkingDir = ReadString(Record, Idx);
5320 return Listener.ReadFileSystemOptions(FSOpts, Complain);
5321}
5322
5323bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record,
5324 bool Complain,
5325 ASTReaderListener &Listener) {
5326 HeaderSearchOptions HSOpts;
5327 unsigned Idx = 0;
5328 HSOpts.Sysroot = ReadString(Record, Idx);
5329
5330 // Include entries.
5331 for (unsigned N = Record[Idx++]; N; --N) {
5332 std::string Path = ReadString(Record, Idx);
5333 frontend::IncludeDirGroup Group
5334 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]);
5335 bool IsFramework = Record[Idx++];
5336 bool IgnoreSysRoot = Record[Idx++];
5337 HSOpts.UserEntries.emplace_back(std::move(Path), Group, IsFramework,
5338 IgnoreSysRoot);
5339 }
5340
5341 // System header prefixes.
5342 for (unsigned N = Record[Idx++]; N; --N) {
5343 std::string Prefix = ReadString(Record, Idx);
5344 bool IsSystemHeader = Record[Idx++];
5345 HSOpts.SystemHeaderPrefixes.emplace_back(std::move(Prefix), IsSystemHeader);
5346 }
5347
5348 HSOpts.ResourceDir = ReadString(Record, Idx);
5349 HSOpts.ModuleCachePath = ReadString(Record, Idx);
5350 HSOpts.ModuleUserBuildPath = ReadString(Record, Idx);
5351 HSOpts.DisableModuleHash = Record[Idx++];
5352 HSOpts.ImplicitModuleMaps = Record[Idx++];
5353 HSOpts.ModuleMapFileHomeIsCwd = Record[Idx++];
5354 HSOpts.UseBuiltinIncludes = Record[Idx++];
5355 HSOpts.UseStandardSystemIncludes = Record[Idx++];
5356 HSOpts.UseStandardCXXIncludes = Record[Idx++];
5357 HSOpts.UseLibcxx = Record[Idx++];
5358 std::string SpecificModuleCachePath = ReadString(Record, Idx);
5359
5360 return Listener.ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
5361 Complain);
5362}
5363
5364bool ASTReader::ParsePreprocessorOptions(const RecordData &Record,
5365 bool Complain,
5366 ASTReaderListener &Listener,
5367 std::string &SuggestedPredefines) {
5368 PreprocessorOptions PPOpts;
5369 unsigned Idx = 0;
5370
5371 // Macro definitions/undefs
5372 for (unsigned N = Record[Idx++]; N; --N) {
5373 std::string Macro = ReadString(Record, Idx);
5374 bool IsUndef = Record[Idx++];
5375 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef));
5376 }
5377
5378 // Includes
5379 for (unsigned N = Record[Idx++]; N; --N) {
5380 PPOpts.Includes.push_back(ReadString(Record, Idx));
5381 }
5382
5383 // Macro Includes
5384 for (unsigned N = Record[Idx++]; N; --N) {
5385 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx));
5386 }
5387
5388 PPOpts.UsePredefines = Record[Idx++];
5389 PPOpts.DetailedRecord = Record[Idx++];
5390 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx);
5391 PPOpts.ImplicitPTHInclude = ReadString(Record, Idx);
5392 PPOpts.ObjCXXARCStandardLibrary =
5393 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]);
5394 SuggestedPredefines.clear();
5395 return Listener.ReadPreprocessorOptions(PPOpts, Complain,
5396 SuggestedPredefines);
5397}
5398
5399std::pair<ModuleFile *, unsigned>
5400ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) {
5401 GlobalPreprocessedEntityMapType::iterator
5402 I = GlobalPreprocessedEntityMap.find(GlobalIndex);
5403 assert(I != GlobalPreprocessedEntityMap.end() &&((I != GlobalPreprocessedEntityMap.end() && "Corrupted global preprocessed entity map"
) ? static_cast<void> (0) : __assert_fail ("I != GlobalPreprocessedEntityMap.end() && \"Corrupted global preprocessed entity map\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 5404, __PRETTY_FUNCTION__))
5404 "Corrupted global preprocessed entity map")((I != GlobalPreprocessedEntityMap.end() && "Corrupted global preprocessed entity map"
) ? static_cast<void> (0) : __assert_fail ("I != GlobalPreprocessedEntityMap.end() && \"Corrupted global preprocessed entity map\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 5404, __PRETTY_FUNCTION__))
;
5405 ModuleFile *M = I->second;
5406 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID;
5407 return std::make_pair(M, LocalIndex);
5408}
5409
5410llvm::iterator_range<PreprocessingRecord::iterator>
5411ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const {
5412 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
5413 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID,
5414 Mod.NumPreprocessedEntities);
5415
5416 return llvm::make_range(PreprocessingRecord::iterator(),
5417 PreprocessingRecord::iterator());
5418}
5419
5420llvm::iterator_range<ASTReader::ModuleDeclIterator>
5421ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) {
5422 return llvm::make_range(
5423 ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls),
5424 ModuleDeclIterator(this, &Mod,
5425 Mod.FileSortedDecls + Mod.NumFileSortedDecls));
5426}
5427
5428SourceRange ASTReader::ReadSkippedRange(unsigned GlobalIndex) {
5429 auto I = GlobalSkippedRangeMap.find(GlobalIndex);
5430 assert(I != GlobalSkippedRangeMap.end() &&((I != GlobalSkippedRangeMap.end() && "Corrupted global skipped range map"
) ? static_cast<void> (0) : __assert_fail ("I != GlobalSkippedRangeMap.end() && \"Corrupted global skipped range map\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 5431, __PRETTY_FUNCTION__))
5431 "Corrupted global skipped range map")((I != GlobalSkippedRangeMap.end() && "Corrupted global skipped range map"
) ? static_cast<void> (0) : __assert_fail ("I != GlobalSkippedRangeMap.end() && \"Corrupted global skipped range map\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 5431, __PRETTY_FUNCTION__))
;
5432 ModuleFile *M = I->second;
5433 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedSkippedRangeID;
5434 assert(LocalIndex < M->NumPreprocessedSkippedRanges)((LocalIndex < M->NumPreprocessedSkippedRanges) ? static_cast
<void> (0) : __assert_fail ("LocalIndex < M->NumPreprocessedSkippedRanges"
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 5434, __PRETTY_FUNCTION__))
;
5435 PPSkippedRange RawRange = M->PreprocessedSkippedRangeOffsets[LocalIndex];
5436 SourceRange Range(TranslateSourceLocation(*M, RawRange.getBegin()),
5437 TranslateSourceLocation(*M, RawRange.getEnd()));
5438 assert(Range.isValid())((Range.isValid()) ? static_cast<void> (0) : __assert_fail
("Range.isValid()", "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 5438, __PRETTY_FUNCTION__))
;
5439 return Range;
5440}
5441
5442PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) {
5443 PreprocessedEntityID PPID = Index+1;
5444 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
5445 ModuleFile &M = *PPInfo.first;
5446 unsigned LocalIndex = PPInfo.second;
5447 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
5448
5449 if (!PP.getPreprocessingRecord()) {
5450 Error("no preprocessing record");
5451 return nullptr;
5452 }
5453
5454 SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor);
5455 M.PreprocessorDetailCursor.JumpToBit(PPOffs.BitOffset);
5456
5457 llvm::BitstreamEntry Entry =
5458 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
5459 if (Entry.Kind != llvm::BitstreamEntry::Record)
5460 return nullptr;
5461
5462 // Read the record.
5463 SourceRange Range(TranslateSourceLocation(M, PPOffs.getBegin()),
5464 TranslateSourceLocation(M, PPOffs.getEnd()));
5465 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
5466 StringRef Blob;
5467 RecordData Record;
5468 PreprocessorDetailRecordTypes RecType =
5469 (PreprocessorDetailRecordTypes)M.PreprocessorDetailCursor.readRecord(
5470 Entry.ID, Record, &Blob);
5471 switch (RecType) {
5472 case PPD_MACRO_EXPANSION: {
5473 bool isBuiltin = Record[0];
5474 IdentifierInfo *Name = nullptr;
5475 MacroDefinitionRecord *Def = nullptr;
5476 if (isBuiltin)
5477 Name = getLocalIdentifier(M, Record[1]);
5478 else {
5479 PreprocessedEntityID GlobalID =
5480 getGlobalPreprocessedEntityID(M, Record[1]);
5481 Def = cast<MacroDefinitionRecord>(
5482 PPRec.getLoadedPreprocessedEntity(GlobalID - 1));
5483 }
5484
5485 MacroExpansion *ME;
5486 if (isBuiltin)
5487 ME = new (PPRec) MacroExpansion(Name, Range);
5488 else
5489 ME = new (PPRec) MacroExpansion(Def, Range);
5490
5491 return ME;
5492 }
5493
5494 case PPD_MACRO_DEFINITION: {
5495 // Decode the identifier info and then check again; if the macro is
5496 // still defined and associated with the identifier,
5497 IdentifierInfo *II = getLocalIdentifier(M, Record[0]);
5498 MacroDefinitionRecord *MD = new (PPRec) MacroDefinitionRecord(II, Range);
5499
5500 if (DeserializationListener)
5501 DeserializationListener->MacroDefinitionRead(PPID, MD);
5502
5503 return MD;
5504 }
5505
5506 case PPD_INCLUSION_DIRECTIVE: {
5507 const char *FullFileNameStart = Blob.data() + Record[0];
5508 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]);
5509 const FileEntry *File = nullptr;
5510 if (!FullFileName.empty())
5511 File = PP.getFileManager().getFile(FullFileName);
5512
5513 // FIXME: Stable encoding
5514 InclusionDirective::InclusionKind Kind
5515 = static_cast<InclusionDirective::InclusionKind>(Record[2]);
5516 InclusionDirective *ID
5517 = new (PPRec) InclusionDirective(PPRec, Kind,
5518 StringRef(Blob.data(), Record[0]),
5519 Record[1], Record[3],
5520 File,
5521 Range);
5522 return ID;
5523 }
5524 }
5525
5526 llvm_unreachable("Invalid PreprocessorDetailRecordTypes")::llvm::llvm_unreachable_internal("Invalid PreprocessorDetailRecordTypes"
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 5526)
;
5527}
5528
5529/// Find the next module that contains entities and return the ID
5530/// of the first entry.
5531///
5532/// \param SLocMapI points at a chunk of a module that contains no
5533/// preprocessed entities or the entities it contains are not the ones we are
5534/// looking for.
5535PreprocessedEntityID ASTReader::findNextPreprocessedEntity(
5536 GlobalSLocOffsetMapType::const_iterator SLocMapI) const {
5537 ++SLocMapI;
5538 for (GlobalSLocOffsetMapType::const_iterator
5539 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
5540 ModuleFile &M = *SLocMapI->second;
5541 if (M.NumPreprocessedEntities)
5542 return M.BasePreprocessedEntityID;
5543 }
5544
5545 return getTotalNumPreprocessedEntities();
5546}
5547
5548namespace {
5549
5550struct PPEntityComp {
5551 const ASTReader &Reader;
5552 ModuleFile &M;
5553
5554 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) {}
5555
5556 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const {
5557 SourceLocation LHS = getLoc(L);
5558 SourceLocation RHS = getLoc(R);
5559 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
5560 }
5561
5562 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const {
5563 SourceLocation LHS = getLoc(L);
5564 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
5565 }
5566
5567 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const {
5568 SourceLocation RHS = getLoc(R);
5569 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
5570 }
5571
5572 SourceLocation getLoc(const PPEntityOffset &PPE) const {
5573 return Reader.TranslateSourceLocation(M, PPE.getBegin());
5574 }
5575};
5576
5577} // namespace
5578
5579PreprocessedEntityID ASTReader::findPreprocessedEntity(SourceLocation Loc,
5580 bool EndsAfter) const {
5581 if (SourceMgr.isLocalSourceLocation(Loc))
5582 return getTotalNumPreprocessedEntities();
5583
5584 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
5585 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
5586 assert(SLocMapI != GlobalSLocOffsetMap.end() &&((SLocMapI != GlobalSLocOffsetMap.end() && "Corrupted global sloc offset map"
) ? static_cast<void> (0) : __assert_fail ("SLocMapI != GlobalSLocOffsetMap.end() && \"Corrupted global sloc offset map\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 5587, __PRETTY_FUNCTION__))
5587 "Corrupted global sloc offset map")((SLocMapI != GlobalSLocOffsetMap.end() && "Corrupted global sloc offset map"
) ? static_cast<void> (0) : __assert_fail ("SLocMapI != GlobalSLocOffsetMap.end() && \"Corrupted global sloc offset map\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 5587, __PRETTY_FUNCTION__))
;
5588
5589 if (SLocMapI->second->NumPreprocessedEntities == 0)
5590 return findNextPreprocessedEntity(SLocMapI);
5591
5592 ModuleFile &M = *SLocMapI->second;
5593
5594 using pp_iterator = const PPEntityOffset *;
5595
5596 pp_iterator pp_begin = M.PreprocessedEntityOffsets;
5597 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities;
5598
5599 size_t Count = M.NumPreprocessedEntities;
5600 size_t Half;
5601 pp_iterator First = pp_begin;
5602 pp_iterator PPI;
5603
5604 if (EndsAfter) {
5605 PPI = std::upper_bound(pp_begin, pp_end, Loc,
5606 PPEntityComp(*this, M));
5607 } else {
5608 // Do a binary search manually instead of using std::lower_bound because
5609 // The end locations of entities may be unordered (when a macro expansion
5610 // is inside another macro argument), but for this case it is not important
5611 // whether we get the first macro expansion or its containing macro.
5612 while (Count > 0) {
5613 Half = Count / 2;
5614 PPI = First;
5615 std::advance(PPI, Half);
5616 if (SourceMgr.isBeforeInTranslationUnit(
5617 TranslateSourceLocation(M, PPI->getEnd()), Loc)) {
5618 First = PPI;
5619 ++First;
5620 Count = Count - Half - 1;
5621 } else
5622 Count = Half;
5623 }
5624 }
5625
5626 if (PPI == pp_end)
5627 return findNextPreprocessedEntity(SLocMapI);
5628
5629 return M.BasePreprocessedEntityID + (PPI - pp_begin);
5630}
5631
5632/// Returns a pair of [Begin, End) indices of preallocated
5633/// preprocessed entities that \arg Range encompasses.
5634std::pair<unsigned, unsigned>
5635 ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) {
5636 if (Range.isInvalid())
5637 return std::make_pair(0,0);
5638 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()))((!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin
())) ? static_cast<void> (0) : __assert_fail ("!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin())"
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 5638, __PRETTY_FUNCTION__))
;
5639
5640 PreprocessedEntityID BeginID =
5641 findPreprocessedEntity(Range.getBegin(), false);
5642 PreprocessedEntityID EndID = findPreprocessedEntity(Range.getEnd(), true);
5643 return std::make_pair(BeginID, EndID);
5644}
5645
5646/// Optionally returns true or false if the preallocated preprocessed
5647/// entity with index \arg Index came from file \arg FID.
5648Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index,
5649 FileID FID) {
5650 if (FID.isInvalid())
5651 return false;
5652
5653 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
5654 ModuleFile &M = *PPInfo.first;
5655 unsigned LocalIndex = PPInfo.second;
5656 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
5657
5658 SourceLocation Loc = TranslateSourceLocation(M, PPOffs.getBegin());
5659 if (Loc.isInvalid())
5660 return false;
5661
5662 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
5663 return true;
5664 else
5665 return false;
5666}
5667
5668namespace {
5669
5670 /// Visitor used to search for information about a header file.
5671 class HeaderFileInfoVisitor {
5672 const FileEntry *FE;
5673 Optional<HeaderFileInfo> HFI;
5674
5675 public:
5676 explicit HeaderFileInfoVisitor(const FileEntry *FE) : FE(FE) {}
5677
5678 bool operator()(ModuleFile &M) {
5679 HeaderFileInfoLookupTable *Table
5680 = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable);
5681 if (!Table)
5682 return false;
5683
5684 // Look in the on-disk hash table for an entry for this file name.
5685 HeaderFileInfoLookupTable::iterator Pos = Table->find(FE);
5686 if (Pos == Table->end())
5687 return false;
5688
5689 HFI = *Pos;
5690 return true;
5691 }
5692
5693 Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; }
5694 };
5695
5696} // namespace
5697
5698HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) {
5699 HeaderFileInfoVisitor Visitor(FE);
5700 ModuleMgr.visit(Visitor);
5701 if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
5702 return *HFI;
5703
5704 return HeaderFileInfo();
5705}
5706
5707void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) {
5708 using DiagState = DiagnosticsEngine::DiagState;
5709 SmallVector<DiagState *, 32> DiagStates;
5710
5711 for (ModuleFile &F : ModuleMgr) {
5712 unsigned Idx = 0;
5713 auto &Record = F.PragmaDiagMappings;
5714 if (Record.empty())
5715 continue;
5716
5717 DiagStates.clear();
5718
5719 auto ReadDiagState =
5720 [&](const DiagState &BasedOn, SourceLocation Loc,
5721 bool IncludeNonPragmaStates) -> DiagnosticsEngine::DiagState * {
5722 unsigned BackrefID = Record[Idx++];
5723 if (BackrefID != 0)
5724 return DiagStates[BackrefID - 1];
5725
5726 // A new DiagState was created here.
5727 Diag.DiagStates.push_back(BasedOn);
5728 DiagState *NewState = &Diag.DiagStates.back();
5729 DiagStates.push_back(NewState);
5730 unsigned Size = Record[Idx++];
5731 assert(Idx + Size * 2 <= Record.size() &&((Idx + Size * 2 <= Record.size() && "Invalid data, not enough diag/map pairs"
) ? static_cast<void> (0) : __assert_fail ("Idx + Size * 2 <= Record.size() && \"Invalid data, not enough diag/map pairs\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 5732, __PRETTY_FUNCTION__))
5732 "Invalid data, not enough diag/map pairs")((Idx + Size * 2 <= Record.size() && "Invalid data, not enough diag/map pairs"
) ? static_cast<void> (0) : __assert_fail ("Idx + Size * 2 <= Record.size() && \"Invalid data, not enough diag/map pairs\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 5732, __PRETTY_FUNCTION__))
;
5733 while (Size--) {
5734 unsigned DiagID = Record[Idx++];
5735 DiagnosticMapping NewMapping =
5736 DiagnosticMapping::deserialize(Record[Idx++]);
5737 if (!NewMapping.isPragma() && !IncludeNonPragmaStates)
5738 continue;
5739
5740 DiagnosticMapping &Mapping = NewState->getOrAddMapping(DiagID);
5741
5742 // If this mapping was specified as a warning but the severity was
5743 // upgraded due to diagnostic settings, simulate the current diagnostic
5744 // settings (and use a warning).
5745 if (NewMapping.wasUpgradedFromWarning() && !Mapping.isErrorOrFatal()) {
5746 NewMapping.setSeverity(diag::Severity::Warning);
5747 NewMapping.setUpgradedFromWarning(false);
5748 }
5749
5750 Mapping = NewMapping;
5751 }
5752 return NewState;
5753 };
5754
5755 // Read the first state.
5756 DiagState *FirstState;
5757 if (F.Kind == MK_ImplicitModule) {
5758 // Implicitly-built modules are reused with different diagnostic
5759 // settings. Use the initial diagnostic state from Diag to simulate this
5760 // compilation's diagnostic settings.
5761 FirstState = Diag.DiagStatesByLoc.FirstDiagState;
5762 DiagStates.push_back(FirstState);
5763
5764 // Skip the initial diagnostic state from the serialized module.
5765 assert(Record[1] == 0 &&((Record[1] == 0 && "Invalid data, unexpected backref in initial state"
) ? static_cast<void> (0) : __assert_fail ("Record[1] == 0 && \"Invalid data, unexpected backref in initial state\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 5766, __PRETTY_FUNCTION__))
5766 "Invalid data, unexpected backref in initial state")((Record[1] == 0 && "Invalid data, unexpected backref in initial state"
) ? static_cast<void> (0) : __assert_fail ("Record[1] == 0 && \"Invalid data, unexpected backref in initial state\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 5766, __PRETTY_FUNCTION__))
;
5767 Idx = 3 + Record[2] * 2;
5768 assert(Idx < Record.size() &&((Idx < Record.size() && "Invalid data, not enough state change pairs in initial state"
) ? static_cast<void> (0) : __assert_fail ("Idx < Record.size() && \"Invalid data, not enough state change pairs in initial state\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 5769, __PRETTY_FUNCTION__))
5769 "Invalid data, not enough state change pairs in initial state")((Idx < Record.size() && "Invalid data, not enough state change pairs in initial state"
) ? static_cast<void> (0) : __assert_fail ("Idx < Record.size() && \"Invalid data, not enough state change pairs in initial state\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 5769, __PRETTY_FUNCTION__))
;
5770 } else if (F.isModule()) {
5771 // For an explicit module, preserve the flags from the module build
5772 // command line (-w, -Weverything, -Werror, ...) along with any explicit
5773 // -Wblah flags.
5774 unsigned Flags = Record[Idx++];
5775 DiagState Initial;
5776 Initial.SuppressSystemWarnings = Flags & 1; Flags >>= 1;
5777 Initial.ErrorsAsFatal = Flags & 1; Flags >>= 1;
5778 Initial.WarningsAsErrors = Flags & 1; Flags >>= 1;
5779 Initial.EnableAllWarnings = Flags & 1; Flags >>= 1;
5780 Initial.IgnoreAllWarnings = Flags & 1; Flags >>= 1;
5781 Initial.ExtBehavior = (diag::Severity)Flags;
5782 FirstState = ReadDiagState(Initial, SourceLocation(), true);
5783
5784 assert(F.OriginalSourceFileID.isValid())((F.OriginalSourceFileID.isValid()) ? static_cast<void>
(0) : __assert_fail ("F.OriginalSourceFileID.isValid()", "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 5784, __PRETTY_FUNCTION__))
;
5785
5786 // Set up the root buffer of the module to start with the initial
5787 // diagnostic state of the module itself, to cover files that contain no
5788 // explicit transitions (for which we did not serialize anything).
5789 Diag.DiagStatesByLoc.Files[F.OriginalSourceFileID]
5790 .StateTransitions.push_back({FirstState, 0});
5791 } else {
5792 // For prefix ASTs, start with whatever the user configured on the
5793 // command line.
5794 Idx++; // Skip flags.
5795 FirstState = ReadDiagState(*Diag.DiagStatesByLoc.CurDiagState,
5796 SourceLocation(), false);
5797 }
5798
5799 // Read the state transitions.
5800 unsigned NumLocations = Record[Idx++];
5801 while (NumLocations--) {
5802 assert(Idx < Record.size() &&((Idx < Record.size() && "Invalid data, missing pragma diagnostic states"
) ? static_cast<void> (0) : __assert_fail ("Idx < Record.size() && \"Invalid data, missing pragma diagnostic states\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 5803, __PRETTY_FUNCTION__))
5803 "Invalid data, missing pragma diagnostic states")((Idx < Record.size() && "Invalid data, missing pragma diagnostic states"
) ? static_cast<void> (0) : __assert_fail ("Idx < Record.size() && \"Invalid data, missing pragma diagnostic states\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 5803, __PRETTY_FUNCTION__))
;
5804 SourceLocation Loc = ReadSourceLocation(F, Record[Idx++]);
5805 auto IDAndOffset = SourceMgr.getDecomposedLoc(Loc);
5806 assert(IDAndOffset.first.isValid() && "invalid FileID for transition")((IDAndOffset.first.isValid() && "invalid FileID for transition"
) ? static_cast<void> (0) : __assert_fail ("IDAndOffset.first.isValid() && \"invalid FileID for transition\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 5806, __PRETTY_FUNCTION__))
;
5807 assert(IDAndOffset.second == 0 && "not a start location for a FileID")((IDAndOffset.second == 0 && "not a start location for a FileID"
) ? static_cast<void> (0) : __assert_fail ("IDAndOffset.second == 0 && \"not a start location for a FileID\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 5807, __PRETTY_FUNCTION__))
;
5808 unsigned Transitions = Record[Idx++];
5809
5810 // Note that we don't need to set up Parent/ParentOffset here, because
5811 // we won't be changing the diagnostic state within imported FileIDs
5812 // (other than perhaps appending to the main source file, which has no
5813 // parent).
5814 auto &F = Diag.DiagStatesByLoc.Files[IDAndOffset.first];
5815 F.StateTransitions.reserve(F.StateTransitions.size() + Transitions);
5816 for (unsigned I = 0; I != Transitions; ++I) {
5817 unsigned Offset = Record[Idx++];
5818 auto *State =
5819 ReadDiagState(*FirstState, Loc.getLocWithOffset(Offset), false);
5820 F.StateTransitions.push_back({State, Offset});
5821 }
5822 }
5823
5824 // Read the final state.
5825 assert(Idx < Record.size() &&((Idx < Record.size() && "Invalid data, missing final pragma diagnostic state"
) ? static_cast<void> (0) : __assert_fail ("Idx < Record.size() && \"Invalid data, missing final pragma diagnostic state\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 5826, __PRETTY_FUNCTION__))
5826 "Invalid data, missing final pragma diagnostic state")((Idx < Record.size() && "Invalid data, missing final pragma diagnostic state"
) ? static_cast<void> (0) : __assert_fail ("Idx < Record.size() && \"Invalid data, missing final pragma diagnostic state\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 5826, __PRETTY_FUNCTION__))
;
5827 SourceLocation CurStateLoc =
5828 ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]);
5829 auto *CurState = ReadDiagState(*FirstState, CurStateLoc, false);
5830
5831 if (!F.isModule()) {
5832 Diag.DiagStatesByLoc.CurDiagState = CurState;
5833 Diag.DiagStatesByLoc.CurDiagStateLoc = CurStateLoc;
5834
5835 // Preserve the property that the imaginary root file describes the
5836 // current state.
5837 FileID NullFile;
5838 auto &T = Diag.DiagStatesByLoc.Files[NullFile].StateTransitions;
5839 if (T.empty())
5840 T.push_back({CurState, 0});
5841 else
5842 T[0].State = CurState;
5843 }
5844
5845 // Don't try to read these mappings again.
5846 Record.clear();
5847 }
5848}
5849
5850/// Get the correct cursor and offset for loading a type.
5851ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) {
5852 GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index);
5853 assert(I != GlobalTypeMap.end() && "Corrupted global type map")((I != GlobalTypeMap.end() && "Corrupted global type map"
) ? static_cast<void> (0) : __assert_fail ("I != GlobalTypeMap.end() && \"Corrupted global type map\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 5853, __PRETTY_FUNCTION__))
;
5854 ModuleFile *M = I->second;
5855 return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex]);
5856}
5857
5858/// Read and return the type with the given index..
5859///
5860/// The index is the type ID, shifted and minus the number of predefs. This
5861/// routine actually reads the record corresponding to the type at the given
5862/// location. It is a helper routine for GetType, which deals with reading type
5863/// IDs.
5864QualType ASTReader::readTypeRecord(unsigned Index) {
5865 assert(ContextObj && "reading type with no AST context")((ContextObj && "reading type with no AST context") ?
static_cast<void> (0) : __assert_fail ("ContextObj && \"reading type with no AST context\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 5865, __PRETTY_FUNCTION__))
;
5866 ASTContext &Context = *ContextObj;
5867 RecordLocation Loc = TypeCursorForIndex(Index);
5868 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
5869
5870 // Keep track of where we are in the stream, then jump back there
5871 // after reading this type.
5872 SavedStreamPosition SavedPosition(DeclsCursor);
5873
5874 ReadingKindTracker ReadingKind(Read_Type, *this);
5875
5876 // Note that we are loading a type record.
5877 Deserializing AType(this);
5878
5879 unsigned Idx = 0;
5880 DeclsCursor.JumpToBit(Loc.Offset);
5881 RecordData Record;
5882 unsigned Code = DeclsCursor.ReadCode();
5883 switch ((TypeCode)DeclsCursor.readRecord(Code, Record)) {
5884 case TYPE_EXT_QUAL: {
5885 if (Record.size() != 2) {
5886 Error("Incorrect encoding of extended qualifier type");
5887 return QualType();
5888 }
5889 QualType Base = readType(*Loc.F, Record, Idx);
5890 Qualifiers Quals = Qualifiers::fromOpaqueValue(Record[Idx++]);
5891 return Context.getQualifiedType(Base, Quals);
5892 }
5893
5894 case TYPE_COMPLEX: {
5895 if (Record.size() != 1) {
5896 Error("Incorrect encoding of complex type");
5897 return QualType();
5898 }
5899 QualType ElemType = readType(*Loc.F, Record, Idx);
5900 return Context.getComplexType(ElemType);
5901 }
5902
5903 case TYPE_POINTER: {
5904 if (Record.size() != 1) {
5905 Error("Incorrect encoding of pointer type");
5906 return QualType();
5907 }
5908 QualType PointeeType = readType(*Loc.F, Record, Idx);
5909 return Context.getPointerType(PointeeType);
5910 }
5911
5912 case TYPE_DECAYED: {
5913 if (Record.size() != 1) {
5914 Error("Incorrect encoding of decayed type");
5915 return QualType();
5916 }
5917 QualType OriginalType = readType(*Loc.F, Record, Idx);
5918 QualType DT = Context.getAdjustedParameterType(OriginalType);
5919 if (!isa<DecayedType>(DT))
5920 Error("Decayed type does not decay");
5921 return DT;
5922 }
5923
5924 case TYPE_ADJUSTED: {
5925 if (Record.size() != 2) {
5926 Error("Incorrect encoding of adjusted type");
5927 return QualType();
5928 }
5929 QualType OriginalTy = readType(*Loc.F, Record, Idx);
5930 QualType AdjustedTy = readType(*Loc.F, Record, Idx);
5931 return Context.getAdjustedType(OriginalTy, AdjustedTy);
5932 }
5933
5934 case TYPE_BLOCK_POINTER: {
5935 if (Record.size() != 1) {
5936 Error("Incorrect encoding of block pointer type");
5937 return QualType();
5938 }
5939 QualType PointeeType = readType(*Loc.F, Record, Idx);
5940 return Context.getBlockPointerType(PointeeType);
5941 }
5942
5943 case TYPE_LVALUE_REFERENCE: {
5944 if (Record.size() != 2) {
5945 Error("Incorrect encoding of lvalue reference type");
5946 return QualType();
5947 }
5948 QualType PointeeType = readType(*Loc.F, Record, Idx);
5949 return Context.getLValueReferenceType(PointeeType, Record[1]);
5950 }
5951
5952 case TYPE_RVALUE_REFERENCE: {
5953 if (Record.size() != 1) {
5954 Error("Incorrect encoding of rvalue reference type");
5955 return QualType();
5956 }
5957 QualType PointeeType = readType(*Loc.F, Record, Idx);
5958 return Context.getRValueReferenceType(PointeeType);
5959 }
5960
5961 case TYPE_MEMBER_POINTER: {
5962 if (Record.size() != 2) {
5963 Error("Incorrect encoding of member pointer type");
5964 return QualType();
5965 }
5966 QualType PointeeType = readType(*Loc.F, Record, Idx);
5967 QualType ClassType = readType(*Loc.F, Record, Idx);
5968 if (PointeeType.isNull() || ClassType.isNull())
5969 return QualType();
5970
5971 return Context.getMemberPointerType(PointeeType, ClassType.getTypePtr());
5972 }
5973
5974 case TYPE_CONSTANT_ARRAY: {
5975 QualType ElementType = readType(*Loc.F, Record, Idx);
5976 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5977 unsigned IndexTypeQuals = Record[2];
5978 unsigned Idx = 3;
5979 llvm::APInt Size = ReadAPInt(Record, Idx);
5980 return Context.getConstantArrayType(ElementType, Size,
5981 ASM, IndexTypeQuals);
5982 }
5983
5984 case TYPE_INCOMPLETE_ARRAY: {
5985 QualType ElementType = readType(*Loc.F, Record, Idx);
5986 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5987 unsigned IndexTypeQuals = Record[2];
5988 return Context.getIncompleteArrayType(ElementType, ASM, IndexTypeQuals);
5989 }
5990
5991 case TYPE_VARIABLE_ARRAY: {
5992 QualType ElementType = readType(*Loc.F, Record, Idx);
5993 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5994 unsigned IndexTypeQuals = Record[2];
5995 SourceLocation LBLoc = ReadSourceLocation(*Loc.F, Record[3]);
5996 SourceLocation RBLoc = ReadSourceLocation(*Loc.F, Record[4]);
5997 return Context.getVariableArrayType(ElementType, ReadExpr(*Loc.F),
5998 ASM, IndexTypeQuals,
5999 SourceRange(LBLoc, RBLoc));
6000 }
6001
6002 case TYPE_VECTOR: {
6003 if (Record.size() != 3) {
6004 Error("incorrect encoding of vector type in AST file");
6005 return QualType();
6006 }
6007
6008 QualType ElementType = readType(*Loc.F, Record, Idx);
6009 unsigned NumElements = Record[1];
6010 unsigned VecKind = Record[2];
6011 return Context.getVectorType(ElementType, NumElements,
6012 (VectorType::VectorKind)VecKind);
6013 }
6014
6015 case TYPE_EXT_VECTOR: {
6016 if (Record.size() != 3) {
6017 Error("incorrect encoding of extended vector type in AST file");
6018 return QualType();
6019 }
6020
6021 QualType ElementType = readType(*Loc.F, Record, Idx);
6022 unsigned NumElements = Record[1];
6023 return Context.getExtVectorType(ElementType, NumElements);
6024 }
6025
6026 case TYPE_FUNCTION_NO_PROTO: {
6027 if (Record.size() != 8) {
6028 Error("incorrect encoding of no-proto function type");
6029 return QualType();
6030 }
6031 QualType ResultType = readType(*Loc.F, Record, Idx);
6032 FunctionType::ExtInfo Info(Record[1], Record[2], Record[3],
6033 (CallingConv)Record[4], Record[5], Record[6],
6034 Record[7]);
6035 return Context.getFunctionNoProtoType(ResultType, Info);
6036 }
6037
6038 case TYPE_FUNCTION_PROTO: {
6039 QualType ResultType = readType(*Loc.F, Record, Idx);
6040
6041 FunctionProtoType::ExtProtoInfo EPI;
6042 EPI.ExtInfo = FunctionType::ExtInfo(/*noreturn*/ Record[1],
6043 /*hasregparm*/ Record[2],
6044 /*regparm*/ Record[3],
6045 static_cast<CallingConv>(Record[4]),
6046 /*produces*/ Record[5],
6047 /*nocallersavedregs*/ Record[6],
6048 /*nocfcheck*/ Record[7]);
6049
6050 unsigned Idx = 8;
6051
6052 EPI.Variadic = Record[Idx++];
6053 EPI.HasTrailingReturn = Record[Idx++];
6054 EPI.TypeQuals = Record[Idx++];
6055 EPI.RefQualifier = static_cast<RefQualifierKind>(Record[Idx++]);
6056 SmallVector<QualType, 8> ExceptionStorage;
6057 readExceptionSpec(*Loc.F, ExceptionStorage, EPI.ExceptionSpec, Record, Idx);
6058
6059 unsigned NumParams = Record[Idx++];
6060 SmallVector<QualType, 16> ParamTypes;
6061 for (unsigned I = 0; I != NumParams; ++I)
6062 ParamTypes.push_back(readType(*Loc.F, Record, Idx));
6063
6064 SmallVector<FunctionProtoType::ExtParameterInfo, 4> ExtParameterInfos;
6065 if (Idx != Record.size()) {
6066 for (unsigned I = 0; I != NumParams; ++I)
6067 ExtParameterInfos.push_back(
6068 FunctionProtoType::ExtParameterInfo
6069 ::getFromOpaqueValue(Record[Idx++]));
6070 EPI.ExtParameterInfos = ExtParameterInfos.data();
6071 }
6072
6073 assert(Idx == Record.size())((Idx == Record.size()) ? static_cast<void> (0) : __assert_fail
("Idx == Record.size()", "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 6073, __PRETTY_FUNCTION__))
;
6074
6075 return Context.getFunctionType(ResultType, ParamTypes, EPI);
6076 }
6077
6078 case TYPE_UNRESOLVED_USING: {
6079 unsigned Idx = 0;
6080 return Context.getTypeDeclType(
6081 ReadDeclAs<UnresolvedUsingTypenameDecl>(*Loc.F, Record, Idx));
6082 }
6083
6084 case TYPE_TYPEDEF: {
6085 if (Record.size() != 2) {
6086 Error("incorrect encoding of typedef type");
6087 return QualType();
6088 }
6089 unsigned Idx = 0;
6090 TypedefNameDecl *Decl = ReadDeclAs<TypedefNameDecl>(*Loc.F, Record, Idx);
6091 QualType Canonical = readType(*Loc.F, Record, Idx);
6092 if (!Canonical.isNull())
6093 Canonical = Context.getCanonicalType(Canonical);
6094 return Context.getTypedefType(Decl, Canonical);
6095 }
6096
6097 case TYPE_TYPEOF_EXPR:
6098 return Context.getTypeOfExprType(ReadExpr(*Loc.F));
6099
6100 case TYPE_TYPEOF: {
6101 if (Record.size() != 1) {
6102 Error("incorrect encoding of typeof(type) in AST file");
6103 return QualType();
6104 }
6105 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
6106 return Context.getTypeOfType(UnderlyingType);
6107 }
6108
6109 case TYPE_DECLTYPE: {
6110 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
6111 return Context.getDecltypeType(ReadExpr(*Loc.F), UnderlyingType);
6112 }
6113
6114 case TYPE_UNARY_TRANSFORM: {
6115 QualType BaseType = readType(*Loc.F, Record, Idx);
6116 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
6117 UnaryTransformType::UTTKind UKind = (UnaryTransformType::UTTKind)Record[2];
6118 return Context.getUnaryTransformType(BaseType, UnderlyingType, UKind);
6119 }
6120
6121 case TYPE_AUTO: {
6122 QualType Deduced = readType(*Loc.F, Record, Idx);
6123 AutoTypeKeyword Keyword = (AutoTypeKeyword)Record[Idx++];
6124 bool IsDependent = Deduced.isNull() ? Record[Idx++] : false;
6125 return Context.getAutoType(Deduced, Keyword, IsDependent);
6126 }
6127
6128 case TYPE_DEDUCED_TEMPLATE_SPECIALIZATION: {
6129 TemplateName Name = ReadTemplateName(*Loc.F, Record, Idx);
6130 QualType Deduced = readType(*Loc.F, Record, Idx);
6131 bool IsDependent = Deduced.isNull() ? Record[Idx++] : false;
6132 return Context.getDeducedTemplateSpecializationType(Name, Deduced,
6133 IsDependent);
6134 }
6135
6136 case TYPE_RECORD: {
6137 if (Record.size() != 2) {
6138 Error("incorrect encoding of record type");
6139 return QualType();
6140 }
6141 unsigned Idx = 0;
6142 bool IsDependent = Record[Idx++];
6143 RecordDecl *RD = ReadDeclAs<RecordDecl>(*Loc.F, Record, Idx);
6144 RD = cast_or_null<RecordDecl>(RD->getCanonicalDecl());
6145 QualType T = Context.getRecordType(RD);
6146 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
6147 return T;
6148 }
6149
6150 case TYPE_ENUM: {
6151 if (Record.size() != 2) {
6152 Error("incorrect encoding of enum type");
6153 return QualType();
6154 }
6155 unsigned Idx = 0;
6156 bool IsDependent = Record[Idx++];
6157 QualType T
6158 = Context.getEnumType(ReadDeclAs<EnumDecl>(*Loc.F, Record, Idx));
6159 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
6160 return T;
6161 }
6162
6163 case TYPE_ATTRIBUTED: {
6164 if (Record.size() != 3) {
6165 Error("incorrect encoding of attributed type");
6166 return QualType();
6167 }
6168 QualType modifiedType = readType(*Loc.F, Record, Idx);
6169 QualType equivalentType = readType(*Loc.F, Record, Idx);
6170 AttributedType::Kind kind = static_cast<AttributedType::Kind>(Record[2]);
6171 return Context.getAttributedType(kind, modifiedType, equivalentType);
6172 }
6173
6174 case TYPE_PAREN: {
6175 if (Record.size() != 1) {
6176 Error("incorrect encoding of paren type");
6177 return QualType();
6178 }
6179 QualType InnerType = readType(*Loc.F, Record, Idx);
6180 return Context.getParenType(InnerType);
6181 }
6182
6183 case TYPE_PACK_EXPANSION: {
6184 if (Record.size() != 2) {
6185 Error("incorrect encoding of pack expansion type");
6186 return QualType();
6187 }
6188 QualType Pattern = readType(*Loc.F, Record, Idx);
6189 if (Pattern.isNull())
6190 return QualType();
6191 Optional<unsigned> NumExpansions;
6192 if (Record[1])
6193 NumExpansions = Record[1] - 1;
6194 return Context.getPackExpansionType(Pattern, NumExpansions);
6195 }
6196
6197 case TYPE_ELABORATED: {
6198 unsigned Idx = 0;
6199 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
6200 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
6201 QualType NamedType = readType(*Loc.F, Record, Idx);
6202 TagDecl *OwnedTagDecl = ReadDeclAs<TagDecl>(*Loc.F, Record, Idx);
6203 return Context.getElaboratedType(Keyword, NNS, NamedType, OwnedTagDecl);
6204 }
6205
6206 case TYPE_OBJC_INTERFACE: {
6207 unsigned Idx = 0;
6208 ObjCInterfaceDecl *ItfD
6209 = ReadDeclAs<ObjCInterfaceDecl>(*Loc.F, Record, Idx);
6210 return Context.getObjCInterfaceType(ItfD->getCanonicalDecl());
6211 }
6212
6213 case TYPE_OBJC_TYPE_PARAM: {
6214 unsigned Idx = 0;
6215 ObjCTypeParamDecl *Decl
6216 = ReadDeclAs<ObjCTypeParamDecl>(*Loc.F, Record, Idx);
6217 unsigned NumProtos = Record[Idx++];
6218 SmallVector<ObjCProtocolDecl*, 4> Protos;
6219 for (unsigned I = 0; I != NumProtos; ++I)
6220 Protos.push_back(ReadDeclAs<ObjCProtocolDecl>(*Loc.F, Record, Idx));
6221 return Context.getObjCTypeParamType(Decl, Protos);
6222 }
6223
6224 case TYPE_OBJC_OBJECT: {
6225 unsigned Idx = 0;
6226 QualType Base = readType(*Loc.F, Record, Idx);
6227 unsigned NumTypeArgs = Record[Idx++];
6228 SmallVector<QualType, 4> TypeArgs;
6229 for (unsigned I = 0; I != NumTypeArgs; ++I)
6230 TypeArgs.push_back(readType(*Loc.F, Record, Idx));
6231 unsigned NumProtos = Record[Idx++];
6232 SmallVector<ObjCProtocolDecl*, 4> Protos;
6233 for (unsigned I = 0; I != NumProtos; ++I)
6234 Protos.push_back(ReadDeclAs<ObjCProtocolDecl>(*Loc.F, Record, Idx));
6235 bool IsKindOf = Record[Idx++];
6236 return Context.getObjCObjectType(Base, TypeArgs, Protos, IsKindOf);
6237 }
6238
6239 case TYPE_OBJC_OBJECT_POINTER: {
6240 unsigned Idx = 0;
6241 QualType Pointee = readType(*Loc.F, Record, Idx);
6242 return Context.getObjCObjectPointerType(Pointee);
6243 }
6244
6245 case TYPE_SUBST_TEMPLATE_TYPE_PARM: {
6246 unsigned Idx = 0;
6247 QualType Parm = readType(*Loc.F, Record, Idx);
6248 QualType Replacement = readType(*Loc.F, Record, Idx);
6249 return Context.getSubstTemplateTypeParmType(
6250 cast<TemplateTypeParmType>(Parm),
6251 Context.getCanonicalType(Replacement));
6252 }
6253
6254 case TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK: {
6255 unsigned Idx = 0;
6256 QualType Parm = readType(*Loc.F, Record, Idx);
6257 TemplateArgument ArgPack = ReadTemplateArgument(*Loc.F, Record, Idx);
6258 return Context.getSubstTemplateTypeParmPackType(
6259 cast<TemplateTypeParmType>(Parm),
6260 ArgPack);
6261 }
6262
6263 case TYPE_INJECTED_CLASS_NAME: {
6264 CXXRecordDecl *D = ReadDeclAs<CXXRecordDecl>(*Loc.F, Record, Idx);
6265 QualType TST = readType(*Loc.F, Record, Idx); // probably derivable
6266 // FIXME: ASTContext::getInjectedClassNameType is not currently suitable
6267 // for AST reading, too much interdependencies.
6268 const Type *T = nullptr;
6269 for (auto *DI = D; DI; DI = DI->getPreviousDecl()) {
6270 if (const Type *Existing = DI->getTypeForDecl()) {
6271 T = Existing;
6272 break;
6273 }
6274 }
6275 if (!T) {
6276 T = new (Context, TypeAlignment) InjectedClassNameType(D, TST);
6277 for (auto *DI = D; DI; DI = DI->getPreviousDecl())
6278 DI->setTypeForDecl(T);
6279 }
6280 return QualType(T, 0);
6281 }
6282
6283 case TYPE_TEMPLATE_TYPE_PARM: {
6284 unsigned Idx = 0;
6285 unsigned Depth = Record[Idx++];
6286 unsigned Index = Record[Idx++];
6287 bool Pack = Record[Idx++];
6288 TemplateTypeParmDecl *D
6289 = ReadDeclAs<TemplateTypeParmDecl>(*Loc.F, Record, Idx);
6290 return Context.getTemplateTypeParmType(Depth, Index, Pack, D);
6291 }
6292
6293 case TYPE_DEPENDENT_NAME: {
6294 unsigned Idx = 0;
6295 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
6296 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
6297 const IdentifierInfo *Name = GetIdentifierInfo(*Loc.F, Record, Idx);
6298 QualType Canon = readType(*Loc.F, Record, Idx);
6299 if (!Canon.isNull())
6300 Canon = Context.getCanonicalType(Canon);
6301 return Context.getDependentNameType(Keyword, NNS, Name, Canon);
6302 }
6303
6304 case TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION: {
6305 unsigned Idx = 0;
6306 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
6307 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
6308 const IdentifierInfo *Name = GetIdentifierInfo(*Loc.F, Record, Idx);
6309 unsigned NumArgs = Record[Idx++];
6310 SmallVector<TemplateArgument, 8> Args;
6311 Args.reserve(NumArgs);
6312 while (NumArgs--)
6313 Args.push_back(ReadTemplateArgument(*Loc.F, Record, Idx));
6314 return Context.getDependentTemplateSpecializationType(Keyword, NNS, Name,
6315 Args);
6316 }
6317
6318 case TYPE_DEPENDENT_SIZED_ARRAY: {
6319 unsigned Idx = 0;
6320
6321 // ArrayType
6322 QualType ElementType = readType(*Loc.F, Record, Idx);
6323 ArrayType::ArraySizeModifier ASM
6324 = (ArrayType::ArraySizeModifier)Record[Idx++];
6325 unsigned IndexTypeQuals = Record[Idx++];
6326
6327 // DependentSizedArrayType
6328 Expr *NumElts = ReadExpr(*Loc.F);
6329 SourceRange Brackets = ReadSourceRange(*Loc.F, Record, Idx);
6330
6331 return Context.getDependentSizedArrayType(ElementType, NumElts, ASM,
6332 IndexTypeQuals, Brackets);
6333 }
6334
6335 case TYPE_TEMPLATE_SPECIALIZATION: {
6336 unsigned Idx = 0;
6337 bool IsDependent = Record[Idx++];
6338 TemplateName Name = ReadTemplateName(*Loc.F, Record, Idx);
6339 SmallVector<TemplateArgument, 8> Args;
6340 ReadTemplateArgumentList(Args, *Loc.F, Record, Idx);
6341 QualType Underlying = readType(*Loc.F, Record, Idx);
6342 QualType T;
6343 if (Underlying.isNull())
6344 T = Context.getCanonicalTemplateSpecializationType(Name, Args);
6345 else
6346 T = Context.getTemplateSpecializationType(Name, Args, Underlying);
6347 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
6348 return T;
6349 }
6350
6351 case TYPE_ATOMIC: {
6352 if (Record.size() != 1) {
6353 Error("Incorrect encoding of atomic type");
6354 return QualType();
6355 }
6356 QualType ValueType = readType(*Loc.F, Record, Idx);
6357 return Context.getAtomicType(ValueType);
6358 }
6359
6360 case TYPE_PIPE: {
6361 if (Record.size() != 2) {
6362 Error("Incorrect encoding of pipe type");
6363 return QualType();
6364 }
6365
6366 // Reading the pipe element type.
6367 QualType ElementType = readType(*Loc.F, Record, Idx);
6368 unsigned ReadOnly = Record[1];
6369 return Context.getPipeType(ElementType, ReadOnly);
6370 }
6371
6372 case TYPE_DEPENDENT_SIZED_VECTOR: {
6373 unsigned Idx = 0;
6374 QualType ElementType = readType(*Loc.F, Record, Idx);
6375 Expr *SizeExpr = ReadExpr(*Loc.F);
6376 SourceLocation AttrLoc = ReadSourceLocation(*Loc.F, Record, Idx);
6377 unsigned VecKind = Record[Idx];
6378
6379 return Context.getDependentVectorType(ElementType, SizeExpr, AttrLoc,
6380 (VectorType::VectorKind)VecKind);
6381 }
6382
6383 case TYPE_DEPENDENT_SIZED_EXT_VECTOR: {
6384 unsigned Idx = 0;
6385
6386 // DependentSizedExtVectorType
6387 QualType ElementType = readType(*Loc.F, Record, Idx);
6388 Expr *SizeExpr = ReadExpr(*Loc.F);
6389 SourceLocation AttrLoc = ReadSourceLocation(*Loc.F, Record, Idx);
6390
6391 return Context.getDependentSizedExtVectorType(ElementType, SizeExpr,
6392 AttrLoc);
6393 }
6394
6395 case TYPE_DEPENDENT_ADDRESS_SPACE: {
6396 unsigned Idx = 0;
6397
6398 // DependentAddressSpaceType
6399 QualType PointeeType = readType(*Loc.F, Record, Idx);
6400 Expr *AddrSpaceExpr = ReadExpr(*Loc.F);
6401 SourceLocation AttrLoc = ReadSourceLocation(*Loc.F, Record, Idx);
6402
6403 return Context.getDependentAddressSpaceType(PointeeType, AddrSpaceExpr,
6404 AttrLoc);
6405 }
6406 }
6407 llvm_unreachable("Invalid TypeCode!")::llvm::llvm_unreachable_internal("Invalid TypeCode!", "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 6407)
;
6408}
6409
6410void ASTReader::readExceptionSpec(ModuleFile &ModuleFile,
6411 SmallVectorImpl<QualType> &Exceptions,
6412 FunctionProtoType::ExceptionSpecInfo &ESI,
6413 const RecordData &Record, unsigned &Idx) {
6414 ExceptionSpecificationType EST =
6415 static_cast<ExceptionSpecificationType>(Record[Idx++]);
6416 ESI.Type = EST;
6417 if (EST == EST_Dynamic) {
6418 for (unsigned I = 0, N = Record[Idx++]; I != N; ++I)
6419 Exceptions.push_back(readType(ModuleFile, Record, Idx));
6420 ESI.Exceptions = Exceptions;
6421 } else if (isComputedNoexcept(EST)) {
6422 ESI.NoexceptExpr = ReadExpr(ModuleFile);
6423 } else if (EST == EST_Uninstantiated) {
6424 ESI.SourceDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
6425 ESI.SourceTemplate = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
6426 } else if (EST == EST_Unevaluated) {
6427 ESI.SourceDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
6428 }
6429}
6430
6431namespace clang {
6432
6433class TypeLocReader : public TypeLocVisitor<TypeLocReader> {
6434 ModuleFile *F;
6435 ASTReader *Reader;
6436 const ASTReader::RecordData &Record;
6437 unsigned &Idx;
6438
6439 SourceLocation ReadSourceLocation() {
6440 return Reader->ReadSourceLocation(*F, Record, Idx);
6441 }
6442
6443 TypeSourceInfo *GetTypeSourceInfo() {
6444 return Reader->GetTypeSourceInfo(*F, Record, Idx);
6445 }
6446
6447 NestedNameSpecifierLoc ReadNestedNameSpecifierLoc() {
6448 return Reader->ReadNestedNameSpecifierLoc(*F, Record, Idx);
6449 }
6450
6451 Attr *ReadAttr() {
6452 return Reader->ReadAttr(*F, Record, Idx);
6453 }
6454
6455public:
6456 TypeLocReader(ModuleFile &F, ASTReader &Reader,
6457 const ASTReader::RecordData &Record, unsigned &Idx)
6458 : F(&F), Reader(&Reader), Record(Record), Idx(Idx) {}
6459
6460 // We want compile-time assurance that we've enumerated all of
6461 // these, so unfortunately we have to declare them first, then
6462 // define them out-of-line.
6463#define ABSTRACT_TYPELOC(CLASS, PARENT)
6464#define TYPELOC(CLASS, PARENT) \
6465 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
6466#include "clang/AST/TypeLocNodes.def"
6467
6468 void VisitFunctionTypeLoc(FunctionTypeLoc);
6469 void VisitArrayTypeLoc(ArrayTypeLoc);
6470};
6471
6472} // namespace clang
6473
6474void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
6475 // nothing to do
6476}
6477
6478void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
6479 TL.setBuiltinLoc(ReadSourceLocation());
6480 if (TL.needsExtraLocalData()) {
6481 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Record[Idx++]));
6482 TL.setWrittenSignSpec(static_cast<DeclSpec::TSS>(Record[Idx++]));
6483 TL.setWrittenWidthSpec(static_cast<DeclSpec::TSW>(Record[Idx++]));
6484 TL.setModeAttr(Record[Idx++]);
6485 }
6486}
6487
6488void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
6489 TL.setNameLoc(ReadSourceLocation());
6490}
6491
6492void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
6493 TL.setStarLoc(ReadSourceLocation());
6494}
6495
6496void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
6497 // nothing to do
6498}
6499
6500void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
6501 // nothing to do
6502}
6503
6504void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
6505 TL.setCaretLoc(ReadSourceLocation());
6506}
6507
6508void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
6509 TL.setAmpLoc(ReadSourceLocation());
6510}
6511
6512void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
6513 TL.setAmpAmpLoc(ReadSourceLocation());
6514}
6515
6516void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
6517 TL.setStarLoc(ReadSourceLocation());
6518 TL.setClassTInfo(GetTypeSourceInfo());
6519}
6520
6521void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) {
6522 TL.setLBracketLoc(ReadSourceLocation());
6523 TL.setRBracketLoc(ReadSourceLocation());
6524 if (Record[Idx++])
6525 TL.setSizeExpr(Reader->ReadExpr(*F));
6526 else
6527 TL.setSizeExpr(nullptr);
6528}
6529
6530void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) {
6531 VisitArrayTypeLoc(TL);
6532}
6533
6534void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) {
6535 VisitArrayTypeLoc(TL);
6536}
6537
6538void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
6539 VisitArrayTypeLoc(TL);
6540}
6541
6542void TypeLocReader::VisitDependentSizedArrayTypeLoc(
6543 DependentSizedArrayTypeLoc TL) {
6544 VisitArrayTypeLoc(TL);
6545}
6546
6547void TypeLocReader::VisitDependentAddressSpaceTypeLoc(
6548 DependentAddressSpaceTypeLoc TL) {
6549
6550 TL.setAttrNameLoc(ReadSourceLocation());
6551 SourceRange range;
6552 range.setBegin(ReadSourceLocation());
6553 range.setEnd(ReadSourceLocation());
6554 TL.setAttrOperandParensRange(range);
6555 TL.setAttrExprOperand(Reader->ReadExpr(*F));
6556}
6557
6558void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
6559 DependentSizedExtVectorTypeLoc TL) {
6560 TL.setNameLoc(ReadSourceLocation());
6561}
6562
6563void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
6564 TL.setNameLoc(ReadSourceLocation());
6565}
6566
6567void TypeLocReader::VisitDependentVectorTypeLoc(
6568 DependentVectorTypeLoc TL) {
6569 TL.setNameLoc(ReadSourceLocation());
6570}
6571
6572void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
6573 TL.setNameLoc(ReadSourceLocation());
6574}
6575
6576void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) {
6577 TL.setLocalRangeBegin(ReadSourceLocation());
6578 TL.setLParenLoc(ReadSourceLocation());
6579 TL.setRParenLoc(ReadSourceLocation());
6580 TL.setExceptionSpecRange(SourceRange(Reader->ReadSourceLocation(*F, Record, Idx),
6581 Reader->ReadSourceLocation(*F, Record, Idx)));
6582 TL.setLocalRangeEnd(ReadSourceLocation());
6583 for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) {
6584 TL.setParam(i, Reader->ReadDeclAs<ParmVarDecl>(*F, Record, Idx));
6585 }
6586}
6587
6588void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) {
6589 VisitFunctionTypeLoc(TL);
6590}
6591
6592void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) {
6593 VisitFunctionTypeLoc(TL);
6594}
6595
6596void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
6597 TL.setNameLoc(ReadSourceLocation());
6598}
6599
6600void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
6601 TL.setNameLoc(ReadSourceLocation());
6602}
6603
6604void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
6605 TL.setTypeofLoc(ReadSourceLocation());
6606 TL.setLParenLoc(ReadSourceLocation());
6607 TL.setRParenLoc(ReadSourceLocation());
6608}
6609
6610void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
6611 TL.setTypeofLoc(ReadSourceLocation());
6612 TL.setLParenLoc(ReadSourceLocation());
6613 TL.setRParenLoc(ReadSourceLocation());
6614 TL.setUnderlyingTInfo(GetTypeSourceInfo());
6615}
6616
6617void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
6618 TL.setNameLoc(ReadSourceLocation());
6619}
6620
6621void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
6622 TL.setKWLoc(ReadSourceLocation());
6623 TL.setLParenLoc(ReadSourceLocation());
6624 TL.setRParenLoc(ReadSourceLocation());
6625 TL.setUnderlyingTInfo(GetTypeSourceInfo());
6626}
6627
6628void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) {
6629 TL.setNameLoc(ReadSourceLocation());
6630}
6631
6632void TypeLocReader::VisitDeducedTemplateSpecializationTypeLoc(
6633 DeducedTemplateSpecializationTypeLoc TL) {
6634 TL.setTemplateNameLoc(ReadSourceLocation());
6635}
6636
6637void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) {
6638 TL.setNameLoc(ReadSourceLocation());
6639}
6640
6641void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) {
6642 TL.setNameLoc(ReadSourceLocation());
6643}
6644
6645void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
6646 TL.setAttr(ReadAttr());
6647}
6648
6649void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
6650 TL.setNameLoc(ReadSourceLocation());
6651}
6652
6653void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
6654 SubstTemplateTypeParmTypeLoc TL) {
6655 TL.setNameLoc(ReadSourceLocation());
6656}
6657
6658void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
6659 SubstTemplateTypeParmPackTypeLoc TL) {
6660 TL.setNameLoc(ReadSourceLocation());
6661}
6662
6663void TypeLocReader::VisitTemplateSpecializationTypeLoc(
6664 TemplateSpecializationTypeLoc TL) {
6665 TL.setTemplateKeywordLoc(ReadSourceLocation());
6666 TL.setTemplateNameLoc(ReadSourceLocation());
6667 TL.setLAngleLoc(ReadSourceLocation());
6668 TL.setRAngleLoc(ReadSourceLocation());
6669 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i)
6670 TL.setArgLocInfo(
6671 i,
6672 Reader->GetTemplateArgumentLocInfo(
6673 *F, TL.getTypePtr()->getArg(i).getKind(), Record, Idx));
6674}
6675
6676void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
6677 TL.setLParenLoc(ReadSourceLocation());
6678 TL.setRParenLoc(ReadSourceLocation());
6679}
6680
6681void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
6682 TL.setElaboratedKeywordLoc(ReadSourceLocation());
6683 TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
6684}
6685
6686void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
6687 TL.setNameLoc(ReadSourceLocation());
6688}
6689
6690void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
6691 TL.setElaboratedKeywordLoc(ReadSourceLocation());
6692 TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
6693 TL.setNameLoc(ReadSourceLocation());
6694}
6695
6696void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc(
6697 DependentTemplateSpecializationTypeLoc TL) {
6698 TL.setElaboratedKeywordLoc(ReadSourceLocation());
6699 TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
6700 TL.setTemplateKeywordLoc(ReadSourceLocation());
6701 TL.setTemplateNameLoc(ReadSourceLocation());
6702 TL.setLAngleLoc(ReadSourceLocation());
6703 TL.setRAngleLoc(ReadSourceLocation());
6704 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
6705 TL.setArgLocInfo(
6706 I,
6707 Reader->GetTemplateArgumentLocInfo(
6708 *F, TL.getTypePtr()->getArg(I).getKind(), Record, Idx));
6709}
6710
6711void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
6712 TL.setEllipsisLoc(ReadSourceLocation());
6713}
6714
6715void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
6716 TL.setNameLoc(ReadSourceLocation());
6717}
6718
6719void TypeLocReader::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) {
6720 if (TL.getNumProtocols()) {
6721 TL.setProtocolLAngleLoc(ReadSourceLocation());
6722 TL.setProtocolRAngleLoc(ReadSourceLocation());
6723 }
6724 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
6725 TL.setProtocolLoc(i, ReadSourceLocation());
6726}
6727
6728void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
6729 TL.setHasBaseTypeAsWritten(Record[Idx++]);
6730 TL.setTypeArgsLAngleLoc(ReadSourceLocation());
6731 TL.setTypeArgsRAngleLoc(ReadSourceLocation());
6732 for (unsigned i = 0, e = TL.getNumTypeArgs(); i != e; ++i)
6733 TL.setTypeArgTInfo(i, GetTypeSourceInfo());
6734 TL.setProtocolLAngleLoc(ReadSourceLocation());
6735 TL.setProtocolRAngleLoc(ReadSourceLocation());
6736 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
6737 TL.setProtocolLoc(i, ReadSourceLocation());
6738}
6739
6740void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
6741 TL.setStarLoc(ReadSourceLocation());
6742}
6743
6744void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
6745 TL.setKWLoc(ReadSourceLocation());
6746 TL.setLParenLoc(ReadSourceLocation());
6747 TL.setRParenLoc(ReadSourceLocation());
6748}
6749
6750void TypeLocReader::VisitPipeTypeLoc(PipeTypeLoc TL) {
6751 TL.setKWLoc(ReadSourceLocation());
6752}
6753
6754void ASTReader::ReadTypeLoc(ModuleFile &F, const ASTReader::RecordData &Record,
6755 unsigned &Idx, TypeLoc TL) {
6756 TypeLocReader TLR(F, *this, Record, Idx);
6757 for (; !TL.isNull(); TL = TL.getNextTypeLoc())
6758 TLR.Visit(TL);
6759}
6760
6761TypeSourceInfo *
6762ASTReader::GetTypeSourceInfo(ModuleFile &F, const ASTReader::RecordData &Record,
6763 unsigned &Idx) {
6764 QualType InfoTy = readType(F, Record, Idx);
6765 if (InfoTy.isNull())
6766 return nullptr;
6767
6768 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy);
6769 ReadTypeLoc(F, Record, Idx, TInfo->getTypeLoc());
6770 return TInfo;
6771}
6772
6773QualType ASTReader::GetType(TypeID ID) {
6774 assert(ContextObj && "reading type with no AST context")((ContextObj && "reading type with no AST context") ?
static_cast<void> (0) : __assert_fail ("ContextObj && \"reading type with no AST context\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 6774, __PRETTY_FUNCTION__))
;
6775 ASTContext &Context = *ContextObj;
6776
6777 unsigned FastQuals = ID & Qualifiers::FastMask;
6778 unsigned Index = ID >> Qualifiers::FastWidth;
6779
6780 if (Index < NUM_PREDEF_TYPE_IDS) {
6781 QualType T;
6782 switch ((PredefinedTypeIDs)Index) {
6783 case PREDEF_TYPE_NULL_ID:
6784 return QualType();
6785 case PREDEF_TYPE_VOID_ID:
6786 T = Context.VoidTy;
6787 break;
6788 case PREDEF_TYPE_BOOL_ID:
6789 T = Context.BoolTy;
6790 break;
6791 case PREDEF_TYPE_CHAR_U_ID:
6792 case PREDEF_TYPE_CHAR_S_ID:
6793 // FIXME: Check that the signedness of CharTy is correct!
6794 T = Context.CharTy;
6795 break;
6796 case PREDEF_TYPE_UCHAR_ID:
6797 T = Context.UnsignedCharTy;
6798 break;
6799 case PREDEF_TYPE_USHORT_ID:
6800 T = Context.UnsignedShortTy;
6801 break;
6802 case PREDEF_TYPE_UINT_ID:
6803 T = Context.UnsignedIntTy;
6804 break;
6805 case PREDEF_TYPE_ULONG_ID:
6806 T = Context.UnsignedLongTy;
6807 break;
6808 case PREDEF_TYPE_ULONGLONG_ID:
6809 T = Context.UnsignedLongLongTy;
6810 break;
6811 case PREDEF_TYPE_UINT128_ID:
6812 T = Context.UnsignedInt128Ty;
6813 break;
6814 case PREDEF_TYPE_SCHAR_ID:
6815 T = Context.SignedCharTy;
6816 break;
6817 case PREDEF_TYPE_WCHAR_ID:
6818 T = Context.WCharTy;
6819 break;
6820 case PREDEF_TYPE_SHORT_ID:
6821 T = Context.ShortTy;
6822 break;
6823 case PREDEF_TYPE_INT_ID:
6824 T = Context.IntTy;
6825 break;
6826 case PREDEF_TYPE_LONG_ID:
6827 T = Context.LongTy;
6828 break;
6829 case PREDEF_TYPE_LONGLONG_ID:
6830 T = Context.LongLongTy;
6831 break;
6832 case PREDEF_TYPE_INT128_ID:
6833 T = Context.Int128Ty;
6834 break;
6835 case PREDEF_TYPE_HALF_ID:
6836 T = Context.HalfTy;
6837 break;
6838 case PREDEF_TYPE_FLOAT_ID:
6839 T = Context.FloatTy;
6840 break;
6841 case PREDEF_TYPE_DOUBLE_ID:
6842 T = Context.DoubleTy;
6843 break;
6844 case PREDEF_TYPE_LONGDOUBLE_ID:
6845 T = Context.LongDoubleTy;
6846 break;
6847 case PREDEF_TYPE_SHORT_ACCUM_ID:
6848 T = Context.ShortAccumTy;
6849 break;
6850 case PREDEF_TYPE_ACCUM_ID:
6851 T = Context.AccumTy;
6852 break;
6853 case PREDEF_TYPE_LONG_ACCUM_ID:
6854 T = Context.LongAccumTy;
6855 break;
6856 case PREDEF_TYPE_USHORT_ACCUM_ID:
6857 T = Context.UnsignedShortAccumTy;
6858 break;
6859 case PREDEF_TYPE_UACCUM_ID:
6860 T = Context.UnsignedAccumTy;
6861 break;
6862 case PREDEF_TYPE_ULONG_ACCUM_ID:
6863 T = Context.UnsignedLongAccumTy;
6864 break;
6865 case PREDEF_TYPE_SHORT_FRACT_ID:
6866 T = Context.ShortFractTy;
6867 break;
6868 case PREDEF_TYPE_FRACT_ID:
6869 T = Context.FractTy;
6870 break;
6871 case PREDEF_TYPE_LONG_FRACT_ID:
6872 T = Context.LongFractTy;
6873 break;
6874 case PREDEF_TYPE_USHORT_FRACT_ID:
6875 T = Context.UnsignedShortFractTy;
6876 break;
6877 case PREDEF_TYPE_UFRACT_ID:
6878 T = Context.UnsignedFractTy;
6879 break;
6880 case PREDEF_TYPE_ULONG_FRACT_ID:
6881 T = Context.UnsignedLongFractTy;
6882 break;
6883 case PREDEF_TYPE_SAT_SHORT_ACCUM_ID:
6884 T = Context.SatShortAccumTy;
6885 break;
6886 case PREDEF_TYPE_SAT_ACCUM_ID:
6887 T = Context.SatAccumTy;
6888 break;
6889 case PREDEF_TYPE_SAT_LONG_ACCUM_ID:
6890 T = Context.SatLongAccumTy;
6891 break;
6892 case PREDEF_TYPE_SAT_USHORT_ACCUM_ID:
6893 T = Context.SatUnsignedShortAccumTy;
6894 break;
6895 case PREDEF_TYPE_SAT_UACCUM_ID:
6896 T = Context.SatUnsignedAccumTy;
6897 break;
6898 case PREDEF_TYPE_SAT_ULONG_ACCUM_ID:
6899 T = Context.SatUnsignedLongAccumTy;
6900 break;
6901 case PREDEF_TYPE_SAT_SHORT_FRACT_ID:
6902 T = Context.SatShortFractTy;
6903 break;
6904 case PREDEF_TYPE_SAT_FRACT_ID:
6905 T = Context.SatFractTy;
6906 break;
6907 case PREDEF_TYPE_SAT_LONG_FRACT_ID:
6908 T = Context.SatLongFractTy;
6909 break;
6910 case PREDEF_TYPE_SAT_USHORT_FRACT_ID:
6911 T = Context.SatUnsignedShortFractTy;
6912 break;
6913 case PREDEF_TYPE_SAT_UFRACT_ID:
6914 T = Context.SatUnsignedFractTy;
6915 break;
6916 case PREDEF_TYPE_SAT_ULONG_FRACT_ID:
6917 T = Context.SatUnsignedLongFractTy;
6918 break;
6919 case PREDEF_TYPE_FLOAT16_ID:
6920 T = Context.Float16Ty;
6921 break;
6922 case PREDEF_TYPE_FLOAT128_ID:
6923 T = Context.Float128Ty;
6924 break;
6925 case PREDEF_TYPE_OVERLOAD_ID:
6926 T = Context.OverloadTy;
6927 break;
6928 case PREDEF_TYPE_BOUND_MEMBER:
6929 T = Context.BoundMemberTy;
6930 break;
6931 case PREDEF_TYPE_PSEUDO_OBJECT:
6932 T = Context.PseudoObjectTy;
6933 break;
6934 case PREDEF_TYPE_DEPENDENT_ID:
6935 T = Context.DependentTy;
6936 break;
6937 case PREDEF_TYPE_UNKNOWN_ANY:
6938 T = Context.UnknownAnyTy;
6939 break;
6940 case PREDEF_TYPE_NULLPTR_ID:
6941 T = Context.NullPtrTy;
6942 break;
6943 case PREDEF_TYPE_CHAR8_ID:
6944 T = Context.Char8Ty;
6945 break;
6946 case PREDEF_TYPE_CHAR16_ID:
6947 T = Context.Char16Ty;
6948 break;
6949 case PREDEF_TYPE_CHAR32_ID:
6950 T = Context.Char32Ty;
6951 break;
6952 case PREDEF_TYPE_OBJC_ID:
6953 T = Context.ObjCBuiltinIdTy;
6954 break;
6955 case PREDEF_TYPE_OBJC_CLASS:
6956 T = Context.ObjCBuiltinClassTy;
6957 break;
6958 case PREDEF_TYPE_OBJC_SEL:
6959 T = Context.ObjCBuiltinSelTy;
6960 break;
6961#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
6962 case PREDEF_TYPE_##Id##_ID: \
6963 T = Context.SingletonId; \
6964 break;
6965#include "clang/Basic/OpenCLImageTypes.def"
6966 case PREDEF_TYPE_SAMPLER_ID:
6967 T = Context.OCLSamplerTy;
6968 break;
6969 case PREDEF_TYPE_EVENT_ID:
6970 T = Context.OCLEventTy;
6971 break;
6972 case PREDEF_TYPE_CLK_EVENT_ID:
6973 T = Context.OCLClkEventTy;
6974 break;
6975 case PREDEF_TYPE_QUEUE_ID:
6976 T = Context.OCLQueueTy;
6977 break;
6978 case PREDEF_TYPE_RESERVE_ID_ID:
6979 T = Context.OCLReserveIDTy;
6980 break;
6981 case PREDEF_TYPE_AUTO_DEDUCT:
6982 T = Context.getAutoDeductType();
6983 break;
6984 case PREDEF_TYPE_AUTO_RREF_DEDUCT:
6985 T = Context.getAutoRRefDeductType();
6986 break;
6987 case PREDEF_TYPE_ARC_UNBRIDGED_CAST:
6988 T = Context.ARCUnbridgedCastTy;
6989 break;
6990 case PREDEF_TYPE_BUILTIN_FN:
6991 T = Context.BuiltinFnTy;
6992 break;
6993 case PREDEF_TYPE_OMP_ARRAY_SECTION:
6994 T = Context.OMPArraySectionTy;
6995 break;
6996 }
6997
6998 assert(!T.isNull() && "Unknown predefined type")((!T.isNull() && "Unknown predefined type") ? static_cast
<void> (0) : __assert_fail ("!T.isNull() && \"Unknown predefined type\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 6998, __PRETTY_FUNCTION__))
;
6999 return T.withFastQualifiers(FastQuals);
7000 }
7001
7002 Index -= NUM_PREDEF_TYPE_IDS;
7003 assert(Index < TypesLoaded.size() && "Type index out-of-range")((Index < TypesLoaded.size() && "Type index out-of-range"
) ? static_cast<void> (0) : __assert_fail ("Index < TypesLoaded.size() && \"Type index out-of-range\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 7003, __PRETTY_FUNCTION__))
;
7004 if (TypesLoaded[Index].isNull()) {
7005 TypesLoaded[Index] = readTypeRecord(Index);
7006 if (TypesLoaded[Index].isNull())
7007 return QualType();
7008
7009 TypesLoaded[Index]->setFromAST();
7010 if (DeserializationListener)
7011 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID),
7012 TypesLoaded[Index]);
7013 }
7014
7015 return TypesLoaded[Index].withFastQualifiers(FastQuals);
7016}
7017
7018QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) {
7019 return GetType(getGlobalTypeID(F, LocalID));
7020}
7021
7022serialization::TypeID
7023ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const {
7024 unsigned FastQuals = LocalID & Qualifiers::FastMask;
7025 unsigned LocalIndex = LocalID >> Qualifiers::FastWidth;
7026
7027 if (LocalIndex < NUM_PREDEF_TYPE_IDS)
7028 return LocalID;
7029
7030 if (!F.ModuleOffsetMap.empty())
7031 ReadModuleOffsetMap(F);
7032
7033 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7034 = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS);
7035 assert(I != F.TypeRemap.end() && "Invalid index into type index remap")((I != F.TypeRemap.end() && "Invalid index into type index remap"
) ? static_cast<void> (0) : __assert_fail ("I != F.TypeRemap.end() && \"Invalid index into type index remap\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 7035, __PRETTY_FUNCTION__))
;
7036
7037 unsigned GlobalIndex = LocalIndex + I->second;
7038 return (GlobalIndex << Qualifiers::FastWidth) | FastQuals;
7039}
7040
7041TemplateArgumentLocInfo
7042ASTReader::GetTemplateArgumentLocInfo(ModuleFile &F,
7043 TemplateArgument::ArgKind Kind,
7044 const RecordData &Record,
7045 unsigned &Index) {
7046 switch (Kind) {
7047 case TemplateArgument::Expression:
7048 return ReadExpr(F);
7049 case TemplateArgument::Type:
7050 return GetTypeSourceInfo(F, Record, Index);
7051 case TemplateArgument::Template: {
7052 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
7053 Index);
7054 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
7055 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
7056 SourceLocation());
7057 }
7058 case TemplateArgument::TemplateExpansion: {
7059 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
7060 Index);
7061 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
7062 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Index);
7063 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
7064 EllipsisLoc);
7065 }
7066 case TemplateArgument::Null:
7067 case TemplateArgument::Integral:
7068 case TemplateArgument::Declaration:
7069 case TemplateArgument::NullPtr:
7070 case TemplateArgument::Pack:
7071 // FIXME: Is this right?
7072 return TemplateArgumentLocInfo();
7073 }
7074 llvm_unreachable("unexpected template argument loc")::llvm::llvm_unreachable_internal("unexpected template argument loc"
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 7074)
;
7075}
7076
7077TemplateArgumentLoc
7078ASTReader::ReadTemplateArgumentLoc(ModuleFile &F,
7079 const RecordData &Record, unsigned &Index) {
7080 TemplateArgument Arg = ReadTemplateArgument(F, Record, Index);
7081
7082 if (Arg.getKind() == TemplateArgument::Expression) {
7083 if (Record[Index++]) // bool InfoHasSameExpr.
7084 return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr()));
7085 }
7086 return TemplateArgumentLoc(Arg, GetTemplateArgumentLocInfo(F, Arg.getKind(),
7087 Record, Index));
7088}
7089
7090const ASTTemplateArgumentListInfo*
7091ASTReader::ReadASTTemplateArgumentListInfo(ModuleFile &F,
7092 const RecordData &Record,
7093 unsigned &Index) {
7094 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Index);
7095 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Index);
7096 unsigned NumArgsAsWritten = Record[Index++];
7097 TemplateArgumentListInfo TemplArgsInfo(LAngleLoc, RAngleLoc);
7098 for (unsigned i = 0; i != NumArgsAsWritten; ++i)
7099 TemplArgsInfo.addArgument(ReadTemplateArgumentLoc(F, Record, Index));
7100 return ASTTemplateArgumentListInfo::Create(getContext(), TemplArgsInfo);
7101}
7102
7103Decl *ASTReader::GetExternalDecl(uint32_t ID) {
7104 return GetDecl(ID);
7105}
7106
7107void ASTReader::CompleteRedeclChain(const Decl *D) {
7108 if (NumCurrentElementsDeserializing) {
7109 // We arrange to not care about the complete redeclaration chain while we're
7110 // deserializing. Just remember that the AST has marked this one as complete
7111 // but that it's not actually complete yet, so we know we still need to
7112 // complete it later.
7113 PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D));
7114 return;
7115 }
7116
7117 const DeclContext *DC = D->getDeclContext()->getRedeclContext();
7118
7119 // If this is a named declaration, complete it by looking it up
7120 // within its context.
7121 //
7122 // FIXME: Merging a function definition should merge
7123 // all mergeable entities within it.
7124 if (isa<TranslationUnitDecl>(DC) || isa<NamespaceDecl>(DC) ||
7125 isa<CXXRecordDecl>(DC) || isa<EnumDecl>(DC)) {
7126 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) {
7127 if (!getContext().getLangOpts().CPlusPlus &&
7128 isa<TranslationUnitDecl>(DC)) {
7129 // Outside of C++, we don't have a lookup table for the TU, so update
7130 // the identifier instead. (For C++ modules, we don't store decls
7131 // in the serialized identifier table, so we do the lookup in the TU.)
7132 auto *II = Name.getAsIdentifierInfo();
7133 assert(II && "non-identifier name in C?")((II && "non-identifier name in C?") ? static_cast<
void> (0) : __assert_fail ("II && \"non-identifier name in C?\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 7133, __PRETTY_FUNCTION__))
;
7134 if (II->isOutOfDate())
7135 updateOutOfDateIdentifier(*II);
7136 } else
7137 DC->lookup(Name);
7138 } else if (needsAnonymousDeclarationNumber(cast<NamedDecl>(D))) {
7139 // Find all declarations of this kind from the relevant context.
7140 for (auto *DCDecl : cast<Decl>(D->getLexicalDeclContext())->redecls()) {
7141 auto *DC = cast<DeclContext>(DCDecl);
7142 SmallVector<Decl*, 8> Decls;
7143 FindExternalLexicalDecls(
7144 DC, [&](Decl::Kind K) { return K == D->getKind(); }, Decls);
7145 }
7146 }
7147 }
7148
7149 if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D))
7150 CTSD->getSpecializedTemplate()->LoadLazySpecializations();
7151 if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D))
7152 VTSD->getSpecializedTemplate()->LoadLazySpecializations();
7153 if (auto *FD = dyn_cast<FunctionDecl>(D)) {
7154 if (auto *Template = FD->getPrimaryTemplate())
7155 Template->LoadLazySpecializations();
7156 }
7157}
7158
7159CXXCtorInitializer **
7160ASTReader::GetExternalCXXCtorInitializers(uint64_t Offset) {
7161 RecordLocation Loc = getLocalBitOffset(Offset);
7162 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
7163 SavedStreamPosition SavedPosition(Cursor);
7164 Cursor.JumpToBit(Loc.Offset);
7165 ReadingKindTracker ReadingKind(Read_Decl, *this);
7166
7167 RecordData Record;
7168 unsigned Code = Cursor.ReadCode();
7169 unsigned RecCode = Cursor.readRecord(Code, Record);
7170 if (RecCode != DECL_CXX_CTOR_INITIALIZERS) {
7171 Error("malformed AST file: missing C++ ctor initializers");
7172 return nullptr;
7173 }
7174
7175 unsigned Idx = 0;
7176 return ReadCXXCtorInitializers(*Loc.F, Record, Idx);
7177}
7178
7179CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) {
7180 assert(ContextObj && "reading base specifiers with no AST context")((ContextObj && "reading base specifiers with no AST context"
) ? static_cast<void> (0) : __assert_fail ("ContextObj && \"reading base specifiers with no AST context\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 7180, __PRETTY_FUNCTION__))
;
7181 ASTContext &Context = *ContextObj;
7182
7183 RecordLocation Loc = getLocalBitOffset(Offset);
7184 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
7185 SavedStreamPosition SavedPosition(Cursor);
7186 Cursor.JumpToBit(Loc.Offset);
7187 ReadingKindTracker ReadingKind(Read_Decl, *this);
7188 RecordData Record;
7189 unsigned Code = Cursor.ReadCode();
7190 unsigned RecCode = Cursor.readRecord(Code, Record);
7191 if (RecCode != DECL_CXX_BASE_SPECIFIERS) {
7192 Error("malformed AST file: missing C++ base specifiers");
7193 return nullptr;
7194 }
7195
7196 unsigned Idx = 0;
7197 unsigned NumBases = Record[Idx++];
7198 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases);
7199 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases];
7200 for (unsigned I = 0; I != NumBases; ++I)
7201 Bases[I] = ReadCXXBaseSpecifier(*Loc.F, Record, Idx);
7202 return Bases;
7203}
7204
7205serialization::DeclID
7206ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const {
7207 if (LocalID < NUM_PREDEF_DECL_IDS)
7208 return LocalID;
7209
7210 if (!F.ModuleOffsetMap.empty())
7211 ReadModuleOffsetMap(F);
7212
7213 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7214 = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS);
7215 assert(I != F.DeclRemap.end() && "Invalid index into decl index remap")((I != F.DeclRemap.end() && "Invalid index into decl index remap"
) ? static_cast<void> (0) : __assert_fail ("I != F.DeclRemap.end() && \"Invalid index into decl index remap\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 7215, __PRETTY_FUNCTION__))
;
7216
7217 return LocalID + I->second;
7218}
7219
7220bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID,
7221 ModuleFile &M) const {
7222 // Predefined decls aren't from any module.
7223 if (ID < NUM_PREDEF_DECL_IDS)
7224 return false;
7225
7226 return ID - NUM_PREDEF_DECL_IDS >= M.BaseDeclID &&
7227 ID - NUM_PREDEF_DECL_IDS < M.BaseDeclID + M.LocalNumDecls;
7228}
7229
7230ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) {
7231 if (!D->isFromASTFile())
7232 return nullptr;
7233 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID());
7234 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map")((I != GlobalDeclMap.end() && "Corrupted global declaration map"
) ? static_cast<void> (0) : __assert_fail ("I != GlobalDeclMap.end() && \"Corrupted global declaration map\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 7234, __PRETTY_FUNCTION__))
;
7235 return I->second;
7236}
7237
7238SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) {
7239 if (ID < NUM_PREDEF_DECL_IDS)
7240 return SourceLocation();
7241
7242 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
7243
7244 if (Index > DeclsLoaded.size()) {
7245 Error("declaration ID out-of-range for AST file");
7246 return SourceLocation();
7247 }
7248
7249 if (Decl *D = DeclsLoaded[Index])
7250 return D->getLocation();
7251
7252 SourceLocation Loc;
7253 DeclCursorForID(ID, Loc);
7254 return Loc;
7255}
7256
7257static Decl *getPredefinedDecl(ASTContext &Context, PredefinedDeclIDs ID) {
7258 switch (ID) {
7259 case PREDEF_DECL_NULL_ID:
7260 return nullptr;
7261
7262 case PREDEF_DECL_TRANSLATION_UNIT_ID:
7263 return Context.getTranslationUnitDecl();
7264
7265 case PREDEF_DECL_OBJC_ID_ID:
7266 return Context.getObjCIdDecl();
7267
7268 case PREDEF_DECL_OBJC_SEL_ID:
7269 return Context.getObjCSelDecl();
7270
7271 case PREDEF_DECL_OBJC_CLASS_ID:
7272 return Context.getObjCClassDecl();
7273
7274 case PREDEF_DECL_OBJC_PROTOCOL_ID:
7275 return Context.getObjCProtocolDecl();
7276
7277 case PREDEF_DECL_INT_128_ID:
7278 return Context.getInt128Decl();
7279
7280 case PREDEF_DECL_UNSIGNED_INT_128_ID:
7281 return Context.getUInt128Decl();
7282
7283 case PREDEF_DECL_OBJC_INSTANCETYPE_ID:
7284 return Context.getObjCInstanceTypeDecl();
7285
7286 case PREDEF_DECL_BUILTIN_VA_LIST_ID:
7287 return Context.getBuiltinVaListDecl();
7288
7289 case PREDEF_DECL_VA_LIST_TAG:
7290 return Context.getVaListTagDecl();
7291
7292 case PREDEF_DECL_BUILTIN_MS_VA_LIST_ID:
7293 return Context.getBuiltinMSVaListDecl();
7294
7295 case PREDEF_DECL_EXTERN_C_CONTEXT_ID:
7296 return Context.getExternCContextDecl();
7297
7298 case PREDEF_DECL_MAKE_INTEGER_SEQ_ID:
7299 return Context.getMakeIntegerSeqDecl();
7300
7301 case PREDEF_DECL_CF_CONSTANT_STRING_ID:
7302 return Context.getCFConstantStringDecl();
7303
7304 case PREDEF_DECL_CF_CONSTANT_STRING_TAG_ID:
7305 return Context.getCFConstantStringTagDecl();
7306
7307 case PREDEF_DECL_TYPE_PACK_ELEMENT_ID:
7308 return Context.getTypePackElementDecl();
7309 }
7310 llvm_unreachable("PredefinedDeclIDs unknown enum value")::llvm::llvm_unreachable_internal("PredefinedDeclIDs unknown enum value"
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 7310)
;
7311}
7312
7313Decl *ASTReader::GetExistingDecl(DeclID ID) {
7314 assert(ContextObj && "reading decl with no AST context")((ContextObj && "reading decl with no AST context") ?
static_cast<void> (0) : __assert_fail ("ContextObj && \"reading decl with no AST context\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 7314, __PRETTY_FUNCTION__))
;
7315 if (ID < NUM_PREDEF_DECL_IDS) {
7316 Decl *D = getPredefinedDecl(*ContextObj, (PredefinedDeclIDs)ID);
7317 if (D) {
7318 // Track that we have merged the declaration with ID \p ID into the
7319 // pre-existing predefined declaration \p D.
7320 auto &Merged = KeyDecls[D->getCanonicalDecl()];
7321 if (Merged.empty())
7322 Merged.push_back(ID);
7323 }
7324 return D;
7325 }
7326
7327 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
7328
7329 if (Index >= DeclsLoaded.size()) {
7330 assert(0 && "declaration ID out-of-range for AST file")((0 && "declaration ID out-of-range for AST file") ? static_cast
<void> (0) : __assert_fail ("0 && \"declaration ID out-of-range for AST file\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 7330, __PRETTY_FUNCTION__))
;
7331 Error("declaration ID out-of-range for AST file");
7332 return nullptr;
7333 }
7334
7335 return DeclsLoaded[Index];
7336}
7337
7338Decl *ASTReader::GetDecl(DeclID ID) {
7339 if (ID < NUM_PREDEF_DECL_IDS)
7340 return GetExistingDecl(ID);
7341
7342 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
7343
7344 if (Index >= DeclsLoaded.size()) {
7345 assert(0 && "declaration ID out-of-range for AST file")((0 && "declaration ID out-of-range for AST file") ? static_cast
<void> (0) : __assert_fail ("0 && \"declaration ID out-of-range for AST file\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 7345, __PRETTY_FUNCTION__))
;
7346 Error("declaration ID out-of-range for AST file");
7347 return nullptr;
7348 }
7349
7350 if (!DeclsLoaded[Index]) {
7351 ReadDeclRecord(ID);
7352 if (DeserializationListener)
7353 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
7354 }
7355
7356 return DeclsLoaded[Index];
7357}
7358
7359DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M,
7360 DeclID GlobalID) {
7361 if (GlobalID < NUM_PREDEF_DECL_IDS)
7362 return GlobalID;
7363
7364 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID);
7365 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map")((I != GlobalDeclMap.end() && "Corrupted global declaration map"
) ? static_cast<void> (0) : __assert_fail ("I != GlobalDeclMap.end() && \"Corrupted global declaration map\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 7365, __PRETTY_FUNCTION__))
;
7366 ModuleFile *Owner = I->second;
7367
7368 llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos
7369 = M.GlobalToLocalDeclIDs.find(Owner);
7370 if (Pos == M.GlobalToLocalDeclIDs.end())
7371 return 0;
7372
7373 return GlobalID - Owner->BaseDeclID + Pos->second;
7374}
7375
7376serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F,
7377 const RecordData &Record,
7378 unsigned &Idx) {
7379 if (Idx >= Record.size()) {
7380 Error("Corrupted AST file");
7381 return 0;
7382 }
7383
7384 return getGlobalDeclID(F, Record[Idx++]);
7385}
7386
7387/// Resolve the offset of a statement into a statement.
7388///
7389/// This operation will read a new statement from the external
7390/// source each time it is called, and is meant to be used via a
7391/// LazyOffsetPtr (which is used by Decls for the body of functions, etc).
7392Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) {
7393 // Switch case IDs are per Decl.
7394 ClearSwitchCaseIDs();
7395
7396 // Offset here is a global offset across the entire chain.
7397 RecordLocation Loc = getLocalBitOffset(Offset);
7398 Loc.F->DeclsCursor.JumpToBit(Loc.Offset);
7399 assert(NumCurrentElementsDeserializing == 0 &&((NumCurrentElementsDeserializing == 0 && "should not be called while already deserializing"
) ? static_cast<void> (0) : __assert_fail ("NumCurrentElementsDeserializing == 0 && \"should not be called while already deserializing\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 7400, __PRETTY_FUNCTION__))
7400 "should not be called while already deserializing")((NumCurrentElementsDeserializing == 0 && "should not be called while already deserializing"
) ? static_cast<void> (0) : __assert_fail ("NumCurrentElementsDeserializing == 0 && \"should not be called while already deserializing\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 7400, __PRETTY_FUNCTION__))
;
7401 Deserializing D(this);
7402 return ReadStmtFromStream(*Loc.F);
7403}
7404
7405void ASTReader::FindExternalLexicalDecls(
7406 const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant,
7407 SmallVectorImpl<Decl *> &Decls) {
7408 bool PredefsVisited[NUM_PREDEF_DECL_IDS] = {};
7409
7410 auto Visit = [&] (ModuleFile *M, LexicalContents LexicalDecls) {
7411 assert(LexicalDecls.size() % 2 == 0 && "expected an even number of entries")((LexicalDecls.size() % 2 == 0 && "expected an even number of entries"
) ? static_cast<void> (0) : __assert_fail ("LexicalDecls.size() % 2 == 0 && \"expected an even number of entries\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 7411, __PRETTY_FUNCTION__))
;
7412 for (int I = 0, N = LexicalDecls.size(); I != N; I += 2) {
7413 auto K = (Decl::Kind)+LexicalDecls[I];
7414 if (!IsKindWeWant(K))
7415 continue;
7416
7417 auto ID = (serialization::DeclID)+LexicalDecls[I + 1];
7418
7419 // Don't add predefined declarations to the lexical context more
7420 // than once.
7421 if (ID < NUM_PREDEF_DECL_IDS) {
7422 if (PredefsVisited[ID])
7423 continue;
7424
7425 PredefsVisited[ID] = true;
7426 }
7427
7428 if (Decl *D = GetLocalDecl(*M, ID)) {
7429 assert(D->getKind() == K && "wrong kind for lexical decl")((D->getKind() == K && "wrong kind for lexical decl"
) ? static_cast<void> (0) : __assert_fail ("D->getKind() == K && \"wrong kind for lexical decl\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 7429, __PRETTY_FUNCTION__))
;
7430 if (!DC->isDeclInLexicalTraversal(D))
7431 Decls.push_back(D);
7432 }
7433 }
7434 };
7435
7436 if (isa<TranslationUnitDecl>(DC)) {
7437 for (auto Lexical : TULexicalDecls)
7438 Visit(Lexical.first, Lexical.second);
7439 } else {
7440 auto I = LexicalDecls.find(DC);
7441 if (I != LexicalDecls.end())
7442 Visit(I->second.first, I->second.second);
7443 }
7444
7445 ++NumLexicalDeclContextsRead;
7446}
7447
7448namespace {
7449
7450class DeclIDComp {
7451 ASTReader &Reader;
7452 ModuleFile &Mod;
7453
7454public:
7455 DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {}
7456
7457 bool operator()(LocalDeclID L, LocalDeclID R) const {
7458 SourceLocation LHS = getLocation(L);
7459 SourceLocation RHS = getLocation(R);
7460 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
7461 }
7462
7463 bool operator()(SourceLocation LHS, LocalDeclID R) const {
7464 SourceLocation RHS = getLocation(R);
7465 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
7466 }
7467
7468 bool operator()(LocalDeclID L, SourceLocation RHS) const {
7469 SourceLocation LHS = getLocation(L);
7470 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
7471 }
7472
7473 SourceLocation getLocation(LocalDeclID ID) const {
7474 return Reader.getSourceManager().getFileLoc(
7475 Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID)));
7476 }
7477};
7478
7479} // namespace
7480
7481void ASTReader::FindFileRegionDecls(FileID File,
7482 unsigned Offset, unsigned Length,
7483 SmallVectorImpl<Decl *> &Decls) {
7484 SourceManager &SM = getSourceManager();
7485
7486 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File);
7487 if (I == FileDeclIDs.end())
7488 return;
7489
7490 FileDeclsInfo &DInfo = I->second;
7491 if (DInfo.Decls.empty())
7492 return;
7493
7494 SourceLocation
7495 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset);
7496 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length);
7497
7498 DeclIDComp DIDComp(*this, *DInfo.Mod);
7499 ArrayRef<serialization::LocalDeclID>::iterator
7500 BeginIt = std::lower_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
7501 BeginLoc, DIDComp);
7502 if (BeginIt != DInfo.Decls.begin())
7503 --BeginIt;
7504
7505 // If we are pointing at a top-level decl inside an objc container, we need
7506 // to backtrack until we find it otherwise we will fail to report that the
7507 // region overlaps with an objc container.
7508 while (BeginIt != DInfo.Decls.begin() &&
7509 GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt))
7510 ->isTopLevelDeclInObjCContainer())
7511 --BeginIt;
7512
7513 ArrayRef<serialization::LocalDeclID>::iterator
7514 EndIt = std::upper_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
7515 EndLoc, DIDComp);
7516 if (EndIt != DInfo.Decls.end())
7517 ++EndIt;
7518
7519 for (ArrayRef<serialization::LocalDeclID>::iterator
7520 DIt = BeginIt; DIt != EndIt; ++DIt)
7521 Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt)));
7522}
7523
7524bool
7525ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC,
7526 DeclarationName Name) {
7527 assert(DC->hasExternalVisibleStorage() && DC == DC->getPrimaryContext() &&((DC->hasExternalVisibleStorage() && DC == DC->
getPrimaryContext() && "DeclContext has no visible decls in storage"
) ? static_cast<void> (0) : __assert_fail ("DC->hasExternalVisibleStorage() && DC == DC->getPrimaryContext() && \"DeclContext has no visible decls in storage\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 7528, __PRETTY_FUNCTION__))
7528 "DeclContext has no visible decls in storage")((DC->hasExternalVisibleStorage() && DC == DC->
getPrimaryContext() && "DeclContext has no visible decls in storage"
) ? static_cast<void> (0) : __assert_fail ("DC->hasExternalVisibleStorage() && DC == DC->getPrimaryContext() && \"DeclContext has no visible decls in storage\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 7528, __PRETTY_FUNCTION__))
;
7529 if (!Name)
7530 return false;
7531
7532 auto It = Lookups.find(DC);
7533 if (It == Lookups.end())
7534 return false;
7535
7536 Deserializing LookupResults(this);
7537
7538 // Load the list of declarations.
7539 SmallVector<NamedDecl *, 64> Decls;
7540 for (DeclID ID : It->second.Table.find(Name)) {
7541 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID));
7542 if (ND->getDeclName() == Name)
7543 Decls.push_back(ND);
7544 }
7545
7546 ++NumVisibleDeclContextsRead;
7547 SetExternalVisibleDeclsForName(DC, Name, Decls);
7548 return !Decls.empty();
7549}
7550
7551void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) {
7552 if (!DC->hasExternalVisibleStorage())
7553 return;
7554
7555 auto It = Lookups.find(DC);
7556 assert(It != Lookups.end() &&((It != Lookups.end() && "have external visible storage but no lookup tables"
) ? static_cast<void> (0) : __assert_fail ("It != Lookups.end() && \"have external visible storage but no lookup tables\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 7557, __PRETTY_FUNCTION__))
7557 "have external visible storage but no lookup tables")((It != Lookups.end() && "have external visible storage but no lookup tables"
) ? static_cast<void> (0) : __assert_fail ("It != Lookups.end() && \"have external visible storage but no lookup tables\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 7557, __PRETTY_FUNCTION__))
;
7558
7559 DeclsMap Decls;
7560
7561 for (DeclID ID : It->second.Table.findAll()) {
7562 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID));
7563 Decls[ND->getDeclName()].push_back(ND);
7564 }
7565
7566 ++NumVisibleDeclContextsRead;
7567
7568 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) {
7569 SetExternalVisibleDeclsForName(DC, I->first, I->second);
7570 }
7571 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false);
7572}
7573
7574const serialization::reader::DeclContextLookupTable *
7575ASTReader::getLoadedLookupTables(DeclContext *Primary) const {
7576 auto I = Lookups.find(Primary);
7577 return I == Lookups.end() ? nullptr : &I->second;
7578}
7579
7580/// Under non-PCH compilation the consumer receives the objc methods
7581/// before receiving the implementation, and codegen depends on this.
7582/// We simulate this by deserializing and passing to consumer the methods of the
7583/// implementation before passing the deserialized implementation decl.
7584static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD,
7585 ASTConsumer *Consumer) {
7586 assert(ImplD && Consumer)((ImplD && Consumer) ? static_cast<void> (0) : __assert_fail
("ImplD && Consumer", "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 7586, __PRETTY_FUNCTION__))
;
7587
7588 for (auto *I : ImplD->methods())
7589 Consumer->HandleInterestingDecl(DeclGroupRef(I));
7590
7591 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD));
7592}
7593
7594void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
7595 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
7596 PassObjCImplDeclToConsumer(ImplD, Consumer);
7597 else
7598 Consumer->HandleInterestingDecl(DeclGroupRef(D));
7599}
7600
7601void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) {
7602 this->Consumer = Consumer;
7603
7604 if (Consumer)
7605 PassInterestingDeclsToConsumer();
7606
7607 if (DeserializationListener)
7608 DeserializationListener->ReaderInitialized(this);
7609}
7610
7611void ASTReader::PrintStats() {
7612 std::fprintf(stderrstderr, "*** AST File Statistics:\n");
7613
7614 unsigned NumTypesLoaded
7615 = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(),
7616 QualType());
7617 unsigned NumDeclsLoaded
7618 = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(),
7619 (Decl *)nullptr);
7620 unsigned NumIdentifiersLoaded
7621 = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(),
7622 IdentifiersLoaded.end(),
7623 (IdentifierInfo *)nullptr);
7624 unsigned NumMacrosLoaded
7625 = MacrosLoaded.size() - std::count(MacrosLoaded.begin(),
7626 MacrosLoaded.end(),
7627 (MacroInfo *)nullptr);
7628 unsigned NumSelectorsLoaded
7629 = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(),
7630 SelectorsLoaded.end(),
7631 Selector());
7632
7633 if (unsigned TotalNumSLocEntries = getTotalNumSLocs())
7634 std::fprintf(stderrstderr, " %u/%u source location entries read (%f%%)\n",
7635 NumSLocEntriesRead, TotalNumSLocEntries,
7636 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
7637 if (!TypesLoaded.empty())
7638 std::fprintf(stderrstderr, " %u/%u types read (%f%%)\n",
7639 NumTypesLoaded, (unsigned)TypesLoaded.size(),
7640 ((float)NumTypesLoaded/TypesLoaded.size() * 100));
7641 if (!DeclsLoaded.empty())
7642 std::fprintf(stderrstderr, " %u/%u declarations read (%f%%)\n",
7643 NumDeclsLoaded, (unsigned)DeclsLoaded.size(),
7644 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100));
7645 if (!IdentifiersLoaded.empty())
7646 std::fprintf(stderrstderr, " %u/%u identifiers read (%f%%)\n",
7647 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(),
7648 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
7649 if (!MacrosLoaded.empty())
7650 std::fprintf(stderrstderr, " %u/%u macros read (%f%%)\n",
7651 NumMacrosLoaded, (unsigned)MacrosLoaded.size(),
7652 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100));
7653 if (!SelectorsLoaded.empty())
7654 std::fprintf(stderrstderr, " %u/%u selectors read (%f%%)\n",
7655 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(),
7656 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
7657 if (TotalNumStatements)
7658 std::fprintf(stderrstderr, " %u/%u statements read (%f%%)\n",
7659 NumStatementsRead, TotalNumStatements,
7660 ((float)NumStatementsRead/TotalNumStatements * 100));
7661 if (TotalNumMacros)
7662 std::fprintf(stderrstderr, " %u/%u macros read (%f%%)\n",
7663 NumMacrosRead, TotalNumMacros,
7664 ((float)NumMacrosRead/TotalNumMacros * 100));
7665 if (TotalLexicalDeclContexts)
7666 std::fprintf(stderrstderr, " %u/%u lexical declcontexts read (%f%%)\n",
7667 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
7668 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
7669 * 100));
7670 if (TotalVisibleDeclContexts)
7671 std::fprintf(stderrstderr, " %u/%u visible declcontexts read (%f%%)\n",
7672 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
7673 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
7674 * 100));
7675 if (TotalNumMethodPoolEntries)
7676 std::fprintf(stderrstderr, " %u/%u method pool entries read (%f%%)\n",
7677 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
7678 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
7679 * 100));
7680 if (NumMethodPoolLookups)
7681 std::fprintf(stderrstderr, " %u/%u method pool lookups succeeded (%f%%)\n",
7682 NumMethodPoolHits, NumMethodPoolLookups,
7683 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
7684 if (NumMethodPoolTableLookups)
7685 std::fprintf(stderrstderr, " %u/%u method pool table lookups succeeded (%f%%)\n",
7686 NumMethodPoolTableHits, NumMethodPoolTableLookups,
7687 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups
7688 * 100.0));
7689 if (NumIdentifierLookupHits)
7690 std::fprintf(stderrstderr,
7691 " %u / %u identifier table lookups succeeded (%f%%)\n",
7692 NumIdentifierLookupHits, NumIdentifierLookups,
7693 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
7694
7695 if (GlobalIndex) {
7696 std::fprintf(stderrstderr, "\n");
7697 GlobalIndex->printStats();
7698 }
7699
7700 std::fprintf(stderrstderr, "\n");
7701 dump();
7702 std::fprintf(stderrstderr, "\n");
7703}
7704
7705template<typename Key, typename ModuleFile, unsigned InitialCapacity>
7706LLVM_DUMP_METHOD__attribute__((noinline)) __attribute__((__used__)) static void
7707dumpModuleIDMap(StringRef Name,
7708 const ContinuousRangeMap<Key, ModuleFile *,
7709 InitialCapacity> &Map) {
7710 if (Map.begin() == Map.end())
7711 return;
7712
7713 using MapType = ContinuousRangeMap<Key, ModuleFile *, InitialCapacity>;
7714
7715 llvm::errs() << Name << ":\n";
7716 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
7717 I != IEnd; ++I) {
7718 llvm::errs() << " " << I->first << " -> " << I->second->FileName
7719 << "\n";
7720 }
7721}
7722
7723LLVM_DUMP_METHOD__attribute__((noinline)) __attribute__((__used__)) void ASTReader::dump() {
7724 llvm::errs() << "*** PCH/ModuleFile Remappings:\n";
7725 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap);
7726 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap);
7727 dumpModuleIDMap("Global type map", GlobalTypeMap);
7728 dumpModuleIDMap("Global declaration map", GlobalDeclMap);
7729 dumpModuleIDMap("Global identifier map", GlobalIdentifierMap);
7730 dumpModuleIDMap("Global macro map", GlobalMacroMap);
7731 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap);
7732 dumpModuleIDMap("Global selector map", GlobalSelectorMap);
7733 dumpModuleIDMap("Global preprocessed entity map",
7734 GlobalPreprocessedEntityMap);
7735
7736 llvm::errs() << "\n*** PCH/Modules Loaded:";
7737 for (ModuleFile &M : ModuleMgr)
7738 M.dump();
7739}
7740
7741/// Return the amount of memory used by memory buffers, breaking down
7742/// by heap-backed versus mmap'ed memory.
7743void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const {
7744 for (ModuleFile &I : ModuleMgr) {
7745 if (llvm::MemoryBuffer *buf = I.Buffer) {
7746 size_t bytes = buf->getBufferSize();
7747 switch (buf->getBufferKind()) {
7748 case llvm::MemoryBuffer::MemoryBuffer_Malloc:
7749 sizes.malloc_bytes += bytes;
7750 break;
7751 case llvm::MemoryBuffer::MemoryBuffer_MMap:
7752 sizes.mmap_bytes += bytes;
7753 break;
7754 }
7755 }
7756 }
7757}
7758
7759void ASTReader::InitializeSema(Sema &S) {
7760 SemaObj = &S;
7761 S.addExternalSource(this);
7762
7763 // Makes sure any declarations that were deserialized "too early"
7764 // still get added to the identifier's declaration chains.
7765 for (uint64_t ID : PreloadedDeclIDs) {
7766 NamedDecl *D = cast<NamedDecl>(GetDecl(ID));
7767 pushExternalDeclIntoScope(D, D->getDeclName());
7768 }
7769 PreloadedDeclIDs.clear();
7770
7771 // FIXME: What happens if these are changed by a module import?
7772 if (!FPPragmaOptions.empty()) {
7773 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS")((FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS"
) ? static_cast<void> (0) : __assert_fail ("FPPragmaOptions.size() == 1 && \"Wrong number of FP_PRAGMA_OPTIONS\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 7773, __PRETTY_FUNCTION__))
;
7774 SemaObj->FPFeatures = FPOptions(FPPragmaOptions[0]);
7775 }
7776
7777 SemaObj->OpenCLFeatures.copy(OpenCLExtensions);
7778 SemaObj->OpenCLTypeExtMap = OpenCLTypeExtMap;
7779 SemaObj->OpenCLDeclExtMap = OpenCLDeclExtMap;
7780
7781 UpdateSema();
7782}
7783
7784void ASTReader::UpdateSema() {
7785 assert(SemaObj && "no Sema to update")((SemaObj && "no Sema to update") ? static_cast<void
> (0) : __assert_fail ("SemaObj && \"no Sema to update\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 7785, __PRETTY_FUNCTION__))
;
7786
7787 // Load the offsets of the declarations that Sema references.
7788 // They will be lazily deserialized when needed.
7789 if (!SemaDeclRefs.empty()) {
7790 assert(SemaDeclRefs.size() % 3 == 0)((SemaDeclRefs.size() % 3 == 0) ? static_cast<void> (0)
: __assert_fail ("SemaDeclRefs.size() % 3 == 0", "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 7790, __PRETTY_FUNCTION__))
;
7791 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 3) {
7792 if (!SemaObj->StdNamespace)
7793 SemaObj->StdNamespace = SemaDeclRefs[I];
7794 if (!SemaObj->StdBadAlloc)
7795 SemaObj->StdBadAlloc = SemaDeclRefs[I+1];
7796 if (!SemaObj->StdAlignValT)
7797 SemaObj->StdAlignValT = SemaDeclRefs[I+2];
7798 }
7799 SemaDeclRefs.clear();
7800 }
7801
7802 // Update the state of pragmas. Use the same API as if we had encountered the
7803 // pragma in the source.
7804 if(OptimizeOffPragmaLocation.isValid())
7805 SemaObj->ActOnPragmaOptimize(/* IsOn = */ false, OptimizeOffPragmaLocation);
7806 if (PragmaMSStructState != -1)
7807 SemaObj->ActOnPragmaMSStruct((PragmaMSStructKind)PragmaMSStructState);
7808 if (PointersToMembersPragmaLocation.isValid()) {
7809 SemaObj->ActOnPragmaMSPointersToMembers(
7810 (LangOptions::PragmaMSPointersToMembersKind)
7811 PragmaMSPointersToMembersState,
7812 PointersToMembersPragmaLocation);
7813 }
7814 SemaObj->ForceCUDAHostDeviceDepth = ForceCUDAHostDeviceDepth;
7815
7816 if (PragmaPackCurrentValue) {
7817 // The bottom of the stack might have a default value. It must be adjusted
7818 // to the current value to ensure that the packing state is preserved after
7819 // popping entries that were included/imported from a PCH/module.
7820 bool DropFirst = false;
7821 if (!PragmaPackStack.empty() &&
7822 PragmaPackStack.front().Location.isInvalid()) {
7823 assert(PragmaPackStack.front().Value == SemaObj->PackStack.DefaultValue &&((PragmaPackStack.front().Value == SemaObj->PackStack.DefaultValue
&& "Expected a default alignment value") ? static_cast
<void> (0) : __assert_fail ("PragmaPackStack.front().Value == SemaObj->PackStack.DefaultValue && \"Expected a default alignment value\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 7824, __PRETTY_FUNCTION__))
7824 "Expected a default alignment value")((PragmaPackStack.front().Value == SemaObj->PackStack.DefaultValue
&& "Expected a default alignment value") ? static_cast
<void> (0) : __assert_fail ("PragmaPackStack.front().Value == SemaObj->PackStack.DefaultValue && \"Expected a default alignment value\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 7824, __PRETTY_FUNCTION__))
;
7825 SemaObj->PackStack.Stack.emplace_back(
7826 PragmaPackStack.front().SlotLabel, SemaObj->PackStack.CurrentValue,
7827 SemaObj->PackStack.CurrentPragmaLocation,
7828 PragmaPackStack.front().PushLocation);
7829 DropFirst = true;
7830 }
7831 for (const auto &Entry :
7832 llvm::makeArrayRef(PragmaPackStack).drop_front(DropFirst ? 1 : 0))
7833 SemaObj->PackStack.Stack.emplace_back(Entry.SlotLabel, Entry.Value,
7834 Entry.Location, Entry.PushLocation);
7835 if (PragmaPackCurrentLocation.isInvalid()) {
7836 assert(*PragmaPackCurrentValue == SemaObj->PackStack.DefaultValue &&((*PragmaPackCurrentValue == SemaObj->PackStack.DefaultValue
&& "Expected a default alignment value") ? static_cast
<void> (0) : __assert_fail ("*PragmaPackCurrentValue == SemaObj->PackStack.DefaultValue && \"Expected a default alignment value\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 7837, __PRETTY_FUNCTION__))
7837 "Expected a default alignment value")((*PragmaPackCurrentValue == SemaObj->PackStack.DefaultValue
&& "Expected a default alignment value") ? static_cast
<void> (0) : __assert_fail ("*PragmaPackCurrentValue == SemaObj->PackStack.DefaultValue && \"Expected a default alignment value\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 7837, __PRETTY_FUNCTION__))
;
7838 // Keep the current values.
7839 } else {
7840 SemaObj->PackStack.CurrentValue = *PragmaPackCurrentValue;
7841 SemaObj->PackStack.CurrentPragmaLocation = PragmaPackCurrentLocation;
7842 }
7843 }
7844}
7845
7846IdentifierInfo *ASTReader::get(StringRef Name) {
7847 // Note that we are loading an identifier.
7848 Deserializing AnIdentifier(this);
7849
7850 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0,
7851 NumIdentifierLookups,
7852 NumIdentifierLookupHits);
7853
7854 // We don't need to do identifier table lookups in C++ modules (we preload
7855 // all interesting declarations, and don't need to use the scope for name
7856 // lookups). Perform the lookup in PCH files, though, since we don't build
7857 // a complete initial identifier table if we're carrying on from a PCH.
7858 if (PP.getLangOpts().CPlusPlus) {
7859 for (auto F : ModuleMgr.pch_modules())
7860 if (Visitor(*F))
7861 break;
7862 } else {
7863 // If there is a global index, look there first to determine which modules
7864 // provably do not have any results for this identifier.
7865 GlobalModuleIndex::HitSet Hits;
7866 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
7867 if (!loadGlobalIndex()) {
7868 if (GlobalIndex->lookupIdentifier(Name, Hits)) {
7869 HitsPtr = &Hits;
7870 }
7871 }
7872
7873 ModuleMgr.visit(Visitor, HitsPtr);
7874 }
7875
7876 IdentifierInfo *II = Visitor.getIdentifierInfo();
7877 markIdentifierUpToDate(II);
7878 return II;
7879}
7880
7881namespace clang {
7882
7883 /// An identifier-lookup iterator that enumerates all of the
7884 /// identifiers stored within a set of AST files.
7885 class ASTIdentifierIterator : public IdentifierIterator {
7886 /// The AST reader whose identifiers are being enumerated.
7887 const ASTReader &Reader;
7888
7889 /// The current index into the chain of AST files stored in
7890 /// the AST reader.
7891 unsigned Index;
7892
7893 /// The current position within the identifier lookup table
7894 /// of the current AST file.
7895 ASTIdentifierLookupTable::key_iterator Current;
7896
7897 /// The end position within the identifier lookup table of
7898 /// the current AST file.
7899 ASTIdentifierLookupTable::key_iterator End;
7900
7901 /// Whether to skip any modules in the ASTReader.
7902 bool SkipModules;
7903
7904 public:
7905 explicit ASTIdentifierIterator(const ASTReader &Reader,
7906 bool SkipModules = false);
7907
7908 StringRef Next() override;
7909 };
7910
7911} // namespace clang
7912
7913ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader,
7914 bool SkipModules)
7915 : Reader(Reader), Index(Reader.ModuleMgr.size()), SkipModules(SkipModules) {
7916}
7917
7918StringRef ASTIdentifierIterator::Next() {
7919 while (Current == End) {
7920 // If we have exhausted all of our AST files, we're done.
7921 if (Index == 0)
7922 return StringRef();
7923
7924 --Index;
7925 ModuleFile &F = Reader.ModuleMgr[Index];
7926 if (SkipModules && F.isModule())
7927 continue;
7928
7929 ASTIdentifierLookupTable *IdTable =
7930 (ASTIdentifierLookupTable *)F.IdentifierLookupTable;
7931 Current = IdTable->key_begin();
7932 End = IdTable->key_end();
7933 }
7934
7935 // We have any identifiers remaining in the current AST file; return
7936 // the next one.
7937 StringRef Result = *Current;
7938 ++Current;
7939 return Result;
7940}
7941
7942namespace {
7943
7944/// A utility for appending two IdentifierIterators.
7945class ChainedIdentifierIterator : public IdentifierIterator {
7946 std::unique_ptr<IdentifierIterator> Current;
7947 std::unique_ptr<IdentifierIterator> Queued;
7948
7949public:
7950 ChainedIdentifierIterator(std::unique_ptr<IdentifierIterator> First,
7951 std::unique_ptr<IdentifierIterator> Second)
7952 : Current(std::move(First)), Queued(std::move(Second)) {}
7953
7954 StringRef Next() override {
7955 if (!Current)
7956 return StringRef();
7957
7958 StringRef result = Current->Next();
7959 if (!result.empty())
7960 return result;
7961
7962 // Try the queued iterator, which may itself be empty.
7963 Current.reset();
7964 std::swap(Current, Queued);
7965 return Next();
7966 }
7967};
7968
7969} // namespace
7970
7971IdentifierIterator *ASTReader::getIdentifiers() {
7972 if (!loadGlobalIndex()) {
7973 std::unique_ptr<IdentifierIterator> ReaderIter(
7974 new ASTIdentifierIterator(*this, /*SkipModules=*/true));
7975 std::unique_ptr<IdentifierIterator> ModulesIter(
7976 GlobalIndex->createIdentifierIterator());
7977 return new ChainedIdentifierIterator(std::move(ReaderIter),
7978 std::move(ModulesIter));
7979 }
7980
7981 return new ASTIdentifierIterator(*this);
7982}
7983
7984namespace clang {
7985namespace serialization {
7986
7987 class ReadMethodPoolVisitor {
7988 ASTReader &Reader;
7989 Selector Sel;
7990 unsigned PriorGeneration;
7991 unsigned InstanceBits = 0;
7992 unsigned FactoryBits = 0;
7993 bool InstanceHasMoreThanOneDecl = false;
7994 bool FactoryHasMoreThanOneDecl = false;
7995 SmallVector<ObjCMethodDecl *, 4> InstanceMethods;
7996 SmallVector<ObjCMethodDecl *, 4> FactoryMethods;
7997
7998 public:
7999 ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel,
8000 unsigned PriorGeneration)
8001 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) {}
8002
8003 bool operator()(ModuleFile &M) {
8004 if (!M.SelectorLookupTable)
8005 return false;
8006
8007 // If we've already searched this module file, skip it now.
8008 if (M.Generation <= PriorGeneration)
8009 return true;
8010
8011 ++Reader.NumMethodPoolTableLookups;
8012 ASTSelectorLookupTable *PoolTable
8013 = (ASTSelectorLookupTable*)M.SelectorLookupTable;
8014 ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel);
8015 if (Pos == PoolTable->end())
8016 return false;
8017
8018 ++Reader.NumMethodPoolTableHits;
8019 ++Reader.NumSelectorsRead;
8020 // FIXME: Not quite happy with the statistics here. We probably should
8021 // disable this tracking when called via LoadSelector.
8022 // Also, should entries without methods count as misses?
8023 ++Reader.NumMethodPoolEntriesRead;
8024 ASTSelectorLookupTrait::data_type Data = *Pos;
8025 if (Reader.DeserializationListener)
8026 Reader.DeserializationListener->SelectorRead(Data.ID, Sel);
8027
8028 InstanceMethods.append(Data.Instance.begin(), Data.Instance.end());
8029 FactoryMethods.append(Data.Factory.begin(), Data.Factory.end());
8030 InstanceBits = Data.InstanceBits;
8031 FactoryBits = Data.FactoryBits;
8032 InstanceHasMoreThanOneDecl = Data.InstanceHasMoreThanOneDecl;
8033 FactoryHasMoreThanOneDecl = Data.FactoryHasMoreThanOneDecl;
8034 return true;
8035 }
8036
8037 /// Retrieve the instance methods found by this visitor.
8038 ArrayRef<ObjCMethodDecl *> getInstanceMethods() const {
8039 return InstanceMethods;
8040 }
8041
8042 /// Retrieve the instance methods found by this visitor.
8043 ArrayRef<ObjCMethodDecl *> getFactoryMethods() const {
8044 return FactoryMethods;
8045 }
8046
8047 unsigned getInstanceBits() const { return InstanceBits; }
8048 unsigned getFactoryBits() const { return FactoryBits; }
8049
8050 bool instanceHasMoreThanOneDecl() const {
8051 return InstanceHasMoreThanOneDecl;
8052 }
8053
8054 bool factoryHasMoreThanOneDecl() const { return FactoryHasMoreThanOneDecl; }
8055 };
8056
8057} // namespace serialization
8058} // namespace clang
8059
8060/// Add the given set of methods to the method list.
8061static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods,
8062 ObjCMethodList &List) {
8063 for (unsigned I = 0, N = Methods.size(); I != N; ++I) {
8064 S.addMethodToGlobalList(&List, Methods[I]);
8065 }
8066}
8067
8068void ASTReader::ReadMethodPool(Selector Sel) {
8069 // Get the selector generation and update it to the current generation.
8070 unsigned &Generation = SelectorGeneration[Sel];
8071 unsigned PriorGeneration = Generation;
8072 Generation = getGeneration();
8073 SelectorOutOfDate[Sel] = false;
8074
8075 // Search for methods defined with this selector.
8076 ++NumMethodPoolLookups;
8077 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration);
8078 ModuleMgr.visit(Visitor);
8079
8080 if (Visitor.getInstanceMethods().empty() &&
8081 Visitor.getFactoryMethods().empty())
8082 return;
8083
8084 ++NumMethodPoolHits;
8085
8086 if (!getSema())
8087 return;
8088
8089 Sema &S = *getSema();
8090 Sema::GlobalMethodPool::iterator Pos
8091 = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first;
8092
8093 Pos->second.first.setBits(Visitor.getInstanceBits());
8094 Pos->second.first.setHasMoreThanOneDecl(Visitor.instanceHasMoreThanOneDecl());
8095 Pos->second.second.setBits(Visitor.getFactoryBits());
8096 Pos->second.second.setHasMoreThanOneDecl(Visitor.factoryHasMoreThanOneDecl());
8097
8098 // Add methods to the global pool *after* setting hasMoreThanOneDecl, since
8099 // when building a module we keep every method individually and may need to
8100 // update hasMoreThanOneDecl as we add the methods.
8101 addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first);
8102 addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second);
8103}
8104
8105void ASTReader::updateOutOfDateSelector(Selector Sel) {
8106 if (SelectorOutOfDate[Sel])
8107 ReadMethodPool(Sel);
8108}
8109
8110void ASTReader::ReadKnownNamespaces(
8111 SmallVectorImpl<NamespaceDecl *> &Namespaces) {
8112 Namespaces.clear();
8113
8114 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
8115 if (NamespaceDecl *Namespace
8116 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I])))
8117 Namespaces.push_back(Namespace);
8118 }
8119}
8120
8121void ASTReader::ReadUndefinedButUsed(
8122 llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) {
8123 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
8124 NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++]));
8125 SourceLocation Loc =
8126 SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]);
8127 Undefined.insert(std::make_pair(D, Loc));
8128 }
8129}
8130
8131void ASTReader::ReadMismatchingDeleteExpressions(llvm::MapVector<
8132 FieldDecl *, llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> &
8133 Exprs) {
8134 for (unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) {
8135 FieldDecl *FD = cast<FieldDecl>(GetDecl(DelayedDeleteExprs[Idx++]));
8136 uint64_t Count = DelayedDeleteExprs[Idx++];
8137 for (uint64_t C = 0; C < Count; ++C) {
8138 SourceLocation DeleteLoc =
8139 SourceLocation::getFromRawEncoding(DelayedDeleteExprs[Idx++]);
8140 const bool IsArrayForm = DelayedDeleteExprs[Idx++];
8141 Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm));
8142 }
8143 }
8144}
8145
8146void ASTReader::ReadTentativeDefinitions(
8147 SmallVectorImpl<VarDecl *> &TentativeDefs) {
8148 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
8149 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I]));
8150 if (Var)
8151 TentativeDefs.push_back(Var);
8152 }
8153 TentativeDefinitions.clear();
8154}
8155
8156void ASTReader::ReadUnusedFileScopedDecls(
8157 SmallVectorImpl<const DeclaratorDecl *> &Decls) {
8158 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
8159 DeclaratorDecl *D
8160 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I]));
8161 if (D)
8162 Decls.push_back(D);
8163 }
8164 UnusedFileScopedDecls.clear();
8165}
8166
8167void ASTReader::ReadDelegatingConstructors(
8168 SmallVectorImpl<CXXConstructorDecl *> &Decls) {
8169 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
8170 CXXConstructorDecl *D
8171 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I]));
8172 if (D)
8173 Decls.push_back(D);
8174 }
8175 DelegatingCtorDecls.clear();
8176}
8177
8178void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) {
8179 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
8180 TypedefNameDecl *D
8181 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I]));
8182 if (D)
8183 Decls.push_back(D);
8184 }
8185 ExtVectorDecls.clear();
8186}
8187
8188void ASTReader::ReadUnusedLocalTypedefNameCandidates(
8189 llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) {
8190 for (unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N;
8191 ++I) {
8192 TypedefNameDecl *D = dyn_cast_or_null<TypedefNameDecl>(
8193 GetDecl(UnusedLocalTypedefNameCandidates[I]));
8194 if (D)
8195 Decls.insert(D);
8196 }
8197 UnusedLocalTypedefNameCandidates.clear();
8198}
8199
8200void ASTReader::ReadReferencedSelectors(
8201 SmallVectorImpl<std::pair<Selector, SourceLocation>> &Sels) {
8202 if (ReferencedSelectorsData.empty())
8203 return;
8204
8205 // If there are @selector references added them to its pool. This is for
8206 // implementation of -Wselector.
8207 unsigned int DataSize = ReferencedSelectorsData.size()-1;
8208 unsigned I = 0;
8209 while (I < DataSize) {
8210 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]);
8211 SourceLocation SelLoc
8212 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]);
8213 Sels.push_back(std::make_pair(Sel, SelLoc));
8214 }
8215 ReferencedSelectorsData.clear();
8216}
8217
8218void ASTReader::ReadWeakUndeclaredIdentifiers(
8219 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo>> &WeakIDs) {
8220 if (WeakUndeclaredIdentifiers.empty())
8221 return;
8222
8223 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) {
8224 IdentifierInfo *WeakId
8225 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
8226 IdentifierInfo *AliasId
8227 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
8228 SourceLocation Loc
8229 = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]);
8230 bool Used = WeakUndeclaredIdentifiers[I++];
8231 WeakInfo WI(AliasId, Loc);
8232 WI.setUsed(Used);
8233 WeakIDs.push_back(std::make_pair(WeakId, WI));
8234 }
8235 WeakUndeclaredIdentifiers.clear();
8236}
8237
8238void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) {
8239 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) {
8240 ExternalVTableUse VT;
8241 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++]));
8242 VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]);
8243 VT.DefinitionRequired = VTableUses[Idx++];
8244 VTables.push_back(VT);
8245 }
8246
8247 VTableUses.clear();
8248}
8249
8250void ASTReader::ReadPendingInstantiations(
8251 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation>> &Pending) {
8252 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
8253 ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++]));
8254 SourceLocation Loc
8255 = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]);
8256
8257 Pending.push_back(std::make_pair(D, Loc));
8258 }
8259 PendingInstantiations.clear();
8260}
8261
8262void ASTReader::ReadLateParsedTemplates(
8263 llvm::MapVector<const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>
8264 &LPTMap) {
8265 for (unsigned Idx = 0, N = LateParsedTemplates.size(); Idx < N;
8266 /* In loop */) {
8267 FunctionDecl *FD = cast<FunctionDecl>(GetDecl(LateParsedTemplates[Idx++]));
8268
8269 auto LT = llvm::make_unique<LateParsedTemplate>();
8270 LT->D = GetDecl(LateParsedTemplates[Idx++]);
8271
8272 ModuleFile *F = getOwningModuleFile(LT->D);
8273 assert(F && "No module")((F && "No module") ? static_cast<void> (0) : __assert_fail
("F && \"No module\"", "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 8273, __PRETTY_FUNCTION__))
;
8274
8275 unsigned TokN = LateParsedTemplates[Idx++];
8276 LT->Toks.reserve(TokN);
8277 for (unsigned T = 0; T < TokN; ++T)
8278 LT->Toks.push_back(ReadToken(*F, LateParsedTemplates, Idx));
8279
8280 LPTMap.insert(std::make_pair(FD, std::move(LT)));
8281 }
8282
8283 LateParsedTemplates.clear();
8284}
8285
8286void ASTReader::LoadSelector(Selector Sel) {
8287 // It would be complicated to avoid reading the methods anyway. So don't.
8288 ReadMethodPool(Sel);
8289}
8290
8291void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) {
8292 assert(ID && "Non-zero identifier ID required")((ID && "Non-zero identifier ID required") ? static_cast
<void> (0) : __assert_fail ("ID && \"Non-zero identifier ID required\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 8292, __PRETTY_FUNCTION__))
;
8293 assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range")((ID <= IdentifiersLoaded.size() && "identifier ID out of range"
) ? static_cast<void> (0) : __assert_fail ("ID <= IdentifiersLoaded.size() && \"identifier ID out of range\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 8293, __PRETTY_FUNCTION__))
;
8294 IdentifiersLoaded[ID - 1] = II;
8295 if (DeserializationListener)
8296 DeserializationListener->IdentifierRead(ID, II);
8297}
8298
8299/// Set the globally-visible declarations associated with the given
8300/// identifier.
8301///
8302/// If the AST reader is currently in a state where the given declaration IDs
8303/// cannot safely be resolved, they are queued until it is safe to resolve
8304/// them.
8305///
8306/// \param II an IdentifierInfo that refers to one or more globally-visible
8307/// declarations.
8308///
8309/// \param DeclIDs the set of declaration IDs with the name @p II that are
8310/// visible at global scope.
8311///
8312/// \param Decls if non-null, this vector will be populated with the set of
8313/// deserialized declarations. These declarations will not be pushed into
8314/// scope.
8315void
8316ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II,
8317 const SmallVectorImpl<uint32_t> &DeclIDs,
8318 SmallVectorImpl<Decl *> *Decls) {
8319 if (NumCurrentElementsDeserializing && !Decls) {
8320 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
8321 return;
8322 }
8323
8324 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
8325 if (!SemaObj) {
8326 // Queue this declaration so that it will be added to the
8327 // translation unit scope and identifier's declaration chain
8328 // once a Sema object is known.
8329 PreloadedDeclIDs.push_back(DeclIDs[I]);
8330 continue;
8331 }
8332
8333 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I]));
8334
8335 // If we're simply supposed to record the declarations, do so now.
8336 if (Decls) {
8337 Decls->push_back(D);
8338 continue;
8339 }
8340
8341 // Introduce this declaration into the translation-unit scope
8342 // and add it to the declaration chain for this identifier, so
8343 // that (unqualified) name lookup will find it.
8344 pushExternalDeclIntoScope(D, II);
8345 }
8346}
8347
8348IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) {
8349 if (ID == 0)
8350 return nullptr;
8351
8352 if (IdentifiersLoaded.empty()) {
8353 Error("no identifier table in AST file");
8354 return nullptr;
8355 }
8356
8357 ID -= 1;
8358 if (!IdentifiersLoaded[ID]) {
8359 GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1);
8360 assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map")((I != GlobalIdentifierMap.end() && "Corrupted global identifier map"
) ? static_cast<void> (0) : __assert_fail ("I != GlobalIdentifierMap.end() && \"Corrupted global identifier map\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 8360, __PRETTY_FUNCTION__))
;
8361 ModuleFile *M = I->second;
8362 unsigned Index = ID - M->BaseIdentifierID;
8363 const char *Str = M->IdentifierTableData + M->IdentifierOffsets[Index];
8364
8365 // All of the strings in the AST file are preceded by a 16-bit length.
8366 // Extract that 16-bit length to avoid having to execute strlen().
8367 // NOTE: 'StrLenPtr' is an 'unsigned char*' so that we load bytes as
8368 // unsigned integers. This is important to avoid integer overflow when
8369 // we cast them to 'unsigned'.
8370 const unsigned char *StrLenPtr = (const unsigned char*) Str - 2;
8371 unsigned StrLen = (((unsigned) StrLenPtr[0])
8372 | (((unsigned) StrLenPtr[1]) << 8)) - 1;
8373 auto &II = PP.getIdentifierTable().get(StringRef(Str, StrLen));
8374 IdentifiersLoaded[ID] = &II;
8375 markIdentifierFromAST(*this, II);
8376 if (DeserializationListener)
8377 DeserializationListener->IdentifierRead(ID + 1, &II);
8378 }
8379
8380 return IdentifiersLoaded[ID];
8381}
8382
8383IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) {
8384 return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID));
8385}
8386
8387IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) {
8388 if (LocalID < NUM_PREDEF_IDENT_IDS)
8389 return LocalID;
8390
8391 if (!M.ModuleOffsetMap.empty())
8392 ReadModuleOffsetMap(M);
8393
8394 ContinuousRangeMap<uint32_t, int, 2>::iterator I
8395 = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS);
8396 assert(I != M.IdentifierRemap.end()((I != M.IdentifierRemap.end() && "Invalid index into identifier index remap"
) ? static_cast<void> (0) : __assert_fail ("I != M.IdentifierRemap.end() && \"Invalid index into identifier index remap\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 8397, __PRETTY_FUNCTION__))
8397 && "Invalid index into identifier index remap")((I != M.IdentifierRemap.end() && "Invalid index into identifier index remap"
) ? static_cast<void> (0) : __assert_fail ("I != M.IdentifierRemap.end() && \"Invalid index into identifier index remap\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 8397, __PRETTY_FUNCTION__))
;
8398
8399 return LocalID + I->second;
8400}
8401
8402MacroInfo *ASTReader::getMacro(MacroID ID) {
8403 if (ID == 0)
8404 return nullptr;
8405
8406 if (MacrosLoaded.empty()) {
8407 Error("no macro table in AST file");
8408 return nullptr;
8409 }
8410
8411 ID -= NUM_PREDEF_MACRO_IDS;
8412 if (!MacrosLoaded[ID]) {
8413 GlobalMacroMapType::iterator I
8414 = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS);
8415 assert(I != GlobalMacroMap.end() && "Corrupted global macro map")((I != GlobalMacroMap.end() && "Corrupted global macro map"
) ? static_cast<void> (0) : __assert_fail ("I != GlobalMacroMap.end() && \"Corrupted global macro map\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 8415, __PRETTY_FUNCTION__))
;
8416 ModuleFile *M = I->second;
8417 unsigned Index = ID - M->BaseMacroID;
8418 MacrosLoaded[ID] = ReadMacroRecord(*M, M->MacroOffsets[Index]);
8419
8420 if (DeserializationListener)
8421 DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS,
8422 MacrosLoaded[ID]);
8423 }
8424
8425 return MacrosLoaded[ID];
8426}
8427
8428MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) {
8429 if (LocalID < NUM_PREDEF_MACRO_IDS)
8430 return LocalID;
8431
8432 if (!M.ModuleOffsetMap.empty())
8433 ReadModuleOffsetMap(M);
8434
8435 ContinuousRangeMap<uint32_t, int, 2>::iterator I
8436 = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS);
8437 assert(I != M.MacroRemap.end() && "Invalid index into macro index remap")((I != M.MacroRemap.end() && "Invalid index into macro index remap"
) ? static_cast<void> (0) : __assert_fail ("I != M.MacroRemap.end() && \"Invalid index into macro index remap\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 8437, __PRETTY_FUNCTION__))
;
8438
8439 return LocalID + I->second;
8440}
8441
8442serialization::SubmoduleID
8443ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) {
8444 if (LocalID < NUM_PREDEF_SUBMODULE_IDS)
8445 return LocalID;
8446
8447 if (!M.ModuleOffsetMap.empty())
8448 ReadModuleOffsetMap(M);
8449
8450 ContinuousRangeMap<uint32_t, int, 2>::iterator I
8451 = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS);
8452 assert(I != M.SubmoduleRemap.end()((I != M.SubmoduleRemap.end() && "Invalid index into submodule index remap"
) ? static_cast<void> (0) : __assert_fail ("I != M.SubmoduleRemap.end() && \"Invalid index into submodule index remap\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 8453, __PRETTY_FUNCTION__))
8453 && "Invalid index into submodule index remap")((I != M.SubmoduleRemap.end() && "Invalid index into submodule index remap"
) ? static_cast<void> (0) : __assert_fail ("I != M.SubmoduleRemap.end() && \"Invalid index into submodule index remap\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 8453, __PRETTY_FUNCTION__))
;
8454
8455 return LocalID + I->second;
8456}
8457
8458Module *ASTReader::getSubmodule(SubmoduleID GlobalID) {
8459 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) {
8460 assert(GlobalID == 0 && "Unhandled global submodule ID")((GlobalID == 0 && "Unhandled global submodule ID") ?
static_cast<void> (0) : __assert_fail ("GlobalID == 0 && \"Unhandled global submodule ID\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 8460, __PRETTY_FUNCTION__))
;
8461 return nullptr;
8462 }
8463
8464 if (GlobalID > SubmodulesLoaded.size()) {
8465 Error("submodule ID out of range in AST file");
8466 return nullptr;
8467 }
8468
8469 return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS];
8470}
8471
8472Module *ASTReader::getModule(unsigned ID) {
8473 return getSubmodule(ID);
8474}
8475
8476bool ASTReader::DeclIsFromPCHWithObjectFile(const Decl *D) {
8477 ModuleFile *MF = getOwningModuleFile(D);
8478 return MF && MF->PCHHasObjectFile;
8479}
8480
8481ModuleFile *ASTReader::getLocalModuleFile(ModuleFile &F, unsigned ID) {
8482 if (ID & 1) {
8483 // It's a module, look it up by submodule ID.
8484 auto I = GlobalSubmoduleMap.find(getGlobalSubmoduleID(F, ID >> 1));
8485 return I == GlobalSubmoduleMap.end() ? nullptr : I->second;
8486 } else {
8487 // It's a prefix (preamble, PCH, ...). Look it up by index.
8488 unsigned IndexFromEnd = ID >> 1;
8489 assert(IndexFromEnd && "got reference to unknown module file")((IndexFromEnd && "got reference to unknown module file"
) ? static_cast<void> (0) : __assert_fail ("IndexFromEnd && \"got reference to unknown module file\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 8489, __PRETTY_FUNCTION__))
;
8490 return getModuleManager().pch_modules().end()[-IndexFromEnd];
8491 }
8492}
8493
8494unsigned ASTReader::getModuleFileID(ModuleFile *F) {
8495 if (!F)
8496 return 1;
8497
8498 // For a file representing a module, use the submodule ID of the top-level
8499 // module as the file ID. For any other kind of file, the number of such
8500 // files loaded beforehand will be the same on reload.
8501 // FIXME: Is this true even if we have an explicit module file and a PCH?
8502 if (F->isModule())
8503 return ((F->BaseSubmoduleID + NUM_PREDEF_SUBMODULE_IDS) << 1) | 1;
8504
8505 auto PCHModules = getModuleManager().pch_modules();
8506 auto I = std::find(PCHModules.begin(), PCHModules.end(), F);
8507 assert(I != PCHModules.end() && "emitting reference to unknown file")((I != PCHModules.end() && "emitting reference to unknown file"
) ? static_cast<void> (0) : __assert_fail ("I != PCHModules.end() && \"emitting reference to unknown file\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 8507, __PRETTY_FUNCTION__))
;
8508 return (I - PCHModules.end()) << 1;
8509}
8510
8511llvm::Optional<ExternalASTSource::ASTSourceDescriptor>
8512ASTReader::getSourceDescriptor(unsigned ID) {
8513 if (const Module *M = getSubmodule(ID))
8514 return ExternalASTSource::ASTSourceDescriptor(*M);
8515
8516 // If there is only a single PCH, return it instead.
8517 // Chained PCH are not supported.
8518 const auto &PCHChain = ModuleMgr.pch_modules();
8519 if (std::distance(std::begin(PCHChain), std::end(PCHChain))) {
8520 ModuleFile &MF = ModuleMgr.getPrimaryModule();
8521 StringRef ModuleName = llvm::sys::path::filename(MF.OriginalSourceFileName);
8522 StringRef FileName = llvm::sys::path::filename(MF.FileName);
8523 return ASTReader::ASTSourceDescriptor(ModuleName, MF.OriginalDir, FileName,
8524 MF.Signature);
8525 }
8526 return None;
8527}
8528
8529ExternalASTSource::ExtKind ASTReader::hasExternalDefinitions(const Decl *FD) {
8530 auto I = DefinitionSource.find(FD);
8531 if (I == DefinitionSource.end())
8532 return EK_ReplyHazy;
8533 return I->second ? EK_Never : EK_Always;
8534}
8535
8536Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) {
8537 return DecodeSelector(getGlobalSelectorID(M, LocalID));
8538}
8539
8540Selector ASTReader::DecodeSelector(serialization::SelectorID ID) {
8541 if (ID == 0)
8542 return Selector();
8543
8544 if (ID > SelectorsLoaded.size()) {
8545 Error("selector ID out of range in AST file");
8546 return Selector();
8547 }
8548
8549 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) {
8550 // Load this selector from the selector table.
8551 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID);
8552 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map")((I != GlobalSelectorMap.end() && "Corrupted global selector map"
) ? static_cast<void> (0) : __assert_fail ("I != GlobalSelectorMap.end() && \"Corrupted global selector map\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 8552, __PRETTY_FUNCTION__))
;
8553 ModuleFile &M = *I->second;
8554 ASTSelectorLookupTrait Trait(*this, M);
8555 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS;
8556 SelectorsLoaded[ID - 1] =
8557 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0);
8558 if (DeserializationListener)
8559 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
8560 }
8561
8562 return SelectorsLoaded[ID - 1];
8563}
8564
8565Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) {
8566 return DecodeSelector(ID);
8567}
8568
8569uint32_t ASTReader::GetNumExternalSelectors() {
8570 // ID 0 (the null selector) is considered an external selector.
8571 return getTotalNumSelectors() + 1;
8572}
8573
8574serialization::SelectorID
8575ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const {
8576 if (LocalID < NUM_PREDEF_SELECTOR_IDS)
8577 return LocalID;
8578
8579 if (!M.ModuleOffsetMap.empty())
8580 ReadModuleOffsetMap(M);
8581
8582 ContinuousRangeMap<uint32_t, int, 2>::iterator I
8583 = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS);
8584 assert(I != M.SelectorRemap.end()((I != M.SelectorRemap.end() && "Invalid index into selector index remap"
) ? static_cast<void> (0) : __assert_fail ("I != M.SelectorRemap.end() && \"Invalid index into selector index remap\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 8585, __PRETTY_FUNCTION__))
8585 && "Invalid index into selector index remap")((I != M.SelectorRemap.end() && "Invalid index into selector index remap"
) ? static_cast<void> (0) : __assert_fail ("I != M.SelectorRemap.end() && \"Invalid index into selector index remap\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 8585, __PRETTY_FUNCTION__))
;
8586
8587 return LocalID + I->second;
8588}
8589
8590DeclarationName
8591ASTReader::ReadDeclarationName(ModuleFile &F,
8592 const RecordData &Record, unsigned &Idx) {
8593 ASTContext &Context = getContext();
8594 DeclarationName::NameKind Kind = (DeclarationName::NameKind)Record[Idx++];
8595 switch (Kind) {
8596 case DeclarationName::Identifier:
8597 return DeclarationName(GetIdentifierInfo(F, Record, Idx));
8598
8599 case DeclarationName::ObjCZeroArgSelector:
8600 case DeclarationName::ObjCOneArgSelector:
8601 case DeclarationName::ObjCMultiArgSelector:
8602 return DeclarationName(ReadSelector(F, Record, Idx));
8603
8604 case DeclarationName::CXXConstructorName:
8605 return Context.DeclarationNames.getCXXConstructorName(
8606 Context.getCanonicalType(readType(F, Record, Idx)));
8607
8608 case DeclarationName::CXXDestructorName:
8609 return Context.DeclarationNames.getCXXDestructorName(
8610 Context.getCanonicalType(readType(F, Record, Idx)));
8611
8612 case DeclarationName::CXXDeductionGuideName:
8613 return Context.DeclarationNames.getCXXDeductionGuideName(
8614 ReadDeclAs<TemplateDecl>(F, Record, Idx));
8615
8616 case DeclarationName::CXXConversionFunctionName:
8617 return Context.DeclarationNames.getCXXConversionFunctionName(
8618 Context.getCanonicalType(readType(F, Record, Idx)));
8619
8620 case DeclarationName::CXXOperatorName:
8621 return Context.DeclarationNames.getCXXOperatorName(
8622 (OverloadedOperatorKind)Record[Idx++]);
8623
8624 case DeclarationName::CXXLiteralOperatorName:
8625 return Context.DeclarationNames.getCXXLiteralOperatorName(
8626 GetIdentifierInfo(F, Record, Idx));
8627
8628 case DeclarationName::CXXUsingDirective:
8629 return DeclarationName::getUsingDirectiveName();
8630 }
8631
8632 llvm_unreachable("Invalid NameKind!")::llvm::llvm_unreachable_internal("Invalid NameKind!", "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 8632)
;
8633}
8634
8635void ASTReader::ReadDeclarationNameLoc(ModuleFile &F,
8636 DeclarationNameLoc &DNLoc,
8637 DeclarationName Name,
8638 const RecordData &Record, unsigned &Idx) {
8639 switch (Name.getNameKind()) {
8640 case DeclarationName::CXXConstructorName:
8641 case DeclarationName::CXXDestructorName:
8642 case DeclarationName::CXXConversionFunctionName:
8643 DNLoc.NamedType.TInfo = GetTypeSourceInfo(F, Record, Idx);
8644 break;
8645
8646 case DeclarationName::CXXOperatorName:
8647 DNLoc.CXXOperatorName.BeginOpNameLoc
8648 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
8649 DNLoc.CXXOperatorName.EndOpNameLoc
8650 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
8651 break;
8652
8653 case DeclarationName::CXXLiteralOperatorName:
8654 DNLoc.CXXLiteralOperatorName.OpNameLoc
8655 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
8656 break;
8657
8658 case DeclarationName::Identifier:
8659 case DeclarationName::ObjCZeroArgSelector:
8660 case DeclarationName::ObjCOneArgSelector:
8661 case DeclarationName::ObjCMultiArgSelector:
8662 case DeclarationName::CXXUsingDirective:
8663 case DeclarationName::CXXDeductionGuideName:
8664 break;
8665 }
8666}
8667
8668void ASTReader::ReadDeclarationNameInfo(ModuleFile &F,
8669 DeclarationNameInfo &NameInfo,
8670 const RecordData &Record, unsigned &Idx) {
8671 NameInfo.setName(ReadDeclarationName(F, Record, Idx));
8672 NameInfo.setLoc(ReadSourceLocation(F, Record, Idx));
8673 DeclarationNameLoc DNLoc;
8674 ReadDeclarationNameLoc(F, DNLoc, NameInfo.getName(), Record, Idx);
8675 NameInfo.setInfo(DNLoc);
8676}
8677
8678void ASTReader::ReadQualifierInfo(ModuleFile &F, QualifierInfo &Info,
8679 const RecordData &Record, unsigned &Idx) {
8680 Info.QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx);
8681 unsigned NumTPLists = Record[Idx++];
8682 Info.NumTemplParamLists = NumTPLists;
8683 if (NumTPLists) {
8684 Info.TemplParamLists =
8685 new (getContext()) TemplateParameterList *[NumTPLists];
8686 for (unsigned i = 0; i != NumTPLists; ++i)
8687 Info.TemplParamLists[i] = ReadTemplateParameterList(F, Record, Idx);
8688 }
8689}
8690
8691TemplateName
8692ASTReader::ReadTemplateName(ModuleFile &F, const RecordData &Record,
8693 unsigned &Idx) {
8694 ASTContext &Context = getContext();
8695 TemplateName::NameKind Kind = (TemplateName::NameKind)Record[Idx++];
8696 switch (Kind) {
8697 case TemplateName::Template:
8698 return TemplateName(ReadDeclAs<TemplateDecl>(F, Record, Idx));
8699
8700 case TemplateName::OverloadedTemplate: {
8701 unsigned size = Record[Idx++];
8702 UnresolvedSet<8> Decls;
8703 while (size--)
8704 Decls.addDecl(ReadDeclAs<NamedDecl>(F, Record, Idx));
8705
8706 return Context.getOverloadedTemplateName(Decls.begin(), Decls.end());
8707 }
8708
8709 case TemplateName::QualifiedTemplate: {
8710 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
8711 bool hasTemplKeyword = Record[Idx++];
8712 TemplateDecl *Template = ReadDeclAs<TemplateDecl>(F, Record, Idx);
8713 return Context.getQualifiedTemplateName(NNS, hasTemplKeyword, Template);
8714 }
8715
8716 case TemplateName::DependentTemplate: {
8717 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
8718 if (Record[Idx++]) // isIdentifier
8719 return Context.getDependentTemplateName(NNS,
8720 GetIdentifierInfo(F, Record,
8721 Idx));
8722 return Context.getDependentTemplateName(NNS,
8723 (OverloadedOperatorKind)Record[Idx++]);
8724 }
8725
8726 case TemplateName::SubstTemplateTemplateParm: {
8727 TemplateTemplateParmDecl *param
8728 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
8729 if (!param) return TemplateName();
8730 TemplateName replacement = ReadTemplateName(F, Record, Idx);
8731 return Context.getSubstTemplateTemplateParm(param, replacement);
8732 }
8733
8734 case TemplateName::SubstTemplateTemplateParmPack: {
8735 TemplateTemplateParmDecl *Param
8736 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
8737 if (!Param)
8738 return TemplateName();
8739
8740 TemplateArgument ArgPack = ReadTemplateArgument(F, Record, Idx);
8741 if (ArgPack.getKind() != TemplateArgument::Pack)
8742 return TemplateName();
8743
8744 return Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
8745 }
8746 }
8747
8748 llvm_unreachable("Unhandled template name kind!")::llvm::llvm_unreachable_internal("Unhandled template name kind!"
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 8748)
;
8749}
8750
8751TemplateArgument ASTReader::ReadTemplateArgument(ModuleFile &F,
8752 const RecordData &Record,
8753 unsigned &Idx,
8754 bool Canonicalize) {
8755 ASTContext &Context = getContext();
8756 if (Canonicalize) {
8757 // The caller wants a canonical template argument. Sometimes the AST only
8758 // wants template arguments in canonical form (particularly as the template
8759 // argument lists of template specializations) so ensure we preserve that
8760 // canonical form across serialization.
8761 TemplateArgument Arg = ReadTemplateArgument(F, Record, Idx, false);
8762 return Context.getCanonicalTemplateArgument(Arg);
8763 }
8764
8765 TemplateArgument::ArgKind Kind = (TemplateArgument::ArgKind)Record[Idx++];
8766 switch (Kind) {
8767 case TemplateArgument::Null:
8768 return TemplateArgument();
8769 case TemplateArgument::Type:
8770 return TemplateArgument(readType(F, Record, Idx));
8771 case TemplateArgument::Declaration: {
8772 ValueDecl *D = ReadDeclAs<ValueDecl>(F, Record, Idx);
8773 return TemplateArgument(D, readType(F, Record, Idx));
8774 }
8775 case TemplateArgument::NullPtr:
8776 return TemplateArgument(readType(F, Record, Idx), /*isNullPtr*/true);
8777 case TemplateArgument::Integral: {
8778 llvm::APSInt Value = ReadAPSInt(Record, Idx);
8779 QualType T = readType(F, Record, Idx);
8780 return TemplateArgument(Context, Value, T);
8781 }
8782 case TemplateArgument::Template:
8783 return TemplateArgument(ReadTemplateName(F, Record, Idx));
8784 case TemplateArgument::TemplateExpansion: {
8785 TemplateName Name = ReadTemplateName(F, Record, Idx);
8786 Optional<unsigned> NumTemplateExpansions;
8787 if (unsigned NumExpansions = Record[Idx++])
8788 NumTemplateExpansions = NumExpansions - 1;
8789 return TemplateArgument(Name, NumTemplateExpansions);
8790 }
8791 case TemplateArgument::Expression:
8792 return TemplateArgument(ReadExpr(F));
8793 case TemplateArgument::Pack: {
8794 unsigned NumArgs = Record[Idx++];
8795 TemplateArgument *Args = new (Context) TemplateArgument[NumArgs];
8796 for (unsigned I = 0; I != NumArgs; ++I)
8797 Args[I] = ReadTemplateArgument(F, Record, Idx);
8798 return TemplateArgument(llvm::makeArrayRef(Args, NumArgs));
8799 }
8800 }
8801
8802 llvm_unreachable("Unhandled template argument kind!")::llvm::llvm_unreachable_internal("Unhandled template argument kind!"
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 8802)
;
8803}
8804
8805TemplateParameterList *
8806ASTReader::ReadTemplateParameterList(ModuleFile &F,
8807 const RecordData &Record, unsigned &Idx) {
8808 SourceLocation TemplateLoc = ReadSourceLocation(F, Record, Idx);
8809 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Idx);
8810 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Idx);
8811
8812 unsigned NumParams = Record[Idx++];
8813 SmallVector<NamedDecl *, 16> Params;
8814 Params.reserve(NumParams);
8815 while (NumParams--)
8816 Params.push_back(ReadDeclAs<NamedDecl>(F, Record, Idx));
8817
8818 // TODO: Concepts
8819 TemplateParameterList *TemplateParams = TemplateParameterList::Create(
8820 getContext(), TemplateLoc, LAngleLoc, Params, RAngleLoc, nullptr);
8821 return TemplateParams;
8822}
8823
8824void
8825ASTReader::
8826ReadTemplateArgumentList(SmallVectorImpl<TemplateArgument> &TemplArgs,
8827 ModuleFile &F, const RecordData &Record,
8828 unsigned &Idx, bool Canonicalize) {
8829 unsigned NumTemplateArgs = Record[Idx++];
8830 TemplArgs.reserve(NumTemplateArgs);
8831 while (NumTemplateArgs--)
8832 TemplArgs.push_back(ReadTemplateArgument(F, Record, Idx, Canonicalize));
8833}
8834
8835/// Read a UnresolvedSet structure.
8836void ASTReader::ReadUnresolvedSet(ModuleFile &F, LazyASTUnresolvedSet &Set,
8837 const RecordData &Record, unsigned &Idx) {
8838 unsigned NumDecls = Record[Idx++];
8839 Set.reserve(getContext(), NumDecls);
8840 while (NumDecls--) {
8841 DeclID ID = ReadDeclID(F, Record, Idx);
8842 AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
8843 Set.addLazyDecl(getContext(), ID, AS);
8844 }
8845}
8846
8847CXXBaseSpecifier
8848ASTReader::ReadCXXBaseSpecifier(ModuleFile &F,
8849 const RecordData &Record, unsigned &Idx) {
8850 bool isVirtual = static_cast<bool>(Record[Idx++]);
8851 bool isBaseOfClass = static_cast<bool>(Record[Idx++]);
8852 AccessSpecifier AS = static_cast<AccessSpecifier>(Record[Idx++]);
8853 bool inheritConstructors = static_cast<bool>(Record[Idx++]);
8854 TypeSourceInfo *TInfo = GetTypeSourceInfo(F, Record, Idx);
8855 SourceRange Range = ReadSourceRange(F, Record, Idx);
8856 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Idx);
8857 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo,
8858 EllipsisLoc);
8859 Result.setInheritConstructors(inheritConstructors);
8860 return Result;
8861}
8862
8863CXXCtorInitializer **
8864ASTReader::ReadCXXCtorInitializers(ModuleFile &F, const RecordData &Record,
8865 unsigned &Idx) {
8866 ASTContext &Context = getContext();
8867 unsigned NumInitializers = Record[Idx++];
8868 assert(NumInitializers && "wrote ctor initializers but have no inits")((NumInitializers && "wrote ctor initializers but have no inits"
) ? static_cast<void> (0) : __assert_fail ("NumInitializers && \"wrote ctor initializers but have no inits\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 8868, __PRETTY_FUNCTION__))
;
8869 auto **CtorInitializers = new (Context) CXXCtorInitializer*[NumInitializers];
8870 for (unsigned i = 0; i != NumInitializers; ++i) {
8871 TypeSourceInfo *TInfo = nullptr;
8872 bool IsBaseVirtual = false;
8873 FieldDecl *Member = nullptr;
8874 IndirectFieldDecl *IndirectMember = nullptr;
8875
8876 CtorInitializerType Type = (CtorInitializerType)Record[Idx++];
8877 switch (Type) {
8878 case CTOR_INITIALIZER_BASE:
8879 TInfo = GetTypeSourceInfo(F, Record, Idx);
8880 IsBaseVirtual = Record[Idx++];
8881 break;
8882
8883 case CTOR_INITIALIZER_DELEGATING:
8884 TInfo = GetTypeSourceInfo(F, Record, Idx);
8885 break;
8886
8887 case CTOR_INITIALIZER_MEMBER:
8888 Member = ReadDeclAs<FieldDecl>(F, Record, Idx);
8889 break;
8890
8891 case CTOR_INITIALIZER_INDIRECT_MEMBER:
8892 IndirectMember = ReadDeclAs<IndirectFieldDecl>(F, Record, Idx);
8893 break;
8894 }
8895
8896 SourceLocation MemberOrEllipsisLoc = ReadSourceLocation(F, Record, Idx);
8897 Expr *Init = ReadExpr(F);
8898 SourceLocation LParenLoc = ReadSourceLocation(F, Record, Idx);
8899 SourceLocation RParenLoc = ReadSourceLocation(F, Record, Idx);
8900
8901 CXXCtorInitializer *BOMInit;
8902 if (Type == CTOR_INITIALIZER_BASE)
8903 BOMInit = new (Context)
8904 CXXCtorInitializer(Context, TInfo, IsBaseVirtual, LParenLoc, Init,
8905 RParenLoc, MemberOrEllipsisLoc);
8906 else if (Type == CTOR_INITIALIZER_DELEGATING)
8907 BOMInit = new (Context)
8908 CXXCtorInitializer(Context, TInfo, LParenLoc, Init, RParenLoc);
8909 else if (Member)
8910 BOMInit = new (Context)
8911 CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc, LParenLoc,
8912 Init, RParenLoc);
8913 else
8914 BOMInit = new (Context)
8915 CXXCtorInitializer(Context, IndirectMember, MemberOrEllipsisLoc,
8916 LParenLoc, Init, RParenLoc);
8917
8918 if (/*IsWritten*/Record[Idx++]) {
8919 unsigned SourceOrder = Record[Idx++];
8920 BOMInit->setSourceOrder(SourceOrder);
8921 }
8922
8923 CtorInitializers[i] = BOMInit;
8924 }
8925
8926 return CtorInitializers;
8927}
8928
8929NestedNameSpecifier *
8930ASTReader::ReadNestedNameSpecifier(ModuleFile &F,
8931 const RecordData &Record, unsigned &Idx) {
8932 ASTContext &Context = getContext();
8933 unsigned N = Record[Idx++];
8934 NestedNameSpecifier *NNS = nullptr, *Prev = nullptr;
8935 for (unsigned I = 0; I != N; ++I) {
8936 NestedNameSpecifier::SpecifierKind Kind
8937 = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
8938 switch (Kind) {
8939 case NestedNameSpecifier::Identifier: {
8940 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
8941 NNS = NestedNameSpecifier::Create(Context, Prev, II);
8942 break;
8943 }
8944
8945 case NestedNameSpecifier::Namespace: {
8946 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
8947 NNS = NestedNameSpecifier::Create(Context, Prev, NS);
8948 break;
8949 }
8950
8951 case NestedNameSpecifier::NamespaceAlias: {
8952 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
8953 NNS = NestedNameSpecifier::Create(Context, Prev, Alias);
8954 break;
8955 }
8956
8957 case NestedNameSpecifier::TypeSpec:
8958 case NestedNameSpecifier::TypeSpecWithTemplate: {
8959 const Type *T = readType(F, Record, Idx).getTypePtrOrNull();
8960 if (!T)
8961 return nullptr;
8962
8963 bool Template = Record[Idx++];
8964 NNS = NestedNameSpecifier::Create(Context, Prev, Template, T);
8965 break;
8966 }
8967
8968 case NestedNameSpecifier::Global:
8969 NNS = NestedNameSpecifier::GlobalSpecifier(Context);
8970 // No associated value, and there can't be a prefix.
8971 break;
8972
8973 case NestedNameSpecifier::Super: {
8974 CXXRecordDecl *RD = ReadDeclAs<CXXRecordDecl>(F, Record, Idx);
8975 NNS = NestedNameSpecifier::SuperSpecifier(Context, RD);
8976 break;
8977 }
8978 }
8979 Prev = NNS;
8980 }
8981 return NNS;
8982}
8983
8984NestedNameSpecifierLoc
8985ASTReader::ReadNestedNameSpecifierLoc(ModuleFile &F, const RecordData &Record,
8986 unsigned &Idx) {
8987 ASTContext &Context = getContext();
8988 unsigned N = Record[Idx++];
8989 NestedNameSpecifierLocBuilder Builder;
8990 for (unsigned I = 0; I != N; ++I) {
8991 NestedNameSpecifier::SpecifierKind Kind
8992 = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
8993 switch (Kind) {
8994 case NestedNameSpecifier::Identifier: {
8995 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
8996 SourceRange Range = ReadSourceRange(F, Record, Idx);
8997 Builder.Extend(Context, II, Range.getBegin(), Range.getEnd());
8998 break;
8999 }
9000
9001 case NestedNameSpecifier::Namespace: {
9002 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
9003 SourceRange Range = ReadSourceRange(F, Record, Idx);
9004 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
9005 break;
9006 }
9007
9008 case NestedNameSpecifier::NamespaceAlias: {
9009 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
9010 SourceRange Range = ReadSourceRange(F, Record, Idx);
9011 Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd());
9012 break;
9013 }
9014
9015 case NestedNameSpecifier::TypeSpec:
9016 case NestedNameSpecifier::TypeSpecWithTemplate: {
9017 bool Template = Record[Idx++];
9018 TypeSourceInfo *T = GetTypeSourceInfo(F, Record, Idx);
9019 if (!T)
9020 return NestedNameSpecifierLoc();
9021 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
9022
9023 // FIXME: 'template' keyword location not saved anywhere, so we fake it.
9024 Builder.Extend(Context,
9025 Template? T->getTypeLoc().getBeginLoc() : SourceLocation(),
9026 T->getTypeLoc(), ColonColonLoc);
9027 break;
9028 }
9029
9030 case NestedNameSpecifier::Global: {
9031 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
9032 Builder.MakeGlobal(Context, ColonColonLoc);
9033 break;
9034 }
9035
9036 case NestedNameSpecifier::Super: {
9037 CXXRecordDecl *RD = ReadDeclAs<CXXRecordDecl>(F, Record, Idx);
9038 SourceRange Range = ReadSourceRange(F, Record, Idx);
9039 Builder.MakeSuper(Context, RD, Range.getBegin(), Range.getEnd());
9040 break;
9041 }
9042 }
9043 }
9044
9045 return Builder.getWithLocInContext(Context);
9046}
9047
9048SourceRange
9049ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record,
9050 unsigned &Idx) {
9051 SourceLocation beg = ReadSourceLocation(F, Record, Idx);
9052 SourceLocation end = ReadSourceLocation(F, Record, Idx);
9053 return SourceRange(beg, end);
9054}
9055
9056/// Read an integral value
9057llvm::APInt ASTReader::ReadAPInt(const RecordData &Record, unsigned &Idx) {
9058 unsigned BitWidth = Record[Idx++];
9059 unsigned NumWords = llvm::APInt::getNumWords(BitWidth);
9060 llvm::APInt Result(BitWidth, NumWords, &Record[Idx]);
9061 Idx += NumWords;
9062 return Result;
9063}
9064
9065/// Read a signed integral value
9066llvm::APSInt ASTReader::ReadAPSInt(const RecordData &Record, unsigned &Idx) {
9067 bool isUnsigned = Record[Idx++];
9068 return llvm::APSInt(ReadAPInt(Record, Idx), isUnsigned);
9069}
9070
9071/// Read a floating-point value
9072llvm::APFloat ASTReader::ReadAPFloat(const RecordData &Record,
9073 const llvm::fltSemantics &Sem,
9074 unsigned &Idx) {
9075 return llvm::APFloat(Sem, ReadAPInt(Record, Idx));
9076}
9077
9078// Read a string
9079std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) {
9080 unsigned Len = Record[Idx++];
9081 std::string Result(Record.data() + Idx, Record.data() + Idx + Len);
9082 Idx += Len;
9083 return Result;
9084}
9085
9086std::string ASTReader::ReadPath(ModuleFile &F, const RecordData &Record,
9087 unsigned &Idx) {
9088 std::string Filename = ReadString(Record, Idx);
9089 ResolveImportedPath(F, Filename);
9090 return Filename;
9091}
9092
9093VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record,
9094 unsigned &Idx) {
9095 unsigned Major = Record[Idx++];
9096 unsigned Minor = Record[Idx++];
9097 unsigned Subminor = Record[Idx++];
9098 if (Minor == 0)
9099 return VersionTuple(Major);
9100 if (Subminor == 0)
9101 return VersionTuple(Major, Minor - 1);
9102 return VersionTuple(Major, Minor - 1, Subminor - 1);
9103}
9104
9105CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F,
9106 const RecordData &Record,
9107 unsigned &Idx) {
9108 CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx);
9109 return CXXTemporary::Create(getContext(), Decl);
9110}
9111
9112DiagnosticBuilder ASTReader::Diag(unsigned DiagID) const {
9113 return Diag(CurrentImportLoc, DiagID);
9114}
9115
9116DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) const {
9117 return Diags.Report(Loc, DiagID);
9118}
9119
9120/// Retrieve the identifier table associated with the
9121/// preprocessor.
9122IdentifierTable &ASTReader::getIdentifierTable() {
9123 return PP.getIdentifierTable();
9124}
9125
9126/// Record that the given ID maps to the given switch-case
9127/// statement.
9128void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) {
9129 assert((*CurrSwitchCaseStmts)[ID] == nullptr &&(((*CurrSwitchCaseStmts)[ID] == nullptr && "Already have a SwitchCase with this ID"
) ? static_cast<void> (0) : __assert_fail ("(*CurrSwitchCaseStmts)[ID] == nullptr && \"Already have a SwitchCase with this ID\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 9130, __PRETTY_FUNCTION__))
9130 "Already have a SwitchCase with this ID")(((*CurrSwitchCaseStmts)[ID] == nullptr && "Already have a SwitchCase with this ID"
) ? static_cast<void> (0) : __assert_fail ("(*CurrSwitchCaseStmts)[ID] == nullptr && \"Already have a SwitchCase with this ID\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 9130, __PRETTY_FUNCTION__))
;
9131 (*CurrSwitchCaseStmts)[ID] = SC;
9132}
9133
9134/// Retrieve the switch-case statement with the given ID.
9135SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) {
9136 assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID")(((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID"
) ? static_cast<void> (0) : __assert_fail ("(*CurrSwitchCaseStmts)[ID] != nullptr && \"No SwitchCase with this ID\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 9136, __PRETTY_FUNCTION__))
;
9137 return (*CurrSwitchCaseStmts)[ID];
9138}
9139
9140void ASTReader::ClearSwitchCaseIDs() {
9141 CurrSwitchCaseStmts->clear();
9142}
9143
9144void ASTReader::ReadComments() {
9145 ASTContext &Context = getContext();
9146 std::vector<RawComment *> Comments;
9147 for (SmallVectorImpl<std::pair<BitstreamCursor,
9148 serialization::ModuleFile *>>::iterator
9149 I = CommentsCursors.begin(),
9150 E = CommentsCursors.end();
9151 I != E; ++I) {
9152 Comments.clear();
9153 BitstreamCursor &Cursor = I->first;
9154 serialization::ModuleFile &F = *I->second;
9155 SavedStreamPosition SavedPosition(Cursor);
9156
9157 RecordData Record;
9158 while (true) {
9159 llvm::BitstreamEntry Entry =
9160 Cursor.advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd);
9161
9162 switch (Entry.Kind) {
9163 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
9164 case llvm::BitstreamEntry::Error:
9165 Error("malformed block record in AST file");
9166 return;
9167 case llvm::BitstreamEntry::EndBlock:
9168 goto NextCursor;
9169 case llvm::BitstreamEntry::Record:
9170 // The interesting case.
9171 break;
9172 }
9173
9174 // Read a record.
9175 Record.clear();
9176 switch ((CommentRecordTypes)Cursor.readRecord(Entry.ID, Record)) {
9177 case COMMENTS_RAW_COMMENT: {
9178 unsigned Idx = 0;
9179 SourceRange SR = ReadSourceRange(F, Record, Idx);
9180 RawComment::CommentKind Kind =
9181 (RawComment::CommentKind) Record[Idx++];
9182 bool IsTrailingComment = Record[Idx++];
9183 bool IsAlmostTrailingComment = Record[Idx++];
9184 Comments.push_back(new (Context) RawComment(
9185 SR, Kind, IsTrailingComment, IsAlmostTrailingComment));
9186 break;
9187 }
9188 }
9189 }
9190 NextCursor:
9191 // De-serialized SourceLocations get negative FileIDs for other modules,
9192 // potentially invalidating the original order. Sort it again.
9193 llvm::sort(Comments, BeforeThanCompare<RawComment>(SourceMgr));
9194 Context.Comments.addDeserializedComments(Comments);
9195 }
9196}
9197
9198void ASTReader::visitInputFiles(serialization::ModuleFile &MF,
9199 bool IncludeSystem, bool Complain,
9200 llvm::function_ref<void(const serialization::InputFile &IF,
9201 bool isSystem)> Visitor) {
9202 unsigned NumUserInputs = MF.NumUserInputFiles;
9203 unsigned NumInputs = MF.InputFilesLoaded.size();
9204 assert(NumUserInputs <= NumInputs)((NumUserInputs <= NumInputs) ? static_cast<void> (0
) : __assert_fail ("NumUserInputs <= NumInputs", "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 9204, __PRETTY_FUNCTION__))
;
9205 unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
9206 for (unsigned I = 0; I < N; ++I) {
9207 bool IsSystem = I >= NumUserInputs;
9208 InputFile IF = getInputFile(MF, I+1, Complain);
9209 Visitor(IF, IsSystem);
9210 }
9211}
9212
9213void ASTReader::visitTopLevelModuleMaps(
9214 serialization::ModuleFile &MF,
9215 llvm::function_ref<void(const FileEntry *FE)> Visitor) {
9216 unsigned NumInputs = MF.InputFilesLoaded.size();
9217 for (unsigned I = 0; I < NumInputs; ++I) {
9218 InputFileInfo IFI = readInputFileInfo(MF, I + 1);
9219 if (IFI.TopLevelModuleMap)
9220 // FIXME: This unnecessarily re-reads the InputFileInfo.
9221 if (auto *FE = getInputFile(MF, I + 1).getFile())
9222 Visitor(FE);
9223 }
9224}
9225
9226std::string ASTReader::getOwningModuleNameForDiagnostic(const Decl *D) {
9227 // If we know the owning module, use it.
9228 if (Module *M = D->getImportedOwningModule())
9229 return M->getFullModuleName();
9230
9231 // Otherwise, use the name of the top-level module the decl is within.
9232 if (ModuleFile *M = getOwningModuleFile(D))
9233 return M->ModuleName;
9234
9235 // Not from a module.
9236 return {};
9237}
9238
9239void ASTReader::finishPendingActions() {
9240 while (!PendingIdentifierInfos.empty() || !PendingFunctionTypes.empty() ||
9241 !PendingIncompleteDeclChains.empty() || !PendingDeclChains.empty() ||
9242 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() ||
9243 !PendingUpdateRecords.empty()) {
9244 // If any identifiers with corresponding top-level declarations have
9245 // been loaded, load those declarations now.
9246 using TopLevelDeclsMap =
9247 llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2>>;
9248 TopLevelDeclsMap TopLevelDecls;
9249
9250 while (!PendingIdentifierInfos.empty()) {
9251 IdentifierInfo *II = PendingIdentifierInfos.back().first;
9252 SmallVector<uint32_t, 4> DeclIDs =
9253 std::move(PendingIdentifierInfos.back().second);
9254 PendingIdentifierInfos.pop_back();
9255
9256 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]);
9257 }
9258
9259 // Load each function type that we deferred loading because it was a
9260 // deduced type that might refer to a local type declared within itself.
9261 for (unsigned I = 0; I != PendingFunctionTypes.size(); ++I) {
9262 auto *FD = PendingFunctionTypes[I].first;
9263 FD->setType(GetType(PendingFunctionTypes[I].second));
9264
9265 // If we gave a function a deduced return type, remember that we need to
9266 // propagate that along the redeclaration chain.
9267 auto *DT = FD->getReturnType()->getContainedDeducedType();
9268 if (DT && DT->isDeduced())
9269 PendingDeducedTypeUpdates.insert(
9270 {FD->getCanonicalDecl(), FD->getReturnType()});
9271 }
9272 PendingFunctionTypes.clear();
9273
9274 // For each decl chain that we wanted to complete while deserializing, mark
9275 // it as "still needs to be completed".
9276 for (unsigned I = 0; I != PendingIncompleteDeclChains.size(); ++I) {
9277 markIncompleteDeclChain(PendingIncompleteDeclChains[I]);
9278 }
9279 PendingIncompleteDeclChains.clear();
9280
9281 // Load pending declaration chains.
9282 for (unsigned I = 0; I != PendingDeclChains.size(); ++I)
9283 loadPendingDeclChain(PendingDeclChains[I].first,
9284 PendingDeclChains[I].second);
9285 PendingDeclChains.clear();
9286
9287 // Make the most recent of the top-level declarations visible.
9288 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
9289 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
9290 IdentifierInfo *II = TLD->first;
9291 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
9292 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II);
9293 }
9294 }
9295
9296 // Load any pending macro definitions.
9297 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
9298 IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
9299 SmallVector<PendingMacroInfo, 2> GlobalIDs;
9300 GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
9301 // Initialize the macro history from chained-PCHs ahead of module imports.
9302 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
9303 ++IDIdx) {
9304 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
9305 if (!Info.M->isModule())
9306 resolvePendingMacro(II, Info);
9307 }
9308 // Handle module imports.
9309 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
9310 ++IDIdx) {
9311 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
9312 if (Info.M->isModule())
9313 resolvePendingMacro(II, Info);
9314 }
9315 }
9316 PendingMacroIDs.clear();
9317
9318 // Wire up the DeclContexts for Decls that we delayed setting until
9319 // recursive loading is completed.
9320 while (!PendingDeclContextInfos.empty()) {
9321 PendingDeclContextInfo Info = PendingDeclContextInfos.front();
9322 PendingDeclContextInfos.pop_front();
9323 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC));
9324 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC));
9325 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext());
9326 }
9327
9328 // Perform any pending declaration updates.
9329 while (!PendingUpdateRecords.empty()) {
9330 auto Update = PendingUpdateRecords.pop_back_val();
9331 ReadingKindTracker ReadingKind(Read_Decl, *this);
9332 loadDeclUpdateRecords(Update);
9333 }
9334 }
9335
9336 // At this point, all update records for loaded decls are in place, so any
9337 // fake class definitions should have become real.
9338 assert(PendingFakeDefinitionData.empty() &&((PendingFakeDefinitionData.empty() && "faked up a class definition but never saw the real one"
) ? static_cast<void> (0) : __assert_fail ("PendingFakeDefinitionData.empty() && \"faked up a class definition but never saw the real one\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 9339, __PRETTY_FUNCTION__))
9339 "faked up a class definition but never saw the real one")((PendingFakeDefinitionData.empty() && "faked up a class definition but never saw the real one"
) ? static_cast<void> (0) : __assert_fail ("PendingFakeDefinitionData.empty() && \"faked up a class definition but never saw the real one\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 9339, __PRETTY_FUNCTION__))
;
9340
9341 // If we deserialized any C++ or Objective-C class definitions, any
9342 // Objective-C protocol definitions, or any redeclarable templates, make sure
9343 // that all redeclarations point to the definitions. Note that this can only
9344 // happen now, after the redeclaration chains have been fully wired.
9345 for (Decl *D : PendingDefinitions) {
9346 if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
9347 if (const TagType *TagT = dyn_cast<TagType>(TD->getTypeForDecl())) {
9348 // Make sure that the TagType points at the definition.
9349 const_cast<TagType*>(TagT)->decl = TD;
9350 }
9351
9352 if (auto RD = dyn_cast<CXXRecordDecl>(D)) {
9353 for (auto *R = getMostRecentExistingDecl(RD); R;
9354 R = R->getPreviousDecl()) {
9355 assert((R == D) ==(((R == D) == cast<CXXRecordDecl>(R)->isThisDeclarationADefinition
() && "declaration thinks it's the definition but it isn't"
) ? static_cast<void> (0) : __assert_fail ("(R == D) == cast<CXXRecordDecl>(R)->isThisDeclarationADefinition() && \"declaration thinks it's the definition but it isn't\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 9357, __PRETTY_FUNCTION__))
9356 cast<CXXRecordDecl>(R)->isThisDeclarationADefinition() &&(((R == D) == cast<CXXRecordDecl>(R)->isThisDeclarationADefinition
() && "declaration thinks it's the definition but it isn't"
) ? static_cast<void> (0) : __assert_fail ("(R == D) == cast<CXXRecordDecl>(R)->isThisDeclarationADefinition() && \"declaration thinks it's the definition but it isn't\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 9357, __PRETTY_FUNCTION__))
9357 "declaration thinks it's the definition but it isn't")(((R == D) == cast<CXXRecordDecl>(R)->isThisDeclarationADefinition
() && "declaration thinks it's the definition but it isn't"
) ? static_cast<void> (0) : __assert_fail ("(R == D) == cast<CXXRecordDecl>(R)->isThisDeclarationADefinition() && \"declaration thinks it's the definition but it isn't\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 9357, __PRETTY_FUNCTION__))
;
9358 cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData;
9359 }
9360 }
9361
9362 continue;
9363 }
9364
9365 if (auto ID = dyn_cast<ObjCInterfaceDecl>(D)) {
9366 // Make sure that the ObjCInterfaceType points at the definition.
9367 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl))
9368 ->Decl = ID;
9369
9370 for (auto *R = getMostRecentExistingDecl(ID); R; R = R->getPreviousDecl())
9371 cast<ObjCInterfaceDecl>(R)->Data = ID->Data;
9372
9373 continue;
9374 }
9375
9376 if (auto PD = dyn_cast<ObjCProtocolDecl>(D)) {
9377 for (auto *R = getMostRecentExistingDecl(PD); R; R = R->getPreviousDecl())
9378 cast<ObjCProtocolDecl>(R)->Data = PD->Data;
9379
9380 continue;
9381 }
9382
9383 auto RTD = cast<RedeclarableTemplateDecl>(D)->getCanonicalDecl();
9384 for (auto *R = getMostRecentExistingDecl(RTD); R; R = R->getPreviousDecl())
9385 cast<RedeclarableTemplateDecl>(R)->Common = RTD->Common;
9386 }
9387 PendingDefinitions.clear();
9388
9389 // Load the bodies of any functions or methods we've encountered. We do
9390 // this now (delayed) so that we can be sure that the declaration chains
9391 // have been fully wired up (hasBody relies on this).
9392 // FIXME: We shouldn't require complete redeclaration chains here.
9393 for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
9394 PBEnd = PendingBodies.end();
9395 PB != PBEnd; ++PB) {
9396 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
9397 // For a function defined inline within a class template, force the
9398 // canonical definition to be the one inside the canonical definition of
9399 // the template. This ensures that we instantiate from a correct view
9400 // of the template.
9401 //
9402 // Sadly we can't do this more generally: we can't be sure that all
9403 // copies of an arbitrary class definition will have the same members
9404 // defined (eg, some member functions may not be instantiated, and some
9405 // special members may or may not have been implicitly defined).
9406 if (auto *RD = dyn_cast<CXXRecordDecl>(FD->getLexicalParent()))
9407 if (RD->isDependentContext() && !RD->isThisDeclarationADefinition())
9408 continue;
9409
9410 // FIXME: Check for =delete/=default?
9411 // FIXME: Complain about ODR violations here?
9412 const FunctionDecl *Defn = nullptr;
9413 if (!getContext().getLangOpts().Modules || !FD->hasBody(Defn)) {
9414 FD->setLazyBody(PB->second);
9415 } else {
9416 auto *NonConstDefn = const_cast<FunctionDecl*>(Defn);
9417 mergeDefinitionVisibility(NonConstDefn, FD);
9418
9419 if (!FD->isLateTemplateParsed() &&
9420 !NonConstDefn->isLateTemplateParsed() &&
9421 FD->getODRHash() != NonConstDefn->getODRHash()) {
9422 if (!isa<CXXMethodDecl>(FD)) {
9423 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
9424 } else if (FD->getLexicalParent()->isFileContext() &&
9425 NonConstDefn->getLexicalParent()->isFileContext()) {
9426 // Only diagnose out-of-line method definitions. If they are
9427 // in class definitions, then an error will be generated when
9428 // processing the class bodies.
9429 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
9430 }
9431 }
9432 }
9433 continue;
9434 }
9435
9436 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first);
9437 if (!getContext().getLangOpts().Modules || !MD->hasBody())
9438 MD->setLazyBody(PB->second);
9439 }
9440 PendingBodies.clear();
9441
9442 // Do some cleanup.
9443 for (auto *ND : PendingMergedDefinitionsToDeduplicate)
9444 getContext().deduplicateMergedDefinitonsFor(ND);
9445 PendingMergedDefinitionsToDeduplicate.clear();
9446}
9447
9448void ASTReader::diagnoseOdrViolations() {
9449 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty() &&
9450 PendingFunctionOdrMergeFailures.empty() &&
9451 PendingEnumOdrMergeFailures.empty())
9452 return;
9453
9454 // Trigger the import of the full definition of each class that had any
9455 // odr-merging problems, so we can produce better diagnostics for them.
9456 // These updates may in turn find and diagnose some ODR failures, so take
9457 // ownership of the set first.
9458 auto OdrMergeFailures = std::move(PendingOdrMergeFailures);
9459 PendingOdrMergeFailures.clear();
9460 for (auto &Merge : OdrMergeFailures) {
9461 Merge.first->buildLookup();
9462 Merge.first->decls_begin();
9463 Merge.first->bases_begin();
9464 Merge.first->vbases_begin();
9465 for (auto &RecordPair : Merge.second) {
9466 auto *RD = RecordPair.first;
9467 RD->decls_begin();
9468 RD->bases_begin();
9469 RD->vbases_begin();
9470 }
9471 }
9472
9473 // Trigger the import of functions.
9474 auto FunctionOdrMergeFailures = std::move(PendingFunctionOdrMergeFailures);
9475 PendingFunctionOdrMergeFailures.clear();
9476 for (auto &Merge : FunctionOdrMergeFailures) {
9477 Merge.first->buildLookup();
9478 Merge.first->decls_begin();
9479 Merge.first->getBody();
9480 for (auto &FD : Merge.second) {
9481 FD->buildLookup();
9482 FD->decls_begin();
9483 FD->getBody();
9484 }
9485 }
9486
9487 // Trigger the import of enums.
9488 auto EnumOdrMergeFailures = std::move(PendingEnumOdrMergeFailures);
9489 PendingEnumOdrMergeFailures.clear();
9490 for (auto &Merge : EnumOdrMergeFailures) {
9491 Merge.first->decls_begin();
9492 for (auto &Enum : Merge.second) {
9493 Enum->decls_begin();
9494 }
9495 }
9496
9497 // For each declaration from a merged context, check that the canonical
9498 // definition of that context also contains a declaration of the same
9499 // entity.
9500 //
9501 // Caution: this loop does things that might invalidate iterators into
9502 // PendingOdrMergeChecks. Don't turn this into a range-based for loop!
9503 while (!PendingOdrMergeChecks.empty()) {
9504 NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
9505
9506 // FIXME: Skip over implicit declarations for now. This matters for things
9507 // like implicitly-declared special member functions. This isn't entirely
9508 // correct; we can end up with multiple unmerged declarations of the same
9509 // implicit entity.
9510 if (D->isImplicit())
9511 continue;
9512
9513 DeclContext *CanonDef = D->getDeclContext();
9514
9515 bool Found = false;
9516 const Decl *DCanon = D->getCanonicalDecl();
9517
9518 for (auto RI : D->redecls()) {
9519 if (RI->getLexicalDeclContext() == CanonDef) {
9520 Found = true;
9521 break;
9522 }
9523 }
9524 if (Found)
9525 continue;
9526
9527 // Quick check failed, time to do the slow thing. Note, we can't just
9528 // look up the name of D in CanonDef here, because the member that is
9529 // in CanonDef might not be found by name lookup (it might have been
9530 // replaced by a more recent declaration in the lookup table), and we
9531 // can't necessarily find it in the redeclaration chain because it might
9532 // be merely mergeable, not redeclarable.
9533 llvm::SmallVector<const NamedDecl*, 4> Candidates;
9534 for (auto *CanonMember : CanonDef->decls()) {
9535 if (CanonMember->getCanonicalDecl() == DCanon) {
9536 // This can happen if the declaration is merely mergeable and not
9537 // actually redeclarable (we looked for redeclarations earlier).
9538 //
9539 // FIXME: We should be able to detect this more efficiently, without
9540 // pulling in all of the members of CanonDef.
9541 Found = true;
9542 break;
9543 }
9544 if (auto *ND = dyn_cast<NamedDecl>(CanonMember))
9545 if (ND->getDeclName() == D->getDeclName())
9546 Candidates.push_back(ND);
9547 }
9548
9549 if (!Found) {
9550 // The AST doesn't like TagDecls becoming invalid after they've been
9551 // completed. We only really need to mark FieldDecls as invalid here.
9552 if (!isa<TagDecl>(D))
9553 D->setInvalidDecl();
9554
9555 // Ensure we don't accidentally recursively enter deserialization while
9556 // we're producing our diagnostic.
9557 Deserializing RecursionGuard(this);
9558
9559 std::string CanonDefModule =
9560 getOwningModuleNameForDiagnostic(cast<Decl>(CanonDef));
9561 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl)
9562 << D << getOwningModuleNameForDiagnostic(D)
9563 << CanonDef << CanonDefModule.empty() << CanonDefModule;
9564
9565 if (Candidates.empty())
9566 Diag(cast<Decl>(CanonDef)->getLocation(),
9567 diag::note_module_odr_violation_no_possible_decls) << D;
9568 else {
9569 for (unsigned I = 0, N = Candidates.size(); I != N; ++I)
9570 Diag(Candidates[I]->getLocation(),
9571 diag::note_module_odr_violation_possible_decl)
9572 << Candidates[I];
9573 }
9574
9575 DiagnosedOdrMergeFailures.insert(CanonDef);
9576 }
9577 }
9578
9579 if (OdrMergeFailures.empty() && FunctionOdrMergeFailures.empty() &&
9580 EnumOdrMergeFailures.empty())
9581 return;
9582
9583 // Ensure we don't accidentally recursively enter deserialization while
9584 // we're producing our diagnostics.
9585 Deserializing RecursionGuard(this);
9586
9587 // Common code for hashing helpers.
9588 ODRHash Hash;
9589 auto ComputeQualTypeODRHash = [&Hash](QualType Ty) {
9590 Hash.clear();
9591 Hash.AddQualType(Ty);
9592 return Hash.CalculateHash();
9593 };
9594
9595 auto ComputeODRHash = [&Hash](const Stmt *S) {
9596 assert(S)((S) ? static_cast<void> (0) : __assert_fail ("S", "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 9596, __PRETTY_FUNCTION__))
;
9597 Hash.clear();
9598 Hash.AddStmt(S);
9599 return Hash.CalculateHash();
9600 };
9601
9602 auto ComputeSubDeclODRHash = [&Hash](const Decl *D) {
9603 assert(D)((D) ? static_cast<void> (0) : __assert_fail ("D", "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 9603, __PRETTY_FUNCTION__))
;
9604 Hash.clear();
9605 Hash.AddSubDecl(D);
9606 return Hash.CalculateHash();
9607 };
9608
9609 auto ComputeTemplateArgumentODRHash = [&Hash](const TemplateArgument &TA) {
9610 Hash.clear();
9611 Hash.AddTemplateArgument(TA);
9612 return Hash.CalculateHash();
9613 };
9614
9615 auto ComputeTemplateParameterListODRHash =
9616 [&Hash](const TemplateParameterList *TPL) {
9617 assert(TPL)((TPL) ? static_cast<void> (0) : __assert_fail ("TPL", "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 9617, __PRETTY_FUNCTION__))
;
9618 Hash.clear();
9619 Hash.AddTemplateParameterList(TPL);
9620 return Hash.CalculateHash();
9621 };
9622
9623 // Issue any pending ODR-failure diagnostics.
9624 for (auto &Merge : OdrMergeFailures) {
9625 // If we've already pointed out a specific problem with this class, don't
9626 // bother issuing a general "something's different" diagnostic.
9627 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
9628 continue;
9629
9630 bool Diagnosed = false;
9631 CXXRecordDecl *FirstRecord = Merge.first;
9632 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstRecord);
9633 for (auto &RecordPair : Merge.second) {
9634 CXXRecordDecl *SecondRecord = RecordPair.first;
9635 // Multiple different declarations got merged together; tell the user
9636 // where they came from.
9637 if (FirstRecord == SecondRecord)
9638 continue;
9639
9640 std::string SecondModule = getOwningModuleNameForDiagnostic(SecondRecord);
9641
9642 auto *FirstDD = FirstRecord->DefinitionData;
9643 auto *SecondDD = RecordPair.second;
9644
9645 assert(FirstDD && SecondDD && "Definitions without DefinitionData")((FirstDD && SecondDD && "Definitions without DefinitionData"
) ? static_cast<void> (0) : __assert_fail ("FirstDD && SecondDD && \"Definitions without DefinitionData\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 9645, __PRETTY_FUNCTION__))
;
9646
9647 // Diagnostics from DefinitionData are emitted here.
9648 if (FirstDD != SecondDD) {
9649 enum ODRDefinitionDataDifference {
9650 NumBases,
9651 NumVBases,
9652 BaseType,
9653 BaseVirtual,
9654 BaseAccess,
9655 };
9656 auto ODRDiagError = [FirstRecord, &FirstModule,
9657 this](SourceLocation Loc, SourceRange Range,
9658 ODRDefinitionDataDifference DiffType) {
9659 return Diag(Loc, diag::err_module_odr_violation_definition_data)
9660 << FirstRecord << FirstModule.empty() << FirstModule << Range
9661 << DiffType;
9662 };
9663 auto ODRDiagNote = [&SecondModule,
9664 this](SourceLocation Loc, SourceRange Range,
9665 ODRDefinitionDataDifference DiffType) {
9666 return Diag(Loc, diag::note_module_odr_violation_definition_data)
9667 << SecondModule << Range << DiffType;
9668 };
9669
9670 unsigned FirstNumBases = FirstDD->NumBases;
9671 unsigned FirstNumVBases = FirstDD->NumVBases;
9672 unsigned SecondNumBases = SecondDD->NumBases;
9673 unsigned SecondNumVBases = SecondDD->NumVBases;
9674
9675 auto GetSourceRange = [](struct CXXRecordDecl::DefinitionData *DD) {
9676 unsigned NumBases = DD->NumBases;
9677 if (NumBases == 0) return SourceRange();
9678 auto bases = DD->bases();
9679 return SourceRange(bases[0].getBeginLoc(),
9680 bases[NumBases - 1].getEndLoc());
9681 };
9682
9683 if (FirstNumBases != SecondNumBases) {
9684 ODRDiagError(FirstRecord->getLocation(), GetSourceRange(FirstDD),
9685 NumBases)
9686 << FirstNumBases;
9687 ODRDiagNote(SecondRecord->getLocation(), GetSourceRange(SecondDD),
9688 NumBases)
9689 << SecondNumBases;
9690 Diagnosed = true;
9691 break;
9692 }
9693
9694 if (FirstNumVBases != SecondNumVBases) {
9695 ODRDiagError(FirstRecord->getLocation(), GetSourceRange(FirstDD),
9696 NumVBases)
9697 << FirstNumVBases;
9698 ODRDiagNote(SecondRecord->getLocation(), GetSourceRange(SecondDD),
9699 NumVBases)
9700 << SecondNumVBases;
9701 Diagnosed = true;
9702 break;
9703 }
9704
9705 auto FirstBases = FirstDD->bases();
9706 auto SecondBases = SecondDD->bases();
9707 unsigned i = 0;
9708 for (i = 0; i < FirstNumBases; ++i) {
9709 auto FirstBase = FirstBases[i];
9710 auto SecondBase = SecondBases[i];
9711 if (ComputeQualTypeODRHash(FirstBase.getType()) !=
9712 ComputeQualTypeODRHash(SecondBase.getType())) {
9713 ODRDiagError(FirstRecord->getLocation(), FirstBase.getSourceRange(),
9714 BaseType)
9715 << (i + 1) << FirstBase.getType();
9716 ODRDiagNote(SecondRecord->getLocation(),
9717 SecondBase.getSourceRange(), BaseType)
9718 << (i + 1) << SecondBase.getType();
9719 break;
9720 }
9721
9722 if (FirstBase.isVirtual() != SecondBase.isVirtual()) {
9723 ODRDiagError(FirstRecord->getLocation(), FirstBase.getSourceRange(),
9724 BaseVirtual)
9725 << (i + 1) << FirstBase.isVirtual() << FirstBase.getType();
9726 ODRDiagNote(SecondRecord->getLocation(),
9727 SecondBase.getSourceRange(), BaseVirtual)
9728 << (i + 1) << SecondBase.isVirtual() << SecondBase.getType();
9729 break;
9730 }
9731
9732 if (FirstBase.getAccessSpecifierAsWritten() !=
9733 SecondBase.getAccessSpecifierAsWritten()) {
9734 ODRDiagError(FirstRecord->getLocation(), FirstBase.getSourceRange(),
9735 BaseAccess)
9736 << (i + 1) << FirstBase.getType()
9737 << (int)FirstBase.getAccessSpecifierAsWritten();
9738 ODRDiagNote(SecondRecord->getLocation(),
9739 SecondBase.getSourceRange(), BaseAccess)
9740 << (i + 1) << SecondBase.getType()
9741 << (int)SecondBase.getAccessSpecifierAsWritten();
9742 break;
9743 }
9744 }
9745
9746 if (i != FirstNumBases) {
9747 Diagnosed = true;
9748 break;
9749 }
9750 }
9751
9752 using DeclHashes = llvm::SmallVector<std::pair<Decl *, unsigned>, 4>;
9753
9754 const ClassTemplateDecl *FirstTemplate =
9755 FirstRecord->getDescribedClassTemplate();
9756 const ClassTemplateDecl *SecondTemplate =
9757 SecondRecord->getDescribedClassTemplate();
9758
9759 assert(!FirstTemplate == !SecondTemplate &&((!FirstTemplate == !SecondTemplate && "Both pointers should be null or non-null"
) ? static_cast<void> (0) : __assert_fail ("!FirstTemplate == !SecondTemplate && \"Both pointers should be null or non-null\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 9760, __PRETTY_FUNCTION__))
9760 "Both pointers should be null or non-null")((!FirstTemplate == !SecondTemplate && "Both pointers should be null or non-null"
) ? static_cast<void> (0) : __assert_fail ("!FirstTemplate == !SecondTemplate && \"Both pointers should be null or non-null\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 9760, __PRETTY_FUNCTION__))
;
9761
9762 enum ODRTemplateDifference {
9763 ParamEmptyName,
9764 ParamName,
9765 ParamSingleDefaultArgument,
9766 ParamDifferentDefaultArgument,
9767 };
9768
9769 if (FirstTemplate && SecondTemplate) {
9770 DeclHashes FirstTemplateHashes;
9771 DeclHashes SecondTemplateHashes;
9772
9773 auto PopulateTemplateParameterHashs =
9774 [&ComputeSubDeclODRHash](DeclHashes &Hashes,
9775 const ClassTemplateDecl *TD) {
9776 for (auto *D : TD->getTemplateParameters()->asArray()) {
9777 Hashes.emplace_back(D, ComputeSubDeclODRHash(D));
9778 }
9779 };
9780
9781 PopulateTemplateParameterHashs(FirstTemplateHashes, FirstTemplate);
9782 PopulateTemplateParameterHashs(SecondTemplateHashes, SecondTemplate);
9783
9784 assert(FirstTemplateHashes.size() == SecondTemplateHashes.size() &&((FirstTemplateHashes.size() == SecondTemplateHashes.size() &&
"Number of template parameters should be equal.") ? static_cast
<void> (0) : __assert_fail ("FirstTemplateHashes.size() == SecondTemplateHashes.size() && \"Number of template parameters should be equal.\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 9785, __PRETTY_FUNCTION__))
9785 "Number of template parameters should be equal.")((FirstTemplateHashes.size() == SecondTemplateHashes.size() &&
"Number of template parameters should be equal.") ? static_cast
<void> (0) : __assert_fail ("FirstTemplateHashes.size() == SecondTemplateHashes.size() && \"Number of template parameters should be equal.\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 9785, __PRETTY_FUNCTION__))
;
9786
9787 auto FirstIt = FirstTemplateHashes.begin();
9788 auto FirstEnd = FirstTemplateHashes.end();
9789 auto SecondIt = SecondTemplateHashes.begin();
9790 for (; FirstIt != FirstEnd; ++FirstIt, ++SecondIt) {
9791 if (FirstIt->second == SecondIt->second)
9792 continue;
9793
9794 auto ODRDiagError = [FirstRecord, &FirstModule,
9795 this](SourceLocation Loc, SourceRange Range,
9796 ODRTemplateDifference DiffType) {
9797 return Diag(Loc, diag::err_module_odr_violation_template_parameter)
9798 << FirstRecord << FirstModule.empty() << FirstModule << Range
9799 << DiffType;
9800 };
9801 auto ODRDiagNote = [&SecondModule,
9802 this](SourceLocation Loc, SourceRange Range,
9803 ODRTemplateDifference DiffType) {
9804 return Diag(Loc, diag::note_module_odr_violation_template_parameter)
9805 << SecondModule << Range << DiffType;
9806 };
9807
9808 const NamedDecl* FirstDecl = cast<NamedDecl>(FirstIt->first);
9809 const NamedDecl* SecondDecl = cast<NamedDecl>(SecondIt->first);
9810
9811 assert(FirstDecl->getKind() == SecondDecl->getKind() &&((FirstDecl->getKind() == SecondDecl->getKind() &&
"Parameter Decl's should be the same kind.") ? static_cast<
void> (0) : __assert_fail ("FirstDecl->getKind() == SecondDecl->getKind() && \"Parameter Decl's should be the same kind.\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 9812, __PRETTY_FUNCTION__))
9812 "Parameter Decl's should be the same kind.")((FirstDecl->getKind() == SecondDecl->getKind() &&
"Parameter Decl's should be the same kind.") ? static_cast<
void> (0) : __assert_fail ("FirstDecl->getKind() == SecondDecl->getKind() && \"Parameter Decl's should be the same kind.\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 9812, __PRETTY_FUNCTION__))
;
9813
9814 DeclarationName FirstName = FirstDecl->getDeclName();
9815 DeclarationName SecondName = SecondDecl->getDeclName();
9816
9817 if (FirstName != SecondName) {
9818 const bool FirstNameEmpty =
9819 FirstName.isIdentifier() && !FirstName.getAsIdentifierInfo();
9820 const bool SecondNameEmpty =
9821 SecondName.isIdentifier() && !SecondName.getAsIdentifierInfo();
9822 assert((!FirstNameEmpty || !SecondNameEmpty) &&(((!FirstNameEmpty || !SecondNameEmpty) && "Both template parameters cannot be unnamed."
) ? static_cast<void> (0) : __assert_fail ("(!FirstNameEmpty || !SecondNameEmpty) && \"Both template parameters cannot be unnamed.\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 9823, __PRETTY_FUNCTION__))
9823 "Both template parameters cannot be unnamed.")(((!FirstNameEmpty || !SecondNameEmpty) && "Both template parameters cannot be unnamed."
) ? static_cast<void> (0) : __assert_fail ("(!FirstNameEmpty || !SecondNameEmpty) && \"Both template parameters cannot be unnamed.\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 9823, __PRETTY_FUNCTION__))
;
9824 ODRDiagError(FirstDecl->getLocation(), FirstDecl->getSourceRange(),
9825 FirstNameEmpty ? ParamEmptyName : ParamName)
9826 << FirstName;
9827 ODRDiagNote(SecondDecl->getLocation(), SecondDecl->getSourceRange(),
9828 SecondNameEmpty ? ParamEmptyName : ParamName)
9829 << SecondName;
9830 break;
9831 }
9832
9833 switch (FirstDecl->getKind()) {
9834 default:
9835 llvm_unreachable("Invalid template parameter type.")::llvm::llvm_unreachable_internal("Invalid template parameter type."
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 9835)
;
9836 case Decl::TemplateTypeParm: {
9837 const auto *FirstParam = cast<TemplateTypeParmDecl>(FirstDecl);
9838 const auto *SecondParam = cast<TemplateTypeParmDecl>(SecondDecl);
9839 const bool HasFirstDefaultArgument =
9840 FirstParam->hasDefaultArgument() &&
9841 !FirstParam->defaultArgumentWasInherited();
9842 const bool HasSecondDefaultArgument =
9843 SecondParam->hasDefaultArgument() &&
9844 !SecondParam->defaultArgumentWasInherited();
9845
9846 if (HasFirstDefaultArgument != HasSecondDefaultArgument) {
9847 ODRDiagError(FirstDecl->getLocation(),
9848 FirstDecl->getSourceRange(),
9849 ParamSingleDefaultArgument)
9850 << HasFirstDefaultArgument;
9851 ODRDiagNote(SecondDecl->getLocation(),
9852 SecondDecl->getSourceRange(),
9853 ParamSingleDefaultArgument)
9854 << HasSecondDefaultArgument;
9855 break;
9856 }
9857
9858 assert(HasFirstDefaultArgument && HasSecondDefaultArgument &&((HasFirstDefaultArgument && HasSecondDefaultArgument
&& "Expecting default arguments.") ? static_cast<
void> (0) : __assert_fail ("HasFirstDefaultArgument && HasSecondDefaultArgument && \"Expecting default arguments.\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 9859, __PRETTY_FUNCTION__))
9859 "Expecting default arguments.")((HasFirstDefaultArgument && HasSecondDefaultArgument
&& "Expecting default arguments.") ? static_cast<
void> (0) : __assert_fail ("HasFirstDefaultArgument && HasSecondDefaultArgument && \"Expecting default arguments.\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 9859, __PRETTY_FUNCTION__))
;
9860
9861 ODRDiagError(FirstDecl->getLocation(), FirstDecl->getSourceRange(),
9862 ParamDifferentDefaultArgument);
9863 ODRDiagNote(SecondDecl->getLocation(), SecondDecl->getSourceRange(),
9864 ParamDifferentDefaultArgument);
9865
9866 break;
9867 }
9868 case Decl::NonTypeTemplateParm: {
9869 const auto *FirstParam = cast<NonTypeTemplateParmDecl>(FirstDecl);
9870 const auto *SecondParam = cast<NonTypeTemplateParmDecl>(SecondDecl);
9871 const bool HasFirstDefaultArgument =
9872 FirstParam->hasDefaultArgument() &&
9873 !FirstParam->defaultArgumentWasInherited();
9874 const bool HasSecondDefaultArgument =
9875 SecondParam->hasDefaultArgument() &&
9876 !SecondParam->defaultArgumentWasInherited();
9877
9878 if (HasFirstDefaultArgument != HasSecondDefaultArgument) {
9879 ODRDiagError(FirstDecl->getLocation(),
9880 FirstDecl->getSourceRange(),
9881 ParamSingleDefaultArgument)
9882 << HasFirstDefaultArgument;
9883 ODRDiagNote(SecondDecl->getLocation(),
9884 SecondDecl->getSourceRange(),
9885 ParamSingleDefaultArgument)
9886 << HasSecondDefaultArgument;
9887 break;
9888 }
9889
9890 assert(HasFirstDefaultArgument && HasSecondDefaultArgument &&((HasFirstDefaultArgument && HasSecondDefaultArgument
&& "Expecting default arguments.") ? static_cast<
void> (0) : __assert_fail ("HasFirstDefaultArgument && HasSecondDefaultArgument && \"Expecting default arguments.\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 9891, __PRETTY_FUNCTION__))
9891 "Expecting default arguments.")((HasFirstDefaultArgument && HasSecondDefaultArgument
&& "Expecting default arguments.") ? static_cast<
void> (0) : __assert_fail ("HasFirstDefaultArgument && HasSecondDefaultArgument && \"Expecting default arguments.\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 9891, __PRETTY_FUNCTION__))
;
9892
9893 ODRDiagError(FirstDecl->getLocation(), FirstDecl->getSourceRange(),
9894 ParamDifferentDefaultArgument);
9895 ODRDiagNote(SecondDecl->getLocation(), SecondDecl->getSourceRange(),
9896 ParamDifferentDefaultArgument);
9897
9898 break;
9899 }
9900 case Decl::TemplateTemplateParm: {
9901 const auto *FirstParam = cast<TemplateTemplateParmDecl>(FirstDecl);
9902 const auto *SecondParam =
9903 cast<TemplateTemplateParmDecl>(SecondDecl);
9904 const bool HasFirstDefaultArgument =
9905 FirstParam->hasDefaultArgument() &&
9906 !FirstParam->defaultArgumentWasInherited();
9907 const bool HasSecondDefaultArgument =
9908 SecondParam->hasDefaultArgument() &&
9909 !SecondParam->defaultArgumentWasInherited();
9910
9911 if (HasFirstDefaultArgument != HasSecondDefaultArgument) {
9912 ODRDiagError(FirstDecl->getLocation(),
9913 FirstDecl->getSourceRange(),
9914 ParamSingleDefaultArgument)
9915 << HasFirstDefaultArgument;
9916 ODRDiagNote(SecondDecl->getLocation(),
9917 SecondDecl->getSourceRange(),
9918 ParamSingleDefaultArgument)
9919 << HasSecondDefaultArgument;
9920 break;
9921 }
9922
9923 assert(HasFirstDefaultArgument && HasSecondDefaultArgument &&((HasFirstDefaultArgument && HasSecondDefaultArgument
&& "Expecting default arguments.") ? static_cast<
void> (0) : __assert_fail ("HasFirstDefaultArgument && HasSecondDefaultArgument && \"Expecting default arguments.\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 9924, __PRETTY_FUNCTION__))
9924 "Expecting default arguments.")((HasFirstDefaultArgument && HasSecondDefaultArgument
&& "Expecting default arguments.") ? static_cast<
void> (0) : __assert_fail ("HasFirstDefaultArgument && HasSecondDefaultArgument && \"Expecting default arguments.\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 9924, __PRETTY_FUNCTION__))
;
9925
9926 ODRDiagError(FirstDecl->getLocation(), FirstDecl->getSourceRange(),
9927 ParamDifferentDefaultArgument);
9928 ODRDiagNote(SecondDecl->getLocation(), SecondDecl->getSourceRange(),
9929 ParamDifferentDefaultArgument);
9930
9931 break;
9932 }
9933 }
9934
9935 break;
9936 }
9937
9938 if (FirstIt != FirstEnd) {
9939 Diagnosed = true;
9940 break;
9941 }
9942 }
9943
9944 DeclHashes FirstHashes;
9945 DeclHashes SecondHashes;
9946
9947 auto PopulateHashes = [&ComputeSubDeclODRHash, FirstRecord](
9948 DeclHashes &Hashes, CXXRecordDecl *Record) {
9949 for (auto *D : Record->decls()) {
9950 // Due to decl merging, the first CXXRecordDecl is the parent of
9951 // Decls in both records.
9952 if (!ODRHash::isWhitelistedDecl(D, FirstRecord))
9953 continue;
9954 Hashes.emplace_back(D, ComputeSubDeclODRHash(D));
9955 }
9956 };
9957 PopulateHashes(FirstHashes, FirstRecord);
9958 PopulateHashes(SecondHashes, SecondRecord);
9959
9960 // Used with err_module_odr_violation_mismatch_decl and
9961 // note_module_odr_violation_mismatch_decl
9962 // This list should be the same Decl's as in ODRHash::isWhiteListedDecl
9963 enum {
9964 EndOfClass,
9965 PublicSpecifer,
9966 PrivateSpecifer,
9967 ProtectedSpecifer,
9968 StaticAssert,
9969 Field,
9970 CXXMethod,
9971 TypeAlias,
9972 TypeDef,
9973 Var,
9974 Friend,
9975 FunctionTemplate,
9976 Other
9977 } FirstDiffType = Other,
9978 SecondDiffType = Other;
9979
9980 auto DifferenceSelector = [](Decl *D) {
9981 assert(D && "valid Decl required")((D && "valid Decl required") ? static_cast<void>
(0) : __assert_fail ("D && \"valid Decl required\"",
"/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 9981, __PRETTY_FUNCTION__))
;
9982 switch (D->getKind()) {
9983 default:
9984 return Other;
9985 case Decl::AccessSpec:
9986 switch (D->getAccess()) {
9987 case AS_public:
9988 return PublicSpecifer;
9989 case AS_private:
9990 return PrivateSpecifer;
9991 case AS_protected:
9992 return ProtectedSpecifer;
9993 case AS_none:
9994 break;
9995 }
9996 llvm_unreachable("Invalid access specifier")::llvm::llvm_unreachable_internal("Invalid access specifier",
"/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 9996)
;
9997 case Decl::StaticAssert:
9998 return StaticAssert;
9999 case Decl::Field:
10000 return Field;
10001 case Decl::CXXMethod:
10002 case Decl::CXXConstructor:
10003 case Decl::CXXDestructor:
10004 return CXXMethod;
10005 case Decl::TypeAlias:
10006 return TypeAlias;
10007 case Decl::Typedef:
10008 return TypeDef;
10009 case Decl::Var:
10010 return Var;
10011 case Decl::Friend:
10012 return Friend;
10013 case Decl::FunctionTemplate:
10014 return FunctionTemplate;
10015 }
10016 };
10017
10018 Decl *FirstDecl = nullptr;
10019 Decl *SecondDecl = nullptr;
10020 auto FirstIt = FirstHashes.begin();
10021 auto SecondIt = SecondHashes.begin();
10022
10023 // If there is a diagnoseable difference, FirstDiffType and
10024 // SecondDiffType will not be Other and FirstDecl and SecondDecl will be
10025 // filled in if not EndOfClass.
10026 while (FirstIt != FirstHashes.end() || SecondIt != SecondHashes.end()) {
10027 if (FirstIt != FirstHashes.end() && SecondIt != SecondHashes.end() &&
10028 FirstIt->second == SecondIt->second) {
10029 ++FirstIt;
10030 ++SecondIt;
10031 continue;
10032 }
10033
10034 FirstDecl = FirstIt == FirstHashes.end() ? nullptr : FirstIt->first;
10035 SecondDecl = SecondIt == SecondHashes.end() ? nullptr : SecondIt->first;
10036
10037 FirstDiffType = FirstDecl ? DifferenceSelector(FirstDecl) : EndOfClass;
10038 SecondDiffType =
10039 SecondDecl ? DifferenceSelector(SecondDecl) : EndOfClass;
10040
10041 break;
10042 }
10043
10044 if (FirstDiffType == Other || SecondDiffType == Other) {
10045 // Reaching this point means an unexpected Decl was encountered
10046 // or no difference was detected. This causes a generic error
10047 // message to be emitted.
10048 Diag(FirstRecord->getLocation(),
10049 diag::err_module_odr_violation_different_definitions)
10050 << FirstRecord << FirstModule.empty() << FirstModule;
10051
10052 if (FirstDecl) {
10053 Diag(FirstDecl->getLocation(), diag::note_first_module_difference)
10054 << FirstRecord << FirstDecl->getSourceRange();
10055 }
10056
10057 Diag(SecondRecord->getLocation(),
10058 diag::note_module_odr_violation_different_definitions)
10059 << SecondModule;
10060
10061 if (SecondDecl) {
10062 Diag(SecondDecl->getLocation(), diag::note_second_module_difference)
10063 << SecondDecl->getSourceRange();
10064 }
10065
10066 Diagnosed = true;
10067 break;
10068 }
10069
10070 if (FirstDiffType != SecondDiffType) {
10071 SourceLocation FirstLoc;
10072 SourceRange FirstRange;
10073 if (FirstDiffType == EndOfClass) {
10074 FirstLoc = FirstRecord->getBraceRange().getEnd();
10075 } else {
10076 FirstLoc = FirstIt->first->getLocation();
10077 FirstRange = FirstIt->first->getSourceRange();
10078 }
10079 Diag(FirstLoc, diag::err_module_odr_violation_mismatch_decl)
10080 << FirstRecord << FirstModule.empty() << FirstModule << FirstRange
10081 << FirstDiffType;
10082
10083 SourceLocation SecondLoc;
10084 SourceRange SecondRange;
10085 if (SecondDiffType == EndOfClass) {
10086 SecondLoc = SecondRecord->getBraceRange().getEnd();
10087 } else {
10088 SecondLoc = SecondDecl->getLocation();
10089 SecondRange = SecondDecl->getSourceRange();
10090 }
10091 Diag(SecondLoc, diag::note_module_odr_violation_mismatch_decl)
10092 << SecondModule << SecondRange << SecondDiffType;
10093 Diagnosed = true;
10094 break;
10095 }
10096
10097 assert(FirstDiffType == SecondDiffType)((FirstDiffType == SecondDiffType) ? static_cast<void> (
0) : __assert_fail ("FirstDiffType == SecondDiffType", "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 10097, __PRETTY_FUNCTION__))
;
10098
10099 // Used with err_module_odr_violation_mismatch_decl_diff and
10100 // note_module_odr_violation_mismatch_decl_diff
10101 enum ODRDeclDifference {
10102 StaticAssertCondition,
10103 StaticAssertMessage,
10104 StaticAssertOnlyMessage,
10105 FieldName,
10106 FieldTypeName,
10107 FieldSingleBitField,
10108 FieldDifferentWidthBitField,
10109 FieldSingleMutable,
10110 FieldSingleInitializer,
10111 FieldDifferentInitializers,
10112 MethodName,
10113 MethodDeleted,
10114 MethodDefaulted,
10115 MethodVirtual,
10116 MethodStatic,
10117 MethodVolatile,
10118 MethodConst,
10119 MethodInline,
10120 MethodNumberParameters,
10121 MethodParameterType,
10122 MethodParameterName,
10123 MethodParameterSingleDefaultArgument,
10124 MethodParameterDifferentDefaultArgument,
10125 MethodNoTemplateArguments,
10126 MethodDifferentNumberTemplateArguments,
10127 MethodDifferentTemplateArgument,
10128 MethodSingleBody,
10129 MethodDifferentBody,
10130 TypedefName,
10131 TypedefType,
10132 VarName,
10133 VarType,
10134 VarSingleInitializer,
10135 VarDifferentInitializer,
10136 VarConstexpr,
10137 FriendTypeFunction,
10138 FriendType,
10139 FriendFunction,
10140 FunctionTemplateDifferentNumberParameters,
10141 FunctionTemplateParameterDifferentKind,
10142 FunctionTemplateParameterName,
10143 FunctionTemplateParameterSingleDefaultArgument,
10144 FunctionTemplateParameterDifferentDefaultArgument,
10145 FunctionTemplateParameterDifferentType,
10146 FunctionTemplatePackParameter,
10147 };
10148
10149 // These lambdas have the common portions of the ODR diagnostics. This
10150 // has the same return as Diag(), so addition parameters can be passed
10151 // in with operator<<
10152 auto ODRDiagError = [FirstRecord, &FirstModule, this](
10153 SourceLocation Loc, SourceRange Range, ODRDeclDifference DiffType) {
10154 return Diag(Loc, diag::err_module_odr_violation_mismatch_decl_diff)
10155 << FirstRecord << FirstModule.empty() << FirstModule << Range
10156 << DiffType;
10157 };
10158 auto ODRDiagNote = [&SecondModule, this](
10159 SourceLocation Loc, SourceRange Range, ODRDeclDifference DiffType) {
10160 return Diag(Loc, diag::note_module_odr_violation_mismatch_decl_diff)
10161 << SecondModule << Range << DiffType;
10162 };
10163
10164 switch (FirstDiffType) {
10165 case Other:
10166 case EndOfClass:
10167 case PublicSpecifer:
10168 case PrivateSpecifer:
10169 case ProtectedSpecifer:
10170 llvm_unreachable("Invalid diff type")::llvm::llvm_unreachable_internal("Invalid diff type", "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 10170)
;
10171
10172 case StaticAssert: {
10173 StaticAssertDecl *FirstSA = cast<StaticAssertDecl>(FirstDecl);
10174 StaticAssertDecl *SecondSA = cast<StaticAssertDecl>(SecondDecl);
10175
10176 Expr *FirstExpr = FirstSA->getAssertExpr();
10177 Expr *SecondExpr = SecondSA->getAssertExpr();
10178 unsigned FirstODRHash = ComputeODRHash(FirstExpr);
10179 unsigned SecondODRHash = ComputeODRHash(SecondExpr);
10180 if (FirstODRHash != SecondODRHash) {
10181 ODRDiagError(FirstExpr->getBeginLoc(), FirstExpr->getSourceRange(),
10182 StaticAssertCondition);
10183 ODRDiagNote(SecondExpr->getBeginLoc(), SecondExpr->getSourceRange(),
10184 StaticAssertCondition);
10185 Diagnosed = true;
10186 break;
10187 }
10188
10189 StringLiteral *FirstStr = FirstSA->getMessage();
10190 StringLiteral *SecondStr = SecondSA->getMessage();
10191 assert((FirstStr || SecondStr) && "Both messages cannot be empty")(((FirstStr || SecondStr) && "Both messages cannot be empty"
) ? static_cast<void> (0) : __assert_fail ("(FirstStr || SecondStr) && \"Both messages cannot be empty\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 10191, __PRETTY_FUNCTION__))
;
10192 if ((FirstStr && !SecondStr) || (!FirstStr && SecondStr)) {
10193 SourceLocation FirstLoc, SecondLoc;
10194 SourceRange FirstRange, SecondRange;
10195 if (FirstStr) {
10196 FirstLoc = FirstStr->getBeginLoc();
10197 FirstRange = FirstStr->getSourceRange();
10198 } else {
10199 FirstLoc = FirstSA->getBeginLoc();
10200 FirstRange = FirstSA->getSourceRange();
10201 }
10202 if (SecondStr) {
10203 SecondLoc = SecondStr->getBeginLoc();
10204 SecondRange = SecondStr->getSourceRange();
10205 } else {
10206 SecondLoc = SecondSA->getBeginLoc();
10207 SecondRange = SecondSA->getSourceRange();
10208 }
10209 ODRDiagError(FirstLoc, FirstRange, StaticAssertOnlyMessage)
10210 << (FirstStr == nullptr);
10211 ODRDiagNote(SecondLoc, SecondRange, StaticAssertOnlyMessage)
10212 << (SecondStr == nullptr);
10213 Diagnosed = true;
10214 break;
10215 }
10216
10217 if (FirstStr && SecondStr &&
10218 FirstStr->getString() != SecondStr->getString()) {
10219 ODRDiagError(FirstStr->getBeginLoc(), FirstStr->getSourceRange(),
10220 StaticAssertMessage);
10221 ODRDiagNote(SecondStr->getBeginLoc(), SecondStr->getSourceRange(),
10222 StaticAssertMessage);
10223 Diagnosed = true;
10224 break;
10225 }
10226 break;
10227 }
10228 case Field: {
10229 FieldDecl *FirstField = cast<FieldDecl>(FirstDecl);
10230 FieldDecl *SecondField = cast<FieldDecl>(SecondDecl);
10231 IdentifierInfo *FirstII = FirstField->getIdentifier();
10232 IdentifierInfo *SecondII = SecondField->getIdentifier();
10233 if (FirstII->getName() != SecondII->getName()) {
10234 ODRDiagError(FirstField->getLocation(), FirstField->getSourceRange(),
10235 FieldName)
10236 << FirstII;
10237 ODRDiagNote(SecondField->getLocation(), SecondField->getSourceRange(),
10238 FieldName)
10239 << SecondII;
10240
10241 Diagnosed = true;
10242 break;
10243 }
10244
10245 assert(getContext().hasSameType(FirstField->getType(),((getContext().hasSameType(FirstField->getType(), SecondField
->getType())) ? static_cast<void> (0) : __assert_fail
("getContext().hasSameType(FirstField->getType(), SecondField->getType())"
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 10246, __PRETTY_FUNCTION__))
10246 SecondField->getType()))((getContext().hasSameType(FirstField->getType(), SecondField
->getType())) ? static_cast<void> (0) : __assert_fail
("getContext().hasSameType(FirstField->getType(), SecondField->getType())"
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 10246, __PRETTY_FUNCTION__))
;
10247
10248 QualType FirstType = FirstField->getType();
10249 QualType SecondType = SecondField->getType();
10250 if (ComputeQualTypeODRHash(FirstType) !=
10251 ComputeQualTypeODRHash(SecondType)) {
10252 ODRDiagError(FirstField->getLocation(), FirstField->getSourceRange(),
10253 FieldTypeName)
10254 << FirstII << FirstType;
10255 ODRDiagNote(SecondField->getLocation(), SecondField->getSourceRange(),
10256 FieldTypeName)
10257 << SecondII << SecondType;
10258
10259 Diagnosed = true;
10260 break;
10261 }
10262
10263 const bool IsFirstBitField = FirstField->isBitField();
10264 const bool IsSecondBitField = SecondField->isBitField();
10265 if (IsFirstBitField != IsSecondBitField) {
10266 ODRDiagError(FirstField->getLocation(), FirstField->getSourceRange(),
10267 FieldSingleBitField)
10268 << FirstII << IsFirstBitField;
10269 ODRDiagNote(SecondField->getLocation(), SecondField->getSourceRange(),
10270 FieldSingleBitField)
10271 << SecondII << IsSecondBitField;
10272 Diagnosed = true;
10273 break;
10274 }
10275
10276 if (IsFirstBitField && IsSecondBitField) {
10277 ODRDiagError(FirstField->getLocation(), FirstField->getSourceRange(),
10278 FieldDifferentWidthBitField)
10279 << FirstII << FirstField->getBitWidth()->getSourceRange();
10280 ODRDiagNote(SecondField->getLocation(), SecondField->getSourceRange(),
10281 FieldDifferentWidthBitField)
10282 << SecondII << SecondField->getBitWidth()->getSourceRange();
10283 Diagnosed = true;
10284 break;
10285 }
10286
10287 const bool IsFirstMutable = FirstField->isMutable();
10288 const bool IsSecondMutable = SecondField->isMutable();
10289 if (IsFirstMutable != IsSecondMutable) {
10290 ODRDiagError(FirstField->getLocation(), FirstField->getSourceRange(),
10291 FieldSingleMutable)
10292 << FirstII << IsFirstMutable;
10293 ODRDiagNote(SecondField->getLocation(), SecondField->getSourceRange(),
10294 FieldSingleMutable)
10295 << SecondII << IsSecondMutable;
10296 Diagnosed = true;
10297 break;
10298 }
10299
10300 const Expr *FirstInitializer = FirstField->getInClassInitializer();
10301 const Expr *SecondInitializer = SecondField->getInClassInitializer();
10302 if ((!FirstInitializer && SecondInitializer) ||
10303 (FirstInitializer && !SecondInitializer)) {
10304 ODRDiagError(FirstField->getLocation(), FirstField->getSourceRange(),
10305 FieldSingleInitializer)
10306 << FirstII << (FirstInitializer != nullptr);
10307 ODRDiagNote(SecondField->getLocation(), SecondField->getSourceRange(),
10308 FieldSingleInitializer)
10309 << SecondII << (SecondInitializer != nullptr);
10310 Diagnosed = true;
10311 break;
10312 }
10313
10314 if (FirstInitializer && SecondInitializer) {
10315 unsigned FirstInitHash = ComputeODRHash(FirstInitializer);
10316 unsigned SecondInitHash = ComputeODRHash(SecondInitializer);
10317 if (FirstInitHash != SecondInitHash) {
10318 ODRDiagError(FirstField->getLocation(),
10319 FirstField->getSourceRange(),
10320 FieldDifferentInitializers)
10321 << FirstII << FirstInitializer->getSourceRange();
10322 ODRDiagNote(SecondField->getLocation(),
10323 SecondField->getSourceRange(),
10324 FieldDifferentInitializers)
10325 << SecondII << SecondInitializer->getSourceRange();
10326 Diagnosed = true;
10327 break;
10328 }
10329 }
10330
10331 break;
10332 }
10333 case CXXMethod: {
10334 enum {
10335 DiagMethod,
10336 DiagConstructor,
10337 DiagDestructor,
10338 } FirstMethodType,
10339 SecondMethodType;
10340 auto GetMethodTypeForDiagnostics = [](const CXXMethodDecl* D) {
10341 if (isa<CXXConstructorDecl>(D)) return DiagConstructor;
10342 if (isa<CXXDestructorDecl>(D)) return DiagDestructor;
10343 return DiagMethod;
10344 };
10345 const CXXMethodDecl *FirstMethod = cast<CXXMethodDecl>(FirstDecl);
10346 const CXXMethodDecl *SecondMethod = cast<CXXMethodDecl>(SecondDecl);
10347 FirstMethodType = GetMethodTypeForDiagnostics(FirstMethod);
10348 SecondMethodType = GetMethodTypeForDiagnostics(SecondMethod);
10349 auto FirstName = FirstMethod->getDeclName();
10350 auto SecondName = SecondMethod->getDeclName();
10351 if (FirstMethodType != SecondMethodType || FirstName != SecondName) {
10352 ODRDiagError(FirstMethod->getLocation(),
10353 FirstMethod->getSourceRange(), MethodName)
10354 << FirstMethodType << FirstName;
10355 ODRDiagNote(SecondMethod->getLocation(),
10356 SecondMethod->getSourceRange(), MethodName)
10357 << SecondMethodType << SecondName;
10358
10359 Diagnosed = true;
10360 break;
10361 }
10362
10363 const bool FirstDeleted = FirstMethod->isDeletedAsWritten();
10364 const bool SecondDeleted = SecondMethod->isDeletedAsWritten();
10365 if (FirstDeleted != SecondDeleted) {
10366 ODRDiagError(FirstMethod->getLocation(),
10367 FirstMethod->getSourceRange(), MethodDeleted)
10368 << FirstMethodType << FirstName << FirstDeleted;
10369
10370 ODRDiagNote(SecondMethod->getLocation(),
10371 SecondMethod->getSourceRange(), MethodDeleted)
10372 << SecondMethodType << SecondName << SecondDeleted;
10373 Diagnosed = true;
10374 break;
10375 }
10376
10377 const bool FirstDefaulted = FirstMethod->isExplicitlyDefaulted();
10378 const bool SecondDefaulted = SecondMethod->isExplicitlyDefaulted();
10379 if (FirstDefaulted != SecondDefaulted) {
10380 ODRDiagError(FirstMethod->getLocation(),
10381 FirstMethod->getSourceRange(), MethodDefaulted)
10382 << FirstMethodType << FirstName << FirstDefaulted;
10383
10384 ODRDiagNote(SecondMethod->getLocation(),
10385 SecondMethod->getSourceRange(), MethodDefaulted)
10386 << SecondMethodType << SecondName << SecondDefaulted;
10387 Diagnosed = true;
10388 break;
10389 }
10390
10391 const bool FirstVirtual = FirstMethod->isVirtualAsWritten();
10392 const bool SecondVirtual = SecondMethod->isVirtualAsWritten();
10393 const bool FirstPure = FirstMethod->isPure();
10394 const bool SecondPure = SecondMethod->isPure();
10395 if ((FirstVirtual || SecondVirtual) &&
10396 (FirstVirtual != SecondVirtual || FirstPure != SecondPure)) {
10397 ODRDiagError(FirstMethod->getLocation(),
10398 FirstMethod->getSourceRange(), MethodVirtual)
10399 << FirstMethodType << FirstName << FirstPure << FirstVirtual;
10400 ODRDiagNote(SecondMethod->getLocation(),
10401 SecondMethod->getSourceRange(), MethodVirtual)
10402 << SecondMethodType << SecondName << SecondPure << SecondVirtual;
10403 Diagnosed = true;
10404 break;
10405 }
10406
10407 // CXXMethodDecl::isStatic uses the canonical Decl. With Decl merging,
10408 // FirstDecl is the canonical Decl of SecondDecl, so the storage
10409 // class needs to be checked instead.
10410 const auto FirstStorage = FirstMethod->getStorageClass();
10411 const auto SecondStorage = SecondMethod->getStorageClass();
10412 const bool FirstStatic = FirstStorage == SC_Static;
10413 const bool SecondStatic = SecondStorage == SC_Static;
10414 if (FirstStatic != SecondStatic) {
10415 ODRDiagError(FirstMethod->getLocation(),
10416 FirstMethod->getSourceRange(), MethodStatic)
10417 << FirstMethodType << FirstName << FirstStatic;
10418 ODRDiagNote(SecondMethod->getLocation(),
10419 SecondMethod->getSourceRange(), MethodStatic)
10420 << SecondMethodType << SecondName << SecondStatic;
10421 Diagnosed = true;
10422 break;
10423 }
10424
10425 const bool FirstVolatile = FirstMethod->isVolatile();
10426 const bool SecondVolatile = SecondMethod->isVolatile();
10427 if (FirstVolatile != SecondVolatile) {
10428 ODRDiagError(FirstMethod->getLocation(),
10429 FirstMethod->getSourceRange(), MethodVolatile)
10430 << FirstMethodType << FirstName << FirstVolatile;
10431 ODRDiagNote(SecondMethod->getLocation(),
10432 SecondMethod->getSourceRange(), MethodVolatile)
10433 << SecondMethodType << SecondName << SecondVolatile;
10434 Diagnosed = true;
10435 break;
10436 }
10437
10438 const bool FirstConst = FirstMethod->isConst();
10439 const bool SecondConst = SecondMethod->isConst();
10440 if (FirstConst != SecondConst) {
10441 ODRDiagError(FirstMethod->getLocation(),
10442 FirstMethod->getSourceRange(), MethodConst)
10443 << FirstMethodType << FirstName << FirstConst;
10444 ODRDiagNote(SecondMethod->getLocation(),
10445 SecondMethod->getSourceRange(), MethodConst)
10446 << SecondMethodType << SecondName << SecondConst;
10447 Diagnosed = true;
10448 break;
10449 }
10450
10451 const bool FirstInline = FirstMethod->isInlineSpecified();
10452 const bool SecondInline = SecondMethod->isInlineSpecified();
10453 if (FirstInline != SecondInline) {
10454 ODRDiagError(FirstMethod->getLocation(),
10455 FirstMethod->getSourceRange(), MethodInline)
10456 << FirstMethodType << FirstName << FirstInline;
10457 ODRDiagNote(SecondMethod->getLocation(),
10458 SecondMethod->getSourceRange(), MethodInline)
10459 << SecondMethodType << SecondName << SecondInline;
10460 Diagnosed = true;
10461 break;
10462 }
10463
10464 const unsigned FirstNumParameters = FirstMethod->param_size();
10465 const unsigned SecondNumParameters = SecondMethod->param_size();
10466 if (FirstNumParameters != SecondNumParameters) {
10467 ODRDiagError(FirstMethod->getLocation(),
10468 FirstMethod->getSourceRange(), MethodNumberParameters)
10469 << FirstMethodType << FirstName << FirstNumParameters;
10470 ODRDiagNote(SecondMethod->getLocation(),
10471 SecondMethod->getSourceRange(), MethodNumberParameters)
10472 << SecondMethodType << SecondName << SecondNumParameters;
10473 Diagnosed = true;
10474 break;
10475 }
10476
10477 // Need this status boolean to know when break out of the switch.
10478 bool ParameterMismatch = false;
10479 for (unsigned I = 0; I < FirstNumParameters; ++I) {
10480 const ParmVarDecl *FirstParam = FirstMethod->getParamDecl(I);
10481 const ParmVarDecl *SecondParam = SecondMethod->getParamDecl(I);
10482
10483 QualType FirstParamType = FirstParam->getType();
10484 QualType SecondParamType = SecondParam->getType();
10485 if (FirstParamType != SecondParamType &&
10486 ComputeQualTypeODRHash(FirstParamType) !=
10487 ComputeQualTypeODRHash(SecondParamType)) {
10488 if (const DecayedType *ParamDecayedType =
10489 FirstParamType->getAs<DecayedType>()) {
10490 ODRDiagError(FirstMethod->getLocation(),
10491 FirstMethod->getSourceRange(), MethodParameterType)
10492 << FirstMethodType << FirstName << (I + 1) << FirstParamType
10493 << true << ParamDecayedType->getOriginalType();
10494 } else {
10495 ODRDiagError(FirstMethod->getLocation(),
10496 FirstMethod->getSourceRange(), MethodParameterType)
10497 << FirstMethodType << FirstName << (I + 1) << FirstParamType
10498 << false;
10499 }
10500
10501 if (const DecayedType *ParamDecayedType =
10502 SecondParamType->getAs<DecayedType>()) {
10503 ODRDiagNote(SecondMethod->getLocation(),
10504 SecondMethod->getSourceRange(), MethodParameterType)
10505 << SecondMethodType << SecondName << (I + 1)
10506 << SecondParamType << true
10507 << ParamDecayedType->getOriginalType();
10508 } else {
10509 ODRDiagNote(SecondMethod->getLocation(),
10510 SecondMethod->getSourceRange(), MethodParameterType)
10511 << SecondMethodType << SecondName << (I + 1)
10512 << SecondParamType << false;
10513 }
10514 ParameterMismatch = true;
10515 break;
10516 }
10517
10518 DeclarationName FirstParamName = FirstParam->getDeclName();
10519 DeclarationName SecondParamName = SecondParam->getDeclName();
10520 if (FirstParamName != SecondParamName) {
10521 ODRDiagError(FirstMethod->getLocation(),
10522 FirstMethod->getSourceRange(), MethodParameterName)
10523 << FirstMethodType << FirstName << (I + 1) << FirstParamName;
10524 ODRDiagNote(SecondMethod->getLocation(),
10525 SecondMethod->getSourceRange(), MethodParameterName)
10526 << SecondMethodType << SecondName << (I + 1) << SecondParamName;
10527 ParameterMismatch = true;
10528 break;
10529 }
10530
10531 const Expr *FirstInit = FirstParam->getInit();
10532 const Expr *SecondInit = SecondParam->getInit();
10533 if ((FirstInit == nullptr) != (SecondInit == nullptr)) {
10534 ODRDiagError(FirstMethod->getLocation(),
10535 FirstMethod->getSourceRange(),
10536 MethodParameterSingleDefaultArgument)
10537 << FirstMethodType << FirstName << (I + 1)
10538 << (FirstInit == nullptr)
10539 << (FirstInit ? FirstInit->getSourceRange() : SourceRange());
10540 ODRDiagNote(SecondMethod->getLocation(),
10541 SecondMethod->getSourceRange(),
10542 MethodParameterSingleDefaultArgument)
10543 << SecondMethodType << SecondName << (I + 1)
10544 << (SecondInit == nullptr)
10545 << (SecondInit ? SecondInit->getSourceRange() : SourceRange());
10546 ParameterMismatch = true;
10547 break;
10548 }
10549
10550 if (FirstInit && SecondInit &&
10551 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) {
10552 ODRDiagError(FirstMethod->getLocation(),
10553 FirstMethod->getSourceRange(),
10554 MethodParameterDifferentDefaultArgument)
10555 << FirstMethodType << FirstName << (I + 1)
10556 << FirstInit->getSourceRange();
10557 ODRDiagNote(SecondMethod->getLocation(),
10558 SecondMethod->getSourceRange(),
10559 MethodParameterDifferentDefaultArgument)
10560 << SecondMethodType << SecondName << (I + 1)
10561 << SecondInit->getSourceRange();
10562 ParameterMismatch = true;
10563 break;
10564
10565 }
10566 }
10567
10568 if (ParameterMismatch) {
10569 Diagnosed = true;
10570 break;
10571 }
10572
10573 const auto *FirstTemplateArgs =
10574 FirstMethod->getTemplateSpecializationArgs();
10575 const auto *SecondTemplateArgs =
10576 SecondMethod->getTemplateSpecializationArgs();
10577
10578 if ((FirstTemplateArgs && !SecondTemplateArgs) ||
10579 (!FirstTemplateArgs && SecondTemplateArgs)) {
10580 ODRDiagError(FirstMethod->getLocation(),
10581 FirstMethod->getSourceRange(), MethodNoTemplateArguments)
10582 << FirstMethodType << FirstName << (FirstTemplateArgs != nullptr);
10583 ODRDiagNote(SecondMethod->getLocation(),
10584 SecondMethod->getSourceRange(), MethodNoTemplateArguments)
10585 << SecondMethodType << SecondName
10586 << (SecondTemplateArgs != nullptr);
10587
10588 Diagnosed = true;
10589 break;
10590 }
10591
10592 if (FirstTemplateArgs && SecondTemplateArgs) {
10593 // Remove pack expansions from argument list.
10594 auto ExpandTemplateArgumentList =
10595 [](const TemplateArgumentList *TAL) {
10596 llvm::SmallVector<const TemplateArgument *, 8> ExpandedList;
10597 for (const TemplateArgument &TA : TAL->asArray()) {
10598 if (TA.getKind() != TemplateArgument::Pack) {
10599 ExpandedList.push_back(&TA);
10600 continue;
10601 }
10602 for (const TemplateArgument &PackTA : TA.getPackAsArray()) {
10603 ExpandedList.push_back(&PackTA);
10604 }
10605 }
10606 return ExpandedList;
10607 };
10608 llvm::SmallVector<const TemplateArgument *, 8> FirstExpandedList =
10609 ExpandTemplateArgumentList(FirstTemplateArgs);
10610 llvm::SmallVector<const TemplateArgument *, 8> SecondExpandedList =
10611 ExpandTemplateArgumentList(SecondTemplateArgs);
10612
10613 if (FirstExpandedList.size() != SecondExpandedList.size()) {
10614 ODRDiagError(FirstMethod->getLocation(),
10615 FirstMethod->getSourceRange(),
10616 MethodDifferentNumberTemplateArguments)
10617 << FirstMethodType << FirstName
10618 << (unsigned)FirstExpandedList.size();
10619 ODRDiagNote(SecondMethod->getLocation(),
10620 SecondMethod->getSourceRange(),
10621 MethodDifferentNumberTemplateArguments)
10622 << SecondMethodType << SecondName
10623 << (unsigned)SecondExpandedList.size();
10624
10625 Diagnosed = true;
10626 break;
10627 }
10628
10629 bool TemplateArgumentMismatch = false;
10630 for (unsigned i = 0, e = FirstExpandedList.size(); i != e; ++i) {
10631 const TemplateArgument &FirstTA = *FirstExpandedList[i],
10632 &SecondTA = *SecondExpandedList[i];
10633 if (ComputeTemplateArgumentODRHash(FirstTA) ==
10634 ComputeTemplateArgumentODRHash(SecondTA)) {
10635 continue;
10636 }
10637
10638 ODRDiagError(FirstMethod->getLocation(),
10639 FirstMethod->getSourceRange(),
10640 MethodDifferentTemplateArgument)
10641 << FirstMethodType << FirstName << FirstTA << i + 1;
10642 ODRDiagNote(SecondMethod->getLocation(),
10643 SecondMethod->getSourceRange(),
10644 MethodDifferentTemplateArgument)
10645 << SecondMethodType << SecondName << SecondTA << i + 1;
10646
10647 TemplateArgumentMismatch = true;
10648 break;
10649 }
10650
10651 if (TemplateArgumentMismatch) {
10652 Diagnosed = true;
10653 break;
10654 }
10655 }
10656
10657 // Compute the hash of the method as if it has no body.
10658 auto ComputeCXXMethodODRHash = [&Hash](const CXXMethodDecl *D) {
10659 Hash.clear();
10660 Hash.AddFunctionDecl(D, true /*SkipBody*/);
10661 return Hash.CalculateHash();
10662 };
10663
10664 // Compare the hash generated to the hash stored. A difference means
10665 // that a body was present in the original source. Due to merging,
10666 // the stardard way of detecting a body will not work.
10667 const bool HasFirstBody =
10668 ComputeCXXMethodODRHash(FirstMethod) != FirstMethod->getODRHash();
10669 const bool HasSecondBody =
10670 ComputeCXXMethodODRHash(SecondMethod) != SecondMethod->getODRHash();
10671
10672 if (HasFirstBody != HasSecondBody) {
10673 ODRDiagError(FirstMethod->getLocation(),
10674 FirstMethod->getSourceRange(), MethodSingleBody)
10675 << FirstMethodType << FirstName << HasFirstBody;
10676 ODRDiagNote(SecondMethod->getLocation(),
10677 SecondMethod->getSourceRange(), MethodSingleBody)
10678 << SecondMethodType << SecondName << HasSecondBody;
10679 Diagnosed = true;
10680 break;
10681 }
10682
10683 if (HasFirstBody && HasSecondBody) {
10684 ODRDiagError(FirstMethod->getLocation(),
10685 FirstMethod->getSourceRange(), MethodDifferentBody)
10686 << FirstMethodType << FirstName;
10687 ODRDiagNote(SecondMethod->getLocation(),
10688 SecondMethod->getSourceRange(), MethodDifferentBody)
10689 << SecondMethodType << SecondName;
10690 Diagnosed = true;
10691 break;
10692 }
10693
10694 break;
10695 }
10696 case TypeAlias:
10697 case TypeDef: {
10698 TypedefNameDecl *FirstTD = cast<TypedefNameDecl>(FirstDecl);
10699 TypedefNameDecl *SecondTD = cast<TypedefNameDecl>(SecondDecl);
10700 auto FirstName = FirstTD->getDeclName();
10701 auto SecondName = SecondTD->getDeclName();
10702 if (FirstName != SecondName) {
10703 ODRDiagError(FirstTD->getLocation(), FirstTD->getSourceRange(),
10704 TypedefName)
10705 << (FirstDiffType == TypeAlias) << FirstName;
10706 ODRDiagNote(SecondTD->getLocation(), SecondTD->getSourceRange(),
10707 TypedefName)
10708 << (FirstDiffType == TypeAlias) << SecondName;
10709 Diagnosed = true;
10710 break;
10711 }
10712
10713 QualType FirstType = FirstTD->getUnderlyingType();
10714 QualType SecondType = SecondTD->getUnderlyingType();
10715 if (ComputeQualTypeODRHash(FirstType) !=
10716 ComputeQualTypeODRHash(SecondType)) {
10717 ODRDiagError(FirstTD->getLocation(), FirstTD->getSourceRange(),
10718 TypedefType)
10719 << (FirstDiffType == TypeAlias) << FirstName << FirstType;
10720 ODRDiagNote(SecondTD->getLocation(), SecondTD->getSourceRange(),
10721 TypedefType)
10722 << (FirstDiffType == TypeAlias) << SecondName << SecondType;
10723 Diagnosed = true;
10724 break;
10725 }
10726 break;
10727 }
10728 case Var: {
10729 VarDecl *FirstVD = cast<VarDecl>(FirstDecl);
10730 VarDecl *SecondVD = cast<VarDecl>(SecondDecl);
10731 auto FirstName = FirstVD->getDeclName();
10732 auto SecondName = SecondVD->getDeclName();
10733 if (FirstName != SecondName) {
10734 ODRDiagError(FirstVD->getLocation(), FirstVD->getSourceRange(),
10735 VarName)
10736 << FirstName;
10737 ODRDiagNote(SecondVD->getLocation(), SecondVD->getSourceRange(),
10738 VarName)
10739 << SecondName;
10740 Diagnosed = true;
10741 break;
10742 }
10743
10744 QualType FirstType = FirstVD->getType();
10745 QualType SecondType = SecondVD->getType();
10746 if (ComputeQualTypeODRHash(FirstType) !=
10747 ComputeQualTypeODRHash(SecondType)) {
10748 ODRDiagError(FirstVD->getLocation(), FirstVD->getSourceRange(),
10749 VarType)
10750 << FirstName << FirstType;
10751 ODRDiagNote(SecondVD->getLocation(), SecondVD->getSourceRange(),
10752 VarType)
10753 << SecondName << SecondType;
10754 Diagnosed = true;
10755 break;
10756 }
10757
10758 const Expr *FirstInit = FirstVD->getInit();
10759 const Expr *SecondInit = SecondVD->getInit();
10760 if ((FirstInit == nullptr) != (SecondInit == nullptr)) {
10761 ODRDiagError(FirstVD->getLocation(), FirstVD->getSourceRange(),
10762 VarSingleInitializer)
10763 << FirstName << (FirstInit == nullptr)
10764 << (FirstInit ? FirstInit->getSourceRange(): SourceRange());
10765 ODRDiagNote(SecondVD->getLocation(), SecondVD->getSourceRange(),
10766 VarSingleInitializer)
10767 << SecondName << (SecondInit == nullptr)
10768 << (SecondInit ? SecondInit->getSourceRange() : SourceRange());
10769 Diagnosed = true;
10770 break;
10771 }
10772
10773 if (FirstInit && SecondInit &&
10774 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) {
10775 ODRDiagError(FirstVD->getLocation(), FirstVD->getSourceRange(),
10776 VarDifferentInitializer)
10777 << FirstName << FirstInit->getSourceRange();
10778 ODRDiagNote(SecondVD->getLocation(), SecondVD->getSourceRange(),
10779 VarDifferentInitializer)
10780 << SecondName << SecondInit->getSourceRange();
10781 Diagnosed = true;
10782 break;
10783 }
10784
10785 const bool FirstIsConstexpr = FirstVD->isConstexpr();
10786 const bool SecondIsConstexpr = SecondVD->isConstexpr();
10787 if (FirstIsConstexpr != SecondIsConstexpr) {
10788 ODRDiagError(FirstVD->getLocation(), FirstVD->getSourceRange(),
10789 VarConstexpr)
10790 << FirstName << FirstIsConstexpr;
10791 ODRDiagNote(SecondVD->getLocation(), SecondVD->getSourceRange(),
10792 VarConstexpr)
10793 << SecondName << SecondIsConstexpr;
10794 Diagnosed = true;
10795 break;
10796 }
10797 break;
10798 }
10799 case Friend: {
10800 FriendDecl *FirstFriend = cast<FriendDecl>(FirstDecl);
10801 FriendDecl *SecondFriend = cast<FriendDecl>(SecondDecl);
10802
10803 NamedDecl *FirstND = FirstFriend->getFriendDecl();
10804 NamedDecl *SecondND = SecondFriend->getFriendDecl();
10805
10806 TypeSourceInfo *FirstTSI = FirstFriend->getFriendType();
10807 TypeSourceInfo *SecondTSI = SecondFriend->getFriendType();
10808
10809 if (FirstND && SecondND) {
10810 ODRDiagError(FirstFriend->getFriendLoc(),
10811 FirstFriend->getSourceRange(), FriendFunction)
10812 << FirstND;
10813 ODRDiagNote(SecondFriend->getFriendLoc(),
10814 SecondFriend->getSourceRange(), FriendFunction)
10815 << SecondND;
10816
10817 Diagnosed = true;
10818 break;
10819 }
10820
10821 if (FirstTSI && SecondTSI) {
10822 QualType FirstFriendType = FirstTSI->getType();
10823 QualType SecondFriendType = SecondTSI->getType();
10824 assert(ComputeQualTypeODRHash(FirstFriendType) !=((ComputeQualTypeODRHash(FirstFriendType) != ComputeQualTypeODRHash
(SecondFriendType)) ? static_cast<void> (0) : __assert_fail
("ComputeQualTypeODRHash(FirstFriendType) != ComputeQualTypeODRHash(SecondFriendType)"
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 10825, __PRETTY_FUNCTION__))
10825 ComputeQualTypeODRHash(SecondFriendType))((ComputeQualTypeODRHash(FirstFriendType) != ComputeQualTypeODRHash
(SecondFriendType)) ? static_cast<void> (0) : __assert_fail
("ComputeQualTypeODRHash(FirstFriendType) != ComputeQualTypeODRHash(SecondFriendType)"
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 10825, __PRETTY_FUNCTION__))
;
10826 ODRDiagError(FirstFriend->getFriendLoc(),
10827 FirstFriend->getSourceRange(), FriendType)
10828 << FirstFriendType;
10829 ODRDiagNote(SecondFriend->getFriendLoc(),
10830 SecondFriend->getSourceRange(), FriendType)
10831 << SecondFriendType;
10832 Diagnosed = true;
10833 break;
10834 }
10835
10836 ODRDiagError(FirstFriend->getFriendLoc(), FirstFriend->getSourceRange(),
10837 FriendTypeFunction)
10838 << (FirstTSI == nullptr);
10839 ODRDiagNote(SecondFriend->getFriendLoc(),
10840 SecondFriend->getSourceRange(), FriendTypeFunction)
10841 << (SecondTSI == nullptr);
10842
10843 Diagnosed = true;
10844 break;
10845 }
10846 case FunctionTemplate: {
10847 FunctionTemplateDecl *FirstTemplate =
10848 cast<FunctionTemplateDecl>(FirstDecl);
10849 FunctionTemplateDecl *SecondTemplate =
10850 cast<FunctionTemplateDecl>(SecondDecl);
10851
10852 TemplateParameterList *FirstTPL =
10853 FirstTemplate->getTemplateParameters();
10854 TemplateParameterList *SecondTPL =
10855 SecondTemplate->getTemplateParameters();
10856
10857 if (FirstTPL->size() != SecondTPL->size()) {
10858 ODRDiagError(FirstTemplate->getLocation(),
10859 FirstTemplate->getSourceRange(),
10860 FunctionTemplateDifferentNumberParameters)
10861 << FirstTemplate << FirstTPL->size();
10862 ODRDiagNote(SecondTemplate->getLocation(),
10863 SecondTemplate->getSourceRange(),
10864 FunctionTemplateDifferentNumberParameters)
10865 << SecondTemplate << SecondTPL->size();
10866
10867 Diagnosed = true;
10868 break;
10869 }
10870
10871 bool ParameterMismatch = false;
10872 for (unsigned i = 0, e = FirstTPL->size(); i != e; ++i) {
10873 NamedDecl *FirstParam = FirstTPL->getParam(i);
10874 NamedDecl *SecondParam = SecondTPL->getParam(i);
10875
10876 if (FirstParam->getKind() != SecondParam->getKind()) {
10877 enum {
10878 TemplateTypeParameter,
10879 NonTypeTemplateParameter,
10880 TemplateTemplateParameter,
10881 };
10882 auto GetParamType = [](NamedDecl *D) {
10883 switch (D->getKind()) {
10884 default:
10885 llvm_unreachable("Unexpected template parameter type")::llvm::llvm_unreachable_internal("Unexpected template parameter type"
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 10885)
;
10886 case Decl::TemplateTypeParm:
10887 return TemplateTypeParameter;
10888 case Decl::NonTypeTemplateParm:
10889 return NonTypeTemplateParameter;
10890 case Decl::TemplateTemplateParm:
10891 return TemplateTemplateParameter;
10892 }
10893 };
10894
10895 ODRDiagError(FirstTemplate->getLocation(),
10896 FirstTemplate->getSourceRange(),
10897 FunctionTemplateParameterDifferentKind)
10898 << FirstTemplate << (i + 1) << GetParamType(FirstParam);
10899 ODRDiagNote(SecondTemplate->getLocation(),
10900 SecondTemplate->getSourceRange(),
10901 FunctionTemplateParameterDifferentKind)
10902 << SecondTemplate << (i + 1) << GetParamType(SecondParam);
10903
10904 ParameterMismatch = true;
10905 break;
10906 }
10907
10908 if (FirstParam->getName() != SecondParam->getName()) {
10909 ODRDiagError(FirstTemplate->getLocation(),
10910 FirstTemplate->getSourceRange(),
10911 FunctionTemplateParameterName)
10912 << FirstTemplate << (i + 1) << (bool)FirstParam->getIdentifier()
10913 << FirstParam;
10914 ODRDiagNote(SecondTemplate->getLocation(),
10915 SecondTemplate->getSourceRange(),
10916 FunctionTemplateParameterName)
10917 << SecondTemplate << (i + 1)
10918 << (bool)SecondParam->getIdentifier() << SecondParam;
10919 ParameterMismatch = true;
10920 break;
10921 }
10922
10923 if (isa<TemplateTypeParmDecl>(FirstParam) &&
10924 isa<TemplateTypeParmDecl>(SecondParam)) {
10925 TemplateTypeParmDecl *FirstTTPD =
10926 cast<TemplateTypeParmDecl>(FirstParam);
10927 TemplateTypeParmDecl *SecondTTPD =
10928 cast<TemplateTypeParmDecl>(SecondParam);
10929 bool HasFirstDefaultArgument =
10930 FirstTTPD->hasDefaultArgument() &&
10931 !FirstTTPD->defaultArgumentWasInherited();
10932 bool HasSecondDefaultArgument =
10933 SecondTTPD->hasDefaultArgument() &&
10934 !SecondTTPD->defaultArgumentWasInherited();
10935 if (HasFirstDefaultArgument != HasSecondDefaultArgument) {
10936 ODRDiagError(FirstTemplate->getLocation(),
10937 FirstTemplate->getSourceRange(),
10938 FunctionTemplateParameterSingleDefaultArgument)
10939 << FirstTemplate << (i + 1) << HasFirstDefaultArgument;
10940 ODRDiagNote(SecondTemplate->getLocation(),
10941 SecondTemplate->getSourceRange(),
10942 FunctionTemplateParameterSingleDefaultArgument)
10943 << SecondTemplate << (i + 1) << HasSecondDefaultArgument;
10944 ParameterMismatch = true;
10945 break;
10946 }
10947
10948 if (HasFirstDefaultArgument && HasSecondDefaultArgument) {
10949 QualType FirstType = FirstTTPD->getDefaultArgument();
10950 QualType SecondType = SecondTTPD->getDefaultArgument();
10951 if (ComputeQualTypeODRHash(FirstType) !=
10952 ComputeQualTypeODRHash(SecondType)) {
10953 ODRDiagError(FirstTemplate->getLocation(),
10954 FirstTemplate->getSourceRange(),
10955 FunctionTemplateParameterDifferentDefaultArgument)
10956 << FirstTemplate << (i + 1) << FirstType;
10957 ODRDiagNote(SecondTemplate->getLocation(),
10958 SecondTemplate->getSourceRange(),
10959 FunctionTemplateParameterDifferentDefaultArgument)
10960 << SecondTemplate << (i + 1) << SecondType;
10961 ParameterMismatch = true;
10962 break;
10963 }
10964 }
10965
10966 if (FirstTTPD->isParameterPack() !=
10967 SecondTTPD->isParameterPack()) {
10968 ODRDiagError(FirstTemplate->getLocation(),
10969 FirstTemplate->getSourceRange(),
10970 FunctionTemplatePackParameter)
10971 << FirstTemplate << (i + 1) << FirstTTPD->isParameterPack();
10972 ODRDiagNote(SecondTemplate->getLocation(),
10973 SecondTemplate->getSourceRange(),
10974 FunctionTemplatePackParameter)
10975 << SecondTemplate << (i + 1) << SecondTTPD->isParameterPack();
10976 ParameterMismatch = true;
10977 break;
10978 }
10979 }
10980
10981 if (isa<TemplateTemplateParmDecl>(FirstParam) &&
10982 isa<TemplateTemplateParmDecl>(SecondParam)) {
10983 TemplateTemplateParmDecl *FirstTTPD =
10984 cast<TemplateTemplateParmDecl>(FirstParam);
10985 TemplateTemplateParmDecl *SecondTTPD =
10986 cast<TemplateTemplateParmDecl>(SecondParam);
10987
10988 TemplateParameterList *FirstTPL =
10989 FirstTTPD->getTemplateParameters();
10990 TemplateParameterList *SecondTPL =
10991 SecondTTPD->getTemplateParameters();
10992
10993 if (ComputeTemplateParameterListODRHash(FirstTPL) !=
10994 ComputeTemplateParameterListODRHash(SecondTPL)) {
10995 ODRDiagError(FirstTemplate->getLocation(),
10996 FirstTemplate->getSourceRange(),
10997 FunctionTemplateParameterDifferentType)
10998 << FirstTemplate << (i + 1);
10999 ODRDiagNote(SecondTemplate->getLocation(),
11000 SecondTemplate->getSourceRange(),
11001 FunctionTemplateParameterDifferentType)
11002 << SecondTemplate << (i + 1);
11003 ParameterMismatch = true;
11004 break;
11005 }
11006
11007 bool HasFirstDefaultArgument =
11008 FirstTTPD->hasDefaultArgument() &&
11009 !FirstTTPD->defaultArgumentWasInherited();
11010 bool HasSecondDefaultArgument =
11011 SecondTTPD->hasDefaultArgument() &&
11012 !SecondTTPD->defaultArgumentWasInherited();
11013 if (HasFirstDefaultArgument != HasSecondDefaultArgument) {
11014 ODRDiagError(FirstTemplate->getLocation(),
11015 FirstTemplate->getSourceRange(),
11016 FunctionTemplateParameterSingleDefaultArgument)
11017 << FirstTemplate << (i + 1) << HasFirstDefaultArgument;
11018 ODRDiagNote(SecondTemplate->getLocation(),
11019 SecondTemplate->getSourceRange(),
11020 FunctionTemplateParameterSingleDefaultArgument)
11021 << SecondTemplate << (i + 1) << HasSecondDefaultArgument;
11022 ParameterMismatch = true;
11023 break;
11024 }
11025
11026 if (HasFirstDefaultArgument && HasSecondDefaultArgument) {
11027 TemplateArgument FirstTA =
11028 FirstTTPD->getDefaultArgument().getArgument();
11029 TemplateArgument SecondTA =
11030 SecondTTPD->getDefaultArgument().getArgument();
11031 if (ComputeTemplateArgumentODRHash(FirstTA) !=
11032 ComputeTemplateArgumentODRHash(SecondTA)) {
11033 ODRDiagError(FirstTemplate->getLocation(),
11034 FirstTemplate->getSourceRange(),
11035 FunctionTemplateParameterDifferentDefaultArgument)
11036 << FirstTemplate << (i + 1) << FirstTA;
11037 ODRDiagNote(SecondTemplate->getLocation(),
11038 SecondTemplate->getSourceRange(),
11039 FunctionTemplateParameterDifferentDefaultArgument)
11040 << SecondTemplate << (i + 1) << SecondTA;
11041 ParameterMismatch = true;
11042 break;
11043 }
11044 }
11045
11046 if (FirstTTPD->isParameterPack() !=
11047 SecondTTPD->isParameterPack()) {
11048 ODRDiagError(FirstTemplate->getLocation(),
11049 FirstTemplate->getSourceRange(),
11050 FunctionTemplatePackParameter)
11051 << FirstTemplate << (i + 1) << FirstTTPD->isParameterPack();
11052 ODRDiagNote(SecondTemplate->getLocation(),
11053 SecondTemplate->getSourceRange(),
11054 FunctionTemplatePackParameter)
11055 << SecondTemplate << (i + 1) << SecondTTPD->isParameterPack();
11056 ParameterMismatch = true;
11057 break;
11058 }
11059 }
11060
11061 if (isa<NonTypeTemplateParmDecl>(FirstParam) &&
11062 isa<NonTypeTemplateParmDecl>(SecondParam)) {
11063 NonTypeTemplateParmDecl *FirstNTTPD =
11064 cast<NonTypeTemplateParmDecl>(FirstParam);
11065 NonTypeTemplateParmDecl *SecondNTTPD =
11066 cast<NonTypeTemplateParmDecl>(SecondParam);
11067
11068 QualType FirstType = FirstNTTPD->getType();
11069 QualType SecondType = SecondNTTPD->getType();
11070 if (ComputeQualTypeODRHash(FirstType) !=
11071 ComputeQualTypeODRHash(SecondType)) {
11072 ODRDiagError(FirstTemplate->getLocation(),
11073 FirstTemplate->getSourceRange(),
11074 FunctionTemplateParameterDifferentType)
11075 << FirstTemplate << (i + 1);
11076 ODRDiagNote(SecondTemplate->getLocation(),
11077 SecondTemplate->getSourceRange(),
11078 FunctionTemplateParameterDifferentType)
11079 << SecondTemplate << (i + 1);
11080 ParameterMismatch = true;
11081 break;
11082 }
11083
11084 bool HasFirstDefaultArgument =
11085 FirstNTTPD->hasDefaultArgument() &&
11086 !FirstNTTPD->defaultArgumentWasInherited();
11087 bool HasSecondDefaultArgument =
11088 SecondNTTPD->hasDefaultArgument() &&
11089 !SecondNTTPD->defaultArgumentWasInherited();
11090 if (HasFirstDefaultArgument != HasSecondDefaultArgument) {
11091 ODRDiagError(FirstTemplate->getLocation(),
11092 FirstTemplate->getSourceRange(),
11093 FunctionTemplateParameterSingleDefaultArgument)
11094 << FirstTemplate << (i + 1) << HasFirstDefaultArgument;
11095 ODRDiagNote(SecondTemplate->getLocation(),
11096 SecondTemplate->getSourceRange(),
11097 FunctionTemplateParameterSingleDefaultArgument)
11098 << SecondTemplate << (i + 1) << HasSecondDefaultArgument;
11099 ParameterMismatch = true;
11100 break;
11101 }
11102
11103 if (HasFirstDefaultArgument && HasSecondDefaultArgument) {
11104 Expr *FirstDefaultArgument = FirstNTTPD->getDefaultArgument();
11105 Expr *SecondDefaultArgument = SecondNTTPD->getDefaultArgument();
11106 if (ComputeODRHash(FirstDefaultArgument) !=
11107 ComputeODRHash(SecondDefaultArgument)) {
11108 ODRDiagError(FirstTemplate->getLocation(),
11109 FirstTemplate->getSourceRange(),
11110 FunctionTemplateParameterDifferentDefaultArgument)
11111 << FirstTemplate << (i + 1) << FirstDefaultArgument;
11112 ODRDiagNote(SecondTemplate->getLocation(),
11113 SecondTemplate->getSourceRange(),
11114 FunctionTemplateParameterDifferentDefaultArgument)
11115 << SecondTemplate << (i + 1) << SecondDefaultArgument;
11116 ParameterMismatch = true;
11117 break;
11118 }
11119 }
11120
11121 if (FirstNTTPD->isParameterPack() !=
11122 SecondNTTPD->isParameterPack()) {
11123 ODRDiagError(FirstTemplate->getLocation(),
11124 FirstTemplate->getSourceRange(),
11125 FunctionTemplatePackParameter)
11126 << FirstTemplate << (i + 1) << FirstNTTPD->isParameterPack();
11127 ODRDiagNote(SecondTemplate->getLocation(),
11128 SecondTemplate->getSourceRange(),
11129 FunctionTemplatePackParameter)
11130 << SecondTemplate << (i + 1)
11131 << SecondNTTPD->isParameterPack();
11132 ParameterMismatch = true;
11133 break;
11134 }
11135 }
11136 }
11137
11138 if (ParameterMismatch) {
11139 Diagnosed = true;
11140 break;
11141 }
11142
11143 break;
11144 }
11145 }
11146
11147 if (Diagnosed)
11148 continue;
11149
11150 Diag(FirstDecl->getLocation(),
11151 diag::err_module_odr_violation_mismatch_decl_unknown)
11152 << FirstRecord << FirstModule.empty() << FirstModule << FirstDiffType
11153 << FirstDecl->getSourceRange();
11154 Diag(SecondDecl->getLocation(),
11155 diag::note_module_odr_violation_mismatch_decl_unknown)
11156 << SecondModule << FirstDiffType << SecondDecl->getSourceRange();
11157 Diagnosed = true;
11158 }
11159
11160 if (!Diagnosed) {
11161 // All definitions are updates to the same declaration. This happens if a
11162 // module instantiates the declaration of a class template specialization
11163 // and two or more other modules instantiate its definition.
11164 //
11165 // FIXME: Indicate which modules had instantiations of this definition.
11166 // FIXME: How can this even happen?
11167 Diag(Merge.first->getLocation(),
11168 diag::err_module_odr_violation_different_instantiations)
11169 << Merge.first;
11170 }
11171 }
11172
11173 // Issue ODR failures diagnostics for functions.
11174 for (auto &Merge : FunctionOdrMergeFailures) {
11175 enum ODRFunctionDifference {
11176 ReturnType,
11177 ParameterName,
11178 ParameterType,
11179 ParameterSingleDefaultArgument,
11180 ParameterDifferentDefaultArgument,
11181 FunctionBody,
11182 };
11183
11184 FunctionDecl *FirstFunction = Merge.first;
11185 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstFunction);
11186
11187 bool Diagnosed = false;
11188 for (auto &SecondFunction : Merge.second) {
11189
11190 if (FirstFunction == SecondFunction)
11191 continue;
11192
11193 std::string SecondModule =
11194 getOwningModuleNameForDiagnostic(SecondFunction);
11195
11196 auto ODRDiagError = [FirstFunction, &FirstModule,
11197 this](SourceLocation Loc, SourceRange Range,
11198 ODRFunctionDifference DiffType) {
11199 return Diag(Loc, diag::err_module_odr_violation_function)
11200 << FirstFunction << FirstModule.empty() << FirstModule << Range
11201 << DiffType;
11202 };
11203 auto ODRDiagNote = [&SecondModule, this](SourceLocation Loc,
11204 SourceRange Range,
11205 ODRFunctionDifference DiffType) {
11206 return Diag(Loc, diag::note_module_odr_violation_function)
11207 << SecondModule << Range << DiffType;
11208 };
11209
11210 if (ComputeQualTypeODRHash(FirstFunction->getReturnType()) !=
11211 ComputeQualTypeODRHash(SecondFunction->getReturnType())) {
11212 ODRDiagError(FirstFunction->getReturnTypeSourceRange().getBegin(),
11213 FirstFunction->getReturnTypeSourceRange(), ReturnType)
11214 << FirstFunction->getReturnType();
11215 ODRDiagNote(SecondFunction->getReturnTypeSourceRange().getBegin(),
11216 SecondFunction->getReturnTypeSourceRange(), ReturnType)
11217 << SecondFunction->getReturnType();
11218 Diagnosed = true;
11219 break;
11220 }
11221
11222 assert(FirstFunction->param_size() == SecondFunction->param_size() &&((FirstFunction->param_size() == SecondFunction->param_size
() && "Merged functions with different number of parameters"
) ? static_cast<void> (0) : __assert_fail ("FirstFunction->param_size() == SecondFunction->param_size() && \"Merged functions with different number of parameters\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 11223, __PRETTY_FUNCTION__))
11223 "Merged functions with different number of parameters")((FirstFunction->param_size() == SecondFunction->param_size
() && "Merged functions with different number of parameters"
) ? static_cast<void> (0) : __assert_fail ("FirstFunction->param_size() == SecondFunction->param_size() && \"Merged functions with different number of parameters\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 11223, __PRETTY_FUNCTION__))
;
11224
11225 auto ParamSize = FirstFunction->param_size();
11226 bool ParameterMismatch = false;
11227 for (unsigned I = 0; I < ParamSize; ++I) {
11228 auto *FirstParam = FirstFunction->getParamDecl(I);
11229 auto *SecondParam = SecondFunction->getParamDecl(I);
11230
11231 assert(getContext().hasSameType(FirstParam->getType(),((getContext().hasSameType(FirstParam->getType(), SecondParam
->getType()) && "Merged function has different parameter types."
) ? static_cast<void> (0) : __assert_fail ("getContext().hasSameType(FirstParam->getType(), SecondParam->getType()) && \"Merged function has different parameter types.\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 11233, __PRETTY_FUNCTION__))
11232 SecondParam->getType()) &&((getContext().hasSameType(FirstParam->getType(), SecondParam
->getType()) && "Merged function has different parameter types."
) ? static_cast<void> (0) : __assert_fail ("getContext().hasSameType(FirstParam->getType(), SecondParam->getType()) && \"Merged function has different parameter types.\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 11233, __PRETTY_FUNCTION__))
11233 "Merged function has different parameter types.")((getContext().hasSameType(FirstParam->getType(), SecondParam
->getType()) && "Merged function has different parameter types."
) ? static_cast<void> (0) : __assert_fail ("getContext().hasSameType(FirstParam->getType(), SecondParam->getType()) && \"Merged function has different parameter types.\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 11233, __PRETTY_FUNCTION__))
;
11234
11235 if (FirstParam->getDeclName() != SecondParam->getDeclName()) {
11236 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(),
11237 ParameterName)
11238 << I + 1 << FirstParam->getDeclName();
11239 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(),
11240 ParameterName)
11241 << I + 1 << SecondParam->getDeclName();
11242 ParameterMismatch = true;
11243 break;
11244 };
11245
11246 QualType FirstParamType = FirstParam->getType();
11247 QualType SecondParamType = SecondParam->getType();
11248 if (FirstParamType != SecondParamType &&
11249 ComputeQualTypeODRHash(FirstParamType) !=
11250 ComputeQualTypeODRHash(SecondParamType)) {
11251 if (const DecayedType *ParamDecayedType =
11252 FirstParamType->getAs<DecayedType>()) {
11253 ODRDiagError(FirstParam->getLocation(),
11254 FirstParam->getSourceRange(), ParameterType)
11255 << (I + 1) << FirstParamType << true
11256 << ParamDecayedType->getOriginalType();
11257 } else {
11258 ODRDiagError(FirstParam->getLocation(),
11259 FirstParam->getSourceRange(), ParameterType)
11260 << (I + 1) << FirstParamType << false;
11261 }
11262
11263 if (const DecayedType *ParamDecayedType =
11264 SecondParamType->getAs<DecayedType>()) {
11265 ODRDiagNote(SecondParam->getLocation(),
11266 SecondParam->getSourceRange(), ParameterType)
11267 << (I + 1) << SecondParamType << true
11268 << ParamDecayedType->getOriginalType();
11269 } else {
11270 ODRDiagNote(SecondParam->getLocation(),
11271 SecondParam->getSourceRange(), ParameterType)
11272 << (I + 1) << SecondParamType << false;
11273 }
11274 ParameterMismatch = true;
11275 break;
11276 }
11277
11278 const Expr *FirstInit = FirstParam->getInit();
11279 const Expr *SecondInit = SecondParam->getInit();
11280 if ((FirstInit == nullptr) != (SecondInit == nullptr)) {
11281 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(),
11282 ParameterSingleDefaultArgument)
11283 << (I + 1) << (FirstInit == nullptr)
11284 << (FirstInit ? FirstInit->getSourceRange() : SourceRange());
11285 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(),
11286 ParameterSingleDefaultArgument)
11287 << (I + 1) << (SecondInit == nullptr)
11288 << (SecondInit ? SecondInit->getSourceRange() : SourceRange());
11289 ParameterMismatch = true;
11290 break;
11291 }
11292
11293 if (FirstInit && SecondInit &&
11294 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) {
11295 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(),
11296 ParameterDifferentDefaultArgument)
11297 << (I + 1) << FirstInit->getSourceRange();
11298 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(),
11299 ParameterDifferentDefaultArgument)
11300 << (I + 1) << SecondInit->getSourceRange();
11301 ParameterMismatch = true;
11302 break;
11303 }
11304
11305 assert(ComputeSubDeclODRHash(FirstParam) ==((ComputeSubDeclODRHash(FirstParam) == ComputeSubDeclODRHash(
SecondParam) && "Undiagnosed parameter difference.") ?
static_cast<void> (0) : __assert_fail ("ComputeSubDeclODRHash(FirstParam) == ComputeSubDeclODRHash(SecondParam) && \"Undiagnosed parameter difference.\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 11307, __PRETTY_FUNCTION__))
11306 ComputeSubDeclODRHash(SecondParam) &&((ComputeSubDeclODRHash(FirstParam) == ComputeSubDeclODRHash(
SecondParam) && "Undiagnosed parameter difference.") ?
static_cast<void> (0) : __assert_fail ("ComputeSubDeclODRHash(FirstParam) == ComputeSubDeclODRHash(SecondParam) && \"Undiagnosed parameter difference.\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 11307, __PRETTY_FUNCTION__))
11307 "Undiagnosed parameter difference.")((ComputeSubDeclODRHash(FirstParam) == ComputeSubDeclODRHash(
SecondParam) && "Undiagnosed parameter difference.") ?
static_cast<void> (0) : __assert_fail ("ComputeSubDeclODRHash(FirstParam) == ComputeSubDeclODRHash(SecondParam) && \"Undiagnosed parameter difference.\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 11307, __PRETTY_FUNCTION__))
;
11308 }
11309
11310 if (ParameterMismatch) {
11311 Diagnosed = true;
11312 break;
11313 }
11314
11315 // If no error has been generated before now, assume the problem is in
11316 // the body and generate a message.
11317 ODRDiagError(FirstFunction->getLocation(),
11318 FirstFunction->getSourceRange(), FunctionBody);
11319 ODRDiagNote(SecondFunction->getLocation(),
11320 SecondFunction->getSourceRange(), FunctionBody);
11321 Diagnosed = true;
11322 break;
11323 }
11324 (void)Diagnosed;
11325 assert(Diagnosed && "Unable to emit ODR diagnostic.")((Diagnosed && "Unable to emit ODR diagnostic.") ? static_cast
<void> (0) : __assert_fail ("Diagnosed && \"Unable to emit ODR diagnostic.\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 11325, __PRETTY_FUNCTION__))
;
11326 }
11327
11328 // Issue ODR failures diagnostics for enums.
11329 for (auto &Merge : EnumOdrMergeFailures) {
11330 enum ODREnumDifference {
11331 SingleScopedEnum,
11332 EnumTagKeywordMismatch,
11333 SingleSpecifiedType,
11334 DifferentSpecifiedTypes,
11335 DifferentNumberEnumConstants,
11336 EnumConstantName,
11337 EnumConstantSingleInitilizer,
11338 EnumConstantDifferentInitilizer,
11339 };
11340
11341 // If we've already pointed out a specific problem with this enum, don't
11342 // bother issuing a general "something's different" diagnostic.
11343 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11344 continue;
11345
11346 EnumDecl *FirstEnum = Merge.first;
11347 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstEnum);
11348
11349 using DeclHashes =
11350 llvm::SmallVector<std::pair<EnumConstantDecl *, unsigned>, 4>;
11351 auto PopulateHashes = [&ComputeSubDeclODRHash, FirstEnum](
11352 DeclHashes &Hashes, EnumDecl *Enum) {
11353 for (auto *D : Enum->decls()) {
11354 // Due to decl merging, the first EnumDecl is the parent of
11355 // Decls in both records.
11356 if (!ODRHash::isWhitelistedDecl(D, FirstEnum))
11357 continue;
11358 assert(isa<EnumConstantDecl>(D) && "Unexpected Decl kind")((isa<EnumConstantDecl>(D) && "Unexpected Decl kind"
) ? static_cast<void> (0) : __assert_fail ("isa<EnumConstantDecl>(D) && \"Unexpected Decl kind\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 11358, __PRETTY_FUNCTION__))
;
11359 Hashes.emplace_back(cast<EnumConstantDecl>(D),
11360 ComputeSubDeclODRHash(D));
11361 }
11362 };
11363 DeclHashes FirstHashes;
11364 PopulateHashes(FirstHashes, FirstEnum);
11365 bool Diagnosed = false;
11366 for (auto &SecondEnum : Merge.second) {
11367
11368 if (FirstEnum == SecondEnum)
11369 continue;
11370
11371 std::string SecondModule =
11372 getOwningModuleNameForDiagnostic(SecondEnum);
11373
11374 auto ODRDiagError = [FirstEnum, &FirstModule,
11375 this](SourceLocation Loc, SourceRange Range,
11376 ODREnumDifference DiffType) {
11377 return Diag(Loc, diag::err_module_odr_violation_enum)
11378 << FirstEnum << FirstModule.empty() << FirstModule << Range
11379 << DiffType;
11380 };
11381 auto ODRDiagNote = [&SecondModule, this](SourceLocation Loc,
11382 SourceRange Range,
11383 ODREnumDifference DiffType) {
11384 return Diag(Loc, diag::note_module_odr_violation_enum)
11385 << SecondModule << Range << DiffType;
11386 };
11387
11388 if (FirstEnum->isScoped() != SecondEnum->isScoped()) {
11389 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(),
11390 SingleScopedEnum)
11391 << FirstEnum->isScoped();
11392 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(),
11393 SingleScopedEnum)
11394 << SecondEnum->isScoped();
11395 Diagnosed = true;
11396 continue;
11397 }
11398
11399 if (FirstEnum->isScoped() && SecondEnum->isScoped()) {
11400 if (FirstEnum->isScopedUsingClassTag() !=
11401 SecondEnum->isScopedUsingClassTag()) {
11402 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(),
11403 EnumTagKeywordMismatch)
11404 << FirstEnum->isScopedUsingClassTag();
11405 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(),
11406 EnumTagKeywordMismatch)
11407 << SecondEnum->isScopedUsingClassTag();
11408 Diagnosed = true;
11409 continue;
11410 }
11411 }
11412
11413 QualType FirstUnderlyingType =
11414 FirstEnum->getIntegerTypeSourceInfo()
11415 ? FirstEnum->getIntegerTypeSourceInfo()->getType()
11416 : QualType();
11417 QualType SecondUnderlyingType =
11418 SecondEnum->getIntegerTypeSourceInfo()
11419 ? SecondEnum->getIntegerTypeSourceInfo()->getType()
11420 : QualType();
11421 if (FirstUnderlyingType.isNull() != SecondUnderlyingType.isNull()) {
11422 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(),
11423 SingleSpecifiedType)
11424 << !FirstUnderlyingType.isNull();
11425 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(),
11426 SingleSpecifiedType)
11427 << !SecondUnderlyingType.isNull();
11428 Diagnosed = true;
11429 continue;
11430 }
11431
11432 if (!FirstUnderlyingType.isNull() && !SecondUnderlyingType.isNull()) {
11433 if (ComputeQualTypeODRHash(FirstUnderlyingType) !=
11434 ComputeQualTypeODRHash(SecondUnderlyingType)) {
11435 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(),
11436 DifferentSpecifiedTypes)
11437 << FirstUnderlyingType;
11438 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(),
11439 DifferentSpecifiedTypes)
11440 << SecondUnderlyingType;
11441 Diagnosed = true;
11442 continue;
11443 }
11444 }
11445
11446 DeclHashes SecondHashes;
11447 PopulateHashes(SecondHashes, SecondEnum);
11448
11449 if (FirstHashes.size() != SecondHashes.size()) {
11450 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(),
11451 DifferentNumberEnumConstants)
11452 << (int)FirstHashes.size();
11453 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(),
11454 DifferentNumberEnumConstants)
11455 << (int)SecondHashes.size();
11456 Diagnosed = true;
11457 continue;
11458 }
11459
11460 for (unsigned I = 0; I < FirstHashes.size(); ++I) {
11461 if (FirstHashes[I].second == SecondHashes[I].second)
11462 continue;
11463 const EnumConstantDecl *FirstEnumConstant = FirstHashes[I].first;
11464 const EnumConstantDecl *SecondEnumConstant = SecondHashes[I].first;
11465
11466 if (FirstEnumConstant->getDeclName() !=
11467 SecondEnumConstant->getDeclName()) {
11468
11469 ODRDiagError(FirstEnumConstant->getLocation(),
11470 FirstEnumConstant->getSourceRange(), EnumConstantName)
11471 << I + 1 << FirstEnumConstant;
11472 ODRDiagNote(SecondEnumConstant->getLocation(),
11473 SecondEnumConstant->getSourceRange(), EnumConstantName)
11474 << I + 1 << SecondEnumConstant;
11475 Diagnosed = true;
11476 break;
11477 }
11478
11479 const Expr *FirstInit = FirstEnumConstant->getInitExpr();
11480 const Expr *SecondInit = SecondEnumConstant->getInitExpr();
11481 if (!FirstInit && !SecondInit)
11482 continue;
11483
11484 if (!FirstInit || !SecondInit) {
11485 ODRDiagError(FirstEnumConstant->getLocation(),
11486 FirstEnumConstant->getSourceRange(),
11487 EnumConstantSingleInitilizer)
11488 << I + 1 << FirstEnumConstant << (FirstInit != nullptr);
11489 ODRDiagNote(SecondEnumConstant->getLocation(),
11490 SecondEnumConstant->getSourceRange(),
11491 EnumConstantSingleInitilizer)
11492 << I + 1 << SecondEnumConstant << (SecondInit != nullptr);
11493 Diagnosed = true;
11494 break;
11495 }
11496
11497 if (ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) {
11498 ODRDiagError(FirstEnumConstant->getLocation(),
11499 FirstEnumConstant->getSourceRange(),
11500 EnumConstantDifferentInitilizer)
11501 << I + 1 << FirstEnumConstant;
11502 ODRDiagNote(SecondEnumConstant->getLocation(),
11503 SecondEnumConstant->getSourceRange(),
11504 EnumConstantDifferentInitilizer)
11505 << I + 1 << SecondEnumConstant;
11506 Diagnosed = true;
11507 break;
11508 }
11509 }
11510 }
11511
11512 (void)Diagnosed;
11513 assert(Diagnosed && "Unable to emit ODR diagnostic.")((Diagnosed && "Unable to emit ODR diagnostic.") ? static_cast
<void> (0) : __assert_fail ("Diagnosed && \"Unable to emit ODR diagnostic.\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 11513, __PRETTY_FUNCTION__))
;
11514 }
11515}
11516
11517void ASTReader::StartedDeserializing() {
11518 if (++NumCurrentElementsDeserializing == 1 && ReadTimer.get())
11519 ReadTimer->startTimer();
11520}
11521
11522void ASTReader::FinishedDeserializing() {
11523 assert(NumCurrentElementsDeserializing &&((NumCurrentElementsDeserializing && "FinishedDeserializing not paired with StartedDeserializing"
) ? static_cast<void> (0) : __assert_fail ("NumCurrentElementsDeserializing && \"FinishedDeserializing not paired with StartedDeserializing\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 11524, __PRETTY_FUNCTION__))
11524 "FinishedDeserializing not paired with StartedDeserializing")((NumCurrentElementsDeserializing && "FinishedDeserializing not paired with StartedDeserializing"
) ? static_cast<void> (0) : __assert_fail ("NumCurrentElementsDeserializing && \"FinishedDeserializing not paired with StartedDeserializing\""
, "/build/llvm-toolchain-snapshot-8~svn345461/tools/clang/lib/Serialization/ASTReader.cpp"
, 11524, __PRETTY_FUNCTION__))
;
11525 if (NumCurrentElementsDeserializing == 1) {
11526 // We decrease NumCurrentElementsDeserializing only after pending actions
11527 // are finished, to avoid recursively re-calling finishPendingActions().
11528 finishPendingActions();
11529 }
11530 --NumCurrentElementsDeserializing;
11531
11532 if (NumCurrentElementsDeserializing == 0) {
11533 // Propagate exception specification and deduced type updates along
11534 // redeclaration chains.
11535 //
11536 // We do this now rather than in finishPendingActions because we want to
11537 // be able to walk the complete redeclaration chains of the updated decls.
11538 while (!PendingExceptionSpecUpdates.empty() ||
11539 !PendingDeducedTypeUpdates.empty()) {
11540 auto ESUpdates = std::move(PendingExceptionSpecUpdates);
11541 PendingExceptionSpecUpdates.clear();
11542 for (auto Update : ESUpdates) {
11543 ProcessingUpdatesRAIIObj ProcessingUpdates(*this);
11544 auto *FPT = Update.second->getType()->castAs<FunctionProtoType>();
11545 auto ESI = FPT->getExtProtoInfo().ExceptionSpec;
11546 if (auto *Listener = getContext().getASTMutationListener())
11547 Listener->ResolvedExceptionSpec(cast<FunctionDecl>(Update.second));
11548 for (auto *Redecl : Update.second->redecls())
11549 getContext().adjustExceptionSpec(cast<FunctionDecl>(Redecl), ESI);
11550 }
11551
11552 auto DTUpdates = std::move(PendingDeducedTypeUpdates);
11553 PendingDeducedTypeUpdates.clear();
11554 for (auto Update : DTUpdates) {
11555 ProcessingUpdatesRAIIObj ProcessingUpdates(*this);
11556 // FIXME: If the return type is already deduced, check that it matches.
11557 getContext().adjustDeducedFunctionResultType(Update.first,
11558 Update.second);
11559 }
11560 }
11561
11562 if (ReadTimer)
11563 ReadTimer->stopTimer();
11564
11565 diagnoseOdrViolations();
11566
11567 // We are not in recursive loading, so it's safe to pass the "interesting"
11568 // decls to the consumer.
11569 if (Consumer)
11570 PassInterestingDeclsToConsumer();
11571 }
11572}
11573
11574void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) {
11575 if (IdentifierInfo *II = Name.getAsIdentifierInfo()) {
11576 // Remove any fake results before adding any real ones.
11577 auto It = PendingFakeLookupResults.find(II);
11578 if (It != PendingFakeLookupResults.end()) {
11579 for (auto *ND : It->second)
11580 SemaObj->IdResolver.RemoveDecl(ND);
11581 // FIXME: this works around module+PCH performance issue.
11582 // Rather than erase the result from the map, which is O(n), just clear
11583 // the vector of NamedDecls.
11584 It->second.clear();
11585 }
11586 }
11587
11588 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
11589 SemaObj->TUScope->AddDecl(D);
11590 } else if (SemaObj->TUScope) {
11591 // Adding the decl to IdResolver may have failed because it was already in
11592 // (even though it was not added in scope). If it is already in, make sure
11593 // it gets in the scope as well.
11594 if (std::find(SemaObj->IdResolver.begin(Name),
11595 SemaObj->IdResolver.end(), D) != SemaObj->IdResolver.end())
11596 SemaObj->TUScope->AddDecl(D);
11597 }
11598}
11599
11600ASTReader::ASTReader(Preprocessor &PP, ASTContext *Context,
11601 const PCHContainerReader &PCHContainerRdr,
11602 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
11603 StringRef isysroot, bool DisableValidation,
11604 bool AllowASTWithCompilerErrors,
11605 bool AllowConfigurationMismatch, bool ValidateSystemInputs,
11606 bool UseGlobalIndex,
11607 std::unique_ptr<llvm::Timer> ReadTimer)
11608 : Listener(DisableValidation
11609 ? cast<ASTReaderListener>(new SimpleASTReaderListener(PP))
11610 : cast<ASTReaderListener>(new PCHValidator(PP, *this))),
11611 SourceMgr(PP.getSourceManager()), FileMgr(PP.getFileManager()),
11612 PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()), PP(PP),
11613 ContextObj(Context),
11614 ModuleMgr(PP.getFileManager(), PP.getPCMCache(), PCHContainerRdr,
11615 PP.getHeaderSearchInfo()),
11616 PCMCache(PP.getPCMCache()), DummyIdResolver(PP),
11617 ReadTimer(std::move(ReadTimer)), isysroot(isysroot),
11618 DisableValidation(DisableValidation),
11619 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
11620 AllowConfigurationMismatch(AllowConfigurationMismatch),
11621 ValidateSystemInputs(ValidateSystemInputs),
11622 UseGlobalIndex(UseGlobalIndex), CurrSwitchCaseStmts(&SwitchCaseStmts) {
11623 SourceMgr.setExternalSLocEntrySource(this);
11624
11625 for (const auto &Ext : Extensions) {
11626 auto BlockName = Ext->getExtensionMetadata().BlockName;
11627 auto Known = ModuleFileExtensions.find(BlockName);
11628 if (Known != ModuleFileExtensions.end()) {
11629 Diags.Report(diag::warn_duplicate_module_file_extension)
11630 << BlockName;
11631 continue;
11632 }
11633
11634 ModuleFileExtensions.insert({BlockName, Ext});
11635 }
11636}
11637
11638ASTReader::~ASTReader() {
11639 if (OwnsDeserializationListener)
11640 delete DeserializationListener;
11641}
11642
11643IdentifierResolver &ASTReader::getIdResolver() {
11644 return SemaObj ? SemaObj->IdResolver : DummyIdResolver;
11645}
11646
11647unsigned ASTRecordReader::readRecord(llvm::BitstreamCursor &Cursor,
11648 unsigned AbbrevID) {
11649 Idx = 0;
11650 Record.clear();
11651 return Cursor.readRecord(AbbrevID, Record);
11652}
11653//===----------------------------------------------------------------------===//
11654//// OMPClauseReader implementation
11655////===----------------------------------------------------------------------===//
11656
11657OMPClause *OMPClauseReader::readClause() {
11658 OMPClause *C;
1
'C' declared without an initial value
11659 switch (Record.readInt()) {
2
'Default' branch taken. Execution continues on line 11850
11660 case OMPC_if:
11661 C = new (Context) OMPIfClause();
11662 break;
11663 case OMPC_final:
11664 C = new (Context) OMPFinalClause();
11665 break;
11666 case OMPC_num_threads:
11667 C = new (Context) OMPNumThreadsClause();
11668 break;
11669 case OMPC_safelen:
11670 C = new (Context) OMPSafelenClause();
11671 break;
11672 case OMPC_simdlen:
11673 C = new (Context) OMPSimdlenClause();
11674 break;
11675 case OMPC_collapse:
11676 C = new (Context) OMPCollapseClause();
11677 break;
11678 case OMPC_default:
11679 C = new (Context) OMPDefaultClause();
11680 break;
11681 case OMPC_proc_bind:
11682 C = new (Context) OMPProcBindClause();
11683 break;
11684 case OMPC_schedule:
11685 C = new (Context) OMPScheduleClause();
11686 break;
11687 case OMPC_ordered:
11688 C = OMPOrderedClause::CreateEmpty(Context, Record.readInt());
11689 break;
11690 case OMPC_nowait:
11691 C = new (Context) OMPNowaitClause();
11692 break;
11693 case OMPC_untied:
11694 C = new (Context) OMPUntiedClause();
11695 break;
11696 case OMPC_mergeable:
11697 C = new (Context) OMPMergeableClause();
11698 break;
11699 case OMPC_read:
11700 C = new (Context) OMPReadClause();
11701 break;
11702 case OMPC_write:
11703 C = new (Context) OMPWriteClause();
11704 break;
11705 case OMPC_update:
11706 C = new (Context) OMPUpdateClause();
11707 break;
11708 case OMPC_capture:
11709 C = new (Context) OMPCaptureClause();
11710 break;
11711 case OMPC_seq_cst:
11712 C = new (Context) OMPSeqCstClause();
11713 break;
11714 case OMPC_threads:
11715 C = new (Context) OMPThreadsClause();
11716 break;
11717 case OMPC_simd:
11718 C = new (Context) OMPSIMDClause();
11719 break;
11720 case OMPC_nogroup:
11721 C = new (Context) OMPNogroupClause();
11722 break;
11723 case OMPC_unified_address:
11724 C = new (Context) OMPUnifiedAddressClause();
11725 break;
11726 case OMPC_unified_shared_memory:
11727 C = new (Context) OMPUnifiedSharedMemoryClause();
11728 break;
11729 case OMPC_reverse_offload:
11730 C = new (Context) OMPReverseOffloadClause();
11731 break;
11732 case OMPC_dynamic_allocators:
11733 C = new (Context) OMPDynamicAllocatorsClause();
11734 break;
11735 case OMPC_private:
11736 C = OMPPrivateClause::CreateEmpty(Context, Record.readInt());
11737 break;
11738 case OMPC_firstprivate:
11739 C = OMPFirstprivateClause::CreateEmpty(Context, Record.readInt());
11740 break;
11741 case OMPC_lastprivate:
11742 C = OMPLastprivateClause::CreateEmpty(Context, Record.readInt());
11743 break;
11744 case OMPC_shared:
11745 C = OMPSharedClause::CreateEmpty(Context, Record.readInt());
11746 break;
11747 case OMPC_reduction:
11748 C = OMPReductionClause::CreateEmpty(Context, Record.readInt());
11749 break;
11750 case OMPC_task_reduction:
11751 C = OMPTaskReductionClause::CreateEmpty(Context, Record.readInt());
11752 break;
11753 case OMPC_in_reduction:
11754 C = OMPInReductionClause::CreateEmpty(Context, Record.readInt());
11755 break;
11756 case OMPC_linear:
11757 C = OMPLinearClause::CreateEmpty(Context, Record.readInt());
11758 break;
11759 case OMPC_aligned:
11760 C = OMPAlignedClause::CreateEmpty(Context, Record.readInt());
11761 break;
11762 case OMPC_copyin:
11763 C = OMPCopyinClause::CreateEmpty(Context, Record.readInt());
11764 break;
11765 case OMPC_copyprivate:
11766 C = OMPCopyprivateClause::CreateEmpty(Context, Record.readInt());
11767 break;
11768 case OMPC_flush:
11769 C = OMPFlushClause::CreateEmpty(Context, Record.readInt());
11770 break;
11771 case OMPC_depend: {
11772 unsigned NumVars = Record.readInt();
11773 unsigned NumLoops = Record.readInt();
11774 C = OMPDependClause::CreateEmpty(Context, NumVars, NumLoops);
11775 break;
11776 }
11777 case OMPC_device:
11778 C = new (Context) OMPDeviceClause();
11779 break;
11780 case OMPC_map: {
11781 unsigned NumVars = Record.readInt();
11782 unsigned NumDeclarations = Record.readInt();
11783 unsigned NumLists = Record.readInt();
11784 unsigned NumComponents = Record.readInt();
11785 C = OMPMapClause::CreateEmpty(Context, NumVars, NumDeclarations, NumLists,
11786 NumComponents);
11787 break;
11788 }
11789 case OMPC_num_teams:
11790 C = new (Context) OMPNumTeamsClause();
11791 break;
11792 case OMPC_thread_limit:
11793 C = new (Context) OMPThreadLimitClause();
11794 break;
11795 case OMPC_priority:
11796 C = new (Context) OMPPriorityClause();
11797 break;
11798 case OMPC_grainsize:
11799 C = new (Context) OMPGrainsizeClause();
11800 break;
11801 case OMPC_num_tasks:
11802 C = new (Context) OMPNumTasksClause();
11803 break;
11804 case OMPC_hint:
11805 C = new (Context) OMPHintClause();
11806 break;
11807 case OMPC_dist_schedule:
11808 C = new (Context) OMPDistScheduleClause();
11809 break;
11810 case OMPC_defaultmap:
11811 C = new (Context) OMPDefaultmapClause();
11812 break;
11813 case OMPC_to: {
11814 unsigned NumVars = Record.readInt();
11815 unsigned NumDeclarations = Record.readInt();
11816 unsigned NumLists = Record.readInt();
11817 unsigned NumComponents = Record.readInt();
11818 C = OMPToClause::CreateEmpty(Context, NumVars, NumDeclarations, NumLists,
11819 NumComponents);
11820 break;
11821 }
11822 case OMPC_from: {
11823 unsigned NumVars = Record.readInt();
11824 unsigned NumDeclarations = Record.readInt();
11825 unsigned NumLists = Record.readInt();
11826 unsigned NumComponents = Record.readInt();
11827 C = OMPFromClause::CreateEmpty(Context, NumVars, NumDeclarations, NumLists,
11828 NumComponents);
11829 break;
11830 }
11831 case OMPC_use_device_ptr: {
11832 unsigned NumVars = Record.readInt();
11833 unsigned NumDeclarations = Record.readInt();
11834 unsigned NumLists = Record.readInt();
11835 unsigned NumComponents = Record.readInt();
11836 C = OMPUseDevicePtrClause::CreateEmpty(Context, NumVars, NumDeclarations,
11837 NumLists, NumComponents);
11838 break;
11839 }
11840 case OMPC_is_device_ptr: {
11841 unsigned NumVars = Record.readInt();
11842 unsigned NumDeclarations = Record.readInt();
11843 unsigned NumLists = Record.readInt();
11844 unsigned NumComponents = Record.readInt();
11845 C = OMPIsDevicePtrClause::CreateEmpty(Context, NumVars, NumDeclarations,
11846 NumLists, NumComponents);
11847 break;
11848 }
11849 }
11850 Visit(C);
3
1st function call argument is an uninitialized value
11851 C->setLocStart(Record.readSourceLocation());
11852 C->setLocEnd(Record.readSourceLocation());
11853
11854 return C;
11855}
11856
11857void OMPClauseReader::VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C) {
11858 C->setPreInitStmt(Record.readSubStmt(),
11859 static_cast<OpenMPDirectiveKind>(Record.readInt()));
11860}
11861
11862void OMPClauseReader::VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C) {
11863 VisitOMPClauseWithPreInit(C);
11864 C->setPostUpdateExpr(Record.readSubExpr());
11865}
11866
11867void OMPClauseReader::VisitOMPIfClause(OMPIfClause *C) {
11868 VisitOMPClauseWithPreInit(C);
11869 C->setNameModifier(static_cast<OpenMPDirectiveKind>(Record.readInt()));
11870 C->setNameModifierLoc(Record.readSourceLocation());
11871 C->setColonLoc(Record.readSourceLocation());
11872 C->setCondition(Record.readSubExpr());
11873 C->setLParenLoc(Record.readSourceLocation());
11874}
11875
11876void OMPClauseReader::VisitOMPFinalClause(OMPFinalClause *C) {
11877 C->setCondition(Record.readSubExpr());
11878 C->setLParenLoc(Record.readSourceLocation());
11879}
11880
11881void OMPClauseReader::VisitOMPNumThreadsClause(OMPNumThreadsClause *C) {
11882 VisitOMPClauseWithPreInit(C);
11883 C->setNumThreads(Record.readSubExpr());
11884 C->setLParenLoc(Record.readSourceLocation());
11885}
11886
11887void OMPClauseReader::VisitOMPSafelenClause(OMPSafelenClause *C) {
11888 C->setSafelen(Record.readSubExpr());
11889 C->setLParenLoc(Record.readSourceLocation());
11890}
11891
11892void OMPClauseReader::VisitOMPSimdlenClause(OMPSimdlenClause *C) {
11893 C->setSimdlen(Record.readSubExpr());
11894 C->setLParenLoc(Record.readSourceLocation());
11895}
11896
11897void OMPClauseReader::VisitOMPCollapseClause(OMPCollapseClause *C) {
11898 C->setNumForLoops(Record.readSubExpr());
11899 C->setLParenLoc(Record.readSourceLocation());
11900}
11901
11902void OMPClauseReader::VisitOMPDefaultClause(OMPDefaultClause *C) {
11903 C->setDefaultKind(
11904 static_cast<OpenMPDefaultClauseKind>(Record.readInt()));
11905 C->setLParenLoc(Record.readSourceLocation());
11906 C->setDefaultKindKwLoc(Record.readSourceLocation());
11907}
11908
11909void OMPClauseReader::VisitOMPProcBindClause(OMPProcBindClause *C) {
11910 C->setProcBindKind(
11911 static_cast<OpenMPProcBindClauseKind>(Record.readInt()));
11912 C->setLParenLoc(Record.readSourceLocation());
11913 C->setProcBindKindKwLoc(Record.readSourceLocation());
11914}
11915
11916void OMPClauseReader::VisitOMPScheduleClause(OMPScheduleClause *C) {
11917 VisitOMPClauseWithPreInit(C);
11918 C->setScheduleKind(
11919 static_cast<OpenMPScheduleClauseKind>(Record.readInt()));
11920 C->setFirstScheduleModifier(
11921 static_cast<OpenMPScheduleClauseModifier>(Record.readInt()));
11922 C->setSecondScheduleModifier(
11923 static_cast<OpenMPScheduleClauseModifier>(Record.readInt()));
11924 C->setChunkSize(Record.readSubExpr());
11925 C->setLParenLoc(Record.readSourceLocation());
11926 C->setFirstScheduleModifierLoc(Record.readSourceLocation());
11927 C->setSecondScheduleModifierLoc(Record.readSourceLocation());
11928 C->setScheduleKindLoc(Record.readSourceLocation());
11929 C->setCommaLoc(Record.readSourceLocation());
11930}
11931
11932void OMPClauseReader::VisitOMPOrderedClause(OMPOrderedClause *C) {
11933 C->setNumForLoops(Record.readSubExpr());
11934 for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I)
11935 C->setLoopNumIterations(I, Record.readSubExpr());
11936 for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I)
11937 C->setLoopCounter(I, Record.readSubExpr());
11938 C->setLParenLoc(Record.readSourceLocation());
11939}
11940
11941void OMPClauseReader::VisitOMPNowaitClause(OMPNowaitClause *) {}
11942
11943void OMPClauseReader::VisitOMPUntiedClause(OMPUntiedClause *) {}
11944
11945void OMPClauseReader::VisitOMPMergeableClause(OMPMergeableClause *) {}
11946
11947void OMPClauseReader::VisitOMPReadClause(OMPReadClause *) {}
11948
11949void OMPClauseReader::VisitOMPWriteClause(OMPWriteClause *) {}
11950
11951void OMPClauseReader::VisitOMPUpdateClause(OMPUpdateClause *) {}
11952
11953void OMPClauseReader::VisitOMPCaptureClause(OMPCaptureClause *) {}
11954
11955void OMPClauseReader::VisitOMPSeqCstClause(OMPSeqCstClause *) {}
11956
11957void OMPClauseReader::VisitOMPThreadsClause(OMPThreadsClause *) {}
11958
11959void OMPClauseReader::VisitOMPSIMDClause(OMPSIMDClause *) {}
11960
11961void OMPClauseReader::VisitOMPNogroupClause(OMPNogroupClause *) {}
11962
11963void OMPClauseReader::VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *) {}
11964
11965void OMPClauseReader::VisitOMPUnifiedSharedMemoryClause(
11966 OMPUnifiedSharedMemoryClause *) {}
11967
11968void OMPClauseReader::VisitOMPReverseOffloadClause(OMPReverseOffloadClause *) {}
11969
11970void
11971OMPClauseReader::VisitOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause *) {
11972}
11973
11974void OMPClauseReader::VisitOMPPrivateClause(OMPPrivateClause *C) {
11975 C->setLParenLoc(Record.readSourceLocation());
11976 unsigned NumVars = C->varlist_size();
11977 SmallVector<Expr *, 16> Vars;
11978 Vars.reserve(NumVars);
11979 for (unsigned i = 0; i != NumVars; ++i)
11980 Vars.push_back(Record.readSubExpr());
11981 C->setVarRefs(Vars);
11982 Vars.clear();
11983 for (unsigned i = 0; i != NumVars; ++i)
11984 Vars.push_back(Record.readSubExpr());
11985 C->setPrivateCopies(Vars);
11986}
11987
11988void OMPClauseReader::VisitOMPFirstprivateClause(OMPFirstprivateClause *C) {
11989 VisitOMPClauseWithPreInit(C);
11990 C->setLParenLoc(Record.readSourceLocation());
11991 unsigned NumVars = C->varlist_size();
11992 SmallVector<Expr *, 16> Vars;
11993 Vars.reserve(NumVars);
11994 for (unsigned i = 0; i != NumVars; ++i)
11995 Vars.push_back(Record.readSubExpr());
11996 C->setVarRefs(Vars);
11997 Vars.clear();
11998 for (unsigned i = 0; i != NumVars; ++i)
11999 Vars.push_back(Record.readSubExpr());
12000 C->setPrivateCopies(Vars);
12001 Vars.clear();
12002 for (unsigned i = 0; i != NumVars; ++i)
12003 Vars.push_back(Record.readSubExpr());
12004 C->setInits(Vars);
12005}
12006
12007void OMPClauseReader::VisitOMPLastprivateClause(OMPLastprivateClause *C) {
12008 VisitOMPClauseWithPostUpdate(C);
12009 C->setLParenLoc(Record.readSourceLocation());
12010 unsigned NumVars = C->varlist_size();
12011 SmallVector<Expr *, 16> Vars;
12012 Vars.reserve(NumVars);
12013 for (unsigned i = 0; i != NumVars; ++i)
12014 Vars.push_back(Record.readSubExpr());
12015 C->setVarRefs(Vars);
12016 Vars.clear();
12017 for (unsigned i = 0; i != NumVars; ++i)
12018 Vars.push_back(Record.readSubExpr());
12019 C->setPrivateCopies(Vars);
12020 Vars.clear();
12021 for (unsigned i = 0; i != NumVars; ++i)
12022 Vars.push_back(Record.readSubExpr());
12023 C->setSourceExprs(Vars);
12024 Vars.clear();
12025 for (unsigned i = 0; i != NumVars; ++i)
12026 Vars.push_back(Record.readSubExpr());
12027 C->setDestinationExprs(Vars);
12028 Vars.clear();
12029 for (unsigned i = 0; i != NumVars; ++i)
12030 Vars.push_back(Record.readSubExpr());
12031 C->setAssignmentOps(Vars);
12032}
12033
12034void OMPClauseReader::VisitOMPSharedClause(OMPSharedClause *C) {
12035 C->setLParenLoc(Record.readSourceLocation());
12036 unsigned NumVars = C->varlist_size();
12037 SmallVector<Expr *, 16> Vars;
12038 Vars.reserve(NumVars);
12039 for (unsigned i = 0; i != NumVars; ++i)
12040 Vars.push_back(Record.readSubExpr());
12041 C->setVarRefs(Vars);
12042}
12043
12044void OMPClauseReader::VisitOMPReductionClause(OMPReductionClause *C) {
12045 VisitOMPClauseWithPostUpdate(C);
12046 C->setLParenLoc(Record.readSourceLocation());
12047 C->setColonLoc(Record.readSourceLocation());
12048 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12049 DeclarationNameInfo DNI;
12050 Record.readDeclarationNameInfo(DNI);
12051 C->setQualifierLoc(NNSL);
12052 C->setNameInfo(DNI);
12053
12054 unsigned NumVars = C->varlist_size();
12055 SmallVector<Expr *, 16> Vars;
12056 Vars.reserve(NumVars);
12057 for (unsigned i = 0; i != NumVars; ++i)
12058 Vars.push_back(Record.readSubExpr());
12059 C->setVarRefs(Vars);
12060 Vars.clear();
12061 for (unsigned i = 0; i != NumVars; ++i)
12062 Vars.push_back(Record.readSubExpr());
12063 C->setPrivates(Vars);
12064 Vars.clear();
12065 for (unsigned i = 0; i != NumVars; ++i)
12066 Vars.push_back(Record.readSubExpr());
12067 C->setLHSExprs(Vars);
12068 Vars.clear();
12069 for (unsigned i = 0; i != NumVars; ++i)
12070 Vars.push_back(Record.readSubExpr());
12071 C->setRHSExprs(Vars);
12072 Vars.clear();
12073 for (unsigned i = 0; i != NumVars; ++i)
12074 Vars.push_back(Record.readSubExpr());
12075 C->setReductionOps(Vars);
12076}
12077
12078void OMPClauseReader::VisitOMPTaskReductionClause(OMPTaskReductionClause *C) {
12079 VisitOMPClauseWithPostUpdate(C);
12080 C->setLParenLoc(Record.readSourceLocation());
12081 C->setColonLoc(Record.readSourceLocation());
12082 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12083 DeclarationNameInfo DNI;
12084 Record.readDeclarationNameInfo(DNI);
12085 C->setQualifierLoc(NNSL);
12086 C->setNameInfo(DNI);
12087
12088 unsigned NumVars = C->varlist_size();
12089 SmallVector<Expr *, 16> Vars;
12090 Vars.reserve(NumVars);
12091 for (unsigned I = 0; I != NumVars; ++I)
12092 Vars.push_back(Record.readSubExpr());
12093 C->setVarRefs(Vars);
12094 Vars.clear();
12095 for (unsigned I = 0; I != NumVars; ++I)
12096 Vars.push_back(Record.readSubExpr());
12097 C->setPrivates(Vars);
12098 Vars.clear();
12099 for (unsigned I = 0; I != NumVars; ++I)
12100 Vars.push_back(Record.readSubExpr());
12101 C->setLHSExprs(Vars);
12102 Vars.clear();
12103 for (unsigned I = 0; I != NumVars; ++I)
12104 Vars.push_back(Record.readSubExpr());
12105 C->setRHSExprs(Vars);
12106 Vars.clear();
12107 for (unsigned I = 0; I != NumVars; ++I)
12108 Vars.push_back(Record.readSubExpr());
12109 C->setReductionOps(Vars);
12110}
12111
12112void OMPClauseReader::VisitOMPInReductionClause(OMPInReductionClause *C) {
12113 VisitOMPClauseWithPostUpdate(C);
12114 C->setLParenLoc(Record.readSourceLocation());
12115 C->setColonLoc(Record.readSourceLocation());
12116 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12117 DeclarationNameInfo DNI;
12118 Record.readDeclarationNameInfo(DNI);
12119 C->setQualifierLoc(NNSL);
12120 C->setNameInfo(DNI);
12121
12122 unsigned NumVars = C->varlist_size();
12123 SmallVector<Expr *, 16> Vars;
12124 Vars.reserve(NumVars);
12125 for (unsigned I = 0; I != NumVars; ++I)
12126 Vars.push_back(Record.readSubExpr());
12127 C->setVarRefs(Vars);
12128 Vars.clear();
12129 for (unsigned I = 0; I != NumVars; ++I)
12130 Vars.push_back(Record.readSubExpr());
12131 C->setPrivates(Vars);
12132 Vars.clear();
12133 for (unsigned I = 0; I != NumVars; ++I)
12134 Vars.push_back(Record.readSubExpr());
12135 C->setLHSExprs(Vars);
12136 Vars.clear();
12137 for (unsigned I = 0; I != NumVars; ++I)
12138 Vars.push_back(Record.readSubExpr());
12139 C->setRHSExprs(Vars);
12140 Vars.clear();
12141 for (unsigned I = 0; I != NumVars; ++I)
12142 Vars.push_back(Record.readSubExpr());
12143 C->setReductionOps(Vars);
12144 Vars.clear();
12145 for (unsigned I = 0; I != NumVars; ++I)
12146 Vars.push_back(Record.readSubExpr());
12147 C->setTaskgroupDescriptors(Vars);
12148}
12149
12150void OMPClauseReader::VisitOMPLinearClause(OMPLinearClause *C) {
12151 VisitOMPClauseWithPostUpdate(C);
12152 C->setLParenLoc(Record.readSourceLocation());
12153 C->setColonLoc(Record.readSourceLocation());
12154 C->setModifier(static_cast<OpenMPLinearClauseKind>(Record.readInt()));
12155 C->setModifierLoc(Record.readSourceLocation());
12156 unsigned NumVars = C->varlist_size();
12157 SmallVector<Expr *, 16> Vars;
12158 Vars.reserve(NumVars);
12159 for (unsigned i = 0; i != NumVars; ++i)
12160 Vars.push_back(Record.readSubExpr());
12161 C->setVarRefs(Vars);
12162 Vars.clear();
12163 for (unsigned i = 0; i != NumVars; ++i)
12164 Vars.push_back(Record.readSubExpr());
12165 C->setPrivates(Vars);
12166 Vars.clear();
12167 for (unsigned i = 0; i != NumVars; ++i)
12168 Vars.push_back(Record.readSubExpr());
12169 C->setInits(Vars);
12170 Vars.clear();
12171 for (unsigned i = 0; i != NumVars; ++i)
12172 Vars.push_back(Record.readSubExpr());
12173 C->setUpdates(Vars);
12174 Vars.clear();
12175 for (unsigned i = 0; i != NumVars; ++i)
12176 Vars.push_back(Record.readSubExpr());
12177 C->setFinals(Vars);
12178 C->setStep(Record.readSubExpr());
12179 C->setCalcStep(Record.readSubExpr());
12180}
12181
12182void OMPClauseReader::VisitOMPAlignedClause(OMPAlignedClause *C) {
12183 C->setLParenLoc(Record.readSourceLocation());
12184 C->setColonLoc(Record.readSourceLocation());
12185 unsigned NumVars = C->varlist_size();
12186 SmallVector<Expr *, 16> Vars;
12187 Vars.reserve(NumVars);
12188 for (unsigned i = 0; i != NumVars; ++i)
12189 Vars.push_back(Record.readSubExpr());
12190 C->setVarRefs(Vars);
12191 C->setAlignment(Record.readSubExpr());
12192}
12193
12194void OMPClauseReader::VisitOMPCopyinClause(OMPCopyinClause *C) {
12195 C->setLParenLoc(Record.readSourceLocation());
12196 unsigned NumVars = C->varlist_size();
12197 SmallVector<Expr *, 16> Exprs;
12198 Exprs.reserve(NumVars);
12199 for (unsigned i = 0; i != NumVars; ++i)
12200 Exprs.push_back(Record.readSubExpr());
12201 C->setVarRefs(Exprs);
12202 Exprs.clear();
12203 for (unsigned i = 0; i != NumVars; ++i)
12204 Exprs.push_back(Record.readSubExpr());
12205 C->setSourceExprs(Exprs);
12206 Exprs.clear();
12207 for (unsigned i = 0; i != NumVars; ++i)
12208 Exprs.push_back(Record.readSubExpr());
12209 C->setDestinationExprs(Exprs);
12210 Exprs.clear();
12211 for (unsigned i = 0; i != NumVars; ++i)
12212 Exprs.push_back(Record.readSubExpr());
12213 C->setAssignmentOps(Exprs);
12214}
12215
12216void OMPClauseReader::VisitOMPCopyprivateClause(OMPCopyprivateClause *C) {
12217 C->setLParenLoc(Record.readSourceLocation());
12218 unsigned NumVars = C->varlist_size();
12219 SmallVector<Expr *, 16> Exprs;
12220 Exprs.reserve(NumVars);
12221 for (unsigned i = 0; i != NumVars; ++i)
12222 Exprs.push_back(Record.readSubExpr());
12223 C->setVarRefs(Exprs);
12224 Exprs.clear();
12225 for (unsigned i = 0; i != NumVars; ++i)
12226 Exprs.push_back(Record.readSubExpr());
12227 C->setSourceExprs(Exprs);
12228 Exprs.clear();
12229 for (unsigned i = 0; i != NumVars; ++i)
12230 Exprs.push_back(Record.readSubExpr());
12231 C->setDestinationExprs(Exprs);
12232 Exprs.clear();
12233 for (unsigned i = 0; i != NumVars; ++i)
12234 Exprs.push_back(Record.readSubExpr());
12235 C->setAssignmentOps(Exprs);
12236}
12237
12238void OMPClauseReader::VisitOMPFlushClause(OMPFlushClause *C) {
12239 C->setLParenLoc(Record.readSourceLocation());
12240 unsigned NumVars = C->varlist_size();
12241 SmallVector<Expr *, 16> Vars;
12242 Vars.reserve(NumVars);
12243 for (unsigned i = 0; i != NumVars; ++i)
12244 Vars.push_back(Record.readSubExpr());
12245 C->setVarRefs(Vars);
12246}
12247
12248void OMPClauseReader::VisitOMPDependClause(OMPDependClause *C) {
12249 C->setLParenLoc(Record.readSourceLocation());
12250 C->setDependencyKind(
12251 static_cast<OpenMPDependClauseKind>(Record.readInt()));
12252 C->setDependencyLoc(Record.readSourceLocation());
12253 C->setColonLoc(Record.readSourceLocation());
12254 unsigned NumVars = C->varlist_size();
12255 SmallVector<Expr *, 16> Vars;
12256 Vars.reserve(NumVars);
12257 for (unsigned I = 0; I != NumVars; ++I)
12258 Vars.push_back(Record.readSubExpr());
12259 C->setVarRefs(Vars);
12260 for (unsigned I = 0, E = C->getNumLoops(); I < E; ++I)
12261 C->setLoopData(I, Record.readSubExpr());
12262}
12263
12264void OMPClauseReader::VisitOMPDeviceClause(OMPDeviceClause *C) {
12265 VisitOMPClauseWithPreInit(C);
12266 C->setDevice(Record.readSubExpr());
12267 C->setLParenLoc(Record.readSourceLocation());
12268}
12269
12270void OMPClauseReader::VisitOMPMapClause(OMPMapClause *C) {
12271 C->setLParenLoc(Record.readSourceLocation());
12272 C->setMapTypeModifier(
12273 static_cast<OpenMPMapClauseKind>(Record.readInt()));
12274 C->setMapType(
12275 static_cast<OpenMPMapClauseKind>(Record.readInt()));
12276 C->setMapLoc(Record.readSourceLocation());
12277 C->setColonLoc(Record.readSourceLocation());
12278 auto NumVars = C->varlist_size();
12279 auto UniqueDecls = C->getUniqueDeclarationsNum();
12280 auto TotalLists = C->getTotalComponentListNum();
12281 auto TotalComponents = C->getTotalComponentsNum();
12282
12283 SmallVector<Expr *, 16> Vars;
12284 Vars.reserve(NumVars);
12285 for (unsigned i = 0; i != NumVars; ++i)
12286 Vars.push_back(Record.readSubExpr());
12287 C->setVarRefs(Vars);
12288
12289 SmallVector<ValueDecl *, 16> Decls;
12290 Decls.reserve(UniqueDecls);
12291 for (unsigned i = 0; i < UniqueDecls; ++i)
12292 Decls.push_back(Record.readDeclAs<ValueDecl>());
12293 C->setUniqueDecls(Decls);
12294
12295 SmallVector<unsigned, 16> ListsPerDecl;
12296 ListsPerDecl.reserve(UniqueDecls);
12297 for (unsigned i = 0; i < UniqueDecls; ++i)
12298 ListsPerDecl.push_back(Record.readInt());
12299 C->setDeclNumLists(ListsPerDecl);
12300
12301 SmallVector<unsigned, 32> ListSizes;
12302 ListSizes.reserve(TotalLists);
12303 for (unsigned i = 0; i < TotalLists; ++i)
12304 ListSizes.push_back(Record.readInt());
12305 C->setComponentListSizes(ListSizes);
12306
12307 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12308 Components.reserve(TotalComponents);
12309 for (unsigned i = 0; i < TotalComponents; ++i) {
12310 Expr *AssociatedExpr = Record.readSubExpr();
12311 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12312 Components.push_back(OMPClauseMappableExprCommon::MappableComponent(
12313 AssociatedExpr, AssociatedDecl));
12314 }
12315 C->setComponents(Components, ListSizes);
12316}
12317
12318void OMPClauseReader::VisitOMPNumTeamsClause(OMPNumTeamsClause *C) {
12319 VisitOMPClauseWithPreInit(C);
12320 C->setNumTeams(Record.readSubExpr());
12321 C->setLParenLoc(Record.readSourceLocation());
12322}
12323
12324void OMPClauseReader::VisitOMPThreadLimitClause(OMPThreadLimitClause *C) {
12325 VisitOMPClauseWithPreInit(C);
12326 C->setThreadLimit(Record.readSubExpr());
12327 C->setLParenLoc(Record.readSourceLocation());
12328}
12329
12330void OMPClauseReader::VisitOMPPriorityClause(OMPPriorityClause *C) {
12331 C->setPriority(Record.readSubExpr());
12332 C->setLParenLoc(Record.readSourceLocation());
12333}
12334
12335void OMPClauseReader::VisitOMPGrainsizeClause(OMPGrainsizeClause *C) {
12336 C->setGrainsize(Record.readSubExpr());
12337 C->setLParenLoc(Record.readSourceLocation());
12338}
12339
12340void OMPClauseReader::VisitOMPNumTasksClause(OMPNumTasksClause *C) {
12341 C->setNumTasks(Record.readSubExpr());
12342 C->setLParenLoc(Record.readSourceLocation());
12343}
12344
12345void OMPClauseReader::VisitOMPHintClause(OMPHintClause *C) {
12346 C->setHint(Record.readSubExpr());
12347 C->setLParenLoc(Record.readSourceLocation());
12348}
12349
12350void OMPClauseReader::VisitOMPDistScheduleClause(OMPDistScheduleClause *C) {
12351 VisitOMPClauseWithPreInit(C);
12352 C->setDistScheduleKind(
12353 static_cast<OpenMPDistScheduleClauseKind>(Record.readInt()));
12354 C->setChunkSize(Record.readSubExpr());
12355 C->setLParenLoc(Record.readSourceLocation());
12356 C->setDistScheduleKindLoc(Record.readSourceLocation());
12357 C->setCommaLoc(Record.readSourceLocation());
12358}
12359
12360void OMPClauseReader::VisitOMPDefaultmapClause(OMPDefaultmapClause *C) {
12361 C->setDefaultmapKind(
12362 static_cast<OpenMPDefaultmapClauseKind>(Record.readInt()));
12363 C->setDefaultmapModifier(
12364 static_cast<OpenMPDefaultmapClauseModifier>(Record.readInt()));
12365 C->setLParenLoc(Record.readSourceLocation());
12366 C->setDefaultmapModifierLoc(Record.readSourceLocation());
12367 C->setDefaultmapKindLoc(Record.readSourceLocation());
12368}
12369
12370void OMPClauseReader::VisitOMPToClause(OMPToClause *C) {
12371 C->setLParenLoc(Record.readSourceLocation());
12372 auto NumVars = C->varlist_size();
12373 auto UniqueDecls = C->getUniqueDeclarationsNum();
12374 auto TotalLists = C->getTotalComponentListNum();
12375 auto TotalComponents = C->getTotalComponentsNum();
12376
12377 SmallVector<Expr *, 16> Vars;
12378 Vars.reserve(NumVars);
12379 for (unsigned i = 0; i != NumVars; ++i)
12380 Vars.push_back(Record.readSubExpr());
12381 C->setVarRefs(Vars);
12382
12383 SmallVector<ValueDecl *, 16> Decls;
12384 Decls.reserve(UniqueDecls);
12385 for (unsigned i = 0; i < UniqueDecls; ++i)
12386 Decls.push_back(Record.readDeclAs<ValueDecl>());
12387 C->setUniqueDecls(Decls);
12388
12389 SmallVector<unsigned, 16> ListsPerDecl;
12390 ListsPerDecl.reserve(UniqueDecls);
12391 for (unsigned i = 0; i < UniqueDecls; ++i)
12392 ListsPerDecl.push_back(Record.readInt());
12393 C->setDeclNumLists(ListsPerDecl);
12394
12395 SmallVector<unsigned, 32> ListSizes;
12396 ListSizes.reserve(TotalLists);
12397 for (unsigned i = 0; i < TotalLists; ++i)
12398 ListSizes.push_back(Record.readInt());
12399 C->setComponentListSizes(ListSizes);
12400
12401 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12402 Components.reserve(TotalComponents);
12403 for (unsigned i = 0; i < TotalComponents; ++i) {
12404 Expr *AssociatedExpr = Record.readSubExpr();
12405 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12406 Components.push_back(OMPClauseMappableExprCommon::MappableComponent(
12407 AssociatedExpr, AssociatedDecl));
12408 }
12409 C->setComponents(Components, ListSizes);
12410}
12411
12412void OMPClauseReader::VisitOMPFromClause(OMPFromClause *C) {
12413 C->setLParenLoc(Record.readSourceLocation());
12414 auto NumVars = C->varlist_size();
12415 auto UniqueDecls = C->getUniqueDeclarationsNum();
12416 auto TotalLists = C->getTotalComponentListNum();
12417 auto TotalComponents = C->getTotalComponentsNum();
12418
12419 SmallVector<Expr *, 16> Vars;
12420 Vars.reserve(NumVars);
12421 for (unsigned i = 0; i != NumVars; ++i)
12422 Vars.push_back(Record.readSubExpr());
12423 C->setVarRefs(Vars);
12424
12425 SmallVector<ValueDecl *, 16> Decls;
12426 Decls.reserve(UniqueDecls);
12427 for (unsigned i = 0; i < UniqueDecls; ++i)
12428 Decls.push_back(Record.readDeclAs<ValueDecl>());
12429 C->setUniqueDecls(Decls);
12430
12431 SmallVector<unsigned, 16> ListsPerDecl;
12432 ListsPerDecl.reserve(UniqueDecls);
12433 for (unsigned i = 0; i < UniqueDecls; ++i)
12434 ListsPerDecl.push_back(Record.readInt());
12435 C->setDeclNumLists(ListsPerDecl);
12436
12437 SmallVector<unsigned, 32> ListSizes;
12438 ListSizes.reserve(TotalLists);
12439 for (unsigned i = 0; i < TotalLists; ++i)
12440 ListSizes.push_back(Record.readInt());
12441 C->setComponentListSizes(ListSizes);
12442
12443 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12444 Components.reserve(TotalComponents);
12445 for (unsigned i = 0; i < TotalComponents; ++i) {
12446 Expr *AssociatedExpr = Record.readSubExpr();
12447 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12448 Components.push_back(OMPClauseMappableExprCommon::MappableComponent(
12449 AssociatedExpr, AssociatedDecl));
12450 }
12451 C->setComponents(Components, ListSizes);
12452}
12453
12454void OMPClauseReader::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *C) {
12455 C->setLParenLoc(Record.readSourceLocation());
12456 auto NumVars = C->varlist_size();
12457 auto UniqueDecls = C->getUniqueDeclarationsNum();
12458 auto TotalLists = C->getTotalComponentListNum();
12459 auto TotalComponents = C->getTotalComponentsNum();
12460
12461 SmallVector<Expr *, 16> Vars;
12462 Vars.reserve(NumVars);
12463 for (unsigned i = 0; i != NumVars; ++i)
12464 Vars.push_back(Record.readSubExpr());
12465 C->setVarRefs(Vars);
12466 Vars.clear();
12467 for (unsigned i = 0; i != NumVars; ++i)
12468 Vars.push_back(Record.readSubExpr());
12469 C->setPrivateCopies(Vars);
12470 Vars.clear();
12471 for (unsigned i = 0; i != NumVars; ++i)
12472 Vars.push_back(Record.readSubExpr());
12473 C->setInits(Vars);
12474
12475 SmallVector<ValueDecl *, 16> Decls;
12476 Decls.reserve(UniqueDecls);
12477 for (unsigned i = 0; i < UniqueDecls; ++i)
12478 Decls.push_back(Record.readDeclAs<ValueDecl>());
12479 C->setUniqueDecls(Decls);
12480
12481 SmallVector<unsigned, 16> ListsPerDecl;
12482 ListsPerDecl.reserve(UniqueDecls);
12483 for (unsigned i = 0; i < UniqueDecls; ++i)
12484 ListsPerDecl.push_back(Record.readInt());
12485 C->setDeclNumLists(ListsPerDecl);
12486
12487 SmallVector<unsigned, 32> ListSizes;
12488 ListSizes.reserve(TotalLists);
12489 for (unsigned i = 0; i < TotalLists; ++i)
12490 ListSizes.push_back(Record.readInt());
12491 C->setComponentListSizes(ListSizes);
12492
12493 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12494 Components.reserve(TotalComponents);
12495 for (unsigned i = 0; i < TotalComponents; ++i) {
12496 Expr *AssociatedExpr = Record.readSubExpr();
12497 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12498 Components.push_back(OMPClauseMappableExprCommon::MappableComponent(
12499 AssociatedExpr, AssociatedDecl));
12500 }
12501 C->setComponents(Components, ListSizes);
12502}
12503
12504void OMPClauseReader::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
12505 C->setLParenLoc(Record.readSourceLocation());
12506 auto NumVars = C->varlist_size();
12507 auto UniqueDecls = C->getUniqueDeclarationsNum();
12508 auto TotalLists = C->getTotalComponentListNum();
12509 auto TotalComponents = C->getTotalComponentsNum();
12510
12511 SmallVector<Expr *, 16> Vars;
12512 Vars.reserve(NumVars);
12513 for (unsigned i = 0; i != NumVars; ++i)
12514 Vars.push_back(Record.readSubExpr());
12515 C->setVarRefs(Vars);
12516 Vars.clear();
12517
12518 SmallVector<ValueDecl *, 16> Decls;
12519 Decls.reserve(UniqueDecls);
12520 for (unsigned i = 0; i < UniqueDecls; ++i)
12521 Decls.push_back(Record.readDeclAs<ValueDecl>());
12522 C->setUniqueDecls(Decls);
12523
12524 SmallVector<unsigned, 16> ListsPerDecl;
12525 ListsPerDecl.reserve(UniqueDecls);
12526 for (unsigned i = 0; i < UniqueDecls; ++i)
12527 ListsPerDecl.push_back(Record.readInt());
12528 C->setDeclNumLists(ListsPerDecl);
12529
12530 SmallVector<unsigned, 32> ListSizes;
12531 ListSizes.reserve(TotalLists);
12532 for (unsigned i = 0; i < TotalLists; ++i)
12533 ListSizes.push_back(Record.readInt());
12534 C->setComponentListSizes(ListSizes);
12535
12536 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12537 Components.reserve(TotalComponents);
12538 for (unsigned i = 0; i < TotalComponents; ++i) {
12539 Expr *AssociatedExpr = Record.readSubExpr();
12540 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12541 Components.push_back(OMPClauseMappableExprCommon::MappableComponent(
12542 AssociatedExpr, AssociatedDecl));
12543 }
12544 C->setComponents(Components, ListSizes);
12545}