Bug Summary

File:tools/clang/lib/Serialization/MultiOnDiskHashTable.h
Warning:line 172, column 22
Potential leak of memory pointed to by 'Merged'

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 -analyzer-config-compatibility-mode=true -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-9/lib/clang/9.0.0 -D CLANG_VENDOR="Debian " -D _DEBUG -D _GNU_SOURCE -D __STDC_CONSTANT_MACROS -D __STDC_FORMAT_MACROS -D __STDC_LIMIT_MACROS -I /build/llvm-toolchain-snapshot-9~svn360825/build-llvm/tools/clang/lib/Serialization -I /build/llvm-toolchain-snapshot-9~svn360825/tools/clang/lib/Serialization -I /build/llvm-toolchain-snapshot-9~svn360825/tools/clang/include -I /build/llvm-toolchain-snapshot-9~svn360825/build-llvm/tools/clang/include -I /build/llvm-toolchain-snapshot-9~svn360825/build-llvm/include -I /build/llvm-toolchain-snapshot-9~svn360825/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/9.0.0/include/ -internal-isystem /usr/local/include -internal-isystem /usr/lib/llvm-9/lib/clang/9.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-9~svn360825/build-llvm/tools/clang/lib/Serialization -fdebug-prefix-map=/build/llvm-toolchain-snapshot-9~svn360825=. -ferror-limit 19 -fmessage-length 0 -fvisibility-inlines-hidden -stack-protector 2 -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-2019-05-16-032012-25149-1 -x c++ /build/llvm-toolchain-snapshot-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp -faddrsig

/build/llvm-toolchain-snapshot-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp

1//===- ASTReader.cpp - AST File Reader ------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines the ASTReader class, which reads AST files.
10//
11//===----------------------------------------------------------------------===//
12
13#include "clang/Serialization/ASTReader.h"
14#include "ASTCommon.h"
15#include "ASTReaderInternals.h"
16#include "clang/AST/ASTConsumer.h"
17#include "clang/AST/ASTContext.h"
18#include "clang/AST/ASTMutationListener.h"
19#include "clang/AST/ASTUnresolvedSet.h"
20#include "clang/AST/Decl.h"
21#include "clang/AST/DeclBase.h"
22#include "clang/AST/DeclCXX.h"
23#include "clang/AST/DeclFriend.h"
24#include "clang/AST/DeclGroup.h"
25#include "clang/AST/DeclObjC.h"
26#include "clang/AST/DeclTemplate.h"
27#include "clang/AST/DeclarationName.h"
28#include "clang/AST/Expr.h"
29#include "clang/AST/ExprCXX.h"
30#include "clang/AST/ExternalASTSource.h"
31#include "clang/AST/NestedNameSpecifier.h"
32#include "clang/AST/ODRHash.h"
33#include "clang/AST/RawCommentList.h"
34#include "clang/AST/TemplateBase.h"
35#include "clang/AST/TemplateName.h"
36#include "clang/AST/Type.h"
37#include "clang/AST/TypeLoc.h"
38#include "clang/AST/TypeLocVisitor.h"
39#include "clang/AST/UnresolvedSet.h"
40#include "clang/Basic/CommentOptions.h"
41#include "clang/Basic/Diagnostic.h"
42#include "clang/Basic/DiagnosticOptions.h"
43#include "clang/Basic/ExceptionSpecificationType.h"
44#include "clang/Basic/FileManager.h"
45#include "clang/Basic/FileSystemOptions.h"
46#include "clang/Basic/IdentifierTable.h"
47#include "clang/Basic/LLVM.h"
48#include "clang/Basic/LangOptions.h"
49#include "clang/Basic/Module.h"
50#include "clang/Basic/ObjCRuntime.h"
51#include "clang/Basic/OperatorKinds.h"
52#include "clang/Basic/PragmaKinds.h"
53#include "clang/Basic/Sanitizers.h"
54#include "clang/Basic/SourceLocation.h"
55#include "clang/Basic/SourceManager.h"
56#include "clang/Basic/SourceManagerInternals.h"
57#include "clang/Basic/Specifiers.h"
58#include "clang/Basic/TargetInfo.h"
59#include "clang/Basic/TargetOptions.h"
60#include "clang/Basic/TokenKinds.h"
61#include "clang/Basic/Version.h"
62#include "clang/Lex/HeaderSearch.h"
63#include "clang/Lex/HeaderSearchOptions.h"
64#include "clang/Lex/MacroInfo.h"
65#include "clang/Lex/ModuleMap.h"
66#include "clang/Lex/PreprocessingRecord.h"
67#include "clang/Lex/Preprocessor.h"
68#include "clang/Lex/PreprocessorOptions.h"
69#include "clang/Lex/Token.h"
70#include "clang/Sema/ObjCMethodList.h"
71#include "clang/Sema/Scope.h"
72#include "clang/Sema/Sema.h"
73#include "clang/Sema/Weak.h"
74#include "clang/Serialization/ASTBitCodes.h"
75#include "clang/Serialization/ASTDeserializationListener.h"
76#include "clang/Serialization/ContinuousRangeMap.h"
77#include "clang/Serialization/GlobalModuleIndex.h"
78#include "clang/Serialization/InMemoryModuleCache.h"
79#include "clang/Serialization/Module.h"
80#include "clang/Serialization/ModuleFileExtension.h"
81#include "clang/Serialization/ModuleManager.h"
82#include "clang/Serialization/PCHContainerOperations.h"
83#include "clang/Serialization/SerializationDiagnostic.h"
84#include "llvm/ADT/APFloat.h"
85#include "llvm/ADT/APInt.h"
86#include "llvm/ADT/APSInt.h"
87#include "llvm/ADT/ArrayRef.h"
88#include "llvm/ADT/DenseMap.h"
89#include "llvm/ADT/FoldingSet.h"
90#include "llvm/ADT/Hashing.h"
91#include "llvm/ADT/IntrusiveRefCntPtr.h"
92#include "llvm/ADT/None.h"
93#include "llvm/ADT/Optional.h"
94#include "llvm/ADT/STLExtras.h"
95#include "llvm/ADT/ScopeExit.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-9~svn360825/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-9~svn360825/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-9~svn360825/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-9~svn360825/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-9~svn360825/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-9~svn360825/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-9~svn360825/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-9~svn360825/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-9~svn360825/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-9~svn360825/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-9~svn360825/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-9~svn360825/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-9~svn360825/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-9~svn360825/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-9~svn360825/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-9~svn360825/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-9~svn360825/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-9~svn360825/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-9~svn360825/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-9~svn360825/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-9~svn360825/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-9~svn360825/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-9~svn360825/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-9~svn360825/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-9~svn360825/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-9~svn360825/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-9~svn360825/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-9~svn360825/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-9~svn360825/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-9~svn360825/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-9~svn360825/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-9~svn360825/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-9~svn360825/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 StringRef BaseDirectoryAsWritten;
2364 while (true) {
2365 llvm::BitstreamEntry Entry = Stream.advance();
2366
2367 switch (Entry.Kind) {
2368 case llvm::BitstreamEntry::Error:
2369 Error("malformed block record in AST file");
2370 return Failure;
2371 case llvm::BitstreamEntry::EndBlock: {
2372 // Validate the module before returning. This call catches an AST with
2373 // no module name and no imports.
2374 if (ASTReadResult Result = readUnhashedControlBlockOnce())
2375 return Result;
2376
2377 // Validate input files.
2378 const HeaderSearchOptions &HSOpts =
2379 PP.getHeaderSearchInfo().getHeaderSearchOpts();
2380
2381 // All user input files reside at the index range [0, NumUserInputs), and
2382 // system input files reside at [NumUserInputs, NumInputs). For explicitly
2383 // loaded module files, ignore missing inputs.
2384 if (!DisableValidation && F.Kind != MK_ExplicitModule &&
2385 F.Kind != MK_PrebuiltModule) {
2386 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
2387
2388 // If we are reading a module, we will create a verification timestamp,
2389 // so we verify all input files. Otherwise, verify only user input
2390 // files.
2391
2392 unsigned N = NumUserInputs;
2393 if (ValidateSystemInputs ||
2394 (HSOpts.ModulesValidateOncePerBuildSession &&
2395 F.InputFilesValidationTimestamp <= HSOpts.BuildSessionTimestamp &&
2396 F.Kind == MK_ImplicitModule))
2397 N = NumInputs;
2398
2399 for (unsigned I = 0; I < N; ++I) {
2400 InputFile IF = getInputFile(F, I+1, Complain);
2401 if (!IF.getFile() || IF.isOutOfDate())
2402 return OutOfDate;
2403 }
2404 }
2405
2406 if (Listener)
2407 Listener->visitModuleFile(F.FileName, F.Kind);
2408
2409 if (Listener && Listener->needsInputFileVisitation()) {
2410 unsigned N = Listener->needsSystemInputFileVisitation() ? NumInputs
2411 : NumUserInputs;
2412 for (unsigned I = 0; I < N; ++I) {
2413 bool IsSystem = I >= NumUserInputs;
2414 InputFileInfo FI = readInputFileInfo(F, I+1);
2415 Listener->visitInputFile(FI.Filename, IsSystem, FI.Overridden,
2416 F.Kind == MK_ExplicitModule ||
2417 F.Kind == MK_PrebuiltModule);
2418 }
2419 }
2420
2421 return Result;
2422 }
2423
2424 case llvm::BitstreamEntry::SubBlock:
2425 switch (Entry.ID) {
2426 case INPUT_FILES_BLOCK_ID:
2427 F.InputFilesCursor = Stream;
2428 if (Stream.SkipBlock() || // Skip with the main cursor
2429 // Read the abbreviations
2430 ReadBlockAbbrevs(F.InputFilesCursor, INPUT_FILES_BLOCK_ID)) {
2431 Error("malformed block record in AST file");
2432 return Failure;
2433 }
2434 continue;
2435
2436 case OPTIONS_BLOCK_ID:
2437 // If we're reading the first module for this group, check its options
2438 // are compatible with ours. For modules it imports, no further checking
2439 // is required, because we checked them when we built it.
2440 if (Listener && !ImportedBy) {
2441 // Should we allow the configuration of the module file to differ from
2442 // the configuration of the current translation unit in a compatible
2443 // way?
2444 //
2445 // FIXME: Allow this for files explicitly specified with -include-pch.
2446 bool AllowCompatibleConfigurationMismatch =
2447 F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule;
2448
2449 Result = ReadOptionsBlock(Stream, ClientLoadCapabilities,
2450 AllowCompatibleConfigurationMismatch,
2451 *Listener, SuggestedPredefines);
2452 if (Result == Failure) {
2453 Error("malformed block record in AST file");
2454 return Result;
2455 }
2456
2457 if (DisableValidation ||
2458 (AllowConfigurationMismatch && Result == ConfigurationMismatch))
2459 Result = Success;
2460
2461 // If we can't load the module, exit early since we likely
2462 // will rebuild the module anyway. The stream may be in the
2463 // middle of a block.
2464 if (Result != Success)
2465 return Result;
2466 } else if (Stream.SkipBlock()) {
2467 Error("malformed block record in AST file");
2468 return Failure;
2469 }
2470 continue;
2471
2472 default:
2473 if (Stream.SkipBlock()) {
2474 Error("malformed block record in AST file");
2475 return Failure;
2476 }
2477 continue;
2478 }
2479
2480 case llvm::BitstreamEntry::Record:
2481 // The interesting case.
2482 break;
2483 }
2484
2485 // Read and process a record.
2486 Record.clear();
2487 StringRef Blob;
2488 switch ((ControlRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob)) {
2489 case METADATA: {
2490 if (Record[0] != VERSION_MAJOR && !DisableValidation) {
2491 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
2492 Diag(Record[0] < VERSION_MAJOR? diag::err_pch_version_too_old
2493 : diag::err_pch_version_too_new);
2494 return VersionMismatch;
2495 }
2496
2497 bool hasErrors = Record[7];
2498 if (hasErrors && !DisableValidation && !AllowASTWithCompilerErrors) {
2499 Diag(diag::err_pch_with_compiler_errors);
2500 return HadErrors;
2501 }
2502 if (hasErrors) {
2503 Diags.ErrorOccurred = true;
2504 Diags.UncompilableErrorOccurred = true;
2505 Diags.UnrecoverableErrorOccurred = true;
2506 }
2507
2508 F.RelocatablePCH = Record[4];
2509 // Relative paths in a relocatable PCH are relative to our sysroot.
2510 if (F.RelocatablePCH)
2511 F.BaseDirectory = isysroot.empty() ? "/" : isysroot;
2512
2513 F.HasTimestamps = Record[5];
2514
2515 F.PCHHasObjectFile = Record[6];
2516
2517 const std::string &CurBranch = getClangFullRepositoryVersion();
2518 StringRef ASTBranch = Blob;
2519 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) {
2520 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
2521 Diag(diag::err_pch_different_branch) << ASTBranch << CurBranch;
2522 return VersionMismatch;
2523 }
2524 break;
2525 }
2526
2527 case IMPORTS: {
2528 // Validate the AST before processing any imports (otherwise, untangling
2529 // them can be error-prone and expensive). A module will have a name and
2530 // will already have been validated, but this catches the PCH case.
2531 if (ASTReadResult Result = readUnhashedControlBlockOnce())
2532 return Result;
2533
2534 // Load each of the imported PCH files.
2535 unsigned Idx = 0, N = Record.size();
2536 while (Idx < N) {
2537 // Read information about the AST file.
2538 ModuleKind ImportedKind = (ModuleKind)Record[Idx++];
2539 // The import location will be the local one for now; we will adjust
2540 // all import locations of module imports after the global source
2541 // location info are setup, in ReadAST.
2542 SourceLocation ImportLoc =
2543 ReadUntranslatedSourceLocation(Record[Idx++]);
2544 off_t StoredSize = (off_t)Record[Idx++];
2545 time_t StoredModTime = (time_t)Record[Idx++];
2546 ASTFileSignature StoredSignature = {
2547 {{(uint32_t)Record[Idx++], (uint32_t)Record[Idx++],
2548 (uint32_t)Record[Idx++], (uint32_t)Record[Idx++],
2549 (uint32_t)Record[Idx++]}}};
2550
2551 std::string ImportedName = ReadString(Record, Idx);
2552 std::string ImportedFile;
2553
2554 // For prebuilt and explicit modules first consult the file map for
2555 // an override. Note that here we don't search prebuilt module
2556 // directories, only the explicit name to file mappings. Also, we will
2557 // still verify the size/signature making sure it is essentially the
2558 // same file but perhaps in a different location.
2559 if (ImportedKind == MK_PrebuiltModule || ImportedKind == MK_ExplicitModule)
2560 ImportedFile = PP.getHeaderSearchInfo().getPrebuiltModuleFileName(
2561 ImportedName, /*FileMapOnly*/ true);
2562
2563 if (ImportedFile.empty())
2564 // Use BaseDirectoryAsWritten to ensure we use the same path in the
2565 // ModuleCache as when writing.
2566 ImportedFile = ReadPath(BaseDirectoryAsWritten, Record, Idx);
2567 else
2568 SkipPath(Record, Idx);
2569
2570 // If our client can't cope with us being out of date, we can't cope with
2571 // our dependency being missing.
2572 unsigned Capabilities = ClientLoadCapabilities;
2573 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
2574 Capabilities &= ~ARR_Missing;
2575
2576 // Load the AST file.
2577 auto Result = ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F,
2578 Loaded, StoredSize, StoredModTime,
2579 StoredSignature, Capabilities);
2580
2581 // If we diagnosed a problem, produce a backtrace.
2582 if (isDiagnosedResult(Result, Capabilities))
2583 Diag(diag::note_module_file_imported_by)
2584 << F.FileName << !F.ModuleName.empty() << F.ModuleName;
2585
2586 switch (Result) {
2587 case Failure: return Failure;
2588 // If we have to ignore the dependency, we'll have to ignore this too.
2589 case Missing:
2590 case OutOfDate: return OutOfDate;
2591 case VersionMismatch: return VersionMismatch;
2592 case ConfigurationMismatch: return ConfigurationMismatch;
2593 case HadErrors: return HadErrors;
2594 case Success: break;
2595 }
2596 }
2597 break;
2598 }
2599
2600 case ORIGINAL_FILE:
2601 F.OriginalSourceFileID = FileID::get(Record[0]);
2602 F.ActualOriginalSourceFileName = Blob;
2603 F.OriginalSourceFileName = F.ActualOriginalSourceFileName;
2604 ResolveImportedPath(F, F.OriginalSourceFileName);
2605 break;
2606
2607 case ORIGINAL_FILE_ID:
2608 F.OriginalSourceFileID = FileID::get(Record[0]);
2609 break;
2610
2611 case ORIGINAL_PCH_DIR:
2612 F.OriginalDir = Blob;
2613 break;
2614
2615 case MODULE_NAME:
2616 F.ModuleName = Blob;
2617 Diag(diag::remark_module_import)
2618 << F.ModuleName << F.FileName << (ImportedBy ? true : false)
2619 << (ImportedBy ? StringRef(ImportedBy->ModuleName) : StringRef());
2620 if (Listener)
2621 Listener->ReadModuleName(F.ModuleName);
2622
2623 // Validate the AST as soon as we have a name so we can exit early on
2624 // failure.
2625 if (ASTReadResult Result = readUnhashedControlBlockOnce())
2626 return Result;
2627
2628 break;
2629
2630 case MODULE_DIRECTORY: {
2631 // Save the BaseDirectory as written in the PCM for computing the module
2632 // filename for the ModuleCache.
2633 BaseDirectoryAsWritten = Blob;
2634 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 2635, __PRETTY_FUNCTION__))
2635 "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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 2635, __PRETTY_FUNCTION__))
;
2636 // If we've already loaded a module map file covering this module, we may
2637 // have a better path for it (relative to the current build).
2638 Module *M = PP.getHeaderSearchInfo().lookupModule(
2639 F.ModuleName, /*AllowSearch*/ true,
2640 /*AllowExtraModuleMapSearch*/ true);
2641 if (M && M->Directory) {
2642 // If we're implicitly loading a module, the base directory can't
2643 // change between the build and use.
2644 // Don't emit module relocation error if we have -fno-validate-pch
2645 if (!PP.getPreprocessorOpts().DisablePCHValidation &&
2646 F.Kind != MK_ExplicitModule && F.Kind != MK_PrebuiltModule) {
2647 const DirectoryEntry *BuildDir =
2648 PP.getFileManager().getDirectory(Blob);
2649 if (!BuildDir || BuildDir != M->Directory) {
2650 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
2651 Diag(diag::err_imported_module_relocated)
2652 << F.ModuleName << Blob << M->Directory->getName();
2653 return OutOfDate;
2654 }
2655 }
2656 F.BaseDirectory = M->Directory->getName();
2657 } else {
2658 F.BaseDirectory = Blob;
2659 }
2660 break;
2661 }
2662
2663 case MODULE_MAP_FILE:
2664 if (ASTReadResult Result =
2665 ReadModuleMapFileBlock(Record, F, ImportedBy, ClientLoadCapabilities))
2666 return Result;
2667 break;
2668
2669 case INPUT_FILE_OFFSETS:
2670 NumInputs = Record[0];
2671 NumUserInputs = Record[1];
2672 F.InputFileOffsets =
2673 (const llvm::support::unaligned_uint64_t *)Blob.data();
2674 F.InputFilesLoaded.resize(NumInputs);
2675 F.NumUserInputFiles = NumUserInputs;
2676 break;
2677 }
2678 }
2679}
2680
2681ASTReader::ASTReadResult
2682ASTReader::ReadASTBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
2683 BitstreamCursor &Stream = F.Stream;
2684
2685 if (Stream.EnterSubBlock(AST_BLOCK_ID)) {
2686 Error("malformed block record in AST file");
2687 return Failure;
2688 }
2689
2690 // Read all of the records and blocks for the AST file.
2691 RecordData Record;
2692 while (true) {
2693 llvm::BitstreamEntry Entry = Stream.advance();
2694
2695 switch (Entry.Kind) {
2696 case llvm::BitstreamEntry::Error:
2697 Error("error at end of module block in AST file");
2698 return Failure;
2699 case llvm::BitstreamEntry::EndBlock:
2700 // Outside of C++, we do not store a lookup map for the translation unit.
2701 // Instead, mark it as needing a lookup map to be built if this module
2702 // contains any declarations lexically within it (which it always does!).
2703 // This usually has no cost, since we very rarely need the lookup map for
2704 // the translation unit outside C++.
2705 if (ASTContext *Ctx = ContextObj) {
2706 DeclContext *DC = Ctx->getTranslationUnitDecl();
2707 if (DC->hasExternalLexicalStorage() && !Ctx->getLangOpts().CPlusPlus)
2708 DC->setMustBuildLookupTable();
2709 }
2710
2711 return Success;
2712 case llvm::BitstreamEntry::SubBlock:
2713 switch (Entry.ID) {
2714 case DECLTYPES_BLOCK_ID:
2715 // We lazily load the decls block, but we want to set up the
2716 // DeclsCursor cursor to point into it. Clone our current bitcode
2717 // cursor to it, enter the block and read the abbrevs in that block.
2718 // With the main cursor, we just skip over it.
2719 F.DeclsCursor = Stream;
2720 if (Stream.SkipBlock() || // Skip with the main cursor.
2721 // Read the abbrevs.
2722 ReadBlockAbbrevs(F.DeclsCursor, DECLTYPES_BLOCK_ID)) {
2723 Error("malformed block record in AST file");
2724 return Failure;
2725 }
2726 break;
2727
2728 case PREPROCESSOR_BLOCK_ID:
2729 F.MacroCursor = Stream;
2730 if (!PP.getExternalSource())
2731 PP.setExternalSource(this);
2732
2733 if (Stream.SkipBlock() ||
2734 ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID)) {
2735 Error("malformed block record in AST file");
2736 return Failure;
2737 }
2738 F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo();
2739 break;
2740
2741 case PREPROCESSOR_DETAIL_BLOCK_ID:
2742 F.PreprocessorDetailCursor = Stream;
2743 if (Stream.SkipBlock() ||
2744 ReadBlockAbbrevs(F.PreprocessorDetailCursor,
2745 PREPROCESSOR_DETAIL_BLOCK_ID)) {
2746 Error("malformed preprocessor detail record in AST file");
2747 return Failure;
2748 }
2749 F.PreprocessorDetailStartOffset
2750 = F.PreprocessorDetailCursor.GetCurrentBitNo();
2751
2752 if (!PP.getPreprocessingRecord())
2753 PP.createPreprocessingRecord();
2754 if (!PP.getPreprocessingRecord()->getExternalSource())
2755 PP.getPreprocessingRecord()->SetExternalSource(*this);
2756 break;
2757
2758 case SOURCE_MANAGER_BLOCK_ID:
2759 if (ReadSourceManagerBlock(F))
2760 return Failure;
2761 break;
2762
2763 case SUBMODULE_BLOCK_ID:
2764 if (ASTReadResult Result =
2765 ReadSubmoduleBlock(F, ClientLoadCapabilities))
2766 return Result;
2767 break;
2768
2769 case COMMENTS_BLOCK_ID: {
2770 BitstreamCursor C = Stream;
2771 if (Stream.SkipBlock() ||
2772 ReadBlockAbbrevs(C, COMMENTS_BLOCK_ID)) {
2773 Error("malformed comments block in AST file");
2774 return Failure;
2775 }
2776 CommentsCursors.push_back(std::make_pair(C, &F));
2777 break;
2778 }
2779
2780 default:
2781 if (Stream.SkipBlock()) {
2782 Error("malformed block record in AST file");
2783 return Failure;
2784 }
2785 break;
2786 }
2787 continue;
2788
2789 case llvm::BitstreamEntry::Record:
2790 // The interesting case.
2791 break;
2792 }
2793
2794 // Read and process a record.
2795 Record.clear();
2796 StringRef Blob;
2797 auto RecordType =
2798 (ASTRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob);
2799
2800 // If we're not loading an AST context, we don't care about most records.
2801 if (!ContextObj) {
2802 switch (RecordType) {
2803 case IDENTIFIER_TABLE:
2804 case IDENTIFIER_OFFSET:
2805 case INTERESTING_IDENTIFIERS:
2806 case STATISTICS:
2807 case PP_CONDITIONAL_STACK:
2808 case PP_COUNTER_VALUE:
2809 case SOURCE_LOCATION_OFFSETS:
2810 case MODULE_OFFSET_MAP:
2811 case SOURCE_MANAGER_LINE_TABLE:
2812 case SOURCE_LOCATION_PRELOADS:
2813 case PPD_ENTITIES_OFFSETS:
2814 case HEADER_SEARCH_TABLE:
2815 case IMPORTED_MODULES:
2816 case MACRO_OFFSET:
2817 break;
2818 default:
2819 continue;
2820 }
2821 }
2822
2823 switch (RecordType) {
2824 default: // Default behavior: ignore.
2825 break;
2826
2827 case TYPE_OFFSET: {
2828 if (F.LocalNumTypes != 0) {
2829 Error("duplicate TYPE_OFFSET record in AST file");
2830 return Failure;
2831 }
2832 F.TypeOffsets = (const uint32_t *)Blob.data();
2833 F.LocalNumTypes = Record[0];
2834 unsigned LocalBaseTypeIndex = Record[1];
2835 F.BaseTypeIndex = getTotalNumTypes();
2836
2837 if (F.LocalNumTypes > 0) {
2838 // Introduce the global -> local mapping for types within this module.
2839 GlobalTypeMap.insert(std::make_pair(getTotalNumTypes(), &F));
2840
2841 // Introduce the local -> global mapping for types within this module.
2842 F.TypeRemap.insertOrReplace(
2843 std::make_pair(LocalBaseTypeIndex,
2844 F.BaseTypeIndex - LocalBaseTypeIndex));
2845
2846 TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes);
2847 }
2848 break;
2849 }
2850
2851 case DECL_OFFSET: {
2852 if (F.LocalNumDecls != 0) {
2853 Error("duplicate DECL_OFFSET record in AST file");
2854 return Failure;
2855 }
2856 F.DeclOffsets = (const DeclOffset *)Blob.data();
2857 F.LocalNumDecls = Record[0];
2858 unsigned LocalBaseDeclID = Record[1];
2859 F.BaseDeclID = getTotalNumDecls();
2860
2861 if (F.LocalNumDecls > 0) {
2862 // Introduce the global -> local mapping for declarations within this
2863 // module.
2864 GlobalDeclMap.insert(
2865 std::make_pair(getTotalNumDecls() + NUM_PREDEF_DECL_IDS, &F));
2866
2867 // Introduce the local -> global mapping for declarations within this
2868 // module.
2869 F.DeclRemap.insertOrReplace(
2870 std::make_pair(LocalBaseDeclID, F.BaseDeclID - LocalBaseDeclID));
2871
2872 // Introduce the global -> local mapping for declarations within this
2873 // module.
2874 F.GlobalToLocalDeclIDs[&F] = LocalBaseDeclID;
2875
2876 DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls);
2877 }
2878 break;
2879 }
2880
2881 case TU_UPDATE_LEXICAL: {
2882 DeclContext *TU = ContextObj->getTranslationUnitDecl();
2883 LexicalContents Contents(
2884 reinterpret_cast<const llvm::support::unaligned_uint32_t *>(
2885 Blob.data()),
2886 static_cast<unsigned int>(Blob.size() / 4));
2887 TULexicalDecls.push_back(std::make_pair(&F, Contents));
2888 TU->setHasExternalLexicalStorage(true);
2889 break;
2890 }
2891
2892 case UPDATE_VISIBLE: {
2893 unsigned Idx = 0;
2894 serialization::DeclID ID = ReadDeclID(F, Record, Idx);
2895 auto *Data = (const unsigned char*)Blob.data();
2896 PendingVisibleUpdates[ID].push_back(PendingVisibleUpdate{&F, Data});
2897 // If we've already loaded the decl, perform the updates when we finish
2898 // loading this block.
2899 if (Decl *D = GetExistingDecl(ID))
2900 PendingUpdateRecords.push_back(
2901 PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
2902 break;
2903 }
2904
2905 case IDENTIFIER_TABLE:
2906 F.IdentifierTableData = Blob.data();
2907 if (Record[0]) {
2908 F.IdentifierLookupTable = ASTIdentifierLookupTable::Create(
2909 (const unsigned char *)F.IdentifierTableData + Record[0],
2910 (const unsigned char *)F.IdentifierTableData + sizeof(uint32_t),
2911 (const unsigned char *)F.IdentifierTableData,
2912 ASTIdentifierLookupTrait(*this, F));
2913
2914 PP.getIdentifierTable().setExternalIdentifierLookup(this);
2915 }
2916 break;
2917
2918 case IDENTIFIER_OFFSET: {
2919 if (F.LocalNumIdentifiers != 0) {
2920 Error("duplicate IDENTIFIER_OFFSET record in AST file");
2921 return Failure;
2922 }
2923 F.IdentifierOffsets = (const uint32_t *)Blob.data();
2924 F.LocalNumIdentifiers = Record[0];
2925 unsigned LocalBaseIdentifierID = Record[1];
2926 F.BaseIdentifierID = getTotalNumIdentifiers();
2927
2928 if (F.LocalNumIdentifiers > 0) {
2929 // Introduce the global -> local mapping for identifiers within this
2930 // module.
2931 GlobalIdentifierMap.insert(std::make_pair(getTotalNumIdentifiers() + 1,
2932 &F));
2933
2934 // Introduce the local -> global mapping for identifiers within this
2935 // module.
2936 F.IdentifierRemap.insertOrReplace(
2937 std::make_pair(LocalBaseIdentifierID,
2938 F.BaseIdentifierID - LocalBaseIdentifierID));
2939
2940 IdentifiersLoaded.resize(IdentifiersLoaded.size()
2941 + F.LocalNumIdentifiers);
2942 }
2943 break;
2944 }
2945
2946 case INTERESTING_IDENTIFIERS:
2947 F.PreloadIdentifierOffsets.assign(Record.begin(), Record.end());
2948 break;
2949
2950 case EAGERLY_DESERIALIZED_DECLS:
2951 // FIXME: Skip reading this record if our ASTConsumer doesn't care
2952 // about "interesting" decls (for instance, if we're building a module).
2953 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2954 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I]));
2955 break;
2956
2957 case MODULAR_CODEGEN_DECLS:
2958 // FIXME: Skip reading this record if our ASTConsumer doesn't care about
2959 // them (ie: if we're not codegenerating this module).
2960 if (F.Kind == MK_MainFile)
2961 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2962 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I]));
2963 break;
2964
2965 case SPECIAL_TYPES:
2966 if (SpecialTypes.empty()) {
2967 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2968 SpecialTypes.push_back(getGlobalTypeID(F, Record[I]));
2969 break;
2970 }
2971
2972 if (SpecialTypes.size() != Record.size()) {
2973 Error("invalid special-types record");
2974 return Failure;
2975 }
2976
2977 for (unsigned I = 0, N = Record.size(); I != N; ++I) {
2978 serialization::TypeID ID = getGlobalTypeID(F, Record[I]);
2979 if (!SpecialTypes[I])
2980 SpecialTypes[I] = ID;
2981 // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate
2982 // merge step?
2983 }
2984 break;
2985
2986 case STATISTICS:
2987 TotalNumStatements += Record[0];
2988 TotalNumMacros += Record[1];
2989 TotalLexicalDeclContexts += Record[2];
2990 TotalVisibleDeclContexts += Record[3];
2991 break;
2992
2993 case UNUSED_FILESCOPED_DECLS:
2994 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2995 UnusedFileScopedDecls.push_back(getGlobalDeclID(F, Record[I]));
2996 break;
2997
2998 case DELEGATING_CTORS:
2999 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3000 DelegatingCtorDecls.push_back(getGlobalDeclID(F, Record[I]));
3001 break;
3002
3003 case WEAK_UNDECLARED_IDENTIFIERS:
3004 if (Record.size() % 4 != 0) {
3005 Error("invalid weak identifiers record");
3006 return Failure;
3007 }
3008
3009 // FIXME: Ignore weak undeclared identifiers from non-original PCH
3010 // files. This isn't the way to do it :)
3011 WeakUndeclaredIdentifiers.clear();
3012
3013 // Translate the weak, undeclared identifiers into global IDs.
3014 for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) {
3015 WeakUndeclaredIdentifiers.push_back(
3016 getGlobalIdentifierID(F, Record[I++]));
3017 WeakUndeclaredIdentifiers.push_back(
3018 getGlobalIdentifierID(F, Record[I++]));
3019 WeakUndeclaredIdentifiers.push_back(
3020 ReadSourceLocation(F, Record, I).getRawEncoding());
3021 WeakUndeclaredIdentifiers.push_back(Record[I++]);
3022 }
3023 break;
3024
3025 case SELECTOR_OFFSETS: {
3026 F.SelectorOffsets = (const uint32_t *)Blob.data();
3027 F.LocalNumSelectors = Record[0];
3028 unsigned LocalBaseSelectorID = Record[1];
3029 F.BaseSelectorID = getTotalNumSelectors();
3030
3031 if (F.LocalNumSelectors > 0) {
3032 // Introduce the global -> local mapping for selectors within this
3033 // module.
3034 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F));
3035
3036 // Introduce the local -> global mapping for selectors within this
3037 // module.
3038 F.SelectorRemap.insertOrReplace(
3039 std::make_pair(LocalBaseSelectorID,
3040 F.BaseSelectorID - LocalBaseSelectorID));
3041
3042 SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors);
3043 }
3044 break;
3045 }
3046
3047 case METHOD_POOL:
3048 F.SelectorLookupTableData = (const unsigned char *)Blob.data();
3049 if (Record[0])
3050 F.SelectorLookupTable
3051 = ASTSelectorLookupTable::Create(
3052 F.SelectorLookupTableData + Record[0],
3053 F.SelectorLookupTableData,
3054 ASTSelectorLookupTrait(*this, F));
3055 TotalNumMethodPoolEntries += Record[1];
3056 break;
3057
3058 case REFERENCED_SELECTOR_POOL:
3059 if (!Record.empty()) {
3060 for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) {
3061 ReferencedSelectorsData.push_back(getGlobalSelectorID(F,
3062 Record[Idx++]));
3063 ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx).
3064 getRawEncoding());
3065 }
3066 }
3067 break;
3068
3069 case PP_CONDITIONAL_STACK:
3070 if (!Record.empty()) {
3071 unsigned Idx = 0, End = Record.size() - 1;
3072 bool ReachedEOFWhileSkipping = Record[Idx++];
3073 llvm::Optional<Preprocessor::PreambleSkipInfo> SkipInfo;
3074 if (ReachedEOFWhileSkipping) {
3075 SourceLocation HashToken = ReadSourceLocation(F, Record, Idx);
3076 SourceLocation IfTokenLoc = ReadSourceLocation(F, Record, Idx);
3077 bool FoundNonSkipPortion = Record[Idx++];
3078 bool FoundElse = Record[Idx++];
3079 SourceLocation ElseLoc = ReadSourceLocation(F, Record, Idx);
3080 SkipInfo.emplace(HashToken, IfTokenLoc, FoundNonSkipPortion,
3081 FoundElse, ElseLoc);
3082 }
3083 SmallVector<PPConditionalInfo, 4> ConditionalStack;
3084 while (Idx < End) {
3085 auto Loc = ReadSourceLocation(F, Record, Idx);
3086 bool WasSkipping = Record[Idx++];
3087 bool FoundNonSkip = Record[Idx++];
3088 bool FoundElse = Record[Idx++];
3089 ConditionalStack.push_back(
3090 {Loc, WasSkipping, FoundNonSkip, FoundElse});
3091 }
3092 PP.setReplayablePreambleConditionalStack(ConditionalStack, SkipInfo);
3093 }
3094 break;
3095
3096 case PP_COUNTER_VALUE:
3097 if (!Record.empty() && Listener)
3098 Listener->ReadCounter(F, Record[0]);
3099 break;
3100
3101 case FILE_SORTED_DECLS:
3102 F.FileSortedDecls = (const DeclID *)Blob.data();
3103 F.NumFileSortedDecls = Record[0];
3104 break;
3105
3106 case SOURCE_LOCATION_OFFSETS: {
3107 F.SLocEntryOffsets = (const uint32_t *)Blob.data();
3108 F.LocalNumSLocEntries = Record[0];
3109 unsigned SLocSpaceSize = Record[1];
3110 std::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) =
3111 SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries,
3112 SLocSpaceSize);
3113 if (!F.SLocEntryBaseID) {
3114 Error("ran out of source locations");
3115 break;
3116 }
3117 // Make our entry in the range map. BaseID is negative and growing, so
3118 // we invert it. Because we invert it, though, we need the other end of
3119 // the range.
3120 unsigned RangeStart =
3121 unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1;
3122 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F));
3123 F.FirstLoc = SourceLocation::getFromRawEncoding(F.SLocEntryBaseOffset);
3124
3125 // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing.
3126 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 3126, __PRETTY_FUNCTION__))
;
3127 GlobalSLocOffsetMap.insert(
3128 std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset
3129 - SLocSpaceSize,&F));
3130
3131 // Initialize the remapping table.
3132 // Invalid stays invalid.
3133 F.SLocRemap.insertOrReplace(std::make_pair(0U, 0));
3134 // This module. Base was 2 when being compiled.
3135 F.SLocRemap.insertOrReplace(std::make_pair(2U,
3136 static_cast<int>(F.SLocEntryBaseOffset - 2)));
3137
3138 TotalNumSLocEntries += F.LocalNumSLocEntries;
3139 break;
3140 }
3141
3142 case MODULE_OFFSET_MAP:
3143 F.ModuleOffsetMap = Blob;
3144 break;
3145
3146 case SOURCE_MANAGER_LINE_TABLE:
3147 if (ParseLineTable(F, Record))
3148 return Failure;
3149 break;
3150
3151 case SOURCE_LOCATION_PRELOADS: {
3152 // Need to transform from the local view (1-based IDs) to the global view,
3153 // which is based off F.SLocEntryBaseID.
3154 if (!F.PreloadSLocEntries.empty()) {
3155 Error("Multiple SOURCE_LOCATION_PRELOADS records in AST file");
3156 return Failure;
3157 }
3158
3159 F.PreloadSLocEntries.swap(Record);
3160 break;
3161 }
3162
3163 case EXT_VECTOR_DECLS:
3164 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3165 ExtVectorDecls.push_back(getGlobalDeclID(F, Record[I]));
3166 break;
3167
3168 case VTABLE_USES:
3169 if (Record.size() % 3 != 0) {
3170 Error("Invalid VTABLE_USES record");
3171 return Failure;
3172 }
3173
3174 // Later tables overwrite earlier ones.
3175 // FIXME: Modules will have some trouble with this. This is clearly not
3176 // the right way to do this.
3177 VTableUses.clear();
3178
3179 for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) {
3180 VTableUses.push_back(getGlobalDeclID(F, Record[Idx++]));
3181 VTableUses.push_back(
3182 ReadSourceLocation(F, Record, Idx).getRawEncoding());
3183 VTableUses.push_back(Record[Idx++]);
3184 }
3185 break;
3186
3187 case PENDING_IMPLICIT_INSTANTIATIONS:
3188 if (PendingInstantiations.size() % 2 != 0) {
3189 Error("Invalid existing PendingInstantiations");
3190 return Failure;
3191 }
3192
3193 if (Record.size() % 2 != 0) {
3194 Error("Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
3195 return Failure;
3196 }
3197
3198 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
3199 PendingInstantiations.push_back(getGlobalDeclID(F, Record[I++]));
3200 PendingInstantiations.push_back(
3201 ReadSourceLocation(F, Record, I).getRawEncoding());
3202 }
3203 break;
3204
3205 case SEMA_DECL_REFS:
3206 if (Record.size() != 3) {
3207 Error("Invalid SEMA_DECL_REFS block");
3208 return Failure;
3209 }
3210 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3211 SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
3212 break;
3213
3214 case PPD_ENTITIES_OFFSETS: {
3215 F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data();
3216 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 3216, __PRETTY_FUNCTION__))
;
3217 F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset);
3218
3219 unsigned LocalBasePreprocessedEntityID = Record[0];
3220
3221 unsigned StartingID;
3222 if (!PP.getPreprocessingRecord())
3223 PP.createPreprocessingRecord();
3224 if (!PP.getPreprocessingRecord()->getExternalSource())
3225 PP.getPreprocessingRecord()->SetExternalSource(*this);
3226 StartingID
3227 = PP.getPreprocessingRecord()
3228 ->allocateLoadedEntities(F.NumPreprocessedEntities);
3229 F.BasePreprocessedEntityID = StartingID;
3230
3231 if (F.NumPreprocessedEntities > 0) {
3232 // Introduce the global -> local mapping for preprocessed entities in
3233 // this module.
3234 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
3235
3236 // Introduce the local -> global mapping for preprocessed entities in
3237 // this module.
3238 F.PreprocessedEntityRemap.insertOrReplace(
3239 std::make_pair(LocalBasePreprocessedEntityID,
3240 F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID));
3241 }
3242
3243 break;
3244 }
3245
3246 case PPD_SKIPPED_RANGES: {
3247 F.PreprocessedSkippedRangeOffsets = (const PPSkippedRange*)Blob.data();
3248 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 3248, __PRETTY_FUNCTION__))
;
3249 F.NumPreprocessedSkippedRanges = Blob.size() / sizeof(PPSkippedRange);
3250
3251 if (!PP.getPreprocessingRecord())
3252 PP.createPreprocessingRecord();
3253 if (!PP.getPreprocessingRecord()->getExternalSource())
3254 PP.getPreprocessingRecord()->SetExternalSource(*this);
3255 F.BasePreprocessedSkippedRangeID = PP.getPreprocessingRecord()
3256 ->allocateSkippedRanges(F.NumPreprocessedSkippedRanges);
3257
3258 if (F.NumPreprocessedSkippedRanges > 0)
3259 GlobalSkippedRangeMap.insert(
3260 std::make_pair(F.BasePreprocessedSkippedRangeID, &F));
3261 break;
3262 }
3263
3264 case DECL_UPDATE_OFFSETS:
3265 if (Record.size() % 2 != 0) {
3266 Error("invalid DECL_UPDATE_OFFSETS block in AST file");
3267 return Failure;
3268 }
3269 for (unsigned I = 0, N = Record.size(); I != N; I += 2) {
3270 GlobalDeclID ID = getGlobalDeclID(F, Record[I]);
3271 DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I + 1]));
3272
3273 // If we've already loaded the decl, perform the updates when we finish
3274 // loading this block.
3275 if (Decl *D = GetExistingDecl(ID))
3276 PendingUpdateRecords.push_back(
3277 PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
3278 }
3279 break;
3280
3281 case OBJC_CATEGORIES_MAP:
3282 if (F.LocalNumObjCCategoriesInMap != 0) {
3283 Error("duplicate OBJC_CATEGORIES_MAP record in AST file");
3284 return Failure;
3285 }
3286
3287 F.LocalNumObjCCategoriesInMap = Record[0];
3288 F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data();
3289 break;
3290
3291 case OBJC_CATEGORIES:
3292 F.ObjCCategories.swap(Record);
3293 break;
3294
3295 case CUDA_SPECIAL_DECL_REFS:
3296 // Later tables overwrite earlier ones.
3297 // FIXME: Modules will have trouble with this.
3298 CUDASpecialDeclRefs.clear();
3299 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3300 CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
3301 break;
3302
3303 case HEADER_SEARCH_TABLE:
3304 F.HeaderFileInfoTableData = Blob.data();
3305 F.LocalNumHeaderFileInfos = Record[1];
3306 if (Record[0]) {
3307 F.HeaderFileInfoTable
3308 = HeaderFileInfoLookupTable::Create(
3309 (const unsigned char *)F.HeaderFileInfoTableData + Record[0],
3310 (const unsigned char *)F.HeaderFileInfoTableData,
3311 HeaderFileInfoTrait(*this, F,
3312 &PP.getHeaderSearchInfo(),
3313 Blob.data() + Record[2]));
3314
3315 PP.getHeaderSearchInfo().SetExternalSource(this);
3316 if (!PP.getHeaderSearchInfo().getExternalLookup())
3317 PP.getHeaderSearchInfo().SetExternalLookup(this);
3318 }
3319 break;
3320
3321 case FP_PRAGMA_OPTIONS:
3322 // Later tables overwrite earlier ones.
3323 FPPragmaOptions.swap(Record);
3324 break;
3325
3326 case OPENCL_EXTENSIONS:
3327 for (unsigned I = 0, E = Record.size(); I != E; ) {
3328 auto Name = ReadString(Record, I);
3329 auto &Opt = OpenCLExtensions.OptMap[Name];
3330 Opt.Supported = Record[I++] != 0;
3331 Opt.Enabled = Record[I++] != 0;
3332 Opt.Avail = Record[I++];
3333 Opt.Core = Record[I++];
3334 }
3335 break;
3336
3337 case OPENCL_EXTENSION_TYPES:
3338 for (unsigned I = 0, E = Record.size(); I != E;) {
3339 auto TypeID = static_cast<::TypeID>(Record[I++]);
3340 auto *Type = GetType(TypeID).getTypePtr();
3341 auto NumExt = static_cast<unsigned>(Record[I++]);
3342 for (unsigned II = 0; II != NumExt; ++II) {
3343 auto Ext = ReadString(Record, I);
3344 OpenCLTypeExtMap[Type].insert(Ext);
3345 }
3346 }
3347 break;
3348
3349 case OPENCL_EXTENSION_DECLS:
3350 for (unsigned I = 0, E = Record.size(); I != E;) {
3351 auto DeclID = static_cast<::DeclID>(Record[I++]);
3352 auto *Decl = GetDecl(DeclID);
3353 auto NumExt = static_cast<unsigned>(Record[I++]);
3354 for (unsigned II = 0; II != NumExt; ++II) {
3355 auto Ext = ReadString(Record, I);
3356 OpenCLDeclExtMap[Decl].insert(Ext);
3357 }
3358 }
3359 break;
3360
3361 case TENTATIVE_DEFINITIONS:
3362 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3363 TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I]));
3364 break;
3365
3366 case KNOWN_NAMESPACES:
3367 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3368 KnownNamespaces.push_back(getGlobalDeclID(F, Record[I]));
3369 break;
3370
3371 case UNDEFINED_BUT_USED:
3372 if (UndefinedButUsed.size() % 2 != 0) {
3373 Error("Invalid existing UndefinedButUsed");
3374 return Failure;
3375 }
3376
3377 if (Record.size() % 2 != 0) {
3378 Error("invalid undefined-but-used record");
3379 return Failure;
3380 }
3381 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
3382 UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++]));
3383 UndefinedButUsed.push_back(
3384 ReadSourceLocation(F, Record, I).getRawEncoding());
3385 }
3386 break;
3387
3388 case DELETE_EXPRS_TO_ANALYZE:
3389 for (unsigned I = 0, N = Record.size(); I != N;) {
3390 DelayedDeleteExprs.push_back(getGlobalDeclID(F, Record[I++]));
3391 const uint64_t Count = Record[I++];
3392 DelayedDeleteExprs.push_back(Count);
3393 for (uint64_t C = 0; C < Count; ++C) {
3394 DelayedDeleteExprs.push_back(ReadSourceLocation(F, Record, I).getRawEncoding());
3395 bool IsArrayForm = Record[I++] == 1;
3396 DelayedDeleteExprs.push_back(IsArrayForm);
3397 }
3398 }
3399 break;
3400
3401 case IMPORTED_MODULES:
3402 if (!F.isModule()) {
3403 // If we aren't loading a module (which has its own exports), make
3404 // all of the imported modules visible.
3405 // FIXME: Deal with macros-only imports.
3406 for (unsigned I = 0, N = Record.size(); I != N; /**/) {
3407 unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]);
3408 SourceLocation Loc = ReadSourceLocation(F, Record, I);
3409 if (GlobalID) {
3410 ImportedModules.push_back(ImportedSubmodule(GlobalID, Loc));
3411 if (DeserializationListener)
3412 DeserializationListener->ModuleImportRead(GlobalID, Loc);
3413 }
3414 }
3415 }
3416 break;
3417
3418 case MACRO_OFFSET: {
3419 if (F.LocalNumMacros != 0) {
3420 Error("duplicate MACRO_OFFSET record in AST file");
3421 return Failure;
3422 }
3423 F.MacroOffsets = (const uint32_t *)Blob.data();
3424 F.LocalNumMacros = Record[0];
3425 unsigned LocalBaseMacroID = Record[1];
3426 F.BaseMacroID = getTotalNumMacros();
3427
3428 if (F.LocalNumMacros > 0) {
3429 // Introduce the global -> local mapping for macros within this module.
3430 GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F));
3431
3432 // Introduce the local -> global mapping for macros within this module.
3433 F.MacroRemap.insertOrReplace(
3434 std::make_pair(LocalBaseMacroID,
3435 F.BaseMacroID - LocalBaseMacroID));
3436
3437 MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros);
3438 }
3439 break;
3440 }
3441
3442 case LATE_PARSED_TEMPLATE:
3443 LateParsedTemplates.append(Record.begin(), Record.end());
3444 break;
3445
3446 case OPTIMIZE_PRAGMA_OPTIONS:
3447 if (Record.size() != 1) {
3448 Error("invalid pragma optimize record");
3449 return Failure;
3450 }
3451 OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]);
3452 break;
3453
3454 case MSSTRUCT_PRAGMA_OPTIONS:
3455 if (Record.size() != 1) {
3456 Error("invalid pragma ms_struct record");
3457 return Failure;
3458 }
3459 PragmaMSStructState = Record[0];
3460 break;
3461
3462 case POINTERS_TO_MEMBERS_PRAGMA_OPTIONS:
3463 if (Record.size() != 2) {
3464 Error("invalid pragma ms_struct record");
3465 return Failure;
3466 }
3467 PragmaMSPointersToMembersState = Record[0];
3468 PointersToMembersPragmaLocation = ReadSourceLocation(F, Record[1]);
3469 break;
3470
3471 case UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES:
3472 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3473 UnusedLocalTypedefNameCandidates.push_back(
3474 getGlobalDeclID(F, Record[I]));
3475 break;
3476
3477 case CUDA_PRAGMA_FORCE_HOST_DEVICE_DEPTH:
3478 if (Record.size() != 1) {
3479 Error("invalid cuda pragma options record");
3480 return Failure;
3481 }
3482 ForceCUDAHostDeviceDepth = Record[0];
3483 break;
3484
3485 case PACK_PRAGMA_OPTIONS: {
3486 if (Record.size() < 3) {
3487 Error("invalid pragma pack record");
3488 return Failure;
3489 }
3490 PragmaPackCurrentValue = Record[0];
3491 PragmaPackCurrentLocation = ReadSourceLocation(F, Record[1]);
3492 unsigned NumStackEntries = Record[2];
3493 unsigned Idx = 3;
3494 // Reset the stack when importing a new module.
3495 PragmaPackStack.clear();
3496 for (unsigned I = 0; I < NumStackEntries; ++I) {
3497 PragmaPackStackEntry Entry;
3498 Entry.Value = Record[Idx++];
3499 Entry.Location = ReadSourceLocation(F, Record[Idx++]);
3500 Entry.PushLocation = ReadSourceLocation(F, Record[Idx++]);
3501 PragmaPackStrings.push_back(ReadString(Record, Idx));
3502 Entry.SlotLabel = PragmaPackStrings.back();
3503 PragmaPackStack.push_back(Entry);
3504 }
3505 break;
3506 }
3507 }
3508 }
3509}
3510
3511void ASTReader::ReadModuleOffsetMap(ModuleFile &F) const {
3512 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 3512, __PRETTY_FUNCTION__))
;
3513
3514 // Additional remapping information.
3515 const unsigned char *Data = (const unsigned char*)F.ModuleOffsetMap.data();
3516 const unsigned char *DataEnd = Data + F.ModuleOffsetMap.size();
3517 F.ModuleOffsetMap = StringRef();
3518
3519 // If we see this entry before SOURCE_LOCATION_OFFSETS, add placeholders.
3520 if (F.SLocRemap.find(0) == F.SLocRemap.end()) {
3521 F.SLocRemap.insert(std::make_pair(0U, 0));
3522 F.SLocRemap.insert(std::make_pair(2U, 1));
3523 }
3524
3525 // Continuous range maps we may be updating in our module.
3526 using RemapBuilder = ContinuousRangeMap<uint32_t, int, 2>::Builder;
3527 RemapBuilder SLocRemap(F.SLocRemap);
3528 RemapBuilder IdentifierRemap(F.IdentifierRemap);
3529 RemapBuilder MacroRemap(F.MacroRemap);
3530 RemapBuilder PreprocessedEntityRemap(F.PreprocessedEntityRemap);
3531 RemapBuilder SubmoduleRemap(F.SubmoduleRemap);
3532 RemapBuilder SelectorRemap(F.SelectorRemap);
3533 RemapBuilder DeclRemap(F.DeclRemap);
3534 RemapBuilder TypeRemap(F.TypeRemap);
3535
3536 while (Data < DataEnd) {
3537 // FIXME: Looking up dependency modules by filename is horrible. Let's
3538 // start fixing this with prebuilt and explicit modules and see how it
3539 // goes...
3540 using namespace llvm::support;
3541 ModuleKind Kind = static_cast<ModuleKind>(
3542 endian::readNext<uint8_t, little, unaligned>(Data));
3543 uint16_t Len = endian::readNext<uint16_t, little, unaligned>(Data);
3544 StringRef Name = StringRef((const char*)Data, Len);
3545 Data += Len;
3546 ModuleFile *OM = (Kind == MK_PrebuiltModule || Kind == MK_ExplicitModule
3547 ? ModuleMgr.lookupByModuleName(Name)
3548 : ModuleMgr.lookupByFileName(Name));
3549 if (!OM) {
3550 std::string Msg =
3551 "SourceLocation remap refers to unknown module, cannot find ";
3552 Msg.append(Name);
3553 Error(Msg);
3554 return;
3555 }
3556
3557 uint32_t SLocOffset =
3558 endian::readNext<uint32_t, little, unaligned>(Data);
3559 uint32_t IdentifierIDOffset =
3560 endian::readNext<uint32_t, little, unaligned>(Data);
3561 uint32_t MacroIDOffset =
3562 endian::readNext<uint32_t, little, unaligned>(Data);
3563 uint32_t PreprocessedEntityIDOffset =
3564 endian::readNext<uint32_t, little, unaligned>(Data);
3565 uint32_t SubmoduleIDOffset =
3566 endian::readNext<uint32_t, little, unaligned>(Data);
3567 uint32_t SelectorIDOffset =
3568 endian::readNext<uint32_t, little, unaligned>(Data);
3569 uint32_t DeclIDOffset =
3570 endian::readNext<uint32_t, little, unaligned>(Data);
3571 uint32_t TypeIndexOffset =
3572 endian::readNext<uint32_t, little, unaligned>(Data);
3573
3574 uint32_t None = std::numeric_limits<uint32_t>::max();
3575
3576 auto mapOffset = [&](uint32_t Offset, uint32_t BaseOffset,
3577 RemapBuilder &Remap) {
3578 if (Offset != None)
3579 Remap.insert(std::make_pair(Offset,
3580 static_cast<int>(BaseOffset - Offset)));
3581 };
3582 mapOffset(SLocOffset, OM->SLocEntryBaseOffset, SLocRemap);
3583 mapOffset(IdentifierIDOffset, OM->BaseIdentifierID, IdentifierRemap);
3584 mapOffset(MacroIDOffset, OM->BaseMacroID, MacroRemap);
3585 mapOffset(PreprocessedEntityIDOffset, OM->BasePreprocessedEntityID,
3586 PreprocessedEntityRemap);
3587 mapOffset(SubmoduleIDOffset, OM->BaseSubmoduleID, SubmoduleRemap);
3588 mapOffset(SelectorIDOffset, OM->BaseSelectorID, SelectorRemap);
3589 mapOffset(DeclIDOffset, OM->BaseDeclID, DeclRemap);
3590 mapOffset(TypeIndexOffset, OM->BaseTypeIndex, TypeRemap);
3591
3592 // Global -> local mappings.
3593 F.GlobalToLocalDeclIDs[OM] = DeclIDOffset;
3594 }
3595}
3596
3597ASTReader::ASTReadResult
3598ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F,
3599 const ModuleFile *ImportedBy,
3600 unsigned ClientLoadCapabilities) {
3601 unsigned Idx = 0;
3602 F.ModuleMapPath = ReadPath(F, Record, Idx);
3603
3604 // Try to resolve ModuleName in the current header search context and
3605 // verify that it is found in the same module map file as we saved. If the
3606 // top-level AST file is a main file, skip this check because there is no
3607 // usable header search context.
3608 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 3609, __PRETTY_FUNCTION__))
3609 "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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 3609, __PRETTY_FUNCTION__))
;
3610 if (F.Kind == MK_ImplicitModule && ModuleMgr.begin()->Kind != MK_MainFile) {
3611 // An implicitly-loaded module file should have its module listed in some
3612 // module map file that we've already loaded.
3613 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName);
3614 auto &Map = PP.getHeaderSearchInfo().getModuleMap();
3615 const FileEntry *ModMap = M ? Map.getModuleMapFileForUniquing(M) : nullptr;
3616 // Don't emit module relocation error if we have -fno-validate-pch
3617 if (!PP.getPreprocessorOpts().DisablePCHValidation && !ModMap) {
3618 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 3618, __PRETTY_FUNCTION__))
;
3619 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) {
3620 if (auto *ASTFE = M ? M->getASTFile() : nullptr) {
3621 // This module was defined by an imported (explicit) module.
3622 Diag(diag::err_module_file_conflict) << F.ModuleName << F.FileName
3623 << ASTFE->getName();
3624 } else {
3625 // This module was built with a different module map.
3626 Diag(diag::err_imported_module_not_found)
3627 << F.ModuleName << F.FileName << ImportedBy->FileName
3628 << F.ModuleMapPath;
3629 // In case it was imported by a PCH, there's a chance the user is
3630 // just missing to include the search path to the directory containing
3631 // the modulemap.
3632 if (ImportedBy->Kind == MK_PCH)
3633 Diag(diag::note_imported_by_pch_module_not_found)
3634 << llvm::sys::path::parent_path(F.ModuleMapPath);
3635 }
3636 }
3637 return OutOfDate;
3638 }
3639
3640 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 3640, __PRETTY_FUNCTION__))
;
3641
3642 // Check the primary module map file.
3643 const FileEntry *StoredModMap = FileMgr.getFile(F.ModuleMapPath);
3644 if (StoredModMap == nullptr || StoredModMap != ModMap) {
3645 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 3645, __PRETTY_FUNCTION__))
;
3646 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 3646, __PRETTY_FUNCTION__))
;
3647 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3648 Diag(diag::err_imported_module_modmap_changed)
3649 << F.ModuleName << ImportedBy->FileName
3650 << ModMap->getName() << F.ModuleMapPath;
3651 return OutOfDate;
3652 }
3653
3654 llvm::SmallPtrSet<const FileEntry *, 1> AdditionalStoredMaps;
3655 for (unsigned I = 0, N = Record[Idx++]; I < N; ++I) {
3656 // FIXME: we should use input files rather than storing names.
3657 std::string Filename = ReadPath(F, Record, Idx);
3658 const FileEntry *F =
3659 FileMgr.getFile(Filename, false, false);
3660 if (F == nullptr) {
3661 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3662 Error("could not find file '" + Filename +"' referenced by AST file");
3663 return OutOfDate;
3664 }
3665 AdditionalStoredMaps.insert(F);
3666 }
3667
3668 // Check any additional module map files (e.g. module.private.modulemap)
3669 // that are not in the pcm.
3670 if (auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) {
3671 for (const FileEntry *ModMap : *AdditionalModuleMaps) {
3672 // Remove files that match
3673 // Note: SmallPtrSet::erase is really remove
3674 if (!AdditionalStoredMaps.erase(ModMap)) {
3675 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3676 Diag(diag::err_module_different_modmap)
3677 << F.ModuleName << /*new*/0 << ModMap->getName();
3678 return OutOfDate;
3679 }
3680 }
3681 }
3682
3683 // Check any additional module map files that are in the pcm, but not
3684 // found in header search. Cases that match are already removed.
3685 for (const FileEntry *ModMap : AdditionalStoredMaps) {
3686 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3687 Diag(diag::err_module_different_modmap)
3688 << F.ModuleName << /*not new*/1 << ModMap->getName();
3689 return OutOfDate;
3690 }
3691 }
3692
3693 if (Listener)
3694 Listener->ReadModuleMapFile(F.ModuleMapPath);
3695 return Success;
3696}
3697
3698/// Move the given method to the back of the global list of methods.
3699static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) {
3700 // Find the entry for this selector in the method pool.
3701 Sema::GlobalMethodPool::iterator Known
3702 = S.MethodPool.find(Method->getSelector());
3703 if (Known == S.MethodPool.end())
3704 return;
3705
3706 // Retrieve the appropriate method list.
3707 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
3708 : Known->second.second;
3709 bool Found = false;
3710 for (ObjCMethodList *List = &Start; List; List = List->getNext()) {
3711 if (!Found) {
3712 if (List->getMethod() == Method) {
3713 Found = true;
3714 } else {
3715 // Keep searching.
3716 continue;
3717 }
3718 }
3719
3720 if (List->getNext())
3721 List->setMethod(List->getNext()->getMethod());
3722 else
3723 List->setMethod(Method);
3724 }
3725}
3726
3727void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner) {
3728 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 3728, __PRETTY_FUNCTION__))
;
3729 for (Decl *D : Names) {
3730 bool wasHidden = D->isHidden();
3731 D->setVisibleDespiteOwningModule();
3732
3733 if (wasHidden && SemaObj) {
3734 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) {
3735 moveMethodToBackOfGlobalList(*SemaObj, Method);
3736 }
3737 }
3738 }
3739}
3740
3741void ASTReader::makeModuleVisible(Module *Mod,
3742 Module::NameVisibilityKind NameVisibility,
3743 SourceLocation ImportLoc) {
3744 llvm::SmallPtrSet<Module *, 4> Visited;
3745 SmallVector<Module *, 4> Stack;
3746 Stack.push_back(Mod);
3747 while (!Stack.empty()) {
3748 Mod = Stack.pop_back_val();
3749
3750 if (NameVisibility <= Mod->NameVisibility) {
3751 // This module already has this level of visibility (or greater), so
3752 // there is nothing more to do.
3753 continue;
3754 }
3755
3756 if (!Mod->isAvailable()) {
3757 // Modules that aren't available cannot be made visible.
3758 continue;
3759 }
3760
3761 // Update the module's name visibility.
3762 Mod->NameVisibility = NameVisibility;
3763
3764 // If we've already deserialized any names from this module,
3765 // mark them as visible.
3766 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
3767 if (Hidden != HiddenNamesMap.end()) {
3768 auto HiddenNames = std::move(*Hidden);
3769 HiddenNamesMap.erase(Hidden);
3770 makeNamesVisible(HiddenNames.second, HiddenNames.first);
3771 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 3772, __PRETTY_FUNCTION__))
3772 "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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 3772, __PRETTY_FUNCTION__))
;
3773 }
3774
3775 // Push any exported modules onto the stack to be marked as visible.
3776 SmallVector<Module *, 16> Exports;
3777 Mod->getExportedModules(Exports);
3778 for (SmallVectorImpl<Module *>::iterator
3779 I = Exports.begin(), E = Exports.end(); I != E; ++I) {
3780 Module *Exported = *I;
3781 if (Visited.insert(Exported).second)
3782 Stack.push_back(Exported);
3783 }
3784 }
3785}
3786
3787/// We've merged the definition \p MergedDef into the existing definition
3788/// \p Def. Ensure that \p Def is made visible whenever \p MergedDef is made
3789/// visible.
3790void ASTReader::mergeDefinitionVisibility(NamedDecl *Def,
3791 NamedDecl *MergedDef) {
3792 if (Def->isHidden()) {
3793 // If MergedDef is visible or becomes visible, make the definition visible.
3794 if (!MergedDef->isHidden())
3795 Def->setVisibleDespiteOwningModule();
3796 else {
3797 getContext().mergeDefinitionIntoModule(
3798 Def, MergedDef->getImportedOwningModule(),
3799 /*NotifyListeners*/ false);
3800 PendingMergedDefinitionsToDeduplicate.insert(Def);
3801 }
3802 }
3803}
3804
3805bool ASTReader::loadGlobalIndex() {
3806 if (GlobalIndex)
3807 return false;
3808
3809 if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
3810 !PP.getLangOpts().Modules)
3811 return true;
3812
3813 // Try to load the global index.
3814 TriedLoadingGlobalIndex = true;
3815 StringRef ModuleCachePath
3816 = getPreprocessor().getHeaderSearchInfo().getModuleCachePath();
3817 std::pair<GlobalModuleIndex *, GlobalModuleIndex::ErrorCode> Result
3818 = GlobalModuleIndex::readIndex(ModuleCachePath);
3819 if (!Result.first)
3820 return true;
3821
3822 GlobalIndex.reset(Result.first);
3823 ModuleMgr.setGlobalIndex(GlobalIndex.get());
3824 return false;
3825}
3826
3827bool ASTReader::isGlobalIndexUnavailable() const {
3828 return PP.getLangOpts().Modules && UseGlobalIndex &&
3829 !hasGlobalIndex() && TriedLoadingGlobalIndex;
3830}
3831
3832static void updateModuleTimestamp(ModuleFile &MF) {
3833 // Overwrite the timestamp file contents so that file's mtime changes.
3834 std::string TimestampFilename = MF.getTimestampFilename();
3835 std::error_code EC;
3836 llvm::raw_fd_ostream OS(TimestampFilename, EC, llvm::sys::fs::F_Text);
3837 if (EC)
3838 return;
3839 OS << "Timestamp file\n";
3840 OS.close();
3841 OS.clear_error(); // Avoid triggering a fatal error.
3842}
3843
3844/// Given a cursor at the start of an AST file, scan ahead and drop the
3845/// cursor into the start of the given block ID, returning false on success and
3846/// true on failure.
3847static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) {
3848 while (true) {
3849 llvm::BitstreamEntry Entry = Cursor.advance();
3850 switch (Entry.Kind) {
3851 case llvm::BitstreamEntry::Error:
3852 case llvm::BitstreamEntry::EndBlock:
3853 return true;
3854
3855 case llvm::BitstreamEntry::Record:
3856 // Ignore top-level records.
3857 Cursor.skipRecord(Entry.ID);
3858 break;
3859
3860 case llvm::BitstreamEntry::SubBlock:
3861 if (Entry.ID == BlockID) {
3862 if (Cursor.EnterSubBlock(BlockID))
3863 return true;
3864 // Found it!
3865 return false;
3866 }
3867
3868 if (Cursor.SkipBlock())
3869 return true;
3870 }
3871 }
3872}
3873
3874ASTReader::ASTReadResult ASTReader::ReadAST(StringRef FileName,
3875 ModuleKind Type,
3876 SourceLocation ImportLoc,
3877 unsigned ClientLoadCapabilities,
3878 SmallVectorImpl<ImportedSubmodule> *Imported) {
3879 llvm::SaveAndRestore<SourceLocation>
3880 SetCurImportLocRAII(CurrentImportLoc, ImportLoc);
3881
3882 // Defer any pending actions until we get to the end of reading the AST file.
3883 Deserializing AnASTFile(this);
3884
3885 // Bump the generation number.
3886 unsigned PreviousGeneration = 0;
3887 if (ContextObj)
3888 PreviousGeneration = incrementGeneration(*ContextObj);
3889
3890 unsigned NumModules = ModuleMgr.size();
3891 SmallVector<ImportedModule, 4> Loaded;
3892 switch (ASTReadResult ReadResult =
3893 ReadASTCore(FileName, Type, ImportLoc,
3894 /*ImportedBy=*/nullptr, Loaded, 0, 0,
3895 ASTFileSignature(), ClientLoadCapabilities)) {
3896 case Failure:
3897 case Missing:
3898 case OutOfDate:
3899 case VersionMismatch:
3900 case ConfigurationMismatch:
3901 case HadErrors: {
3902 llvm::SmallPtrSet<ModuleFile *, 4> LoadedSet;
3903 for (const ImportedModule &IM : Loaded)
3904 LoadedSet.insert(IM.Mod);
3905
3906 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, LoadedSet,
3907 PP.getLangOpts().Modules
3908 ? &PP.getHeaderSearchInfo().getModuleMap()
3909 : nullptr);
3910
3911 // If we find that any modules are unusable, the global index is going
3912 // to be out-of-date. Just remove it.
3913 GlobalIndex.reset();
3914 ModuleMgr.setGlobalIndex(nullptr);
3915 return ReadResult;
3916 }
3917 case Success:
3918 break;
3919 }
3920
3921 // Here comes stuff that we only do once the entire chain is loaded.
3922
3923 // Load the AST blocks of all of the modules that we loaded.
3924 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
3925 MEnd = Loaded.end();
3926 M != MEnd; ++M) {
3927 ModuleFile &F = *M->Mod;
3928
3929 // Read the AST block.
3930 if (ASTReadResult Result = ReadASTBlock(F, ClientLoadCapabilities))
3931 return Result;
3932
3933 // Read the extension blocks.
3934 while (!SkipCursorToBlock(F.Stream, EXTENSION_BLOCK_ID)) {
3935 if (ASTReadResult Result = ReadExtensionBlock(F))
3936 return Result;
3937 }
3938
3939 // Once read, set the ModuleFile bit base offset and update the size in
3940 // bits of all files we've seen.
3941 F.GlobalBitOffset = TotalModulesSizeInBits;
3942 TotalModulesSizeInBits += F.SizeInBits;
3943 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F));
3944
3945 // Preload SLocEntries.
3946 for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) {
3947 int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID;
3948 // Load it through the SourceManager and don't call ReadSLocEntry()
3949 // directly because the entry may have already been loaded in which case
3950 // calling ReadSLocEntry() directly would trigger an assertion in
3951 // SourceManager.
3952 SourceMgr.getLoadedSLocEntryByID(Index);
3953 }
3954
3955 // Map the original source file ID into the ID space of the current
3956 // compilation.
3957 if (F.OriginalSourceFileID.isValid()) {
3958 F.OriginalSourceFileID = FileID::get(
3959 F.SLocEntryBaseID + F.OriginalSourceFileID.getOpaqueValue() - 1);
3960 }
3961
3962 // Preload all the pending interesting identifiers by marking them out of
3963 // date.
3964 for (auto Offset : F.PreloadIdentifierOffsets) {
3965 const unsigned char *Data = reinterpret_cast<const unsigned char *>(
3966 F.IdentifierTableData + Offset);
3967
3968 ASTIdentifierLookupTrait Trait(*this, F);
3969 auto KeyDataLen = Trait.ReadKeyDataLength(Data);
3970 auto Key = Trait.ReadKey(Data, KeyDataLen.first);
3971 auto &II = PP.getIdentifierTable().getOwn(Key);
3972 II.setOutOfDate(true);
3973
3974 // Mark this identifier as being from an AST file so that we can track
3975 // whether we need to serialize it.
3976 markIdentifierFromAST(*this, II);
3977
3978 // Associate the ID with the identifier so that the writer can reuse it.
3979 auto ID = Trait.ReadIdentifierID(Data + KeyDataLen.first);
3980 SetIdentifierInfo(ID, &II);
3981 }
3982 }
3983
3984 // Setup the import locations and notify the module manager that we've
3985 // committed to these module files.
3986 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
3987 MEnd = Loaded.end();
3988 M != MEnd; ++M) {
3989 ModuleFile &F = *M->Mod;
3990
3991 ModuleMgr.moduleFileAccepted(&F);
3992
3993 // Set the import location.
3994 F.DirectImportLoc = ImportLoc;
3995 // FIXME: We assume that locations from PCH / preamble do not need
3996 // any translation.
3997 if (!M->ImportedBy)
3998 F.ImportLoc = M->ImportLoc;
3999 else
4000 F.ImportLoc = TranslateSourceLocation(*M->ImportedBy, M->ImportLoc);
4001 }
4002
4003 if (!PP.getLangOpts().CPlusPlus ||
4004 (Type != MK_ImplicitModule && Type != MK_ExplicitModule &&
4005 Type != MK_PrebuiltModule)) {
4006 // Mark all of the identifiers in the identifier table as being out of date,
4007 // so that various accessors know to check the loaded modules when the
4008 // identifier is used.
4009 //
4010 // For C++ modules, we don't need information on many identifiers (just
4011 // those that provide macros or are poisoned), so we mark all of
4012 // the interesting ones via PreloadIdentifierOffsets.
4013 for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(),
4014 IdEnd = PP.getIdentifierTable().end();
4015 Id != IdEnd; ++Id)
4016 Id->second->setOutOfDate(true);
4017 }
4018 // Mark selectors as out of date.
4019 for (auto Sel : SelectorGeneration)
4020 SelectorOutOfDate[Sel.first] = true;
4021
4022 // Resolve any unresolved module exports.
4023 for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) {
4024 UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I];
4025 SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID);
4026 Module *ResolvedMod = getSubmodule(GlobalID);
4027
4028 switch (Unresolved.Kind) {
4029 case UnresolvedModuleRef::Conflict:
4030 if (ResolvedMod) {
4031 Module::Conflict Conflict;
4032 Conflict.Other = ResolvedMod;
4033 Conflict.Message = Unresolved.String.str();
4034 Unresolved.Mod->Conflicts.push_back(Conflict);
4035 }
4036 continue;
4037
4038 case UnresolvedModuleRef::Import:
4039 if (ResolvedMod)
4040 Unresolved.Mod->Imports.insert(ResolvedMod);
4041 continue;
4042
4043 case UnresolvedModuleRef::Export:
4044 if (ResolvedMod || Unresolved.IsWildcard)
4045 Unresolved.Mod->Exports.push_back(
4046 Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard));
4047 continue;
4048 }
4049 }
4050 UnresolvedModuleRefs.clear();
4051
4052 if (Imported)
4053 Imported->append(ImportedModules.begin(),
4054 ImportedModules.end());
4055
4056 // FIXME: How do we load the 'use'd modules? They may not be submodules.
4057 // Might be unnecessary as use declarations are only used to build the
4058 // module itself.
4059
4060 if (ContextObj)
4061 InitializeContext();
4062
4063 if (SemaObj)
4064 UpdateSema();
4065
4066 if (DeserializationListener)
4067 DeserializationListener->ReaderInitialized(this);
4068
4069 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
4070 if (PrimaryModule.OriginalSourceFileID.isValid()) {
4071 // If this AST file is a precompiled preamble, then set the
4072 // preamble file ID of the source manager to the file source file
4073 // from which the preamble was built.
4074 if (Type == MK_Preamble) {
4075 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID);
4076 } else if (Type == MK_MainFile) {
4077 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID);
4078 }
4079 }
4080
4081 // For any Objective-C class definitions we have already loaded, make sure
4082 // that we load any additional categories.
4083 if (ContextObj) {
4084 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
4085 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
4086 ObjCClassesLoaded[I],
4087 PreviousGeneration);
4088 }
4089 }
4090
4091 if (PP.getHeaderSearchInfo()
4092 .getHeaderSearchOpts()
4093 .ModulesValidateOncePerBuildSession) {
4094 // Now we are certain that the module and all modules it depends on are
4095 // up to date. Create or update timestamp files for modules that are
4096 // located in the module cache (not for PCH files that could be anywhere
4097 // in the filesystem).
4098 for (unsigned I = 0, N = Loaded.size(); I != N; ++I) {
4099 ImportedModule &M = Loaded[I];
4100 if (M.Mod->Kind == MK_ImplicitModule) {
4101 updateModuleTimestamp(*M.Mod);
4102 }
4103 }
4104 }
4105
4106 return Success;
4107}
4108
4109static ASTFileSignature readASTFileSignature(StringRef PCH);
4110
4111/// Whether \p Stream starts with the AST/PCH file magic number 'CPCH'.
4112static bool startsWithASTFileMagic(BitstreamCursor &Stream) {
4113 return Stream.canSkipToPos(4) &&
4114 Stream.Read(8) == 'C' &&
4115 Stream.Read(8) == 'P' &&
4116 Stream.Read(8) == 'C' &&
4117 Stream.Read(8) == 'H';
4118}
4119
4120static unsigned moduleKindForDiagnostic(ModuleKind Kind) {
4121 switch (Kind) {
4122 case MK_PCH:
4123 return 0; // PCH
4124 case MK_ImplicitModule:
4125 case MK_ExplicitModule:
4126 case MK_PrebuiltModule:
4127 return 1; // module
4128 case MK_MainFile:
4129 case MK_Preamble:
4130 return 2; // main source file
4131 }
4132 llvm_unreachable("unknown module kind")::llvm::llvm_unreachable_internal("unknown module kind", "/build/llvm-toolchain-snapshot-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 4132)
;
4133}
4134
4135ASTReader::ASTReadResult
4136ASTReader::ReadASTCore(StringRef FileName,
4137 ModuleKind Type,
4138 SourceLocation ImportLoc,
4139 ModuleFile *ImportedBy,
4140 SmallVectorImpl<ImportedModule> &Loaded,
4141 off_t ExpectedSize, time_t ExpectedModTime,
4142 ASTFileSignature ExpectedSignature,
4143 unsigned ClientLoadCapabilities) {
4144 ModuleFile *M;
4145 std::string ErrorStr;
4146 ModuleManager::AddModuleResult AddResult
4147 = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy,
4148 getGeneration(), ExpectedSize, ExpectedModTime,
4149 ExpectedSignature, readASTFileSignature,
4150 M, ErrorStr);
4151
4152 switch (AddResult) {
4153 case ModuleManager::AlreadyLoaded:
4154 Diag(diag::remark_module_import)
4155 << M->ModuleName << M->FileName << (ImportedBy ? true : false)
4156 << (ImportedBy ? StringRef(ImportedBy->ModuleName) : StringRef());
4157 return Success;
4158
4159 case ModuleManager::NewlyLoaded:
4160 // Load module file below.
4161 break;
4162
4163 case ModuleManager::Missing:
4164 // The module file was missing; if the client can handle that, return
4165 // it.
4166 if (ClientLoadCapabilities & ARR_Missing)
4167 return Missing;
4168
4169 // Otherwise, return an error.
4170 Diag(diag::err_module_file_not_found) << moduleKindForDiagnostic(Type)
4171 << FileName << !ErrorStr.empty()
4172 << ErrorStr;
4173 return Failure;
4174
4175 case ModuleManager::OutOfDate:
4176 // We couldn't load the module file because it is out-of-date. If the
4177 // client can handle out-of-date, return it.
4178 if (ClientLoadCapabilities & ARR_OutOfDate)
4179 return OutOfDate;
4180
4181 // Otherwise, return an error.
4182 Diag(diag::err_module_file_out_of_date) << moduleKindForDiagnostic(Type)
4183 << FileName << !ErrorStr.empty()
4184 << ErrorStr;
4185 return Failure;
4186 }
4187
4188 assert(M && "Missing module file")((M && "Missing module file") ? static_cast<void>
(0) : __assert_fail ("M && \"Missing module file\"",
"/build/llvm-toolchain-snapshot-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 4188, __PRETTY_FUNCTION__))
;
4189
4190 bool ShouldFinalizePCM = false;
4191 auto FinalizeOrDropPCM = llvm::make_scope_exit([&]() {
4192 auto &MC = getModuleManager().getModuleCache();
4193 if (ShouldFinalizePCM)
4194 MC.finalizePCM(FileName);
4195 else
4196 MC.tryToDropPCM(FileName);
4197 });
4198 ModuleFile &F = *M;
4199 BitstreamCursor &Stream = F.Stream;
4200 Stream = BitstreamCursor(PCHContainerRdr.ExtractPCH(*F.Buffer));
4201 F.SizeInBits = F.Buffer->getBufferSize() * 8;
4202
4203 // Sniff for the signature.
4204 if (!startsWithASTFileMagic(Stream)) {
4205 Diag(diag::err_module_file_invalid) << moduleKindForDiagnostic(Type)
4206 << FileName;
4207 return Failure;
4208 }
4209
4210 // This is used for compatibility with older PCH formats.
4211 bool HaveReadControlBlock = false;
4212 while (true) {
4213 llvm::BitstreamEntry Entry = Stream.advance();
4214
4215 switch (Entry.Kind) {
4216 case llvm::BitstreamEntry::Error:
4217 case llvm::BitstreamEntry::Record:
4218 case llvm::BitstreamEntry::EndBlock:
4219 Error("invalid record at top-level of AST file");
4220 return Failure;
4221
4222 case llvm::BitstreamEntry::SubBlock:
4223 break;
4224 }
4225
4226 switch (Entry.ID) {
4227 case CONTROL_BLOCK_ID:
4228 HaveReadControlBlock = true;
4229 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
4230 case Success:
4231 // Check that we didn't try to load a non-module AST file as a module.
4232 //
4233 // FIXME: Should we also perform the converse check? Loading a module as
4234 // a PCH file sort of works, but it's a bit wonky.
4235 if ((Type == MK_ImplicitModule || Type == MK_ExplicitModule ||
4236 Type == MK_PrebuiltModule) &&
4237 F.ModuleName.empty()) {
4238 auto Result = (Type == MK_ImplicitModule) ? OutOfDate : Failure;
4239 if (Result != OutOfDate ||
4240 (ClientLoadCapabilities & ARR_OutOfDate) == 0)
4241 Diag(diag::err_module_file_not_module) << FileName;
4242 return Result;
4243 }
4244 break;
4245
4246 case Failure: return Failure;
4247 case Missing: return Missing;
4248 case OutOfDate: return OutOfDate;
4249 case VersionMismatch: return VersionMismatch;
4250 case ConfigurationMismatch: return ConfigurationMismatch;
4251 case HadErrors: return HadErrors;
4252 }
4253 break;
4254
4255 case AST_BLOCK_ID:
4256 if (!HaveReadControlBlock) {
4257 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
4258 Diag(diag::err_pch_version_too_old);
4259 return VersionMismatch;
4260 }
4261
4262 // Record that we've loaded this module.
4263 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc));
4264 ShouldFinalizePCM = true;
4265 return Success;
4266
4267 case UNHASHED_CONTROL_BLOCK_ID:
4268 // This block is handled using look-ahead during ReadControlBlock. We
4269 // shouldn't get here!
4270 Error("malformed block record in AST file");
4271 return Failure;
4272
4273 default:
4274 if (Stream.SkipBlock()) {
4275 Error("malformed block record in AST file");
4276 return Failure;
4277 }
4278 break;
4279 }
4280 }
4281
4282 llvm_unreachable("unexpected break; expected return")::llvm::llvm_unreachable_internal("unexpected break; expected return"
, "/build/llvm-toolchain-snapshot-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 4282)
;
4283}
4284
4285ASTReader::ASTReadResult
4286ASTReader::readUnhashedControlBlock(ModuleFile &F, bool WasImportedBy,
4287 unsigned ClientLoadCapabilities) {
4288 const HeaderSearchOptions &HSOpts =
4289 PP.getHeaderSearchInfo().getHeaderSearchOpts();
4290 bool AllowCompatibleConfigurationMismatch =
4291 F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule;
4292
4293 ASTReadResult Result = readUnhashedControlBlockImpl(
4294 &F, F.Data, ClientLoadCapabilities, AllowCompatibleConfigurationMismatch,
4295 Listener.get(),
4296 WasImportedBy ? false : HSOpts.ModulesValidateDiagnosticOptions);
4297
4298 // If F was directly imported by another module, it's implicitly validated by
4299 // the importing module.
4300 if (DisableValidation || WasImportedBy ||
4301 (AllowConfigurationMismatch && Result == ConfigurationMismatch))
4302 return Success;
4303
4304 if (Result == Failure) {
4305 Error("malformed block record in AST file");
4306 return Failure;
4307 }
4308
4309 if (Result == OutOfDate && F.Kind == MK_ImplicitModule) {
4310 // If this module has already been finalized in the ModuleCache, we're stuck
4311 // with it; we can only load a single version of each module.
4312 //
4313 // This can happen when a module is imported in two contexts: in one, as a
4314 // user module; in another, as a system module (due to an import from
4315 // another module marked with the [system] flag). It usually indicates a
4316 // bug in the module map: this module should also be marked with [system].
4317 //
4318 // If -Wno-system-headers (the default), and the first import is as a
4319 // system module, then validation will fail during the as-user import,
4320 // since -Werror flags won't have been validated. However, it's reasonable
4321 // to treat this consistently as a system module.
4322 //
4323 // If -Wsystem-headers, the PCM on disk was built with
4324 // -Wno-system-headers, and the first import is as a user module, then
4325 // validation will fail during the as-system import since the PCM on disk
4326 // doesn't guarantee that -Werror was respected. However, the -Werror
4327 // flags were checked during the initial as-user import.
4328 if (getModuleManager().getModuleCache().isPCMFinal(F.FileName)) {
4329 Diag(diag::warn_module_system_bit_conflict) << F.FileName;
4330 return Success;
4331 }
4332 }
4333
4334 return Result;
4335}
4336
4337ASTReader::ASTReadResult ASTReader::readUnhashedControlBlockImpl(
4338 ModuleFile *F, llvm::StringRef StreamData, unsigned ClientLoadCapabilities,
4339 bool AllowCompatibleConfigurationMismatch, ASTReaderListener *Listener,
4340 bool ValidateDiagnosticOptions) {
4341 // Initialize a stream.
4342 BitstreamCursor Stream(StreamData);
4343
4344 // Sniff for the signature.
4345 if (!startsWithASTFileMagic(Stream))
4346 return Failure;
4347
4348 // Scan for the UNHASHED_CONTROL_BLOCK_ID block.
4349 if (SkipCursorToBlock(Stream, UNHASHED_CONTROL_BLOCK_ID))
4350 return Failure;
4351
4352 // Read all of the records in the options block.
4353 RecordData Record;
4354 ASTReadResult Result = Success;
4355 while (true) {
4356 llvm::BitstreamEntry Entry = Stream.advance();
4357
4358 switch (Entry.Kind) {
4359 case llvm::BitstreamEntry::Error:
4360 case llvm::BitstreamEntry::SubBlock:
4361 return Failure;
4362
4363 case llvm::BitstreamEntry::EndBlock:
4364 return Result;
4365
4366 case llvm::BitstreamEntry::Record:
4367 // The interesting case.
4368 break;
4369 }
4370
4371 // Read and process a record.
4372 Record.clear();
4373 switch (
4374 (UnhashedControlBlockRecordTypes)Stream.readRecord(Entry.ID, Record)) {
4375 case SIGNATURE:
4376 if (F)
4377 std::copy(Record.begin(), Record.end(), F->Signature.data());
4378 break;
4379 case DIAGNOSTIC_OPTIONS: {
4380 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
4381 if (Listener && ValidateDiagnosticOptions &&
4382 !AllowCompatibleConfigurationMismatch &&
4383 ParseDiagnosticOptions(Record, Complain, *Listener))
4384 Result = OutOfDate; // Don't return early. Read the signature.
4385 break;
4386 }
4387 case DIAG_PRAGMA_MAPPINGS:
4388 if (!F)
4389 break;
4390 if (F->PragmaDiagMappings.empty())
4391 F->PragmaDiagMappings.swap(Record);
4392 else
4393 F->PragmaDiagMappings.insert(F->PragmaDiagMappings.end(),
4394 Record.begin(), Record.end());
4395 break;
4396 }
4397 }
4398}
4399
4400/// Parse a record and blob containing module file extension metadata.
4401static bool parseModuleFileExtensionMetadata(
4402 const SmallVectorImpl<uint64_t> &Record,
4403 StringRef Blob,
4404 ModuleFileExtensionMetadata &Metadata) {
4405 if (Record.size() < 4) return true;
4406
4407 Metadata.MajorVersion = Record[0];
4408 Metadata.MinorVersion = Record[1];
4409
4410 unsigned BlockNameLen = Record[2];
4411 unsigned UserInfoLen = Record[3];
4412
4413 if (BlockNameLen + UserInfoLen > Blob.size()) return true;
4414
4415 Metadata.BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen);
4416 Metadata.UserInfo = std::string(Blob.data() + BlockNameLen,
4417 Blob.data() + BlockNameLen + UserInfoLen);
4418 return false;
4419}
4420
4421ASTReader::ASTReadResult ASTReader::ReadExtensionBlock(ModuleFile &F) {
4422 BitstreamCursor &Stream = F.Stream;
4423
4424 RecordData Record;
4425 while (true) {
4426 llvm::BitstreamEntry Entry = Stream.advance();
4427 switch (Entry.Kind) {
4428 case llvm::BitstreamEntry::SubBlock:
4429 if (Stream.SkipBlock())
4430 return Failure;
4431
4432 continue;
4433
4434 case llvm::BitstreamEntry::EndBlock:
4435 return Success;
4436
4437 case llvm::BitstreamEntry::Error:
4438 return HadErrors;
4439
4440 case llvm::BitstreamEntry::Record:
4441 break;
4442 }
4443
4444 Record.clear();
4445 StringRef Blob;
4446 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob);
4447 switch (RecCode) {
4448 case EXTENSION_METADATA: {
4449 ModuleFileExtensionMetadata Metadata;
4450 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata))
4451 return Failure;
4452
4453 // Find a module file extension with this block name.
4454 auto Known = ModuleFileExtensions.find(Metadata.BlockName);
4455 if (Known == ModuleFileExtensions.end()) break;
4456
4457 // Form a reader.
4458 if (auto Reader = Known->second->createExtensionReader(Metadata, *this,
4459 F, Stream)) {
4460 F.ExtensionReaders.push_back(std::move(Reader));
4461 }
4462
4463 break;
4464 }
4465 }
4466 }
4467
4468 return Success;
4469}
4470
4471void ASTReader::InitializeContext() {
4472 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 4472, __PRETTY_FUNCTION__))
;
4473 ASTContext &Context = *ContextObj;
4474
4475 // If there's a listener, notify them that we "read" the translation unit.
4476 if (DeserializationListener)
4477 DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID,
4478 Context.getTranslationUnitDecl());
4479
4480 // FIXME: Find a better way to deal with collisions between these
4481 // built-in types. Right now, we just ignore the problem.
4482
4483 // Load the special types.
4484 if (SpecialTypes.size() >= NumSpecialTypeIDs) {
4485 if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) {
4486 if (!Context.CFConstantStringTypeDecl)
4487 Context.setCFConstantStringType(GetType(String));
4488 }
4489
4490 if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) {
4491 QualType FileType = GetType(File);
4492 if (FileType.isNull()) {
4493 Error("FILE type is NULL");
4494 return;
4495 }
4496
4497 if (!Context.FILEDecl) {
4498 if (const TypedefType *Typedef = FileType->getAs<TypedefType>())
4499 Context.setFILEDecl(Typedef->getDecl());
4500 else {
4501 const TagType *Tag = FileType->getAs<TagType>();
4502 if (!Tag) {
4503 Error("Invalid FILE type in AST file");
4504 return;
4505 }
4506 Context.setFILEDecl(Tag->getDecl());
4507 }
4508 }
4509 }
4510
4511 if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) {
4512 QualType Jmp_bufType = GetType(Jmp_buf);
4513 if (Jmp_bufType.isNull()) {
4514 Error("jmp_buf type is NULL");
4515 return;
4516 }
4517
4518 if (!Context.jmp_bufDecl) {
4519 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>())
4520 Context.setjmp_bufDecl(Typedef->getDecl());
4521 else {
4522 const TagType *Tag = Jmp_bufType->getAs<TagType>();
4523 if (!Tag) {
4524 Error("Invalid jmp_buf type in AST file");
4525 return;
4526 }
4527 Context.setjmp_bufDecl(Tag->getDecl());
4528 }
4529 }
4530 }
4531
4532 if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) {
4533 QualType Sigjmp_bufType = GetType(Sigjmp_buf);
4534 if (Sigjmp_bufType.isNull()) {
4535 Error("sigjmp_buf type is NULL");
4536 return;
4537 }
4538
4539 if (!Context.sigjmp_bufDecl) {
4540 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>())
4541 Context.setsigjmp_bufDecl(Typedef->getDecl());
4542 else {
4543 const TagType *Tag = Sigjmp_bufType->getAs<TagType>();
4544 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 4544, __PRETTY_FUNCTION__))
;
4545 Context.setsigjmp_bufDecl(Tag->getDecl());
4546 }
4547 }
4548 }
4549
4550 if (unsigned ObjCIdRedef
4551 = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) {
4552 if (Context.ObjCIdRedefinitionType.isNull())
4553 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef);
4554 }
4555
4556 if (unsigned ObjCClassRedef
4557 = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) {
4558 if (Context.ObjCClassRedefinitionType.isNull())
4559 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef);
4560 }
4561
4562 if (unsigned ObjCSelRedef
4563 = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) {
4564 if (Context.ObjCSelRedefinitionType.isNull())
4565 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef);
4566 }
4567
4568 if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) {
4569 QualType Ucontext_tType = GetType(Ucontext_t);
4570 if (Ucontext_tType.isNull()) {
4571 Error("ucontext_t type is NULL");
4572 return;
4573 }
4574
4575 if (!Context.ucontext_tDecl) {
4576 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>())
4577 Context.setucontext_tDecl(Typedef->getDecl());
4578 else {
4579 const TagType *Tag = Ucontext_tType->getAs<TagType>();
4580 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 4580, __PRETTY_FUNCTION__))
;
4581 Context.setucontext_tDecl(Tag->getDecl());
4582 }
4583 }
4584 }
4585 }
4586
4587 ReadPragmaDiagnosticMappings(Context.getDiagnostics());
4588
4589 // If there were any CUDA special declarations, deserialize them.
4590 if (!CUDASpecialDeclRefs.empty()) {
4591 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 4591, __PRETTY_FUNCTION__))
;
4592 Context.setcudaConfigureCallDecl(
4593 cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0])));
4594 }
4595
4596 // Re-export any modules that were imported by a non-module AST file.
4597 // FIXME: This does not make macro-only imports visible again.
4598 for (auto &Import : ImportedModules) {
4599 if (Module *Imported = getSubmodule(Import.ID)) {
4600 makeModuleVisible(Imported, Module::AllVisible,
4601 /*ImportLoc=*/Import.ImportLoc);
4602 if (Import.ImportLoc.isValid())
4603 PP.makeModuleVisible(Imported, Import.ImportLoc);
4604 // FIXME: should we tell Sema to make the module visible too?
4605 }
4606 }
4607 ImportedModules.clear();
4608}
4609
4610void ASTReader::finalizeForWriting() {
4611 // Nothing to do for now.
4612}
4613
4614/// Reads and return the signature record from \p PCH's control block, or
4615/// else returns 0.
4616static ASTFileSignature readASTFileSignature(StringRef PCH) {
4617 BitstreamCursor Stream(PCH);
4618 if (!startsWithASTFileMagic(Stream))
4619 return ASTFileSignature();
4620
4621 // Scan for the UNHASHED_CONTROL_BLOCK_ID block.
4622 if (SkipCursorToBlock(Stream, UNHASHED_CONTROL_BLOCK_ID))
4623 return ASTFileSignature();
4624
4625 // Scan for SIGNATURE inside the diagnostic options block.
4626 ASTReader::RecordData Record;
4627 while (true) {
4628 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
4629 if (Entry.Kind != llvm::BitstreamEntry::Record)
4630 return ASTFileSignature();
4631
4632 Record.clear();
4633 StringRef Blob;
4634 if (SIGNATURE == Stream.readRecord(Entry.ID, Record, &Blob))
4635 return {{{(uint32_t)Record[0], (uint32_t)Record[1], (uint32_t)Record[2],
4636 (uint32_t)Record[3], (uint32_t)Record[4]}}};
4637 }
4638}
4639
4640/// Retrieve the name of the original source file name
4641/// directly from the AST file, without actually loading the AST
4642/// file.
4643std::string ASTReader::getOriginalSourceFile(
4644 const std::string &ASTFileName, FileManager &FileMgr,
4645 const PCHContainerReader &PCHContainerRdr, DiagnosticsEngine &Diags) {
4646 // Open the AST file.
4647 auto Buffer = FileMgr.getBufferForFile(ASTFileName);
4648 if (!Buffer) {
4649 Diags.Report(diag::err_fe_unable_to_read_pch_file)
4650 << ASTFileName << Buffer.getError().message();
4651 return std::string();
4652 }
4653
4654 // Initialize the stream
4655 BitstreamCursor Stream(PCHContainerRdr.ExtractPCH(**Buffer));
4656
4657 // Sniff for the signature.
4658 if (!startsWithASTFileMagic(Stream)) {
4659 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName;
4660 return std::string();
4661 }
4662
4663 // Scan for the CONTROL_BLOCK_ID block.
4664 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) {
4665 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
4666 return std::string();
4667 }
4668
4669 // Scan for ORIGINAL_FILE inside the control block.
4670 RecordData Record;
4671 while (true) {
4672 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
4673 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
4674 return std::string();
4675
4676 if (Entry.Kind != llvm::BitstreamEntry::Record) {
4677 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
4678 return std::string();
4679 }
4680
4681 Record.clear();
4682 StringRef Blob;
4683 if (Stream.readRecord(Entry.ID, Record, &Blob) == ORIGINAL_FILE)
4684 return Blob.str();
4685 }
4686}
4687
4688namespace {
4689
4690 class SimplePCHValidator : public ASTReaderListener {
4691 const LangOptions &ExistingLangOpts;
4692 const TargetOptions &ExistingTargetOpts;
4693 const PreprocessorOptions &ExistingPPOpts;
4694 std::string ExistingModuleCachePath;
4695 FileManager &FileMgr;
4696
4697 public:
4698 SimplePCHValidator(const LangOptions &ExistingLangOpts,
4699 const TargetOptions &ExistingTargetOpts,
4700 const PreprocessorOptions &ExistingPPOpts,
4701 StringRef ExistingModuleCachePath,
4702 FileManager &FileMgr)
4703 : ExistingLangOpts(ExistingLangOpts),
4704 ExistingTargetOpts(ExistingTargetOpts),
4705 ExistingPPOpts(ExistingPPOpts),
4706 ExistingModuleCachePath(ExistingModuleCachePath),
4707 FileMgr(FileMgr) {}
4708
4709 bool ReadLanguageOptions(const LangOptions &LangOpts, bool Complain,
4710 bool AllowCompatibleDifferences) override {
4711 return checkLanguageOptions(ExistingLangOpts, LangOpts, nullptr,
4712 AllowCompatibleDifferences);
4713 }
4714
4715 bool ReadTargetOptions(const TargetOptions &TargetOpts, bool Complain,
4716 bool AllowCompatibleDifferences) override {
4717 return checkTargetOptions(ExistingTargetOpts, TargetOpts, nullptr,
4718 AllowCompatibleDifferences);
4719 }
4720
4721 bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
4722 StringRef SpecificModuleCachePath,
4723 bool Complain) override {
4724 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
4725 ExistingModuleCachePath,
4726 nullptr, ExistingLangOpts);
4727 }
4728
4729 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
4730 bool Complain,
4731 std::string &SuggestedPredefines) override {
4732 return checkPreprocessorOptions(ExistingPPOpts, PPOpts, nullptr, FileMgr,
4733 SuggestedPredefines, ExistingLangOpts);
4734 }
4735 };
4736
4737} // namespace
4738
4739bool ASTReader::readASTFileControlBlock(
4740 StringRef Filename, FileManager &FileMgr,
4741 const PCHContainerReader &PCHContainerRdr,
4742 bool FindModuleFileExtensions,
4743 ASTReaderListener &Listener, bool ValidateDiagnosticOptions) {
4744 // Open the AST file.
4745 // FIXME: This allows use of the VFS; we do not allow use of the
4746 // VFS when actually loading a module.
4747 auto Buffer = FileMgr.getBufferForFile(Filename);
4748 if (!Buffer) {
4749 return true;
4750 }
4751
4752 // Initialize the stream
4753 StringRef Bytes = PCHContainerRdr.ExtractPCH(**Buffer);
4754 BitstreamCursor Stream(Bytes);
4755
4756 // Sniff for the signature.
4757 if (!startsWithASTFileMagic(Stream))
4758 return true;
4759
4760 // Scan for the CONTROL_BLOCK_ID block.
4761 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID))
4762 return true;
4763
4764 bool NeedsInputFiles = Listener.needsInputFileVisitation();
4765 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
4766 bool NeedsImports = Listener.needsImportVisitation();
4767 BitstreamCursor InputFilesCursor;
4768
4769 RecordData Record;
4770 std::string ModuleDir;
4771 bool DoneWithControlBlock = false;
4772 while (!DoneWithControlBlock) {
4773 llvm::BitstreamEntry Entry = Stream.advance();
4774
4775 switch (Entry.Kind) {
4776 case llvm::BitstreamEntry::SubBlock: {
4777 switch (Entry.ID) {
4778 case OPTIONS_BLOCK_ID: {
4779 std::string IgnoredSuggestedPredefines;
4780 if (ReadOptionsBlock(Stream, ARR_ConfigurationMismatch | ARR_OutOfDate,
4781 /*AllowCompatibleConfigurationMismatch*/ false,
4782 Listener, IgnoredSuggestedPredefines) != Success)
4783 return true;
4784 break;
4785 }
4786
4787 case INPUT_FILES_BLOCK_ID:
4788 InputFilesCursor = Stream;
4789 if (Stream.SkipBlock() ||
4790 (NeedsInputFiles &&
4791 ReadBlockAbbrevs(InputFilesCursor, INPUT_FILES_BLOCK_ID)))
4792 return true;
4793 break;
4794
4795 default:
4796 if (Stream.SkipBlock())
4797 return true;
4798 break;
4799 }
4800
4801 continue;
4802 }
4803
4804 case llvm::BitstreamEntry::EndBlock:
4805 DoneWithControlBlock = true;
4806 break;
4807
4808 case llvm::BitstreamEntry::Error:
4809 return true;
4810
4811 case llvm::BitstreamEntry::Record:
4812 break;
4813 }
4814
4815 if (DoneWithControlBlock) break;
4816
4817 Record.clear();
4818 StringRef Blob;
4819 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob);
4820 switch ((ControlRecordTypes)RecCode) {
4821 case METADATA:
4822 if (Record[0] != VERSION_MAJOR)
4823 return true;
4824 if (Listener.ReadFullVersionInformation(Blob))
4825 return true;
4826 break;
4827 case MODULE_NAME:
4828 Listener.ReadModuleName(Blob);
4829 break;
4830 case MODULE_DIRECTORY:
4831 ModuleDir = Blob;
4832 break;
4833 case MODULE_MAP_FILE: {
4834 unsigned Idx = 0;
4835 auto Path = ReadString(Record, Idx);
4836 ResolveImportedPath(Path, ModuleDir);
4837 Listener.ReadModuleMapFile(Path);
4838 break;
4839 }
4840 case INPUT_FILE_OFFSETS: {
4841 if (!NeedsInputFiles)
4842 break;
4843
4844 unsigned NumInputFiles = Record[0];
4845 unsigned NumUserFiles = Record[1];
4846 const llvm::support::unaligned_uint64_t *InputFileOffs =
4847 (const llvm::support::unaligned_uint64_t *)Blob.data();
4848 for (unsigned I = 0; I != NumInputFiles; ++I) {
4849 // Go find this input file.
4850 bool isSystemFile = I >= NumUserFiles;
4851
4852 if (isSystemFile && !NeedsSystemInputFiles)
4853 break; // the rest are system input files
4854
4855 BitstreamCursor &Cursor = InputFilesCursor;
4856 SavedStreamPosition SavedPosition(Cursor);
4857 Cursor.JumpToBit(InputFileOffs[I]);
4858
4859 unsigned Code = Cursor.ReadCode();
4860 RecordData Record;
4861 StringRef Blob;
4862 bool shouldContinue = false;
4863 switch ((InputFileRecordTypes)Cursor.readRecord(Code, Record, &Blob)) {
4864 case INPUT_FILE:
4865 bool Overridden = static_cast<bool>(Record[3]);
4866 std::string Filename = Blob;
4867 ResolveImportedPath(Filename, ModuleDir);
4868 shouldContinue = Listener.visitInputFile(
4869 Filename, isSystemFile, Overridden, /*IsExplicitModule*/false);
4870 break;
4871 }
4872 if (!shouldContinue)
4873 break;
4874 }
4875 break;
4876 }
4877
4878 case IMPORTS: {
4879 if (!NeedsImports)
4880 break;
4881
4882 unsigned Idx = 0, N = Record.size();
4883 while (Idx < N) {
4884 // Read information about the AST file.
4885 Idx += 1+1+1+1+5; // Kind, ImportLoc, Size, ModTime, Signature
4886 std::string ModuleName = ReadString(Record, Idx);
4887 std::string Filename = ReadString(Record, Idx);
4888 ResolveImportedPath(Filename, ModuleDir);
4889 Listener.visitImport(ModuleName, Filename);
4890 }
4891 break;
4892 }
4893
4894 default:
4895 // No other validation to perform.
4896 break;
4897 }
4898 }
4899
4900 // Look for module file extension blocks, if requested.
4901 if (FindModuleFileExtensions) {
4902 BitstreamCursor SavedStream = Stream;
4903 while (!SkipCursorToBlock(Stream, EXTENSION_BLOCK_ID)) {
4904 bool DoneWithExtensionBlock = false;
4905 while (!DoneWithExtensionBlock) {
4906 llvm::BitstreamEntry Entry = Stream.advance();
4907
4908 switch (Entry.Kind) {
4909 case llvm::BitstreamEntry::SubBlock:
4910 if (Stream.SkipBlock())
4911 return true;
4912
4913 continue;
4914
4915 case llvm::BitstreamEntry::EndBlock:
4916 DoneWithExtensionBlock = true;
4917 continue;
4918
4919 case llvm::BitstreamEntry::Error:
4920 return true;
4921
4922 case llvm::BitstreamEntry::Record:
4923 break;
4924 }
4925
4926 Record.clear();
4927 StringRef Blob;
4928 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob);
4929 switch (RecCode) {
4930 case EXTENSION_METADATA: {
4931 ModuleFileExtensionMetadata Metadata;
4932 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata))
4933 return true;
4934
4935 Listener.readModuleFileExtension(Metadata);
4936 break;
4937 }
4938 }
4939 }
4940 }
4941 Stream = SavedStream;
4942 }
4943
4944 // Scan for the UNHASHED_CONTROL_BLOCK_ID block.
4945 if (readUnhashedControlBlockImpl(
4946 nullptr, Bytes, ARR_ConfigurationMismatch | ARR_OutOfDate,
4947 /*AllowCompatibleConfigurationMismatch*/ false, &Listener,
4948 ValidateDiagnosticOptions) != Success)
4949 return true;
4950
4951 return false;
4952}
4953
4954bool ASTReader::isAcceptableASTFile(StringRef Filename, FileManager &FileMgr,
4955 const PCHContainerReader &PCHContainerRdr,
4956 const LangOptions &LangOpts,
4957 const TargetOptions &TargetOpts,
4958 const PreprocessorOptions &PPOpts,
4959 StringRef ExistingModuleCachePath) {
4960 SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts,
4961 ExistingModuleCachePath, FileMgr);
4962 return !readASTFileControlBlock(Filename, FileMgr, PCHContainerRdr,
4963 /*FindModuleFileExtensions=*/false,
4964 validator,
4965 /*ValidateDiagnosticOptions=*/true);
4966}
4967
4968ASTReader::ASTReadResult
4969ASTReader::ReadSubmoduleBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
4970 // Enter the submodule block.
4971 if (F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) {
4972 Error("malformed submodule block record in AST file");
4973 return Failure;
4974 }
4975
4976 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
4977 bool First = true;
4978 Module *CurrentModule = nullptr;
4979 RecordData Record;
4980 while (true) {
4981 llvm::BitstreamEntry Entry = F.Stream.advanceSkippingSubblocks();
4982
4983 switch (Entry.Kind) {
4984 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
4985 case llvm::BitstreamEntry::Error:
4986 Error("malformed block record in AST file");
4987 return Failure;
4988 case llvm::BitstreamEntry::EndBlock:
4989 return Success;
4990 case llvm::BitstreamEntry::Record:
4991 // The interesting case.
4992 break;
4993 }
4994
4995 // Read a record.
4996 StringRef Blob;
4997 Record.clear();
4998 auto Kind = F.Stream.readRecord(Entry.ID, Record, &Blob);
4999
5000 if ((Kind == SUBMODULE_METADATA) != First) {
5001 Error("submodule metadata record should be at beginning of block");
5002 return Failure;
5003 }
5004 First = false;
5005
5006 // Submodule information is only valid if we have a current module.
5007 // FIXME: Should we error on these cases?
5008 if (!CurrentModule && Kind != SUBMODULE_METADATA &&
5009 Kind != SUBMODULE_DEFINITION)
5010 continue;
5011
5012 switch (Kind) {
5013 default: // Default behavior: ignore.
5014 break;
5015
5016 case SUBMODULE_DEFINITION: {
5017 if (Record.size() < 12) {
5018 Error("malformed module definition");
5019 return Failure;
5020 }
5021
5022 StringRef Name = Blob;
5023 unsigned Idx = 0;
5024 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]);
5025 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]);
5026 Module::ModuleKind Kind = (Module::ModuleKind)Record[Idx++];
5027 bool IsFramework = Record[Idx++];
5028 bool IsExplicit = Record[Idx++];
5029 bool IsSystem = Record[Idx++];
5030 bool IsExternC = Record[Idx++];
5031 bool InferSubmodules = Record[Idx++];
5032 bool InferExplicitSubmodules = Record[Idx++];
5033 bool InferExportWildcard = Record[Idx++];
5034 bool ConfigMacrosExhaustive = Record[Idx++];
5035 bool ModuleMapIsPrivate = Record[Idx++];
5036
5037 Module *ParentModule = nullptr;
5038 if (Parent)
5039 ParentModule = getSubmodule(Parent);
5040
5041 // Retrieve this (sub)module from the module map, creating it if
5042 // necessary.
5043 CurrentModule =
5044 ModMap.findOrCreateModule(Name, ParentModule, IsFramework, IsExplicit)
5045 .first;
5046
5047 // FIXME: set the definition loc for CurrentModule, or call
5048 // ModMap.setInferredModuleAllowedBy()
5049
5050 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS;
5051 if (GlobalIndex >= SubmodulesLoaded.size() ||
5052 SubmodulesLoaded[GlobalIndex]) {
5053 Error("too many submodules");
5054 return Failure;
5055 }
5056
5057 if (!ParentModule) {
5058 if (const FileEntry *CurFile = CurrentModule->getASTFile()) {
5059 // Don't emit module relocation error if we have -fno-validate-pch
5060 if (!PP.getPreprocessorOpts().DisablePCHValidation &&
5061 CurFile != F.File) {
5062 if (!Diags.isDiagnosticInFlight()) {
5063 Diag(diag::err_module_file_conflict)
5064 << CurrentModule->getTopLevelModuleName()
5065 << CurFile->getName()
5066 << F.File->getName();
5067 }
5068 return Failure;
5069 }
5070 }
5071
5072 CurrentModule->setASTFile(F.File);
5073 CurrentModule->PresumedModuleMapFile = F.ModuleMapPath;
5074 }
5075
5076 CurrentModule->Kind = Kind;
5077 CurrentModule->Signature = F.Signature;
5078 CurrentModule->IsFromModuleFile = true;
5079 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem;
5080 CurrentModule->IsExternC = IsExternC;
5081 CurrentModule->InferSubmodules = InferSubmodules;
5082 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules;
5083 CurrentModule->InferExportWildcard = InferExportWildcard;
5084 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive;
5085 CurrentModule->ModuleMapIsPrivate = ModuleMapIsPrivate;
5086 if (DeserializationListener)
5087 DeserializationListener->ModuleRead(GlobalID, CurrentModule);
5088
5089 SubmodulesLoaded[GlobalIndex] = CurrentModule;
5090
5091 // Clear out data that will be replaced by what is in the module file.
5092 CurrentModule->LinkLibraries.clear();
5093 CurrentModule->ConfigMacros.clear();
5094 CurrentModule->UnresolvedConflicts.clear();
5095 CurrentModule->Conflicts.clear();
5096
5097 // The module is available unless it's missing a requirement; relevant
5098 // requirements will be (re-)added by SUBMODULE_REQUIRES records.
5099 // Missing headers that were present when the module was built do not
5100 // make it unavailable -- if we got this far, this must be an explicitly
5101 // imported module file.
5102 CurrentModule->Requirements.clear();
5103 CurrentModule->MissingHeaders.clear();
5104 CurrentModule->IsMissingRequirement =
5105 ParentModule && ParentModule->IsMissingRequirement;
5106 CurrentModule->IsAvailable = !CurrentModule->IsMissingRequirement;
5107 break;
5108 }
5109
5110 case SUBMODULE_UMBRELLA_HEADER: {
5111 std::string Filename = Blob;
5112 ResolveImportedPath(F, Filename);
5113 if (auto *Umbrella = PP.getFileManager().getFile(Filename)) {
5114 if (!CurrentModule->getUmbrellaHeader())
5115 ModMap.setUmbrellaHeader(CurrentModule, Umbrella, Blob);
5116 else if (CurrentModule->getUmbrellaHeader().Entry != Umbrella) {
5117 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
5118 Error("mismatched umbrella headers in submodule");
5119 return OutOfDate;
5120 }
5121 }
5122 break;
5123 }
5124
5125 case SUBMODULE_HEADER:
5126 case SUBMODULE_EXCLUDED_HEADER:
5127 case SUBMODULE_PRIVATE_HEADER:
5128 // We lazily associate headers with their modules via the HeaderInfo table.
5129 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
5130 // of complete filenames or remove it entirely.
5131 break;
5132
5133 case SUBMODULE_TEXTUAL_HEADER:
5134 case SUBMODULE_PRIVATE_TEXTUAL_HEADER:
5135 // FIXME: Textual headers are not marked in the HeaderInfo table. Load
5136 // them here.
5137 break;
5138
5139 case SUBMODULE_TOPHEADER:
5140 CurrentModule->addTopHeaderFilename(Blob);
5141 break;
5142
5143 case SUBMODULE_UMBRELLA_DIR: {
5144 std::string Dirname = Blob;
5145 ResolveImportedPath(F, Dirname);
5146 if (auto *Umbrella = PP.getFileManager().getDirectory(Dirname)) {
5147 if (!CurrentModule->getUmbrellaDir())
5148 ModMap.setUmbrellaDir(CurrentModule, Umbrella, Blob);
5149 else if (CurrentModule->getUmbrellaDir().Entry != Umbrella) {
5150 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
5151 Error("mismatched umbrella directories in submodule");
5152 return OutOfDate;
5153 }
5154 }
5155 break;
5156 }
5157
5158 case SUBMODULE_METADATA: {
5159 F.BaseSubmoduleID = getTotalNumSubmodules();
5160 F.LocalNumSubmodules = Record[0];
5161 unsigned LocalBaseSubmoduleID = Record[1];
5162 if (F.LocalNumSubmodules > 0) {
5163 // Introduce the global -> local mapping for submodules within this
5164 // module.
5165 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F));
5166
5167 // Introduce the local -> global mapping for submodules within this
5168 // module.
5169 F.SubmoduleRemap.insertOrReplace(
5170 std::make_pair(LocalBaseSubmoduleID,
5171 F.BaseSubmoduleID - LocalBaseSubmoduleID));
5172
5173 SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules);
5174 }
5175 break;
5176 }
5177
5178 case SUBMODULE_IMPORTS:
5179 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) {
5180 UnresolvedModuleRef Unresolved;
5181 Unresolved.File = &F;
5182 Unresolved.Mod = CurrentModule;
5183 Unresolved.ID = Record[Idx];
5184 Unresolved.Kind = UnresolvedModuleRef::Import;
5185 Unresolved.IsWildcard = false;
5186 UnresolvedModuleRefs.push_back(Unresolved);
5187 }
5188 break;
5189
5190 case SUBMODULE_EXPORTS:
5191 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) {
5192 UnresolvedModuleRef Unresolved;
5193 Unresolved.File = &F;
5194 Unresolved.Mod = CurrentModule;
5195 Unresolved.ID = Record[Idx];
5196 Unresolved.Kind = UnresolvedModuleRef::Export;
5197 Unresolved.IsWildcard = Record[Idx + 1];
5198 UnresolvedModuleRefs.push_back(Unresolved);
5199 }
5200
5201 // Once we've loaded the set of exports, there's no reason to keep
5202 // the parsed, unresolved exports around.
5203 CurrentModule->UnresolvedExports.clear();
5204 break;
5205
5206 case SUBMODULE_REQUIRES:
5207 CurrentModule->addRequirement(Blob, Record[0], PP.getLangOpts(),
5208 PP.getTargetInfo());
5209 break;
5210
5211 case SUBMODULE_LINK_LIBRARY:
5212 ModMap.resolveLinkAsDependencies(CurrentModule);
5213 CurrentModule->LinkLibraries.push_back(
5214 Module::LinkLibrary(Blob, Record[0]));
5215 break;
5216
5217 case SUBMODULE_CONFIG_MACRO:
5218 CurrentModule->ConfigMacros.push_back(Blob.str());
5219 break;
5220
5221 case SUBMODULE_CONFLICT: {
5222 UnresolvedModuleRef Unresolved;
5223 Unresolved.File = &F;
5224 Unresolved.Mod = CurrentModule;
5225 Unresolved.ID = Record[0];
5226 Unresolved.Kind = UnresolvedModuleRef::Conflict;
5227 Unresolved.IsWildcard = false;
5228 Unresolved.String = Blob;
5229 UnresolvedModuleRefs.push_back(Unresolved);
5230 break;
5231 }
5232
5233 case SUBMODULE_INITIALIZERS: {
5234 if (!ContextObj)
5235 break;
5236 SmallVector<uint32_t, 16> Inits;
5237 for (auto &ID : Record)
5238 Inits.push_back(getGlobalDeclID(F, ID));
5239 ContextObj->addLazyModuleInitializers(CurrentModule, Inits);
5240 break;
5241 }
5242
5243 case SUBMODULE_EXPORT_AS:
5244 CurrentModule->ExportAsModule = Blob.str();
5245 ModMap.addLinkAsDependency(CurrentModule);
5246 break;
5247 }
5248 }
5249}
5250
5251/// Parse the record that corresponds to a LangOptions data
5252/// structure.
5253///
5254/// This routine parses the language options from the AST file and then gives
5255/// them to the AST listener if one is set.
5256///
5257/// \returns true if the listener deems the file unacceptable, false otherwise.
5258bool ASTReader::ParseLanguageOptions(const RecordData &Record,
5259 bool Complain,
5260 ASTReaderListener &Listener,
5261 bool AllowCompatibleDifferences) {
5262 LangOptions LangOpts;
5263 unsigned Idx = 0;
5264#define LANGOPT(Name, Bits, Default, Description) \
5265 LangOpts.Name = Record[Idx++];
5266#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
5267 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
5268#include "clang/Basic/LangOptions.def"
5269#define SANITIZER(NAME, ID) \
5270 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]);
5271#include "clang/Basic/Sanitizers.def"
5272
5273 for (unsigned N = Record[Idx++]; N; --N)
5274 LangOpts.ModuleFeatures.push_back(ReadString(Record, Idx));
5275
5276 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++];
5277 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx);
5278 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion);
5279
5280 LangOpts.CurrentModule = ReadString(Record, Idx);
5281
5282 // Comment options.
5283 for (unsigned N = Record[Idx++]; N; --N) {
5284 LangOpts.CommentOpts.BlockCommandNames.push_back(
5285 ReadString(Record, Idx));
5286 }
5287 LangOpts.CommentOpts.ParseAllComments = Record[Idx++];
5288
5289 // OpenMP offloading options.
5290 for (unsigned N = Record[Idx++]; N; --N) {
5291 LangOpts.OMPTargetTriples.push_back(llvm::Triple(ReadString(Record, Idx)));
5292 }
5293
5294 LangOpts.OMPHostIRFile = ReadString(Record, Idx);
5295
5296 return Listener.ReadLanguageOptions(LangOpts, Complain,
5297 AllowCompatibleDifferences);
5298}
5299
5300bool ASTReader::ParseTargetOptions(const RecordData &Record, bool Complain,
5301 ASTReaderListener &Listener,
5302 bool AllowCompatibleDifferences) {
5303 unsigned Idx = 0;
5304 TargetOptions TargetOpts;
5305 TargetOpts.Triple = ReadString(Record, Idx);
5306 TargetOpts.CPU = ReadString(Record, Idx);
5307 TargetOpts.ABI = ReadString(Record, Idx);
5308 for (unsigned N = Record[Idx++]; N; --N) {
5309 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx));
5310 }
5311 for (unsigned N = Record[Idx++]; N; --N) {
5312 TargetOpts.Features.push_back(ReadString(Record, Idx));
5313 }
5314
5315 return Listener.ReadTargetOptions(TargetOpts, Complain,
5316 AllowCompatibleDifferences);
5317}
5318
5319bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain,
5320 ASTReaderListener &Listener) {
5321 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions);
5322 unsigned Idx = 0;
5323#define DIAGOPT(Name, Bits, Default) DiagOpts->Name = Record[Idx++];
5324#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
5325 DiagOpts->set##Name(static_cast<Type>(Record[Idx++]));
5326#include "clang/Basic/DiagnosticOptions.def"
5327
5328 for (unsigned N = Record[Idx++]; N; --N)
5329 DiagOpts->Warnings.push_back(ReadString(Record, Idx));
5330 for (unsigned N = Record[Idx++]; N; --N)
5331 DiagOpts->Remarks.push_back(ReadString(Record, Idx));
5332
5333 return Listener.ReadDiagnosticOptions(DiagOpts, Complain);
5334}
5335
5336bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain,
5337 ASTReaderListener &Listener) {
5338 FileSystemOptions FSOpts;
5339 unsigned Idx = 0;
5340 FSOpts.WorkingDir = ReadString(Record, Idx);
5341 return Listener.ReadFileSystemOptions(FSOpts, Complain);
5342}
5343
5344bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record,
5345 bool Complain,
5346 ASTReaderListener &Listener) {
5347 HeaderSearchOptions HSOpts;
5348 unsigned Idx = 0;
5349 HSOpts.Sysroot = ReadString(Record, Idx);
5350
5351 // Include entries.
5352 for (unsigned N = Record[Idx++]; N; --N) {
5353 std::string Path = ReadString(Record, Idx);
5354 frontend::IncludeDirGroup Group
5355 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]);
5356 bool IsFramework = Record[Idx++];
5357 bool IgnoreSysRoot = Record[Idx++];
5358 HSOpts.UserEntries.emplace_back(std::move(Path), Group, IsFramework,
5359 IgnoreSysRoot);
5360 }
5361
5362 // System header prefixes.
5363 for (unsigned N = Record[Idx++]; N; --N) {
5364 std::string Prefix = ReadString(Record, Idx);
5365 bool IsSystemHeader = Record[Idx++];
5366 HSOpts.SystemHeaderPrefixes.emplace_back(std::move(Prefix), IsSystemHeader);
5367 }
5368
5369 HSOpts.ResourceDir = ReadString(Record, Idx);
5370 HSOpts.ModuleCachePath = ReadString(Record, Idx);
5371 HSOpts.ModuleUserBuildPath = ReadString(Record, Idx);
5372 HSOpts.DisableModuleHash = Record[Idx++];
5373 HSOpts.ImplicitModuleMaps = Record[Idx++];
5374 HSOpts.ModuleMapFileHomeIsCwd = Record[Idx++];
5375 HSOpts.UseBuiltinIncludes = Record[Idx++];
5376 HSOpts.UseStandardSystemIncludes = Record[Idx++];
5377 HSOpts.UseStandardCXXIncludes = Record[Idx++];
5378 HSOpts.UseLibcxx = Record[Idx++];
5379 std::string SpecificModuleCachePath = ReadString(Record, Idx);
5380
5381 return Listener.ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
5382 Complain);
5383}
5384
5385bool ASTReader::ParsePreprocessorOptions(const RecordData &Record,
5386 bool Complain,
5387 ASTReaderListener &Listener,
5388 std::string &SuggestedPredefines) {
5389 PreprocessorOptions PPOpts;
5390 unsigned Idx = 0;
5391
5392 // Macro definitions/undefs
5393 for (unsigned N = Record[Idx++]; N; --N) {
5394 std::string Macro = ReadString(Record, Idx);
5395 bool IsUndef = Record[Idx++];
5396 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef));
5397 }
5398
5399 // Includes
5400 for (unsigned N = Record[Idx++]; N; --N) {
5401 PPOpts.Includes.push_back(ReadString(Record, Idx));
5402 }
5403
5404 // Macro Includes
5405 for (unsigned N = Record[Idx++]; N; --N) {
5406 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx));
5407 }
5408
5409 PPOpts.UsePredefines = Record[Idx++];
5410 PPOpts.DetailedRecord = Record[Idx++];
5411 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx);
5412 PPOpts.ObjCXXARCStandardLibrary =
5413 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]);
5414 SuggestedPredefines.clear();
5415 return Listener.ReadPreprocessorOptions(PPOpts, Complain,
5416 SuggestedPredefines);
5417}
5418
5419std::pair<ModuleFile *, unsigned>
5420ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) {
5421 GlobalPreprocessedEntityMapType::iterator
5422 I = GlobalPreprocessedEntityMap.find(GlobalIndex);
5423 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 5424, __PRETTY_FUNCTION__))
5424 "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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 5424, __PRETTY_FUNCTION__))
;
5425 ModuleFile *M = I->second;
5426 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID;
5427 return std::make_pair(M, LocalIndex);
5428}
5429
5430llvm::iterator_range<PreprocessingRecord::iterator>
5431ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const {
5432 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
5433 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID,
5434 Mod.NumPreprocessedEntities);
5435
5436 return llvm::make_range(PreprocessingRecord::iterator(),
5437 PreprocessingRecord::iterator());
5438}
5439
5440llvm::iterator_range<ASTReader::ModuleDeclIterator>
5441ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) {
5442 return llvm::make_range(
5443 ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls),
5444 ModuleDeclIterator(this, &Mod,
5445 Mod.FileSortedDecls + Mod.NumFileSortedDecls));
5446}
5447
5448SourceRange ASTReader::ReadSkippedRange(unsigned GlobalIndex) {
5449 auto I = GlobalSkippedRangeMap.find(GlobalIndex);
5450 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 5451, __PRETTY_FUNCTION__))
5451 "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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 5451, __PRETTY_FUNCTION__))
;
5452 ModuleFile *M = I->second;
5453 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedSkippedRangeID;
5454 assert(LocalIndex < M->NumPreprocessedSkippedRanges)((LocalIndex < M->NumPreprocessedSkippedRanges) ? static_cast
<void> (0) : __assert_fail ("LocalIndex < M->NumPreprocessedSkippedRanges"
, "/build/llvm-toolchain-snapshot-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 5454, __PRETTY_FUNCTION__))
;
5455 PPSkippedRange RawRange = M->PreprocessedSkippedRangeOffsets[LocalIndex];
5456 SourceRange Range(TranslateSourceLocation(*M, RawRange.getBegin()),
5457 TranslateSourceLocation(*M, RawRange.getEnd()));
5458 assert(Range.isValid())((Range.isValid()) ? static_cast<void> (0) : __assert_fail
("Range.isValid()", "/build/llvm-toolchain-snapshot-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 5458, __PRETTY_FUNCTION__))
;
5459 return Range;
5460}
5461
5462PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) {
5463 PreprocessedEntityID PPID = Index+1;
5464 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
5465 ModuleFile &M = *PPInfo.first;
5466 unsigned LocalIndex = PPInfo.second;
5467 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
5468
5469 if (!PP.getPreprocessingRecord()) {
5470 Error("no preprocessing record");
5471 return nullptr;
5472 }
5473
5474 SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor);
5475 M.PreprocessorDetailCursor.JumpToBit(PPOffs.BitOffset);
5476
5477 llvm::BitstreamEntry Entry =
5478 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
5479 if (Entry.Kind != llvm::BitstreamEntry::Record)
5480 return nullptr;
5481
5482 // Read the record.
5483 SourceRange Range(TranslateSourceLocation(M, PPOffs.getBegin()),
5484 TranslateSourceLocation(M, PPOffs.getEnd()));
5485 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
5486 StringRef Blob;
5487 RecordData Record;
5488 PreprocessorDetailRecordTypes RecType =
5489 (PreprocessorDetailRecordTypes)M.PreprocessorDetailCursor.readRecord(
5490 Entry.ID, Record, &Blob);
5491 switch (RecType) {
5492 case PPD_MACRO_EXPANSION: {
5493 bool isBuiltin = Record[0];
5494 IdentifierInfo *Name = nullptr;
5495 MacroDefinitionRecord *Def = nullptr;
5496 if (isBuiltin)
5497 Name = getLocalIdentifier(M, Record[1]);
5498 else {
5499 PreprocessedEntityID GlobalID =
5500 getGlobalPreprocessedEntityID(M, Record[1]);
5501 Def = cast<MacroDefinitionRecord>(
5502 PPRec.getLoadedPreprocessedEntity(GlobalID - 1));
5503 }
5504
5505 MacroExpansion *ME;
5506 if (isBuiltin)
5507 ME = new (PPRec) MacroExpansion(Name, Range);
5508 else
5509 ME = new (PPRec) MacroExpansion(Def, Range);
5510
5511 return ME;
5512 }
5513
5514 case PPD_MACRO_DEFINITION: {
5515 // Decode the identifier info and then check again; if the macro is
5516 // still defined and associated with the identifier,
5517 IdentifierInfo *II = getLocalIdentifier(M, Record[0]);
5518 MacroDefinitionRecord *MD = new (PPRec) MacroDefinitionRecord(II, Range);
5519
5520 if (DeserializationListener)
5521 DeserializationListener->MacroDefinitionRead(PPID, MD);
5522
5523 return MD;
5524 }
5525
5526 case PPD_INCLUSION_DIRECTIVE: {
5527 const char *FullFileNameStart = Blob.data() + Record[0];
5528 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]);
5529 const FileEntry *File = nullptr;
5530 if (!FullFileName.empty())
5531 File = PP.getFileManager().getFile(FullFileName);
5532
5533 // FIXME: Stable encoding
5534 InclusionDirective::InclusionKind Kind
5535 = static_cast<InclusionDirective::InclusionKind>(Record[2]);
5536 InclusionDirective *ID
5537 = new (PPRec) InclusionDirective(PPRec, Kind,
5538 StringRef(Blob.data(), Record[0]),
5539 Record[1], Record[3],
5540 File,
5541 Range);
5542 return ID;
5543 }
5544 }
5545
5546 llvm_unreachable("Invalid PreprocessorDetailRecordTypes")::llvm::llvm_unreachable_internal("Invalid PreprocessorDetailRecordTypes"
, "/build/llvm-toolchain-snapshot-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 5546)
;
5547}
5548
5549/// Find the next module that contains entities and return the ID
5550/// of the first entry.
5551///
5552/// \param SLocMapI points at a chunk of a module that contains no
5553/// preprocessed entities or the entities it contains are not the ones we are
5554/// looking for.
5555PreprocessedEntityID ASTReader::findNextPreprocessedEntity(
5556 GlobalSLocOffsetMapType::const_iterator SLocMapI) const {
5557 ++SLocMapI;
5558 for (GlobalSLocOffsetMapType::const_iterator
5559 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
5560 ModuleFile &M = *SLocMapI->second;
5561 if (M.NumPreprocessedEntities)
5562 return M.BasePreprocessedEntityID;
5563 }
5564
5565 return getTotalNumPreprocessedEntities();
5566}
5567
5568namespace {
5569
5570struct PPEntityComp {
5571 const ASTReader &Reader;
5572 ModuleFile &M;
5573
5574 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) {}
5575
5576 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const {
5577 SourceLocation LHS = getLoc(L);
5578 SourceLocation RHS = getLoc(R);
5579 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
5580 }
5581
5582 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const {
5583 SourceLocation LHS = getLoc(L);
5584 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
5585 }
5586
5587 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const {
5588 SourceLocation RHS = getLoc(R);
5589 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
5590 }
5591
5592 SourceLocation getLoc(const PPEntityOffset &PPE) const {
5593 return Reader.TranslateSourceLocation(M, PPE.getBegin());
5594 }
5595};
5596
5597} // namespace
5598
5599PreprocessedEntityID ASTReader::findPreprocessedEntity(SourceLocation Loc,
5600 bool EndsAfter) const {
5601 if (SourceMgr.isLocalSourceLocation(Loc))
5602 return getTotalNumPreprocessedEntities();
5603
5604 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
5605 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
5606 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 5607, __PRETTY_FUNCTION__))
5607 "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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 5607, __PRETTY_FUNCTION__))
;
5608
5609 if (SLocMapI->second->NumPreprocessedEntities == 0)
5610 return findNextPreprocessedEntity(SLocMapI);
5611
5612 ModuleFile &M = *SLocMapI->second;
5613
5614 using pp_iterator = const PPEntityOffset *;
5615
5616 pp_iterator pp_begin = M.PreprocessedEntityOffsets;
5617 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities;
5618
5619 size_t Count = M.NumPreprocessedEntities;
5620 size_t Half;
5621 pp_iterator First = pp_begin;
5622 pp_iterator PPI;
5623
5624 if (EndsAfter) {
5625 PPI = std::upper_bound(pp_begin, pp_end, Loc,
5626 PPEntityComp(*this, M));
5627 } else {
5628 // Do a binary search manually instead of using std::lower_bound because
5629 // The end locations of entities may be unordered (when a macro expansion
5630 // is inside another macro argument), but for this case it is not important
5631 // whether we get the first macro expansion or its containing macro.
5632 while (Count > 0) {
5633 Half = Count / 2;
5634 PPI = First;
5635 std::advance(PPI, Half);
5636 if (SourceMgr.isBeforeInTranslationUnit(
5637 TranslateSourceLocation(M, PPI->getEnd()), Loc)) {
5638 First = PPI;
5639 ++First;
5640 Count = Count - Half - 1;
5641 } else
5642 Count = Half;
5643 }
5644 }
5645
5646 if (PPI == pp_end)
5647 return findNextPreprocessedEntity(SLocMapI);
5648
5649 return M.BasePreprocessedEntityID + (PPI - pp_begin);
5650}
5651
5652/// Returns a pair of [Begin, End) indices of preallocated
5653/// preprocessed entities that \arg Range encompasses.
5654std::pair<unsigned, unsigned>
5655 ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) {
5656 if (Range.isInvalid())
5657 return std::make_pair(0,0);
5658 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 5658, __PRETTY_FUNCTION__))
;
5659
5660 PreprocessedEntityID BeginID =
5661 findPreprocessedEntity(Range.getBegin(), false);
5662 PreprocessedEntityID EndID = findPreprocessedEntity(Range.getEnd(), true);
5663 return std::make_pair(BeginID, EndID);
5664}
5665
5666/// Optionally returns true or false if the preallocated preprocessed
5667/// entity with index \arg Index came from file \arg FID.
5668Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index,
5669 FileID FID) {
5670 if (FID.isInvalid())
5671 return false;
5672
5673 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
5674 ModuleFile &M = *PPInfo.first;
5675 unsigned LocalIndex = PPInfo.second;
5676 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
5677
5678 SourceLocation Loc = TranslateSourceLocation(M, PPOffs.getBegin());
5679 if (Loc.isInvalid())
5680 return false;
5681
5682 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
5683 return true;
5684 else
5685 return false;
5686}
5687
5688namespace {
5689
5690 /// Visitor used to search for information about a header file.
5691 class HeaderFileInfoVisitor {
5692 const FileEntry *FE;
5693 Optional<HeaderFileInfo> HFI;
5694
5695 public:
5696 explicit HeaderFileInfoVisitor(const FileEntry *FE) : FE(FE) {}
5697
5698 bool operator()(ModuleFile &M) {
5699 HeaderFileInfoLookupTable *Table
5700 = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable);
5701 if (!Table)
5702 return false;
5703
5704 // Look in the on-disk hash table for an entry for this file name.
5705 HeaderFileInfoLookupTable::iterator Pos = Table->find(FE);
5706 if (Pos == Table->end())
5707 return false;
5708
5709 HFI = *Pos;
5710 return true;
5711 }
5712
5713 Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; }
5714 };
5715
5716} // namespace
5717
5718HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) {
5719 HeaderFileInfoVisitor Visitor(FE);
5720 ModuleMgr.visit(Visitor);
5721 if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
5722 return *HFI;
5723
5724 return HeaderFileInfo();
5725}
5726
5727void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) {
5728 using DiagState = DiagnosticsEngine::DiagState;
5729 SmallVector<DiagState *, 32> DiagStates;
5730
5731 for (ModuleFile &F : ModuleMgr) {
5732 unsigned Idx = 0;
5733 auto &Record = F.PragmaDiagMappings;
5734 if (Record.empty())
5735 continue;
5736
5737 DiagStates.clear();
5738
5739 auto ReadDiagState =
5740 [&](const DiagState &BasedOn, SourceLocation Loc,
5741 bool IncludeNonPragmaStates) -> DiagnosticsEngine::DiagState * {
5742 unsigned BackrefID = Record[Idx++];
5743 if (BackrefID != 0)
5744 return DiagStates[BackrefID - 1];
5745
5746 // A new DiagState was created here.
5747 Diag.DiagStates.push_back(BasedOn);
5748 DiagState *NewState = &Diag.DiagStates.back();
5749 DiagStates.push_back(NewState);
5750 unsigned Size = Record[Idx++];
5751 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 5752, __PRETTY_FUNCTION__))
5752 "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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 5752, __PRETTY_FUNCTION__))
;
5753 while (Size--) {
5754 unsigned DiagID = Record[Idx++];
5755 DiagnosticMapping NewMapping =
5756 DiagnosticMapping::deserialize(Record[Idx++]);
5757 if (!NewMapping.isPragma() && !IncludeNonPragmaStates)
5758 continue;
5759
5760 DiagnosticMapping &Mapping = NewState->getOrAddMapping(DiagID);
5761
5762 // If this mapping was specified as a warning but the severity was
5763 // upgraded due to diagnostic settings, simulate the current diagnostic
5764 // settings (and use a warning).
5765 if (NewMapping.wasUpgradedFromWarning() && !Mapping.isErrorOrFatal()) {
5766 NewMapping.setSeverity(diag::Severity::Warning);
5767 NewMapping.setUpgradedFromWarning(false);
5768 }
5769
5770 Mapping = NewMapping;
5771 }
5772 return NewState;
5773 };
5774
5775 // Read the first state.
5776 DiagState *FirstState;
5777 if (F.Kind == MK_ImplicitModule) {
5778 // Implicitly-built modules are reused with different diagnostic
5779 // settings. Use the initial diagnostic state from Diag to simulate this
5780 // compilation's diagnostic settings.
5781 FirstState = Diag.DiagStatesByLoc.FirstDiagState;
5782 DiagStates.push_back(FirstState);
5783
5784 // Skip the initial diagnostic state from the serialized module.
5785 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 5786, __PRETTY_FUNCTION__))
5786 "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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 5786, __PRETTY_FUNCTION__))
;
5787 Idx = 3 + Record[2] * 2;
5788 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 5789, __PRETTY_FUNCTION__))
5789 "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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 5789, __PRETTY_FUNCTION__))
;
5790 } else if (F.isModule()) {
5791 // For an explicit module, preserve the flags from the module build
5792 // command line (-w, -Weverything, -Werror, ...) along with any explicit
5793 // -Wblah flags.
5794 unsigned Flags = Record[Idx++];
5795 DiagState Initial;
5796 Initial.SuppressSystemWarnings = Flags & 1; Flags >>= 1;
5797 Initial.ErrorsAsFatal = Flags & 1; Flags >>= 1;
5798 Initial.WarningsAsErrors = Flags & 1; Flags >>= 1;
5799 Initial.EnableAllWarnings = Flags & 1; Flags >>= 1;
5800 Initial.IgnoreAllWarnings = Flags & 1; Flags >>= 1;
5801 Initial.ExtBehavior = (diag::Severity)Flags;
5802 FirstState = ReadDiagState(Initial, SourceLocation(), true);
5803
5804 assert(F.OriginalSourceFileID.isValid())((F.OriginalSourceFileID.isValid()) ? static_cast<void>
(0) : __assert_fail ("F.OriginalSourceFileID.isValid()", "/build/llvm-toolchain-snapshot-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 5804, __PRETTY_FUNCTION__))
;
5805
5806 // Set up the root buffer of the module to start with the initial
5807 // diagnostic state of the module itself, to cover files that contain no
5808 // explicit transitions (for which we did not serialize anything).
5809 Diag.DiagStatesByLoc.Files[F.OriginalSourceFileID]
5810 .StateTransitions.push_back({FirstState, 0});
5811 } else {
5812 // For prefix ASTs, start with whatever the user configured on the
5813 // command line.
5814 Idx++; // Skip flags.
5815 FirstState = ReadDiagState(*Diag.DiagStatesByLoc.CurDiagState,
5816 SourceLocation(), false);
5817 }
5818
5819 // Read the state transitions.
5820 unsigned NumLocations = Record[Idx++];
5821 while (NumLocations--) {
5822 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 5823, __PRETTY_FUNCTION__))
5823 "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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 5823, __PRETTY_FUNCTION__))
;
5824 SourceLocation Loc = ReadSourceLocation(F, Record[Idx++]);
5825 auto IDAndOffset = SourceMgr.getDecomposedLoc(Loc);
5826 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 5826, __PRETTY_FUNCTION__))
;
5827 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 5827, __PRETTY_FUNCTION__))
;
5828 unsigned Transitions = Record[Idx++];
5829
5830 // Note that we don't need to set up Parent/ParentOffset here, because
5831 // we won't be changing the diagnostic state within imported FileIDs
5832 // (other than perhaps appending to the main source file, which has no
5833 // parent).
5834 auto &F = Diag.DiagStatesByLoc.Files[IDAndOffset.first];
5835 F.StateTransitions.reserve(F.StateTransitions.size() + Transitions);
5836 for (unsigned I = 0; I != Transitions; ++I) {
5837 unsigned Offset = Record[Idx++];
5838 auto *State =
5839 ReadDiagState(*FirstState, Loc.getLocWithOffset(Offset), false);
5840 F.StateTransitions.push_back({State, Offset});
5841 }
5842 }
5843
5844 // Read the final state.
5845 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 5846, __PRETTY_FUNCTION__))
5846 "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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 5846, __PRETTY_FUNCTION__))
;
5847 SourceLocation CurStateLoc =
5848 ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]);
5849 auto *CurState = ReadDiagState(*FirstState, CurStateLoc, false);
5850
5851 if (!F.isModule()) {
5852 Diag.DiagStatesByLoc.CurDiagState = CurState;
5853 Diag.DiagStatesByLoc.CurDiagStateLoc = CurStateLoc;
5854
5855 // Preserve the property that the imaginary root file describes the
5856 // current state.
5857 FileID NullFile;
5858 auto &T = Diag.DiagStatesByLoc.Files[NullFile].StateTransitions;
5859 if (T.empty())
5860 T.push_back({CurState, 0});
5861 else
5862 T[0].State = CurState;
5863 }
5864
5865 // Don't try to read these mappings again.
5866 Record.clear();
5867 }
5868}
5869
5870/// Get the correct cursor and offset for loading a type.
5871ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) {
5872 GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index);
5873 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 5873, __PRETTY_FUNCTION__))
;
5874 ModuleFile *M = I->second;
5875 return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex]);
5876}
5877
5878/// Read and return the type with the given index..
5879///
5880/// The index is the type ID, shifted and minus the number of predefs. This
5881/// routine actually reads the record corresponding to the type at the given
5882/// location. It is a helper routine for GetType, which deals with reading type
5883/// IDs.
5884QualType ASTReader::readTypeRecord(unsigned Index) {
5885 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 5885, __PRETTY_FUNCTION__))
;
5886 ASTContext &Context = *ContextObj;
5887 RecordLocation Loc = TypeCursorForIndex(Index);
5888 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
5889
5890 // Keep track of where we are in the stream, then jump back there
5891 // after reading this type.
5892 SavedStreamPosition SavedPosition(DeclsCursor);
5893
5894 ReadingKindTracker ReadingKind(Read_Type, *this);
5895
5896 // Note that we are loading a type record.
5897 Deserializing AType(this);
5898
5899 unsigned Idx = 0;
5900 DeclsCursor.JumpToBit(Loc.Offset);
5901 RecordData Record;
5902 unsigned Code = DeclsCursor.ReadCode();
5903 switch ((TypeCode)DeclsCursor.readRecord(Code, Record)) {
5904 case TYPE_EXT_QUAL: {
5905 if (Record.size() != 2) {
5906 Error("Incorrect encoding of extended qualifier type");
5907 return QualType();
5908 }
5909 QualType Base = readType(*Loc.F, Record, Idx);
5910 Qualifiers Quals = Qualifiers::fromOpaqueValue(Record[Idx++]);
5911 return Context.getQualifiedType(Base, Quals);
5912 }
5913
5914 case TYPE_COMPLEX: {
5915 if (Record.size() != 1) {
5916 Error("Incorrect encoding of complex type");
5917 return QualType();
5918 }
5919 QualType ElemType = readType(*Loc.F, Record, Idx);
5920 return Context.getComplexType(ElemType);
5921 }
5922
5923 case TYPE_POINTER: {
5924 if (Record.size() != 1) {
5925 Error("Incorrect encoding of pointer type");
5926 return QualType();
5927 }
5928 QualType PointeeType = readType(*Loc.F, Record, Idx);
5929 return Context.getPointerType(PointeeType);
5930 }
5931
5932 case TYPE_DECAYED: {
5933 if (Record.size() != 1) {
5934 Error("Incorrect encoding of decayed type");
5935 return QualType();
5936 }
5937 QualType OriginalType = readType(*Loc.F, Record, Idx);
5938 QualType DT = Context.getAdjustedParameterType(OriginalType);
5939 if (!isa<DecayedType>(DT))
5940 Error("Decayed type does not decay");
5941 return DT;
5942 }
5943
5944 case TYPE_ADJUSTED: {
5945 if (Record.size() != 2) {
5946 Error("Incorrect encoding of adjusted type");
5947 return QualType();
5948 }
5949 QualType OriginalTy = readType(*Loc.F, Record, Idx);
5950 QualType AdjustedTy = readType(*Loc.F, Record, Idx);
5951 return Context.getAdjustedType(OriginalTy, AdjustedTy);
5952 }
5953
5954 case TYPE_BLOCK_POINTER: {
5955 if (Record.size() != 1) {
5956 Error("Incorrect encoding of block pointer type");
5957 return QualType();
5958 }
5959 QualType PointeeType = readType(*Loc.F, Record, Idx);
5960 return Context.getBlockPointerType(PointeeType);
5961 }
5962
5963 case TYPE_LVALUE_REFERENCE: {
5964 if (Record.size() != 2) {
5965 Error("Incorrect encoding of lvalue reference type");
5966 return QualType();
5967 }
5968 QualType PointeeType = readType(*Loc.F, Record, Idx);
5969 return Context.getLValueReferenceType(PointeeType, Record[1]);
5970 }
5971
5972 case TYPE_RVALUE_REFERENCE: {
5973 if (Record.size() != 1) {
5974 Error("Incorrect encoding of rvalue reference type");
5975 return QualType();
5976 }
5977 QualType PointeeType = readType(*Loc.F, Record, Idx);
5978 return Context.getRValueReferenceType(PointeeType);
5979 }
5980
5981 case TYPE_MEMBER_POINTER: {
5982 if (Record.size() != 2) {
5983 Error("Incorrect encoding of member pointer type");
5984 return QualType();
5985 }
5986 QualType PointeeType = readType(*Loc.F, Record, Idx);
5987 QualType ClassType = readType(*Loc.F, Record, Idx);
5988 if (PointeeType.isNull() || ClassType.isNull())
5989 return QualType();
5990
5991 return Context.getMemberPointerType(PointeeType, ClassType.getTypePtr());
5992 }
5993
5994 case TYPE_CONSTANT_ARRAY: {
5995 QualType ElementType = readType(*Loc.F, Record, Idx);
5996 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5997 unsigned IndexTypeQuals = Record[2];
5998 unsigned Idx = 3;
5999 llvm::APInt Size = ReadAPInt(Record, Idx);
6000 return Context.getConstantArrayType(ElementType, Size,
6001 ASM, IndexTypeQuals);
6002 }
6003
6004 case TYPE_INCOMPLETE_ARRAY: {
6005 QualType ElementType = readType(*Loc.F, Record, Idx);
6006 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
6007 unsigned IndexTypeQuals = Record[2];
6008 return Context.getIncompleteArrayType(ElementType, ASM, IndexTypeQuals);
6009 }
6010
6011 case TYPE_VARIABLE_ARRAY: {
6012 QualType ElementType = readType(*Loc.F, Record, Idx);
6013 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
6014 unsigned IndexTypeQuals = Record[2];
6015 SourceLocation LBLoc = ReadSourceLocation(*Loc.F, Record[3]);
6016 SourceLocation RBLoc = ReadSourceLocation(*Loc.F, Record[4]);
6017 return Context.getVariableArrayType(ElementType, ReadExpr(*Loc.F),
6018 ASM, IndexTypeQuals,
6019 SourceRange(LBLoc, RBLoc));
6020 }
6021
6022 case TYPE_VECTOR: {
6023 if (Record.size() != 3) {
6024 Error("incorrect encoding of vector type in AST file");
6025 return QualType();
6026 }
6027
6028 QualType ElementType = readType(*Loc.F, Record, Idx);
6029 unsigned NumElements = Record[1];
6030 unsigned VecKind = Record[2];
6031 return Context.getVectorType(ElementType, NumElements,
6032 (VectorType::VectorKind)VecKind);
6033 }
6034
6035 case TYPE_EXT_VECTOR: {
6036 if (Record.size() != 3) {
6037 Error("incorrect encoding of extended vector type in AST file");
6038 return QualType();
6039 }
6040
6041 QualType ElementType = readType(*Loc.F, Record, Idx);
6042 unsigned NumElements = Record[1];
6043 return Context.getExtVectorType(ElementType, NumElements);
6044 }
6045
6046 case TYPE_FUNCTION_NO_PROTO: {
6047 if (Record.size() != 8) {
6048 Error("incorrect encoding of no-proto function type");
6049 return QualType();
6050 }
6051 QualType ResultType = readType(*Loc.F, Record, Idx);
6052 FunctionType::ExtInfo Info(Record[1], Record[2], Record[3],
6053 (CallingConv)Record[4], Record[5], Record[6],
6054 Record[7]);
6055 return Context.getFunctionNoProtoType(ResultType, Info);
6056 }
6057
6058 case TYPE_FUNCTION_PROTO: {
6059 QualType ResultType = readType(*Loc.F, Record, Idx);
6060
6061 FunctionProtoType::ExtProtoInfo EPI;
6062 EPI.ExtInfo = FunctionType::ExtInfo(/*noreturn*/ Record[1],
6063 /*hasregparm*/ Record[2],
6064 /*regparm*/ Record[3],
6065 static_cast<CallingConv>(Record[4]),
6066 /*produces*/ Record[5],
6067 /*nocallersavedregs*/ Record[6],
6068 /*nocfcheck*/ Record[7]);
6069
6070 unsigned Idx = 8;
6071
6072 EPI.Variadic = Record[Idx++];
6073 EPI.HasTrailingReturn = Record[Idx++];
6074 EPI.TypeQuals = Qualifiers::fromOpaqueValue(Record[Idx++]);
6075 EPI.RefQualifier = static_cast<RefQualifierKind>(Record[Idx++]);
6076 SmallVector<QualType, 8> ExceptionStorage;
6077 readExceptionSpec(*Loc.F, ExceptionStorage, EPI.ExceptionSpec, Record, Idx);
6078
6079 unsigned NumParams = Record[Idx++];
6080 SmallVector<QualType, 16> ParamTypes;
6081 for (unsigned I = 0; I != NumParams; ++I)
6082 ParamTypes.push_back(readType(*Loc.F, Record, Idx));
6083
6084 SmallVector<FunctionProtoType::ExtParameterInfo, 4> ExtParameterInfos;
6085 if (Idx != Record.size()) {
6086 for (unsigned I = 0; I != NumParams; ++I)
6087 ExtParameterInfos.push_back(
6088 FunctionProtoType::ExtParameterInfo
6089 ::getFromOpaqueValue(Record[Idx++]));
6090 EPI.ExtParameterInfos = ExtParameterInfos.data();
6091 }
6092
6093 assert(Idx == Record.size())((Idx == Record.size()) ? static_cast<void> (0) : __assert_fail
("Idx == Record.size()", "/build/llvm-toolchain-snapshot-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 6093, __PRETTY_FUNCTION__))
;
6094
6095 return Context.getFunctionType(ResultType, ParamTypes, EPI);
6096 }
6097
6098 case TYPE_UNRESOLVED_USING: {
6099 unsigned Idx = 0;
6100 return Context.getTypeDeclType(
6101 ReadDeclAs<UnresolvedUsingTypenameDecl>(*Loc.F, Record, Idx));
6102 }
6103
6104 case TYPE_TYPEDEF: {
6105 if (Record.size() != 2) {
6106 Error("incorrect encoding of typedef type");
6107 return QualType();
6108 }
6109 unsigned Idx = 0;
6110 TypedefNameDecl *Decl = ReadDeclAs<TypedefNameDecl>(*Loc.F, Record, Idx);
6111 QualType Canonical = readType(*Loc.F, Record, Idx);
6112 if (!Canonical.isNull())
6113 Canonical = Context.getCanonicalType(Canonical);
6114 return Context.getTypedefType(Decl, Canonical);
6115 }
6116
6117 case TYPE_TYPEOF_EXPR:
6118 return Context.getTypeOfExprType(ReadExpr(*Loc.F));
6119
6120 case TYPE_TYPEOF: {
6121 if (Record.size() != 1) {
6122 Error("incorrect encoding of typeof(type) in AST file");
6123 return QualType();
6124 }
6125 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
6126 return Context.getTypeOfType(UnderlyingType);
6127 }
6128
6129 case TYPE_DECLTYPE: {
6130 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
6131 return Context.getDecltypeType(ReadExpr(*Loc.F), UnderlyingType);
6132 }
6133
6134 case TYPE_UNARY_TRANSFORM: {
6135 QualType BaseType = readType(*Loc.F, Record, Idx);
6136 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
6137 UnaryTransformType::UTTKind UKind = (UnaryTransformType::UTTKind)Record[2];
6138 return Context.getUnaryTransformType(BaseType, UnderlyingType, UKind);
6139 }
6140
6141 case TYPE_AUTO: {
6142 QualType Deduced = readType(*Loc.F, Record, Idx);
6143 AutoTypeKeyword Keyword = (AutoTypeKeyword)Record[Idx++];
6144 bool IsDependent = Deduced.isNull() ? Record[Idx++] : false;
6145 return Context.getAutoType(Deduced, Keyword, IsDependent);
6146 }
6147
6148 case TYPE_DEDUCED_TEMPLATE_SPECIALIZATION: {
6149 TemplateName Name = ReadTemplateName(*Loc.F, Record, Idx);
6150 QualType Deduced = readType(*Loc.F, Record, Idx);
6151 bool IsDependent = Deduced.isNull() ? Record[Idx++] : false;
6152 return Context.getDeducedTemplateSpecializationType(Name, Deduced,
6153 IsDependent);
6154 }
6155
6156 case TYPE_RECORD: {
6157 if (Record.size() != 2) {
6158 Error("incorrect encoding of record type");
6159 return QualType();
6160 }
6161 unsigned Idx = 0;
6162 bool IsDependent = Record[Idx++];
6163 RecordDecl *RD = ReadDeclAs<RecordDecl>(*Loc.F, Record, Idx);
6164 RD = cast_or_null<RecordDecl>(RD->getCanonicalDecl());
6165 QualType T = Context.getRecordType(RD);
6166 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
6167 return T;
6168 }
6169
6170 case TYPE_ENUM: {
6171 if (Record.size() != 2) {
6172 Error("incorrect encoding of enum type");
6173 return QualType();
6174 }
6175 unsigned Idx = 0;
6176 bool IsDependent = Record[Idx++];
6177 QualType T
6178 = Context.getEnumType(ReadDeclAs<EnumDecl>(*Loc.F, Record, Idx));
6179 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
6180 return T;
6181 }
6182
6183 case TYPE_ATTRIBUTED: {
6184 if (Record.size() != 3) {
6185 Error("incorrect encoding of attributed type");
6186 return QualType();
6187 }
6188 QualType modifiedType = readType(*Loc.F, Record, Idx);
6189 QualType equivalentType = readType(*Loc.F, Record, Idx);
6190 AttributedType::Kind kind = static_cast<AttributedType::Kind>(Record[2]);
6191 return Context.getAttributedType(kind, modifiedType, equivalentType);
6192 }
6193
6194 case TYPE_PAREN: {
6195 if (Record.size() != 1) {
6196 Error("incorrect encoding of paren type");
6197 return QualType();
6198 }
6199 QualType InnerType = readType(*Loc.F, Record, Idx);
6200 return Context.getParenType(InnerType);
6201 }
6202
6203 case TYPE_MACRO_QUALIFIED: {
6204 if (Record.size() != 2) {
6205 Error("incorrect encoding of macro defined type");
6206 return QualType();
6207 }
6208 QualType UnderlyingTy = readType(*Loc.F, Record, Idx);
6209 IdentifierInfo *MacroII = GetIdentifierInfo(*Loc.F, Record, Idx);
6210 return Context.getMacroQualifiedType(UnderlyingTy, MacroII);
6211 }
6212
6213 case TYPE_PACK_EXPANSION: {
6214 if (Record.size() != 2) {
6215 Error("incorrect encoding of pack expansion type");
6216 return QualType();
6217 }
6218 QualType Pattern = readType(*Loc.F, Record, Idx);
6219 if (Pattern.isNull())
6220 return QualType();
6221 Optional<unsigned> NumExpansions;
6222 if (Record[1])
6223 NumExpansions = Record[1] - 1;
6224 return Context.getPackExpansionType(Pattern, NumExpansions);
6225 }
6226
6227 case TYPE_ELABORATED: {
6228 unsigned Idx = 0;
6229 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
6230 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
6231 QualType NamedType = readType(*Loc.F, Record, Idx);
6232 TagDecl *OwnedTagDecl = ReadDeclAs<TagDecl>(*Loc.F, Record, Idx);
6233 return Context.getElaboratedType(Keyword, NNS, NamedType, OwnedTagDecl);
6234 }
6235
6236 case TYPE_OBJC_INTERFACE: {
6237 unsigned Idx = 0;
6238 ObjCInterfaceDecl *ItfD
6239 = ReadDeclAs<ObjCInterfaceDecl>(*Loc.F, Record, Idx);
6240 return Context.getObjCInterfaceType(ItfD->getCanonicalDecl());
6241 }
6242
6243 case TYPE_OBJC_TYPE_PARAM: {
6244 unsigned Idx = 0;
6245 ObjCTypeParamDecl *Decl
6246 = ReadDeclAs<ObjCTypeParamDecl>(*Loc.F, Record, Idx);
6247 unsigned NumProtos = Record[Idx++];
6248 SmallVector<ObjCProtocolDecl*, 4> Protos;
6249 for (unsigned I = 0; I != NumProtos; ++I)
6250 Protos.push_back(ReadDeclAs<ObjCProtocolDecl>(*Loc.F, Record, Idx));
6251 return Context.getObjCTypeParamType(Decl, Protos);
6252 }
6253
6254 case TYPE_OBJC_OBJECT: {
6255 unsigned Idx = 0;
6256 QualType Base = readType(*Loc.F, Record, Idx);
6257 unsigned NumTypeArgs = Record[Idx++];
6258 SmallVector<QualType, 4> TypeArgs;
6259 for (unsigned I = 0; I != NumTypeArgs; ++I)
6260 TypeArgs.push_back(readType(*Loc.F, Record, Idx));
6261 unsigned NumProtos = Record[Idx++];
6262 SmallVector<ObjCProtocolDecl*, 4> Protos;
6263 for (unsigned I = 0; I != NumProtos; ++I)
6264 Protos.push_back(ReadDeclAs<ObjCProtocolDecl>(*Loc.F, Record, Idx));
6265 bool IsKindOf = Record[Idx++];
6266 return Context.getObjCObjectType(Base, TypeArgs, Protos, IsKindOf);
6267 }
6268
6269 case TYPE_OBJC_OBJECT_POINTER: {
6270 unsigned Idx = 0;
6271 QualType Pointee = readType(*Loc.F, Record, Idx);
6272 return Context.getObjCObjectPointerType(Pointee);
6273 }
6274
6275 case TYPE_SUBST_TEMPLATE_TYPE_PARM: {
6276 unsigned Idx = 0;
6277 QualType Parm = readType(*Loc.F, Record, Idx);
6278 QualType Replacement = readType(*Loc.F, Record, Idx);
6279 return Context.getSubstTemplateTypeParmType(
6280 cast<TemplateTypeParmType>(Parm),
6281 Context.getCanonicalType(Replacement));
6282 }
6283
6284 case TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK: {
6285 unsigned Idx = 0;
6286 QualType Parm = readType(*Loc.F, Record, Idx);
6287 TemplateArgument ArgPack = ReadTemplateArgument(*Loc.F, Record, Idx);
6288 return Context.getSubstTemplateTypeParmPackType(
6289 cast<TemplateTypeParmType>(Parm),
6290 ArgPack);
6291 }
6292
6293 case TYPE_INJECTED_CLASS_NAME: {
6294 CXXRecordDecl *D = ReadDeclAs<CXXRecordDecl>(*Loc.F, Record, Idx);
6295 QualType TST = readType(*Loc.F, Record, Idx); // probably derivable
6296 // FIXME: ASTContext::getInjectedClassNameType is not currently suitable
6297 // for AST reading, too much interdependencies.
6298 const Type *T = nullptr;
6299 for (auto *DI = D; DI; DI = DI->getPreviousDecl()) {
6300 if (const Type *Existing = DI->getTypeForDecl()) {
6301 T = Existing;
6302 break;
6303 }
6304 }
6305 if (!T) {
6306 T = new (Context, TypeAlignment) InjectedClassNameType(D, TST);
6307 for (auto *DI = D; DI; DI = DI->getPreviousDecl())
6308 DI->setTypeForDecl(T);
6309 }
6310 return QualType(T, 0);
6311 }
6312
6313 case TYPE_TEMPLATE_TYPE_PARM: {
6314 unsigned Idx = 0;
6315 unsigned Depth = Record[Idx++];
6316 unsigned Index = Record[Idx++];
6317 bool Pack = Record[Idx++];
6318 TemplateTypeParmDecl *D
6319 = ReadDeclAs<TemplateTypeParmDecl>(*Loc.F, Record, Idx);
6320 return Context.getTemplateTypeParmType(Depth, Index, Pack, D);
6321 }
6322
6323 case TYPE_DEPENDENT_NAME: {
6324 unsigned Idx = 0;
6325 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
6326 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
6327 const IdentifierInfo *Name = GetIdentifierInfo(*Loc.F, Record, Idx);
6328 QualType Canon = readType(*Loc.F, Record, Idx);
6329 if (!Canon.isNull())
6330 Canon = Context.getCanonicalType(Canon);
6331 return Context.getDependentNameType(Keyword, NNS, Name, Canon);
6332 }
6333
6334 case TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION: {
6335 unsigned Idx = 0;
6336 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
6337 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
6338 const IdentifierInfo *Name = GetIdentifierInfo(*Loc.F, Record, Idx);
6339 unsigned NumArgs = Record[Idx++];
6340 SmallVector<TemplateArgument, 8> Args;
6341 Args.reserve(NumArgs);
6342 while (NumArgs--)
6343 Args.push_back(ReadTemplateArgument(*Loc.F, Record, Idx));
6344 return Context.getDependentTemplateSpecializationType(Keyword, NNS, Name,
6345 Args);
6346 }
6347
6348 case TYPE_DEPENDENT_SIZED_ARRAY: {
6349 unsigned Idx = 0;
6350
6351 // ArrayType
6352 QualType ElementType = readType(*Loc.F, Record, Idx);
6353 ArrayType::ArraySizeModifier ASM
6354 = (ArrayType::ArraySizeModifier)Record[Idx++];
6355 unsigned IndexTypeQuals = Record[Idx++];
6356
6357 // DependentSizedArrayType
6358 Expr *NumElts = ReadExpr(*Loc.F);
6359 SourceRange Brackets = ReadSourceRange(*Loc.F, Record, Idx);
6360
6361 return Context.getDependentSizedArrayType(ElementType, NumElts, ASM,
6362 IndexTypeQuals, Brackets);
6363 }
6364
6365 case TYPE_TEMPLATE_SPECIALIZATION: {
6366 unsigned Idx = 0;
6367 bool IsDependent = Record[Idx++];
6368 TemplateName Name = ReadTemplateName(*Loc.F, Record, Idx);
6369 SmallVector<TemplateArgument, 8> Args;
6370 ReadTemplateArgumentList(Args, *Loc.F, Record, Idx);
6371 QualType Underlying = readType(*Loc.F, Record, Idx);
6372 QualType T;
6373 if (Underlying.isNull())
6374 T = Context.getCanonicalTemplateSpecializationType(Name, Args);
6375 else
6376 T = Context.getTemplateSpecializationType(Name, Args, Underlying);
6377 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
6378 return T;
6379 }
6380
6381 case TYPE_ATOMIC: {
6382 if (Record.size() != 1) {
6383 Error("Incorrect encoding of atomic type");
6384 return QualType();
6385 }
6386 QualType ValueType = readType(*Loc.F, Record, Idx);
6387 return Context.getAtomicType(ValueType);
6388 }
6389
6390 case TYPE_PIPE: {
6391 if (Record.size() != 2) {
6392 Error("Incorrect encoding of pipe type");
6393 return QualType();
6394 }
6395
6396 // Reading the pipe element type.
6397 QualType ElementType = readType(*Loc.F, Record, Idx);
6398 unsigned ReadOnly = Record[1];
6399 return Context.getPipeType(ElementType, ReadOnly);
6400 }
6401
6402 case TYPE_DEPENDENT_SIZED_VECTOR: {
6403 unsigned Idx = 0;
6404 QualType ElementType = readType(*Loc.F, Record, Idx);
6405 Expr *SizeExpr = ReadExpr(*Loc.F);
6406 SourceLocation AttrLoc = ReadSourceLocation(*Loc.F, Record, Idx);
6407 unsigned VecKind = Record[Idx];
6408
6409 return Context.getDependentVectorType(ElementType, SizeExpr, AttrLoc,
6410 (VectorType::VectorKind)VecKind);
6411 }
6412
6413 case TYPE_DEPENDENT_SIZED_EXT_VECTOR: {
6414 unsigned Idx = 0;
6415
6416 // DependentSizedExtVectorType
6417 QualType ElementType = readType(*Loc.F, Record, Idx);
6418 Expr *SizeExpr = ReadExpr(*Loc.F);
6419 SourceLocation AttrLoc = ReadSourceLocation(*Loc.F, Record, Idx);
6420
6421 return Context.getDependentSizedExtVectorType(ElementType, SizeExpr,
6422 AttrLoc);
6423 }
6424
6425 case TYPE_DEPENDENT_ADDRESS_SPACE: {
6426 unsigned Idx = 0;
6427
6428 // DependentAddressSpaceType
6429 QualType PointeeType = readType(*Loc.F, Record, Idx);
6430 Expr *AddrSpaceExpr = ReadExpr(*Loc.F);
6431 SourceLocation AttrLoc = ReadSourceLocation(*Loc.F, Record, Idx);
6432
6433 return Context.getDependentAddressSpaceType(PointeeType, AddrSpaceExpr,
6434 AttrLoc);
6435 }
6436 }
6437 llvm_unreachable("Invalid TypeCode!")::llvm::llvm_unreachable_internal("Invalid TypeCode!", "/build/llvm-toolchain-snapshot-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 6437)
;
6438}
6439
6440void ASTReader::readExceptionSpec(ModuleFile &ModuleFile,
6441 SmallVectorImpl<QualType> &Exceptions,
6442 FunctionProtoType::ExceptionSpecInfo &ESI,
6443 const RecordData &Record, unsigned &Idx) {
6444 ExceptionSpecificationType EST =
6445 static_cast<ExceptionSpecificationType>(Record[Idx++]);
6446 ESI.Type = EST;
6447 if (EST == EST_Dynamic) {
6448 for (unsigned I = 0, N = Record[Idx++]; I != N; ++I)
6449 Exceptions.push_back(readType(ModuleFile, Record, Idx));
6450 ESI.Exceptions = Exceptions;
6451 } else if (isComputedNoexcept(EST)) {
6452 ESI.NoexceptExpr = ReadExpr(ModuleFile);
6453 } else if (EST == EST_Uninstantiated) {
6454 ESI.SourceDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
6455 ESI.SourceTemplate = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
6456 } else if (EST == EST_Unevaluated) {
6457 ESI.SourceDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
6458 }
6459}
6460
6461namespace clang {
6462
6463class TypeLocReader : public TypeLocVisitor<TypeLocReader> {
6464 ModuleFile *F;
6465 ASTReader *Reader;
6466 const ASTReader::RecordData &Record;
6467 unsigned &Idx;
6468
6469 SourceLocation ReadSourceLocation() {
6470 return Reader->ReadSourceLocation(*F, Record, Idx);
6471 }
6472
6473 TypeSourceInfo *GetTypeSourceInfo() {
6474 return Reader->GetTypeSourceInfo(*F, Record, Idx);
6475 }
6476
6477 NestedNameSpecifierLoc ReadNestedNameSpecifierLoc() {
6478 return Reader->ReadNestedNameSpecifierLoc(*F, Record, Idx);
6479 }
6480
6481 Attr *ReadAttr() {
6482 return Reader->ReadAttr(*F, Record, Idx);
6483 }
6484
6485public:
6486 TypeLocReader(ModuleFile &F, ASTReader &Reader,
6487 const ASTReader::RecordData &Record, unsigned &Idx)
6488 : F(&F), Reader(&Reader), Record(Record), Idx(Idx) {}
6489
6490 // We want compile-time assurance that we've enumerated all of
6491 // these, so unfortunately we have to declare them first, then
6492 // define them out-of-line.
6493#define ABSTRACT_TYPELOC(CLASS, PARENT)
6494#define TYPELOC(CLASS, PARENT) \
6495 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
6496#include "clang/AST/TypeLocNodes.def"
6497
6498 void VisitFunctionTypeLoc(FunctionTypeLoc);
6499 void VisitArrayTypeLoc(ArrayTypeLoc);
6500};
6501
6502} // namespace clang
6503
6504void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
6505 // nothing to do
6506}
6507
6508void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
6509 TL.setBuiltinLoc(ReadSourceLocation());
6510 if (TL.needsExtraLocalData()) {
6511 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Record[Idx++]));
6512 TL.setWrittenSignSpec(static_cast<DeclSpec::TSS>(Record[Idx++]));
6513 TL.setWrittenWidthSpec(static_cast<DeclSpec::TSW>(Record[Idx++]));
6514 TL.setModeAttr(Record[Idx++]);
6515 }
6516}
6517
6518void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
6519 TL.setNameLoc(ReadSourceLocation());
6520}
6521
6522void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
6523 TL.setStarLoc(ReadSourceLocation());
6524}
6525
6526void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
6527 // nothing to do
6528}
6529
6530void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
6531 // nothing to do
6532}
6533
6534void TypeLocReader::VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) {
6535 TL.setExpansionLoc(ReadSourceLocation());
6536}
6537
6538void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
6539 TL.setCaretLoc(ReadSourceLocation());
6540}
6541
6542void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
6543 TL.setAmpLoc(ReadSourceLocation());
6544}
6545
6546void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
6547 TL.setAmpAmpLoc(ReadSourceLocation());
6548}
6549
6550void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
6551 TL.setStarLoc(ReadSourceLocation());
6552 TL.setClassTInfo(GetTypeSourceInfo());
6553}
6554
6555void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) {
6556 TL.setLBracketLoc(ReadSourceLocation());
6557 TL.setRBracketLoc(ReadSourceLocation());
6558 if (Record[Idx++])
6559 TL.setSizeExpr(Reader->ReadExpr(*F));
6560 else
6561 TL.setSizeExpr(nullptr);
6562}
6563
6564void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) {
6565 VisitArrayTypeLoc(TL);
6566}
6567
6568void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) {
6569 VisitArrayTypeLoc(TL);
6570}
6571
6572void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
6573 VisitArrayTypeLoc(TL);
6574}
6575
6576void TypeLocReader::VisitDependentSizedArrayTypeLoc(
6577 DependentSizedArrayTypeLoc TL) {
6578 VisitArrayTypeLoc(TL);
6579}
6580
6581void TypeLocReader::VisitDependentAddressSpaceTypeLoc(
6582 DependentAddressSpaceTypeLoc TL) {
6583
6584 TL.setAttrNameLoc(ReadSourceLocation());
6585 SourceRange range;
6586 range.setBegin(ReadSourceLocation());
6587 range.setEnd(ReadSourceLocation());
6588 TL.setAttrOperandParensRange(range);
6589 TL.setAttrExprOperand(Reader->ReadExpr(*F));
6590}
6591
6592void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
6593 DependentSizedExtVectorTypeLoc TL) {
6594 TL.setNameLoc(ReadSourceLocation());
6595}
6596
6597void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
6598 TL.setNameLoc(ReadSourceLocation());
6599}
6600
6601void TypeLocReader::VisitDependentVectorTypeLoc(
6602 DependentVectorTypeLoc TL) {
6603 TL.setNameLoc(ReadSourceLocation());
6604}
6605
6606void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
6607 TL.setNameLoc(ReadSourceLocation());
6608}
6609
6610void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) {
6611 TL.setLocalRangeBegin(ReadSourceLocation());
6612 TL.setLParenLoc(ReadSourceLocation());
6613 TL.setRParenLoc(ReadSourceLocation());
6614 TL.setExceptionSpecRange(SourceRange(Reader->ReadSourceLocation(*F, Record, Idx),
6615 Reader->ReadSourceLocation(*F, Record, Idx)));
6616 TL.setLocalRangeEnd(ReadSourceLocation());
6617 for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) {
6618 TL.setParam(i, Reader->ReadDeclAs<ParmVarDecl>(*F, Record, Idx));
6619 }
6620}
6621
6622void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) {
6623 VisitFunctionTypeLoc(TL);
6624}
6625
6626void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) {
6627 VisitFunctionTypeLoc(TL);
6628}
6629
6630void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
6631 TL.setNameLoc(ReadSourceLocation());
6632}
6633
6634void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
6635 TL.setNameLoc(ReadSourceLocation());
6636}
6637
6638void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
6639 TL.setTypeofLoc(ReadSourceLocation());
6640 TL.setLParenLoc(ReadSourceLocation());
6641 TL.setRParenLoc(ReadSourceLocation());
6642}
6643
6644void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
6645 TL.setTypeofLoc(ReadSourceLocation());
6646 TL.setLParenLoc(ReadSourceLocation());
6647 TL.setRParenLoc(ReadSourceLocation());
6648 TL.setUnderlyingTInfo(GetTypeSourceInfo());
6649}
6650
6651void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
6652 TL.setNameLoc(ReadSourceLocation());
6653}
6654
6655void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
6656 TL.setKWLoc(ReadSourceLocation());
6657 TL.setLParenLoc(ReadSourceLocation());
6658 TL.setRParenLoc(ReadSourceLocation());
6659 TL.setUnderlyingTInfo(GetTypeSourceInfo());
6660}
6661
6662void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) {
6663 TL.setNameLoc(ReadSourceLocation());
6664}
6665
6666void TypeLocReader::VisitDeducedTemplateSpecializationTypeLoc(
6667 DeducedTemplateSpecializationTypeLoc TL) {
6668 TL.setTemplateNameLoc(ReadSourceLocation());
6669}
6670
6671void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) {
6672 TL.setNameLoc(ReadSourceLocation());
6673}
6674
6675void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) {
6676 TL.setNameLoc(ReadSourceLocation());
6677}
6678
6679void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
6680 TL.setAttr(ReadAttr());
6681}
6682
6683void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
6684 TL.setNameLoc(ReadSourceLocation());
6685}
6686
6687void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
6688 SubstTemplateTypeParmTypeLoc TL) {
6689 TL.setNameLoc(ReadSourceLocation());
6690}
6691
6692void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
6693 SubstTemplateTypeParmPackTypeLoc TL) {
6694 TL.setNameLoc(ReadSourceLocation());
6695}
6696
6697void TypeLocReader::VisitTemplateSpecializationTypeLoc(
6698 TemplateSpecializationTypeLoc TL) {
6699 TL.setTemplateKeywordLoc(ReadSourceLocation());
6700 TL.setTemplateNameLoc(ReadSourceLocation());
6701 TL.setLAngleLoc(ReadSourceLocation());
6702 TL.setRAngleLoc(ReadSourceLocation());
6703 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i)
6704 TL.setArgLocInfo(
6705 i,
6706 Reader->GetTemplateArgumentLocInfo(
6707 *F, TL.getTypePtr()->getArg(i).getKind(), Record, Idx));
6708}
6709
6710void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
6711 TL.setLParenLoc(ReadSourceLocation());
6712 TL.setRParenLoc(ReadSourceLocation());
6713}
6714
6715void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
6716 TL.setElaboratedKeywordLoc(ReadSourceLocation());
6717 TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
6718}
6719
6720void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
6721 TL.setNameLoc(ReadSourceLocation());
6722}
6723
6724void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
6725 TL.setElaboratedKeywordLoc(ReadSourceLocation());
6726 TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
6727 TL.setNameLoc(ReadSourceLocation());
6728}
6729
6730void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc(
6731 DependentTemplateSpecializationTypeLoc TL) {
6732 TL.setElaboratedKeywordLoc(ReadSourceLocation());
6733 TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
6734 TL.setTemplateKeywordLoc(ReadSourceLocation());
6735 TL.setTemplateNameLoc(ReadSourceLocation());
6736 TL.setLAngleLoc(ReadSourceLocation());
6737 TL.setRAngleLoc(ReadSourceLocation());
6738 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
6739 TL.setArgLocInfo(
6740 I,
6741 Reader->GetTemplateArgumentLocInfo(
6742 *F, TL.getTypePtr()->getArg(I).getKind(), Record, Idx));
6743}
6744
6745void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
6746 TL.setEllipsisLoc(ReadSourceLocation());
6747}
6748
6749void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
6750 TL.setNameLoc(ReadSourceLocation());
6751}
6752
6753void TypeLocReader::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) {
6754 if (TL.getNumProtocols()) {
6755 TL.setProtocolLAngleLoc(ReadSourceLocation());
6756 TL.setProtocolRAngleLoc(ReadSourceLocation());
6757 }
6758 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
6759 TL.setProtocolLoc(i, ReadSourceLocation());
6760}
6761
6762void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
6763 TL.setHasBaseTypeAsWritten(Record[Idx++]);
6764 TL.setTypeArgsLAngleLoc(ReadSourceLocation());
6765 TL.setTypeArgsRAngleLoc(ReadSourceLocation());
6766 for (unsigned i = 0, e = TL.getNumTypeArgs(); i != e; ++i)
6767 TL.setTypeArgTInfo(i, GetTypeSourceInfo());
6768 TL.setProtocolLAngleLoc(ReadSourceLocation());
6769 TL.setProtocolRAngleLoc(ReadSourceLocation());
6770 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
6771 TL.setProtocolLoc(i, ReadSourceLocation());
6772}
6773
6774void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
6775 TL.setStarLoc(ReadSourceLocation());
6776}
6777
6778void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
6779 TL.setKWLoc(ReadSourceLocation());
6780 TL.setLParenLoc(ReadSourceLocation());
6781 TL.setRParenLoc(ReadSourceLocation());
6782}
6783
6784void TypeLocReader::VisitPipeTypeLoc(PipeTypeLoc TL) {
6785 TL.setKWLoc(ReadSourceLocation());
6786}
6787
6788void ASTReader::ReadTypeLoc(ModuleFile &F, const ASTReader::RecordData &Record,
6789 unsigned &Idx, TypeLoc TL) {
6790 TypeLocReader TLR(F, *this, Record, Idx);
6791 for (; !TL.isNull(); TL = TL.getNextTypeLoc())
6792 TLR.Visit(TL);
6793}
6794
6795TypeSourceInfo *
6796ASTReader::GetTypeSourceInfo(ModuleFile &F, const ASTReader::RecordData &Record,
6797 unsigned &Idx) {
6798 QualType InfoTy = readType(F, Record, Idx);
6799 if (InfoTy.isNull())
6800 return nullptr;
6801
6802 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy);
6803 ReadTypeLoc(F, Record, Idx, TInfo->getTypeLoc());
6804 return TInfo;
6805}
6806
6807QualType ASTReader::GetType(TypeID ID) {
6808 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 6808, __PRETTY_FUNCTION__))
;
6809 ASTContext &Context = *ContextObj;
6810
6811 unsigned FastQuals = ID & Qualifiers::FastMask;
6812 unsigned Index = ID >> Qualifiers::FastWidth;
6813
6814 if (Index < NUM_PREDEF_TYPE_IDS) {
6815 QualType T;
6816 switch ((PredefinedTypeIDs)Index) {
6817 case PREDEF_TYPE_NULL_ID:
6818 return QualType();
6819 case PREDEF_TYPE_VOID_ID:
6820 T = Context.VoidTy;
6821 break;
6822 case PREDEF_TYPE_BOOL_ID:
6823 T = Context.BoolTy;
6824 break;
6825 case PREDEF_TYPE_CHAR_U_ID:
6826 case PREDEF_TYPE_CHAR_S_ID:
6827 // FIXME: Check that the signedness of CharTy is correct!
6828 T = Context.CharTy;
6829 break;
6830 case PREDEF_TYPE_UCHAR_ID:
6831 T = Context.UnsignedCharTy;
6832 break;
6833 case PREDEF_TYPE_USHORT_ID:
6834 T = Context.UnsignedShortTy;
6835 break;
6836 case PREDEF_TYPE_UINT_ID:
6837 T = Context.UnsignedIntTy;
6838 break;
6839 case PREDEF_TYPE_ULONG_ID:
6840 T = Context.UnsignedLongTy;
6841 break;
6842 case PREDEF_TYPE_ULONGLONG_ID:
6843 T = Context.UnsignedLongLongTy;
6844 break;
6845 case PREDEF_TYPE_UINT128_ID:
6846 T = Context.UnsignedInt128Ty;
6847 break;
6848 case PREDEF_TYPE_SCHAR_ID:
6849 T = Context.SignedCharTy;
6850 break;
6851 case PREDEF_TYPE_WCHAR_ID:
6852 T = Context.WCharTy;
6853 break;
6854 case PREDEF_TYPE_SHORT_ID:
6855 T = Context.ShortTy;
6856 break;
6857 case PREDEF_TYPE_INT_ID:
6858 T = Context.IntTy;
6859 break;
6860 case PREDEF_TYPE_LONG_ID:
6861 T = Context.LongTy;
6862 break;
6863 case PREDEF_TYPE_LONGLONG_ID:
6864 T = Context.LongLongTy;
6865 break;
6866 case PREDEF_TYPE_INT128_ID:
6867 T = Context.Int128Ty;
6868 break;
6869 case PREDEF_TYPE_HALF_ID:
6870 T = Context.HalfTy;
6871 break;
6872 case PREDEF_TYPE_FLOAT_ID:
6873 T = Context.FloatTy;
6874 break;
6875 case PREDEF_TYPE_DOUBLE_ID:
6876 T = Context.DoubleTy;
6877 break;
6878 case PREDEF_TYPE_LONGDOUBLE_ID:
6879 T = Context.LongDoubleTy;
6880 break;
6881 case PREDEF_TYPE_SHORT_ACCUM_ID:
6882 T = Context.ShortAccumTy;
6883 break;
6884 case PREDEF_TYPE_ACCUM_ID:
6885 T = Context.AccumTy;
6886 break;
6887 case PREDEF_TYPE_LONG_ACCUM_ID:
6888 T = Context.LongAccumTy;
6889 break;
6890 case PREDEF_TYPE_USHORT_ACCUM_ID:
6891 T = Context.UnsignedShortAccumTy;
6892 break;
6893 case PREDEF_TYPE_UACCUM_ID:
6894 T = Context.UnsignedAccumTy;
6895 break;
6896 case PREDEF_TYPE_ULONG_ACCUM_ID:
6897 T = Context.UnsignedLongAccumTy;
6898 break;
6899 case PREDEF_TYPE_SHORT_FRACT_ID:
6900 T = Context.ShortFractTy;
6901 break;
6902 case PREDEF_TYPE_FRACT_ID:
6903 T = Context.FractTy;
6904 break;
6905 case PREDEF_TYPE_LONG_FRACT_ID:
6906 T = Context.LongFractTy;
6907 break;
6908 case PREDEF_TYPE_USHORT_FRACT_ID:
6909 T = Context.UnsignedShortFractTy;
6910 break;
6911 case PREDEF_TYPE_UFRACT_ID:
6912 T = Context.UnsignedFractTy;
6913 break;
6914 case PREDEF_TYPE_ULONG_FRACT_ID:
6915 T = Context.UnsignedLongFractTy;
6916 break;
6917 case PREDEF_TYPE_SAT_SHORT_ACCUM_ID:
6918 T = Context.SatShortAccumTy;
6919 break;
6920 case PREDEF_TYPE_SAT_ACCUM_ID:
6921 T = Context.SatAccumTy;
6922 break;
6923 case PREDEF_TYPE_SAT_LONG_ACCUM_ID:
6924 T = Context.SatLongAccumTy;
6925 break;
6926 case PREDEF_TYPE_SAT_USHORT_ACCUM_ID:
6927 T = Context.SatUnsignedShortAccumTy;
6928 break;
6929 case PREDEF_TYPE_SAT_UACCUM_ID:
6930 T = Context.SatUnsignedAccumTy;
6931 break;
6932 case PREDEF_TYPE_SAT_ULONG_ACCUM_ID:
6933 T = Context.SatUnsignedLongAccumTy;
6934 break;
6935 case PREDEF_TYPE_SAT_SHORT_FRACT_ID:
6936 T = Context.SatShortFractTy;
6937 break;
6938 case PREDEF_TYPE_SAT_FRACT_ID:
6939 T = Context.SatFractTy;
6940 break;
6941 case PREDEF_TYPE_SAT_LONG_FRACT_ID:
6942 T = Context.SatLongFractTy;
6943 break;
6944 case PREDEF_TYPE_SAT_USHORT_FRACT_ID:
6945 T = Context.SatUnsignedShortFractTy;
6946 break;
6947 case PREDEF_TYPE_SAT_UFRACT_ID:
6948 T = Context.SatUnsignedFractTy;
6949 break;
6950 case PREDEF_TYPE_SAT_ULONG_FRACT_ID:
6951 T = Context.SatUnsignedLongFractTy;
6952 break;
6953 case PREDEF_TYPE_FLOAT16_ID:
6954 T = Context.Float16Ty;
6955 break;
6956 case PREDEF_TYPE_FLOAT128_ID:
6957 T = Context.Float128Ty;
6958 break;
6959 case PREDEF_TYPE_OVERLOAD_ID:
6960 T = Context.OverloadTy;
6961 break;
6962 case PREDEF_TYPE_BOUND_MEMBER:
6963 T = Context.BoundMemberTy;
6964 break;
6965 case PREDEF_TYPE_PSEUDO_OBJECT:
6966 T = Context.PseudoObjectTy;
6967 break;
6968 case PREDEF_TYPE_DEPENDENT_ID:
6969 T = Context.DependentTy;
6970 break;
6971 case PREDEF_TYPE_UNKNOWN_ANY:
6972 T = Context.UnknownAnyTy;
6973 break;
6974 case PREDEF_TYPE_NULLPTR_ID:
6975 T = Context.NullPtrTy;
6976 break;
6977 case PREDEF_TYPE_CHAR8_ID:
6978 T = Context.Char8Ty;
6979 break;
6980 case PREDEF_TYPE_CHAR16_ID:
6981 T = Context.Char16Ty;
6982 break;
6983 case PREDEF_TYPE_CHAR32_ID:
6984 T = Context.Char32Ty;
6985 break;
6986 case PREDEF_TYPE_OBJC_ID:
6987 T = Context.ObjCBuiltinIdTy;
6988 break;
6989 case PREDEF_TYPE_OBJC_CLASS:
6990 T = Context.ObjCBuiltinClassTy;
6991 break;
6992 case PREDEF_TYPE_OBJC_SEL:
6993 T = Context.ObjCBuiltinSelTy;
6994 break;
6995#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
6996 case PREDEF_TYPE_##Id##_ID: \
6997 T = Context.SingletonId; \
6998 break;
6999#include "clang/Basic/OpenCLImageTypes.def"
7000#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
7001 case PREDEF_TYPE_##Id##_ID: \
7002 T = Context.Id##Ty; \
7003 break;
7004#include "clang/Basic/OpenCLExtensionTypes.def"
7005 case PREDEF_TYPE_SAMPLER_ID:
7006 T = Context.OCLSamplerTy;
7007 break;
7008 case PREDEF_TYPE_EVENT_ID:
7009 T = Context.OCLEventTy;
7010 break;
7011 case PREDEF_TYPE_CLK_EVENT_ID:
7012 T = Context.OCLClkEventTy;
7013 break;
7014 case PREDEF_TYPE_QUEUE_ID:
7015 T = Context.OCLQueueTy;
7016 break;
7017 case PREDEF_TYPE_RESERVE_ID_ID:
7018 T = Context.OCLReserveIDTy;
7019 break;
7020 case PREDEF_TYPE_AUTO_DEDUCT:
7021 T = Context.getAutoDeductType();
7022 break;
7023 case PREDEF_TYPE_AUTO_RREF_DEDUCT:
7024 T = Context.getAutoRRefDeductType();
7025 break;
7026 case PREDEF_TYPE_ARC_UNBRIDGED_CAST:
7027 T = Context.ARCUnbridgedCastTy;
7028 break;
7029 case PREDEF_TYPE_BUILTIN_FN:
7030 T = Context.BuiltinFnTy;
7031 break;
7032 case PREDEF_TYPE_OMP_ARRAY_SECTION:
7033 T = Context.OMPArraySectionTy;
7034 break;
7035 }
7036
7037 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 7037, __PRETTY_FUNCTION__))
;
7038 return T.withFastQualifiers(FastQuals);
7039 }
7040
7041 Index -= NUM_PREDEF_TYPE_IDS;
7042 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 7042, __PRETTY_FUNCTION__))
;
7043 if (TypesLoaded[Index].isNull()) {
7044 TypesLoaded[Index] = readTypeRecord(Index);
7045 if (TypesLoaded[Index].isNull())
7046 return QualType();
7047
7048 TypesLoaded[Index]->setFromAST();
7049 if (DeserializationListener)
7050 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID),
7051 TypesLoaded[Index]);
7052 }
7053
7054 return TypesLoaded[Index].withFastQualifiers(FastQuals);
7055}
7056
7057QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) {
7058 return GetType(getGlobalTypeID(F, LocalID));
7059}
7060
7061serialization::TypeID
7062ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const {
7063 unsigned FastQuals = LocalID & Qualifiers::FastMask;
7064 unsigned LocalIndex = LocalID >> Qualifiers::FastWidth;
7065
7066 if (LocalIndex < NUM_PREDEF_TYPE_IDS)
7067 return LocalID;
7068
7069 if (!F.ModuleOffsetMap.empty())
7070 ReadModuleOffsetMap(F);
7071
7072 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7073 = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS);
7074 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 7074, __PRETTY_FUNCTION__))
;
7075
7076 unsigned GlobalIndex = LocalIndex + I->second;
7077 return (GlobalIndex << Qualifiers::FastWidth) | FastQuals;
7078}
7079
7080TemplateArgumentLocInfo
7081ASTReader::GetTemplateArgumentLocInfo(ModuleFile &F,
7082 TemplateArgument::ArgKind Kind,
7083 const RecordData &Record,
7084 unsigned &Index) {
7085 switch (Kind) {
7086 case TemplateArgument::Expression:
7087 return ReadExpr(F);
7088 case TemplateArgument::Type:
7089 return GetTypeSourceInfo(F, Record, Index);
7090 case TemplateArgument::Template: {
7091 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
7092 Index);
7093 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
7094 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
7095 SourceLocation());
7096 }
7097 case TemplateArgument::TemplateExpansion: {
7098 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
7099 Index);
7100 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
7101 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Index);
7102 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
7103 EllipsisLoc);
7104 }
7105 case TemplateArgument::Null:
7106 case TemplateArgument::Integral:
7107 case TemplateArgument::Declaration:
7108 case TemplateArgument::NullPtr:
7109 case TemplateArgument::Pack:
7110 // FIXME: Is this right?
7111 return TemplateArgumentLocInfo();
7112 }
7113 llvm_unreachable("unexpected template argument loc")::llvm::llvm_unreachable_internal("unexpected template argument loc"
, "/build/llvm-toolchain-snapshot-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 7113)
;
7114}
7115
7116TemplateArgumentLoc
7117ASTReader::ReadTemplateArgumentLoc(ModuleFile &F,
7118 const RecordData &Record, unsigned &Index) {
7119 TemplateArgument Arg = ReadTemplateArgument(F, Record, Index);
7120
7121 if (Arg.getKind() == TemplateArgument::Expression) {
7122 if (Record[Index++]) // bool InfoHasSameExpr.
7123 return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr()));
7124 }
7125 return TemplateArgumentLoc(Arg, GetTemplateArgumentLocInfo(F, Arg.getKind(),
7126 Record, Index));
7127}
7128
7129const ASTTemplateArgumentListInfo*
7130ASTReader::ReadASTTemplateArgumentListInfo(ModuleFile &F,
7131 const RecordData &Record,
7132 unsigned &Index) {
7133 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Index);
7134 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Index);
7135 unsigned NumArgsAsWritten = Record[Index++];
7136 TemplateArgumentListInfo TemplArgsInfo(LAngleLoc, RAngleLoc);
7137 for (unsigned i = 0; i != NumArgsAsWritten; ++i)
7138 TemplArgsInfo.addArgument(ReadTemplateArgumentLoc(F, Record, Index));
7139 return ASTTemplateArgumentListInfo::Create(getContext(), TemplArgsInfo);
7140}
7141
7142Decl *ASTReader::GetExternalDecl(uint32_t ID) {
7143 return GetDecl(ID);
7144}
7145
7146void ASTReader::CompleteRedeclChain(const Decl *D) {
7147 if (NumCurrentElementsDeserializing) {
7148 // We arrange to not care about the complete redeclaration chain while we're
7149 // deserializing. Just remember that the AST has marked this one as complete
7150 // but that it's not actually complete yet, so we know we still need to
7151 // complete it later.
7152 PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D));
7153 return;
7154 }
7155
7156 const DeclContext *DC = D->getDeclContext()->getRedeclContext();
7157
7158 // If this is a named declaration, complete it by looking it up
7159 // within its context.
7160 //
7161 // FIXME: Merging a function definition should merge
7162 // all mergeable entities within it.
7163 if (isa<TranslationUnitDecl>(DC) || isa<NamespaceDecl>(DC) ||
7164 isa<CXXRecordDecl>(DC) || isa<EnumDecl>(DC)) {
7165 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) {
7166 if (!getContext().getLangOpts().CPlusPlus &&
7167 isa<TranslationUnitDecl>(DC)) {
7168 // Outside of C++, we don't have a lookup table for the TU, so update
7169 // the identifier instead. (For C++ modules, we don't store decls
7170 // in the serialized identifier table, so we do the lookup in the TU.)
7171 auto *II = Name.getAsIdentifierInfo();
7172 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 7172, __PRETTY_FUNCTION__))
;
7173 if (II->isOutOfDate())
7174 updateOutOfDateIdentifier(*II);
7175 } else
7176 DC->lookup(Name);
7177 } else if (needsAnonymousDeclarationNumber(cast<NamedDecl>(D))) {
7178 // Find all declarations of this kind from the relevant context.
7179 for (auto *DCDecl : cast<Decl>(D->getLexicalDeclContext())->redecls()) {
7180 auto *DC = cast<DeclContext>(DCDecl);
7181 SmallVector<Decl*, 8> Decls;
7182 FindExternalLexicalDecls(
7183 DC, [&](Decl::Kind K) { return K == D->getKind(); }, Decls);
7184 }
7185 }
7186 }
7187
7188 if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D))
7189 CTSD->getSpecializedTemplate()->LoadLazySpecializations();
7190 if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D))
7191 VTSD->getSpecializedTemplate()->LoadLazySpecializations();
7192 if (auto *FD = dyn_cast<FunctionDecl>(D)) {
7193 if (auto *Template = FD->getPrimaryTemplate())
7194 Template->LoadLazySpecializations();
7195 }
7196}
7197
7198CXXCtorInitializer **
7199ASTReader::GetExternalCXXCtorInitializers(uint64_t Offset) {
7200 RecordLocation Loc = getLocalBitOffset(Offset);
7201 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
7202 SavedStreamPosition SavedPosition(Cursor);
7203 Cursor.JumpToBit(Loc.Offset);
7204 ReadingKindTracker ReadingKind(Read_Decl, *this);
7205
7206 RecordData Record;
7207 unsigned Code = Cursor.ReadCode();
7208 unsigned RecCode = Cursor.readRecord(Code, Record);
7209 if (RecCode != DECL_CXX_CTOR_INITIALIZERS) {
7210 Error("malformed AST file: missing C++ ctor initializers");
7211 return nullptr;
7212 }
7213
7214 unsigned Idx = 0;
7215 return ReadCXXCtorInitializers(*Loc.F, Record, Idx);
7216}
7217
7218CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) {
7219 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 7219, __PRETTY_FUNCTION__))
;
7220 ASTContext &Context = *ContextObj;
7221
7222 RecordLocation Loc = getLocalBitOffset(Offset);
7223 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
7224 SavedStreamPosition SavedPosition(Cursor);
7225 Cursor.JumpToBit(Loc.Offset);
7226 ReadingKindTracker ReadingKind(Read_Decl, *this);
7227 RecordData Record;
7228 unsigned Code = Cursor.ReadCode();
7229 unsigned RecCode = Cursor.readRecord(Code, Record);
7230 if (RecCode != DECL_CXX_BASE_SPECIFIERS) {
7231 Error("malformed AST file: missing C++ base specifiers");
7232 return nullptr;
7233 }
7234
7235 unsigned Idx = 0;
7236 unsigned NumBases = Record[Idx++];
7237 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases);
7238 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases];
7239 for (unsigned I = 0; I != NumBases; ++I)
7240 Bases[I] = ReadCXXBaseSpecifier(*Loc.F, Record, Idx);
7241 return Bases;
7242}
7243
7244serialization::DeclID
7245ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const {
7246 if (LocalID < NUM_PREDEF_DECL_IDS)
7247 return LocalID;
7248
7249 if (!F.ModuleOffsetMap.empty())
7250 ReadModuleOffsetMap(F);
7251
7252 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7253 = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS);
7254 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 7254, __PRETTY_FUNCTION__))
;
7255
7256 return LocalID + I->second;
7257}
7258
7259bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID,
7260 ModuleFile &M) const {
7261 // Predefined decls aren't from any module.
7262 if (ID < NUM_PREDEF_DECL_IDS)
7263 return false;
7264
7265 return ID - NUM_PREDEF_DECL_IDS >= M.BaseDeclID &&
7266 ID - NUM_PREDEF_DECL_IDS < M.BaseDeclID + M.LocalNumDecls;
7267}
7268
7269ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) {
7270 if (!D->isFromASTFile())
7271 return nullptr;
7272 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID());
7273 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 7273, __PRETTY_FUNCTION__))
;
7274 return I->second;
7275}
7276
7277SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) {
7278 if (ID < NUM_PREDEF_DECL_IDS)
7279 return SourceLocation();
7280
7281 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
7282
7283 if (Index > DeclsLoaded.size()) {
7284 Error("declaration ID out-of-range for AST file");
7285 return SourceLocation();
7286 }
7287
7288 if (Decl *D = DeclsLoaded[Index])
7289 return D->getLocation();
7290
7291 SourceLocation Loc;
7292 DeclCursorForID(ID, Loc);
7293 return Loc;
7294}
7295
7296static Decl *getPredefinedDecl(ASTContext &Context, PredefinedDeclIDs ID) {
7297 switch (ID) {
7298 case PREDEF_DECL_NULL_ID:
7299 return nullptr;
7300
7301 case PREDEF_DECL_TRANSLATION_UNIT_ID:
7302 return Context.getTranslationUnitDecl();
7303
7304 case PREDEF_DECL_OBJC_ID_ID:
7305 return Context.getObjCIdDecl();
7306
7307 case PREDEF_DECL_OBJC_SEL_ID:
7308 return Context.getObjCSelDecl();
7309
7310 case PREDEF_DECL_OBJC_CLASS_ID:
7311 return Context.getObjCClassDecl();
7312
7313 case PREDEF_DECL_OBJC_PROTOCOL_ID:
7314 return Context.getObjCProtocolDecl();
7315
7316 case PREDEF_DECL_INT_128_ID:
7317 return Context.getInt128Decl();
7318
7319 case PREDEF_DECL_UNSIGNED_INT_128_ID:
7320 return Context.getUInt128Decl();
7321
7322 case PREDEF_DECL_OBJC_INSTANCETYPE_ID:
7323 return Context.getObjCInstanceTypeDecl();
7324
7325 case PREDEF_DECL_BUILTIN_VA_LIST_ID:
7326 return Context.getBuiltinVaListDecl();
7327
7328 case PREDEF_DECL_VA_LIST_TAG:
7329 return Context.getVaListTagDecl();
7330
7331 case PREDEF_DECL_BUILTIN_MS_VA_LIST_ID:
7332 return Context.getBuiltinMSVaListDecl();
7333
7334 case PREDEF_DECL_EXTERN_C_CONTEXT_ID:
7335 return Context.getExternCContextDecl();
7336
7337 case PREDEF_DECL_MAKE_INTEGER_SEQ_ID:
7338 return Context.getMakeIntegerSeqDecl();
7339
7340 case PREDEF_DECL_CF_CONSTANT_STRING_ID:
7341 return Context.getCFConstantStringDecl();
7342
7343 case PREDEF_DECL_CF_CONSTANT_STRING_TAG_ID:
7344 return Context.getCFConstantStringTagDecl();
7345
7346 case PREDEF_DECL_TYPE_PACK_ELEMENT_ID:
7347 return Context.getTypePackElementDecl();
7348 }
7349 llvm_unreachable("PredefinedDeclIDs unknown enum value")::llvm::llvm_unreachable_internal("PredefinedDeclIDs unknown enum value"
, "/build/llvm-toolchain-snapshot-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 7349)
;
7350}
7351
7352Decl *ASTReader::GetExistingDecl(DeclID ID) {
7353 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 7353, __PRETTY_FUNCTION__))
;
7354 if (ID < NUM_PREDEF_DECL_IDS) {
7355 Decl *D = getPredefinedDecl(*ContextObj, (PredefinedDeclIDs)ID);
7356 if (D) {
7357 // Track that we have merged the declaration with ID \p ID into the
7358 // pre-existing predefined declaration \p D.
7359 auto &Merged = KeyDecls[D->getCanonicalDecl()];
7360 if (Merged.empty())
7361 Merged.push_back(ID);
7362 }
7363 return D;
7364 }
7365
7366 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
7367
7368 if (Index >= DeclsLoaded.size()) {
7369 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 7369, __PRETTY_FUNCTION__))
;
7370 Error("declaration ID out-of-range for AST file");
7371 return nullptr;
7372 }
7373
7374 return DeclsLoaded[Index];
7375}
7376
7377Decl *ASTReader::GetDecl(DeclID ID) {
7378 if (ID < NUM_PREDEF_DECL_IDS)
7379 return GetExistingDecl(ID);
7380
7381 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
7382
7383 if (Index >= DeclsLoaded.size()) {
7384 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 7384, __PRETTY_FUNCTION__))
;
7385 Error("declaration ID out-of-range for AST file");
7386 return nullptr;
7387 }
7388
7389 if (!DeclsLoaded[Index]) {
7390 ReadDeclRecord(ID);
7391 if (DeserializationListener)
7392 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
7393 }
7394
7395 return DeclsLoaded[Index];
7396}
7397
7398DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M,
7399 DeclID GlobalID) {
7400 if (GlobalID < NUM_PREDEF_DECL_IDS)
7401 return GlobalID;
7402
7403 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID);
7404 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 7404, __PRETTY_FUNCTION__))
;
7405 ModuleFile *Owner = I->second;
7406
7407 llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos
7408 = M.GlobalToLocalDeclIDs.find(Owner);
7409 if (Pos == M.GlobalToLocalDeclIDs.end())
7410 return 0;
7411
7412 return GlobalID - Owner->BaseDeclID + Pos->second;
7413}
7414
7415serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F,
7416 const RecordData &Record,
7417 unsigned &Idx) {
7418 if (Idx >= Record.size()) {
7419 Error("Corrupted AST file");
7420 return 0;
7421 }
7422
7423 return getGlobalDeclID(F, Record[Idx++]);
7424}
7425
7426/// Resolve the offset of a statement into a statement.
7427///
7428/// This operation will read a new statement from the external
7429/// source each time it is called, and is meant to be used via a
7430/// LazyOffsetPtr (which is used by Decls for the body of functions, etc).
7431Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) {
7432 // Switch case IDs are per Decl.
7433 ClearSwitchCaseIDs();
7434
7435 // Offset here is a global offset across the entire chain.
7436 RecordLocation Loc = getLocalBitOffset(Offset);
7437 Loc.F->DeclsCursor.JumpToBit(Loc.Offset);
7438 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 7439, __PRETTY_FUNCTION__))
7439 "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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 7439, __PRETTY_FUNCTION__))
;
7440 Deserializing D(this);
7441 return ReadStmtFromStream(*Loc.F);
7442}
7443
7444void ASTReader::FindExternalLexicalDecls(
7445 const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant,
7446 SmallVectorImpl<Decl *> &Decls) {
7447 bool PredefsVisited[NUM_PREDEF_DECL_IDS] = {};
7448
7449 auto Visit = [&] (ModuleFile *M, LexicalContents LexicalDecls) {
7450 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 7450, __PRETTY_FUNCTION__))
;
7451 for (int I = 0, N = LexicalDecls.size(); I != N; I += 2) {
7452 auto K = (Decl::Kind)+LexicalDecls[I];
7453 if (!IsKindWeWant(K))
7454 continue;
7455
7456 auto ID = (serialization::DeclID)+LexicalDecls[I + 1];
7457
7458 // Don't add predefined declarations to the lexical context more
7459 // than once.
7460 if (ID < NUM_PREDEF_DECL_IDS) {
7461 if (PredefsVisited[ID])
7462 continue;
7463
7464 PredefsVisited[ID] = true;
7465 }
7466
7467 if (Decl *D = GetLocalDecl(*M, ID)) {
7468 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 7468, __PRETTY_FUNCTION__))
;
7469 if (!DC->isDeclInLexicalTraversal(D))
7470 Decls.push_back(D);
7471 }
7472 }
7473 };
7474
7475 if (isa<TranslationUnitDecl>(DC)) {
7476 for (auto Lexical : TULexicalDecls)
7477 Visit(Lexical.first, Lexical.second);
7478 } else {
7479 auto I = LexicalDecls.find(DC);
7480 if (I != LexicalDecls.end())
7481 Visit(I->second.first, I->second.second);
7482 }
7483
7484 ++NumLexicalDeclContextsRead;
7485}
7486
7487namespace {
7488
7489class DeclIDComp {
7490 ASTReader &Reader;
7491 ModuleFile &Mod;
7492
7493public:
7494 DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {}
7495
7496 bool operator()(LocalDeclID L, LocalDeclID R) const {
7497 SourceLocation LHS = getLocation(L);
7498 SourceLocation RHS = getLocation(R);
7499 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
7500 }
7501
7502 bool operator()(SourceLocation LHS, LocalDeclID R) const {
7503 SourceLocation RHS = getLocation(R);
7504 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
7505 }
7506
7507 bool operator()(LocalDeclID L, SourceLocation RHS) const {
7508 SourceLocation LHS = getLocation(L);
7509 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
7510 }
7511
7512 SourceLocation getLocation(LocalDeclID ID) const {
7513 return Reader.getSourceManager().getFileLoc(
7514 Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID)));
7515 }
7516};
7517
7518} // namespace
7519
7520void ASTReader::FindFileRegionDecls(FileID File,
7521 unsigned Offset, unsigned Length,
7522 SmallVectorImpl<Decl *> &Decls) {
7523 SourceManager &SM = getSourceManager();
7524
7525 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File);
7526 if (I == FileDeclIDs.end())
7527 return;
7528
7529 FileDeclsInfo &DInfo = I->second;
7530 if (DInfo.Decls.empty())
7531 return;
7532
7533 SourceLocation
7534 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset);
7535 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length);
7536
7537 DeclIDComp DIDComp(*this, *DInfo.Mod);
7538 ArrayRef<serialization::LocalDeclID>::iterator
7539 BeginIt = std::lower_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
7540 BeginLoc, DIDComp);
7541 if (BeginIt != DInfo.Decls.begin())
7542 --BeginIt;
7543
7544 // If we are pointing at a top-level decl inside an objc container, we need
7545 // to backtrack until we find it otherwise we will fail to report that the
7546 // region overlaps with an objc container.
7547 while (BeginIt != DInfo.Decls.begin() &&
7548 GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt))
7549 ->isTopLevelDeclInObjCContainer())
7550 --BeginIt;
7551
7552 ArrayRef<serialization::LocalDeclID>::iterator
7553 EndIt = std::upper_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
7554 EndLoc, DIDComp);
7555 if (EndIt != DInfo.Decls.end())
7556 ++EndIt;
7557
7558 for (ArrayRef<serialization::LocalDeclID>::iterator
7559 DIt = BeginIt; DIt != EndIt; ++DIt)
7560 Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt)));
7561}
7562
7563bool
7564ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC,
7565 DeclarationName Name) {
7566 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 7567, __PRETTY_FUNCTION__))
1
Assuming the condition is true
2
Assuming the condition is true
3
'?' condition is true
7567 "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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 7567, __PRETTY_FUNCTION__))
;
7568 if (!Name)
4
Taking false branch
7569 return false;
7570
7571 auto It = Lookups.find(DC);
7572 if (It == Lookups.end())
5
Assuming the condition is false
6
Taking false branch
7573 return false;
7574
7575 Deserializing LookupResults(this);
7576
7577 // Load the list of declarations.
7578 SmallVector<NamedDecl *, 64> Decls;
7579 for (DeclID ID : It->second.Table.find(Name)) {
7
Calling 'MultiOnDiskHashTable::find'
7580 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID));
7581 if (ND->getDeclName() == Name)
7582 Decls.push_back(ND);
7583 }
7584
7585 ++NumVisibleDeclContextsRead;
7586 SetExternalVisibleDeclsForName(DC, Name, Decls);
7587 return !Decls.empty();
7588}
7589
7590void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) {
7591 if (!DC->hasExternalVisibleStorage())
7592 return;
7593
7594 auto It = Lookups.find(DC);
7595 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 7596, __PRETTY_FUNCTION__))
7596 "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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 7596, __PRETTY_FUNCTION__))
;
7597
7598 DeclsMap Decls;
7599
7600 for (DeclID ID : It->second.Table.findAll()) {
7601 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID));
7602 Decls[ND->getDeclName()].push_back(ND);
7603 }
7604
7605 ++NumVisibleDeclContextsRead;
7606
7607 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) {
7608 SetExternalVisibleDeclsForName(DC, I->first, I->second);
7609 }
7610 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false);
7611}
7612
7613const serialization::reader::DeclContextLookupTable *
7614ASTReader::getLoadedLookupTables(DeclContext *Primary) const {
7615 auto I = Lookups.find(Primary);
7616 return I == Lookups.end() ? nullptr : &I->second;
7617}
7618
7619/// Under non-PCH compilation the consumer receives the objc methods
7620/// before receiving the implementation, and codegen depends on this.
7621/// We simulate this by deserializing and passing to consumer the methods of the
7622/// implementation before passing the deserialized implementation decl.
7623static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD,
7624 ASTConsumer *Consumer) {
7625 assert(ImplD && Consumer)((ImplD && Consumer) ? static_cast<void> (0) : __assert_fail
("ImplD && Consumer", "/build/llvm-toolchain-snapshot-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 7625, __PRETTY_FUNCTION__))
;
7626
7627 for (auto *I : ImplD->methods())
7628 Consumer->HandleInterestingDecl(DeclGroupRef(I));
7629
7630 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD));
7631}
7632
7633void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
7634 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
7635 PassObjCImplDeclToConsumer(ImplD, Consumer);
7636 else
7637 Consumer->HandleInterestingDecl(DeclGroupRef(D));
7638}
7639
7640void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) {
7641 this->Consumer = Consumer;
7642
7643 if (Consumer)
7644 PassInterestingDeclsToConsumer();
7645
7646 if (DeserializationListener)
7647 DeserializationListener->ReaderInitialized(this);
7648}
7649
7650void ASTReader::PrintStats() {
7651 std::fprintf(stderrstderr, "*** AST File Statistics:\n");
7652
7653 unsigned NumTypesLoaded
7654 = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(),
7655 QualType());
7656 unsigned NumDeclsLoaded
7657 = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(),
7658 (Decl *)nullptr);
7659 unsigned NumIdentifiersLoaded
7660 = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(),
7661 IdentifiersLoaded.end(),
7662 (IdentifierInfo *)nullptr);
7663 unsigned NumMacrosLoaded
7664 = MacrosLoaded.size() - std::count(MacrosLoaded.begin(),
7665 MacrosLoaded.end(),
7666 (MacroInfo *)nullptr);
7667 unsigned NumSelectorsLoaded
7668 = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(),
7669 SelectorsLoaded.end(),
7670 Selector());
7671
7672 if (unsigned TotalNumSLocEntries = getTotalNumSLocs())
7673 std::fprintf(stderrstderr, " %u/%u source location entries read (%f%%)\n",
7674 NumSLocEntriesRead, TotalNumSLocEntries,
7675 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
7676 if (!TypesLoaded.empty())
7677 std::fprintf(stderrstderr, " %u/%u types read (%f%%)\n",
7678 NumTypesLoaded, (unsigned)TypesLoaded.size(),
7679 ((float)NumTypesLoaded/TypesLoaded.size() * 100));
7680 if (!DeclsLoaded.empty())
7681 std::fprintf(stderrstderr, " %u/%u declarations read (%f%%)\n",
7682 NumDeclsLoaded, (unsigned)DeclsLoaded.size(),
7683 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100));
7684 if (!IdentifiersLoaded.empty())
7685 std::fprintf(stderrstderr, " %u/%u identifiers read (%f%%)\n",
7686 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(),
7687 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
7688 if (!MacrosLoaded.empty())
7689 std::fprintf(stderrstderr, " %u/%u macros read (%f%%)\n",
7690 NumMacrosLoaded, (unsigned)MacrosLoaded.size(),
7691 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100));
7692 if (!SelectorsLoaded.empty())
7693 std::fprintf(stderrstderr, " %u/%u selectors read (%f%%)\n",
7694 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(),
7695 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
7696 if (TotalNumStatements)
7697 std::fprintf(stderrstderr, " %u/%u statements read (%f%%)\n",
7698 NumStatementsRead, TotalNumStatements,
7699 ((float)NumStatementsRead/TotalNumStatements * 100));
7700 if (TotalNumMacros)
7701 std::fprintf(stderrstderr, " %u/%u macros read (%f%%)\n",
7702 NumMacrosRead, TotalNumMacros,
7703 ((float)NumMacrosRead/TotalNumMacros * 100));
7704 if (TotalLexicalDeclContexts)
7705 std::fprintf(stderrstderr, " %u/%u lexical declcontexts read (%f%%)\n",
7706 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
7707 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
7708 * 100));
7709 if (TotalVisibleDeclContexts)
7710 std::fprintf(stderrstderr, " %u/%u visible declcontexts read (%f%%)\n",
7711 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
7712 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
7713 * 100));
7714 if (TotalNumMethodPoolEntries)
7715 std::fprintf(stderrstderr, " %u/%u method pool entries read (%f%%)\n",
7716 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
7717 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
7718 * 100));
7719 if (NumMethodPoolLookups)
7720 std::fprintf(stderrstderr, " %u/%u method pool lookups succeeded (%f%%)\n",
7721 NumMethodPoolHits, NumMethodPoolLookups,
7722 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
7723 if (NumMethodPoolTableLookups)
7724 std::fprintf(stderrstderr, " %u/%u method pool table lookups succeeded (%f%%)\n",
7725 NumMethodPoolTableHits, NumMethodPoolTableLookups,
7726 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups
7727 * 100.0));
7728 if (NumIdentifierLookupHits)
7729 std::fprintf(stderrstderr,
7730 " %u / %u identifier table lookups succeeded (%f%%)\n",
7731 NumIdentifierLookupHits, NumIdentifierLookups,
7732 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
7733
7734 if (GlobalIndex) {
7735 std::fprintf(stderrstderr, "\n");
7736 GlobalIndex->printStats();
7737 }
7738
7739 std::fprintf(stderrstderr, "\n");
7740 dump();
7741 std::fprintf(stderrstderr, "\n");
7742}
7743
7744template<typename Key, typename ModuleFile, unsigned InitialCapacity>
7745LLVM_DUMP_METHOD__attribute__((noinline)) __attribute__((__used__)) static void
7746dumpModuleIDMap(StringRef Name,
7747 const ContinuousRangeMap<Key, ModuleFile *,
7748 InitialCapacity> &Map) {
7749 if (Map.begin() == Map.end())
7750 return;
7751
7752 using MapType = ContinuousRangeMap<Key, ModuleFile *, InitialCapacity>;
7753
7754 llvm::errs() << Name << ":\n";
7755 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
7756 I != IEnd; ++I) {
7757 llvm::errs() << " " << I->first << " -> " << I->second->FileName
7758 << "\n";
7759 }
7760}
7761
7762LLVM_DUMP_METHOD__attribute__((noinline)) __attribute__((__used__)) void ASTReader::dump() {
7763 llvm::errs() << "*** PCH/ModuleFile Remappings:\n";
7764 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap);
7765 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap);
7766 dumpModuleIDMap("Global type map", GlobalTypeMap);
7767 dumpModuleIDMap("Global declaration map", GlobalDeclMap);
7768 dumpModuleIDMap("Global identifier map", GlobalIdentifierMap);
7769 dumpModuleIDMap("Global macro map", GlobalMacroMap);
7770 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap);
7771 dumpModuleIDMap("Global selector map", GlobalSelectorMap);
7772 dumpModuleIDMap("Global preprocessed entity map",
7773 GlobalPreprocessedEntityMap);
7774
7775 llvm::errs() << "\n*** PCH/Modules Loaded:";
7776 for (ModuleFile &M : ModuleMgr)
7777 M.dump();
7778}
7779
7780/// Return the amount of memory used by memory buffers, breaking down
7781/// by heap-backed versus mmap'ed memory.
7782void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const {
7783 for (ModuleFile &I : ModuleMgr) {
7784 if (llvm::MemoryBuffer *buf = I.Buffer) {
7785 size_t bytes = buf->getBufferSize();
7786 switch (buf->getBufferKind()) {
7787 case llvm::MemoryBuffer::MemoryBuffer_Malloc:
7788 sizes.malloc_bytes += bytes;
7789 break;
7790 case llvm::MemoryBuffer::MemoryBuffer_MMap:
7791 sizes.mmap_bytes += bytes;
7792 break;
7793 }
7794 }
7795 }
7796}
7797
7798void ASTReader::InitializeSema(Sema &S) {
7799 SemaObj = &S;
7800 S.addExternalSource(this);
7801
7802 // Makes sure any declarations that were deserialized "too early"
7803 // still get added to the identifier's declaration chains.
7804 for (uint64_t ID : PreloadedDeclIDs) {
7805 NamedDecl *D = cast<NamedDecl>(GetDecl(ID));
7806 pushExternalDeclIntoScope(D, D->getDeclName());
7807 }
7808 PreloadedDeclIDs.clear();
7809
7810 // FIXME: What happens if these are changed by a module import?
7811 if (!FPPragmaOptions.empty()) {
7812 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 7812, __PRETTY_FUNCTION__))
;
7813 SemaObj->FPFeatures = FPOptions(FPPragmaOptions[0]);
7814 }
7815
7816 SemaObj->OpenCLFeatures.copy(OpenCLExtensions);
7817 SemaObj->OpenCLTypeExtMap = OpenCLTypeExtMap;
7818 SemaObj->OpenCLDeclExtMap = OpenCLDeclExtMap;
7819
7820 UpdateSema();
7821}
7822
7823void ASTReader::UpdateSema() {
7824 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 7824, __PRETTY_FUNCTION__))
;
7825
7826 // Load the offsets of the declarations that Sema references.
7827 // They will be lazily deserialized when needed.
7828 if (!SemaDeclRefs.empty()) {
7829 assert(SemaDeclRefs.size() % 3 == 0)((SemaDeclRefs.size() % 3 == 0) ? static_cast<void> (0)
: __assert_fail ("SemaDeclRefs.size() % 3 == 0", "/build/llvm-toolchain-snapshot-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 7829, __PRETTY_FUNCTION__))
;
7830 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 3) {
7831 if (!SemaObj->StdNamespace)
7832 SemaObj->StdNamespace = SemaDeclRefs[I];
7833 if (!SemaObj->StdBadAlloc)
7834 SemaObj->StdBadAlloc = SemaDeclRefs[I+1];
7835 if (!SemaObj->StdAlignValT)
7836 SemaObj->StdAlignValT = SemaDeclRefs[I+2];
7837 }
7838 SemaDeclRefs.clear();
7839 }
7840
7841 // Update the state of pragmas. Use the same API as if we had encountered the
7842 // pragma in the source.
7843 if(OptimizeOffPragmaLocation.isValid())
7844 SemaObj->ActOnPragmaOptimize(/* IsOn = */ false, OptimizeOffPragmaLocation);
7845 if (PragmaMSStructState != -1)
7846 SemaObj->ActOnPragmaMSStruct((PragmaMSStructKind)PragmaMSStructState);
7847 if (PointersToMembersPragmaLocation.isValid()) {
7848 SemaObj->ActOnPragmaMSPointersToMembers(
7849 (LangOptions::PragmaMSPointersToMembersKind)
7850 PragmaMSPointersToMembersState,
7851 PointersToMembersPragmaLocation);
7852 }
7853 SemaObj->ForceCUDAHostDeviceDepth = ForceCUDAHostDeviceDepth;
7854
7855 if (PragmaPackCurrentValue) {
7856 // The bottom of the stack might have a default value. It must be adjusted
7857 // to the current value to ensure that the packing state is preserved after
7858 // popping entries that were included/imported from a PCH/module.
7859 bool DropFirst = false;
7860 if (!PragmaPackStack.empty() &&
7861 PragmaPackStack.front().Location.isInvalid()) {
7862 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 7863, __PRETTY_FUNCTION__))
7863 "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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 7863, __PRETTY_FUNCTION__))
;
7864 SemaObj->PackStack.Stack.emplace_back(
7865 PragmaPackStack.front().SlotLabel, SemaObj->PackStack.CurrentValue,
7866 SemaObj->PackStack.CurrentPragmaLocation,
7867 PragmaPackStack.front().PushLocation);
7868 DropFirst = true;
7869 }
7870 for (const auto &Entry :
7871 llvm::makeArrayRef(PragmaPackStack).drop_front(DropFirst ? 1 : 0))
7872 SemaObj->PackStack.Stack.emplace_back(Entry.SlotLabel, Entry.Value,
7873 Entry.Location, Entry.PushLocation);
7874 if (PragmaPackCurrentLocation.isInvalid()) {
7875 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 7876, __PRETTY_FUNCTION__))
7876 "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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 7876, __PRETTY_FUNCTION__))
;
7877 // Keep the current values.
7878 } else {
7879 SemaObj->PackStack.CurrentValue = *PragmaPackCurrentValue;
7880 SemaObj->PackStack.CurrentPragmaLocation = PragmaPackCurrentLocation;
7881 }
7882 }
7883}
7884
7885IdentifierInfo *ASTReader::get(StringRef Name) {
7886 // Note that we are loading an identifier.
7887 Deserializing AnIdentifier(this);
7888
7889 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0,
7890 NumIdentifierLookups,
7891 NumIdentifierLookupHits);
7892
7893 // We don't need to do identifier table lookups in C++ modules (we preload
7894 // all interesting declarations, and don't need to use the scope for name
7895 // lookups). Perform the lookup in PCH files, though, since we don't build
7896 // a complete initial identifier table if we're carrying on from a PCH.
7897 if (PP.getLangOpts().CPlusPlus) {
7898 for (auto F : ModuleMgr.pch_modules())
7899 if (Visitor(*F))
7900 break;
7901 } else {
7902 // If there is a global index, look there first to determine which modules
7903 // provably do not have any results for this identifier.
7904 GlobalModuleIndex::HitSet Hits;
7905 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
7906 if (!loadGlobalIndex()) {
7907 if (GlobalIndex->lookupIdentifier(Name, Hits)) {
7908 HitsPtr = &Hits;
7909 }
7910 }
7911
7912 ModuleMgr.visit(Visitor, HitsPtr);
7913 }
7914
7915 IdentifierInfo *II = Visitor.getIdentifierInfo();
7916 markIdentifierUpToDate(II);
7917 return II;
7918}
7919
7920namespace clang {
7921
7922 /// An identifier-lookup iterator that enumerates all of the
7923 /// identifiers stored within a set of AST files.
7924 class ASTIdentifierIterator : public IdentifierIterator {
7925 /// The AST reader whose identifiers are being enumerated.
7926 const ASTReader &Reader;
7927
7928 /// The current index into the chain of AST files stored in
7929 /// the AST reader.
7930 unsigned Index;
7931
7932 /// The current position within the identifier lookup table
7933 /// of the current AST file.
7934 ASTIdentifierLookupTable::key_iterator Current;
7935
7936 /// The end position within the identifier lookup table of
7937 /// the current AST file.
7938 ASTIdentifierLookupTable::key_iterator End;
7939
7940 /// Whether to skip any modules in the ASTReader.
7941 bool SkipModules;
7942
7943 public:
7944 explicit ASTIdentifierIterator(const ASTReader &Reader,
7945 bool SkipModules = false);
7946
7947 StringRef Next() override;
7948 };
7949
7950} // namespace clang
7951
7952ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader,
7953 bool SkipModules)
7954 : Reader(Reader), Index(Reader.ModuleMgr.size()), SkipModules(SkipModules) {
7955}
7956
7957StringRef ASTIdentifierIterator::Next() {
7958 while (Current == End) {
7959 // If we have exhausted all of our AST files, we're done.
7960 if (Index == 0)
7961 return StringRef();
7962
7963 --Index;
7964 ModuleFile &F = Reader.ModuleMgr[Index];
7965 if (SkipModules && F.isModule())
7966 continue;
7967
7968 ASTIdentifierLookupTable *IdTable =
7969 (ASTIdentifierLookupTable *)F.IdentifierLookupTable;
7970 Current = IdTable->key_begin();
7971 End = IdTable->key_end();
7972 }
7973
7974 // We have any identifiers remaining in the current AST file; return
7975 // the next one.
7976 StringRef Result = *Current;
7977 ++Current;
7978 return Result;
7979}
7980
7981namespace {
7982
7983/// A utility for appending two IdentifierIterators.
7984class ChainedIdentifierIterator : public IdentifierIterator {
7985 std::unique_ptr<IdentifierIterator> Current;
7986 std::unique_ptr<IdentifierIterator> Queued;
7987
7988public:
7989 ChainedIdentifierIterator(std::unique_ptr<IdentifierIterator> First,
7990 std::unique_ptr<IdentifierIterator> Second)
7991 : Current(std::move(First)), Queued(std::move(Second)) {}
7992
7993 StringRef Next() override {
7994 if (!Current)
7995 return StringRef();
7996
7997 StringRef result = Current->Next();
7998 if (!result.empty())
7999 return result;
8000
8001 // Try the queued iterator, which may itself be empty.
8002 Current.reset();
8003 std::swap(Current, Queued);
8004 return Next();
8005 }
8006};
8007
8008} // namespace
8009
8010IdentifierIterator *ASTReader::getIdentifiers() {
8011 if (!loadGlobalIndex()) {
8012 std::unique_ptr<IdentifierIterator> ReaderIter(
8013 new ASTIdentifierIterator(*this, /*SkipModules=*/true));
8014 std::unique_ptr<IdentifierIterator> ModulesIter(
8015 GlobalIndex->createIdentifierIterator());
8016 return new ChainedIdentifierIterator(std::move(ReaderIter),
8017 std::move(ModulesIter));
8018 }
8019
8020 return new ASTIdentifierIterator(*this);
8021}
8022
8023namespace clang {
8024namespace serialization {
8025
8026 class ReadMethodPoolVisitor {
8027 ASTReader &Reader;
8028 Selector Sel;
8029 unsigned PriorGeneration;
8030 unsigned InstanceBits = 0;
8031 unsigned FactoryBits = 0;
8032 bool InstanceHasMoreThanOneDecl = false;
8033 bool FactoryHasMoreThanOneDecl = false;
8034 SmallVector<ObjCMethodDecl *, 4> InstanceMethods;
8035 SmallVector<ObjCMethodDecl *, 4> FactoryMethods;
8036
8037 public:
8038 ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel,
8039 unsigned PriorGeneration)
8040 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) {}
8041
8042 bool operator()(ModuleFile &M) {
8043 if (!M.SelectorLookupTable)
8044 return false;
8045
8046 // If we've already searched this module file, skip it now.
8047 if (M.Generation <= PriorGeneration)
8048 return true;
8049
8050 ++Reader.NumMethodPoolTableLookups;
8051 ASTSelectorLookupTable *PoolTable
8052 = (ASTSelectorLookupTable*)M.SelectorLookupTable;
8053 ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel);
8054 if (Pos == PoolTable->end())
8055 return false;
8056
8057 ++Reader.NumMethodPoolTableHits;
8058 ++Reader.NumSelectorsRead;
8059 // FIXME: Not quite happy with the statistics here. We probably should
8060 // disable this tracking when called via LoadSelector.
8061 // Also, should entries without methods count as misses?
8062 ++Reader.NumMethodPoolEntriesRead;
8063 ASTSelectorLookupTrait::data_type Data = *Pos;
8064 if (Reader.DeserializationListener)
8065 Reader.DeserializationListener->SelectorRead(Data.ID, Sel);
8066
8067 InstanceMethods.append(Data.Instance.begin(), Data.Instance.end());
8068 FactoryMethods.append(Data.Factory.begin(), Data.Factory.end());
8069 InstanceBits = Data.InstanceBits;
8070 FactoryBits = Data.FactoryBits;
8071 InstanceHasMoreThanOneDecl = Data.InstanceHasMoreThanOneDecl;
8072 FactoryHasMoreThanOneDecl = Data.FactoryHasMoreThanOneDecl;
8073 return true;
8074 }
8075
8076 /// Retrieve the instance methods found by this visitor.
8077 ArrayRef<ObjCMethodDecl *> getInstanceMethods() const {
8078 return InstanceMethods;
8079 }
8080
8081 /// Retrieve the instance methods found by this visitor.
8082 ArrayRef<ObjCMethodDecl *> getFactoryMethods() const {
8083 return FactoryMethods;
8084 }
8085
8086 unsigned getInstanceBits() const { return InstanceBits; }
8087 unsigned getFactoryBits() const { return FactoryBits; }
8088
8089 bool instanceHasMoreThanOneDecl() const {
8090 return InstanceHasMoreThanOneDecl;
8091 }
8092
8093 bool factoryHasMoreThanOneDecl() const { return FactoryHasMoreThanOneDecl; }
8094 };
8095
8096} // namespace serialization
8097} // namespace clang
8098
8099/// Add the given set of methods to the method list.
8100static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods,
8101 ObjCMethodList &List) {
8102 for (unsigned I = 0, N = Methods.size(); I != N; ++I) {
8103 S.addMethodToGlobalList(&List, Methods[I]);
8104 }
8105}
8106
8107void ASTReader::ReadMethodPool(Selector Sel) {
8108 // Get the selector generation and update it to the current generation.
8109 unsigned &Generation = SelectorGeneration[Sel];
8110 unsigned PriorGeneration = Generation;
8111 Generation = getGeneration();
8112 SelectorOutOfDate[Sel] = false;
8113
8114 // Search for methods defined with this selector.
8115 ++NumMethodPoolLookups;
8116 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration);
8117 ModuleMgr.visit(Visitor);
8118
8119 if (Visitor.getInstanceMethods().empty() &&
8120 Visitor.getFactoryMethods().empty())
8121 return;
8122
8123 ++NumMethodPoolHits;
8124
8125 if (!getSema())
8126 return;
8127
8128 Sema &S = *getSema();
8129 Sema::GlobalMethodPool::iterator Pos
8130 = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first;
8131
8132 Pos->second.first.setBits(Visitor.getInstanceBits());
8133 Pos->second.first.setHasMoreThanOneDecl(Visitor.instanceHasMoreThanOneDecl());
8134 Pos->second.second.setBits(Visitor.getFactoryBits());
8135 Pos->second.second.setHasMoreThanOneDecl(Visitor.factoryHasMoreThanOneDecl());
8136
8137 // Add methods to the global pool *after* setting hasMoreThanOneDecl, since
8138 // when building a module we keep every method individually and may need to
8139 // update hasMoreThanOneDecl as we add the methods.
8140 addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first);
8141 addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second);
8142}
8143
8144void ASTReader::updateOutOfDateSelector(Selector Sel) {
8145 if (SelectorOutOfDate[Sel])
8146 ReadMethodPool(Sel);
8147}
8148
8149void ASTReader::ReadKnownNamespaces(
8150 SmallVectorImpl<NamespaceDecl *> &Namespaces) {
8151 Namespaces.clear();
8152
8153 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
8154 if (NamespaceDecl *Namespace
8155 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I])))
8156 Namespaces.push_back(Namespace);
8157 }
8158}
8159
8160void ASTReader::ReadUndefinedButUsed(
8161 llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) {
8162 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
8163 NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++]));
8164 SourceLocation Loc =
8165 SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]);
8166 Undefined.insert(std::make_pair(D, Loc));
8167 }
8168}
8169
8170void ASTReader::ReadMismatchingDeleteExpressions(llvm::MapVector<
8171 FieldDecl *, llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> &
8172 Exprs) {
8173 for (unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) {
8174 FieldDecl *FD = cast<FieldDecl>(GetDecl(DelayedDeleteExprs[Idx++]));
8175 uint64_t Count = DelayedDeleteExprs[Idx++];
8176 for (uint64_t C = 0; C < Count; ++C) {
8177 SourceLocation DeleteLoc =
8178 SourceLocation::getFromRawEncoding(DelayedDeleteExprs[Idx++]);
8179 const bool IsArrayForm = DelayedDeleteExprs[Idx++];
8180 Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm));
8181 }
8182 }
8183}
8184
8185void ASTReader::ReadTentativeDefinitions(
8186 SmallVectorImpl<VarDecl *> &TentativeDefs) {
8187 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
8188 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I]));
8189 if (Var)
8190 TentativeDefs.push_back(Var);
8191 }
8192 TentativeDefinitions.clear();
8193}
8194
8195void ASTReader::ReadUnusedFileScopedDecls(
8196 SmallVectorImpl<const DeclaratorDecl *> &Decls) {
8197 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
8198 DeclaratorDecl *D
8199 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I]));
8200 if (D)
8201 Decls.push_back(D);
8202 }
8203 UnusedFileScopedDecls.clear();
8204}
8205
8206void ASTReader::ReadDelegatingConstructors(
8207 SmallVectorImpl<CXXConstructorDecl *> &Decls) {
8208 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
8209 CXXConstructorDecl *D
8210 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I]));
8211 if (D)
8212 Decls.push_back(D);
8213 }
8214 DelegatingCtorDecls.clear();
8215}
8216
8217void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) {
8218 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
8219 TypedefNameDecl *D
8220 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I]));
8221 if (D)
8222 Decls.push_back(D);
8223 }
8224 ExtVectorDecls.clear();
8225}
8226
8227void ASTReader::ReadUnusedLocalTypedefNameCandidates(
8228 llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) {
8229 for (unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N;
8230 ++I) {
8231 TypedefNameDecl *D = dyn_cast_or_null<TypedefNameDecl>(
8232 GetDecl(UnusedLocalTypedefNameCandidates[I]));
8233 if (D)
8234 Decls.insert(D);
8235 }
8236 UnusedLocalTypedefNameCandidates.clear();
8237}
8238
8239void ASTReader::ReadReferencedSelectors(
8240 SmallVectorImpl<std::pair<Selector, SourceLocation>> &Sels) {
8241 if (ReferencedSelectorsData.empty())
8242 return;
8243
8244 // If there are @selector references added them to its pool. This is for
8245 // implementation of -Wselector.
8246 unsigned int DataSize = ReferencedSelectorsData.size()-1;
8247 unsigned I = 0;
8248 while (I < DataSize) {
8249 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]);
8250 SourceLocation SelLoc
8251 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]);
8252 Sels.push_back(std::make_pair(Sel, SelLoc));
8253 }
8254 ReferencedSelectorsData.clear();
8255}
8256
8257void ASTReader::ReadWeakUndeclaredIdentifiers(
8258 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo>> &WeakIDs) {
8259 if (WeakUndeclaredIdentifiers.empty())
8260 return;
8261
8262 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) {
8263 IdentifierInfo *WeakId
8264 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
8265 IdentifierInfo *AliasId
8266 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
8267 SourceLocation Loc
8268 = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]);
8269 bool Used = WeakUndeclaredIdentifiers[I++];
8270 WeakInfo WI(AliasId, Loc);
8271 WI.setUsed(Used);
8272 WeakIDs.push_back(std::make_pair(WeakId, WI));
8273 }
8274 WeakUndeclaredIdentifiers.clear();
8275}
8276
8277void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) {
8278 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) {
8279 ExternalVTableUse VT;
8280 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++]));
8281 VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]);
8282 VT.DefinitionRequired = VTableUses[Idx++];
8283 VTables.push_back(VT);
8284 }
8285
8286 VTableUses.clear();
8287}
8288
8289void ASTReader::ReadPendingInstantiations(
8290 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation>> &Pending) {
8291 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
8292 ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++]));
8293 SourceLocation Loc
8294 = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]);
8295
8296 Pending.push_back(std::make_pair(D, Loc));
8297 }
8298 PendingInstantiations.clear();
8299}
8300
8301void ASTReader::ReadLateParsedTemplates(
8302 llvm::MapVector<const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>
8303 &LPTMap) {
8304 for (unsigned Idx = 0, N = LateParsedTemplates.size(); Idx < N;
8305 /* In loop */) {
8306 FunctionDecl *FD = cast<FunctionDecl>(GetDecl(LateParsedTemplates[Idx++]));
8307
8308 auto LT = llvm::make_unique<LateParsedTemplate>();
8309 LT->D = GetDecl(LateParsedTemplates[Idx++]);
8310
8311 ModuleFile *F = getOwningModuleFile(LT->D);
8312 assert(F && "No module")((F && "No module") ? static_cast<void> (0) : __assert_fail
("F && \"No module\"", "/build/llvm-toolchain-snapshot-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 8312, __PRETTY_FUNCTION__))
;
8313
8314 unsigned TokN = LateParsedTemplates[Idx++];
8315 LT->Toks.reserve(TokN);
8316 for (unsigned T = 0; T < TokN; ++T)
8317 LT->Toks.push_back(ReadToken(*F, LateParsedTemplates, Idx));
8318
8319 LPTMap.insert(std::make_pair(FD, std::move(LT)));
8320 }
8321
8322 LateParsedTemplates.clear();
8323}
8324
8325void ASTReader::LoadSelector(Selector Sel) {
8326 // It would be complicated to avoid reading the methods anyway. So don't.
8327 ReadMethodPool(Sel);
8328}
8329
8330void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) {
8331 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 8331, __PRETTY_FUNCTION__))
;
8332 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 8332, __PRETTY_FUNCTION__))
;
8333 IdentifiersLoaded[ID - 1] = II;
8334 if (DeserializationListener)
8335 DeserializationListener->IdentifierRead(ID, II);
8336}
8337
8338/// Set the globally-visible declarations associated with the given
8339/// identifier.
8340///
8341/// If the AST reader is currently in a state where the given declaration IDs
8342/// cannot safely be resolved, they are queued until it is safe to resolve
8343/// them.
8344///
8345/// \param II an IdentifierInfo that refers to one or more globally-visible
8346/// declarations.
8347///
8348/// \param DeclIDs the set of declaration IDs with the name @p II that are
8349/// visible at global scope.
8350///
8351/// \param Decls if non-null, this vector will be populated with the set of
8352/// deserialized declarations. These declarations will not be pushed into
8353/// scope.
8354void
8355ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II,
8356 const SmallVectorImpl<uint32_t> &DeclIDs,
8357 SmallVectorImpl<Decl *> *Decls) {
8358 if (NumCurrentElementsDeserializing && !Decls) {
8359 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
8360 return;
8361 }
8362
8363 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
8364 if (!SemaObj) {
8365 // Queue this declaration so that it will be added to the
8366 // translation unit scope and identifier's declaration chain
8367 // once a Sema object is known.
8368 PreloadedDeclIDs.push_back(DeclIDs[I]);
8369 continue;
8370 }
8371
8372 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I]));
8373
8374 // If we're simply supposed to record the declarations, do so now.
8375 if (Decls) {
8376 Decls->push_back(D);
8377 continue;
8378 }
8379
8380 // Introduce this declaration into the translation-unit scope
8381 // and add it to the declaration chain for this identifier, so
8382 // that (unqualified) name lookup will find it.
8383 pushExternalDeclIntoScope(D, II);
8384 }
8385}
8386
8387IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) {
8388 if (ID == 0)
8389 return nullptr;
8390
8391 if (IdentifiersLoaded.empty()) {
8392 Error("no identifier table in AST file");
8393 return nullptr;
8394 }
8395
8396 ID -= 1;
8397 if (!IdentifiersLoaded[ID]) {
8398 GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1);
8399 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 8399, __PRETTY_FUNCTION__))
;
8400 ModuleFile *M = I->second;
8401 unsigned Index = ID - M->BaseIdentifierID;
8402 const char *Str = M->IdentifierTableData + M->IdentifierOffsets[Index];
8403
8404 // All of the strings in the AST file are preceded by a 16-bit length.
8405 // Extract that 16-bit length to avoid having to execute strlen().
8406 // NOTE: 'StrLenPtr' is an 'unsigned char*' so that we load bytes as
8407 // unsigned integers. This is important to avoid integer overflow when
8408 // we cast them to 'unsigned'.
8409 const unsigned char *StrLenPtr = (const unsigned char*) Str - 2;
8410 unsigned StrLen = (((unsigned) StrLenPtr[0])
8411 | (((unsigned) StrLenPtr[1]) << 8)) - 1;
8412 auto &II = PP.getIdentifierTable().get(StringRef(Str, StrLen));
8413 IdentifiersLoaded[ID] = &II;
8414 markIdentifierFromAST(*this, II);
8415 if (DeserializationListener)
8416 DeserializationListener->IdentifierRead(ID + 1, &II);
8417 }
8418
8419 return IdentifiersLoaded[ID];
8420}
8421
8422IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) {
8423 return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID));
8424}
8425
8426IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) {
8427 if (LocalID < NUM_PREDEF_IDENT_IDS)
8428 return LocalID;
8429
8430 if (!M.ModuleOffsetMap.empty())
8431 ReadModuleOffsetMap(M);
8432
8433 ContinuousRangeMap<uint32_t, int, 2>::iterator I
8434 = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS);
8435 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 8436, __PRETTY_FUNCTION__))
8436 && "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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 8436, __PRETTY_FUNCTION__))
;
8437
8438 return LocalID + I->second;
8439}
8440
8441MacroInfo *ASTReader::getMacro(MacroID ID) {
8442 if (ID == 0)
8443 return nullptr;
8444
8445 if (MacrosLoaded.empty()) {
8446 Error("no macro table in AST file");
8447 return nullptr;
8448 }
8449
8450 ID -= NUM_PREDEF_MACRO_IDS;
8451 if (!MacrosLoaded[ID]) {
8452 GlobalMacroMapType::iterator I
8453 = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS);
8454 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 8454, __PRETTY_FUNCTION__))
;
8455 ModuleFile *M = I->second;
8456 unsigned Index = ID - M->BaseMacroID;
8457 MacrosLoaded[ID] = ReadMacroRecord(*M, M->MacroOffsets[Index]);
8458
8459 if (DeserializationListener)
8460 DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS,
8461 MacrosLoaded[ID]);
8462 }
8463
8464 return MacrosLoaded[ID];
8465}
8466
8467MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) {
8468 if (LocalID < NUM_PREDEF_MACRO_IDS)
8469 return LocalID;
8470
8471 if (!M.ModuleOffsetMap.empty())
8472 ReadModuleOffsetMap(M);
8473
8474 ContinuousRangeMap<uint32_t, int, 2>::iterator I
8475 = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS);
8476 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 8476, __PRETTY_FUNCTION__))
;
8477
8478 return LocalID + I->second;
8479}
8480
8481serialization::SubmoduleID
8482ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) {
8483 if (LocalID < NUM_PREDEF_SUBMODULE_IDS)
8484 return LocalID;
8485
8486 if (!M.ModuleOffsetMap.empty())
8487 ReadModuleOffsetMap(M);
8488
8489 ContinuousRangeMap<uint32_t, int, 2>::iterator I
8490 = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS);
8491 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 8492, __PRETTY_FUNCTION__))
8492 && "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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 8492, __PRETTY_FUNCTION__))
;
8493
8494 return LocalID + I->second;
8495}
8496
8497Module *ASTReader::getSubmodule(SubmoduleID GlobalID) {
8498 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) {
8499 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 8499, __PRETTY_FUNCTION__))
;
8500 return nullptr;
8501 }
8502
8503 if (GlobalID > SubmodulesLoaded.size()) {
8504 Error("submodule ID out of range in AST file");
8505 return nullptr;
8506 }
8507
8508 return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS];
8509}
8510
8511Module *ASTReader::getModule(unsigned ID) {
8512 return getSubmodule(ID);
8513}
8514
8515bool ASTReader::DeclIsFromPCHWithObjectFile(const Decl *D) {
8516 ModuleFile *MF = getOwningModuleFile(D);
8517 return MF && MF->PCHHasObjectFile;
8518}
8519
8520ModuleFile *ASTReader::getLocalModuleFile(ModuleFile &F, unsigned ID) {
8521 if (ID & 1) {
8522 // It's a module, look it up by submodule ID.
8523 auto I = GlobalSubmoduleMap.find(getGlobalSubmoduleID(F, ID >> 1));
8524 return I == GlobalSubmoduleMap.end() ? nullptr : I->second;
8525 } else {
8526 // It's a prefix (preamble, PCH, ...). Look it up by index.
8527 unsigned IndexFromEnd = ID >> 1;
8528 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 8528, __PRETTY_FUNCTION__))
;
8529 return getModuleManager().pch_modules().end()[-IndexFromEnd];
8530 }
8531}
8532
8533unsigned ASTReader::getModuleFileID(ModuleFile *F) {
8534 if (!F)
8535 return 1;
8536
8537 // For a file representing a module, use the submodule ID of the top-level
8538 // module as the file ID. For any other kind of file, the number of such
8539 // files loaded beforehand will be the same on reload.
8540 // FIXME: Is this true even if we have an explicit module file and a PCH?
8541 if (F->isModule())
8542 return ((F->BaseSubmoduleID + NUM_PREDEF_SUBMODULE_IDS) << 1) | 1;
8543
8544 auto PCHModules = getModuleManager().pch_modules();
8545 auto I = llvm::find(PCHModules, F);
8546 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 8546, __PRETTY_FUNCTION__))
;
8547 return (I - PCHModules.end()) << 1;
8548}
8549
8550llvm::Optional<ExternalASTSource::ASTSourceDescriptor>
8551ASTReader::getSourceDescriptor(unsigned ID) {
8552 if (const Module *M = getSubmodule(ID))
8553 return ExternalASTSource::ASTSourceDescriptor(*M);
8554
8555 // If there is only a single PCH, return it instead.
8556 // Chained PCH are not supported.
8557 const auto &PCHChain = ModuleMgr.pch_modules();
8558 if (std::distance(std::begin(PCHChain), std::end(PCHChain))) {
8559 ModuleFile &MF = ModuleMgr.getPrimaryModule();
8560 StringRef ModuleName = llvm::sys::path::filename(MF.OriginalSourceFileName);
8561 StringRef FileName = llvm::sys::path::filename(MF.FileName);
8562 return ASTReader::ASTSourceDescriptor(ModuleName, MF.OriginalDir, FileName,
8563 MF.Signature);
8564 }
8565 return None;
8566}
8567
8568ExternalASTSource::ExtKind ASTReader::hasExternalDefinitions(const Decl *FD) {
8569 auto I = DefinitionSource.find(FD);
8570 if (I == DefinitionSource.end())
8571 return EK_ReplyHazy;
8572 return I->second ? EK_Never : EK_Always;
8573}
8574
8575Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) {
8576 return DecodeSelector(getGlobalSelectorID(M, LocalID));
8577}
8578
8579Selector ASTReader::DecodeSelector(serialization::SelectorID ID) {
8580 if (ID == 0)
8581 return Selector();
8582
8583 if (ID > SelectorsLoaded.size()) {
8584 Error("selector ID out of range in AST file");
8585 return Selector();
8586 }
8587
8588 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) {
8589 // Load this selector from the selector table.
8590 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID);
8591 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 8591, __PRETTY_FUNCTION__))
;
8592 ModuleFile &M = *I->second;
8593 ASTSelectorLookupTrait Trait(*this, M);
8594 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS;
8595 SelectorsLoaded[ID - 1] =
8596 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0);
8597 if (DeserializationListener)
8598 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
8599 }
8600
8601 return SelectorsLoaded[ID - 1];
8602}
8603
8604Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) {
8605 return DecodeSelector(ID);
8606}
8607
8608uint32_t ASTReader::GetNumExternalSelectors() {
8609 // ID 0 (the null selector) is considered an external selector.
8610 return getTotalNumSelectors() + 1;
8611}
8612
8613serialization::SelectorID
8614ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const {
8615 if (LocalID < NUM_PREDEF_SELECTOR_IDS)
8616 return LocalID;
8617
8618 if (!M.ModuleOffsetMap.empty())
8619 ReadModuleOffsetMap(M);
8620
8621 ContinuousRangeMap<uint32_t, int, 2>::iterator I
8622 = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS);
8623 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 8624, __PRETTY_FUNCTION__))
8624 && "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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 8624, __PRETTY_FUNCTION__))
;
8625
8626 return LocalID + I->second;
8627}
8628
8629DeclarationName
8630ASTReader::ReadDeclarationName(ModuleFile &F,
8631 const RecordData &Record, unsigned &Idx) {
8632 ASTContext &Context = getContext();
8633 DeclarationName::NameKind Kind = (DeclarationName::NameKind)Record[Idx++];
8634 switch (Kind) {
8635 case DeclarationName::Identifier:
8636 return DeclarationName(GetIdentifierInfo(F, Record, Idx));
8637
8638 case DeclarationName::ObjCZeroArgSelector:
8639 case DeclarationName::ObjCOneArgSelector:
8640 case DeclarationName::ObjCMultiArgSelector:
8641 return DeclarationName(ReadSelector(F, Record, Idx));
8642
8643 case DeclarationName::CXXConstructorName:
8644 return Context.DeclarationNames.getCXXConstructorName(
8645 Context.getCanonicalType(readType(F, Record, Idx)));
8646
8647 case DeclarationName::CXXDestructorName:
8648 return Context.DeclarationNames.getCXXDestructorName(
8649 Context.getCanonicalType(readType(F, Record, Idx)));
8650
8651 case DeclarationName::CXXDeductionGuideName:
8652 return Context.DeclarationNames.getCXXDeductionGuideName(
8653 ReadDeclAs<TemplateDecl>(F, Record, Idx));
8654
8655 case DeclarationName::CXXConversionFunctionName:
8656 return Context.DeclarationNames.getCXXConversionFunctionName(
8657 Context.getCanonicalType(readType(F, Record, Idx)));
8658
8659 case DeclarationName::CXXOperatorName:
8660 return Context.DeclarationNames.getCXXOperatorName(
8661 (OverloadedOperatorKind)Record[Idx++]);
8662
8663 case DeclarationName::CXXLiteralOperatorName:
8664 return Context.DeclarationNames.getCXXLiteralOperatorName(
8665 GetIdentifierInfo(F, Record, Idx));
8666
8667 case DeclarationName::CXXUsingDirective:
8668 return DeclarationName::getUsingDirectiveName();
8669 }
8670
8671 llvm_unreachable("Invalid NameKind!")::llvm::llvm_unreachable_internal("Invalid NameKind!", "/build/llvm-toolchain-snapshot-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 8671)
;
8672}
8673
8674void ASTReader::ReadDeclarationNameLoc(ModuleFile &F,
8675 DeclarationNameLoc &DNLoc,
8676 DeclarationName Name,
8677 const RecordData &Record, unsigned &Idx) {
8678 switch (Name.getNameKind()) {
8679 case DeclarationName::CXXConstructorName:
8680 case DeclarationName::CXXDestructorName:
8681 case DeclarationName::CXXConversionFunctionName:
8682 DNLoc.NamedType.TInfo = GetTypeSourceInfo(F, Record, Idx);
8683 break;
8684
8685 case DeclarationName::CXXOperatorName:
8686 DNLoc.CXXOperatorName.BeginOpNameLoc
8687 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
8688 DNLoc.CXXOperatorName.EndOpNameLoc
8689 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
8690 break;
8691
8692 case DeclarationName::CXXLiteralOperatorName:
8693 DNLoc.CXXLiteralOperatorName.OpNameLoc
8694 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
8695 break;
8696
8697 case DeclarationName::Identifier:
8698 case DeclarationName::ObjCZeroArgSelector:
8699 case DeclarationName::ObjCOneArgSelector:
8700 case DeclarationName::ObjCMultiArgSelector:
8701 case DeclarationName::CXXUsingDirective:
8702 case DeclarationName::CXXDeductionGuideName:
8703 break;
8704 }
8705}
8706
8707void ASTReader::ReadDeclarationNameInfo(ModuleFile &F,
8708 DeclarationNameInfo &NameInfo,
8709 const RecordData &Record, unsigned &Idx) {
8710 NameInfo.setName(ReadDeclarationName(F, Record, Idx));
8711 NameInfo.setLoc(ReadSourceLocation(F, Record, Idx));
8712 DeclarationNameLoc DNLoc;
8713 ReadDeclarationNameLoc(F, DNLoc, NameInfo.getName(), Record, Idx);
8714 NameInfo.setInfo(DNLoc);
8715}
8716
8717void ASTReader::ReadQualifierInfo(ModuleFile &F, QualifierInfo &Info,
8718 const RecordData &Record, unsigned &Idx) {
8719 Info.QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx);
8720 unsigned NumTPLists = Record[Idx++];
8721 Info.NumTemplParamLists = NumTPLists;
8722 if (NumTPLists) {
8723 Info.TemplParamLists =
8724 new (getContext()) TemplateParameterList *[NumTPLists];
8725 for (unsigned i = 0; i != NumTPLists; ++i)
8726 Info.TemplParamLists[i] = ReadTemplateParameterList(F, Record, Idx);
8727 }
8728}
8729
8730TemplateName
8731ASTReader::ReadTemplateName(ModuleFile &F, const RecordData &Record,
8732 unsigned &Idx) {
8733 ASTContext &Context = getContext();
8734 TemplateName::NameKind Kind = (TemplateName::NameKind)Record[Idx++];
8735 switch (Kind) {
8736 case TemplateName::Template:
8737 return TemplateName(ReadDeclAs<TemplateDecl>(F, Record, Idx));
8738
8739 case TemplateName::OverloadedTemplate: {
8740 unsigned size = Record[Idx++];
8741 UnresolvedSet<8> Decls;
8742 while (size--)
8743 Decls.addDecl(ReadDeclAs<NamedDecl>(F, Record, Idx));
8744
8745 return Context.getOverloadedTemplateName(Decls.begin(), Decls.end());
8746 }
8747
8748 case TemplateName::AssumedTemplate: {
8749 DeclarationName Name = ReadDeclarationName(F, Record, Idx);
8750 return Context.getAssumedTemplateName(Name);
8751 }
8752
8753 case TemplateName::QualifiedTemplate: {
8754 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
8755 bool hasTemplKeyword = Record[Idx++];
8756 TemplateDecl *Template = ReadDeclAs<TemplateDecl>(F, Record, Idx);
8757 return Context.getQualifiedTemplateName(NNS, hasTemplKeyword, Template);
8758 }
8759
8760 case TemplateName::DependentTemplate: {
8761 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
8762 if (Record[Idx++]) // isIdentifier
8763 return Context.getDependentTemplateName(NNS,
8764 GetIdentifierInfo(F, Record,
8765 Idx));
8766 return Context.getDependentTemplateName(NNS,
8767 (OverloadedOperatorKind)Record[Idx++]);
8768 }
8769
8770 case TemplateName::SubstTemplateTemplateParm: {
8771 TemplateTemplateParmDecl *param
8772 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
8773 if (!param) return TemplateName();
8774 TemplateName replacement = ReadTemplateName(F, Record, Idx);
8775 return Context.getSubstTemplateTemplateParm(param, replacement);
8776 }
8777
8778 case TemplateName::SubstTemplateTemplateParmPack: {
8779 TemplateTemplateParmDecl *Param
8780 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
8781 if (!Param)
8782 return TemplateName();
8783
8784 TemplateArgument ArgPack = ReadTemplateArgument(F, Record, Idx);
8785 if (ArgPack.getKind() != TemplateArgument::Pack)
8786 return TemplateName();
8787
8788 return Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
8789 }
8790 }
8791
8792 llvm_unreachable("Unhandled template name kind!")::llvm::llvm_unreachable_internal("Unhandled template name kind!"
, "/build/llvm-toolchain-snapshot-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 8792)
;
8793}
8794
8795TemplateArgument ASTReader::ReadTemplateArgument(ModuleFile &F,
8796 const RecordData &Record,
8797 unsigned &Idx,
8798 bool Canonicalize) {
8799 ASTContext &Context = getContext();
8800 if (Canonicalize) {
8801 // The caller wants a canonical template argument. Sometimes the AST only
8802 // wants template arguments in canonical form (particularly as the template
8803 // argument lists of template specializations) so ensure we preserve that
8804 // canonical form across serialization.
8805 TemplateArgument Arg = ReadTemplateArgument(F, Record, Idx, false);
8806 return Context.getCanonicalTemplateArgument(Arg);
8807 }
8808
8809 TemplateArgument::ArgKind Kind = (TemplateArgument::ArgKind)Record[Idx++];
8810 switch (Kind) {
8811 case TemplateArgument::Null:
8812 return TemplateArgument();
8813 case TemplateArgument::Type:
8814 return TemplateArgument(readType(F, Record, Idx));
8815 case TemplateArgument::Declaration: {
8816 ValueDecl *D = ReadDeclAs<ValueDecl>(F, Record, Idx);
8817 return TemplateArgument(D, readType(F, Record, Idx));
8818 }
8819 case TemplateArgument::NullPtr:
8820 return TemplateArgument(readType(F, Record, Idx), /*isNullPtr*/true);
8821 case TemplateArgument::Integral: {
8822 llvm::APSInt Value = ReadAPSInt(Record, Idx);
8823 QualType T = readType(F, Record, Idx);
8824 return TemplateArgument(Context, Value, T);
8825 }
8826 case TemplateArgument::Template:
8827 return TemplateArgument(ReadTemplateName(F, Record, Idx));
8828 case TemplateArgument::TemplateExpansion: {
8829 TemplateName Name = ReadTemplateName(F, Record, Idx);
8830 Optional<unsigned> NumTemplateExpansions;
8831 if (unsigned NumExpansions = Record[Idx++])
8832 NumTemplateExpansions = NumExpansions - 1;
8833 return TemplateArgument(Name, NumTemplateExpansions);
8834 }
8835 case TemplateArgument::Expression:
8836 return TemplateArgument(ReadExpr(F));
8837 case TemplateArgument::Pack: {
8838 unsigned NumArgs = Record[Idx++];
8839 TemplateArgument *Args = new (Context) TemplateArgument[NumArgs];
8840 for (unsigned I = 0; I != NumArgs; ++I)
8841 Args[I] = ReadTemplateArgument(F, Record, Idx);
8842 return TemplateArgument(llvm::makeArrayRef(Args, NumArgs));
8843 }
8844 }
8845
8846 llvm_unreachable("Unhandled template argument kind!")::llvm::llvm_unreachable_internal("Unhandled template argument kind!"
, "/build/llvm-toolchain-snapshot-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 8846)
;
8847}
8848
8849TemplateParameterList *
8850ASTReader::ReadTemplateParameterList(ModuleFile &F,
8851 const RecordData &Record, unsigned &Idx) {
8852 SourceLocation TemplateLoc = ReadSourceLocation(F, Record, Idx);
8853 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Idx);
8854 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Idx);
8855
8856 unsigned NumParams = Record[Idx++];
8857 SmallVector<NamedDecl *, 16> Params;
8858 Params.reserve(NumParams);
8859 while (NumParams--)
8860 Params.push_back(ReadDeclAs<NamedDecl>(F, Record, Idx));
8861
8862 // TODO: Concepts
8863 TemplateParameterList *TemplateParams = TemplateParameterList::Create(
8864 getContext(), TemplateLoc, LAngleLoc, Params, RAngleLoc, nullptr);
8865 return TemplateParams;
8866}
8867
8868void
8869ASTReader::
8870ReadTemplateArgumentList(SmallVectorImpl<TemplateArgument> &TemplArgs,
8871 ModuleFile &F, const RecordData &Record,
8872 unsigned &Idx, bool Canonicalize) {
8873 unsigned NumTemplateArgs = Record[Idx++];
8874 TemplArgs.reserve(NumTemplateArgs);
8875 while (NumTemplateArgs--)
8876 TemplArgs.push_back(ReadTemplateArgument(F, Record, Idx, Canonicalize));
8877}
8878
8879/// Read a UnresolvedSet structure.
8880void ASTReader::ReadUnresolvedSet(ModuleFile &F, LazyASTUnresolvedSet &Set,
8881 const RecordData &Record, unsigned &Idx) {
8882 unsigned NumDecls = Record[Idx++];
8883 Set.reserve(getContext(), NumDecls);
8884 while (NumDecls--) {
8885 DeclID ID = ReadDeclID(F, Record, Idx);
8886 AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
8887 Set.addLazyDecl(getContext(), ID, AS);
8888 }
8889}
8890
8891CXXBaseSpecifier
8892ASTReader::ReadCXXBaseSpecifier(ModuleFile &F,
8893 const RecordData &Record, unsigned &Idx) {
8894 bool isVirtual = static_cast<bool>(Record[Idx++]);
8895 bool isBaseOfClass = static_cast<bool>(Record[Idx++]);
8896 AccessSpecifier AS = static_cast<AccessSpecifier>(Record[Idx++]);
8897 bool inheritConstructors = static_cast<bool>(Record[Idx++]);
8898 TypeSourceInfo *TInfo = GetTypeSourceInfo(F, Record, Idx);
8899 SourceRange Range = ReadSourceRange(F, Record, Idx);
8900 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Idx);
8901 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo,
8902 EllipsisLoc);
8903 Result.setInheritConstructors(inheritConstructors);
8904 return Result;
8905}
8906
8907CXXCtorInitializer **
8908ASTReader::ReadCXXCtorInitializers(ModuleFile &F, const RecordData &Record,
8909 unsigned &Idx) {
8910 ASTContext &Context = getContext();
8911 unsigned NumInitializers = Record[Idx++];
8912 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 8912, __PRETTY_FUNCTION__))
;
8913 auto **CtorInitializers = new (Context) CXXCtorInitializer*[NumInitializers];
8914 for (unsigned i = 0; i != NumInitializers; ++i) {
8915 TypeSourceInfo *TInfo = nullptr;
8916 bool IsBaseVirtual = false;
8917 FieldDecl *Member = nullptr;
8918 IndirectFieldDecl *IndirectMember = nullptr;
8919
8920 CtorInitializerType Type = (CtorInitializerType)Record[Idx++];
8921 switch (Type) {
8922 case CTOR_INITIALIZER_BASE:
8923 TInfo = GetTypeSourceInfo(F, Record, Idx);
8924 IsBaseVirtual = Record[Idx++];
8925 break;
8926
8927 case CTOR_INITIALIZER_DELEGATING:
8928 TInfo = GetTypeSourceInfo(F, Record, Idx);
8929 break;
8930
8931 case CTOR_INITIALIZER_MEMBER:
8932 Member = ReadDeclAs<FieldDecl>(F, Record, Idx);
8933 break;
8934
8935 case CTOR_INITIALIZER_INDIRECT_MEMBER:
8936 IndirectMember = ReadDeclAs<IndirectFieldDecl>(F, Record, Idx);
8937 break;
8938 }
8939
8940 SourceLocation MemberOrEllipsisLoc = ReadSourceLocation(F, Record, Idx);
8941 Expr *Init = ReadExpr(F);
8942 SourceLocation LParenLoc = ReadSourceLocation(F, Record, Idx);
8943 SourceLocation RParenLoc = ReadSourceLocation(F, Record, Idx);
8944
8945 CXXCtorInitializer *BOMInit;
8946 if (Type == CTOR_INITIALIZER_BASE)
8947 BOMInit = new (Context)
8948 CXXCtorInitializer(Context, TInfo, IsBaseVirtual, LParenLoc, Init,
8949 RParenLoc, MemberOrEllipsisLoc);
8950 else if (Type == CTOR_INITIALIZER_DELEGATING)
8951 BOMInit = new (Context)
8952 CXXCtorInitializer(Context, TInfo, LParenLoc, Init, RParenLoc);
8953 else if (Member)
8954 BOMInit = new (Context)
8955 CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc, LParenLoc,
8956 Init, RParenLoc);
8957 else
8958 BOMInit = new (Context)
8959 CXXCtorInitializer(Context, IndirectMember, MemberOrEllipsisLoc,
8960 LParenLoc, Init, RParenLoc);
8961
8962 if (/*IsWritten*/Record[Idx++]) {
8963 unsigned SourceOrder = Record[Idx++];
8964 BOMInit->setSourceOrder(SourceOrder);
8965 }
8966
8967 CtorInitializers[i] = BOMInit;
8968 }
8969
8970 return CtorInitializers;
8971}
8972
8973NestedNameSpecifier *
8974ASTReader::ReadNestedNameSpecifier(ModuleFile &F,
8975 const RecordData &Record, unsigned &Idx) {
8976 ASTContext &Context = getContext();
8977 unsigned N = Record[Idx++];
8978 NestedNameSpecifier *NNS = nullptr, *Prev = nullptr;
8979 for (unsigned I = 0; I != N; ++I) {
8980 NestedNameSpecifier::SpecifierKind Kind
8981 = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
8982 switch (Kind) {
8983 case NestedNameSpecifier::Identifier: {
8984 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
8985 NNS = NestedNameSpecifier::Create(Context, Prev, II);
8986 break;
8987 }
8988
8989 case NestedNameSpecifier::Namespace: {
8990 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
8991 NNS = NestedNameSpecifier::Create(Context, Prev, NS);
8992 break;
8993 }
8994
8995 case NestedNameSpecifier::NamespaceAlias: {
8996 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
8997 NNS = NestedNameSpecifier::Create(Context, Prev, Alias);
8998 break;
8999 }
9000
9001 case NestedNameSpecifier::TypeSpec:
9002 case NestedNameSpecifier::TypeSpecWithTemplate: {
9003 const Type *T = readType(F, Record, Idx).getTypePtrOrNull();
9004 if (!T)
9005 return nullptr;
9006
9007 bool Template = Record[Idx++];
9008 NNS = NestedNameSpecifier::Create(Context, Prev, Template, T);
9009 break;
9010 }
9011
9012 case NestedNameSpecifier::Global:
9013 NNS = NestedNameSpecifier::GlobalSpecifier(Context);
9014 // No associated value, and there can't be a prefix.
9015 break;
9016
9017 case NestedNameSpecifier::Super: {
9018 CXXRecordDecl *RD = ReadDeclAs<CXXRecordDecl>(F, Record, Idx);
9019 NNS = NestedNameSpecifier::SuperSpecifier(Context, RD);
9020 break;
9021 }
9022 }
9023 Prev = NNS;
9024 }
9025 return NNS;
9026}
9027
9028NestedNameSpecifierLoc
9029ASTReader::ReadNestedNameSpecifierLoc(ModuleFile &F, const RecordData &Record,
9030 unsigned &Idx) {
9031 ASTContext &Context = getContext();
9032 unsigned N = Record[Idx++];
9033 NestedNameSpecifierLocBuilder Builder;
9034 for (unsigned I = 0; I != N; ++I) {
9035 NestedNameSpecifier::SpecifierKind Kind
9036 = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
9037 switch (Kind) {
9038 case NestedNameSpecifier::Identifier: {
9039 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
9040 SourceRange Range = ReadSourceRange(F, Record, Idx);
9041 Builder.Extend(Context, II, Range.getBegin(), Range.getEnd());
9042 break;
9043 }
9044
9045 case NestedNameSpecifier::Namespace: {
9046 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
9047 SourceRange Range = ReadSourceRange(F, Record, Idx);
9048 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
9049 break;
9050 }
9051
9052 case NestedNameSpecifier::NamespaceAlias: {
9053 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
9054 SourceRange Range = ReadSourceRange(F, Record, Idx);
9055 Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd());
9056 break;
9057 }
9058
9059 case NestedNameSpecifier::TypeSpec:
9060 case NestedNameSpecifier::TypeSpecWithTemplate: {
9061 bool Template = Record[Idx++];
9062 TypeSourceInfo *T = GetTypeSourceInfo(F, Record, Idx);
9063 if (!T)
9064 return NestedNameSpecifierLoc();
9065 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
9066
9067 // FIXME: 'template' keyword location not saved anywhere, so we fake it.
9068 Builder.Extend(Context,
9069 Template? T->getTypeLoc().getBeginLoc() : SourceLocation(),
9070 T->getTypeLoc(), ColonColonLoc);
9071 break;
9072 }
9073
9074 case NestedNameSpecifier::Global: {
9075 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
9076 Builder.MakeGlobal(Context, ColonColonLoc);
9077 break;
9078 }
9079
9080 case NestedNameSpecifier::Super: {
9081 CXXRecordDecl *RD = ReadDeclAs<CXXRecordDecl>(F, Record, Idx);
9082 SourceRange Range = ReadSourceRange(F, Record, Idx);
9083 Builder.MakeSuper(Context, RD, Range.getBegin(), Range.getEnd());
9084 break;
9085 }
9086 }
9087 }
9088
9089 return Builder.getWithLocInContext(Context);
9090}
9091
9092SourceRange
9093ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record,
9094 unsigned &Idx) {
9095 SourceLocation beg = ReadSourceLocation(F, Record, Idx);
9096 SourceLocation end = ReadSourceLocation(F, Record, Idx);
9097 return SourceRange(beg, end);
9098}
9099
9100/// Read an integral value
9101llvm::APInt ASTReader::ReadAPInt(const RecordData &Record, unsigned &Idx) {
9102 unsigned BitWidth = Record[Idx++];
9103 unsigned NumWords = llvm::APInt::getNumWords(BitWidth);
9104 llvm::APInt Result(BitWidth, NumWords, &Record[Idx]);
9105 Idx += NumWords;
9106 return Result;
9107}
9108
9109/// Read a signed integral value
9110llvm::APSInt ASTReader::ReadAPSInt(const RecordData &Record, unsigned &Idx) {
9111 bool isUnsigned = Record[Idx++];
9112 return llvm::APSInt(ReadAPInt(Record, Idx), isUnsigned);
9113}
9114
9115/// Read a floating-point value
9116llvm::APFloat ASTReader::ReadAPFloat(const RecordData &Record,
9117 const llvm::fltSemantics &Sem,
9118 unsigned &Idx) {
9119 return llvm::APFloat(Sem, ReadAPInt(Record, Idx));
9120}
9121
9122// Read a string
9123std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) {
9124 unsigned Len = Record[Idx++];
9125 std::string Result(Record.data() + Idx, Record.data() + Idx + Len);
9126 Idx += Len;
9127 return Result;
9128}
9129
9130std::string ASTReader::ReadPath(ModuleFile &F, const RecordData &Record,
9131 unsigned &Idx) {
9132 std::string Filename = ReadString(Record, Idx);
9133 ResolveImportedPath(F, Filename);
9134 return Filename;
9135}
9136
9137std::string ASTReader::ReadPath(StringRef BaseDirectory,
9138 const RecordData &Record, unsigned &Idx) {
9139 std::string Filename = ReadString(Record, Idx);
9140 if (!BaseDirectory.empty())
9141 ResolveImportedPath(Filename, BaseDirectory);
9142 return Filename;
9143}
9144
9145VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record,
9146 unsigned &Idx) {
9147 unsigned Major = Record[Idx++];
9148 unsigned Minor = Record[Idx++];
9149 unsigned Subminor = Record[Idx++];
9150 if (Minor == 0)
9151 return VersionTuple(Major);
9152 if (Subminor == 0)
9153 return VersionTuple(Major, Minor - 1);
9154 return VersionTuple(Major, Minor - 1, Subminor - 1);
9155}
9156
9157CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F,
9158 const RecordData &Record,
9159 unsigned &Idx) {
9160 CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx);
9161 return CXXTemporary::Create(getContext(), Decl);
9162}
9163
9164DiagnosticBuilder ASTReader::Diag(unsigned DiagID) const {
9165 return Diag(CurrentImportLoc, DiagID);
9166}
9167
9168DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) const {
9169 return Diags.Report(Loc, DiagID);
9170}
9171
9172/// Retrieve the identifier table associated with the
9173/// preprocessor.
9174IdentifierTable &ASTReader::getIdentifierTable() {
9175 return PP.getIdentifierTable();
9176}
9177
9178/// Record that the given ID maps to the given switch-case
9179/// statement.
9180void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) {
9181 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 9182, __PRETTY_FUNCTION__))
9182 "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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 9182, __PRETTY_FUNCTION__))
;
9183 (*CurrSwitchCaseStmts)[ID] = SC;
9184}
9185
9186/// Retrieve the switch-case statement with the given ID.
9187SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) {
9188 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 9188, __PRETTY_FUNCTION__))
;
9189 return (*CurrSwitchCaseStmts)[ID];
9190}
9191
9192void ASTReader::ClearSwitchCaseIDs() {
9193 CurrSwitchCaseStmts->clear();
9194}
9195
9196void ASTReader::ReadComments() {
9197 ASTContext &Context = getContext();
9198 std::vector<RawComment *> Comments;
9199 for (SmallVectorImpl<std::pair<BitstreamCursor,
9200 serialization::ModuleFile *>>::iterator
9201 I = CommentsCursors.begin(),
9202 E = CommentsCursors.end();
9203 I != E; ++I) {
9204 Comments.clear();
9205 BitstreamCursor &Cursor = I->first;
9206 serialization::ModuleFile &F = *I->second;
9207 SavedStreamPosition SavedPosition(Cursor);
9208
9209 RecordData Record;
9210 while (true) {
9211 llvm::BitstreamEntry Entry =
9212 Cursor.advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd);
9213
9214 switch (Entry.Kind) {
9215 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
9216 case llvm::BitstreamEntry::Error:
9217 Error("malformed block record in AST file");
9218 return;
9219 case llvm::BitstreamEntry::EndBlock:
9220 goto NextCursor;
9221 case llvm::BitstreamEntry::Record:
9222 // The interesting case.
9223 break;
9224 }
9225
9226 // Read a record.
9227 Record.clear();
9228 switch ((CommentRecordTypes)Cursor.readRecord(Entry.ID, Record)) {
9229 case COMMENTS_RAW_COMMENT: {
9230 unsigned Idx = 0;
9231 SourceRange SR = ReadSourceRange(F, Record, Idx);
9232 RawComment::CommentKind Kind =
9233 (RawComment::CommentKind) Record[Idx++];
9234 bool IsTrailingComment = Record[Idx++];
9235 bool IsAlmostTrailingComment = Record[Idx++];
9236 Comments.push_back(new (Context) RawComment(
9237 SR, Kind, IsTrailingComment, IsAlmostTrailingComment));
9238 break;
9239 }
9240 }
9241 }
9242 NextCursor:
9243 // De-serialized SourceLocations get negative FileIDs for other modules,
9244 // potentially invalidating the original order. Sort it again.
9245 llvm::sort(Comments, BeforeThanCompare<RawComment>(SourceMgr));
9246 Context.Comments.addDeserializedComments(Comments);
9247 }
9248}
9249
9250void ASTReader::visitInputFiles(serialization::ModuleFile &MF,
9251 bool IncludeSystem, bool Complain,
9252 llvm::function_ref<void(const serialization::InputFile &IF,
9253 bool isSystem)> Visitor) {
9254 unsigned NumUserInputs = MF.NumUserInputFiles;
9255 unsigned NumInputs = MF.InputFilesLoaded.size();
9256 assert(NumUserInputs <= NumInputs)((NumUserInputs <= NumInputs) ? static_cast<void> (0
) : __assert_fail ("NumUserInputs <= NumInputs", "/build/llvm-toolchain-snapshot-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 9256, __PRETTY_FUNCTION__))
;
9257 unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
9258 for (unsigned I = 0; I < N; ++I) {
9259 bool IsSystem = I >= NumUserInputs;
9260 InputFile IF = getInputFile(MF, I+1, Complain);
9261 Visitor(IF, IsSystem);
9262 }
9263}
9264
9265void ASTReader::visitTopLevelModuleMaps(
9266 serialization::ModuleFile &MF,
9267 llvm::function_ref<void(const FileEntry *FE)> Visitor) {
9268 unsigned NumInputs = MF.InputFilesLoaded.size();
9269 for (unsigned I = 0; I < NumInputs; ++I) {
9270 InputFileInfo IFI = readInputFileInfo(MF, I + 1);
9271 if (IFI.TopLevelModuleMap)
9272 // FIXME: This unnecessarily re-reads the InputFileInfo.
9273 if (auto *FE = getInputFile(MF, I + 1).getFile())
9274 Visitor(FE);
9275 }
9276}
9277
9278std::string ASTReader::getOwningModuleNameForDiagnostic(const Decl *D) {
9279 // If we know the owning module, use it.
9280 if (Module *M = D->getImportedOwningModule())
9281 return M->getFullModuleName();
9282
9283 // Otherwise, use the name of the top-level module the decl is within.
9284 if (ModuleFile *M = getOwningModuleFile(D))
9285 return M->ModuleName;
9286
9287 // Not from a module.
9288 return {};
9289}
9290
9291void ASTReader::finishPendingActions() {
9292 while (!PendingIdentifierInfos.empty() || !PendingFunctionTypes.empty() ||
9293 !PendingIncompleteDeclChains.empty() || !PendingDeclChains.empty() ||
9294 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() ||
9295 !PendingUpdateRecords.empty()) {
9296 // If any identifiers with corresponding top-level declarations have
9297 // been loaded, load those declarations now.
9298 using TopLevelDeclsMap =
9299 llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2>>;
9300 TopLevelDeclsMap TopLevelDecls;
9301
9302 while (!PendingIdentifierInfos.empty()) {
9303 IdentifierInfo *II = PendingIdentifierInfos.back().first;
9304 SmallVector<uint32_t, 4> DeclIDs =
9305 std::move(PendingIdentifierInfos.back().second);
9306 PendingIdentifierInfos.pop_back();
9307
9308 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]);
9309 }
9310
9311 // Load each function type that we deferred loading because it was a
9312 // deduced type that might refer to a local type declared within itself.
9313 for (unsigned I = 0; I != PendingFunctionTypes.size(); ++I) {
9314 auto *FD = PendingFunctionTypes[I].first;
9315 FD->setType(GetType(PendingFunctionTypes[I].second));
9316
9317 // If we gave a function a deduced return type, remember that we need to
9318 // propagate that along the redeclaration chain.
9319 auto *DT = FD->getReturnType()->getContainedDeducedType();
9320 if (DT && DT->isDeduced())
9321 PendingDeducedTypeUpdates.insert(
9322 {FD->getCanonicalDecl(), FD->getReturnType()});
9323 }
9324 PendingFunctionTypes.clear();
9325
9326 // For each decl chain that we wanted to complete while deserializing, mark
9327 // it as "still needs to be completed".
9328 for (unsigned I = 0; I != PendingIncompleteDeclChains.size(); ++I) {
9329 markIncompleteDeclChain(PendingIncompleteDeclChains[I]);
9330 }
9331 PendingIncompleteDeclChains.clear();
9332
9333 // Load pending declaration chains.
9334 for (unsigned I = 0; I != PendingDeclChains.size(); ++I)
9335 loadPendingDeclChain(PendingDeclChains[I].first,
9336 PendingDeclChains[I].second);
9337 PendingDeclChains.clear();
9338
9339 // Make the most recent of the top-level declarations visible.
9340 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
9341 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
9342 IdentifierInfo *II = TLD->first;
9343 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
9344 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II);
9345 }
9346 }
9347
9348 // Load any pending macro definitions.
9349 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
9350 IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
9351 SmallVector<PendingMacroInfo, 2> GlobalIDs;
9352 GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
9353 // Initialize the macro history from chained-PCHs ahead of module imports.
9354 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
9355 ++IDIdx) {
9356 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
9357 if (!Info.M->isModule())
9358 resolvePendingMacro(II, Info);
9359 }
9360 // Handle module imports.
9361 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
9362 ++IDIdx) {
9363 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
9364 if (Info.M->isModule())
9365 resolvePendingMacro(II, Info);
9366 }
9367 }
9368 PendingMacroIDs.clear();
9369
9370 // Wire up the DeclContexts for Decls that we delayed setting until
9371 // recursive loading is completed.
9372 while (!PendingDeclContextInfos.empty()) {
9373 PendingDeclContextInfo Info = PendingDeclContextInfos.front();
9374 PendingDeclContextInfos.pop_front();
9375 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC));
9376 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC));
9377 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext());
9378 }
9379
9380 // Perform any pending declaration updates.
9381 while (!PendingUpdateRecords.empty()) {
9382 auto Update = PendingUpdateRecords.pop_back_val();
9383 ReadingKindTracker ReadingKind(Read_Decl, *this);
9384 loadDeclUpdateRecords(Update);
9385 }
9386 }
9387
9388 // At this point, all update records for loaded decls are in place, so any
9389 // fake class definitions should have become real.
9390 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 9391, __PRETTY_FUNCTION__))
9391 "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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 9391, __PRETTY_FUNCTION__))
;
9392
9393 // If we deserialized any C++ or Objective-C class definitions, any
9394 // Objective-C protocol definitions, or any redeclarable templates, make sure
9395 // that all redeclarations point to the definitions. Note that this can only
9396 // happen now, after the redeclaration chains have been fully wired.
9397 for (Decl *D : PendingDefinitions) {
9398 if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
9399 if (const TagType *TagT = dyn_cast<TagType>(TD->getTypeForDecl())) {
9400 // Make sure that the TagType points at the definition.
9401 const_cast<TagType*>(TagT)->decl = TD;
9402 }
9403
9404 if (auto RD = dyn_cast<CXXRecordDecl>(D)) {
9405 for (auto *R = getMostRecentExistingDecl(RD); R;
9406 R = R->getPreviousDecl()) {
9407 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 9409, __PRETTY_FUNCTION__))
9408 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 9409, __PRETTY_FUNCTION__))
9409 "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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 9409, __PRETTY_FUNCTION__))
;
9410 cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData;
9411 }
9412 }
9413
9414 continue;
9415 }
9416
9417 if (auto ID = dyn_cast<ObjCInterfaceDecl>(D)) {
9418 // Make sure that the ObjCInterfaceType points at the definition.
9419 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl))
9420 ->Decl = ID;
9421
9422 for (auto *R = getMostRecentExistingDecl(ID); R; R = R->getPreviousDecl())
9423 cast<ObjCInterfaceDecl>(R)->Data = ID->Data;
9424
9425 continue;
9426 }
9427
9428 if (auto PD = dyn_cast<ObjCProtocolDecl>(D)) {
9429 for (auto *R = getMostRecentExistingDecl(PD); R; R = R->getPreviousDecl())
9430 cast<ObjCProtocolDecl>(R)->Data = PD->Data;
9431
9432 continue;
9433 }
9434
9435 auto RTD = cast<RedeclarableTemplateDecl>(D)->getCanonicalDecl();
9436 for (auto *R = getMostRecentExistingDecl(RTD); R; R = R->getPreviousDecl())
9437 cast<RedeclarableTemplateDecl>(R)->Common = RTD->Common;
9438 }
9439 PendingDefinitions.clear();
9440
9441 // Load the bodies of any functions or methods we've encountered. We do
9442 // this now (delayed) so that we can be sure that the declaration chains
9443 // have been fully wired up (hasBody relies on this).
9444 // FIXME: We shouldn't require complete redeclaration chains here.
9445 for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
9446 PBEnd = PendingBodies.end();
9447 PB != PBEnd; ++PB) {
9448 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
9449 // For a function defined inline within a class template, force the
9450 // canonical definition to be the one inside the canonical definition of
9451 // the template. This ensures that we instantiate from a correct view
9452 // of the template.
9453 //
9454 // Sadly we can't do this more generally: we can't be sure that all
9455 // copies of an arbitrary class definition will have the same members
9456 // defined (eg, some member functions may not be instantiated, and some
9457 // special members may or may not have been implicitly defined).
9458 if (auto *RD = dyn_cast<CXXRecordDecl>(FD->getLexicalParent()))
9459 if (RD->isDependentContext() && !RD->isThisDeclarationADefinition())
9460 continue;
9461
9462 // FIXME: Check for =delete/=default?
9463 // FIXME: Complain about ODR violations here?
9464 const FunctionDecl *Defn = nullptr;
9465 if (!getContext().getLangOpts().Modules || !FD->hasBody(Defn)) {
9466 FD->setLazyBody(PB->second);
9467 } else {
9468 auto *NonConstDefn = const_cast<FunctionDecl*>(Defn);
9469 mergeDefinitionVisibility(NonConstDefn, FD);
9470
9471 if (!FD->isLateTemplateParsed() &&
9472 !NonConstDefn->isLateTemplateParsed() &&
9473 FD->getODRHash() != NonConstDefn->getODRHash()) {
9474 if (!isa<CXXMethodDecl>(FD)) {
9475 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
9476 } else if (FD->getLexicalParent()->isFileContext() &&
9477 NonConstDefn->getLexicalParent()->isFileContext()) {
9478 // Only diagnose out-of-line method definitions. If they are
9479 // in class definitions, then an error will be generated when
9480 // processing the class bodies.
9481 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
9482 }
9483 }
9484 }
9485 continue;
9486 }
9487
9488 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first);
9489 if (!getContext().getLangOpts().Modules || !MD->hasBody())
9490 MD->setLazyBody(PB->second);
9491 }
9492 PendingBodies.clear();
9493
9494 // Do some cleanup.
9495 for (auto *ND : PendingMergedDefinitionsToDeduplicate)
9496 getContext().deduplicateMergedDefinitonsFor(ND);
9497 PendingMergedDefinitionsToDeduplicate.clear();
9498}
9499
9500void ASTReader::diagnoseOdrViolations() {
9501 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty() &&
9502 PendingFunctionOdrMergeFailures.empty() &&
9503 PendingEnumOdrMergeFailures.empty())
9504 return;
9505
9506 // Trigger the import of the full definition of each class that had any
9507 // odr-merging problems, so we can produce better diagnostics for them.
9508 // These updates may in turn find and diagnose some ODR failures, so take
9509 // ownership of the set first.
9510 auto OdrMergeFailures = std::move(PendingOdrMergeFailures);
9511 PendingOdrMergeFailures.clear();
9512 for (auto &Merge : OdrMergeFailures) {
9513 Merge.first->buildLookup();
9514 Merge.first->decls_begin();
9515 Merge.first->bases_begin();
9516 Merge.first->vbases_begin();
9517 for (auto &RecordPair : Merge.second) {
9518 auto *RD = RecordPair.first;
9519 RD->decls_begin();
9520 RD->bases_begin();
9521 RD->vbases_begin();
9522 }
9523 }
9524
9525 // Trigger the import of functions.
9526 auto FunctionOdrMergeFailures = std::move(PendingFunctionOdrMergeFailures);
9527 PendingFunctionOdrMergeFailures.clear();
9528 for (auto &Merge : FunctionOdrMergeFailures) {
9529 Merge.first->buildLookup();
9530 Merge.first->decls_begin();
9531 Merge.first->getBody();
9532 for (auto &FD : Merge.second) {
9533 FD->buildLookup();
9534 FD->decls_begin();
9535 FD->getBody();
9536 }
9537 }
9538
9539 // Trigger the import of enums.
9540 auto EnumOdrMergeFailures = std::move(PendingEnumOdrMergeFailures);
9541 PendingEnumOdrMergeFailures.clear();
9542 for (auto &Merge : EnumOdrMergeFailures) {
9543 Merge.first->decls_begin();
9544 for (auto &Enum : Merge.second) {
9545 Enum->decls_begin();
9546 }
9547 }
9548
9549 // For each declaration from a merged context, check that the canonical
9550 // definition of that context also contains a declaration of the same
9551 // entity.
9552 //
9553 // Caution: this loop does things that might invalidate iterators into
9554 // PendingOdrMergeChecks. Don't turn this into a range-based for loop!
9555 while (!PendingOdrMergeChecks.empty()) {
9556 NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
9557
9558 // FIXME: Skip over implicit declarations for now. This matters for things
9559 // like implicitly-declared special member functions. This isn't entirely
9560 // correct; we can end up with multiple unmerged declarations of the same
9561 // implicit entity.
9562 if (D->isImplicit())
9563 continue;
9564
9565 DeclContext *CanonDef = D->getDeclContext();
9566
9567 bool Found = false;
9568 const Decl *DCanon = D->getCanonicalDecl();
9569
9570 for (auto RI : D->redecls()) {
9571 if (RI->getLexicalDeclContext() == CanonDef) {
9572 Found = true;
9573 break;
9574 }
9575 }
9576 if (Found)
9577 continue;
9578
9579 // Quick check failed, time to do the slow thing. Note, we can't just
9580 // look up the name of D in CanonDef here, because the member that is
9581 // in CanonDef might not be found by name lookup (it might have been
9582 // replaced by a more recent declaration in the lookup table), and we
9583 // can't necessarily find it in the redeclaration chain because it might
9584 // be merely mergeable, not redeclarable.
9585 llvm::SmallVector<const NamedDecl*, 4> Candidates;
9586 for (auto *CanonMember : CanonDef->decls()) {
9587 if (CanonMember->getCanonicalDecl() == DCanon) {
9588 // This can happen if the declaration is merely mergeable and not
9589 // actually redeclarable (we looked for redeclarations earlier).
9590 //
9591 // FIXME: We should be able to detect this more efficiently, without
9592 // pulling in all of the members of CanonDef.
9593 Found = true;
9594 break;
9595 }
9596 if (auto *ND = dyn_cast<NamedDecl>(CanonMember))
9597 if (ND->getDeclName() == D->getDeclName())
9598 Candidates.push_back(ND);
9599 }
9600
9601 if (!Found) {
9602 // The AST doesn't like TagDecls becoming invalid after they've been
9603 // completed. We only really need to mark FieldDecls as invalid here.
9604 if (!isa<TagDecl>(D))
9605 D->setInvalidDecl();
9606
9607 // Ensure we don't accidentally recursively enter deserialization while
9608 // we're producing our diagnostic.
9609 Deserializing RecursionGuard(this);
9610
9611 std::string CanonDefModule =
9612 getOwningModuleNameForDiagnostic(cast<Decl>(CanonDef));
9613 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl)
9614 << D << getOwningModuleNameForDiagnostic(D)
9615 << CanonDef << CanonDefModule.empty() << CanonDefModule;
9616
9617 if (Candidates.empty())
9618 Diag(cast<Decl>(CanonDef)->getLocation(),
9619 diag::note_module_odr_violation_no_possible_decls) << D;
9620 else {
9621 for (unsigned I = 0, N = Candidates.size(); I != N; ++I)
9622 Diag(Candidates[I]->getLocation(),
9623 diag::note_module_odr_violation_possible_decl)
9624 << Candidates[I];
9625 }
9626
9627 DiagnosedOdrMergeFailures.insert(CanonDef);
9628 }
9629 }
9630
9631 if (OdrMergeFailures.empty() && FunctionOdrMergeFailures.empty() &&
9632 EnumOdrMergeFailures.empty())
9633 return;
9634
9635 // Ensure we don't accidentally recursively enter deserialization while
9636 // we're producing our diagnostics.
9637 Deserializing RecursionGuard(this);
9638
9639 // Common code for hashing helpers.
9640 ODRHash Hash;
9641 auto ComputeQualTypeODRHash = [&Hash](QualType Ty) {
9642 Hash.clear();
9643 Hash.AddQualType(Ty);
9644 return Hash.CalculateHash();
9645 };
9646
9647 auto ComputeODRHash = [&Hash](const Stmt *S) {
9648 assert(S)((S) ? static_cast<void> (0) : __assert_fail ("S", "/build/llvm-toolchain-snapshot-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 9648, __PRETTY_FUNCTION__))
;
9649 Hash.clear();
9650 Hash.AddStmt(S);
9651 return Hash.CalculateHash();
9652 };
9653
9654 auto ComputeSubDeclODRHash = [&Hash](const Decl *D) {
9655 assert(D)((D) ? static_cast<void> (0) : __assert_fail ("D", "/build/llvm-toolchain-snapshot-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 9655, __PRETTY_FUNCTION__))
;
9656 Hash.clear();
9657 Hash.AddSubDecl(D);
9658 return Hash.CalculateHash();
9659 };
9660
9661 auto ComputeTemplateArgumentODRHash = [&Hash](const TemplateArgument &TA) {
9662 Hash.clear();
9663 Hash.AddTemplateArgument(TA);
9664 return Hash.CalculateHash();
9665 };
9666
9667 auto ComputeTemplateParameterListODRHash =
9668 [&Hash](const TemplateParameterList *TPL) {
9669 assert(TPL)((TPL) ? static_cast<void> (0) : __assert_fail ("TPL", "/build/llvm-toolchain-snapshot-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 9669, __PRETTY_FUNCTION__))
;
9670 Hash.clear();
9671 Hash.AddTemplateParameterList(TPL);
9672 return Hash.CalculateHash();
9673 };
9674
9675 // Issue any pending ODR-failure diagnostics.
9676 for (auto &Merge : OdrMergeFailures) {
9677 // If we've already pointed out a specific problem with this class, don't
9678 // bother issuing a general "something's different" diagnostic.
9679 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
9680 continue;
9681
9682 bool Diagnosed = false;
9683 CXXRecordDecl *FirstRecord = Merge.first;
9684 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstRecord);
9685 for (auto &RecordPair : Merge.second) {
9686 CXXRecordDecl *SecondRecord = RecordPair.first;
9687 // Multiple different declarations got merged together; tell the user
9688 // where they came from.
9689 if (FirstRecord == SecondRecord)
9690 continue;
9691
9692 std::string SecondModule = getOwningModuleNameForDiagnostic(SecondRecord);
9693
9694 auto *FirstDD = FirstRecord->DefinitionData;
9695 auto *SecondDD = RecordPair.second;
9696
9697 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 9697, __PRETTY_FUNCTION__))
;
9698
9699 // Diagnostics from DefinitionData are emitted here.
9700 if (FirstDD != SecondDD) {
9701 enum ODRDefinitionDataDifference {
9702 NumBases,
9703 NumVBases,
9704 BaseType,
9705 BaseVirtual,
9706 BaseAccess,
9707 };
9708 auto ODRDiagError = [FirstRecord, &FirstModule,
9709 this](SourceLocation Loc, SourceRange Range,
9710 ODRDefinitionDataDifference DiffType) {
9711 return Diag(Loc, diag::err_module_odr_violation_definition_data)
9712 << FirstRecord << FirstModule.empty() << FirstModule << Range
9713 << DiffType;
9714 };
9715 auto ODRDiagNote = [&SecondModule,
9716 this](SourceLocation Loc, SourceRange Range,
9717 ODRDefinitionDataDifference DiffType) {
9718 return Diag(Loc, diag::note_module_odr_violation_definition_data)
9719 << SecondModule << Range << DiffType;
9720 };
9721
9722 unsigned FirstNumBases = FirstDD->NumBases;
9723 unsigned FirstNumVBases = FirstDD->NumVBases;
9724 unsigned SecondNumBases = SecondDD->NumBases;
9725 unsigned SecondNumVBases = SecondDD->NumVBases;
9726
9727 auto GetSourceRange = [](struct CXXRecordDecl::DefinitionData *DD) {
9728 unsigned NumBases = DD->NumBases;
9729 if (NumBases == 0) return SourceRange();
9730 auto bases = DD->bases();
9731 return SourceRange(bases[0].getBeginLoc(),
9732 bases[NumBases - 1].getEndLoc());
9733 };
9734
9735 if (FirstNumBases != SecondNumBases) {
9736 ODRDiagError(FirstRecord->getLocation(), GetSourceRange(FirstDD),
9737 NumBases)
9738 << FirstNumBases;
9739 ODRDiagNote(SecondRecord->getLocation(), GetSourceRange(SecondDD),
9740 NumBases)
9741 << SecondNumBases;
9742 Diagnosed = true;
9743 break;
9744 }
9745
9746 if (FirstNumVBases != SecondNumVBases) {
9747 ODRDiagError(FirstRecord->getLocation(), GetSourceRange(FirstDD),
9748 NumVBases)
9749 << FirstNumVBases;
9750 ODRDiagNote(SecondRecord->getLocation(), GetSourceRange(SecondDD),
9751 NumVBases)
9752 << SecondNumVBases;
9753 Diagnosed = true;
9754 break;
9755 }
9756
9757 auto FirstBases = FirstDD->bases();
9758 auto SecondBases = SecondDD->bases();
9759 unsigned i = 0;
9760 for (i = 0; i < FirstNumBases; ++i) {
9761 auto FirstBase = FirstBases[i];
9762 auto SecondBase = SecondBases[i];
9763 if (ComputeQualTypeODRHash(FirstBase.getType()) !=
9764 ComputeQualTypeODRHash(SecondBase.getType())) {
9765 ODRDiagError(FirstRecord->getLocation(), FirstBase.getSourceRange(),
9766 BaseType)
9767 << (i + 1) << FirstBase.getType();
9768 ODRDiagNote(SecondRecord->getLocation(),
9769 SecondBase.getSourceRange(), BaseType)
9770 << (i + 1) << SecondBase.getType();
9771 break;
9772 }
9773
9774 if (FirstBase.isVirtual() != SecondBase.isVirtual()) {
9775 ODRDiagError(FirstRecord->getLocation(), FirstBase.getSourceRange(),
9776 BaseVirtual)
9777 << (i + 1) << FirstBase.isVirtual() << FirstBase.getType();
9778 ODRDiagNote(SecondRecord->getLocation(),
9779 SecondBase.getSourceRange(), BaseVirtual)
9780 << (i + 1) << SecondBase.isVirtual() << SecondBase.getType();
9781 break;
9782 }
9783
9784 if (FirstBase.getAccessSpecifierAsWritten() !=
9785 SecondBase.getAccessSpecifierAsWritten()) {
9786 ODRDiagError(FirstRecord->getLocation(), FirstBase.getSourceRange(),
9787 BaseAccess)
9788 << (i + 1) << FirstBase.getType()
9789 << (int)FirstBase.getAccessSpecifierAsWritten();
9790 ODRDiagNote(SecondRecord->getLocation(),
9791 SecondBase.getSourceRange(), BaseAccess)
9792 << (i + 1) << SecondBase.getType()
9793 << (int)SecondBase.getAccessSpecifierAsWritten();
9794 break;
9795 }
9796 }
9797
9798 if (i != FirstNumBases) {
9799 Diagnosed = true;
9800 break;
9801 }
9802 }
9803
9804 using DeclHashes = llvm::SmallVector<std::pair<Decl *, unsigned>, 4>;
9805
9806 const ClassTemplateDecl *FirstTemplate =
9807 FirstRecord->getDescribedClassTemplate();
9808 const ClassTemplateDecl *SecondTemplate =
9809 SecondRecord->getDescribedClassTemplate();
9810
9811 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 9812, __PRETTY_FUNCTION__))
9812 "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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 9812, __PRETTY_FUNCTION__))
;
9813
9814 enum ODRTemplateDifference {
9815 ParamEmptyName,
9816 ParamName,
9817 ParamSingleDefaultArgument,
9818 ParamDifferentDefaultArgument,
9819 };
9820
9821 if (FirstTemplate && SecondTemplate) {
9822 DeclHashes FirstTemplateHashes;
9823 DeclHashes SecondTemplateHashes;
9824
9825 auto PopulateTemplateParameterHashs =
9826 [&ComputeSubDeclODRHash](DeclHashes &Hashes,
9827 const ClassTemplateDecl *TD) {
9828 for (auto *D : TD->getTemplateParameters()->asArray()) {
9829 Hashes.emplace_back(D, ComputeSubDeclODRHash(D));
9830 }
9831 };
9832
9833 PopulateTemplateParameterHashs(FirstTemplateHashes, FirstTemplate);
9834 PopulateTemplateParameterHashs(SecondTemplateHashes, SecondTemplate);
9835
9836 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 9837, __PRETTY_FUNCTION__))
9837 "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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 9837, __PRETTY_FUNCTION__))
;
9838
9839 auto FirstIt = FirstTemplateHashes.begin();
9840 auto FirstEnd = FirstTemplateHashes.end();
9841 auto SecondIt = SecondTemplateHashes.begin();
9842 for (; FirstIt != FirstEnd; ++FirstIt, ++SecondIt) {
9843 if (FirstIt->second == SecondIt->second)
9844 continue;
9845
9846 auto ODRDiagError = [FirstRecord, &FirstModule,
9847 this](SourceLocation Loc, SourceRange Range,
9848 ODRTemplateDifference DiffType) {
9849 return Diag(Loc, diag::err_module_odr_violation_template_parameter)
9850 << FirstRecord << FirstModule.empty() << FirstModule << Range
9851 << DiffType;
9852 };
9853 auto ODRDiagNote = [&SecondModule,
9854 this](SourceLocation Loc, SourceRange Range,
9855 ODRTemplateDifference DiffType) {
9856 return Diag(Loc, diag::note_module_odr_violation_template_parameter)
9857 << SecondModule << Range << DiffType;
9858 };
9859
9860 const NamedDecl* FirstDecl = cast<NamedDecl>(FirstIt->first);
9861 const NamedDecl* SecondDecl = cast<NamedDecl>(SecondIt->first);
9862
9863 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 9864, __PRETTY_FUNCTION__))
9864 "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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 9864, __PRETTY_FUNCTION__))
;
9865
9866 DeclarationName FirstName = FirstDecl->getDeclName();
9867 DeclarationName SecondName = SecondDecl->getDeclName();
9868
9869 if (FirstName != SecondName) {
9870 const bool FirstNameEmpty =
9871 FirstName.isIdentifier() && !FirstName.getAsIdentifierInfo();
9872 const bool SecondNameEmpty =
9873 SecondName.isIdentifier() && !SecondName.getAsIdentifierInfo();
9874 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 9875, __PRETTY_FUNCTION__))
9875 "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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 9875, __PRETTY_FUNCTION__))
;
9876 ODRDiagError(FirstDecl->getLocation(), FirstDecl->getSourceRange(),
9877 FirstNameEmpty ? ParamEmptyName : ParamName)
9878 << FirstName;
9879 ODRDiagNote(SecondDecl->getLocation(), SecondDecl->getSourceRange(),
9880 SecondNameEmpty ? ParamEmptyName : ParamName)
9881 << SecondName;
9882 break;
9883 }
9884
9885 switch (FirstDecl->getKind()) {
9886 default:
9887 llvm_unreachable("Invalid template parameter type.")::llvm::llvm_unreachable_internal("Invalid template parameter type."
, "/build/llvm-toolchain-snapshot-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 9887)
;
9888 case Decl::TemplateTypeParm: {
9889 const auto *FirstParam = cast<TemplateTypeParmDecl>(FirstDecl);
9890 const auto *SecondParam = cast<TemplateTypeParmDecl>(SecondDecl);
9891 const bool HasFirstDefaultArgument =
9892 FirstParam->hasDefaultArgument() &&
9893 !FirstParam->defaultArgumentWasInherited();
9894 const bool HasSecondDefaultArgument =
9895 SecondParam->hasDefaultArgument() &&
9896 !SecondParam->defaultArgumentWasInherited();
9897
9898 if (HasFirstDefaultArgument != HasSecondDefaultArgument) {
9899 ODRDiagError(FirstDecl->getLocation(),
9900 FirstDecl->getSourceRange(),
9901 ParamSingleDefaultArgument)
9902 << HasFirstDefaultArgument;
9903 ODRDiagNote(SecondDecl->getLocation(),
9904 SecondDecl->getSourceRange(),
9905 ParamSingleDefaultArgument)
9906 << HasSecondDefaultArgument;
9907 break;
9908 }
9909
9910 assert(HasFirstDefaultArgument && HasSecondDefaultArgument &&((HasFirstDefaultArgument && HasSecondDefaultArgument
&& "Expecting default arguments.") ? static_cast<
void> (0) : __assert_fail ("HasFirstDefaultArgument && HasSecondDefaultArgument && \"Expecting default arguments.\""
, "/build/llvm-toolchain-snapshot-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 9911, __PRETTY_FUNCTION__))
9911 "Expecting default arguments.")((HasFirstDefaultArgument && HasSecondDefaultArgument
&& "Expecting default arguments.") ? static_cast<
void> (0) : __assert_fail ("HasFirstDefaultArgument && HasSecondDefaultArgument && \"Expecting default arguments.\""
, "/build/llvm-toolchain-snapshot-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 9911, __PRETTY_FUNCTION__))
;
9912
9913 ODRDiagError(FirstDecl->getLocation(), FirstDecl->getSourceRange(),
9914 ParamDifferentDefaultArgument);
9915 ODRDiagNote(SecondDecl->getLocation(), SecondDecl->getSourceRange(),
9916 ParamDifferentDefaultArgument);
9917
9918 break;
9919 }
9920 case Decl::NonTypeTemplateParm: {
9921 const auto *FirstParam = cast<NonTypeTemplateParmDecl>(FirstDecl);
9922 const auto *SecondParam = cast<NonTypeTemplateParmDecl>(SecondDecl);
9923 const bool HasFirstDefaultArgument =
9924 FirstParam->hasDefaultArgument() &&
9925 !FirstParam->defaultArgumentWasInherited();
9926 const bool HasSecondDefaultArgument =
9927 SecondParam->hasDefaultArgument() &&
9928 !SecondParam->defaultArgumentWasInherited();
9929
9930 if (HasFirstDefaultArgument != HasSecondDefaultArgument) {
9931 ODRDiagError(FirstDecl->getLocation(),
9932 FirstDecl->getSourceRange(),
9933 ParamSingleDefaultArgument)
9934 << HasFirstDefaultArgument;
9935 ODRDiagNote(SecondDecl->getLocation(),
9936 SecondDecl->getSourceRange(),
9937 ParamSingleDefaultArgument)
9938 << HasSecondDefaultArgument;
9939 break;
9940 }
9941
9942 assert(HasFirstDefaultArgument && HasSecondDefaultArgument &&((HasFirstDefaultArgument && HasSecondDefaultArgument
&& "Expecting default arguments.") ? static_cast<
void> (0) : __assert_fail ("HasFirstDefaultArgument && HasSecondDefaultArgument && \"Expecting default arguments.\""
, "/build/llvm-toolchain-snapshot-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 9943, __PRETTY_FUNCTION__))
9943 "Expecting default arguments.")((HasFirstDefaultArgument && HasSecondDefaultArgument
&& "Expecting default arguments.") ? static_cast<
void> (0) : __assert_fail ("HasFirstDefaultArgument && HasSecondDefaultArgument && \"Expecting default arguments.\""
, "/build/llvm-toolchain-snapshot-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 9943, __PRETTY_FUNCTION__))
;
9944
9945 ODRDiagError(FirstDecl->getLocation(), FirstDecl->getSourceRange(),
9946 ParamDifferentDefaultArgument);
9947 ODRDiagNote(SecondDecl->getLocation(), SecondDecl->getSourceRange(),
9948 ParamDifferentDefaultArgument);
9949
9950 break;
9951 }
9952 case Decl::TemplateTemplateParm: {
9953 const auto *FirstParam = cast<TemplateTemplateParmDecl>(FirstDecl);
9954 const auto *SecondParam =
9955 cast<TemplateTemplateParmDecl>(SecondDecl);
9956 const bool HasFirstDefaultArgument =
9957 FirstParam->hasDefaultArgument() &&
9958 !FirstParam->defaultArgumentWasInherited();
9959 const bool HasSecondDefaultArgument =
9960 SecondParam->hasDefaultArgument() &&
9961 !SecondParam->defaultArgumentWasInherited();
9962
9963 if (HasFirstDefaultArgument != HasSecondDefaultArgument) {
9964 ODRDiagError(FirstDecl->getLocation(),
9965 FirstDecl->getSourceRange(),
9966 ParamSingleDefaultArgument)
9967 << HasFirstDefaultArgument;
9968 ODRDiagNote(SecondDecl->getLocation(),
9969 SecondDecl->getSourceRange(),
9970 ParamSingleDefaultArgument)
9971 << HasSecondDefaultArgument;
9972 break;
9973 }
9974
9975 assert(HasFirstDefaultArgument && HasSecondDefaultArgument &&((HasFirstDefaultArgument && HasSecondDefaultArgument
&& "Expecting default arguments.") ? static_cast<
void> (0) : __assert_fail ("HasFirstDefaultArgument && HasSecondDefaultArgument && \"Expecting default arguments.\""
, "/build/llvm-toolchain-snapshot-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 9976, __PRETTY_FUNCTION__))
9976 "Expecting default arguments.")((HasFirstDefaultArgument && HasSecondDefaultArgument
&& "Expecting default arguments.") ? static_cast<
void> (0) : __assert_fail ("HasFirstDefaultArgument && HasSecondDefaultArgument && \"Expecting default arguments.\""
, "/build/llvm-toolchain-snapshot-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 9976, __PRETTY_FUNCTION__))
;
9977
9978 ODRDiagError(FirstDecl->getLocation(), FirstDecl->getSourceRange(),
9979 ParamDifferentDefaultArgument);
9980 ODRDiagNote(SecondDecl->getLocation(), SecondDecl->getSourceRange(),
9981 ParamDifferentDefaultArgument);
9982
9983 break;
9984 }
9985 }
9986
9987 break;
9988 }
9989
9990 if (FirstIt != FirstEnd) {
9991 Diagnosed = true;
9992 break;
9993 }
9994 }
9995
9996 DeclHashes FirstHashes;
9997 DeclHashes SecondHashes;
9998
9999 auto PopulateHashes = [&ComputeSubDeclODRHash, FirstRecord](
10000 DeclHashes &Hashes, CXXRecordDecl *Record) {
10001 for (auto *D : Record->decls()) {
10002 // Due to decl merging, the first CXXRecordDecl is the parent of
10003 // Decls in both records.
10004 if (!ODRHash::isWhitelistedDecl(D, FirstRecord))
10005 continue;
10006 Hashes.emplace_back(D, ComputeSubDeclODRHash(D));
10007 }
10008 };
10009 PopulateHashes(FirstHashes, FirstRecord);
10010 PopulateHashes(SecondHashes, SecondRecord);
10011
10012 // Used with err_module_odr_violation_mismatch_decl and
10013 // note_module_odr_violation_mismatch_decl
10014 // This list should be the same Decl's as in ODRHash::isWhiteListedDecl
10015 enum {
10016 EndOfClass,
10017 PublicSpecifer,
10018 PrivateSpecifer,
10019 ProtectedSpecifer,
10020 StaticAssert,
10021 Field,
10022 CXXMethod,
10023 TypeAlias,
10024 TypeDef,
10025 Var,
10026 Friend,
10027 FunctionTemplate,
10028 Other
10029 } FirstDiffType = Other,
10030 SecondDiffType = Other;
10031
10032 auto DifferenceSelector = [](Decl *D) {
10033 assert(D && "valid Decl required")((D && "valid Decl required") ? static_cast<void>
(0) : __assert_fail ("D && \"valid Decl required\"",
"/build/llvm-toolchain-snapshot-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 10033, __PRETTY_FUNCTION__))
;
10034 switch (D->getKind()) {
10035 default:
10036 return Other;
10037 case Decl::AccessSpec:
10038 switch (D->getAccess()) {
10039 case AS_public:
10040 return PublicSpecifer;
10041 case AS_private:
10042 return PrivateSpecifer;
10043 case AS_protected:
10044 return ProtectedSpecifer;
10045 case AS_none:
10046 break;
10047 }
10048 llvm_unreachable("Invalid access specifier")::llvm::llvm_unreachable_internal("Invalid access specifier",
"/build/llvm-toolchain-snapshot-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 10048)
;
10049 case Decl::StaticAssert:
10050 return StaticAssert;
10051 case Decl::Field:
10052 return Field;
10053 case Decl::CXXMethod:
10054 case Decl::CXXConstructor:
10055 case Decl::CXXDestructor:
10056 return CXXMethod;
10057 case Decl::TypeAlias:
10058 return TypeAlias;
10059 case Decl::Typedef:
10060 return TypeDef;
10061 case Decl::Var:
10062 return Var;
10063 case Decl::Friend:
10064 return Friend;
10065 case Decl::FunctionTemplate:
10066 return FunctionTemplate;
10067 }
10068 };
10069
10070 Decl *FirstDecl = nullptr;
10071 Decl *SecondDecl = nullptr;
10072 auto FirstIt = FirstHashes.begin();
10073 auto SecondIt = SecondHashes.begin();
10074
10075 // If there is a diagnoseable difference, FirstDiffType and
10076 // SecondDiffType will not be Other and FirstDecl and SecondDecl will be
10077 // filled in if not EndOfClass.
10078 while (FirstIt != FirstHashes.end() || SecondIt != SecondHashes.end()) {
10079 if (FirstIt != FirstHashes.end() && SecondIt != SecondHashes.end() &&
10080 FirstIt->second == SecondIt->second) {
10081 ++FirstIt;
10082 ++SecondIt;
10083 continue;
10084 }
10085
10086 FirstDecl = FirstIt == FirstHashes.end() ? nullptr : FirstIt->first;
10087 SecondDecl = SecondIt == SecondHashes.end() ? nullptr : SecondIt->first;
10088
10089 FirstDiffType = FirstDecl ? DifferenceSelector(FirstDecl) : EndOfClass;
10090 SecondDiffType =
10091 SecondDecl ? DifferenceSelector(SecondDecl) : EndOfClass;
10092
10093 break;
10094 }
10095
10096 if (FirstDiffType == Other || SecondDiffType == Other) {
10097 // Reaching this point means an unexpected Decl was encountered
10098 // or no difference was detected. This causes a generic error
10099 // message to be emitted.
10100 Diag(FirstRecord->getLocation(),
10101 diag::err_module_odr_violation_different_definitions)
10102 << FirstRecord << FirstModule.empty() << FirstModule;
10103
10104 if (FirstDecl) {
10105 Diag(FirstDecl->getLocation(), diag::note_first_module_difference)
10106 << FirstRecord << FirstDecl->getSourceRange();
10107 }
10108
10109 Diag(SecondRecord->getLocation(),
10110 diag::note_module_odr_violation_different_definitions)
10111 << SecondModule;
10112
10113 if (SecondDecl) {
10114 Diag(SecondDecl->getLocation(), diag::note_second_module_difference)
10115 << SecondDecl->getSourceRange();
10116 }
10117
10118 Diagnosed = true;
10119 break;
10120 }
10121
10122 if (FirstDiffType != SecondDiffType) {
10123 SourceLocation FirstLoc;
10124 SourceRange FirstRange;
10125 if (FirstDiffType == EndOfClass) {
10126 FirstLoc = FirstRecord->getBraceRange().getEnd();
10127 } else {
10128 FirstLoc = FirstIt->first->getLocation();
10129 FirstRange = FirstIt->first->getSourceRange();
10130 }
10131 Diag(FirstLoc, diag::err_module_odr_violation_mismatch_decl)
10132 << FirstRecord << FirstModule.empty() << FirstModule << FirstRange
10133 << FirstDiffType;
10134
10135 SourceLocation SecondLoc;
10136 SourceRange SecondRange;
10137 if (SecondDiffType == EndOfClass) {
10138 SecondLoc = SecondRecord->getBraceRange().getEnd();
10139 } else {
10140 SecondLoc = SecondDecl->getLocation();
10141 SecondRange = SecondDecl->getSourceRange();
10142 }
10143 Diag(SecondLoc, diag::note_module_odr_violation_mismatch_decl)
10144 << SecondModule << SecondRange << SecondDiffType;
10145 Diagnosed = true;
10146 break;
10147 }
10148
10149 assert(FirstDiffType == SecondDiffType)((FirstDiffType == SecondDiffType) ? static_cast<void> (
0) : __assert_fail ("FirstDiffType == SecondDiffType", "/build/llvm-toolchain-snapshot-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 10149, __PRETTY_FUNCTION__))
;
10150
10151 // Used with err_module_odr_violation_mismatch_decl_diff and
10152 // note_module_odr_violation_mismatch_decl_diff
10153 enum ODRDeclDifference {
10154 StaticAssertCondition,
10155 StaticAssertMessage,
10156 StaticAssertOnlyMessage,
10157 FieldName,
10158 FieldTypeName,
10159 FieldSingleBitField,
10160 FieldDifferentWidthBitField,
10161 FieldSingleMutable,
10162 FieldSingleInitializer,
10163 FieldDifferentInitializers,
10164 MethodName,
10165 MethodDeleted,
10166 MethodDefaulted,
10167 MethodVirtual,
10168 MethodStatic,
10169 MethodVolatile,
10170 MethodConst,
10171 MethodInline,
10172 MethodNumberParameters,
10173 MethodParameterType,
10174 MethodParameterName,
10175 MethodParameterSingleDefaultArgument,
10176 MethodParameterDifferentDefaultArgument,
10177 MethodNoTemplateArguments,
10178 MethodDifferentNumberTemplateArguments,
10179 MethodDifferentTemplateArgument,
10180 MethodSingleBody,
10181 MethodDifferentBody,
10182 TypedefName,
10183 TypedefType,
10184 VarName,
10185 VarType,
10186 VarSingleInitializer,
10187 VarDifferentInitializer,
10188 VarConstexpr,
10189 FriendTypeFunction,
10190 FriendType,
10191 FriendFunction,
10192 FunctionTemplateDifferentNumberParameters,
10193 FunctionTemplateParameterDifferentKind,
10194 FunctionTemplateParameterName,
10195 FunctionTemplateParameterSingleDefaultArgument,
10196 FunctionTemplateParameterDifferentDefaultArgument,
10197 FunctionTemplateParameterDifferentType,
10198 FunctionTemplatePackParameter,
10199 };
10200
10201 // These lambdas have the common portions of the ODR diagnostics. This
10202 // has the same return as Diag(), so addition parameters can be passed
10203 // in with operator<<
10204 auto ODRDiagError = [FirstRecord, &FirstModule, this](
10205 SourceLocation Loc, SourceRange Range, ODRDeclDifference DiffType) {
10206 return Diag(Loc, diag::err_module_odr_violation_mismatch_decl_diff)
10207 << FirstRecord << FirstModule.empty() << FirstModule << Range
10208 << DiffType;
10209 };
10210 auto ODRDiagNote = [&SecondModule, this](
10211 SourceLocation Loc, SourceRange Range, ODRDeclDifference DiffType) {
10212 return Diag(Loc, diag::note_module_odr_violation_mismatch_decl_diff)
10213 << SecondModule << Range << DiffType;
10214 };
10215
10216 switch (FirstDiffType) {
10217 case Other:
10218 case EndOfClass:
10219 case PublicSpecifer:
10220 case PrivateSpecifer:
10221 case ProtectedSpecifer:
10222 llvm_unreachable("Invalid diff type")::llvm::llvm_unreachable_internal("Invalid diff type", "/build/llvm-toolchain-snapshot-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 10222)
;
10223
10224 case StaticAssert: {
10225 StaticAssertDecl *FirstSA = cast<StaticAssertDecl>(FirstDecl);
10226 StaticAssertDecl *SecondSA = cast<StaticAssertDecl>(SecondDecl);
10227
10228 Expr *FirstExpr = FirstSA->getAssertExpr();
10229 Expr *SecondExpr = SecondSA->getAssertExpr();
10230 unsigned FirstODRHash = ComputeODRHash(FirstExpr);
10231 unsigned SecondODRHash = ComputeODRHash(SecondExpr);
10232 if (FirstODRHash != SecondODRHash) {
10233 ODRDiagError(FirstExpr->getBeginLoc(), FirstExpr->getSourceRange(),
10234 StaticAssertCondition);
10235 ODRDiagNote(SecondExpr->getBeginLoc(), SecondExpr->getSourceRange(),
10236 StaticAssertCondition);
10237 Diagnosed = true;
10238 break;
10239 }
10240
10241 StringLiteral *FirstStr = FirstSA->getMessage();
10242 StringLiteral *SecondStr = SecondSA->getMessage();
10243 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 10243, __PRETTY_FUNCTION__))
;
10244 if ((FirstStr && !SecondStr) || (!FirstStr && SecondStr)) {
10245 SourceLocation FirstLoc, SecondLoc;
10246 SourceRange FirstRange, SecondRange;
10247 if (FirstStr) {
10248 FirstLoc = FirstStr->getBeginLoc();
10249 FirstRange = FirstStr->getSourceRange();
10250 } else {
10251 FirstLoc = FirstSA->getBeginLoc();
10252 FirstRange = FirstSA->getSourceRange();
10253 }
10254 if (SecondStr) {
10255 SecondLoc = SecondStr->getBeginLoc();
10256 SecondRange = SecondStr->getSourceRange();
10257 } else {
10258 SecondLoc = SecondSA->getBeginLoc();
10259 SecondRange = SecondSA->getSourceRange();
10260 }
10261 ODRDiagError(FirstLoc, FirstRange, StaticAssertOnlyMessage)
10262 << (FirstStr == nullptr);
10263 ODRDiagNote(SecondLoc, SecondRange, StaticAssertOnlyMessage)
10264 << (SecondStr == nullptr);
10265 Diagnosed = true;
10266 break;
10267 }
10268
10269 if (FirstStr && SecondStr &&
10270 FirstStr->getString() != SecondStr->getString()) {
10271 ODRDiagError(FirstStr->getBeginLoc(), FirstStr->getSourceRange(),
10272 StaticAssertMessage);
10273 ODRDiagNote(SecondStr->getBeginLoc(), SecondStr->getSourceRange(),
10274 StaticAssertMessage);
10275 Diagnosed = true;
10276 break;
10277 }
10278 break;
10279 }
10280 case Field: {
10281 FieldDecl *FirstField = cast<FieldDecl>(FirstDecl);
10282 FieldDecl *SecondField = cast<FieldDecl>(SecondDecl);
10283 IdentifierInfo *FirstII = FirstField->getIdentifier();
10284 IdentifierInfo *SecondII = SecondField->getIdentifier();
10285 if (FirstII->getName() != SecondII->getName()) {
10286 ODRDiagError(FirstField->getLocation(), FirstField->getSourceRange(),
10287 FieldName)
10288 << FirstII;
10289 ODRDiagNote(SecondField->getLocation(), SecondField->getSourceRange(),
10290 FieldName)
10291 << SecondII;
10292
10293 Diagnosed = true;
10294 break;
10295 }
10296
10297 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 10298, __PRETTY_FUNCTION__))
10298 SecondField->getType()))((getContext().hasSameType(FirstField->getType(), SecondField
->getType())) ? static_cast<void> (0) : __assert_fail
("getContext().hasSameType(FirstField->getType(), SecondField->getType())"
, "/build/llvm-toolchain-snapshot-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 10298, __PRETTY_FUNCTION__))
;
10299
10300 QualType FirstType = FirstField->getType();
10301 QualType SecondType = SecondField->getType();
10302 if (ComputeQualTypeODRHash(FirstType) !=
10303 ComputeQualTypeODRHash(SecondType)) {
10304 ODRDiagError(FirstField->getLocation(), FirstField->getSourceRange(),
10305 FieldTypeName)
10306 << FirstII << FirstType;
10307 ODRDiagNote(SecondField->getLocation(), SecondField->getSourceRange(),
10308 FieldTypeName)
10309 << SecondII << SecondType;
10310
10311 Diagnosed = true;
10312 break;
10313 }
10314
10315 const bool IsFirstBitField = FirstField->isBitField();
10316 const bool IsSecondBitField = SecondField->isBitField();
10317 if (IsFirstBitField != IsSecondBitField) {
10318 ODRDiagError(FirstField->getLocation(), FirstField->getSourceRange(),
10319 FieldSingleBitField)
10320 << FirstII << IsFirstBitField;
10321 ODRDiagNote(SecondField->getLocation(), SecondField->getSourceRange(),
10322 FieldSingleBitField)
10323 << SecondII << IsSecondBitField;
10324 Diagnosed = true;
10325 break;
10326 }
10327
10328 if (IsFirstBitField && IsSecondBitField) {
10329 ODRDiagError(FirstField->getLocation(), FirstField->getSourceRange(),
10330 FieldDifferentWidthBitField)
10331 << FirstII << FirstField->getBitWidth()->getSourceRange();
10332 ODRDiagNote(SecondField->getLocation(), SecondField->getSourceRange(),
10333 FieldDifferentWidthBitField)
10334 << SecondII << SecondField->getBitWidth()->getSourceRange();
10335 Diagnosed = true;
10336 break;
10337 }
10338
10339 const bool IsFirstMutable = FirstField->isMutable();
10340 const bool IsSecondMutable = SecondField->isMutable();
10341 if (IsFirstMutable != IsSecondMutable) {
10342 ODRDiagError(FirstField->getLocation(), FirstField->getSourceRange(),
10343 FieldSingleMutable)
10344 << FirstII << IsFirstMutable;
10345 ODRDiagNote(SecondField->getLocation(), SecondField->getSourceRange(),
10346 FieldSingleMutable)
10347 << SecondII << IsSecondMutable;
10348 Diagnosed = true;
10349 break;
10350 }
10351
10352 const Expr *FirstInitializer = FirstField->getInClassInitializer();
10353 const Expr *SecondInitializer = SecondField->getInClassInitializer();
10354 if ((!FirstInitializer && SecondInitializer) ||
10355 (FirstInitializer && !SecondInitializer)) {
10356 ODRDiagError(FirstField->getLocation(), FirstField->getSourceRange(),
10357 FieldSingleInitializer)
10358 << FirstII << (FirstInitializer != nullptr);
10359 ODRDiagNote(SecondField->getLocation(), SecondField->getSourceRange(),
10360 FieldSingleInitializer)
10361 << SecondII << (SecondInitializer != nullptr);
10362 Diagnosed = true;
10363 break;
10364 }
10365
10366 if (FirstInitializer && SecondInitializer) {
10367 unsigned FirstInitHash = ComputeODRHash(FirstInitializer);
10368 unsigned SecondInitHash = ComputeODRHash(SecondInitializer);
10369 if (FirstInitHash != SecondInitHash) {
10370 ODRDiagError(FirstField->getLocation(),
10371 FirstField->getSourceRange(),
10372 FieldDifferentInitializers)
10373 << FirstII << FirstInitializer->getSourceRange();
10374 ODRDiagNote(SecondField->getLocation(),
10375 SecondField->getSourceRange(),
10376 FieldDifferentInitializers)
10377 << SecondII << SecondInitializer->getSourceRange();
10378 Diagnosed = true;
10379 break;
10380 }
10381 }
10382
10383 break;
10384 }
10385 case CXXMethod: {
10386 enum {
10387 DiagMethod,
10388 DiagConstructor,
10389 DiagDestructor,
10390 } FirstMethodType,
10391 SecondMethodType;
10392 auto GetMethodTypeForDiagnostics = [](const CXXMethodDecl* D) {
10393 if (isa<CXXConstructorDecl>(D)) return DiagConstructor;
10394 if (isa<CXXDestructorDecl>(D)) return DiagDestructor;
10395 return DiagMethod;
10396 };
10397 const CXXMethodDecl *FirstMethod = cast<CXXMethodDecl>(FirstDecl);
10398 const CXXMethodDecl *SecondMethod = cast<CXXMethodDecl>(SecondDecl);
10399 FirstMethodType = GetMethodTypeForDiagnostics(FirstMethod);
10400 SecondMethodType = GetMethodTypeForDiagnostics(SecondMethod);
10401 auto FirstName = FirstMethod->getDeclName();
10402 auto SecondName = SecondMethod->getDeclName();
10403 if (FirstMethodType != SecondMethodType || FirstName != SecondName) {
10404 ODRDiagError(FirstMethod->getLocation(),
10405 FirstMethod->getSourceRange(), MethodName)
10406 << FirstMethodType << FirstName;
10407 ODRDiagNote(SecondMethod->getLocation(),
10408 SecondMethod->getSourceRange(), MethodName)
10409 << SecondMethodType << SecondName;
10410
10411 Diagnosed = true;
10412 break;
10413 }
10414
10415 const bool FirstDeleted = FirstMethod->isDeletedAsWritten();
10416 const bool SecondDeleted = SecondMethod->isDeletedAsWritten();
10417 if (FirstDeleted != SecondDeleted) {
10418 ODRDiagError(FirstMethod->getLocation(),
10419 FirstMethod->getSourceRange(), MethodDeleted)
10420 << FirstMethodType << FirstName << FirstDeleted;
10421
10422 ODRDiagNote(SecondMethod->getLocation(),
10423 SecondMethod->getSourceRange(), MethodDeleted)
10424 << SecondMethodType << SecondName << SecondDeleted;
10425 Diagnosed = true;
10426 break;
10427 }
10428
10429 const bool FirstDefaulted = FirstMethod->isExplicitlyDefaulted();
10430 const bool SecondDefaulted = SecondMethod->isExplicitlyDefaulted();
10431 if (FirstDefaulted != SecondDefaulted) {
10432 ODRDiagError(FirstMethod->getLocation(),
10433 FirstMethod->getSourceRange(), MethodDefaulted)
10434 << FirstMethodType << FirstName << FirstDefaulted;
10435
10436 ODRDiagNote(SecondMethod->getLocation(),
10437 SecondMethod->getSourceRange(), MethodDefaulted)
10438 << SecondMethodType << SecondName << SecondDefaulted;
10439 Diagnosed = true;
10440 break;
10441 }
10442
10443 const bool FirstVirtual = FirstMethod->isVirtualAsWritten();
10444 const bool SecondVirtual = SecondMethod->isVirtualAsWritten();
10445 const bool FirstPure = FirstMethod->isPure();
10446 const bool SecondPure = SecondMethod->isPure();
10447 if ((FirstVirtual || SecondVirtual) &&
10448 (FirstVirtual != SecondVirtual || FirstPure != SecondPure)) {
10449 ODRDiagError(FirstMethod->getLocation(),
10450 FirstMethod->getSourceRange(), MethodVirtual)
10451 << FirstMethodType << FirstName << FirstPure << FirstVirtual;
10452 ODRDiagNote(SecondMethod->getLocation(),
10453 SecondMethod->getSourceRange(), MethodVirtual)
10454 << SecondMethodType << SecondName << SecondPure << SecondVirtual;
10455 Diagnosed = true;
10456 break;
10457 }
10458
10459 // CXXMethodDecl::isStatic uses the canonical Decl. With Decl merging,
10460 // FirstDecl is the canonical Decl of SecondDecl, so the storage
10461 // class needs to be checked instead.
10462 const auto FirstStorage = FirstMethod->getStorageClass();
10463 const auto SecondStorage = SecondMethod->getStorageClass();
10464 const bool FirstStatic = FirstStorage == SC_Static;
10465 const bool SecondStatic = SecondStorage == SC_Static;
10466 if (FirstStatic != SecondStatic) {
10467 ODRDiagError(FirstMethod->getLocation(),
10468 FirstMethod->getSourceRange(), MethodStatic)
10469 << FirstMethodType << FirstName << FirstStatic;
10470 ODRDiagNote(SecondMethod->getLocation(),
10471 SecondMethod->getSourceRange(), MethodStatic)
10472 << SecondMethodType << SecondName << SecondStatic;
10473 Diagnosed = true;
10474 break;
10475 }
10476
10477 const bool FirstVolatile = FirstMethod->isVolatile();
10478 const bool SecondVolatile = SecondMethod->isVolatile();
10479 if (FirstVolatile != SecondVolatile) {
10480 ODRDiagError(FirstMethod->getLocation(),
10481 FirstMethod->getSourceRange(), MethodVolatile)
10482 << FirstMethodType << FirstName << FirstVolatile;
10483 ODRDiagNote(SecondMethod->getLocation(),
10484 SecondMethod->getSourceRange(), MethodVolatile)
10485 << SecondMethodType << SecondName << SecondVolatile;
10486 Diagnosed = true;
10487 break;
10488 }
10489
10490 const bool FirstConst = FirstMethod->isConst();
10491 const bool SecondConst = SecondMethod->isConst();
10492 if (FirstConst != SecondConst) {
10493 ODRDiagError(FirstMethod->getLocation(),
10494 FirstMethod->getSourceRange(), MethodConst)
10495 << FirstMethodType << FirstName << FirstConst;
10496 ODRDiagNote(SecondMethod->getLocation(),
10497 SecondMethod->getSourceRange(), MethodConst)
10498 << SecondMethodType << SecondName << SecondConst;
10499 Diagnosed = true;
10500 break;
10501 }
10502
10503 const bool FirstInline = FirstMethod->isInlineSpecified();
10504 const bool SecondInline = SecondMethod->isInlineSpecified();
10505 if (FirstInline != SecondInline) {
10506 ODRDiagError(FirstMethod->getLocation(),
10507 FirstMethod->getSourceRange(), MethodInline)
10508 << FirstMethodType << FirstName << FirstInline;
10509 ODRDiagNote(SecondMethod->getLocation(),
10510 SecondMethod->getSourceRange(), MethodInline)
10511 << SecondMethodType << SecondName << SecondInline;
10512 Diagnosed = true;
10513 break;
10514 }
10515
10516 const unsigned FirstNumParameters = FirstMethod->param_size();
10517 const unsigned SecondNumParameters = SecondMethod->param_size();
10518 if (FirstNumParameters != SecondNumParameters) {
10519 ODRDiagError(FirstMethod->getLocation(),
10520 FirstMethod->getSourceRange(), MethodNumberParameters)
10521 << FirstMethodType << FirstName << FirstNumParameters;
10522 ODRDiagNote(SecondMethod->getLocation(),
10523 SecondMethod->getSourceRange(), MethodNumberParameters)
10524 << SecondMethodType << SecondName << SecondNumParameters;
10525 Diagnosed = true;
10526 break;
10527 }
10528
10529 // Need this status boolean to know when break out of the switch.
10530 bool ParameterMismatch = false;
10531 for (unsigned I = 0; I < FirstNumParameters; ++I) {
10532 const ParmVarDecl *FirstParam = FirstMethod->getParamDecl(I);
10533 const ParmVarDecl *SecondParam = SecondMethod->getParamDecl(I);
10534
10535 QualType FirstParamType = FirstParam->getType();
10536 QualType SecondParamType = SecondParam->getType();
10537 if (FirstParamType != SecondParamType &&
10538 ComputeQualTypeODRHash(FirstParamType) !=
10539 ComputeQualTypeODRHash(SecondParamType)) {
10540 if (const DecayedType *ParamDecayedType =
10541 FirstParamType->getAs<DecayedType>()) {
10542 ODRDiagError(FirstMethod->getLocation(),
10543 FirstMethod->getSourceRange(), MethodParameterType)
10544 << FirstMethodType << FirstName << (I + 1) << FirstParamType
10545 << true << ParamDecayedType->getOriginalType();
10546 } else {
10547 ODRDiagError(FirstMethod->getLocation(),
10548 FirstMethod->getSourceRange(), MethodParameterType)
10549 << FirstMethodType << FirstName << (I + 1) << FirstParamType
10550 << false;
10551 }
10552
10553 if (const DecayedType *ParamDecayedType =
10554 SecondParamType->getAs<DecayedType>()) {
10555 ODRDiagNote(SecondMethod->getLocation(),
10556 SecondMethod->getSourceRange(), MethodParameterType)
10557 << SecondMethodType << SecondName << (I + 1)
10558 << SecondParamType << true
10559 << ParamDecayedType->getOriginalType();
10560 } else {
10561 ODRDiagNote(SecondMethod->getLocation(),
10562 SecondMethod->getSourceRange(), MethodParameterType)
10563 << SecondMethodType << SecondName << (I + 1)
10564 << SecondParamType << false;
10565 }
10566 ParameterMismatch = true;
10567 break;
10568 }
10569
10570 DeclarationName FirstParamName = FirstParam->getDeclName();
10571 DeclarationName SecondParamName = SecondParam->getDeclName();
10572 if (FirstParamName != SecondParamName) {
10573 ODRDiagError(FirstMethod->getLocation(),
10574 FirstMethod->getSourceRange(), MethodParameterName)
10575 << FirstMethodType << FirstName << (I + 1) << FirstParamName;
10576 ODRDiagNote(SecondMethod->getLocation(),
10577 SecondMethod->getSourceRange(), MethodParameterName)
10578 << SecondMethodType << SecondName << (I + 1) << SecondParamName;
10579 ParameterMismatch = true;
10580 break;
10581 }
10582
10583 const Expr *FirstInit = FirstParam->getInit();
10584 const Expr *SecondInit = SecondParam->getInit();
10585 if ((FirstInit == nullptr) != (SecondInit == nullptr)) {
10586 ODRDiagError(FirstMethod->getLocation(),
10587 FirstMethod->getSourceRange(),
10588 MethodParameterSingleDefaultArgument)
10589 << FirstMethodType << FirstName << (I + 1)
10590 << (FirstInit == nullptr)
10591 << (FirstInit ? FirstInit->getSourceRange() : SourceRange());
10592 ODRDiagNote(SecondMethod->getLocation(),
10593 SecondMethod->getSourceRange(),
10594 MethodParameterSingleDefaultArgument)
10595 << SecondMethodType << SecondName << (I + 1)
10596 << (SecondInit == nullptr)
10597 << (SecondInit ? SecondInit->getSourceRange() : SourceRange());
10598 ParameterMismatch = true;
10599 break;
10600 }
10601
10602 if (FirstInit && SecondInit &&
10603 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) {
10604 ODRDiagError(FirstMethod->getLocation(),
10605 FirstMethod->getSourceRange(),
10606 MethodParameterDifferentDefaultArgument)
10607 << FirstMethodType << FirstName << (I + 1)
10608 << FirstInit->getSourceRange();
10609 ODRDiagNote(SecondMethod->getLocation(),
10610 SecondMethod->getSourceRange(),
10611 MethodParameterDifferentDefaultArgument)
10612 << SecondMethodType << SecondName << (I + 1)
10613 << SecondInit->getSourceRange();
10614 ParameterMismatch = true;
10615 break;
10616
10617 }
10618 }
10619
10620 if (ParameterMismatch) {
10621 Diagnosed = true;
10622 break;
10623 }
10624
10625 const auto *FirstTemplateArgs =
10626 FirstMethod->getTemplateSpecializationArgs();
10627 const auto *SecondTemplateArgs =
10628 SecondMethod->getTemplateSpecializationArgs();
10629
10630 if ((FirstTemplateArgs && !SecondTemplateArgs) ||
10631 (!FirstTemplateArgs && SecondTemplateArgs)) {
10632 ODRDiagError(FirstMethod->getLocation(),
10633 FirstMethod->getSourceRange(), MethodNoTemplateArguments)
10634 << FirstMethodType << FirstName << (FirstTemplateArgs != nullptr);
10635 ODRDiagNote(SecondMethod->getLocation(),
10636 SecondMethod->getSourceRange(), MethodNoTemplateArguments)
10637 << SecondMethodType << SecondName
10638 << (SecondTemplateArgs != nullptr);
10639
10640 Diagnosed = true;
10641 break;
10642 }
10643
10644 if (FirstTemplateArgs && SecondTemplateArgs) {
10645 // Remove pack expansions from argument list.
10646 auto ExpandTemplateArgumentList =
10647 [](const TemplateArgumentList *TAL) {
10648 llvm::SmallVector<const TemplateArgument *, 8> ExpandedList;
10649 for (const TemplateArgument &TA : TAL->asArray()) {
10650 if (TA.getKind() != TemplateArgument::Pack) {
10651 ExpandedList.push_back(&TA);
10652 continue;
10653 }
10654 for (const TemplateArgument &PackTA : TA.getPackAsArray()) {
10655 ExpandedList.push_back(&PackTA);
10656 }
10657 }
10658 return ExpandedList;
10659 };
10660 llvm::SmallVector<const TemplateArgument *, 8> FirstExpandedList =
10661 ExpandTemplateArgumentList(FirstTemplateArgs);
10662 llvm::SmallVector<const TemplateArgument *, 8> SecondExpandedList =
10663 ExpandTemplateArgumentList(SecondTemplateArgs);
10664
10665 if (FirstExpandedList.size() != SecondExpandedList.size()) {
10666 ODRDiagError(FirstMethod->getLocation(),
10667 FirstMethod->getSourceRange(),
10668 MethodDifferentNumberTemplateArguments)
10669 << FirstMethodType << FirstName
10670 << (unsigned)FirstExpandedList.size();
10671 ODRDiagNote(SecondMethod->getLocation(),
10672 SecondMethod->getSourceRange(),
10673 MethodDifferentNumberTemplateArguments)
10674 << SecondMethodType << SecondName
10675 << (unsigned)SecondExpandedList.size();
10676
10677 Diagnosed = true;
10678 break;
10679 }
10680
10681 bool TemplateArgumentMismatch = false;
10682 for (unsigned i = 0, e = FirstExpandedList.size(); i != e; ++i) {
10683 const TemplateArgument &FirstTA = *FirstExpandedList[i],
10684 &SecondTA = *SecondExpandedList[i];
10685 if (ComputeTemplateArgumentODRHash(FirstTA) ==
10686 ComputeTemplateArgumentODRHash(SecondTA)) {
10687 continue;
10688 }
10689
10690 ODRDiagError(FirstMethod->getLocation(),
10691 FirstMethod->getSourceRange(),
10692 MethodDifferentTemplateArgument)
10693 << FirstMethodType << FirstName << FirstTA << i + 1;
10694 ODRDiagNote(SecondMethod->getLocation(),
10695 SecondMethod->getSourceRange(),
10696 MethodDifferentTemplateArgument)
10697 << SecondMethodType << SecondName << SecondTA << i + 1;
10698
10699 TemplateArgumentMismatch = true;
10700 break;
10701 }
10702
10703 if (TemplateArgumentMismatch) {
10704 Diagnosed = true;
10705 break;
10706 }
10707 }
10708
10709 // Compute the hash of the method as if it has no body.
10710 auto ComputeCXXMethodODRHash = [&Hash](const CXXMethodDecl *D) {
10711 Hash.clear();
10712 Hash.AddFunctionDecl(D, true /*SkipBody*/);
10713 return Hash.CalculateHash();
10714 };
10715
10716 // Compare the hash generated to the hash stored. A difference means
10717 // that a body was present in the original source. Due to merging,
10718 // the stardard way of detecting a body will not work.
10719 const bool HasFirstBody =
10720 ComputeCXXMethodODRHash(FirstMethod) != FirstMethod->getODRHash();
10721 const bool HasSecondBody =
10722 ComputeCXXMethodODRHash(SecondMethod) != SecondMethod->getODRHash();
10723
10724 if (HasFirstBody != HasSecondBody) {
10725 ODRDiagError(FirstMethod->getLocation(),
10726 FirstMethod->getSourceRange(), MethodSingleBody)
10727 << FirstMethodType << FirstName << HasFirstBody;
10728 ODRDiagNote(SecondMethod->getLocation(),
10729 SecondMethod->getSourceRange(), MethodSingleBody)
10730 << SecondMethodType << SecondName << HasSecondBody;
10731 Diagnosed = true;
10732 break;
10733 }
10734
10735 if (HasFirstBody && HasSecondBody) {
10736 ODRDiagError(FirstMethod->getLocation(),
10737 FirstMethod->getSourceRange(), MethodDifferentBody)
10738 << FirstMethodType << FirstName;
10739 ODRDiagNote(SecondMethod->getLocation(),
10740 SecondMethod->getSourceRange(), MethodDifferentBody)
10741 << SecondMethodType << SecondName;
10742 Diagnosed = true;
10743 break;
10744 }
10745
10746 break;
10747 }
10748 case TypeAlias:
10749 case TypeDef: {
10750 TypedefNameDecl *FirstTD = cast<TypedefNameDecl>(FirstDecl);
10751 TypedefNameDecl *SecondTD = cast<TypedefNameDecl>(SecondDecl);
10752 auto FirstName = FirstTD->getDeclName();
10753 auto SecondName = SecondTD->getDeclName();
10754 if (FirstName != SecondName) {
10755 ODRDiagError(FirstTD->getLocation(), FirstTD->getSourceRange(),
10756 TypedefName)
10757 << (FirstDiffType == TypeAlias) << FirstName;
10758 ODRDiagNote(SecondTD->getLocation(), SecondTD->getSourceRange(),
10759 TypedefName)
10760 << (FirstDiffType == TypeAlias) << SecondName;
10761 Diagnosed = true;
10762 break;
10763 }
10764
10765 QualType FirstType = FirstTD->getUnderlyingType();
10766 QualType SecondType = SecondTD->getUnderlyingType();
10767 if (ComputeQualTypeODRHash(FirstType) !=
10768 ComputeQualTypeODRHash(SecondType)) {
10769 ODRDiagError(FirstTD->getLocation(), FirstTD->getSourceRange(),
10770 TypedefType)
10771 << (FirstDiffType == TypeAlias) << FirstName << FirstType;
10772 ODRDiagNote(SecondTD->getLocation(), SecondTD->getSourceRange(),
10773 TypedefType)
10774 << (FirstDiffType == TypeAlias) << SecondName << SecondType;
10775 Diagnosed = true;
10776 break;
10777 }
10778 break;
10779 }
10780 case Var: {
10781 VarDecl *FirstVD = cast<VarDecl>(FirstDecl);
10782 VarDecl *SecondVD = cast<VarDecl>(SecondDecl);
10783 auto FirstName = FirstVD->getDeclName();
10784 auto SecondName = SecondVD->getDeclName();
10785 if (FirstName != SecondName) {
10786 ODRDiagError(FirstVD->getLocation(), FirstVD->getSourceRange(),
10787 VarName)
10788 << FirstName;
10789 ODRDiagNote(SecondVD->getLocation(), SecondVD->getSourceRange(),
10790 VarName)
10791 << SecondName;
10792 Diagnosed = true;
10793 break;
10794 }
10795
10796 QualType FirstType = FirstVD->getType();
10797 QualType SecondType = SecondVD->getType();
10798 if (ComputeQualTypeODRHash(FirstType) !=
10799 ComputeQualTypeODRHash(SecondType)) {
10800 ODRDiagError(FirstVD->getLocation(), FirstVD->getSourceRange(),
10801 VarType)
10802 << FirstName << FirstType;
10803 ODRDiagNote(SecondVD->getLocation(), SecondVD->getSourceRange(),
10804 VarType)
10805 << SecondName << SecondType;
10806 Diagnosed = true;
10807 break;
10808 }
10809
10810 const Expr *FirstInit = FirstVD->getInit();
10811 const Expr *SecondInit = SecondVD->getInit();
10812 if ((FirstInit == nullptr) != (SecondInit == nullptr)) {
10813 ODRDiagError(FirstVD->getLocation(), FirstVD->getSourceRange(),
10814 VarSingleInitializer)
10815 << FirstName << (FirstInit == nullptr)
10816 << (FirstInit ? FirstInit->getSourceRange(): SourceRange());
10817 ODRDiagNote(SecondVD->getLocation(), SecondVD->getSourceRange(),
10818 VarSingleInitializer)
10819 << SecondName << (SecondInit == nullptr)
10820 << (SecondInit ? SecondInit->getSourceRange() : SourceRange());
10821 Diagnosed = true;
10822 break;
10823 }
10824
10825 if (FirstInit && SecondInit &&
10826 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) {
10827 ODRDiagError(FirstVD->getLocation(), FirstVD->getSourceRange(),
10828 VarDifferentInitializer)
10829 << FirstName << FirstInit->getSourceRange();
10830 ODRDiagNote(SecondVD->getLocation(), SecondVD->getSourceRange(),
10831 VarDifferentInitializer)
10832 << SecondName << SecondInit->getSourceRange();
10833 Diagnosed = true;
10834 break;
10835 }
10836
10837 const bool FirstIsConstexpr = FirstVD->isConstexpr();
10838 const bool SecondIsConstexpr = SecondVD->isConstexpr();
10839 if (FirstIsConstexpr != SecondIsConstexpr) {
10840 ODRDiagError(FirstVD->getLocation(), FirstVD->getSourceRange(),
10841 VarConstexpr)
10842 << FirstName << FirstIsConstexpr;
10843 ODRDiagNote(SecondVD->getLocation(), SecondVD->getSourceRange(),
10844 VarConstexpr)
10845 << SecondName << SecondIsConstexpr;
10846 Diagnosed = true;
10847 break;
10848 }
10849 break;
10850 }
10851 case Friend: {
10852 FriendDecl *FirstFriend = cast<FriendDecl>(FirstDecl);
10853 FriendDecl *SecondFriend = cast<FriendDecl>(SecondDecl);
10854
10855 NamedDecl *FirstND = FirstFriend->getFriendDecl();
10856 NamedDecl *SecondND = SecondFriend->getFriendDecl();
10857
10858 TypeSourceInfo *FirstTSI = FirstFriend->getFriendType();
10859 TypeSourceInfo *SecondTSI = SecondFriend->getFriendType();
10860
10861 if (FirstND && SecondND) {
10862 ODRDiagError(FirstFriend->getFriendLoc(),
10863 FirstFriend->getSourceRange(), FriendFunction)
10864 << FirstND;
10865 ODRDiagNote(SecondFriend->getFriendLoc(),
10866 SecondFriend->getSourceRange(), FriendFunction)
10867 << SecondND;
10868
10869 Diagnosed = true;
10870 break;
10871 }
10872
10873 if (FirstTSI && SecondTSI) {
10874 QualType FirstFriendType = FirstTSI->getType();
10875 QualType SecondFriendType = SecondTSI->getType();
10876 assert(ComputeQualTypeODRHash(FirstFriendType) !=((ComputeQualTypeODRHash(FirstFriendType) != ComputeQualTypeODRHash
(SecondFriendType)) ? static_cast<void> (0) : __assert_fail
("ComputeQualTypeODRHash(FirstFriendType) != ComputeQualTypeODRHash(SecondFriendType)"
, "/build/llvm-toolchain-snapshot-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 10877, __PRETTY_FUNCTION__))
10877 ComputeQualTypeODRHash(SecondFriendType))((ComputeQualTypeODRHash(FirstFriendType) != ComputeQualTypeODRHash
(SecondFriendType)) ? static_cast<void> (0) : __assert_fail
("ComputeQualTypeODRHash(FirstFriendType) != ComputeQualTypeODRHash(SecondFriendType)"
, "/build/llvm-toolchain-snapshot-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 10877, __PRETTY_FUNCTION__))
;
10878 ODRDiagError(FirstFriend->getFriendLoc(),
10879 FirstFriend->getSourceRange(), FriendType)
10880 << FirstFriendType;
10881 ODRDiagNote(SecondFriend->getFriendLoc(),
10882 SecondFriend->getSourceRange(), FriendType)
10883 << SecondFriendType;
10884 Diagnosed = true;
10885 break;
10886 }
10887
10888 ODRDiagError(FirstFriend->getFriendLoc(), FirstFriend->getSourceRange(),
10889 FriendTypeFunction)
10890 << (FirstTSI == nullptr);
10891 ODRDiagNote(SecondFriend->getFriendLoc(),
10892 SecondFriend->getSourceRange(), FriendTypeFunction)
10893 << (SecondTSI == nullptr);
10894
10895 Diagnosed = true;
10896 break;
10897 }
10898 case FunctionTemplate: {
10899 FunctionTemplateDecl *FirstTemplate =
10900 cast<FunctionTemplateDecl>(FirstDecl);
10901 FunctionTemplateDecl *SecondTemplate =
10902 cast<FunctionTemplateDecl>(SecondDecl);
10903
10904 TemplateParameterList *FirstTPL =
10905 FirstTemplate->getTemplateParameters();
10906 TemplateParameterList *SecondTPL =
10907 SecondTemplate->getTemplateParameters();
10908
10909 if (FirstTPL->size() != SecondTPL->size()) {
10910 ODRDiagError(FirstTemplate->getLocation(),
10911 FirstTemplate->getSourceRange(),
10912 FunctionTemplateDifferentNumberParameters)
10913 << FirstTemplate << FirstTPL->size();
10914 ODRDiagNote(SecondTemplate->getLocation(),
10915 SecondTemplate->getSourceRange(),
10916 FunctionTemplateDifferentNumberParameters)
10917 << SecondTemplate << SecondTPL->size();
10918
10919 Diagnosed = true;
10920 break;
10921 }
10922
10923 bool ParameterMismatch = false;
10924 for (unsigned i = 0, e = FirstTPL->size(); i != e; ++i) {
10925 NamedDecl *FirstParam = FirstTPL->getParam(i);
10926 NamedDecl *SecondParam = SecondTPL->getParam(i);
10927
10928 if (FirstParam->getKind() != SecondParam->getKind()) {
10929 enum {
10930 TemplateTypeParameter,
10931 NonTypeTemplateParameter,
10932 TemplateTemplateParameter,
10933 };
10934 auto GetParamType = [](NamedDecl *D) {
10935 switch (D->getKind()) {
10936 default:
10937 llvm_unreachable("Unexpected template parameter type")::llvm::llvm_unreachable_internal("Unexpected template parameter type"
, "/build/llvm-toolchain-snapshot-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 10937)
;
10938 case Decl::TemplateTypeParm:
10939 return TemplateTypeParameter;
10940 case Decl::NonTypeTemplateParm:
10941 return NonTypeTemplateParameter;
10942 case Decl::TemplateTemplateParm:
10943 return TemplateTemplateParameter;
10944 }
10945 };
10946
10947 ODRDiagError(FirstTemplate->getLocation(),
10948 FirstTemplate->getSourceRange(),
10949 FunctionTemplateParameterDifferentKind)
10950 << FirstTemplate << (i + 1) << GetParamType(FirstParam);
10951 ODRDiagNote(SecondTemplate->getLocation(),
10952 SecondTemplate->getSourceRange(),
10953 FunctionTemplateParameterDifferentKind)
10954 << SecondTemplate << (i + 1) << GetParamType(SecondParam);
10955
10956 ParameterMismatch = true;
10957 break;
10958 }
10959
10960 if (FirstParam->getName() != SecondParam->getName()) {
10961 ODRDiagError(FirstTemplate->getLocation(),
10962 FirstTemplate->getSourceRange(),
10963 FunctionTemplateParameterName)
10964 << FirstTemplate << (i + 1) << (bool)FirstParam->getIdentifier()
10965 << FirstParam;
10966 ODRDiagNote(SecondTemplate->getLocation(),
10967 SecondTemplate->getSourceRange(),
10968 FunctionTemplateParameterName)
10969 << SecondTemplate << (i + 1)
10970 << (bool)SecondParam->getIdentifier() << SecondParam;
10971 ParameterMismatch = true;
10972 break;
10973 }
10974
10975 if (isa<TemplateTypeParmDecl>(FirstParam) &&
10976 isa<TemplateTypeParmDecl>(SecondParam)) {
10977 TemplateTypeParmDecl *FirstTTPD =
10978 cast<TemplateTypeParmDecl>(FirstParam);
10979 TemplateTypeParmDecl *SecondTTPD =
10980 cast<TemplateTypeParmDecl>(SecondParam);
10981 bool HasFirstDefaultArgument =
10982 FirstTTPD->hasDefaultArgument() &&
10983 !FirstTTPD->defaultArgumentWasInherited();
10984 bool HasSecondDefaultArgument =
10985 SecondTTPD->hasDefaultArgument() &&
10986 !SecondTTPD->defaultArgumentWasInherited();
10987 if (HasFirstDefaultArgument != HasSecondDefaultArgument) {
10988 ODRDiagError(FirstTemplate->getLocation(),
10989 FirstTemplate->getSourceRange(),
10990 FunctionTemplateParameterSingleDefaultArgument)
10991 << FirstTemplate << (i + 1) << HasFirstDefaultArgument;
10992 ODRDiagNote(SecondTemplate->getLocation(),
10993 SecondTemplate->getSourceRange(),
10994 FunctionTemplateParameterSingleDefaultArgument)
10995 << SecondTemplate << (i + 1) << HasSecondDefaultArgument;
10996 ParameterMismatch = true;
10997 break;
10998 }
10999
11000 if (HasFirstDefaultArgument && HasSecondDefaultArgument) {
11001 QualType FirstType = FirstTTPD->getDefaultArgument();
11002 QualType SecondType = SecondTTPD->getDefaultArgument();
11003 if (ComputeQualTypeODRHash(FirstType) !=
11004 ComputeQualTypeODRHash(SecondType)) {
11005 ODRDiagError(FirstTemplate->getLocation(),
11006 FirstTemplate->getSourceRange(),
11007 FunctionTemplateParameterDifferentDefaultArgument)
11008 << FirstTemplate << (i + 1) << FirstType;
11009 ODRDiagNote(SecondTemplate->getLocation(),
11010 SecondTemplate->getSourceRange(),
11011 FunctionTemplateParameterDifferentDefaultArgument)
11012 << SecondTemplate << (i + 1) << SecondType;
11013 ParameterMismatch = true;
11014 break;
11015 }
11016 }
11017
11018 if (FirstTTPD->isParameterPack() !=
11019 SecondTTPD->isParameterPack()) {
11020 ODRDiagError(FirstTemplate->getLocation(),
11021 FirstTemplate->getSourceRange(),
11022 FunctionTemplatePackParameter)
11023 << FirstTemplate << (i + 1) << FirstTTPD->isParameterPack();
11024 ODRDiagNote(SecondTemplate->getLocation(),
11025 SecondTemplate->getSourceRange(),
11026 FunctionTemplatePackParameter)
11027 << SecondTemplate << (i + 1) << SecondTTPD->isParameterPack();
11028 ParameterMismatch = true;
11029 break;
11030 }
11031 }
11032
11033 if (isa<TemplateTemplateParmDecl>(FirstParam) &&
11034 isa<TemplateTemplateParmDecl>(SecondParam)) {
11035 TemplateTemplateParmDecl *FirstTTPD =
11036 cast<TemplateTemplateParmDecl>(FirstParam);
11037 TemplateTemplateParmDecl *SecondTTPD =
11038 cast<TemplateTemplateParmDecl>(SecondParam);
11039
11040 TemplateParameterList *FirstTPL =
11041 FirstTTPD->getTemplateParameters();
11042 TemplateParameterList *SecondTPL =
11043 SecondTTPD->getTemplateParameters();
11044
11045 if (ComputeTemplateParameterListODRHash(FirstTPL) !=
11046 ComputeTemplateParameterListODRHash(SecondTPL)) {
11047 ODRDiagError(FirstTemplate->getLocation(),
11048 FirstTemplate->getSourceRange(),
11049 FunctionTemplateParameterDifferentType)
11050 << FirstTemplate << (i + 1);
11051 ODRDiagNote(SecondTemplate->getLocation(),
11052 SecondTemplate->getSourceRange(),
11053 FunctionTemplateParameterDifferentType)
11054 << SecondTemplate << (i + 1);
11055 ParameterMismatch = true;
11056 break;
11057 }
11058
11059 bool HasFirstDefaultArgument =
11060 FirstTTPD->hasDefaultArgument() &&
11061 !FirstTTPD->defaultArgumentWasInherited();
11062 bool HasSecondDefaultArgument =
11063 SecondTTPD->hasDefaultArgument() &&
11064 !SecondTTPD->defaultArgumentWasInherited();
11065 if (HasFirstDefaultArgument != HasSecondDefaultArgument) {
11066 ODRDiagError(FirstTemplate->getLocation(),
11067 FirstTemplate->getSourceRange(),
11068 FunctionTemplateParameterSingleDefaultArgument)
11069 << FirstTemplate << (i + 1) << HasFirstDefaultArgument;
11070 ODRDiagNote(SecondTemplate->getLocation(),
11071 SecondTemplate->getSourceRange(),
11072 FunctionTemplateParameterSingleDefaultArgument)
11073 << SecondTemplate << (i + 1) << HasSecondDefaultArgument;
11074 ParameterMismatch = true;
11075 break;
11076 }
11077
11078 if (HasFirstDefaultArgument && HasSecondDefaultArgument) {
11079 TemplateArgument FirstTA =
11080 FirstTTPD->getDefaultArgument().getArgument();
11081 TemplateArgument SecondTA =
11082 SecondTTPD->getDefaultArgument().getArgument();
11083 if (ComputeTemplateArgumentODRHash(FirstTA) !=
11084 ComputeTemplateArgumentODRHash(SecondTA)) {
11085 ODRDiagError(FirstTemplate->getLocation(),
11086 FirstTemplate->getSourceRange(),
11087 FunctionTemplateParameterDifferentDefaultArgument)
11088 << FirstTemplate << (i + 1) << FirstTA;
11089 ODRDiagNote(SecondTemplate->getLocation(),
11090 SecondTemplate->getSourceRange(),
11091 FunctionTemplateParameterDifferentDefaultArgument)
11092 << SecondTemplate << (i + 1) << SecondTA;
11093 ParameterMismatch = true;
11094 break;
11095 }
11096 }
11097
11098 if (FirstTTPD->isParameterPack() !=
11099 SecondTTPD->isParameterPack()) {
11100 ODRDiagError(FirstTemplate->getLocation(),
11101 FirstTemplate->getSourceRange(),
11102 FunctionTemplatePackParameter)
11103 << FirstTemplate << (i + 1) << FirstTTPD->isParameterPack();
11104 ODRDiagNote(SecondTemplate->getLocation(),
11105 SecondTemplate->getSourceRange(),
11106 FunctionTemplatePackParameter)
11107 << SecondTemplate << (i + 1) << SecondTTPD->isParameterPack();
11108 ParameterMismatch = true;
11109 break;
11110 }
11111 }
11112
11113 if (isa<NonTypeTemplateParmDecl>(FirstParam) &&
11114 isa<NonTypeTemplateParmDecl>(SecondParam)) {
11115 NonTypeTemplateParmDecl *FirstNTTPD =
11116 cast<NonTypeTemplateParmDecl>(FirstParam);
11117 NonTypeTemplateParmDecl *SecondNTTPD =
11118 cast<NonTypeTemplateParmDecl>(SecondParam);
11119
11120 QualType FirstType = FirstNTTPD->getType();
11121 QualType SecondType = SecondNTTPD->getType();
11122 if (ComputeQualTypeODRHash(FirstType) !=
11123 ComputeQualTypeODRHash(SecondType)) {
11124 ODRDiagError(FirstTemplate->getLocation(),
11125 FirstTemplate->getSourceRange(),
11126 FunctionTemplateParameterDifferentType)
11127 << FirstTemplate << (i + 1);
11128 ODRDiagNote(SecondTemplate->getLocation(),
11129 SecondTemplate->getSourceRange(),
11130 FunctionTemplateParameterDifferentType)
11131 << SecondTemplate << (i + 1);
11132 ParameterMismatch = true;
11133 break;
11134 }
11135
11136 bool HasFirstDefaultArgument =
11137 FirstNTTPD->hasDefaultArgument() &&
11138 !FirstNTTPD->defaultArgumentWasInherited();
11139 bool HasSecondDefaultArgument =
11140 SecondNTTPD->hasDefaultArgument() &&
11141 !SecondNTTPD->defaultArgumentWasInherited();
11142 if (HasFirstDefaultArgument != HasSecondDefaultArgument) {
11143 ODRDiagError(FirstTemplate->getLocation(),
11144 FirstTemplate->getSourceRange(),
11145 FunctionTemplateParameterSingleDefaultArgument)
11146 << FirstTemplate << (i + 1) << HasFirstDefaultArgument;
11147 ODRDiagNote(SecondTemplate->getLocation(),
11148 SecondTemplate->getSourceRange(),
11149 FunctionTemplateParameterSingleDefaultArgument)
11150 << SecondTemplate << (i + 1) << HasSecondDefaultArgument;
11151 ParameterMismatch = true;
11152 break;
11153 }
11154
11155 if (HasFirstDefaultArgument && HasSecondDefaultArgument) {
11156 Expr *FirstDefaultArgument = FirstNTTPD->getDefaultArgument();
11157 Expr *SecondDefaultArgument = SecondNTTPD->getDefaultArgument();
11158 if (ComputeODRHash(FirstDefaultArgument) !=
11159 ComputeODRHash(SecondDefaultArgument)) {
11160 ODRDiagError(FirstTemplate->getLocation(),
11161 FirstTemplate->getSourceRange(),
11162 FunctionTemplateParameterDifferentDefaultArgument)
11163 << FirstTemplate << (i + 1) << FirstDefaultArgument;
11164 ODRDiagNote(SecondTemplate->getLocation(),
11165 SecondTemplate->getSourceRange(),
11166 FunctionTemplateParameterDifferentDefaultArgument)
11167 << SecondTemplate << (i + 1) << SecondDefaultArgument;
11168 ParameterMismatch = true;
11169 break;
11170 }
11171 }
11172
11173 if (FirstNTTPD->isParameterPack() !=
11174 SecondNTTPD->isParameterPack()) {
11175 ODRDiagError(FirstTemplate->getLocation(),
11176 FirstTemplate->getSourceRange(),
11177 FunctionTemplatePackParameter)
11178 << FirstTemplate << (i + 1) << FirstNTTPD->isParameterPack();
11179 ODRDiagNote(SecondTemplate->getLocation(),
11180 SecondTemplate->getSourceRange(),
11181 FunctionTemplatePackParameter)
11182 << SecondTemplate << (i + 1)
11183 << SecondNTTPD->isParameterPack();
11184 ParameterMismatch = true;
11185 break;
11186 }
11187 }
11188 }
11189
11190 if (ParameterMismatch) {
11191 Diagnosed = true;
11192 break;
11193 }
11194
11195 break;
11196 }
11197 }
11198
11199 if (Diagnosed)
11200 continue;
11201
11202 Diag(FirstDecl->getLocation(),
11203 diag::err_module_odr_violation_mismatch_decl_unknown)
11204 << FirstRecord << FirstModule.empty() << FirstModule << FirstDiffType
11205 << FirstDecl->getSourceRange();
11206 Diag(SecondDecl->getLocation(),
11207 diag::note_module_odr_violation_mismatch_decl_unknown)
11208 << SecondModule << FirstDiffType << SecondDecl->getSourceRange();
11209 Diagnosed = true;
11210 }
11211
11212 if (!Diagnosed) {
11213 // All definitions are updates to the same declaration. This happens if a
11214 // module instantiates the declaration of a class template specialization
11215 // and two or more other modules instantiate its definition.
11216 //
11217 // FIXME: Indicate which modules had instantiations of this definition.
11218 // FIXME: How can this even happen?
11219 Diag(Merge.first->getLocation(),
11220 diag::err_module_odr_violation_different_instantiations)
11221 << Merge.first;
11222 }
11223 }
11224
11225 // Issue ODR failures diagnostics for functions.
11226 for (auto &Merge : FunctionOdrMergeFailures) {
11227 enum ODRFunctionDifference {
11228 ReturnType,
11229 ParameterName,
11230 ParameterType,
11231 ParameterSingleDefaultArgument,
11232 ParameterDifferentDefaultArgument,
11233 FunctionBody,
11234 };
11235
11236 FunctionDecl *FirstFunction = Merge.first;
11237 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstFunction);
11238
11239 bool Diagnosed = false;
11240 for (auto &SecondFunction : Merge.second) {
11241
11242 if (FirstFunction == SecondFunction)
11243 continue;
11244
11245 std::string SecondModule =
11246 getOwningModuleNameForDiagnostic(SecondFunction);
11247
11248 auto ODRDiagError = [FirstFunction, &FirstModule,
11249 this](SourceLocation Loc, SourceRange Range,
11250 ODRFunctionDifference DiffType) {
11251 return Diag(Loc, diag::err_module_odr_violation_function)
11252 << FirstFunction << FirstModule.empty() << FirstModule << Range
11253 << DiffType;
11254 };
11255 auto ODRDiagNote = [&SecondModule, this](SourceLocation Loc,
11256 SourceRange Range,
11257 ODRFunctionDifference DiffType) {
11258 return Diag(Loc, diag::note_module_odr_violation_function)
11259 << SecondModule << Range << DiffType;
11260 };
11261
11262 if (ComputeQualTypeODRHash(FirstFunction->getReturnType()) !=
11263 ComputeQualTypeODRHash(SecondFunction->getReturnType())) {
11264 ODRDiagError(FirstFunction->getReturnTypeSourceRange().getBegin(),
11265 FirstFunction->getReturnTypeSourceRange(), ReturnType)
11266 << FirstFunction->getReturnType();
11267 ODRDiagNote(SecondFunction->getReturnTypeSourceRange().getBegin(),
11268 SecondFunction->getReturnTypeSourceRange(), ReturnType)
11269 << SecondFunction->getReturnType();
11270 Diagnosed = true;
11271 break;
11272 }
11273
11274 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 11275, __PRETTY_FUNCTION__))
11275 "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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 11275, __PRETTY_FUNCTION__))
;
11276
11277 auto ParamSize = FirstFunction->param_size();
11278 bool ParameterMismatch = false;
11279 for (unsigned I = 0; I < ParamSize; ++I) {
11280 auto *FirstParam = FirstFunction->getParamDecl(I);
11281 auto *SecondParam = SecondFunction->getParamDecl(I);
11282
11283 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 11285, __PRETTY_FUNCTION__))
11284 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 11285, __PRETTY_FUNCTION__))
11285 "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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 11285, __PRETTY_FUNCTION__))
;
11286
11287 if (FirstParam->getDeclName() != SecondParam->getDeclName()) {
11288 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(),
11289 ParameterName)
11290 << I + 1 << FirstParam->getDeclName();
11291 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(),
11292 ParameterName)
11293 << I + 1 << SecondParam->getDeclName();
11294 ParameterMismatch = true;
11295 break;
11296 };
11297
11298 QualType FirstParamType = FirstParam->getType();
11299 QualType SecondParamType = SecondParam->getType();
11300 if (FirstParamType != SecondParamType &&
11301 ComputeQualTypeODRHash(FirstParamType) !=
11302 ComputeQualTypeODRHash(SecondParamType)) {
11303 if (const DecayedType *ParamDecayedType =
11304 FirstParamType->getAs<DecayedType>()) {
11305 ODRDiagError(FirstParam->getLocation(),
11306 FirstParam->getSourceRange(), ParameterType)
11307 << (I + 1) << FirstParamType << true
11308 << ParamDecayedType->getOriginalType();
11309 } else {
11310 ODRDiagError(FirstParam->getLocation(),
11311 FirstParam->getSourceRange(), ParameterType)
11312 << (I + 1) << FirstParamType << false;
11313 }
11314
11315 if (const DecayedType *ParamDecayedType =
11316 SecondParamType->getAs<DecayedType>()) {
11317 ODRDiagNote(SecondParam->getLocation(),
11318 SecondParam->getSourceRange(), ParameterType)
11319 << (I + 1) << SecondParamType << true
11320 << ParamDecayedType->getOriginalType();
11321 } else {
11322 ODRDiagNote(SecondParam->getLocation(),
11323 SecondParam->getSourceRange(), ParameterType)
11324 << (I + 1) << SecondParamType << false;
11325 }
11326 ParameterMismatch = true;
11327 break;
11328 }
11329
11330 const Expr *FirstInit = FirstParam->getInit();
11331 const Expr *SecondInit = SecondParam->getInit();
11332 if ((FirstInit == nullptr) != (SecondInit == nullptr)) {
11333 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(),
11334 ParameterSingleDefaultArgument)
11335 << (I + 1) << (FirstInit == nullptr)
11336 << (FirstInit ? FirstInit->getSourceRange() : SourceRange());
11337 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(),
11338 ParameterSingleDefaultArgument)
11339 << (I + 1) << (SecondInit == nullptr)
11340 << (SecondInit ? SecondInit->getSourceRange() : SourceRange());
11341 ParameterMismatch = true;
11342 break;
11343 }
11344
11345 if (FirstInit && SecondInit &&
11346 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) {
11347 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(),
11348 ParameterDifferentDefaultArgument)
11349 << (I + 1) << FirstInit->getSourceRange();
11350 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(),
11351 ParameterDifferentDefaultArgument)
11352 << (I + 1) << SecondInit->getSourceRange();
11353 ParameterMismatch = true;
11354 break;
11355 }
11356
11357 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 11359, __PRETTY_FUNCTION__))
11358 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 11359, __PRETTY_FUNCTION__))
11359 "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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 11359, __PRETTY_FUNCTION__))
;
11360 }
11361
11362 if (ParameterMismatch) {
11363 Diagnosed = true;
11364 break;
11365 }
11366
11367 // If no error has been generated before now, assume the problem is in
11368 // the body and generate a message.
11369 ODRDiagError(FirstFunction->getLocation(),
11370 FirstFunction->getSourceRange(), FunctionBody);
11371 ODRDiagNote(SecondFunction->getLocation(),
11372 SecondFunction->getSourceRange(), FunctionBody);
11373 Diagnosed = true;
11374 break;
11375 }
11376 (void)Diagnosed;
11377 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 11377, __PRETTY_FUNCTION__))
;
11378 }
11379
11380 // Issue ODR failures diagnostics for enums.
11381 for (auto &Merge : EnumOdrMergeFailures) {
11382 enum ODREnumDifference {
11383 SingleScopedEnum,
11384 EnumTagKeywordMismatch,
11385 SingleSpecifiedType,
11386 DifferentSpecifiedTypes,
11387 DifferentNumberEnumConstants,
11388 EnumConstantName,
11389 EnumConstantSingleInitilizer,
11390 EnumConstantDifferentInitilizer,
11391 };
11392
11393 // If we've already pointed out a specific problem with this enum, don't
11394 // bother issuing a general "something's different" diagnostic.
11395 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11396 continue;
11397
11398 EnumDecl *FirstEnum = Merge.first;
11399 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstEnum);
11400
11401 using DeclHashes =
11402 llvm::SmallVector<std::pair<EnumConstantDecl *, unsigned>, 4>;
11403 auto PopulateHashes = [&ComputeSubDeclODRHash, FirstEnum](
11404 DeclHashes &Hashes, EnumDecl *Enum) {
11405 for (auto *D : Enum->decls()) {
11406 // Due to decl merging, the first EnumDecl is the parent of
11407 // Decls in both records.
11408 if (!ODRHash::isWhitelistedDecl(D, FirstEnum))
11409 continue;
11410 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 11410, __PRETTY_FUNCTION__))
;
11411 Hashes.emplace_back(cast<EnumConstantDecl>(D),
11412 ComputeSubDeclODRHash(D));
11413 }
11414 };
11415 DeclHashes FirstHashes;
11416 PopulateHashes(FirstHashes, FirstEnum);
11417 bool Diagnosed = false;
11418 for (auto &SecondEnum : Merge.second) {
11419
11420 if (FirstEnum == SecondEnum)
11421 continue;
11422
11423 std::string SecondModule =
11424 getOwningModuleNameForDiagnostic(SecondEnum);
11425
11426 auto ODRDiagError = [FirstEnum, &FirstModule,
11427 this](SourceLocation Loc, SourceRange Range,
11428 ODREnumDifference DiffType) {
11429 return Diag(Loc, diag::err_module_odr_violation_enum)
11430 << FirstEnum << FirstModule.empty() << FirstModule << Range
11431 << DiffType;
11432 };
11433 auto ODRDiagNote = [&SecondModule, this](SourceLocation Loc,
11434 SourceRange Range,
11435 ODREnumDifference DiffType) {
11436 return Diag(Loc, diag::note_module_odr_violation_enum)
11437 << SecondModule << Range << DiffType;
11438 };
11439
11440 if (FirstEnum->isScoped() != SecondEnum->isScoped()) {
11441 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(),
11442 SingleScopedEnum)
11443 << FirstEnum->isScoped();
11444 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(),
11445 SingleScopedEnum)
11446 << SecondEnum->isScoped();
11447 Diagnosed = true;
11448 continue;
11449 }
11450
11451 if (FirstEnum->isScoped() && SecondEnum->isScoped()) {
11452 if (FirstEnum->isScopedUsingClassTag() !=
11453 SecondEnum->isScopedUsingClassTag()) {
11454 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(),
11455 EnumTagKeywordMismatch)
11456 << FirstEnum->isScopedUsingClassTag();
11457 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(),
11458 EnumTagKeywordMismatch)
11459 << SecondEnum->isScopedUsingClassTag();
11460 Diagnosed = true;
11461 continue;
11462 }
11463 }
11464
11465 QualType FirstUnderlyingType =
11466 FirstEnum->getIntegerTypeSourceInfo()
11467 ? FirstEnum->getIntegerTypeSourceInfo()->getType()
11468 : QualType();
11469 QualType SecondUnderlyingType =
11470 SecondEnum->getIntegerTypeSourceInfo()
11471 ? SecondEnum->getIntegerTypeSourceInfo()->getType()
11472 : QualType();
11473 if (FirstUnderlyingType.isNull() != SecondUnderlyingType.isNull()) {
11474 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(),
11475 SingleSpecifiedType)
11476 << !FirstUnderlyingType.isNull();
11477 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(),
11478 SingleSpecifiedType)
11479 << !SecondUnderlyingType.isNull();
11480 Diagnosed = true;
11481 continue;
11482 }
11483
11484 if (!FirstUnderlyingType.isNull() && !SecondUnderlyingType.isNull()) {
11485 if (ComputeQualTypeODRHash(FirstUnderlyingType) !=
11486 ComputeQualTypeODRHash(SecondUnderlyingType)) {
11487 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(),
11488 DifferentSpecifiedTypes)
11489 << FirstUnderlyingType;
11490 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(),
11491 DifferentSpecifiedTypes)
11492 << SecondUnderlyingType;
11493 Diagnosed = true;
11494 continue;
11495 }
11496 }
11497
11498 DeclHashes SecondHashes;
11499 PopulateHashes(SecondHashes, SecondEnum);
11500
11501 if (FirstHashes.size() != SecondHashes.size()) {
11502 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(),
11503 DifferentNumberEnumConstants)
11504 << (int)FirstHashes.size();
11505 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(),
11506 DifferentNumberEnumConstants)
11507 << (int)SecondHashes.size();
11508 Diagnosed = true;
11509 continue;
11510 }
11511
11512 for (unsigned I = 0; I < FirstHashes.size(); ++I) {
11513 if (FirstHashes[I].second == SecondHashes[I].second)
11514 continue;
11515 const EnumConstantDecl *FirstEnumConstant = FirstHashes[I].first;
11516 const EnumConstantDecl *SecondEnumConstant = SecondHashes[I].first;
11517
11518 if (FirstEnumConstant->getDeclName() !=
11519 SecondEnumConstant->getDeclName()) {
11520
11521 ODRDiagError(FirstEnumConstant->getLocation(),
11522 FirstEnumConstant->getSourceRange(), EnumConstantName)
11523 << I + 1 << FirstEnumConstant;
11524 ODRDiagNote(SecondEnumConstant->getLocation(),
11525 SecondEnumConstant->getSourceRange(), EnumConstantName)
11526 << I + 1 << SecondEnumConstant;
11527 Diagnosed = true;
11528 break;
11529 }
11530
11531 const Expr *FirstInit = FirstEnumConstant->getInitExpr();
11532 const Expr *SecondInit = SecondEnumConstant->getInitExpr();
11533 if (!FirstInit && !SecondInit)
11534 continue;
11535
11536 if (!FirstInit || !SecondInit) {
11537 ODRDiagError(FirstEnumConstant->getLocation(),
11538 FirstEnumConstant->getSourceRange(),
11539 EnumConstantSingleInitilizer)
11540 << I + 1 << FirstEnumConstant << (FirstInit != nullptr);
11541 ODRDiagNote(SecondEnumConstant->getLocation(),
11542 SecondEnumConstant->getSourceRange(),
11543 EnumConstantSingleInitilizer)
11544 << I + 1 << SecondEnumConstant << (SecondInit != nullptr);
11545 Diagnosed = true;
11546 break;
11547 }
11548
11549 if (ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) {
11550 ODRDiagError(FirstEnumConstant->getLocation(),
11551 FirstEnumConstant->getSourceRange(),
11552 EnumConstantDifferentInitilizer)
11553 << I + 1 << FirstEnumConstant;
11554 ODRDiagNote(SecondEnumConstant->getLocation(),
11555 SecondEnumConstant->getSourceRange(),
11556 EnumConstantDifferentInitilizer)
11557 << I + 1 << SecondEnumConstant;
11558 Diagnosed = true;
11559 break;
11560 }
11561 }
11562 }
11563
11564 (void)Diagnosed;
11565 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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 11565, __PRETTY_FUNCTION__))
;
11566 }
11567}
11568
11569void ASTReader::StartedDeserializing() {
11570 if (++NumCurrentElementsDeserializing == 1 && ReadTimer.get())
11571 ReadTimer->startTimer();
11572}
11573
11574void ASTReader::FinishedDeserializing() {
11575 assert(NumCurrentElementsDeserializing &&((NumCurrentElementsDeserializing && "FinishedDeserializing not paired with StartedDeserializing"
) ? static_cast<void> (0) : __assert_fail ("NumCurrentElementsDeserializing && \"FinishedDeserializing not paired with StartedDeserializing\""
, "/build/llvm-toolchain-snapshot-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 11576, __PRETTY_FUNCTION__))
11576 "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-9~svn360825/tools/clang/lib/Serialization/ASTReader.cpp"
, 11576, __PRETTY_FUNCTION__))
;
11577 if (NumCurrentElementsDeserializing == 1) {
11578 // We decrease NumCurrentElementsDeserializing only after pending actions
11579 // are finished, to avoid recursively re-calling finishPendingActions().
11580 finishPendingActions();
11581 }
11582 --NumCurrentElementsDeserializing;
11583
11584 if (NumCurrentElementsDeserializing == 0) {
11585 // Propagate exception specification and deduced type updates along
11586 // redeclaration chains.
11587 //
11588 // We do this now rather than in finishPendingActions because we want to
11589 // be able to walk the complete redeclaration chains of the updated decls.
11590 while (!PendingExceptionSpecUpdates.empty() ||
11591 !PendingDeducedTypeUpdates.empty()) {
11592 auto ESUpdates = std::move(PendingExceptionSpecUpdates);
11593 PendingExceptionSpecUpdates.clear();
11594 for (auto Update : ESUpdates) {
11595 ProcessingUpdatesRAIIObj ProcessingUpdates(*this);
11596 auto *FPT = Update.second->getType()->castAs<FunctionProtoType>();
11597 auto ESI = FPT->getExtProtoInfo().ExceptionSpec;
11598 if (auto *Listener = getContext().getASTMutationListener())
11599 Listener->ResolvedExceptionSpec(cast<FunctionDecl>(Update.second));
11600 for (auto *Redecl : Update.second->redecls())
11601 getContext().adjustExceptionSpec(cast<FunctionDecl>(Redecl), ESI);
11602 }
11603
11604 auto DTUpdates = std::move(PendingDeducedTypeUpdates);
11605 PendingDeducedTypeUpdates.clear();
11606 for (auto Update : DTUpdates) {
11607 ProcessingUpdatesRAIIObj ProcessingUpdates(*this);
11608 // FIXME: If the return type is already deduced, check that it matches.
11609 getContext().adjustDeducedFunctionResultType(Update.first,
11610 Update.second);
11611 }
11612 }
11613
11614 if (ReadTimer)
11615 ReadTimer->stopTimer();
11616
11617 diagnoseOdrViolations();
11618
11619 // We are not in recursive loading, so it's safe to pass the "interesting"
11620 // decls to the consumer.
11621 if (Consumer)
11622 PassInterestingDeclsToConsumer();
11623 }
11624}
11625
11626void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) {
11627 if (IdentifierInfo *II = Name.getAsIdentifierInfo()) {
11628 // Remove any fake results before adding any real ones.
11629 auto It = PendingFakeLookupResults.find(II);
11630 if (It != PendingFakeLookupResults.end()) {
11631 for (auto *ND : It->second)
11632 SemaObj->IdResolver.RemoveDecl(ND);
11633 // FIXME: this works around module+PCH performance issue.
11634 // Rather than erase the result from the map, which is O(n), just clear
11635 // the vector of NamedDecls.
11636 It->second.clear();
11637 }
11638 }
11639
11640 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
11641 SemaObj->TUScope->AddDecl(D);
11642 } else if (SemaObj->TUScope) {
11643 // Adding the decl to IdResolver may have failed because it was already in
11644 // (even though it was not added in scope). If it is already in, make sure
11645 // it gets in the scope as well.
11646 if (std::find(SemaObj->IdResolver.begin(Name),
11647 SemaObj->IdResolver.end(), D) != SemaObj->IdResolver.end())
11648 SemaObj->TUScope->AddDecl(D);
11649 }
11650}
11651
11652ASTReader::ASTReader(Preprocessor &PP, InMemoryModuleCache &ModuleCache,
11653 ASTContext *Context,
11654 const PCHContainerReader &PCHContainerRdr,
11655 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
11656 StringRef isysroot, bool DisableValidation,
11657 bool AllowASTWithCompilerErrors,
11658 bool AllowConfigurationMismatch, bool ValidateSystemInputs,
11659 bool UseGlobalIndex,
11660 std::unique_ptr<llvm::Timer> ReadTimer)
11661 : Listener(DisableValidation
11662 ? cast<ASTReaderListener>(new SimpleASTReaderListener(PP))
11663 : cast<ASTReaderListener>(new PCHValidator(PP, *this))),
11664 SourceMgr(PP.getSourceManager()), FileMgr(PP.getFileManager()),
11665 PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()), PP(PP),
11666 ContextObj(Context), ModuleMgr(PP.getFileManager(), ModuleCache,
11667 PCHContainerRdr, PP.getHeaderSearchInfo()),
11668 DummyIdResolver(PP), ReadTimer(std::move(ReadTimer)), isysroot(isysroot),
11669 DisableValidation(DisableValidation),
11670 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
11671 AllowConfigurationMismatch(AllowConfigurationMismatch),
11672 ValidateSystemInputs(ValidateSystemInputs),
11673 UseGlobalIndex(UseGlobalIndex), CurrSwitchCaseStmts(&SwitchCaseStmts) {
11674 SourceMgr.setExternalSLocEntrySource(this);
11675
11676 for (const auto &Ext : Extensions) {
11677 auto BlockName = Ext->getExtensionMetadata().BlockName;
11678 auto Known = ModuleFileExtensions.find(BlockName);
11679 if (Known != ModuleFileExtensions.end()) {
11680 Diags.Report(diag::warn_duplicate_module_file_extension)
11681 << BlockName;
11682 continue;
11683 }
11684
11685 ModuleFileExtensions.insert({BlockName, Ext});
11686 }
11687}
11688
11689ASTReader::~ASTReader() {
11690 if (OwnsDeserializationListener)
11691 delete DeserializationListener;
11692}
11693
11694IdentifierResolver &ASTReader::getIdResolver() {
11695 return SemaObj ? SemaObj->IdResolver : DummyIdResolver;
11696}
11697
11698unsigned ASTRecordReader::readRecord(llvm::BitstreamCursor &Cursor,
11699 unsigned AbbrevID) {
11700 Idx = 0;
11701 Record.clear();
11702 return Cursor.readRecord(AbbrevID, Record);
11703}
11704//===----------------------------------------------------------------------===//
11705//// OMPClauseReader implementation
11706////===----------------------------------------------------------------------===//
11707
11708OMPClause *OMPClauseReader::readClause() {
11709 OMPClause *C;
11710 switch (Record.readInt()) {
11711 case OMPC_if:
11712 C = new (Context) OMPIfClause();
11713 break;
11714 case OMPC_final:
11715 C = new (Context) OMPFinalClause();
11716 break;
11717 case OMPC_num_threads:
11718 C = new (Context) OMPNumThreadsClause();
11719 break;
11720 case OMPC_safelen:
11721 C = new (Context) OMPSafelenClause();
11722 break;
11723 case OMPC_simdlen:
11724 C = new (Context) OMPSimdlenClause();
11725 break;
11726 case OMPC_allocator:
11727 C = new (Context) OMPAllocatorClause();
11728 break;
11729 case OMPC_collapse:
11730 C = new (Context) OMPCollapseClause();
11731 break;
11732 case OMPC_default:
11733 C = new (Context) OMPDefaultClause();
11734 break;
11735 case OMPC_proc_bind:
11736 C = new (Context) OMPProcBindClause();
11737 break;
11738 case OMPC_schedule:
11739 C = new (Context) OMPScheduleClause();
11740 break;
11741 case OMPC_ordered:
11742 C = OMPOrderedClause::CreateEmpty(Context, Record.readInt());
11743 break;
11744 case OMPC_nowait:
11745 C = new (Context) OMPNowaitClause();
11746 break;
11747 case OMPC_untied:
11748 C = new (Context) OMPUntiedClause();
11749 break;
11750 case OMPC_mergeable:
11751 C = new (Context) OMPMergeableClause();
11752 break;
11753 case OMPC_read:
11754 C = new (Context) OMPReadClause();
11755 break;
11756 case OMPC_write:
11757 C = new (Context) OMPWriteClause();
11758 break;
11759 case OMPC_update:
11760 C = new (Context) OMPUpdateClause();
11761 break;
11762 case OMPC_capture:
11763 C = new (Context) OMPCaptureClause();
11764 break;
11765 case OMPC_seq_cst:
11766 C = new (Context) OMPSeqCstClause();
11767 break;
11768 case OMPC_threads:
11769 C = new (Context) OMPThreadsClause();
11770 break;
11771 case OMPC_simd:
11772 C = new (Context) OMPSIMDClause();
11773 break;
11774 case OMPC_nogroup:
11775 C = new (Context) OMPNogroupClause();
11776 break;
11777 case OMPC_unified_address:
11778 C = new (Context) OMPUnifiedAddressClause();
11779 break;
11780 case OMPC_unified_shared_memory:
11781 C = new (Context) OMPUnifiedSharedMemoryClause();
11782 break;
11783 case OMPC_reverse_offload:
11784 C = new (Context) OMPReverseOffloadClause();
11785 break;
11786 case OMPC_dynamic_allocators:
11787 C = new (Context) OMPDynamicAllocatorsClause();
11788 break;
11789 case OMPC_atomic_default_mem_order:
11790 C = new (Context) OMPAtomicDefaultMemOrderClause();
11791 break;
11792 case OMPC_private:
11793 C = OMPPrivateClause::CreateEmpty(Context, Record.readInt());
11794 break;
11795 case OMPC_firstprivate:
11796 C = OMPFirstprivateClause::CreateEmpty(Context, Record.readInt());
11797 break;
11798 case OMPC_lastprivate:
11799 C = OMPLastprivateClause::CreateEmpty(Context, Record.readInt());
11800 break;
11801 case OMPC_shared:
11802 C = OMPSharedClause::CreateEmpty(Context, Record.readInt());
11803 break;
11804 case OMPC_reduction:
11805 C = OMPReductionClause::CreateEmpty(Context, Record.readInt());
11806 break;
11807 case OMPC_task_reduction:
11808 C = OMPTaskReductionClause::CreateEmpty(Context, Record.readInt());
11809 break;
11810 case OMPC_in_reduction:
11811 C = OMPInReductionClause::CreateEmpty(Context, Record.readInt());
11812 break;
11813 case OMPC_linear:
11814 C = OMPLinearClause::CreateEmpty(Context, Record.readInt());
11815 break;
11816 case OMPC_aligned:
11817 C = OMPAlignedClause::CreateEmpty(Context, Record.readInt());
11818 break;
11819 case OMPC_copyin:
11820 C = OMPCopyinClause::CreateEmpty(Context, Record.readInt());
11821 break;
11822 case OMPC_copyprivate:
11823 C = OMPCopyprivateClause::CreateEmpty(Context, Record.readInt());
11824 break;
11825 case OMPC_flush:
11826 C = OMPFlushClause::CreateEmpty(Context, Record.readInt());
11827 break;
11828 case OMPC_depend: {
11829 unsigned NumVars = Record.readInt();
11830 unsigned NumLoops = Record.readInt();
11831 C = OMPDependClause::CreateEmpty(Context, NumVars, NumLoops);
11832 break;
11833 }
11834 case OMPC_device:
11835 C = new (Context) OMPDeviceClause();
11836 break;
11837 case OMPC_map: {
11838 OMPMappableExprListSizeTy Sizes;
11839 Sizes.NumVars = Record.readInt();
11840 Sizes.NumUniqueDeclarations = Record.readInt();
11841 Sizes.NumComponentLists = Record.readInt();
11842 Sizes.NumComponents = Record.readInt();
11843 C = OMPMapClause::CreateEmpty(Context, Sizes);
11844 break;
11845 }
11846 case OMPC_num_teams:
11847 C = new (Context) OMPNumTeamsClause();
11848 break;
11849 case OMPC_thread_limit:
11850 C = new (Context) OMPThreadLimitClause();
11851 break;
11852 case OMPC_priority:
11853 C = new (Context) OMPPriorityClause();
11854 break;
11855 case OMPC_grainsize:
11856 C = new (Context) OMPGrainsizeClause();
11857 break;
11858 case OMPC_num_tasks:
11859 C = new (Context) OMPNumTasksClause();
11860 break;
11861 case OMPC_hint:
11862 C = new (Context) OMPHintClause();
11863 break;
11864 case OMPC_dist_schedule:
11865 C = new (Context) OMPDistScheduleClause();
11866 break;
11867 case OMPC_defaultmap:
11868 C = new (Context) OMPDefaultmapClause();
11869 break;
11870 case OMPC_to: {
11871 OMPMappableExprListSizeTy Sizes;
11872 Sizes.NumVars = Record.readInt();
11873 Sizes.NumUniqueDeclarations = Record.readInt();
11874 Sizes.NumComponentLists = Record.readInt();
11875 Sizes.NumComponents = Record.readInt();
11876 C = OMPToClause::CreateEmpty(Context, Sizes);
11877 break;
11878 }
11879 case OMPC_from: {
11880 OMPMappableExprListSizeTy Sizes;
11881 Sizes.NumVars = Record.readInt();
11882 Sizes.NumUniqueDeclarations = Record.readInt();
11883 Sizes.NumComponentLists = Record.readInt();
11884 Sizes.NumComponents = Record.readInt();
11885 C = OMPFromClause::CreateEmpty(Context, Sizes);
11886 break;
11887 }
11888 case OMPC_use_device_ptr: {
11889 OMPMappableExprListSizeTy Sizes;
11890 Sizes.NumVars = Record.readInt();
11891 Sizes.NumUniqueDeclarations = Record.readInt();
11892 Sizes.NumComponentLists = Record.readInt();
11893 Sizes.NumComponents = Record.readInt();
11894 C = OMPUseDevicePtrClause::CreateEmpty(Context, Sizes);
11895 break;
11896 }
11897 case OMPC_is_device_ptr: {
11898 OMPMappableExprListSizeTy Sizes;
11899 Sizes.NumVars = Record.readInt();
11900 Sizes.NumUniqueDeclarations = Record.readInt();
11901 Sizes.NumComponentLists = Record.readInt();
11902 Sizes.NumComponents = Record.readInt();
11903 C = OMPIsDevicePtrClause::CreateEmpty(Context, Sizes);
11904 break;
11905 }
11906 case OMPC_allocate:
11907 C = OMPAllocateClause::CreateEmpty(Context, Record.readInt());
11908 break;
11909 }
11910 Visit(C);
11911 C->setLocStart(Record.readSourceLocation());
11912 C->setLocEnd(Record.readSourceLocation());
11913
11914 return C;
11915}
11916
11917void OMPClauseReader::VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C) {
11918 C->setPreInitStmt(Record.readSubStmt(),
11919 static_cast<OpenMPDirectiveKind>(Record.readInt()));
11920}
11921
11922void OMPClauseReader::VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C) {
11923 VisitOMPClauseWithPreInit(C);
11924 C->setPostUpdateExpr(Record.readSubExpr());
11925}
11926
11927void OMPClauseReader::VisitOMPIfClause(OMPIfClause *C) {
11928 VisitOMPClauseWithPreInit(C);
11929 C->setNameModifier(static_cast<OpenMPDirectiveKind>(Record.readInt()));
11930 C->setNameModifierLoc(Record.readSourceLocation());
11931 C->setColonLoc(Record.readSourceLocation());
11932 C->setCondition(Record.readSubExpr());
11933 C->setLParenLoc(Record.readSourceLocation());
11934}
11935
11936void OMPClauseReader::VisitOMPFinalClause(OMPFinalClause *C) {
11937 C->setCondition(Record.readSubExpr());
11938 C->setLParenLoc(Record.readSourceLocation());
11939}
11940
11941void OMPClauseReader::VisitOMPNumThreadsClause(OMPNumThreadsClause *C) {
11942 VisitOMPClauseWithPreInit(C);
11943 C->setNumThreads(Record.readSubExpr());
11944 C->setLParenLoc(Record.readSourceLocation());
11945}
11946
11947void OMPClauseReader::VisitOMPSafelenClause(OMPSafelenClause *C) {
11948 C->setSafelen(Record.readSubExpr());
11949 C->setLParenLoc(Record.readSourceLocation());
11950}
11951
11952void OMPClauseReader::VisitOMPSimdlenClause(OMPSimdlenClause *C) {
11953 C->setSimdlen(Record.readSubExpr());
11954 C->setLParenLoc(Record.readSourceLocation());
11955}
11956
11957void OMPClauseReader::VisitOMPAllocatorClause(OMPAllocatorClause *C) {
11958 C->setAllocator(Record.readExpr());
11959 C->setLParenLoc(Record.readSourceLocation());
11960}
11961
11962void OMPClauseReader::VisitOMPCollapseClause(OMPCollapseClause *C) {
11963 C->setNumForLoops(Record.readSubExpr());
11964 C->setLParenLoc(Record.readSourceLocation());
11965}
11966
11967void OMPClauseReader::VisitOMPDefaultClause(OMPDefaultClause *C) {
11968 C->setDefaultKind(
11969 static_cast<OpenMPDefaultClauseKind>(Record.readInt()));
11970 C->setLParenLoc(Record.readSourceLocation());
11971 C->setDefaultKindKwLoc(Record.readSourceLocation());
11972}
11973
11974void OMPClauseReader::VisitOMPProcBindClause(OMPProcBindClause *C) {
11975 C->setProcBindKind(
11976 static_cast<OpenMPProcBindClauseKind>(Record.readInt()));
11977 C->setLParenLoc(Record.readSourceLocation());
11978 C->setProcBindKindKwLoc(Record.readSourceLocation());
11979}
11980
11981void OMPClauseReader::VisitOMPScheduleClause(OMPScheduleClause *C) {
11982 VisitOMPClauseWithPreInit(C);
11983 C->setScheduleKind(
11984 static_cast<OpenMPScheduleClauseKind>(Record.readInt()));
11985 C->setFirstScheduleModifier(
11986 static_cast<OpenMPScheduleClauseModifier>(Record.readInt()));
11987 C->setSecondScheduleModifier(
11988 static_cast<OpenMPScheduleClauseModifier>(Record.readInt()));
11989 C->setChunkSize(Record.readSubExpr());
11990 C->setLParenLoc(Record.readSourceLocation());
11991 C->setFirstScheduleModifierLoc(Record.readSourceLocation());
11992 C->setSecondScheduleModifierLoc(Record.readSourceLocation());
11993 C->setScheduleKindLoc(Record.readSourceLocation());
11994 C->setCommaLoc(Record.readSourceLocation());
11995}
11996
11997void OMPClauseReader::VisitOMPOrderedClause(OMPOrderedClause *C) {
11998 C->setNumForLoops(Record.readSubExpr());
11999 for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I)
12000 C->setLoopNumIterations(I, Record.readSubExpr());
12001 for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I)
12002 C->setLoopCounter(I, Record.readSubExpr());
12003 C->setLParenLoc(Record.readSourceLocation());
12004}
12005
12006void OMPClauseReader::VisitOMPNowaitClause(OMPNowaitClause *) {}
12007
12008void OMPClauseReader::VisitOMPUntiedClause(OMPUntiedClause *) {}
12009
12010void OMPClauseReader::VisitOMPMergeableClause(OMPMergeableClause *) {}
12011
12012void OMPClauseReader::VisitOMPReadClause(OMPReadClause *) {}
12013
12014void OMPClauseReader::VisitOMPWriteClause(OMPWriteClause *) {}
12015
12016void OMPClauseReader::VisitOMPUpdateClause(OMPUpdateClause *) {}
12017
12018void OMPClauseReader::VisitOMPCaptureClause(OMPCaptureClause *) {}
12019
12020void OMPClauseReader::VisitOMPSeqCstClause(OMPSeqCstClause *) {}
12021
12022void OMPClauseReader::VisitOMPThreadsClause(OMPThreadsClause *) {}
12023
12024void OMPClauseReader::VisitOMPSIMDClause(OMPSIMDClause *) {}
12025
12026void OMPClauseReader::VisitOMPNogroupClause(OMPNogroupClause *) {}
12027
12028void OMPClauseReader::VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *) {}
12029
12030void OMPClauseReader::VisitOMPUnifiedSharedMemoryClause(
12031 OMPUnifiedSharedMemoryClause *) {}
12032
12033void OMPClauseReader::VisitOMPReverseOffloadClause(OMPReverseOffloadClause *) {}
12034
12035void
12036OMPClauseReader::VisitOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause *) {
12037}
12038
12039void OMPClauseReader::VisitOMPAtomicDefaultMemOrderClause(
12040 OMPAtomicDefaultMemOrderClause *C) {
12041 C->setAtomicDefaultMemOrderKind(
12042 static_cast<OpenMPAtomicDefaultMemOrderClauseKind>(Record.readInt()));
12043 C->setLParenLoc(Record.readSourceLocation());
12044 C->setAtomicDefaultMemOrderKindKwLoc(Record.readSourceLocation());
12045}
12046
12047void OMPClauseReader::VisitOMPPrivateClause(OMPPrivateClause *C) {
12048 C->setLParenLoc(Record.readSourceLocation());
12049 unsigned NumVars = C->varlist_size();
12050 SmallVector<Expr *, 16> Vars;
12051 Vars.reserve(NumVars);
12052 for (unsigned i = 0; i != NumVars; ++i)
12053 Vars.push_back(Record.readSubExpr());
12054 C->setVarRefs(Vars);
12055 Vars.clear();
12056 for (unsigned i = 0; i != NumVars; ++i)
12057 Vars.push_back(Record.readSubExpr());
12058 C->setPrivateCopies(Vars);
12059}
12060
12061void OMPClauseReader::VisitOMPFirstprivateClause(OMPFirstprivateClause *C) {
12062 VisitOMPClauseWithPreInit(C);
12063 C->setLParenLoc(Record.readSourceLocation());
12064 unsigned NumVars = C->varlist_size();
12065 SmallVector<Expr *, 16> Vars;
12066 Vars.reserve(NumVars);
12067 for (unsigned i = 0; i != NumVars; ++i)
12068 Vars.push_back(Record.readSubExpr());
12069 C->setVarRefs(Vars);
12070 Vars.clear();
12071 for (unsigned i = 0; i != NumVars; ++i)
12072 Vars.push_back(Record.readSubExpr());
12073 C->setPrivateCopies(Vars);
12074 Vars.clear();
12075 for (unsigned i = 0; i != NumVars; ++i)
12076 Vars.push_back(Record.readSubExpr());
12077 C->setInits(Vars);
12078}
12079
12080void OMPClauseReader::VisitOMPLastprivateClause(OMPLastprivateClause *C) {
12081 VisitOMPClauseWithPostUpdate(C);
12082 C->setLParenLoc(Record.readSourceLocation());
12083 unsigned NumVars = C->varlist_size();
12084 SmallVector<Expr *, 16> Vars;
12085 Vars.reserve(NumVars);
12086 for (unsigned i = 0; i != NumVars; ++i)
12087 Vars.push_back(Record.readSubExpr());
12088 C->setVarRefs(Vars);
12089 Vars.clear();
12090 for (unsigned i = 0; i != NumVars; ++i)
12091 Vars.push_back(Record.readSubExpr());
12092 C->setPrivateCopies(Vars);
12093 Vars.clear();
12094 for (unsigned i = 0; i != NumVars; ++i)
12095 Vars.push_back(Record.readSubExpr());
12096 C->setSourceExprs(Vars);
12097 Vars.clear();
12098 for (unsigned i = 0; i != NumVars; ++i)
12099 Vars.push_back(Record.readSubExpr());
12100 C->setDestinationExprs(Vars);
12101 Vars.clear();
12102 for (unsigned i = 0; i != NumVars; ++i)
12103 Vars.push_back(Record.readSubExpr());
12104 C->setAssignmentOps(Vars);
12105}
12106
12107void OMPClauseReader::VisitOMPSharedClause(OMPSharedClause *C) {
12108 C->setLParenLoc(Record.readSourceLocation());
12109 unsigned NumVars = C->varlist_size();
12110 SmallVector<Expr *, 16> Vars;
12111 Vars.reserve(NumVars);
12112 for (unsigned i = 0; i != NumVars; ++i)
12113 Vars.push_back(Record.readSubExpr());
12114 C->setVarRefs(Vars);
12115}
12116
12117void OMPClauseReader::VisitOMPReductionClause(OMPReductionClause *C) {
12118 VisitOMPClauseWithPostUpdate(C);
12119 C->setLParenLoc(Record.readSourceLocation());
12120 C->setColonLoc(Record.readSourceLocation());
12121 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12122 DeclarationNameInfo DNI;
12123 Record.readDeclarationNameInfo(DNI);
12124 C->setQualifierLoc(NNSL);
12125 C->setNameInfo(DNI);
12126
12127 unsigned NumVars = C->varlist_size();
12128 SmallVector<Expr *, 16> Vars;
12129 Vars.reserve(NumVars);
12130 for (unsigned i = 0; i != NumVars; ++i)
12131 Vars.push_back(Record.readSubExpr());
12132 C->setVarRefs(Vars);
12133 Vars.clear();
12134 for (unsigned i = 0; i != NumVars; ++i)
12135 Vars.push_back(Record.readSubExpr());
12136 C->setPrivates(Vars);
12137 Vars.clear();
12138 for (unsigned i = 0; i != NumVars; ++i)
12139 Vars.push_back(Record.readSubExpr());
12140 C->setLHSExprs(Vars);
12141 Vars.clear();
12142 for (unsigned i = 0; i != NumVars; ++i)
12143 Vars.push_back(Record.readSubExpr());
12144 C->setRHSExprs(Vars);
12145 Vars.clear();
12146 for (unsigned i = 0; i != NumVars; ++i)
12147 Vars.push_back(Record.readSubExpr());
12148 C->setReductionOps(Vars);
12149}
12150
12151void OMPClauseReader::VisitOMPTaskReductionClause(OMPTaskReductionClause *C) {
12152 VisitOMPClauseWithPostUpdate(C);
12153 C->setLParenLoc(Record.readSourceLocation());
12154 C->setColonLoc(Record.readSourceLocation());
12155 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12156 DeclarationNameInfo DNI;
12157 Record.readDeclarationNameInfo(DNI);
12158 C->setQualifierLoc(NNSL);
12159 C->setNameInfo(DNI);
12160
12161 unsigned NumVars = C->varlist_size();
12162 SmallVector<Expr *, 16> Vars;
12163 Vars.reserve(NumVars);
12164 for (unsigned I = 0; I != NumVars; ++I)
12165 Vars.push_back(Record.readSubExpr());
12166 C->setVarRefs(Vars);
12167 Vars.clear();
12168 for (unsigned I = 0; I != NumVars; ++I)
12169 Vars.push_back(Record.readSubExpr());
12170 C->setPrivates(Vars);
12171 Vars.clear();
12172 for (unsigned I = 0; I != NumVars; ++I)
12173 Vars.push_back(Record.readSubExpr());
12174 C->setLHSExprs(Vars);
12175 Vars.clear();
12176 for (unsigned I = 0; I != NumVars; ++I)
12177 Vars.push_back(Record.readSubExpr());
12178 C->setRHSExprs(Vars);
12179 Vars.clear();
12180 for (unsigned I = 0; I != NumVars; ++I)
12181 Vars.push_back(Record.readSubExpr());
12182 C->setReductionOps(Vars);
12183}
12184
12185void OMPClauseReader::VisitOMPInReductionClause(OMPInReductionClause *C) {
12186 VisitOMPClauseWithPostUpdate(C);
12187 C->setLParenLoc(Record.readSourceLocation());
12188 C->setColonLoc(Record.readSourceLocation());
12189 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12190 DeclarationNameInfo DNI;
12191 Record.readDeclarationNameInfo(DNI);
12192 C->setQualifierLoc(NNSL);
12193 C->setNameInfo(DNI);
12194
12195 unsigned NumVars = C->varlist_size();
12196 SmallVector<Expr *, 16> Vars;
12197 Vars.reserve(NumVars);
12198 for (unsigned I = 0; I != NumVars; ++I)
12199 Vars.push_back(Record.readSubExpr());
12200 C->setVarRefs(Vars);
12201 Vars.clear();
12202 for (unsigned I = 0; I != NumVars; ++I)
12203 Vars.push_back(Record.readSubExpr());
12204 C->setPrivates(Vars);
12205 Vars.clear();
12206 for (unsigned I = 0; I != NumVars; ++I)
12207 Vars.push_back(Record.readSubExpr());
12208 C->setLHSExprs(Vars);
12209 Vars.clear();
12210 for (unsigned I = 0; I != NumVars; ++I)
12211 Vars.push_back(Record.readSubExpr());
12212 C->setRHSExprs(Vars);
12213 Vars.clear();
12214 for (unsigned I = 0; I != NumVars; ++I)
12215 Vars.push_back(Record.readSubExpr());
12216 C->setReductionOps(Vars);
12217 Vars.clear();
12218 for (unsigned I = 0; I != NumVars; ++I)
12219 Vars.push_back(Record.readSubExpr());
12220 C->setTaskgroupDescriptors(Vars);
12221}
12222
12223void OMPClauseReader::VisitOMPLinearClause(OMPLinearClause *C) {
12224 VisitOMPClauseWithPostUpdate(C);
12225 C->setLParenLoc(Record.readSourceLocation());
12226 C->setColonLoc(Record.readSourceLocation());
12227 C->setModifier(static_cast<OpenMPLinearClauseKind>(Record.readInt()));
12228 C->setModifierLoc(Record.readSourceLocation());
12229 unsigned NumVars = C->varlist_size();
12230 SmallVector<Expr *, 16> Vars;
12231 Vars.reserve(NumVars);
12232 for (unsigned i = 0; i != NumVars; ++i)
12233 Vars.push_back(Record.readSubExpr());
12234 C->setVarRefs(Vars);
12235 Vars.clear();
12236 for (unsigned i = 0; i != NumVars; ++i)
12237 Vars.push_back(Record.readSubExpr());
12238 C->setPrivates(Vars);
12239 Vars.clear();
12240 for (unsigned i = 0; i != NumVars; ++i)
12241 Vars.push_back(Record.readSubExpr());
12242 C->setInits(Vars);
12243 Vars.clear();
12244 for (unsigned i = 0; i != NumVars; ++i)
12245 Vars.push_back(Record.readSubExpr());
12246 C->setUpdates(Vars);
12247 Vars.clear();
12248 for (unsigned i = 0; i != NumVars; ++i)
12249 Vars.push_back(Record.readSubExpr());
12250 C->setFinals(Vars);
12251 C->setStep(Record.readSubExpr());
12252 C->setCalcStep(Record.readSubExpr());
12253}
12254
12255void OMPClauseReader::VisitOMPAlignedClause(OMPAlignedClause *C) {
12256 C->setLParenLoc(Record.readSourceLocation());
12257 C->setColonLoc(Record.readSourceLocation());
12258 unsigned NumVars = C->varlist_size();
12259 SmallVector<Expr *, 16> Vars;
12260 Vars.reserve(NumVars);
12261 for (unsigned i = 0; i != NumVars; ++i)
12262 Vars.push_back(Record.readSubExpr());
12263 C->setVarRefs(Vars);
12264 C->setAlignment(Record.readSubExpr());
12265}
12266
12267void OMPClauseReader::VisitOMPCopyinClause(OMPCopyinClause *C) {
12268 C->setLParenLoc(Record.readSourceLocation());
12269 unsigned NumVars = C->varlist_size();
12270 SmallVector<Expr *, 16> Exprs;
12271 Exprs.reserve(NumVars);
12272 for (unsigned i = 0; i != NumVars; ++i)
12273 Exprs.push_back(Record.readSubExpr());
12274 C->setVarRefs(Exprs);
12275 Exprs.clear();
12276 for (unsigned i = 0; i != NumVars; ++i)
12277 Exprs.push_back(Record.readSubExpr());
12278 C->setSourceExprs(Exprs);
12279 Exprs.clear();
12280 for (unsigned i = 0; i != NumVars; ++i)
12281 Exprs.push_back(Record.readSubExpr());
12282 C->setDestinationExprs(Exprs);
12283 Exprs.clear();
12284 for (unsigned i = 0; i != NumVars; ++i)
12285 Exprs.push_back(Record.readSubExpr());
12286 C->setAssignmentOps(Exprs);
12287}
12288
12289void OMPClauseReader::VisitOMPCopyprivateClause(OMPCopyprivateClause *C) {
12290 C->setLParenLoc(Record.readSourceLocation());
12291 unsigned NumVars = C->varlist_size();
12292 SmallVector<Expr *, 16> Exprs;
12293 Exprs.reserve(NumVars);
12294 for (unsigned i = 0; i != NumVars; ++i)
12295 Exprs.push_back(Record.readSubExpr());
12296 C->setVarRefs(Exprs);
12297 Exprs.clear();
12298 for (unsigned i = 0; i != NumVars; ++i)
12299 Exprs.push_back(Record.readSubExpr());
12300 C->setSourceExprs(Exprs);
12301 Exprs.clear();
12302 for (unsigned i = 0; i != NumVars; ++i)
12303 Exprs.push_back(Record.readSubExpr());
12304 C->setDestinationExprs(Exprs);
12305 Exprs.clear();
12306 for (unsigned i = 0; i != NumVars; ++i)
12307 Exprs.push_back(Record.readSubExpr());
12308 C->setAssignmentOps(Exprs);
12309}
12310
12311void OMPClauseReader::VisitOMPFlushClause(OMPFlushClause *C) {
12312 C->setLParenLoc(Record.readSourceLocation());
12313 unsigned NumVars = C->varlist_size();
12314 SmallVector<Expr *, 16> Vars;
12315 Vars.reserve(NumVars);
12316 for (unsigned i = 0; i != NumVars; ++i)
12317 Vars.push_back(Record.readSubExpr());
12318 C->setVarRefs(Vars);
12319}
12320
12321void OMPClauseReader::VisitOMPDependClause(OMPDependClause *C) {
12322 C->setLParenLoc(Record.readSourceLocation());
12323 C->setDependencyKind(
12324 static_cast<OpenMPDependClauseKind>(Record.readInt()));
12325 C->setDependencyLoc(Record.readSourceLocation());
12326 C->setColonLoc(Record.readSourceLocation());
12327 unsigned NumVars = C->varlist_size();
12328 SmallVector<Expr *, 16> Vars;
12329 Vars.reserve(NumVars);
12330 for (unsigned I = 0; I != NumVars; ++I)
12331 Vars.push_back(Record.readSubExpr());
12332 C->setVarRefs(Vars);
12333 for (unsigned I = 0, E = C->getNumLoops(); I < E; ++I)
12334 C->setLoopData(I, Record.readSubExpr());
12335}
12336
12337void OMPClauseReader::VisitOMPDeviceClause(OMPDeviceClause *C) {
12338 VisitOMPClauseWithPreInit(C);
12339 C->setDevice(Record.readSubExpr());
12340 C->setLParenLoc(Record.readSourceLocation());
12341}
12342
12343void OMPClauseReader::VisitOMPMapClause(OMPMapClause *C) {
12344 C->setLParenLoc(Record.readSourceLocation());
12345 for (unsigned I = 0; I < OMPMapClause::NumberOfModifiers; ++I) {
12346 C->setMapTypeModifier(
12347 I, static_cast<OpenMPMapModifierKind>(Record.readInt()));
12348 C->setMapTypeModifierLoc(I, Record.readSourceLocation());
12349 }
12350 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12351 DeclarationNameInfo DNI;
12352 Record.readDeclarationNameInfo(DNI);
12353 C->setMapperIdInfo(DNI);
12354 C->setMapType(
12355 static_cast<OpenMPMapClauseKind>(Record.readInt()));
12356 C->setMapLoc(Record.readSourceLocation());
12357 C->setColonLoc(Record.readSourceLocation());
12358 auto NumVars = C->varlist_size();
12359 auto UniqueDecls = C->getUniqueDeclarationsNum();
12360 auto TotalLists = C->getTotalComponentListNum();
12361 auto TotalComponents = C->getTotalComponentsNum();
12362
12363 SmallVector<Expr *, 16> Vars;
12364 Vars.reserve(NumVars);
12365 for (unsigned i = 0; i != NumVars; ++i)
12366 Vars.push_back(Record.readExpr());
12367 C->setVarRefs(Vars);
12368
12369 SmallVector<Expr *, 16> UDMappers;
12370 UDMappers.reserve(NumVars);
12371 for (unsigned I = 0; I < NumVars; ++I)
12372 UDMappers.push_back(Record.readExpr());
12373 C->setUDMapperRefs(UDMappers);
12374
12375 SmallVector<ValueDecl *, 16> Decls;
12376 Decls.reserve(UniqueDecls);
12377 for (unsigned i = 0; i < UniqueDecls; ++i)
12378 Decls.push_back(Record.readDeclAs<ValueDecl>());
12379 C->setUniqueDecls(Decls);
12380
12381 SmallVector<unsigned, 16> ListsPerDecl;
12382 ListsPerDecl.reserve(UniqueDecls);
12383 for (unsigned i = 0; i < UniqueDecls; ++i)
12384 ListsPerDecl.push_back(Record.readInt());
12385 C->setDeclNumLists(ListsPerDecl);
12386
12387 SmallVector<unsigned, 32> ListSizes;
12388 ListSizes.reserve(TotalLists);
12389 for (unsigned i = 0; i < TotalLists; ++i)
12390 ListSizes.push_back(Record.readInt());
12391 C->setComponentListSizes(ListSizes);
12392
12393 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12394 Components.reserve(TotalComponents);
12395 for (unsigned i = 0; i < TotalComponents; ++i) {
12396 Expr *AssociatedExpr = Record.readExpr();
12397 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12398 Components.push_back(OMPClauseMappableExprCommon::MappableComponent(
12399 AssociatedExpr, AssociatedDecl));
12400 }
12401 C->setComponents(Components, ListSizes);
12402}
12403
12404void OMPClauseReader::VisitOMPAllocateClause(OMPAllocateClause *C) {
12405 C->setLParenLoc(Record.readSourceLocation());
12406 C->setColonLoc(Record.readSourceLocation());
12407 C->setAllocator(Record.readSubExpr());
12408 unsigned NumVars = C->varlist_size();
12409 SmallVector<Expr *, 16> Vars;
12410 Vars.reserve(NumVars);
12411 for (unsigned i = 0; i != NumVars; ++i)
12412 Vars.push_back(Record.readSubExpr());
12413 C->setVarRefs(Vars);
12414}
12415
12416void OMPClauseReader::VisitOMPNumTeamsClause(OMPNumTeamsClause *C) {
12417 VisitOMPClauseWithPreInit(C);
12418 C->setNumTeams(Record.readSubExpr());
12419 C->setLParenLoc(Record.readSourceLocation());
12420}
12421
12422void OMPClauseReader::VisitOMPThreadLimitClause(OMPThreadLimitClause *C) {
12423 VisitOMPClauseWithPreInit(C);
12424 C->setThreadLimit(Record.readSubExpr());
12425 C->setLParenLoc(Record.readSourceLocation());
12426}
12427
12428void OMPClauseReader::VisitOMPPriorityClause(OMPPriorityClause *C) {
12429 C->setPriority(Record.readSubExpr());
12430 C->setLParenLoc(Record.readSourceLocation());
12431}
12432
12433void OMPClauseReader::VisitOMPGrainsizeClause(OMPGrainsizeClause *C) {
12434 C->setGrainsize(Record.readSubExpr());
12435 C->setLParenLoc(Record.readSourceLocation());
12436}
12437
12438void OMPClauseReader::VisitOMPNumTasksClause(OMPNumTasksClause *C) {
12439 C->setNumTasks(Record.readSubExpr());
12440 C->setLParenLoc(Record.readSourceLocation());
12441}
12442
12443void OMPClauseReader::VisitOMPHintClause(OMPHintClause *C) {
12444 C->setHint(Record.readSubExpr());
12445 C->setLParenLoc(Record.readSourceLocation());
12446}
12447
12448void OMPClauseReader::VisitOMPDistScheduleClause(OMPDistScheduleClause *C) {
12449 VisitOMPClauseWithPreInit(C);
12450 C->setDistScheduleKind(
12451 static_cast<OpenMPDistScheduleClauseKind>(Record.readInt()));
12452 C->setChunkSize(Record.readSubExpr());
12453 C->setLParenLoc(Record.readSourceLocation());
12454 C->setDistScheduleKindLoc(Record.readSourceLocation());
12455 C->setCommaLoc(Record.readSourceLocation());
12456}
12457
12458void OMPClauseReader::VisitOMPDefaultmapClause(OMPDefaultmapClause *C) {
12459 C->setDefaultmapKind(
12460 static_cast<OpenMPDefaultmapClauseKind>(Record.readInt()));
12461 C->setDefaultmapModifier(
12462 static_cast<OpenMPDefaultmapClauseModifier>(Record.readInt()));
12463 C->setLParenLoc(Record.readSourceLocation());
12464 C->setDefaultmapModifierLoc(Record.readSourceLocation());
12465 C->setDefaultmapKindLoc(Record.readSourceLocation());
12466}
12467
12468void OMPClauseReader::VisitOMPToClause(OMPToClause *C) {
12469 C->setLParenLoc(Record.readSourceLocation());
12470 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12471 DeclarationNameInfo DNI;
12472 Record.readDeclarationNameInfo(DNI);
12473 C->setMapperIdInfo(DNI);
12474 auto NumVars = C->varlist_size();
12475 auto UniqueDecls = C->getUniqueDeclarationsNum();
12476 auto TotalLists = C->getTotalComponentListNum();
12477 auto TotalComponents = C->getTotalComponentsNum();
12478
12479 SmallVector<Expr *, 16> Vars;
12480 Vars.reserve(NumVars);
12481 for (unsigned i = 0; i != NumVars; ++i)
12482 Vars.push_back(Record.readSubExpr());
12483 C->setVarRefs(Vars);
12484
12485 SmallVector<Expr *, 16> UDMappers;
12486 UDMappers.reserve(NumVars);
12487 for (unsigned I = 0; I < NumVars; ++I)
12488 UDMappers.push_back(Record.readSubExpr());
12489 C->setUDMapperRefs(UDMappers);
12490
12491 SmallVector<ValueDecl *, 16> Decls;
12492 Decls.reserve(UniqueDecls);
12493 for (unsigned i = 0; i < UniqueDecls; ++i)
12494 Decls.push_back(Record.readDeclAs<ValueDecl>());
12495 C->setUniqueDecls(Decls);
12496
12497 SmallVector<unsigned, 16> ListsPerDecl;
12498 ListsPerDecl.reserve(UniqueDecls);
12499 for (unsigned i = 0; i < UniqueDecls; ++i)
12500 ListsPerDecl.push_back(Record.readInt());
12501 C->setDeclNumLists(ListsPerDecl);
12502
12503 SmallVector<unsigned, 32> ListSizes;
12504 ListSizes.reserve(TotalLists);
12505 for (unsigned i = 0; i < TotalLists; ++i)
12506 ListSizes.push_back(Record.readInt());
12507 C->setComponentListSizes(ListSizes);
12508
12509 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12510 Components.reserve(TotalComponents);
12511 for (unsigned i = 0; i < TotalComponents; ++i) {
12512 Expr *AssociatedExpr = Record.readSubExpr();
12513 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12514 Components.push_back(OMPClauseMappableExprCommon::MappableComponent(
12515 AssociatedExpr, AssociatedDecl));
12516 }
12517 C->setComponents(Components, ListSizes);
12518}
12519
12520void OMPClauseReader::VisitOMPFromClause(OMPFromClause *C) {
12521 C->setLParenLoc(Record.readSourceLocation());
12522 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12523 DeclarationNameInfo DNI;
12524 Record.readDeclarationNameInfo(DNI);
12525 C->setMapperIdInfo(DNI);
12526 auto NumVars = C->varlist_size();
12527 auto UniqueDecls = C->getUniqueDeclarationsNum();
12528 auto TotalLists = C->getTotalComponentListNum();
12529 auto TotalComponents = C->getTotalComponentsNum();
12530
12531 SmallVector<Expr *, 16> Vars;
12532 Vars.reserve(NumVars);
12533 for (unsigned i = 0; i != NumVars; ++i)
12534 Vars.push_back(Record.readSubExpr());
12535 C->setVarRefs(Vars);
12536
12537 SmallVector<Expr *, 16> UDMappers;
12538 UDMappers.reserve(NumVars);
12539 for (unsigned I = 0; I < NumVars; ++I)
12540 UDMappers.push_back(Record.readSubExpr());
12541 C->setUDMapperRefs(UDMappers);
12542
12543 SmallVector<ValueDecl *, 16> Decls;
12544 Decls.reserve(UniqueDecls);
12545 for (unsigned i = 0; i < UniqueDecls; ++i)
12546 Decls.push_back(Record.readDeclAs<ValueDecl>());
12547 C->setUniqueDecls(Decls);
12548
12549 SmallVector<unsigned, 16> ListsPerDecl;
12550 ListsPerDecl.reserve(UniqueDecls);
12551 for (unsigned i = 0; i < UniqueDecls; ++i)
12552 ListsPerDecl.push_back(Record.readInt());
12553 C->setDeclNumLists(ListsPerDecl);
12554
12555 SmallVector<unsigned, 32> ListSizes;
12556 ListSizes.reserve(TotalLists);
12557 for (unsigned i = 0; i < TotalLists; ++i)
12558 ListSizes.push_back(Record.readInt());
12559 C->setComponentListSizes(ListSizes);
12560
12561 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12562 Components.reserve(TotalComponents);
12563 for (unsigned i = 0; i < TotalComponents; ++i) {
12564 Expr *AssociatedExpr = Record.readSubExpr();
12565 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12566 Components.push_back(OMPClauseMappableExprCommon::MappableComponent(
12567 AssociatedExpr, AssociatedDecl));
12568 }
12569 C->setComponents(Components, ListSizes);
12570}
12571
12572void OMPClauseReader::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *C) {
12573 C->setLParenLoc(Record.readSourceLocation());
12574 auto NumVars = C->varlist_size();
12575 auto UniqueDecls = C->getUniqueDeclarationsNum();
12576 auto TotalLists = C->getTotalComponentListNum();
12577 auto TotalComponents = C->getTotalComponentsNum();
12578
12579 SmallVector<Expr *, 16> Vars;
12580 Vars.reserve(NumVars);
12581 for (unsigned i = 0; i != NumVars; ++i)
12582 Vars.push_back(Record.readSubExpr());
12583 C->setVarRefs(Vars);
12584 Vars.clear();
12585 for (unsigned i = 0; i != NumVars; ++i)
12586 Vars.push_back(Record.readSubExpr());
12587 C->setPrivateCopies(Vars);
12588 Vars.clear();
12589 for (unsigned i = 0; i != NumVars; ++i)
12590 Vars.push_back(Record.readSubExpr());
12591 C->setInits(Vars);
12592
12593 SmallVector<ValueDecl *, 16> Decls;
12594 Decls.reserve(UniqueDecls);
12595 for (unsigned i = 0; i < UniqueDecls; ++i)
12596 Decls.push_back(Record.readDeclAs<ValueDecl>());
12597 C->setUniqueDecls(Decls);
12598
12599 SmallVector<unsigned, 16> ListsPerDecl;
12600 ListsPerDecl.reserve(UniqueDecls);
12601 for (unsigned i = 0; i < UniqueDecls; ++i)
12602 ListsPerDecl.push_back(Record.readInt());
12603 C->setDeclNumLists(ListsPerDecl);
12604
12605 SmallVector<unsigned, 32> ListSizes;
12606 ListSizes.reserve(TotalLists);
12607 for (unsigned i = 0; i < TotalLists; ++i)
12608 ListSizes.push_back(Record.readInt());
12609 C->setComponentListSizes(ListSizes);
12610
12611 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12612 Components.reserve(TotalComponents);
12613 for (unsigned i = 0; i < TotalComponents; ++i) {
12614 Expr *AssociatedExpr = Record.readSubExpr();
12615 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12616 Components.push_back(OMPClauseMappableExprCommon::MappableComponent(
12617 AssociatedExpr, AssociatedDecl));
12618 }
12619 C->setComponents(Components, ListSizes);
12620}
12621
12622void OMPClauseReader::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
12623 C->setLParenLoc(Record.readSourceLocation());
12624 auto NumVars = C->varlist_size();
12625 auto UniqueDecls = C->getUniqueDeclarationsNum();
12626 auto TotalLists = C->getTotalComponentListNum();
12627 auto TotalComponents = C->getTotalComponentsNum();
12628
12629 SmallVector<Expr *, 16> Vars;
12630 Vars.reserve(NumVars);
12631 for (unsigned i = 0; i != NumVars; ++i)
12632 Vars.push_back(Record.readSubExpr());
12633 C->setVarRefs(Vars);
12634 Vars.clear();
12635
12636 SmallVector<ValueDecl *, 16> Decls;
12637 Decls.reserve(UniqueDecls);
12638 for (unsigned i = 0; i < UniqueDecls; ++i)
12639 Decls.push_back(Record.readDeclAs<ValueDecl>());
12640 C->setUniqueDecls(Decls);
12641
12642 SmallVector<unsigned, 16> ListsPerDecl;
12643 ListsPerDecl.reserve(UniqueDecls);
12644 for (unsigned i = 0; i < UniqueDecls; ++i)
12645 ListsPerDecl.push_back(Record.readInt());
12646 C->setDeclNumLists(ListsPerDecl);
12647
12648 SmallVector<unsigned, 32> ListSizes;
12649 ListSizes.reserve(TotalLists);
12650 for (unsigned i = 0; i < TotalLists; ++i)
12651 ListSizes.push_back(Record.readInt());
12652 C->setComponentListSizes(ListSizes);
12653
12654 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12655 Components.reserve(TotalComponents);
12656 for (unsigned i = 0; i < TotalComponents; ++i) {
12657 Expr *AssociatedExpr = Record.readSubExpr();
12658 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12659 Components.push_back(OMPClauseMappableExprCommon::MappableComponent(
12660 AssociatedExpr, AssociatedDecl));
12661 }
12662 C->setComponents(Components, ListSizes);
12663}

/build/llvm-toolchain-snapshot-9~svn360825/tools/clang/lib/Serialization/MultiOnDiskHashTable.h

1//===- MultiOnDiskHashTable.h - Merged set of hash tables -------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file provides a hash table data structure suitable for incremental and
10// distributed storage across a set of files.
11//
12// Multiple hash tables from different files are implicitly merged to improve
13// performance, and on reload the merged table will override those from other
14// files.
15//
16//===----------------------------------------------------------------------===//
17
18#ifndef LLVM_CLANG_LIB_SERIALIZATION_MULTIONDISKHASHTABLE_H
19#define LLVM_CLANG_LIB_SERIALIZATION_MULTIONDISKHASHTABLE_H
20
21#include "llvm/ADT/DenseMap.h"
22#include "llvm/ADT/DenseSet.h"
23#include "llvm/ADT/PointerUnion.h"
24#include "llvm/ADT/STLExtras.h"
25#include "llvm/ADT/SmallVector.h"
26#include "llvm/ADT/TinyPtrVector.h"
27#include "llvm/ADT/iterator_range.h"
28#include "llvm/Support/Endian.h"
29#include "llvm/Support/EndianStream.h"
30#include "llvm/Support/OnDiskHashTable.h"
31#include "llvm/Support/raw_ostream.h"
32#include <algorithm>
33#include <cstdint>
34#include <vector>
35
36namespace clang {
37namespace serialization {
38
39/// A collection of on-disk hash tables, merged when relevant for performance.
40template<typename Info> class MultiOnDiskHashTable {
41public:
42 /// A handle to a file, used when overriding tables.
43 using file_type = typename Info::file_type;
44
45 /// A pointer to an on-disk representation of the hash table.
46 using storage_type = const unsigned char *;
47
48 using external_key_type = typename Info::external_key_type;
49 using internal_key_type = typename Info::internal_key_type;
50 using data_type = typename Info::data_type;
51 using data_type_builder = typename Info::data_type_builder;
52 using hash_value_type = unsigned;
53
54private:
55 /// The generator is permitted to read our merged table.
56 template<typename ReaderInfo, typename WriterInfo>
57 friend class MultiOnDiskHashTableGenerator;
58
59 /// A hash table stored on disk.
60 struct OnDiskTable {
61 using HashTable = llvm::OnDiskIterableChainedHashTable<Info>;
62
63 file_type File;
64 HashTable Table;
65
66 OnDiskTable(file_type File, unsigned NumBuckets, unsigned NumEntries,
67 storage_type Buckets, storage_type Payload, storage_type Base,
68 const Info &InfoObj)
69 : File(File),
70 Table(NumBuckets, NumEntries, Buckets, Payload, Base, InfoObj) {}
71 };
72
73 struct MergedTable {
74 std::vector<file_type> Files;
75 llvm::DenseMap<internal_key_type, data_type> Data;
76 };
77
78 using Table = llvm::PointerUnion<OnDiskTable *, MergedTable *>;
79 using TableVector = llvm::TinyPtrVector<void *>;
80
81 /// The current set of on-disk and merged tables.
82 /// We manually store the opaque value of the Table because TinyPtrVector
83 /// can't cope with holding a PointerUnion directly.
84 /// There can be at most one MergedTable in this vector, and if present,
85 /// it is the first table.
86 TableVector Tables;
87
88 /// Files corresponding to overridden tables that we've not yet
89 /// discarded.
90 llvm::TinyPtrVector<file_type> PendingOverrides;
91
92 struct AsOnDiskTable {
93 using result_type = OnDiskTable *;
94
95 result_type operator()(void *P) const {
96 return Table::getFromOpaqueValue(P).template get<OnDiskTable *>();
97 }
98 };
99
100 using table_iterator =
101 llvm::mapped_iterator<TableVector::iterator, AsOnDiskTable>;
102 using table_range = llvm::iterator_range<table_iterator>;
103
104 /// The current set of on-disk tables.
105 table_range tables() {
106 auto Begin = Tables.begin(), End = Tables.end();
107 if (getMergedTable())
108 ++Begin;
109 return llvm::make_range(llvm::map_iterator(Begin, AsOnDiskTable()),
110 llvm::map_iterator(End, AsOnDiskTable()));
111 }
112
113 MergedTable *getMergedTable() const {
114 // If we already have a merged table, it's the first one.
115 return Tables.empty() ? nullptr : Table::getFromOpaqueValue(*Tables.begin())
116 .template dyn_cast<MergedTable*>();
117 }
118
119 /// Delete all our current on-disk tables.
120 void clear() {
121 for (auto *T : tables())
122 delete T;
123 if (auto *M = getMergedTable())
124 delete M;
125 Tables.clear();
126 }
127
128 void removeOverriddenTables() {
129 llvm::DenseSet<file_type> Files;
130 Files.insert(PendingOverrides.begin(), PendingOverrides.end());
131 // Explicitly capture Files to work around an MSVC 2015 rejects-valid bug.
132 auto ShouldRemove = [&Files](void *T) -> bool {
133 auto *ODT = Table::getFromOpaqueValue(T).template get<OnDiskTable *>();
134 bool Remove = Files.count(ODT->File);
135 if (Remove)
136 delete ODT;
137 return Remove;
138 };
139 Tables.erase(std::remove_if(tables().begin().getCurrent(), Tables.end(),
140 ShouldRemove),
141 Tables.end());
142 PendingOverrides.clear();
143 }
144
145 void condense() {
146 MergedTable *Merged = getMergedTable();
147 if (!Merged)
13
Taking true branch
148 Merged = new MergedTable;
14
Memory is allocated
149
150 // Read in all the tables and merge them together.
151 // FIXME: Be smarter about which tables we merge.
152 for (auto *ODT : tables()) {
153 auto &HT = ODT->Table;
154 Info &InfoObj = HT.getInfoObj();
155
156 for (auto I = HT.data_begin(), E = HT.data_end(); I != E; ++I) {
157 auto *LocalPtr = I.getItem();
158
159 // FIXME: Don't rely on the OnDiskHashTable format here.
160 auto L = InfoObj.ReadKeyDataLength(LocalPtr);
161 const internal_key_type &Key = InfoObj.ReadKey(LocalPtr, L.first);
162 data_type_builder ValueBuilder(Merged->Data[Key]);
163 InfoObj.ReadDataInto(Key, LocalPtr + L.first, L.second,
164 ValueBuilder);
165 }
166
167 Merged->Files.push_back(ODT->File);
168 delete ODT;
169 }
170
171 Tables.clear();
172 Tables.push_back(Table(Merged).getOpaqueValue());
15
Potential leak of memory pointed to by 'Merged'
173 }
174
175public:
176 MultiOnDiskHashTable() = default;
177
178 MultiOnDiskHashTable(MultiOnDiskHashTable &&O)
179 : Tables(std::move(O.Tables)),
180 PendingOverrides(std::move(O.PendingOverrides)) {
181 O.Tables.clear();
182 }
183
184 MultiOnDiskHashTable &operator=(MultiOnDiskHashTable &&O) {
185 if (&O == this)
186 return *this;
187 clear();
188 Tables = std::move(O.Tables);
189 O.Tables.clear();
190 PendingOverrides = std::move(O.PendingOverrides);
191 return *this;
192 }
193
194 ~MultiOnDiskHashTable() { clear(); }
195
196 /// Add the table \p Data loaded from file \p File.
197 void add(file_type File, storage_type Data, Info InfoObj = Info()) {
198 using namespace llvm::support;
199
200 storage_type Ptr = Data;
201
202 uint32_t BucketOffset = endian::readNext<uint32_t, little, unaligned>(Ptr);
203
204 // Read the list of overridden files.
205 uint32_t NumFiles = endian::readNext<uint32_t, little, unaligned>(Ptr);
206 // FIXME: Add a reserve() to TinyPtrVector so that we don't need to make
207 // an additional copy.
208 llvm::SmallVector<file_type, 16> OverriddenFiles;
209 OverriddenFiles.reserve(NumFiles);
210 for (/**/; NumFiles != 0; --NumFiles)
211 OverriddenFiles.push_back(InfoObj.ReadFileRef(Ptr));
212 PendingOverrides.insert(PendingOverrides.end(), OverriddenFiles.begin(),
213 OverriddenFiles.end());
214
215 // Read the OnDiskChainedHashTable header.
216 storage_type Buckets = Data + BucketOffset;
217 auto NumBucketsAndEntries =
218 OnDiskTable::HashTable::readNumBucketsAndEntries(Buckets);
219
220 // Register the table.
221 Table NewTable = new OnDiskTable(File, NumBucketsAndEntries.first,
222 NumBucketsAndEntries.second,
223 Buckets, Ptr, Data, std::move(InfoObj));
224 Tables.push_back(NewTable.getOpaqueValue());
225 }
226
227 /// Find and read the lookup results for \p EKey.
228 data_type find(const external_key_type &EKey) {
229 data_type Result;
230
231 if (!PendingOverrides.empty())
8
Assuming the condition is false
9
Taking false branch
232 removeOverriddenTables();
233
234 if (Tables.size() > static_cast<unsigned>(Info::MaxTables))
10
Assuming the condition is true
11
Taking true branch
235 condense();
12
Calling 'MultiOnDiskHashTable::condense'
236
237 internal_key_type Key = Info::GetInternalKey(EKey);
238 auto KeyHash = Info::ComputeHash(Key);
239
240 if (MergedTable *M = getMergedTable()) {
241 auto It = M->Data.find(Key);
242 if (It != M->Data.end())
243 Result = It->second;
244 }
245
246 data_type_builder ResultBuilder(Result);
247
248 for (auto *ODT : tables()) {
249 auto &HT = ODT->Table;
250 auto It = HT.find_hashed(Key, KeyHash);
251 if (It != HT.end())
252 HT.getInfoObj().ReadDataInto(Key, It.getDataPtr(), It.getDataLen(),
253 ResultBuilder);
254 }
255
256 return Result;
257 }
258
259 /// Read all the lookup results into a single value. This only makes
260 /// sense if merging values across keys is meaningful.
261 data_type findAll() {
262 data_type Result;
263 data_type_builder ResultBuilder(Result);
264
265 if (!PendingOverrides.empty())
266 removeOverriddenTables();
267
268 if (MergedTable *M = getMergedTable()) {
269 for (auto &KV : M->Data)
270 Info::MergeDataInto(KV.second, ResultBuilder);
271 }
272
273 for (auto *ODT : tables()) {
274 auto &HT = ODT->Table;
275 Info &InfoObj = HT.getInfoObj();
276 for (auto I = HT.data_begin(), E = HT.data_end(); I != E; ++I) {
277 auto *LocalPtr = I.getItem();
278
279 // FIXME: Don't rely on the OnDiskHashTable format here.
280 auto L = InfoObj.ReadKeyDataLength(LocalPtr);
281 const internal_key_type &Key = InfoObj.ReadKey(LocalPtr, L.first);
282 InfoObj.ReadDataInto(Key, LocalPtr + L.first, L.second, ResultBuilder);
283 }
284 }
285
286 return Result;
287 }
288};
289
290/// Writer for the on-disk hash table.
291template<typename ReaderInfo, typename WriterInfo>
292class MultiOnDiskHashTableGenerator {
293 using BaseTable = MultiOnDiskHashTable<ReaderInfo>;
294 using Generator = llvm::OnDiskChainedHashTableGenerator<WriterInfo>;
295
296 Generator Gen;
297
298public:
299 MultiOnDiskHashTableGenerator() : Gen() {}
300
301 void insert(typename WriterInfo::key_type_ref Key,
302 typename WriterInfo::data_type_ref Data, WriterInfo &Info) {
303 Gen.insert(Key, Data, Info);
304 }
305
306 void emit(llvm::SmallVectorImpl<char> &Out, WriterInfo &Info,
307 const BaseTable *Base) {
308 using namespace llvm::support;
309
310 llvm::raw_svector_ostream OutStream(Out);
311
312 // Write our header information.
313 {
314 endian::Writer Writer(OutStream, little);
315
316 // Reserve four bytes for the bucket offset.
317 Writer.write<uint32_t>(0);
318
319 if (auto *Merged = Base ? Base->getMergedTable() : nullptr) {
320 // Write list of overridden files.
321 Writer.write<uint32_t>(Merged->Files.size());
322 for (const auto &F : Merged->Files)
323 Info.EmitFileRef(OutStream, F);
324
325 // Add all merged entries from Base to the generator.
326 for (auto &KV : Merged->Data) {
327 if (!Gen.contains(KV.first, Info))
328 Gen.insert(KV.first, Info.ImportData(KV.second), Info);
329 }
330 } else {
331 Writer.write<uint32_t>(0);
332 }
333 }
334
335 // Write the table itself.
336 uint32_t BucketOffset = Gen.Emit(OutStream, Info);
337
338 // Replace the first four bytes with the bucket offset.
339 endian::write32le(Out.data(), BucketOffset);
340 }
341};
342
343} // namespace serialization
344} // namespace clang
345
346#endif // LLVM_CLANG_LIB_SERIALIZATION_MULTIONDISKHASHTABLE_H