Bug Summary

File:tools/clang/lib/Serialization/ASTReader.cpp
Warning:line 1049, column 18
Called C++ object pointer is null

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-eagerly-assume -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=cplusplus -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -mrelocation-model pic -pic-level 2 -mthread-model posix -relaxed-aliasing -fmath-errno -masm-verbose -mconstructor-aliases -munwind-tables -fuse-init-array -target-cpu x86-64 -dwarf-column-info -debugger-tuning=gdb -momit-leaf-frame-pointer -ffunction-sections -fdata-sections -resource-dir /usr/lib/llvm-7/lib/clang/7.0.0 -D _DEBUG -D _GNU_SOURCE -D __STDC_CONSTANT_MACROS -D __STDC_FORMAT_MACROS -D __STDC_LIMIT_MACROS -I /build/llvm-toolchain-snapshot-7~svn329677/build-llvm/tools/clang/lib/Serialization -I /build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization -I /build/llvm-toolchain-snapshot-7~svn329677/tools/clang/include -I /build/llvm-toolchain-snapshot-7~svn329677/build-llvm/tools/clang/include -I /build/llvm-toolchain-snapshot-7~svn329677/build-llvm/include -I /build/llvm-toolchain-snapshot-7~svn329677/include -U NDEBUG -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/7.3.0/../../../../include/c++/7.3.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/7.3.0/../../../../include/x86_64-linux-gnu/c++/7.3.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/7.3.0/../../../../include/x86_64-linux-gnu/c++/7.3.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/7.3.0/../../../../include/c++/7.3.0/backward -internal-isystem /usr/include/clang/7.0.0/include/ -internal-isystem /usr/local/include -internal-isystem /usr/lib/llvm-7/lib/clang/7.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-7~svn329677/build-llvm/tools/clang/lib/Serialization -ferror-limit 19 -fmessage-length 0 -fvisibility-inlines-hidden -fobjc-runtime=gcc -fno-common -fdiagnostics-show-option -vectorize-loops -vectorize-slp -analyzer-checker optin.performance.Padding -analyzer-output=html -analyzer-config stable-report-filename=true -o /tmp/scan-build-2018-04-11-031539-24776-1 -x c++ /build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp

/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp

1//===- ASTReader.cpp - AST File Reader ------------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines the ASTReader class, which reads AST files.
11//
12//===----------------------------------------------------------------------===//
13
14#include "clang/Serialization/ASTReader.h"
15#include "ASTCommon.h"
16#include "ASTReaderInternals.h"
17#include "clang/AST/ASTConsumer.h"
18#include "clang/AST/ASTContext.h"
19#include "clang/AST/ASTMutationListener.h"
20#include "clang/AST/ASTUnresolvedSet.h"
21#include "clang/AST/Decl.h"
22#include "clang/AST/DeclBase.h"
23#include "clang/AST/DeclCXX.h"
24#include "clang/AST/DeclFriend.h"
25#include "clang/AST/DeclGroup.h"
26#include "clang/AST/DeclObjC.h"
27#include "clang/AST/DeclTemplate.h"
28#include "clang/AST/DeclarationName.h"
29#include "clang/AST/Expr.h"
30#include "clang/AST/ExprCXX.h"
31#include "clang/AST/ExternalASTSource.h"
32#include "clang/AST/NestedNameSpecifier.h"
33#include "clang/AST/ODRHash.h"
34#include "clang/AST/RawCommentList.h"
35#include "clang/AST/TemplateBase.h"
36#include "clang/AST/TemplateName.h"
37#include "clang/AST/Type.h"
38#include "clang/AST/TypeLoc.h"
39#include "clang/AST/TypeLocVisitor.h"
40#include "clang/AST/UnresolvedSet.h"
41#include "clang/Basic/CommentOptions.h"
42#include "clang/Basic/Diagnostic.h"
43#include "clang/Basic/DiagnosticOptions.h"
44#include "clang/Basic/ExceptionSpecificationType.h"
45#include "clang/Basic/FileManager.h"
46#include "clang/Basic/FileSystemOptions.h"
47#include "clang/Basic/IdentifierTable.h"
48#include "clang/Basic/LLVM.h"
49#include "clang/Basic/LangOptions.h"
50#include "clang/Basic/MemoryBufferCache.h"
51#include "clang/Basic/Module.h"
52#include "clang/Basic/ObjCRuntime.h"
53#include "clang/Basic/OperatorKinds.h"
54#include "clang/Basic/PragmaKinds.h"
55#include "clang/Basic/Sanitizers.h"
56#include "clang/Basic/SourceLocation.h"
57#include "clang/Basic/SourceManager.h"
58#include "clang/Basic/SourceManagerInternals.h"
59#include "clang/Basic/Specifiers.h"
60#include "clang/Basic/TargetInfo.h"
61#include "clang/Basic/TargetOptions.h"
62#include "clang/Basic/TokenKinds.h"
63#include "clang/Basic/Version.h"
64#include "clang/Basic/VersionTuple.h"
65#include "clang/Frontend/PCHContainerOperations.h"
66#include "clang/Lex/HeaderSearch.h"
67#include "clang/Lex/HeaderSearchOptions.h"
68#include "clang/Lex/MacroInfo.h"
69#include "clang/Lex/ModuleMap.h"
70#include "clang/Lex/PreprocessingRecord.h"
71#include "clang/Lex/Preprocessor.h"
72#include "clang/Lex/PreprocessorOptions.h"
73#include "clang/Lex/Token.h"
74#include "clang/Sema/ObjCMethodList.h"
75#include "clang/Sema/Scope.h"
76#include "clang/Sema/Sema.h"
77#include "clang/Sema/Weak.h"
78#include "clang/Serialization/ASTBitCodes.h"
79#include "clang/Serialization/ASTDeserializationListener.h"
80#include "clang/Serialization/ContinuousRangeMap.h"
81#include "clang/Serialization/GlobalModuleIndex.h"
82#include "clang/Serialization/Module.h"
83#include "clang/Serialization/ModuleFileExtension.h"
84#include "clang/Serialization/ModuleManager.h"
85#include "clang/Serialization/SerializationDiagnostic.h"
86#include "llvm/ADT/APFloat.h"
87#include "llvm/ADT/APInt.h"
88#include "llvm/ADT/APSInt.h"
89#include "llvm/ADT/ArrayRef.h"
90#include "llvm/ADT/DenseMap.h"
91#include "llvm/ADT/FoldingSet.h"
92#include "llvm/ADT/Hashing.h"
93#include "llvm/ADT/IntrusiveRefCntPtr.h"
94#include "llvm/ADT/None.h"
95#include "llvm/ADT/Optional.h"
96#include "llvm/ADT/STLExtras.h"
97#include "llvm/ADT/SmallPtrSet.h"
98#include "llvm/ADT/SmallString.h"
99#include "llvm/ADT/SmallVector.h"
100#include "llvm/ADT/StringExtras.h"
101#include "llvm/ADT/StringMap.h"
102#include "llvm/ADT/StringRef.h"
103#include "llvm/ADT/Triple.h"
104#include "llvm/ADT/iterator_range.h"
105#include "llvm/Bitcode/BitstreamReader.h"
106#include "llvm/Support/Casting.h"
107#include "llvm/Support/Compression.h"
108#include "llvm/Support/Compiler.h"
109#include "llvm/Support/DJB.h"
110#include "llvm/Support/Endian.h"
111#include "llvm/Support/Error.h"
112#include "llvm/Support/ErrorHandling.h"
113#include "llvm/Support/FileSystem.h"
114#include "llvm/Support/MemoryBuffer.h"
115#include "llvm/Support/Path.h"
116#include "llvm/Support/SaveAndRestore.h"
117#include "llvm/Support/Timer.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/// \brief 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/// \brief 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.begin(), ExistingFeatures.end());
400 llvm::sort(ReadFeatures.begin(), ReadFeatures.end());
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")(static_cast <bool> (!ModuleName.empty() && "diagnostic options read before module name"
) ? void (0) : __assert_fail ("!ModuleName.empty() && \"diagnostic options read before module name\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 548, __extension__ __PRETTY_FUNCTION__))
;
549
550 Module *M = PP.getHeaderSearchInfo().lookupModule(ModuleName);
551 assert(M && "missing module")(static_cast <bool> (M && "missing module") ? void
(0) : __assert_fail ("M && \"missing module\"", "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 551, __extension__ __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")(static_cast <bool> (ModuleMgr.size() >= 1 &&
"what ASTFile is this then") ? void (0) : __assert_fail ("ModuleMgr.size() >= 1 && \"what ASTFile is this then\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 566, __extension__ __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/// \brief 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/// \brief 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 if (File == ExistingPPOpts.ImplicitPCHInclude)
708 continue;
709
710 if (std::find(PPOpts.Includes.begin(), PPOpts.Includes.end(), File)
711 != PPOpts.Includes.end())
712 continue;
713
714 SuggestedPredefines += "#include \"";
715 SuggestedPredefines += File;
716 SuggestedPredefines += "\"\n";
717 }
718
719 for (unsigned I = 0, N = ExistingPPOpts.MacroIncludes.size(); I != N; ++I) {
720 StringRef File = ExistingPPOpts.MacroIncludes[I];
721 if (std::find(PPOpts.MacroIncludes.begin(), PPOpts.MacroIncludes.end(),
722 File)
723 != PPOpts.MacroIncludes.end())
724 continue;
725
726 SuggestedPredefines += "#__include_macros \"";
727 SuggestedPredefines += File;
728 SuggestedPredefines += "\"\n##\n";
729 }
730
731 return false;
732}
733
734bool PCHValidator::ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
735 bool Complain,
736 std::string &SuggestedPredefines) {
737 const PreprocessorOptions &ExistingPPOpts = PP.getPreprocessorOpts();
738
739 return checkPreprocessorOptions(PPOpts, ExistingPPOpts,
740 Complain? &Reader.Diags : nullptr,
741 PP.getFileManager(),
742 SuggestedPredefines,
743 PP.getLangOpts());
744}
745
746bool SimpleASTReaderListener::ReadPreprocessorOptions(
747 const PreprocessorOptions &PPOpts,
748 bool Complain,
749 std::string &SuggestedPredefines) {
750 return checkPreprocessorOptions(PPOpts,
751 PP.getPreprocessorOpts(),
752 nullptr,
753 PP.getFileManager(),
754 SuggestedPredefines,
755 PP.getLangOpts(),
756 false);
757}
758
759/// Check the header search options deserialized from the control block
760/// against the header search options in an existing preprocessor.
761///
762/// \param Diags If non-null, produce diagnostics for any mismatches incurred.
763static bool checkHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
764 StringRef SpecificModuleCachePath,
765 StringRef ExistingModuleCachePath,
766 DiagnosticsEngine *Diags,
767 const LangOptions &LangOpts) {
768 if (LangOpts.Modules) {
769 if (SpecificModuleCachePath != ExistingModuleCachePath) {
770 if (Diags)
771 Diags->Report(diag::err_pch_modulecache_mismatch)
772 << SpecificModuleCachePath << ExistingModuleCachePath;
773 return true;
774 }
775 }
776
777 return false;
778}
779
780bool PCHValidator::ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
781 StringRef SpecificModuleCachePath,
782 bool Complain) {
783 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
784 PP.getHeaderSearchInfo().getModuleCachePath(),
785 Complain ? &Reader.Diags : nullptr,
786 PP.getLangOpts());
787}
788
789void PCHValidator::ReadCounter(const ModuleFile &M, unsigned Value) {
790 PP.setCounterValue(Value);
791}
792
793//===----------------------------------------------------------------------===//
794// AST reader implementation
795//===----------------------------------------------------------------------===//
796
797void ASTReader::setDeserializationListener(ASTDeserializationListener *Listener,
798 bool TakeOwnership) {
799 DeserializationListener = Listener;
800 OwnsDeserializationListener = TakeOwnership;
801}
802
803unsigned ASTSelectorLookupTrait::ComputeHash(Selector Sel) {
804 return serialization::ComputeHash(Sel);
805}
806
807std::pair<unsigned, unsigned>
808ASTSelectorLookupTrait::ReadKeyDataLength(const unsigned char*& d) {
809 using namespace llvm::support;
810
811 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
812 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
813 return std::make_pair(KeyLen, DataLen);
814}
815
816ASTSelectorLookupTrait::internal_key_type
817ASTSelectorLookupTrait::ReadKey(const unsigned char* d, unsigned) {
818 using namespace llvm::support;
819
820 SelectorTable &SelTable = Reader.getContext().Selectors;
821 unsigned N = endian::readNext<uint16_t, little, unaligned>(d);
822 IdentifierInfo *FirstII = Reader.getLocalIdentifier(
823 F, endian::readNext<uint32_t, little, unaligned>(d));
824 if (N == 0)
825 return SelTable.getNullarySelector(FirstII);
826 else if (N == 1)
827 return SelTable.getUnarySelector(FirstII);
828
829 SmallVector<IdentifierInfo *, 16> Args;
830 Args.push_back(FirstII);
831 for (unsigned I = 1; I != N; ++I)
832 Args.push_back(Reader.getLocalIdentifier(
833 F, endian::readNext<uint32_t, little, unaligned>(d)));
834
835 return SelTable.getSelector(N, Args.data());
836}
837
838ASTSelectorLookupTrait::data_type
839ASTSelectorLookupTrait::ReadData(Selector, const unsigned char* d,
840 unsigned DataLen) {
841 using namespace llvm::support;
842
843 data_type Result;
844
845 Result.ID = Reader.getGlobalSelectorID(
846 F, endian::readNext<uint32_t, little, unaligned>(d));
847 unsigned FullInstanceBits = endian::readNext<uint16_t, little, unaligned>(d);
848 unsigned FullFactoryBits = endian::readNext<uint16_t, little, unaligned>(d);
849 Result.InstanceBits = FullInstanceBits & 0x3;
850 Result.InstanceHasMoreThanOneDecl = (FullInstanceBits >> 2) & 0x1;
851 Result.FactoryBits = FullFactoryBits & 0x3;
852 Result.FactoryHasMoreThanOneDecl = (FullFactoryBits >> 2) & 0x1;
853 unsigned NumInstanceMethods = FullInstanceBits >> 3;
854 unsigned NumFactoryMethods = FullFactoryBits >> 3;
855
856 // Load instance methods
857 for (unsigned I = 0; I != NumInstanceMethods; ++I) {
858 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
859 F, endian::readNext<uint32_t, little, unaligned>(d)))
860 Result.Instance.push_back(Method);
861 }
862
863 // Load factory methods
864 for (unsigned I = 0; I != NumFactoryMethods; ++I) {
865 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
866 F, endian::readNext<uint32_t, little, unaligned>(d)))
867 Result.Factory.push_back(Method);
868 }
869
870 return Result;
871}
872
873unsigned ASTIdentifierLookupTraitBase::ComputeHash(const internal_key_type& a) {
874 return llvm::djbHash(a);
875}
876
877std::pair<unsigned, unsigned>
878ASTIdentifierLookupTraitBase::ReadKeyDataLength(const unsigned char*& d) {
879 using namespace llvm::support;
880
881 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
882 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
883 return std::make_pair(KeyLen, DataLen);
884}
885
886ASTIdentifierLookupTraitBase::internal_key_type
887ASTIdentifierLookupTraitBase::ReadKey(const unsigned char* d, unsigned n) {
888 assert(n >= 2 && d[n-1] == '\0')(static_cast <bool> (n >= 2 && d[n-1] == '\0'
) ? void (0) : __assert_fail ("n >= 2 && d[n-1] == '\\0'"
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 888, __extension__ __PRETTY_FUNCTION__))
;
889 return StringRef((const char*) d, n-1);
890}
891
892/// \brief Whether the given identifier is "interesting".
893static bool isInterestingIdentifier(ASTReader &Reader, IdentifierInfo &II,
894 bool IsModule) {
895 return II.hadMacroDefinition() ||
896 II.isPoisoned() ||
897 (IsModule ? II.hasRevertedBuiltin() : II.getObjCOrBuiltinID()) ||
898 II.hasRevertedTokenIDToIdentifier() ||
899 (!(IsModule && Reader.getPreprocessor().getLangOpts().CPlusPlus) &&
900 II.getFETokenInfo<void>());
901}
902
903static bool readBit(unsigned &Bits) {
904 bool Value = Bits & 0x1;
905 Bits >>= 1;
906 return Value;
907}
908
909IdentID ASTIdentifierLookupTrait::ReadIdentifierID(const unsigned char *d) {
910 using namespace llvm::support;
911
912 unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d);
913 return Reader.getGlobalIdentifierID(F, RawID >> 1);
914}
915
916static void markIdentifierFromAST(ASTReader &Reader, IdentifierInfo &II) {
917 if (!II.isFromAST()) {
918 II.setIsFromAST();
919 bool IsModule = Reader.getPreprocessor().getCurrentModule() != nullptr;
920 if (isInterestingIdentifier(Reader, II, IsModule))
921 II.setChangedSinceDeserialization();
922 }
923}
924
925IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k,
926 const unsigned char* d,
927 unsigned DataLen) {
928 using namespace llvm::support;
929
930 unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d);
931 bool IsInteresting = RawID & 0x01;
932
933 // Wipe out the "is interesting" bit.
934 RawID = RawID >> 1;
935
936 // Build the IdentifierInfo and link the identifier ID with it.
937 IdentifierInfo *II = KnownII;
938 if (!II) {
939 II = &Reader.getIdentifierTable().getOwn(k);
940 KnownII = II;
941 }
942 markIdentifierFromAST(Reader, *II);
943 Reader.markIdentifierUpToDate(II);
944
945 IdentID ID = Reader.getGlobalIdentifierID(F, RawID);
946 if (!IsInteresting) {
947 // For uninteresting identifiers, there's nothing else to do. Just notify
948 // the reader that we've finished loading this identifier.
949 Reader.SetIdentifierInfo(ID, II);
950 return II;
951 }
952
953 unsigned ObjCOrBuiltinID = endian::readNext<uint16_t, little, unaligned>(d);
954 unsigned Bits = endian::readNext<uint16_t, little, unaligned>(d);
955 bool CPlusPlusOperatorKeyword = readBit(Bits);
956 bool HasRevertedTokenIDToIdentifier = readBit(Bits);
957 bool HasRevertedBuiltin = readBit(Bits);
958 bool Poisoned = readBit(Bits);
959 bool ExtensionToken = readBit(Bits);
960 bool HadMacroDefinition = readBit(Bits);
961
962 assert(Bits == 0 && "Extra bits in the identifier?")(static_cast <bool> (Bits == 0 && "Extra bits in the identifier?"
) ? void (0) : __assert_fail ("Bits == 0 && \"Extra bits in the identifier?\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 962, __extension__ __PRETTY_FUNCTION__))
;
963 DataLen -= 8;
964
965 // Set or check the various bits in the IdentifierInfo structure.
966 // Token IDs are read-only.
967 if (HasRevertedTokenIDToIdentifier && II->getTokenID() != tok::identifier)
968 II->revertTokenIDToIdentifier();
969 if (!F.isModule())
970 II->setObjCOrBuiltinID(ObjCOrBuiltinID);
971 else if (HasRevertedBuiltin && II->getBuiltinID()) {
972 II->revertBuiltin();
973 assert((II->hasRevertedBuiltin() ||(static_cast <bool> ((II->hasRevertedBuiltin() || II
->getObjCOrBuiltinID() == ObjCOrBuiltinID) && "Incorrect ObjC keyword or builtin ID"
) ? void (0) : __assert_fail ("(II->hasRevertedBuiltin() || II->getObjCOrBuiltinID() == ObjCOrBuiltinID) && \"Incorrect ObjC keyword or builtin ID\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 975, __extension__ __PRETTY_FUNCTION__))
974 II->getObjCOrBuiltinID() == ObjCOrBuiltinID) &&(static_cast <bool> ((II->hasRevertedBuiltin() || II
->getObjCOrBuiltinID() == ObjCOrBuiltinID) && "Incorrect ObjC keyword or builtin ID"
) ? void (0) : __assert_fail ("(II->hasRevertedBuiltin() || II->getObjCOrBuiltinID() == ObjCOrBuiltinID) && \"Incorrect ObjC keyword or builtin ID\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 975, __extension__ __PRETTY_FUNCTION__))
975 "Incorrect ObjC keyword or builtin ID")(static_cast <bool> ((II->hasRevertedBuiltin() || II
->getObjCOrBuiltinID() == ObjCOrBuiltinID) && "Incorrect ObjC keyword or builtin ID"
) ? void (0) : __assert_fail ("(II->hasRevertedBuiltin() || II->getObjCOrBuiltinID() == ObjCOrBuiltinID) && \"Incorrect ObjC keyword or builtin ID\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 975, __extension__ __PRETTY_FUNCTION__))
;
976 }
977 assert(II->isExtensionToken() == ExtensionToken &&(static_cast <bool> (II->isExtensionToken() == ExtensionToken
&& "Incorrect extension token flag") ? void (0) : __assert_fail
("II->isExtensionToken() == ExtensionToken && \"Incorrect extension token flag\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 978, __extension__ __PRETTY_FUNCTION__))
978 "Incorrect extension token flag")(static_cast <bool> (II->isExtensionToken() == ExtensionToken
&& "Incorrect extension token flag") ? void (0) : __assert_fail
("II->isExtensionToken() == ExtensionToken && \"Incorrect extension token flag\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 978, __extension__ __PRETTY_FUNCTION__))
;
979 (void)ExtensionToken;
980 if (Poisoned)
981 II->setIsPoisoned(true);
982 assert(II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword &&(static_cast <bool> (II->isCPlusPlusOperatorKeyword(
) == CPlusPlusOperatorKeyword && "Incorrect C++ operator keyword flag"
) ? void (0) : __assert_fail ("II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword && \"Incorrect C++ operator keyword flag\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 983, __extension__ __PRETTY_FUNCTION__))
983 "Incorrect C++ operator keyword flag")(static_cast <bool> (II->isCPlusPlusOperatorKeyword(
) == CPlusPlusOperatorKeyword && "Incorrect C++ operator keyword flag"
) ? void (0) : __assert_fail ("II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword && \"Incorrect C++ operator keyword flag\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 983, __extension__ __PRETTY_FUNCTION__))
;
984 (void)CPlusPlusOperatorKeyword;
985
986 // If this identifier is a macro, deserialize the macro
987 // definition.
988 if (HadMacroDefinition) {
989 uint32_t MacroDirectivesOffset =
990 endian::readNext<uint32_t, little, unaligned>(d);
991 DataLen -= 4;
992
993 Reader.addPendingMacro(II, &F, MacroDirectivesOffset);
994 }
995
996 Reader.SetIdentifierInfo(ID, II);
997
998 // Read all of the declarations visible at global scope with this
999 // name.
1000 if (DataLen > 0) {
1001 SmallVector<uint32_t, 4> DeclIDs;
1002 for (; DataLen > 0; DataLen -= 4)
1003 DeclIDs.push_back(Reader.getGlobalDeclID(
1004 F, endian::readNext<uint32_t, little, unaligned>(d)));
1005 Reader.SetGloballyVisibleDecls(II, DeclIDs);
1006 }
1007
1008 return II;
1009}
1010
1011DeclarationNameKey::DeclarationNameKey(DeclarationName Name)
1012 : Kind(Name.getNameKind()) {
1013 switch (Kind) {
1014 case DeclarationName::Identifier:
1015 Data = (uint64_t)Name.getAsIdentifierInfo();
1016 break;
1017 case DeclarationName::ObjCZeroArgSelector:
1018 case DeclarationName::ObjCOneArgSelector:
1019 case DeclarationName::ObjCMultiArgSelector:
1020 Data = (uint64_t)Name.getObjCSelector().getAsOpaquePtr();
1021 break;
1022 case DeclarationName::CXXOperatorName:
1023 Data = Name.getCXXOverloadedOperator();
1024 break;
1025 case DeclarationName::CXXLiteralOperatorName:
1026 Data = (uint64_t)Name.getCXXLiteralIdentifier();
1027 break;
1028 case DeclarationName::CXXDeductionGuideName:
1029 Data = (uint64_t)Name.getCXXDeductionGuideTemplate()
1030 ->getDeclName().getAsIdentifierInfo();
1031 break;
1032 case DeclarationName::CXXConstructorName:
1033 case DeclarationName::CXXDestructorName:
1034 case DeclarationName::CXXConversionFunctionName:
1035 case DeclarationName::CXXUsingDirective:
1036 Data = 0;
1037 break;
1038 }
1039}
1040
1041unsigned DeclarationNameKey::getHash() const {
1042 llvm::FoldingSetNodeID ID;
1043 ID.AddInteger(Kind);
1044
1045 switch (Kind) {
12
Control jumps to 'case CXXDeductionGuideName:' at line 1048
1046 case DeclarationName::Identifier:
1047 case DeclarationName::CXXLiteralOperatorName:
1048 case DeclarationName::CXXDeductionGuideName:
1049 ID.AddString(((IdentifierInfo*)Data)->getName());
13
Called C++ object pointer is null
1050 break;
1051 case DeclarationName::ObjCZeroArgSelector:
1052 case DeclarationName::ObjCOneArgSelector:
1053 case DeclarationName::ObjCMultiArgSelector:
1054 ID.AddInteger(serialization::ComputeHash(Selector(Data)));
1055 break;
1056 case DeclarationName::CXXOperatorName:
1057 ID.AddInteger((OverloadedOperatorKind)Data);
1058 break;
1059 case DeclarationName::CXXConstructorName:
1060 case DeclarationName::CXXDestructorName:
1061 case DeclarationName::CXXConversionFunctionName:
1062 case DeclarationName::CXXUsingDirective:
1063 break;
1064 }
1065
1066 return ID.ComputeHash();
1067}
1068
1069ModuleFile *
1070ASTDeclContextNameLookupTrait::ReadFileRef(const unsigned char *&d) {
1071 using namespace llvm::support;
1072
1073 uint32_t ModuleFileID = endian::readNext<uint32_t, little, unaligned>(d);
1074 return Reader.getLocalModuleFile(F, ModuleFileID);
1075}
1076
1077std::pair<unsigned, unsigned>
1078ASTDeclContextNameLookupTrait::ReadKeyDataLength(const unsigned char *&d) {
1079 using namespace llvm::support;
1080
1081 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
1082 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
1083 return std::make_pair(KeyLen, DataLen);
1084}
1085
1086ASTDeclContextNameLookupTrait::internal_key_type
1087ASTDeclContextNameLookupTrait::ReadKey(const unsigned char *d, unsigned) {
1088 using namespace llvm::support;
1089
1090 auto Kind = (DeclarationName::NameKind)*d++;
1091 uint64_t Data;
1092 switch (Kind) {
1093 case DeclarationName::Identifier:
1094 case DeclarationName::CXXLiteralOperatorName:
1095 case DeclarationName::CXXDeductionGuideName:
1096 Data = (uint64_t)Reader.getLocalIdentifier(
1097 F, endian::readNext<uint32_t, little, unaligned>(d));
1098 break;
1099 case DeclarationName::ObjCZeroArgSelector:
1100 case DeclarationName::ObjCOneArgSelector:
1101 case DeclarationName::ObjCMultiArgSelector:
1102 Data =
1103 (uint64_t)Reader.getLocalSelector(
1104 F, endian::readNext<uint32_t, little, unaligned>(
1105 d)).getAsOpaquePtr();
1106 break;
1107 case DeclarationName::CXXOperatorName:
1108 Data = *d++; // OverloadedOperatorKind
1109 break;
1110 case DeclarationName::CXXConstructorName:
1111 case DeclarationName::CXXDestructorName:
1112 case DeclarationName::CXXConversionFunctionName:
1113 case DeclarationName::CXXUsingDirective:
1114 Data = 0;
1115 break;
1116 }
1117
1118 return DeclarationNameKey(Kind, Data);
1119}
1120
1121void ASTDeclContextNameLookupTrait::ReadDataInto(internal_key_type,
1122 const unsigned char *d,
1123 unsigned DataLen,
1124 data_type_builder &Val) {
1125 using namespace llvm::support;
1126
1127 for (unsigned NumDecls = DataLen / 4; NumDecls; --NumDecls) {
1128 uint32_t LocalID = endian::readNext<uint32_t, little, unaligned>(d);
1129 Val.insert(Reader.getGlobalDeclID(F, LocalID));
1130 }
1131}
1132
1133bool ASTReader::ReadLexicalDeclContextStorage(ModuleFile &M,
1134 BitstreamCursor &Cursor,
1135 uint64_t Offset,
1136 DeclContext *DC) {
1137 assert(Offset != 0)(static_cast <bool> (Offset != 0) ? void (0) : __assert_fail
("Offset != 0", "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 1137, __extension__ __PRETTY_FUNCTION__))
;
1138
1139 SavedStreamPosition SavedPosition(Cursor);
1140 Cursor.JumpToBit(Offset);
1141
1142 RecordData Record;
1143 StringRef Blob;
1144 unsigned Code = Cursor.ReadCode();
1145 unsigned RecCode = Cursor.readRecord(Code, Record, &Blob);
1146 if (RecCode != DECL_CONTEXT_LEXICAL) {
1147 Error("Expected lexical block");
1148 return true;
1149 }
1150
1151 assert(!isa<TranslationUnitDecl>(DC) &&(static_cast <bool> (!isa<TranslationUnitDecl>(DC
) && "expected a TU_UPDATE_LEXICAL record for TU") ? void
(0) : __assert_fail ("!isa<TranslationUnitDecl>(DC) && \"expected a TU_UPDATE_LEXICAL record for TU\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 1152, __extension__ __PRETTY_FUNCTION__))
1152 "expected a TU_UPDATE_LEXICAL record for TU")(static_cast <bool> (!isa<TranslationUnitDecl>(DC
) && "expected a TU_UPDATE_LEXICAL record for TU") ? void
(0) : __assert_fail ("!isa<TranslationUnitDecl>(DC) && \"expected a TU_UPDATE_LEXICAL record for TU\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 1152, __extension__ __PRETTY_FUNCTION__))
;
1153 // If we are handling a C++ class template instantiation, we can see multiple
1154 // lexical updates for the same record. It's important that we select only one
1155 // of them, so that field numbering works properly. Just pick the first one we
1156 // see.
1157 auto &Lex = LexicalDecls[DC];
1158 if (!Lex.first) {
1159 Lex = std::make_pair(
1160 &M, llvm::makeArrayRef(
1161 reinterpret_cast<const llvm::support::unaligned_uint32_t *>(
1162 Blob.data()),
1163 Blob.size() / 4));
1164 }
1165 DC->setHasExternalLexicalStorage(true);
1166 return false;
1167}
1168
1169bool ASTReader::ReadVisibleDeclContextStorage(ModuleFile &M,
1170 BitstreamCursor &Cursor,
1171 uint64_t Offset,
1172 DeclID ID) {
1173 assert(Offset != 0)(static_cast <bool> (Offset != 0) ? void (0) : __assert_fail
("Offset != 0", "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 1173, __extension__ __PRETTY_FUNCTION__))
;
1174
1175 SavedStreamPosition SavedPosition(Cursor);
1176 Cursor.JumpToBit(Offset);
1177
1178 RecordData Record;
1179 StringRef Blob;
1180 unsigned Code = Cursor.ReadCode();
1181 unsigned RecCode = Cursor.readRecord(Code, Record, &Blob);
1182 if (RecCode != DECL_CONTEXT_VISIBLE) {
1183 Error("Expected visible lookup table block");
1184 return true;
1185 }
1186
1187 // We can't safely determine the primary context yet, so delay attaching the
1188 // lookup table until we're done with recursive deserialization.
1189 auto *Data = (const unsigned char*)Blob.data();
1190 PendingVisibleUpdates[ID].push_back(PendingVisibleUpdate{&M, Data});
1191 return false;
1192}
1193
1194void ASTReader::Error(StringRef Msg) const {
1195 Error(diag::err_fe_pch_malformed, Msg);
1196 if (PP.getLangOpts().Modules && !Diags.isDiagnosticInFlight() &&
1197 !PP.getHeaderSearchInfo().getModuleCachePath().empty()) {
1198 Diag(diag::note_module_cache_path)
1199 << PP.getHeaderSearchInfo().getModuleCachePath();
1200 }
1201}
1202
1203void ASTReader::Error(unsigned DiagID,
1204 StringRef Arg1, StringRef Arg2) const {
1205 if (Diags.isDiagnosticInFlight())
1206 Diags.SetDelayedDiagnostic(DiagID, Arg1, Arg2);
1207 else
1208 Diag(DiagID) << Arg1 << Arg2;
1209}
1210
1211//===----------------------------------------------------------------------===//
1212// Source Manager Deserialization
1213//===----------------------------------------------------------------------===//
1214
1215/// \brief Read the line table in the source manager block.
1216/// \returns true if there was an error.
1217bool ASTReader::ParseLineTable(ModuleFile &F,
1218 const RecordData &Record) {
1219 unsigned Idx = 0;
1220 LineTableInfo &LineTable = SourceMgr.getLineTable();
1221
1222 // Parse the file names
1223 std::map<int, int> FileIDs;
1224 FileIDs[-1] = -1; // For unspecified filenames.
1225 for (unsigned I = 0; Record[Idx]; ++I) {
1226 // Extract the file name
1227 auto Filename = ReadPath(F, Record, Idx);
1228 FileIDs[I] = LineTable.getLineTableFilenameID(Filename);
1229 }
1230 ++Idx;
1231
1232 // Parse the line entries
1233 std::vector<LineEntry> Entries;
1234 while (Idx < Record.size()) {
1235 int FID = Record[Idx++];
1236 assert(FID >= 0 && "Serialized line entries for non-local file.")(static_cast <bool> (FID >= 0 && "Serialized line entries for non-local file."
) ? void (0) : __assert_fail ("FID >= 0 && \"Serialized line entries for non-local file.\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 1236, __extension__ __PRETTY_FUNCTION__))
;
1237 // Remap FileID from 1-based old view.
1238 FID += F.SLocEntryBaseID - 1;
1239
1240 // Extract the line entries
1241 unsigned NumEntries = Record[Idx++];
1242 assert(NumEntries && "no line entries for file ID")(static_cast <bool> (NumEntries && "no line entries for file ID"
) ? void (0) : __assert_fail ("NumEntries && \"no line entries for file ID\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 1242, __extension__ __PRETTY_FUNCTION__))
;
1243 Entries.clear();
1244 Entries.reserve(NumEntries);
1245 for (unsigned I = 0; I != NumEntries; ++I) {
1246 unsigned FileOffset = Record[Idx++];
1247 unsigned LineNo = Record[Idx++];
1248 int FilenameID = FileIDs[Record[Idx++]];
1249 SrcMgr::CharacteristicKind FileKind
1250 = (SrcMgr::CharacteristicKind)Record[Idx++];
1251 unsigned IncludeOffset = Record[Idx++];
1252 Entries.push_back(LineEntry::get(FileOffset, LineNo, FilenameID,
1253 FileKind, IncludeOffset));
1254 }
1255 LineTable.AddEntry(FileID::get(FID), Entries);
1256 }
1257
1258 return false;
1259}
1260
1261/// \brief Read a source manager block
1262bool ASTReader::ReadSourceManagerBlock(ModuleFile &F) {
1263 using namespace SrcMgr;
1264
1265 BitstreamCursor &SLocEntryCursor = F.SLocEntryCursor;
1266
1267 // Set the source-location entry cursor to the current position in
1268 // the stream. This cursor will be used to read the contents of the
1269 // source manager block initially, and then lazily read
1270 // source-location entries as needed.
1271 SLocEntryCursor = F.Stream;
1272
1273 // The stream itself is going to skip over the source manager block.
1274 if (F.Stream.SkipBlock()) {
1275 Error("malformed block record in AST file");
1276 return true;
1277 }
1278
1279 // Enter the source manager block.
1280 if (SLocEntryCursor.EnterSubBlock(SOURCE_MANAGER_BLOCK_ID)) {
1281 Error("malformed source manager block record in AST file");
1282 return true;
1283 }
1284
1285 RecordData Record;
1286 while (true) {
1287 llvm::BitstreamEntry E = SLocEntryCursor.advanceSkippingSubblocks();
1288
1289 switch (E.Kind) {
1290 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1291 case llvm::BitstreamEntry::Error:
1292 Error("malformed block record in AST file");
1293 return true;
1294 case llvm::BitstreamEntry::EndBlock:
1295 return false;
1296 case llvm::BitstreamEntry::Record:
1297 // The interesting case.
1298 break;
1299 }
1300
1301 // Read a record.
1302 Record.clear();
1303 StringRef Blob;
1304 switch (SLocEntryCursor.readRecord(E.ID, Record, &Blob)) {
1305 default: // Default behavior: ignore.
1306 break;
1307
1308 case SM_SLOC_FILE_ENTRY:
1309 case SM_SLOC_BUFFER_ENTRY:
1310 case SM_SLOC_EXPANSION_ENTRY:
1311 // Once we hit one of the source location entries, we're done.
1312 return false;
1313 }
1314 }
1315}
1316
1317/// \brief If a header file is not found at the path that we expect it to be
1318/// and the PCH file was moved from its original location, try to resolve the
1319/// file by assuming that header+PCH were moved together and the header is in
1320/// the same place relative to the PCH.
1321static std::string
1322resolveFileRelativeToOriginalDir(const std::string &Filename,
1323 const std::string &OriginalDir,
1324 const std::string &CurrDir) {
1325 assert(OriginalDir != CurrDir &&(static_cast <bool> (OriginalDir != CurrDir && "No point trying to resolve the file if the PCH dir didn't change"
) ? void (0) : __assert_fail ("OriginalDir != CurrDir && \"No point trying to resolve the file if the PCH dir didn't change\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 1326, __extension__ __PRETTY_FUNCTION__))
1326 "No point trying to resolve the file if the PCH dir didn't change")(static_cast <bool> (OriginalDir != CurrDir && "No point trying to resolve the file if the PCH dir didn't change"
) ? void (0) : __assert_fail ("OriginalDir != CurrDir && \"No point trying to resolve the file if the PCH dir didn't change\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 1326, __extension__ __PRETTY_FUNCTION__))
;
1327
1328 using namespace llvm::sys;
1329
1330 SmallString<128> filePath(Filename);
1331 fs::make_absolute(filePath);
1332 assert(path::is_absolute(OriginalDir))(static_cast <bool> (path::is_absolute(OriginalDir)) ? void
(0) : __assert_fail ("path::is_absolute(OriginalDir)", "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 1332, __extension__ __PRETTY_FUNCTION__))
;
1333 SmallString<128> currPCHPath(CurrDir);
1334
1335 path::const_iterator fileDirI = path::begin(path::parent_path(filePath)),
1336 fileDirE = path::end(path::parent_path(filePath));
1337 path::const_iterator origDirI = path::begin(OriginalDir),
1338 origDirE = path::end(OriginalDir);
1339 // Skip the common path components from filePath and OriginalDir.
1340 while (fileDirI != fileDirE && origDirI != origDirE &&
1341 *fileDirI == *origDirI) {
1342 ++fileDirI;
1343 ++origDirI;
1344 }
1345 for (; origDirI != origDirE; ++origDirI)
1346 path::append(currPCHPath, "..");
1347 path::append(currPCHPath, fileDirI, fileDirE);
1348 path::append(currPCHPath, path::filename(Filename));
1349 return currPCHPath.str();
1350}
1351
1352bool ASTReader::ReadSLocEntry(int ID) {
1353 if (ID == 0)
1354 return false;
1355
1356 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1357 Error("source location entry ID out-of-range for AST file");
1358 return true;
1359 }
1360
1361 // Local helper to read the (possibly-compressed) buffer data following the
1362 // entry record.
1363 auto ReadBuffer = [this](
1364 BitstreamCursor &SLocEntryCursor,
1365 StringRef Name) -> std::unique_ptr<llvm::MemoryBuffer> {
1366 RecordData Record;
1367 StringRef Blob;
1368 unsigned Code = SLocEntryCursor.ReadCode();
1369 unsigned RecCode = SLocEntryCursor.readRecord(Code, Record, &Blob);
1370
1371 if (RecCode == SM_SLOC_BUFFER_BLOB_COMPRESSED) {
1372 if (!llvm::zlib::isAvailable()) {
1373 Error("zlib is not available");
1374 return nullptr;
1375 }
1376 SmallString<0> Uncompressed;
1377 if (llvm::Error E =
1378 llvm::zlib::uncompress(Blob, Uncompressed, Record[0])) {
1379 Error("could not decompress embedded file contents: " +
1380 llvm::toString(std::move(E)));
1381 return nullptr;
1382 }
1383 return llvm::MemoryBuffer::getMemBufferCopy(Uncompressed, Name);
1384 } else if (RecCode == SM_SLOC_BUFFER_BLOB) {
1385 return llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name, true);
1386 } else {
1387 Error("AST record has invalid code");
1388 return nullptr;
1389 }
1390 };
1391
1392 ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second;
1393 F->SLocEntryCursor.JumpToBit(F->SLocEntryOffsets[ID - F->SLocEntryBaseID]);
1394 BitstreamCursor &SLocEntryCursor = F->SLocEntryCursor;
1395 unsigned BaseOffset = F->SLocEntryBaseOffset;
1396
1397 ++NumSLocEntriesRead;
1398 llvm::BitstreamEntry Entry = SLocEntryCursor.advance();
1399 if (Entry.Kind != llvm::BitstreamEntry::Record) {
1400 Error("incorrectly-formatted source location entry in AST file");
1401 return true;
1402 }
1403
1404 RecordData Record;
1405 StringRef Blob;
1406 switch (SLocEntryCursor.readRecord(Entry.ID, Record, &Blob)) {
1407 default:
1408 Error("incorrectly-formatted source location entry in AST file");
1409 return true;
1410
1411 case SM_SLOC_FILE_ENTRY: {
1412 // We will detect whether a file changed and return 'Failure' for it, but
1413 // we will also try to fail gracefully by setting up the SLocEntry.
1414 unsigned InputID = Record[4];
1415 InputFile IF = getInputFile(*F, InputID);
1416 const FileEntry *File = IF.getFile();
1417 bool OverriddenBuffer = IF.isOverridden();
1418
1419 // Note that we only check if a File was returned. If it was out-of-date
1420 // we have complained but we will continue creating a FileID to recover
1421 // gracefully.
1422 if (!File)
1423 return true;
1424
1425 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
1426 if (IncludeLoc.isInvalid() && F->Kind != MK_MainFile) {
1427 // This is the module's main file.
1428 IncludeLoc = getImportLocation(F);
1429 }
1430 SrcMgr::CharacteristicKind
1431 FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
1432 FileID FID = SourceMgr.createFileID(File, IncludeLoc, FileCharacter,
1433 ID, BaseOffset + Record[0]);
1434 SrcMgr::FileInfo &FileInfo =
1435 const_cast<SrcMgr::FileInfo&>(SourceMgr.getSLocEntry(FID).getFile());
1436 FileInfo.NumCreatedFIDs = Record[5];
1437 if (Record[3])
1438 FileInfo.setHasLineDirectives();
1439
1440 const DeclID *FirstDecl = F->FileSortedDecls + Record[6];
1441 unsigned NumFileDecls = Record[7];
1442 if (NumFileDecls && ContextObj) {
1443 assert(F->FileSortedDecls && "FILE_SORTED_DECLS not encountered yet ?")(static_cast <bool> (F->FileSortedDecls && "FILE_SORTED_DECLS not encountered yet ?"
) ? void (0) : __assert_fail ("F->FileSortedDecls && \"FILE_SORTED_DECLS not encountered yet ?\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 1443, __extension__ __PRETTY_FUNCTION__))
;
1444 FileDeclIDs[FID] = FileDeclsInfo(F, llvm::makeArrayRef(FirstDecl,
1445 NumFileDecls));
1446 }
1447
1448 const SrcMgr::ContentCache *ContentCache
1449 = SourceMgr.getOrCreateContentCache(File, isSystem(FileCharacter));
1450 if (OverriddenBuffer && !ContentCache->BufferOverridden &&
1451 ContentCache->ContentsEntry == ContentCache->OrigEntry &&
1452 !ContentCache->getRawBuffer()) {
1453 auto Buffer = ReadBuffer(SLocEntryCursor, File->getName());
1454 if (!Buffer)
1455 return true;
1456 SourceMgr.overrideFileContents(File, std::move(Buffer));
1457 }
1458
1459 break;
1460 }
1461
1462 case SM_SLOC_BUFFER_ENTRY: {
1463 const char *Name = Blob.data();
1464 unsigned Offset = Record[0];
1465 SrcMgr::CharacteristicKind
1466 FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
1467 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
1468 if (IncludeLoc.isInvalid() && F->isModule()) {
1469 IncludeLoc = getImportLocation(F);
1470 }
1471
1472 auto Buffer = ReadBuffer(SLocEntryCursor, Name);
1473 if (!Buffer)
1474 return true;
1475 SourceMgr.createFileID(std::move(Buffer), FileCharacter, ID,
1476 BaseOffset + Offset, IncludeLoc);
1477 break;
1478 }
1479
1480 case SM_SLOC_EXPANSION_ENTRY: {
1481 SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1]);
1482 SourceMgr.createExpansionLoc(SpellingLoc,
1483 ReadSourceLocation(*F, Record[2]),
1484 ReadSourceLocation(*F, Record[3]),
1485 Record[4],
1486 ID,
1487 BaseOffset + Record[0]);
1488 break;
1489 }
1490 }
1491
1492 return false;
1493}
1494
1495std::pair<SourceLocation, StringRef> ASTReader::getModuleImportLoc(int ID) {
1496 if (ID == 0)
1497 return std::make_pair(SourceLocation(), "");
1498
1499 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1500 Error("source location entry ID out-of-range for AST file");
1501 return std::make_pair(SourceLocation(), "");
1502 }
1503
1504 // Find which module file this entry lands in.
1505 ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second;
1506 if (!M->isModule())
1507 return std::make_pair(SourceLocation(), "");
1508
1509 // FIXME: Can we map this down to a particular submodule? That would be
1510 // ideal.
1511 return std::make_pair(M->ImportLoc, StringRef(M->ModuleName));
1512}
1513
1514/// \brief Find the location where the module F is imported.
1515SourceLocation ASTReader::getImportLocation(ModuleFile *F) {
1516 if (F->ImportLoc.isValid())
1517 return F->ImportLoc;
1518
1519 // Otherwise we have a PCH. It's considered to be "imported" at the first
1520 // location of its includer.
1521 if (F->ImportedBy.empty() || !F->ImportedBy[0]) {
1522 // Main file is the importer.
1523 assert(SourceMgr.getMainFileID().isValid() && "missing main file")(static_cast <bool> (SourceMgr.getMainFileID().isValid(
) && "missing main file") ? void (0) : __assert_fail (
"SourceMgr.getMainFileID().isValid() && \"missing main file\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 1523, __extension__ __PRETTY_FUNCTION__))
;
1524 return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID());
1525 }
1526 return F->ImportedBy[0]->FirstLoc;
1527}
1528
1529/// ReadBlockAbbrevs - Enter a subblock of the specified BlockID with the
1530/// specified cursor. Read the abbreviations that are at the top of the block
1531/// and then leave the cursor pointing into the block.
1532bool ASTReader::ReadBlockAbbrevs(BitstreamCursor &Cursor, unsigned BlockID) {
1533 if (Cursor.EnterSubBlock(BlockID))
1534 return true;
1535
1536 while (true) {
1537 uint64_t Offset = Cursor.GetCurrentBitNo();
1538 unsigned Code = Cursor.ReadCode();
1539
1540 // We expect all abbrevs to be at the start of the block.
1541 if (Code != llvm::bitc::DEFINE_ABBREV) {
1542 Cursor.JumpToBit(Offset);
1543 return false;
1544 }
1545 Cursor.ReadAbbrevRecord();
1546 }
1547}
1548
1549Token ASTReader::ReadToken(ModuleFile &F, const RecordDataImpl &Record,
1550 unsigned &Idx) {
1551 Token Tok;
1552 Tok.startToken();
1553 Tok.setLocation(ReadSourceLocation(F, Record, Idx));
1554 Tok.setLength(Record[Idx++]);
1555 if (IdentifierInfo *II = getLocalIdentifier(F, Record[Idx++]))
1556 Tok.setIdentifierInfo(II);
1557 Tok.setKind((tok::TokenKind)Record[Idx++]);
1558 Tok.setFlag((Token::TokenFlags)Record[Idx++]);
1559 return Tok;
1560}
1561
1562MacroInfo *ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) {
1563 BitstreamCursor &Stream = F.MacroCursor;
1564
1565 // Keep track of where we are in the stream, then jump back there
1566 // after reading this macro.
1567 SavedStreamPosition SavedPosition(Stream);
1568
1569 Stream.JumpToBit(Offset);
1570 RecordData Record;
1571 SmallVector<IdentifierInfo*, 16> MacroParams;
1572 MacroInfo *Macro = nullptr;
1573
1574 while (true) {
1575 // Advance to the next record, but if we get to the end of the block, don't
1576 // pop it (removing all the abbreviations from the cursor) since we want to
1577 // be able to reseek within the block and read entries.
1578 unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd;
1579 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks(Flags);
1580
1581 switch (Entry.Kind) {
1582 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1583 case llvm::BitstreamEntry::Error:
1584 Error("malformed block record in AST file");
1585 return Macro;
1586 case llvm::BitstreamEntry::EndBlock:
1587 return Macro;
1588 case llvm::BitstreamEntry::Record:
1589 // The interesting case.
1590 break;
1591 }
1592
1593 // Read a record.
1594 Record.clear();
1595 PreprocessorRecordTypes RecType =
1596 (PreprocessorRecordTypes)Stream.readRecord(Entry.ID, Record);
1597 switch (RecType) {
1598 case PP_MODULE_MACRO:
1599 case PP_MACRO_DIRECTIVE_HISTORY:
1600 return Macro;
1601
1602 case PP_MACRO_OBJECT_LIKE:
1603 case PP_MACRO_FUNCTION_LIKE: {
1604 // If we already have a macro, that means that we've hit the end
1605 // of the definition of the macro we were looking for. We're
1606 // done.
1607 if (Macro)
1608 return Macro;
1609
1610 unsigned NextIndex = 1; // Skip identifier ID.
1611 SourceLocation Loc = ReadSourceLocation(F, Record, NextIndex);
1612 MacroInfo *MI = PP.AllocateMacroInfo(Loc);
1613 MI->setDefinitionEndLoc(ReadSourceLocation(F, Record, NextIndex));
1614 MI->setIsUsed(Record[NextIndex++]);
1615 MI->setUsedForHeaderGuard(Record[NextIndex++]);
1616
1617 if (RecType == PP_MACRO_FUNCTION_LIKE) {
1618 // Decode function-like macro info.
1619 bool isC99VarArgs = Record[NextIndex++];
1620 bool isGNUVarArgs = Record[NextIndex++];
1621 bool hasCommaPasting = Record[NextIndex++];
1622 MacroParams.clear();
1623 unsigned NumArgs = Record[NextIndex++];
1624 for (unsigned i = 0; i != NumArgs; ++i)
1625 MacroParams.push_back(getLocalIdentifier(F, Record[NextIndex++]));
1626
1627 // Install function-like macro info.
1628 MI->setIsFunctionLike();
1629 if (isC99VarArgs) MI->setIsC99Varargs();
1630 if (isGNUVarArgs) MI->setIsGNUVarargs();
1631 if (hasCommaPasting) MI->setHasCommaPasting();
1632 MI->setParameterList(MacroParams, PP.getPreprocessorAllocator());
1633 }
1634
1635 // Remember that we saw this macro last so that we add the tokens that
1636 // form its body to it.
1637 Macro = MI;
1638
1639 if (NextIndex + 1 == Record.size() && PP.getPreprocessingRecord() &&
1640 Record[NextIndex]) {
1641 // We have a macro definition. Register the association
1642 PreprocessedEntityID
1643 GlobalID = getGlobalPreprocessedEntityID(F, Record[NextIndex]);
1644 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
1645 PreprocessingRecord::PPEntityID PPID =
1646 PPRec.getPPEntityID(GlobalID - 1, /*isLoaded=*/true);
1647 MacroDefinitionRecord *PPDef = cast_or_null<MacroDefinitionRecord>(
1648 PPRec.getPreprocessedEntity(PPID));
1649 if (PPDef)
1650 PPRec.RegisterMacroDefinition(Macro, PPDef);
1651 }
1652
1653 ++NumMacrosRead;
1654 break;
1655 }
1656
1657 case PP_TOKEN: {
1658 // If we see a TOKEN before a PP_MACRO_*, then the file is
1659 // erroneous, just pretend we didn't see this.
1660 if (!Macro) break;
1661
1662 unsigned Idx = 0;
1663 Token Tok = ReadToken(F, Record, Idx);
1664 Macro->AddTokenToBody(Tok);
1665 break;
1666 }
1667 }
1668 }
1669}
1670
1671PreprocessedEntityID
1672ASTReader::getGlobalPreprocessedEntityID(ModuleFile &M,
1673 unsigned LocalID) const {
1674 if (!M.ModuleOffsetMap.empty())
1675 ReadModuleOffsetMap(M);
1676
1677 ContinuousRangeMap<uint32_t, int, 2>::const_iterator
1678 I = M.PreprocessedEntityRemap.find(LocalID - NUM_PREDEF_PP_ENTITY_IDS);
1679 assert(I != M.PreprocessedEntityRemap.end()(static_cast <bool> (I != M.PreprocessedEntityRemap.end
() && "Invalid index into preprocessed entity index remap"
) ? void (0) : __assert_fail ("I != M.PreprocessedEntityRemap.end() && \"Invalid index into preprocessed entity index remap\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 1680, __extension__ __PRETTY_FUNCTION__))
1680 && "Invalid index into preprocessed entity index remap")(static_cast <bool> (I != M.PreprocessedEntityRemap.end
() && "Invalid index into preprocessed entity index remap"
) ? void (0) : __assert_fail ("I != M.PreprocessedEntityRemap.end() && \"Invalid index into preprocessed entity index remap\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 1680, __extension__ __PRETTY_FUNCTION__))
;
1681
1682 return LocalID + I->second;
1683}
1684
1685unsigned HeaderFileInfoTrait::ComputeHash(internal_key_ref ikey) {
1686 return llvm::hash_combine(ikey.Size, ikey.ModTime);
1687}
1688
1689HeaderFileInfoTrait::internal_key_type
1690HeaderFileInfoTrait::GetInternalKey(const FileEntry *FE) {
1691 internal_key_type ikey = {FE->getSize(),
1692 M.HasTimestamps ? FE->getModificationTime() : 0,
1693 FE->getName(), /*Imported*/ false};
1694 return ikey;
1695}
1696
1697bool HeaderFileInfoTrait::EqualKey(internal_key_ref a, internal_key_ref b) {
1698 if (a.Size != b.Size || (a.ModTime && b.ModTime && a.ModTime != b.ModTime))
1699 return false;
1700
1701 if (llvm::sys::path::is_absolute(a.Filename) && a.Filename == b.Filename)
1702 return true;
1703
1704 // Determine whether the actual files are equivalent.
1705 FileManager &FileMgr = Reader.getFileManager();
1706 auto GetFile = [&](const internal_key_type &Key) -> const FileEntry* {
1707 if (!Key.Imported)
1708 return FileMgr.getFile(Key.Filename);
1709
1710 std::string Resolved = Key.Filename;
1711 Reader.ResolveImportedPath(M, Resolved);
1712 return FileMgr.getFile(Resolved);
1713 };
1714
1715 const FileEntry *FEA = GetFile(a);
1716 const FileEntry *FEB = GetFile(b);
1717 return FEA && FEA == FEB;
1718}
1719
1720std::pair<unsigned, unsigned>
1721HeaderFileInfoTrait::ReadKeyDataLength(const unsigned char*& d) {
1722 using namespace llvm::support;
1723
1724 unsigned KeyLen = (unsigned) endian::readNext<uint16_t, little, unaligned>(d);
1725 unsigned DataLen = (unsigned) *d++;
1726 return std::make_pair(KeyLen, DataLen);
1727}
1728
1729HeaderFileInfoTrait::internal_key_type
1730HeaderFileInfoTrait::ReadKey(const unsigned char *d, unsigned) {
1731 using namespace llvm::support;
1732
1733 internal_key_type ikey;
1734 ikey.Size = off_t(endian::readNext<uint64_t, little, unaligned>(d));
1735 ikey.ModTime = time_t(endian::readNext<uint64_t, little, unaligned>(d));
1736 ikey.Filename = (const char *)d;
1737 ikey.Imported = true;
1738 return ikey;
1739}
1740
1741HeaderFileInfoTrait::data_type
1742HeaderFileInfoTrait::ReadData(internal_key_ref key, const unsigned char *d,
1743 unsigned DataLen) {
1744 using namespace llvm::support;
1745
1746 const unsigned char *End = d + DataLen;
1747 HeaderFileInfo HFI;
1748 unsigned Flags = *d++;
1749 // FIXME: Refactor with mergeHeaderFileInfo in HeaderSearch.cpp.
1750 HFI.isImport |= (Flags >> 5) & 0x01;
1751 HFI.isPragmaOnce |= (Flags >> 4) & 0x01;
1752 HFI.DirInfo = (Flags >> 1) & 0x07;
1753 HFI.IndexHeaderMapHeader = Flags & 0x01;
1754 // FIXME: Find a better way to handle this. Maybe just store a
1755 // "has been included" flag?
1756 HFI.NumIncludes = std::max(endian::readNext<uint16_t, little, unaligned>(d),
1757 HFI.NumIncludes);
1758 HFI.ControllingMacroID = Reader.getGlobalIdentifierID(
1759 M, endian::readNext<uint32_t, little, unaligned>(d));
1760 if (unsigned FrameworkOffset =
1761 endian::readNext<uint32_t, little, unaligned>(d)) {
1762 // The framework offset is 1 greater than the actual offset,
1763 // since 0 is used as an indicator for "no framework name".
1764 StringRef FrameworkName(FrameworkStrings + FrameworkOffset - 1);
1765 HFI.Framework = HS->getUniqueFrameworkName(FrameworkName);
1766 }
1767
1768 assert((End - d) % 4 == 0 &&(static_cast <bool> ((End - d) % 4 == 0 && "Wrong data length in HeaderFileInfo deserialization"
) ? void (0) : __assert_fail ("(End - d) % 4 == 0 && \"Wrong data length in HeaderFileInfo deserialization\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 1769, __extension__ __PRETTY_FUNCTION__))
1769 "Wrong data length in HeaderFileInfo deserialization")(static_cast <bool> ((End - d) % 4 == 0 && "Wrong data length in HeaderFileInfo deserialization"
) ? void (0) : __assert_fail ("(End - d) % 4 == 0 && \"Wrong data length in HeaderFileInfo deserialization\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 1769, __extension__ __PRETTY_FUNCTION__))
;
1770 while (d != End) {
1771 uint32_t LocalSMID = endian::readNext<uint32_t, little, unaligned>(d);
1772 auto HeaderRole = static_cast<ModuleMap::ModuleHeaderRole>(LocalSMID & 3);
1773 LocalSMID >>= 2;
1774
1775 // This header is part of a module. Associate it with the module to enable
1776 // implicit module import.
1777 SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID);
1778 Module *Mod = Reader.getSubmodule(GlobalSMID);
1779 FileManager &FileMgr = Reader.getFileManager();
1780 ModuleMap &ModMap =
1781 Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap();
1782
1783 std::string Filename = key.Filename;
1784 if (key.Imported)
1785 Reader.ResolveImportedPath(M, Filename);
1786 // FIXME: This is not always the right filename-as-written, but we're not
1787 // going to use this information to rebuild the module, so it doesn't make
1788 // a lot of difference.
1789 Module::Header H = { key.Filename, FileMgr.getFile(Filename) };
1790 ModMap.addHeader(Mod, H, HeaderRole, /*Imported*/true);
1791 HFI.isModuleHeader |= !(HeaderRole & ModuleMap::TextualHeader);
1792 }
1793
1794 // This HeaderFileInfo was externally loaded.
1795 HFI.External = true;
1796 HFI.IsValid = true;
1797 return HFI;
1798}
1799
1800void ASTReader::addPendingMacro(IdentifierInfo *II,
1801 ModuleFile *M,
1802 uint64_t MacroDirectivesOffset) {
1803 assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard")(static_cast <bool> (NumCurrentElementsDeserializing >
0 &&"Missing deserialization guard") ? void (0) : __assert_fail
("NumCurrentElementsDeserializing > 0 &&\"Missing deserialization guard\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 1803, __extension__ __PRETTY_FUNCTION__))
;
1804 PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset));
1805}
1806
1807void ASTReader::ReadDefinedMacros() {
1808 // Note that we are loading defined macros.
1809 Deserializing Macros(this);
1810
1811 for (ModuleFile &I : llvm::reverse(ModuleMgr)) {
1812 BitstreamCursor &MacroCursor = I.MacroCursor;
1813
1814 // If there was no preprocessor block, skip this file.
1815 if (MacroCursor.getBitcodeBytes().empty())
1816 continue;
1817
1818 BitstreamCursor Cursor = MacroCursor;
1819 Cursor.JumpToBit(I.MacroStartOffset);
1820
1821 RecordData Record;
1822 while (true) {
1823 llvm::BitstreamEntry E = Cursor.advanceSkippingSubblocks();
1824
1825 switch (E.Kind) {
1826 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1827 case llvm::BitstreamEntry::Error:
1828 Error("malformed block record in AST file");
1829 return;
1830 case llvm::BitstreamEntry::EndBlock:
1831 goto NextCursor;
1832
1833 case llvm::BitstreamEntry::Record:
1834 Record.clear();
1835 switch (Cursor.readRecord(E.ID, Record)) {
1836 default: // Default behavior: ignore.
1837 break;
1838
1839 case PP_MACRO_OBJECT_LIKE:
1840 case PP_MACRO_FUNCTION_LIKE: {
1841 IdentifierInfo *II = getLocalIdentifier(I, Record[0]);
1842 if (II->isOutOfDate())
1843 updateOutOfDateIdentifier(*II);
1844 break;
1845 }
1846
1847 case PP_TOKEN:
1848 // Ignore tokens.
1849 break;
1850 }
1851 break;
1852 }
1853 }
1854 NextCursor: ;
1855 }
1856}
1857
1858namespace {
1859
1860 /// \brief Visitor class used to look up identifirs in an AST file.
1861 class IdentifierLookupVisitor {
1862 StringRef Name;
1863 unsigned NameHash;
1864 unsigned PriorGeneration;
1865 unsigned &NumIdentifierLookups;
1866 unsigned &NumIdentifierLookupHits;
1867 IdentifierInfo *Found = nullptr;
1868
1869 public:
1870 IdentifierLookupVisitor(StringRef Name, unsigned PriorGeneration,
1871 unsigned &NumIdentifierLookups,
1872 unsigned &NumIdentifierLookupHits)
1873 : Name(Name), NameHash(ASTIdentifierLookupTrait::ComputeHash(Name)),
1874 PriorGeneration(PriorGeneration),
1875 NumIdentifierLookups(NumIdentifierLookups),
1876 NumIdentifierLookupHits(NumIdentifierLookupHits) {}
1877
1878 bool operator()(ModuleFile &M) {
1879 // If we've already searched this module file, skip it now.
1880 if (M.Generation <= PriorGeneration)
1881 return true;
1882
1883 ASTIdentifierLookupTable *IdTable
1884 = (ASTIdentifierLookupTable *)M.IdentifierLookupTable;
1885 if (!IdTable)
1886 return false;
1887
1888 ASTIdentifierLookupTrait Trait(IdTable->getInfoObj().getReader(), M,
1889 Found);
1890 ++NumIdentifierLookups;
1891 ASTIdentifierLookupTable::iterator Pos =
1892 IdTable->find_hashed(Name, NameHash, &Trait);
1893 if (Pos == IdTable->end())
1894 return false;
1895
1896 // Dereferencing the iterator has the effect of building the
1897 // IdentifierInfo node and populating it with the various
1898 // declarations it needs.
1899 ++NumIdentifierLookupHits;
1900 Found = *Pos;
1901 return true;
1902 }
1903
1904 // \brief Retrieve the identifier info found within the module
1905 // files.
1906 IdentifierInfo *getIdentifierInfo() const { return Found; }
1907 };
1908
1909} // namespace
1910
1911void ASTReader::updateOutOfDateIdentifier(IdentifierInfo &II) {
1912 // Note that we are loading an identifier.
1913 Deserializing AnIdentifier(this);
1914
1915 unsigned PriorGeneration = 0;
1916 if (getContext().getLangOpts().Modules)
1917 PriorGeneration = IdentifierGeneration[&II];
1918
1919 // If there is a global index, look there first to determine which modules
1920 // provably do not have any results for this identifier.
1921 GlobalModuleIndex::HitSet Hits;
1922 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
1923 if (!loadGlobalIndex()) {
1924 if (GlobalIndex->lookupIdentifier(II.getName(), Hits)) {
1925 HitsPtr = &Hits;
1926 }
1927 }
1928
1929 IdentifierLookupVisitor Visitor(II.getName(), PriorGeneration,
1930 NumIdentifierLookups,
1931 NumIdentifierLookupHits);
1932 ModuleMgr.visit(Visitor, HitsPtr);
1933 markIdentifierUpToDate(&II);
1934}
1935
1936void ASTReader::markIdentifierUpToDate(IdentifierInfo *II) {
1937 if (!II)
1938 return;
1939
1940 II->setOutOfDate(false);
1941
1942 // Update the generation for this identifier.
1943 if (getContext().getLangOpts().Modules)
1944 IdentifierGeneration[II] = getGeneration();
1945}
1946
1947void ASTReader::resolvePendingMacro(IdentifierInfo *II,
1948 const PendingMacroInfo &PMInfo) {
1949 ModuleFile &M = *PMInfo.M;
1950
1951 BitstreamCursor &Cursor = M.MacroCursor;
1952 SavedStreamPosition SavedPosition(Cursor);
1953 Cursor.JumpToBit(PMInfo.MacroDirectivesOffset);
1954
1955 struct ModuleMacroRecord {
1956 SubmoduleID SubModID;
1957 MacroInfo *MI;
1958 SmallVector<SubmoduleID, 8> Overrides;
1959 };
1960 llvm::SmallVector<ModuleMacroRecord, 8> ModuleMacros;
1961
1962 // We expect to see a sequence of PP_MODULE_MACRO records listing exported
1963 // macros, followed by a PP_MACRO_DIRECTIVE_HISTORY record with the complete
1964 // macro histroy.
1965 RecordData Record;
1966 while (true) {
1967 llvm::BitstreamEntry Entry =
1968 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
1969 if (Entry.Kind != llvm::BitstreamEntry::Record) {
1970 Error("malformed block record in AST file");
1971 return;
1972 }
1973
1974 Record.clear();
1975 switch ((PreprocessorRecordTypes)Cursor.readRecord(Entry.ID, Record)) {
1976 case PP_MACRO_DIRECTIVE_HISTORY:
1977 break;
1978
1979 case PP_MODULE_MACRO: {
1980 ModuleMacros.push_back(ModuleMacroRecord());
1981 auto &Info = ModuleMacros.back();
1982 Info.SubModID = getGlobalSubmoduleID(M, Record[0]);
1983 Info.MI = getMacro(getGlobalMacroID(M, Record[1]));
1984 for (int I = 2, N = Record.size(); I != N; ++I)
1985 Info.Overrides.push_back(getGlobalSubmoduleID(M, Record[I]));
1986 continue;
1987 }
1988
1989 default:
1990 Error("malformed block record in AST file");
1991 return;
1992 }
1993
1994 // We found the macro directive history; that's the last record
1995 // for this macro.
1996 break;
1997 }
1998
1999 // Module macros are listed in reverse dependency order.
2000 {
2001 std::reverse(ModuleMacros.begin(), ModuleMacros.end());
2002 llvm::SmallVector<ModuleMacro*, 8> Overrides;
2003 for (auto &MMR : ModuleMacros) {
2004 Overrides.clear();
2005 for (unsigned ModID : MMR.Overrides) {
2006 Module *Mod = getSubmodule(ModID);
2007 auto *Macro = PP.getModuleMacro(Mod, II);
2008 assert(Macro && "missing definition for overridden macro")(static_cast <bool> (Macro && "missing definition for overridden macro"
) ? void (0) : __assert_fail ("Macro && \"missing definition for overridden macro\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 2008, __extension__ __PRETTY_FUNCTION__))
;
2009 Overrides.push_back(Macro);
2010 }
2011
2012 bool Inserted = false;
2013 Module *Owner = getSubmodule(MMR.SubModID);
2014 PP.addModuleMacro(Owner, II, MMR.MI, Overrides, Inserted);
2015 }
2016 }
2017
2018 // Don't read the directive history for a module; we don't have anywhere
2019 // to put it.
2020 if (M.isModule())
2021 return;
2022
2023 // Deserialize the macro directives history in reverse source-order.
2024 MacroDirective *Latest = nullptr, *Earliest = nullptr;
2025 unsigned Idx = 0, N = Record.size();
2026 while (Idx < N) {
2027 MacroDirective *MD = nullptr;
2028 SourceLocation Loc = ReadSourceLocation(M, Record, Idx);
2029 MacroDirective::Kind K = (MacroDirective::Kind)Record[Idx++];
2030 switch (K) {
2031 case MacroDirective::MD_Define: {
2032 MacroInfo *MI = getMacro(getGlobalMacroID(M, Record[Idx++]));
2033 MD = PP.AllocateDefMacroDirective(MI, Loc);
2034 break;
2035 }
2036 case MacroDirective::MD_Undefine:
2037 MD = PP.AllocateUndefMacroDirective(Loc);
2038 break;
2039 case MacroDirective::MD_Visibility:
2040 bool isPublic = Record[Idx++];
2041 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic);
2042 break;
2043 }
2044
2045 if (!Latest)
2046 Latest = MD;
2047 if (Earliest)
2048 Earliest->setPrevious(MD);
2049 Earliest = MD;
2050 }
2051
2052 if (Latest)
2053 PP.setLoadedMacroDirective(II, Earliest, Latest);
2054}
2055
2056ASTReader::InputFileInfo
2057ASTReader::readInputFileInfo(ModuleFile &F, unsigned ID) {
2058 // Go find this input file.
2059 BitstreamCursor &Cursor = F.InputFilesCursor;
2060 SavedStreamPosition SavedPosition(Cursor);
2061 Cursor.JumpToBit(F.InputFileOffsets[ID-1]);
2062
2063 unsigned Code = Cursor.ReadCode();
2064 RecordData Record;
2065 StringRef Blob;
2066
2067 unsigned Result = Cursor.readRecord(Code, Record, &Blob);
2068 assert(static_cast<InputFileRecordTypes>(Result) == INPUT_FILE &&(static_cast <bool> (static_cast<InputFileRecordTypes
>(Result) == INPUT_FILE && "invalid record type for input file"
) ? void (0) : __assert_fail ("static_cast<InputFileRecordTypes>(Result) == INPUT_FILE && \"invalid record type for input file\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 2069, __extension__ __PRETTY_FUNCTION__))
2069 "invalid record type for input file")(static_cast <bool> (static_cast<InputFileRecordTypes
>(Result) == INPUT_FILE && "invalid record type for input file"
) ? void (0) : __assert_fail ("static_cast<InputFileRecordTypes>(Result) == INPUT_FILE && \"invalid record type for input file\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 2069, __extension__ __PRETTY_FUNCTION__))
;
2070 (void)Result;
2071
2072 assert(Record[0] == ID && "Bogus stored ID or offset")(static_cast <bool> (Record[0] == ID && "Bogus stored ID or offset"
) ? void (0) : __assert_fail ("Record[0] == ID && \"Bogus stored ID or offset\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 2072, __extension__ __PRETTY_FUNCTION__))
;
2073 InputFileInfo R;
2074 R.StoredSize = static_cast<off_t>(Record[1]);
2075 R.StoredTime = static_cast<time_t>(Record[2]);
2076 R.Overridden = static_cast<bool>(Record[3]);
2077 R.Transient = static_cast<bool>(Record[4]);
2078 R.TopLevelModuleMap = static_cast<bool>(Record[5]);
2079 R.Filename = Blob;
2080 ResolveImportedPath(F, R.Filename);
2081 return R;
2082}
2083
2084static unsigned moduleKindForDiagnostic(ModuleKind Kind);
2085InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) {
2086 // If this ID is bogus, just return an empty input file.
2087 if (ID == 0 || ID > F.InputFilesLoaded.size())
2088 return InputFile();
2089
2090 // If we've already loaded this input file, return it.
2091 if (F.InputFilesLoaded[ID-1].getFile())
2092 return F.InputFilesLoaded[ID-1];
2093
2094 if (F.InputFilesLoaded[ID-1].isNotFound())
2095 return InputFile();
2096
2097 // Go find this input file.
2098 BitstreamCursor &Cursor = F.InputFilesCursor;
2099 SavedStreamPosition SavedPosition(Cursor);
2100 Cursor.JumpToBit(F.InputFileOffsets[ID-1]);
2101
2102 InputFileInfo FI = readInputFileInfo(F, ID);
2103 off_t StoredSize = FI.StoredSize;
2104 time_t StoredTime = FI.StoredTime;
2105 bool Overridden = FI.Overridden;
2106 bool Transient = FI.Transient;
2107 StringRef Filename = FI.Filename;
2108
2109 const FileEntry *File = FileMgr.getFile(Filename, /*OpenFile=*/false);
2110 // If we didn't find the file, resolve it relative to the
2111 // original directory from which this AST file was created.
2112 if (File == nullptr && !F.OriginalDir.empty() && !F.BaseDirectory.empty() &&
2113 F.OriginalDir != F.BaseDirectory) {
2114 std::string Resolved = resolveFileRelativeToOriginalDir(
2115 Filename, F.OriginalDir, F.BaseDirectory);
2116 if (!Resolved.empty())
2117 File = FileMgr.getFile(Resolved);
2118 }
2119
2120 // For an overridden file, create a virtual file with the stored
2121 // size/timestamp.
2122 if ((Overridden || Transient) && File == nullptr)
2123 File = FileMgr.getVirtualFile(Filename, StoredSize, StoredTime);
2124
2125 if (File == nullptr) {
2126 if (Complain) {
2127 std::string ErrorStr = "could not find file '";
2128 ErrorStr += Filename;
2129 ErrorStr += "' referenced by AST file '";
2130 ErrorStr += F.FileName;
2131 ErrorStr += "'";
2132 Error(ErrorStr);
2133 }
2134 // Record that we didn't find the file.
2135 F.InputFilesLoaded[ID-1] = InputFile::getNotFound();
2136 return InputFile();
2137 }
2138
2139 // Check if there was a request to override the contents of the file
2140 // that was part of the precompiled header. Overriding such a file
2141 // can lead to problems when lexing using the source locations from the
2142 // PCH.
2143 SourceManager &SM = getSourceManager();
2144 // FIXME: Reject if the overrides are different.
2145 if ((!Overridden && !Transient) && SM.isFileOverridden(File)) {
2146 if (Complain)
2147 Error(diag::err_fe_pch_file_overridden, Filename);
2148 // After emitting the diagnostic, recover by disabling the override so
2149 // that the original file will be used.
2150 //
2151 // FIXME: This recovery is just as broken as the original state; there may
2152 // be another precompiled module that's using the overridden contents, or
2153 // we might be half way through parsing it. Instead, we should treat the
2154 // overridden contents as belonging to a separate FileEntry.
2155 SM.disableFileContentsOverride(File);
2156 // The FileEntry is a virtual file entry with the size of the contents
2157 // that would override the original contents. Set it to the original's
2158 // size/time.
2159 FileMgr.modifyFileEntry(const_cast<FileEntry*>(File),
2160 StoredSize, StoredTime);
2161 }
2162
2163 bool IsOutOfDate = false;
2164
2165 // For an overridden file, there is nothing to validate.
2166 if (!Overridden && //
2167 (StoredSize != File->getSize() ||
2168 (StoredTime && StoredTime != File->getModificationTime() &&
2169 !DisableValidation)
2170 )) {
2171 if (Complain) {
2172 // Build a list of the PCH imports that got us here (in reverse).
2173 SmallVector<ModuleFile *, 4> ImportStack(1, &F);
2174 while (!ImportStack.back()->ImportedBy.empty())
2175 ImportStack.push_back(ImportStack.back()->ImportedBy[0]);
2176
2177 // The top-level PCH is stale.
2178 StringRef TopLevelPCHName(ImportStack.back()->FileName);
2179 unsigned DiagnosticKind = moduleKindForDiagnostic(ImportStack.back()->Kind);
2180 if (DiagnosticKind == 0)
2181 Error(diag::err_fe_pch_file_modified, Filename, TopLevelPCHName);
2182 else if (DiagnosticKind == 1)
2183 Error(diag::err_fe_module_file_modified, Filename, TopLevelPCHName);
2184 else
2185 Error(diag::err_fe_ast_file_modified, Filename, TopLevelPCHName);
2186
2187 // Print the import stack.
2188 if (ImportStack.size() > 1 && !Diags.isDiagnosticInFlight()) {
2189 Diag(diag::note_pch_required_by)
2190 << Filename << ImportStack[0]->FileName;
2191 for (unsigned I = 1; I < ImportStack.size(); ++I)
2192 Diag(diag::note_pch_required_by)
2193 << ImportStack[I-1]->FileName << ImportStack[I]->FileName;
2194 }
2195
2196 if (!Diags.isDiagnosticInFlight())
2197 Diag(diag::note_pch_rebuild_required) << TopLevelPCHName;
2198 }
2199
2200 IsOutOfDate = true;
2201 }
2202 // FIXME: If the file is overridden and we've already opened it,
2203 // issue an error (or split it into a separate FileEntry).
2204
2205 InputFile IF = InputFile(File, Overridden || Transient, IsOutOfDate);
2206
2207 // Note that we've loaded this input file.
2208 F.InputFilesLoaded[ID-1] = IF;
2209 return IF;
2210}
2211
2212/// \brief If we are loading a relocatable PCH or module file, and the filename
2213/// is not an absolute path, add the system or module root to the beginning of
2214/// the file name.
2215void ASTReader::ResolveImportedPath(ModuleFile &M, std::string &Filename) {
2216 // Resolve relative to the base directory, if we have one.
2217 if (!M.BaseDirectory.empty())
2218 return ResolveImportedPath(Filename, M.BaseDirectory);
2219}
2220
2221void ASTReader::ResolveImportedPath(std::string &Filename, StringRef Prefix) {
2222 if (Filename.empty() || llvm::sys::path::is_absolute(Filename))
2223 return;
2224
2225 SmallString<128> Buffer;
2226 llvm::sys::path::append(Buffer, Prefix, Filename);
2227 Filename.assign(Buffer.begin(), Buffer.end());
2228}
2229
2230static bool isDiagnosedResult(ASTReader::ASTReadResult ARR, unsigned Caps) {
2231 switch (ARR) {
2232 case ASTReader::Failure: return true;
2233 case ASTReader::Missing: return !(Caps & ASTReader::ARR_Missing);
2234 case ASTReader::OutOfDate: return !(Caps & ASTReader::ARR_OutOfDate);
2235 case ASTReader::VersionMismatch: return !(Caps & ASTReader::ARR_VersionMismatch);
2236 case ASTReader::ConfigurationMismatch:
2237 return !(Caps & ASTReader::ARR_ConfigurationMismatch);
2238 case ASTReader::HadErrors: return true;
2239 case ASTReader::Success: return false;
2240 }
2241
2242 llvm_unreachable("unknown ASTReadResult")::llvm::llvm_unreachable_internal("unknown ASTReadResult", "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 2242)
;
2243}
2244
2245ASTReader::ASTReadResult ASTReader::ReadOptionsBlock(
2246 BitstreamCursor &Stream, unsigned ClientLoadCapabilities,
2247 bool AllowCompatibleConfigurationMismatch, ASTReaderListener &Listener,
2248 std::string &SuggestedPredefines) {
2249 if (Stream.EnterSubBlock(OPTIONS_BLOCK_ID))
2250 return Failure;
2251
2252 // Read all of the records in the options block.
2253 RecordData Record;
2254 ASTReadResult Result = Success;
2255 while (true) {
2256 llvm::BitstreamEntry Entry = Stream.advance();
2257
2258 switch (Entry.Kind) {
2259 case llvm::BitstreamEntry::Error:
2260 case llvm::BitstreamEntry::SubBlock:
2261 return Failure;
2262
2263 case llvm::BitstreamEntry::EndBlock:
2264 return Result;
2265
2266 case llvm::BitstreamEntry::Record:
2267 // The interesting case.
2268 break;
2269 }
2270
2271 // Read and process a record.
2272 Record.clear();
2273 switch ((OptionsRecordTypes)Stream.readRecord(Entry.ID, Record)) {
2274 case LANGUAGE_OPTIONS: {
2275 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2276 if (ParseLanguageOptions(Record, Complain, Listener,
2277 AllowCompatibleConfigurationMismatch))
2278 Result = ConfigurationMismatch;
2279 break;
2280 }
2281
2282 case TARGET_OPTIONS: {
2283 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2284 if (ParseTargetOptions(Record, Complain, Listener,
2285 AllowCompatibleConfigurationMismatch))
2286 Result = ConfigurationMismatch;
2287 break;
2288 }
2289
2290 case FILE_SYSTEM_OPTIONS: {
2291 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2292 if (!AllowCompatibleConfigurationMismatch &&
2293 ParseFileSystemOptions(Record, Complain, Listener))
2294 Result = ConfigurationMismatch;
2295 break;
2296 }
2297
2298 case HEADER_SEARCH_OPTIONS: {
2299 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2300 if (!AllowCompatibleConfigurationMismatch &&
2301 ParseHeaderSearchOptions(Record, Complain, Listener))
2302 Result = ConfigurationMismatch;
2303 break;
2304 }
2305
2306 case PREPROCESSOR_OPTIONS:
2307 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2308 if (!AllowCompatibleConfigurationMismatch &&
2309 ParsePreprocessorOptions(Record, Complain, Listener,
2310 SuggestedPredefines))
2311 Result = ConfigurationMismatch;
2312 break;
2313 }
2314 }
2315}
2316
2317ASTReader::ASTReadResult
2318ASTReader::ReadControlBlock(ModuleFile &F,
2319 SmallVectorImpl<ImportedModule> &Loaded,
2320 const ModuleFile *ImportedBy,
2321 unsigned ClientLoadCapabilities) {
2322 BitstreamCursor &Stream = F.Stream;
2323 ASTReadResult Result = Success;
2324
2325 if (Stream.EnterSubBlock(CONTROL_BLOCK_ID)) {
2326 Error("malformed block record in AST file");
2327 return Failure;
2328 }
2329
2330 // Lambda to read the unhashed control block the first time it's called.
2331 //
2332 // For PCM files, the unhashed control block cannot be read until after the
2333 // MODULE_NAME record. However, PCH files have no MODULE_NAME, and yet still
2334 // need to look ahead before reading the IMPORTS record. For consistency,
2335 // this block is always read somehow (see BitstreamEntry::EndBlock).
2336 bool HasReadUnhashedControlBlock = false;
2337 auto readUnhashedControlBlockOnce = [&]() {
2338 if (!HasReadUnhashedControlBlock) {
2339 HasReadUnhashedControlBlock = true;
2340 if (ASTReadResult Result =
2341 readUnhashedControlBlock(F, ImportedBy, ClientLoadCapabilities))
2342 return Result;
2343 }
2344 return Success;
2345 };
2346
2347 // Read all of the records and blocks in the control block.
2348 RecordData Record;
2349 unsigned NumInputs = 0;
2350 unsigned NumUserInputs = 0;
2351 while (true) {
2352 llvm::BitstreamEntry Entry = Stream.advance();
2353
2354 switch (Entry.Kind) {
2355 case llvm::BitstreamEntry::Error:
2356 Error("malformed block record in AST file");
2357 return Failure;
2358 case llvm::BitstreamEntry::EndBlock: {
2359 // Validate the module before returning. This call catches an AST with
2360 // no module name and no imports.
2361 if (ASTReadResult Result = readUnhashedControlBlockOnce())
2362 return Result;
2363
2364 // Validate input files.
2365 const HeaderSearchOptions &HSOpts =
2366 PP.getHeaderSearchInfo().getHeaderSearchOpts();
2367
2368 // All user input files reside at the index range [0, NumUserInputs), and
2369 // system input files reside at [NumUserInputs, NumInputs). For explicitly
2370 // loaded module files, ignore missing inputs.
2371 if (!DisableValidation && F.Kind != MK_ExplicitModule &&
2372 F.Kind != MK_PrebuiltModule) {
2373 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
2374
2375 // If we are reading a module, we will create a verification timestamp,
2376 // so we verify all input files. Otherwise, verify only user input
2377 // files.
2378
2379 unsigned N = NumUserInputs;
2380 if (ValidateSystemInputs ||
2381 (HSOpts.ModulesValidateOncePerBuildSession &&
2382 F.InputFilesValidationTimestamp <= HSOpts.BuildSessionTimestamp &&
2383 F.Kind == MK_ImplicitModule))
2384 N = NumInputs;
2385
2386 for (unsigned I = 0; I < N; ++I) {
2387 InputFile IF = getInputFile(F, I+1, Complain);
2388 if (!IF.getFile() || IF.isOutOfDate())
2389 return OutOfDate;
2390 }
2391 }
2392
2393 if (Listener)
2394 Listener->visitModuleFile(F.FileName, F.Kind);
2395
2396 if (Listener && Listener->needsInputFileVisitation()) {
2397 unsigned N = Listener->needsSystemInputFileVisitation() ? NumInputs
2398 : NumUserInputs;
2399 for (unsigned I = 0; I < N; ++I) {
2400 bool IsSystem = I >= NumUserInputs;
2401 InputFileInfo FI = readInputFileInfo(F, I+1);
2402 Listener->visitInputFile(FI.Filename, IsSystem, FI.Overridden,
2403 F.Kind == MK_ExplicitModule ||
2404 F.Kind == MK_PrebuiltModule);
2405 }
2406 }
2407
2408 return Result;
2409 }
2410
2411 case llvm::BitstreamEntry::SubBlock:
2412 switch (Entry.ID) {
2413 case INPUT_FILES_BLOCK_ID:
2414 F.InputFilesCursor = Stream;
2415 if (Stream.SkipBlock() || // Skip with the main cursor
2416 // Read the abbreviations
2417 ReadBlockAbbrevs(F.InputFilesCursor, INPUT_FILES_BLOCK_ID)) {
2418 Error("malformed block record in AST file");
2419 return Failure;
2420 }
2421 continue;
2422
2423 case OPTIONS_BLOCK_ID:
2424 // If we're reading the first module for this group, check its options
2425 // are compatible with ours. For modules it imports, no further checking
2426 // is required, because we checked them when we built it.
2427 if (Listener && !ImportedBy) {
2428 // Should we allow the configuration of the module file to differ from
2429 // the configuration of the current translation unit in a compatible
2430 // way?
2431 //
2432 // FIXME: Allow this for files explicitly specified with -include-pch.
2433 bool AllowCompatibleConfigurationMismatch =
2434 F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule;
2435
2436 Result = ReadOptionsBlock(Stream, ClientLoadCapabilities,
2437 AllowCompatibleConfigurationMismatch,
2438 *Listener, SuggestedPredefines);
2439 if (Result == Failure) {
2440 Error("malformed block record in AST file");
2441 return Result;
2442 }
2443
2444 if (DisableValidation ||
2445 (AllowConfigurationMismatch && Result == ConfigurationMismatch))
2446 Result = Success;
2447
2448 // If we can't load the module, exit early since we likely
2449 // will rebuild the module anyway. The stream may be in the
2450 // middle of a block.
2451 if (Result != Success)
2452 return Result;
2453 } else if (Stream.SkipBlock()) {
2454 Error("malformed block record in AST file");
2455 return Failure;
2456 }
2457 continue;
2458
2459 default:
2460 if (Stream.SkipBlock()) {
2461 Error("malformed block record in AST file");
2462 return Failure;
2463 }
2464 continue;
2465 }
2466
2467 case llvm::BitstreamEntry::Record:
2468 // The interesting case.
2469 break;
2470 }
2471
2472 // Read and process a record.
2473 Record.clear();
2474 StringRef Blob;
2475 switch ((ControlRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob)) {
2476 case METADATA: {
2477 if (Record[0] != VERSION_MAJOR && !DisableValidation) {
2478 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
2479 Diag(Record[0] < VERSION_MAJOR? diag::err_pch_version_too_old
2480 : diag::err_pch_version_too_new);
2481 return VersionMismatch;
2482 }
2483
2484 bool hasErrors = Record[6];
2485 if (hasErrors && !DisableValidation && !AllowASTWithCompilerErrors) {
2486 Diag(diag::err_pch_with_compiler_errors);
2487 return HadErrors;
2488 }
2489 if (hasErrors) {
2490 Diags.ErrorOccurred = true;
2491 Diags.UncompilableErrorOccurred = true;
2492 Diags.UnrecoverableErrorOccurred = true;
2493 }
2494
2495 F.RelocatablePCH = Record[4];
2496 // Relative paths in a relocatable PCH are relative to our sysroot.
2497 if (F.RelocatablePCH)
2498 F.BaseDirectory = isysroot.empty() ? "/" : isysroot;
2499
2500 F.HasTimestamps = Record[5];
2501
2502 const std::string &CurBranch = getClangFullRepositoryVersion();
2503 StringRef ASTBranch = Blob;
2504 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) {
2505 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
2506 Diag(diag::err_pch_different_branch) << ASTBranch << CurBranch;
2507 return VersionMismatch;
2508 }
2509 break;
2510 }
2511
2512 case IMPORTS: {
2513 // Validate the AST before processing any imports (otherwise, untangling
2514 // them can be error-prone and expensive). A module will have a name and
2515 // will already have been validated, but this catches the PCH case.
2516 if (ASTReadResult Result = readUnhashedControlBlockOnce())
2517 return Result;
2518
2519 // Load each of the imported PCH files.
2520 unsigned Idx = 0, N = Record.size();
2521 while (Idx < N) {
2522 // Read information about the AST file.
2523 ModuleKind ImportedKind = (ModuleKind)Record[Idx++];
2524 // The import location will be the local one for now; we will adjust
2525 // all import locations of module imports after the global source
2526 // location info are setup, in ReadAST.
2527 SourceLocation ImportLoc =
2528 ReadUntranslatedSourceLocation(Record[Idx++]);
2529 off_t StoredSize = (off_t)Record[Idx++];
2530 time_t StoredModTime = (time_t)Record[Idx++];
2531 ASTFileSignature StoredSignature = {
2532 {{(uint32_t)Record[Idx++], (uint32_t)Record[Idx++],
2533 (uint32_t)Record[Idx++], (uint32_t)Record[Idx++],
2534 (uint32_t)Record[Idx++]}}};
2535
2536 std::string ImportedName = ReadString(Record, Idx);
2537 std::string ImportedFile;
2538
2539 // For prebuilt and explicit modules first consult the file map for
2540 // an override. Note that here we don't search prebuilt module
2541 // directories, only the explicit name to file mappings. Also, we will
2542 // still verify the size/signature making sure it is essentially the
2543 // same file but perhaps in a different location.
2544 if (ImportedKind == MK_PrebuiltModule || ImportedKind == MK_ExplicitModule)
2545 ImportedFile = PP.getHeaderSearchInfo().getPrebuiltModuleFileName(
2546 ImportedName, /*FileMapOnly*/ true);
2547
2548 if (ImportedFile.empty())
2549 ImportedFile = ReadPath(F, Record, Idx);
2550 else
2551 SkipPath(Record, Idx);
2552
2553 // If our client can't cope with us being out of date, we can't cope with
2554 // our dependency being missing.
2555 unsigned Capabilities = ClientLoadCapabilities;
2556 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
2557 Capabilities &= ~ARR_Missing;
2558
2559 // Load the AST file.
2560 auto Result = ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F,
2561 Loaded, StoredSize, StoredModTime,
2562 StoredSignature, Capabilities);
2563
2564 // If we diagnosed a problem, produce a backtrace.
2565 if (isDiagnosedResult(Result, Capabilities))
2566 Diag(diag::note_module_file_imported_by)
2567 << F.FileName << !F.ModuleName.empty() << F.ModuleName;
2568
2569 switch (Result) {
2570 case Failure: return Failure;
2571 // If we have to ignore the dependency, we'll have to ignore this too.
2572 case Missing:
2573 case OutOfDate: return OutOfDate;
2574 case VersionMismatch: return VersionMismatch;
2575 case ConfigurationMismatch: return ConfigurationMismatch;
2576 case HadErrors: return HadErrors;
2577 case Success: break;
2578 }
2579 }
2580 break;
2581 }
2582
2583 case ORIGINAL_FILE:
2584 F.OriginalSourceFileID = FileID::get(Record[0]);
2585 F.ActualOriginalSourceFileName = Blob;
2586 F.OriginalSourceFileName = F.ActualOriginalSourceFileName;
2587 ResolveImportedPath(F, F.OriginalSourceFileName);
2588 break;
2589
2590 case ORIGINAL_FILE_ID:
2591 F.OriginalSourceFileID = FileID::get(Record[0]);
2592 break;
2593
2594 case ORIGINAL_PCH_DIR:
2595 F.OriginalDir = Blob;
2596 break;
2597
2598 case MODULE_NAME:
2599 F.ModuleName = Blob;
2600 if (Listener)
2601 Listener->ReadModuleName(F.ModuleName);
2602
2603 // Validate the AST as soon as we have a name so we can exit early on
2604 // failure.
2605 if (ASTReadResult Result = readUnhashedControlBlockOnce())
2606 return Result;
2607
2608 break;
2609
2610 case MODULE_DIRECTORY: {
2611 assert(!F.ModuleName.empty() &&(static_cast <bool> (!F.ModuleName.empty() && "MODULE_DIRECTORY found before MODULE_NAME"
) ? void (0) : __assert_fail ("!F.ModuleName.empty() && \"MODULE_DIRECTORY found before MODULE_NAME\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 2612, __extension__ __PRETTY_FUNCTION__))
2612 "MODULE_DIRECTORY found before MODULE_NAME")(static_cast <bool> (!F.ModuleName.empty() && "MODULE_DIRECTORY found before MODULE_NAME"
) ? void (0) : __assert_fail ("!F.ModuleName.empty() && \"MODULE_DIRECTORY found before MODULE_NAME\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 2612, __extension__ __PRETTY_FUNCTION__))
;
2613 // If we've already loaded a module map file covering this module, we may
2614 // have a better path for it (relative to the current build).
2615 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName);
2616 if (M && M->Directory) {
2617 // If we're implicitly loading a module, the base directory can't
2618 // change between the build and use.
2619 if (F.Kind != MK_ExplicitModule && F.Kind != MK_PrebuiltModule) {
2620 const DirectoryEntry *BuildDir =
2621 PP.getFileManager().getDirectory(Blob);
2622 if (!BuildDir || BuildDir != M->Directory) {
2623 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
2624 Diag(diag::err_imported_module_relocated)
2625 << F.ModuleName << Blob << M->Directory->getName();
2626 return OutOfDate;
2627 }
2628 }
2629 F.BaseDirectory = M->Directory->getName();
2630 } else {
2631 F.BaseDirectory = Blob;
2632 }
2633 break;
2634 }
2635
2636 case MODULE_MAP_FILE:
2637 if (ASTReadResult Result =
2638 ReadModuleMapFileBlock(Record, F, ImportedBy, ClientLoadCapabilities))
2639 return Result;
2640 break;
2641
2642 case INPUT_FILE_OFFSETS:
2643 NumInputs = Record[0];
2644 NumUserInputs = Record[1];
2645 F.InputFileOffsets =
2646 (const llvm::support::unaligned_uint64_t *)Blob.data();
2647 F.InputFilesLoaded.resize(NumInputs);
2648 F.NumUserInputFiles = NumUserInputs;
2649 break;
2650 }
2651 }
2652}
2653
2654ASTReader::ASTReadResult
2655ASTReader::ReadASTBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
2656 BitstreamCursor &Stream = F.Stream;
2657
2658 if (Stream.EnterSubBlock(AST_BLOCK_ID)) {
2659 Error("malformed block record in AST file");
2660 return Failure;
2661 }
2662
2663 // Read all of the records and blocks for the AST file.
2664 RecordData Record;
2665 while (true) {
2666 llvm::BitstreamEntry Entry = Stream.advance();
2667
2668 switch (Entry.Kind) {
2669 case llvm::BitstreamEntry::Error:
2670 Error("error at end of module block in AST file");
2671 return Failure;
2672 case llvm::BitstreamEntry::EndBlock:
2673 // Outside of C++, we do not store a lookup map for the translation unit.
2674 // Instead, mark it as needing a lookup map to be built if this module
2675 // contains any declarations lexically within it (which it always does!).
2676 // This usually has no cost, since we very rarely need the lookup map for
2677 // the translation unit outside C++.
2678 if (ASTContext *Ctx = ContextObj) {
2679 DeclContext *DC = Ctx->getTranslationUnitDecl();
2680 if (DC->hasExternalLexicalStorage() && !Ctx->getLangOpts().CPlusPlus)
2681 DC->setMustBuildLookupTable();
2682 }
2683
2684 return Success;
2685 case llvm::BitstreamEntry::SubBlock:
2686 switch (Entry.ID) {
2687 case DECLTYPES_BLOCK_ID:
2688 // We lazily load the decls block, but we want to set up the
2689 // DeclsCursor cursor to point into it. Clone our current bitcode
2690 // cursor to it, enter the block and read the abbrevs in that block.
2691 // With the main cursor, we just skip over it.
2692 F.DeclsCursor = Stream;
2693 if (Stream.SkipBlock() || // Skip with the main cursor.
2694 // Read the abbrevs.
2695 ReadBlockAbbrevs(F.DeclsCursor, DECLTYPES_BLOCK_ID)) {
2696 Error("malformed block record in AST file");
2697 return Failure;
2698 }
2699 break;
2700
2701 case PREPROCESSOR_BLOCK_ID:
2702 F.MacroCursor = Stream;
2703 if (!PP.getExternalSource())
2704 PP.setExternalSource(this);
2705
2706 if (Stream.SkipBlock() ||
2707 ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID)) {
2708 Error("malformed block record in AST file");
2709 return Failure;
2710 }
2711 F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo();
2712 break;
2713
2714 case PREPROCESSOR_DETAIL_BLOCK_ID:
2715 F.PreprocessorDetailCursor = Stream;
2716 if (Stream.SkipBlock() ||
2717 ReadBlockAbbrevs(F.PreprocessorDetailCursor,
2718 PREPROCESSOR_DETAIL_BLOCK_ID)) {
2719 Error("malformed preprocessor detail record in AST file");
2720 return Failure;
2721 }
2722 F.PreprocessorDetailStartOffset
2723 = F.PreprocessorDetailCursor.GetCurrentBitNo();
2724
2725 if (!PP.getPreprocessingRecord())
2726 PP.createPreprocessingRecord();
2727 if (!PP.getPreprocessingRecord()->getExternalSource())
2728 PP.getPreprocessingRecord()->SetExternalSource(*this);
2729 break;
2730
2731 case SOURCE_MANAGER_BLOCK_ID:
2732 if (ReadSourceManagerBlock(F))
2733 return Failure;
2734 break;
2735
2736 case SUBMODULE_BLOCK_ID:
2737 if (ASTReadResult Result =
2738 ReadSubmoduleBlock(F, ClientLoadCapabilities))
2739 return Result;
2740 break;
2741
2742 case COMMENTS_BLOCK_ID: {
2743 BitstreamCursor C = Stream;
2744 if (Stream.SkipBlock() ||
2745 ReadBlockAbbrevs(C, COMMENTS_BLOCK_ID)) {
2746 Error("malformed comments block in AST file");
2747 return Failure;
2748 }
2749 CommentsCursors.push_back(std::make_pair(C, &F));
2750 break;
2751 }
2752
2753 default:
2754 if (Stream.SkipBlock()) {
2755 Error("malformed block record in AST file");
2756 return Failure;
2757 }
2758 break;
2759 }
2760 continue;
2761
2762 case llvm::BitstreamEntry::Record:
2763 // The interesting case.
2764 break;
2765 }
2766
2767 // Read and process a record.
2768 Record.clear();
2769 StringRef Blob;
2770 auto RecordType =
2771 (ASTRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob);
2772
2773 // If we're not loading an AST context, we don't care about most records.
2774 if (!ContextObj) {
2775 switch (RecordType) {
2776 case IDENTIFIER_TABLE:
2777 case IDENTIFIER_OFFSET:
2778 case INTERESTING_IDENTIFIERS:
2779 case STATISTICS:
2780 case PP_CONDITIONAL_STACK:
2781 case PP_COUNTER_VALUE:
2782 case SOURCE_LOCATION_OFFSETS:
2783 case MODULE_OFFSET_MAP:
2784 case SOURCE_MANAGER_LINE_TABLE:
2785 case SOURCE_LOCATION_PRELOADS:
2786 case PPD_ENTITIES_OFFSETS:
2787 case HEADER_SEARCH_TABLE:
2788 case IMPORTED_MODULES:
2789 case MACRO_OFFSET:
2790 break;
2791 default:
2792 continue;
2793 }
2794 }
2795
2796 switch (RecordType) {
2797 default: // Default behavior: ignore.
2798 break;
2799
2800 case TYPE_OFFSET: {
2801 if (F.LocalNumTypes != 0) {
2802 Error("duplicate TYPE_OFFSET record in AST file");
2803 return Failure;
2804 }
2805 F.TypeOffsets = (const uint32_t *)Blob.data();
2806 F.LocalNumTypes = Record[0];
2807 unsigned LocalBaseTypeIndex = Record[1];
2808 F.BaseTypeIndex = getTotalNumTypes();
2809
2810 if (F.LocalNumTypes > 0) {
2811 // Introduce the global -> local mapping for types within this module.
2812 GlobalTypeMap.insert(std::make_pair(getTotalNumTypes(), &F));
2813
2814 // Introduce the local -> global mapping for types within this module.
2815 F.TypeRemap.insertOrReplace(
2816 std::make_pair(LocalBaseTypeIndex,
2817 F.BaseTypeIndex - LocalBaseTypeIndex));
2818
2819 TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes);
2820 }
2821 break;
2822 }
2823
2824 case DECL_OFFSET: {
2825 if (F.LocalNumDecls != 0) {
2826 Error("duplicate DECL_OFFSET record in AST file");
2827 return Failure;
2828 }
2829 F.DeclOffsets = (const DeclOffset *)Blob.data();
2830 F.LocalNumDecls = Record[0];
2831 unsigned LocalBaseDeclID = Record[1];
2832 F.BaseDeclID = getTotalNumDecls();
2833
2834 if (F.LocalNumDecls > 0) {
2835 // Introduce the global -> local mapping for declarations within this
2836 // module.
2837 GlobalDeclMap.insert(
2838 std::make_pair(getTotalNumDecls() + NUM_PREDEF_DECL_IDS, &F));
2839
2840 // Introduce the local -> global mapping for declarations within this
2841 // module.
2842 F.DeclRemap.insertOrReplace(
2843 std::make_pair(LocalBaseDeclID, F.BaseDeclID - LocalBaseDeclID));
2844
2845 // Introduce the global -> local mapping for declarations within this
2846 // module.
2847 F.GlobalToLocalDeclIDs[&F] = LocalBaseDeclID;
2848
2849 DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls);
2850 }
2851 break;
2852 }
2853
2854 case TU_UPDATE_LEXICAL: {
2855 DeclContext *TU = ContextObj->getTranslationUnitDecl();
2856 LexicalContents Contents(
2857 reinterpret_cast<const llvm::support::unaligned_uint32_t *>(
2858 Blob.data()),
2859 static_cast<unsigned int>(Blob.size() / 4));
2860 TULexicalDecls.push_back(std::make_pair(&F, Contents));
2861 TU->setHasExternalLexicalStorage(true);
2862 break;
2863 }
2864
2865 case UPDATE_VISIBLE: {
2866 unsigned Idx = 0;
2867 serialization::DeclID ID = ReadDeclID(F, Record, Idx);
2868 auto *Data = (const unsigned char*)Blob.data();
2869 PendingVisibleUpdates[ID].push_back(PendingVisibleUpdate{&F, Data});
2870 // If we've already loaded the decl, perform the updates when we finish
2871 // loading this block.
2872 if (Decl *D = GetExistingDecl(ID))
2873 PendingUpdateRecords.push_back(
2874 PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
2875 break;
2876 }
2877
2878 case IDENTIFIER_TABLE:
2879 F.IdentifierTableData = Blob.data();
2880 if (Record[0]) {
2881 F.IdentifierLookupTable = ASTIdentifierLookupTable::Create(
2882 (const unsigned char *)F.IdentifierTableData + Record[0],
2883 (const unsigned char *)F.IdentifierTableData + sizeof(uint32_t),
2884 (const unsigned char *)F.IdentifierTableData,
2885 ASTIdentifierLookupTrait(*this, F));
2886
2887 PP.getIdentifierTable().setExternalIdentifierLookup(this);
2888 }
2889 break;
2890
2891 case IDENTIFIER_OFFSET: {
2892 if (F.LocalNumIdentifiers != 0) {
2893 Error("duplicate IDENTIFIER_OFFSET record in AST file");
2894 return Failure;
2895 }
2896 F.IdentifierOffsets = (const uint32_t *)Blob.data();
2897 F.LocalNumIdentifiers = Record[0];
2898 unsigned LocalBaseIdentifierID = Record[1];
2899 F.BaseIdentifierID = getTotalNumIdentifiers();
2900
2901 if (F.LocalNumIdentifiers > 0) {
2902 // Introduce the global -> local mapping for identifiers within this
2903 // module.
2904 GlobalIdentifierMap.insert(std::make_pair(getTotalNumIdentifiers() + 1,
2905 &F));
2906
2907 // Introduce the local -> global mapping for identifiers within this
2908 // module.
2909 F.IdentifierRemap.insertOrReplace(
2910 std::make_pair(LocalBaseIdentifierID,
2911 F.BaseIdentifierID - LocalBaseIdentifierID));
2912
2913 IdentifiersLoaded.resize(IdentifiersLoaded.size()
2914 + F.LocalNumIdentifiers);
2915 }
2916 break;
2917 }
2918
2919 case INTERESTING_IDENTIFIERS:
2920 F.PreloadIdentifierOffsets.assign(Record.begin(), Record.end());
2921 break;
2922
2923 case EAGERLY_DESERIALIZED_DECLS:
2924 // FIXME: Skip reading this record if our ASTConsumer doesn't care
2925 // about "interesting" decls (for instance, if we're building a module).
2926 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2927 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I]));
2928 break;
2929
2930 case MODULAR_CODEGEN_DECLS:
2931 // FIXME: Skip reading this record if our ASTConsumer doesn't care about
2932 // them (ie: if we're not codegenerating this module).
2933 if (F.Kind == MK_MainFile)
2934 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2935 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I]));
2936 break;
2937
2938 case SPECIAL_TYPES:
2939 if (SpecialTypes.empty()) {
2940 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2941 SpecialTypes.push_back(getGlobalTypeID(F, Record[I]));
2942 break;
2943 }
2944
2945 if (SpecialTypes.size() != Record.size()) {
2946 Error("invalid special-types record");
2947 return Failure;
2948 }
2949
2950 for (unsigned I = 0, N = Record.size(); I != N; ++I) {
2951 serialization::TypeID ID = getGlobalTypeID(F, Record[I]);
2952 if (!SpecialTypes[I])
2953 SpecialTypes[I] = ID;
2954 // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate
2955 // merge step?
2956 }
2957 break;
2958
2959 case STATISTICS:
2960 TotalNumStatements += Record[0];
2961 TotalNumMacros += Record[1];
2962 TotalLexicalDeclContexts += Record[2];
2963 TotalVisibleDeclContexts += Record[3];
2964 break;
2965
2966 case UNUSED_FILESCOPED_DECLS:
2967 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2968 UnusedFileScopedDecls.push_back(getGlobalDeclID(F, Record[I]));
2969 break;
2970
2971 case DELEGATING_CTORS:
2972 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2973 DelegatingCtorDecls.push_back(getGlobalDeclID(F, Record[I]));
2974 break;
2975
2976 case WEAK_UNDECLARED_IDENTIFIERS:
2977 if (Record.size() % 4 != 0) {
2978 Error("invalid weak identifiers record");
2979 return Failure;
2980 }
2981
2982 // FIXME: Ignore weak undeclared identifiers from non-original PCH
2983 // files. This isn't the way to do it :)
2984 WeakUndeclaredIdentifiers.clear();
2985
2986 // Translate the weak, undeclared identifiers into global IDs.
2987 for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) {
2988 WeakUndeclaredIdentifiers.push_back(
2989 getGlobalIdentifierID(F, Record[I++]));
2990 WeakUndeclaredIdentifiers.push_back(
2991 getGlobalIdentifierID(F, Record[I++]));
2992 WeakUndeclaredIdentifiers.push_back(
2993 ReadSourceLocation(F, Record, I).getRawEncoding());
2994 WeakUndeclaredIdentifiers.push_back(Record[I++]);
2995 }
2996 break;
2997
2998 case SELECTOR_OFFSETS: {
2999 F.SelectorOffsets = (const uint32_t *)Blob.data();
3000 F.LocalNumSelectors = Record[0];
3001 unsigned LocalBaseSelectorID = Record[1];
3002 F.BaseSelectorID = getTotalNumSelectors();
3003
3004 if (F.LocalNumSelectors > 0) {
3005 // Introduce the global -> local mapping for selectors within this
3006 // module.
3007 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F));
3008
3009 // Introduce the local -> global mapping for selectors within this
3010 // module.
3011 F.SelectorRemap.insertOrReplace(
3012 std::make_pair(LocalBaseSelectorID,
3013 F.BaseSelectorID - LocalBaseSelectorID));
3014
3015 SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors);
3016 }
3017 break;
3018 }
3019
3020 case METHOD_POOL:
3021 F.SelectorLookupTableData = (const unsigned char *)Blob.data();
3022 if (Record[0])
3023 F.SelectorLookupTable
3024 = ASTSelectorLookupTable::Create(
3025 F.SelectorLookupTableData + Record[0],
3026 F.SelectorLookupTableData,
3027 ASTSelectorLookupTrait(*this, F));
3028 TotalNumMethodPoolEntries += Record[1];
3029 break;
3030
3031 case REFERENCED_SELECTOR_POOL:
3032 if (!Record.empty()) {
3033 for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) {
3034 ReferencedSelectorsData.push_back(getGlobalSelectorID(F,
3035 Record[Idx++]));
3036 ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx).
3037 getRawEncoding());
3038 }
3039 }
3040 break;
3041
3042 case PP_CONDITIONAL_STACK:
3043 if (!Record.empty()) {
3044 unsigned Idx = 0, End = Record.size() - 1;
3045 bool ReachedEOFWhileSkipping = Record[Idx++];
3046 llvm::Optional<Preprocessor::PreambleSkipInfo> SkipInfo;
3047 if (ReachedEOFWhileSkipping) {
3048 SourceLocation HashToken = ReadSourceLocation(F, Record, Idx);
3049 SourceLocation IfTokenLoc = ReadSourceLocation(F, Record, Idx);
3050 bool FoundNonSkipPortion = Record[Idx++];
3051 bool FoundElse = Record[Idx++];
3052 SourceLocation ElseLoc = ReadSourceLocation(F, Record, Idx);
3053 SkipInfo.emplace(HashToken, IfTokenLoc, FoundNonSkipPortion,
3054 FoundElse, ElseLoc);
3055 }
3056 SmallVector<PPConditionalInfo, 4> ConditionalStack;
3057 while (Idx < End) {
3058 auto Loc = ReadSourceLocation(F, Record, Idx);
3059 bool WasSkipping = Record[Idx++];
3060 bool FoundNonSkip = Record[Idx++];
3061 bool FoundElse = Record[Idx++];
3062 ConditionalStack.push_back(
3063 {Loc, WasSkipping, FoundNonSkip, FoundElse});
3064 }
3065 PP.setReplayablePreambleConditionalStack(ConditionalStack, SkipInfo);
3066 }
3067 break;
3068
3069 case PP_COUNTER_VALUE:
3070 if (!Record.empty() && Listener)
3071 Listener->ReadCounter(F, Record[0]);
3072 break;
3073
3074 case FILE_SORTED_DECLS:
3075 F.FileSortedDecls = (const DeclID *)Blob.data();
3076 F.NumFileSortedDecls = Record[0];
3077 break;
3078
3079 case SOURCE_LOCATION_OFFSETS: {
3080 F.SLocEntryOffsets = (const uint32_t *)Blob.data();
3081 F.LocalNumSLocEntries = Record[0];
3082 unsigned SLocSpaceSize = Record[1];
3083 std::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) =
3084 SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries,
3085 SLocSpaceSize);
3086 if (!F.SLocEntryBaseID) {
3087 Error("ran out of source locations");
3088 break;
3089 }
3090 // Make our entry in the range map. BaseID is negative and growing, so
3091 // we invert it. Because we invert it, though, we need the other end of
3092 // the range.
3093 unsigned RangeStart =
3094 unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1;
3095 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F));
3096 F.FirstLoc = SourceLocation::getFromRawEncoding(F.SLocEntryBaseOffset);
3097
3098 // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing.
3099 assert((F.SLocEntryBaseOffset & (1U << 31U)) == 0)(static_cast <bool> ((F.SLocEntryBaseOffset & (1U <<
31U)) == 0) ? void (0) : __assert_fail ("(F.SLocEntryBaseOffset & (1U << 31U)) == 0"
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 3099, __extension__ __PRETTY_FUNCTION__))
;
3100 GlobalSLocOffsetMap.insert(
3101 std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset
3102 - SLocSpaceSize,&F));
3103
3104 // Initialize the remapping table.
3105 // Invalid stays invalid.
3106 F.SLocRemap.insertOrReplace(std::make_pair(0U, 0));
3107 // This module. Base was 2 when being compiled.
3108 F.SLocRemap.insertOrReplace(std::make_pair(2U,
3109 static_cast<int>(F.SLocEntryBaseOffset - 2)));
3110
3111 TotalNumSLocEntries += F.LocalNumSLocEntries;
3112 break;
3113 }
3114
3115 case MODULE_OFFSET_MAP:
3116 F.ModuleOffsetMap = Blob;
3117 break;
3118
3119 case SOURCE_MANAGER_LINE_TABLE:
3120 if (ParseLineTable(F, Record))
3121 return Failure;
3122 break;
3123
3124 case SOURCE_LOCATION_PRELOADS: {
3125 // Need to transform from the local view (1-based IDs) to the global view,
3126 // which is based off F.SLocEntryBaseID.
3127 if (!F.PreloadSLocEntries.empty()) {
3128 Error("Multiple SOURCE_LOCATION_PRELOADS records in AST file");
3129 return Failure;
3130 }
3131
3132 F.PreloadSLocEntries.swap(Record);
3133 break;
3134 }
3135
3136 case EXT_VECTOR_DECLS:
3137 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3138 ExtVectorDecls.push_back(getGlobalDeclID(F, Record[I]));
3139 break;
3140
3141 case VTABLE_USES:
3142 if (Record.size() % 3 != 0) {
3143 Error("Invalid VTABLE_USES record");
3144 return Failure;
3145 }
3146
3147 // Later tables overwrite earlier ones.
3148 // FIXME: Modules will have some trouble with this. This is clearly not
3149 // the right way to do this.
3150 VTableUses.clear();
3151
3152 for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) {
3153 VTableUses.push_back(getGlobalDeclID(F, Record[Idx++]));
3154 VTableUses.push_back(
3155 ReadSourceLocation(F, Record, Idx).getRawEncoding());
3156 VTableUses.push_back(Record[Idx++]);
3157 }
3158 break;
3159
3160 case PENDING_IMPLICIT_INSTANTIATIONS:
3161 if (PendingInstantiations.size() % 2 != 0) {
3162 Error("Invalid existing PendingInstantiations");
3163 return Failure;
3164 }
3165
3166 if (Record.size() % 2 != 0) {
3167 Error("Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
3168 return Failure;
3169 }
3170
3171 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
3172 PendingInstantiations.push_back(getGlobalDeclID(F, Record[I++]));
3173 PendingInstantiations.push_back(
3174 ReadSourceLocation(F, Record, I).getRawEncoding());
3175 }
3176 break;
3177
3178 case SEMA_DECL_REFS:
3179 if (Record.size() != 3) {
3180 Error("Invalid SEMA_DECL_REFS block");
3181 return Failure;
3182 }
3183 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3184 SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
3185 break;
3186
3187 case PPD_ENTITIES_OFFSETS: {
3188 F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data();
3189 assert(Blob.size() % sizeof(PPEntityOffset) == 0)(static_cast <bool> (Blob.size() % sizeof(PPEntityOffset
) == 0) ? void (0) : __assert_fail ("Blob.size() % sizeof(PPEntityOffset) == 0"
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 3189, __extension__ __PRETTY_FUNCTION__))
;
3190 F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset);
3191
3192 unsigned LocalBasePreprocessedEntityID = Record[0];
3193
3194 unsigned StartingID;
3195 if (!PP.getPreprocessingRecord())
3196 PP.createPreprocessingRecord();
3197 if (!PP.getPreprocessingRecord()->getExternalSource())
3198 PP.getPreprocessingRecord()->SetExternalSource(*this);
3199 StartingID
3200 = PP.getPreprocessingRecord()
3201 ->allocateLoadedEntities(F.NumPreprocessedEntities);
3202 F.BasePreprocessedEntityID = StartingID;
3203
3204 if (F.NumPreprocessedEntities > 0) {
3205 // Introduce the global -> local mapping for preprocessed entities in
3206 // this module.
3207 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
3208
3209 // Introduce the local -> global mapping for preprocessed entities in
3210 // this module.
3211 F.PreprocessedEntityRemap.insertOrReplace(
3212 std::make_pair(LocalBasePreprocessedEntityID,
3213 F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID));
3214 }
3215
3216 break;
3217 }
3218
3219 case PPD_SKIPPED_RANGES: {
3220 F.PreprocessedSkippedRangeOffsets = (const PPSkippedRange*)Blob.data();
3221 assert(Blob.size() % sizeof(PPSkippedRange) == 0)(static_cast <bool> (Blob.size() % sizeof(PPSkippedRange
) == 0) ? void (0) : __assert_fail ("Blob.size() % sizeof(PPSkippedRange) == 0"
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 3221, __extension__ __PRETTY_FUNCTION__))
;
3222 F.NumPreprocessedSkippedRanges = Blob.size() / sizeof(PPSkippedRange);
3223
3224 if (!PP.getPreprocessingRecord())
3225 PP.createPreprocessingRecord();
3226 if (!PP.getPreprocessingRecord()->getExternalSource())
3227 PP.getPreprocessingRecord()->SetExternalSource(*this);
3228 F.BasePreprocessedSkippedRangeID = PP.getPreprocessingRecord()
3229 ->allocateSkippedRanges(F.NumPreprocessedSkippedRanges);
3230
3231 if (F.NumPreprocessedSkippedRanges > 0)
3232 GlobalSkippedRangeMap.insert(
3233 std::make_pair(F.BasePreprocessedSkippedRangeID, &F));
3234 break;
3235 }
3236
3237 case DECL_UPDATE_OFFSETS:
3238 if (Record.size() % 2 != 0) {
3239 Error("invalid DECL_UPDATE_OFFSETS block in AST file");
3240 return Failure;
3241 }
3242 for (unsigned I = 0, N = Record.size(); I != N; I += 2) {
3243 GlobalDeclID ID = getGlobalDeclID(F, Record[I]);
3244 DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I + 1]));
3245
3246 // If we've already loaded the decl, perform the updates when we finish
3247 // loading this block.
3248 if (Decl *D = GetExistingDecl(ID))
3249 PendingUpdateRecords.push_back(
3250 PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
3251 }
3252 break;
3253
3254 case OBJC_CATEGORIES_MAP:
3255 if (F.LocalNumObjCCategoriesInMap != 0) {
3256 Error("duplicate OBJC_CATEGORIES_MAP record in AST file");
3257 return Failure;
3258 }
3259
3260 F.LocalNumObjCCategoriesInMap = Record[0];
3261 F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data();
3262 break;
3263
3264 case OBJC_CATEGORIES:
3265 F.ObjCCategories.swap(Record);
3266 break;
3267
3268 case CUDA_SPECIAL_DECL_REFS:
3269 // Later tables overwrite earlier ones.
3270 // FIXME: Modules will have trouble with this.
3271 CUDASpecialDeclRefs.clear();
3272 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3273 CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
3274 break;
3275
3276 case HEADER_SEARCH_TABLE:
3277 F.HeaderFileInfoTableData = Blob.data();
3278 F.LocalNumHeaderFileInfos = Record[1];
3279 if (Record[0]) {
3280 F.HeaderFileInfoTable
3281 = HeaderFileInfoLookupTable::Create(
3282 (const unsigned char *)F.HeaderFileInfoTableData + Record[0],
3283 (const unsigned char *)F.HeaderFileInfoTableData,
3284 HeaderFileInfoTrait(*this, F,
3285 &PP.getHeaderSearchInfo(),
3286 Blob.data() + Record[2]));
3287
3288 PP.getHeaderSearchInfo().SetExternalSource(this);
3289 if (!PP.getHeaderSearchInfo().getExternalLookup())
3290 PP.getHeaderSearchInfo().SetExternalLookup(this);
3291 }
3292 break;
3293
3294 case FP_PRAGMA_OPTIONS:
3295 // Later tables overwrite earlier ones.
3296 FPPragmaOptions.swap(Record);
3297 break;
3298
3299 case OPENCL_EXTENSIONS:
3300 for (unsigned I = 0, E = Record.size(); I != E; ) {
3301 auto Name = ReadString(Record, I);
3302 auto &Opt = OpenCLExtensions.OptMap[Name];
3303 Opt.Supported = Record[I++] != 0;
3304 Opt.Enabled = Record[I++] != 0;
3305 Opt.Avail = Record[I++];
3306 Opt.Core = Record[I++];
3307 }
3308 break;
3309
3310 case OPENCL_EXTENSION_TYPES:
3311 for (unsigned I = 0, E = Record.size(); I != E;) {
3312 auto TypeID = static_cast<::TypeID>(Record[I++]);
3313 auto *Type = GetType(TypeID).getTypePtr();
3314 auto NumExt = static_cast<unsigned>(Record[I++]);
3315 for (unsigned II = 0; II != NumExt; ++II) {
3316 auto Ext = ReadString(Record, I);
3317 OpenCLTypeExtMap[Type].insert(Ext);
3318 }
3319 }
3320 break;
3321
3322 case OPENCL_EXTENSION_DECLS:
3323 for (unsigned I = 0, E = Record.size(); I != E;) {
3324 auto DeclID = static_cast<::DeclID>(Record[I++]);
3325 auto *Decl = GetDecl(DeclID);
3326 auto NumExt = static_cast<unsigned>(Record[I++]);
3327 for (unsigned II = 0; II != NumExt; ++II) {
3328 auto Ext = ReadString(Record, I);
3329 OpenCLDeclExtMap[Decl].insert(Ext);
3330 }
3331 }
3332 break;
3333
3334 case TENTATIVE_DEFINITIONS:
3335 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3336 TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I]));
3337 break;
3338
3339 case KNOWN_NAMESPACES:
3340 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3341 KnownNamespaces.push_back(getGlobalDeclID(F, Record[I]));
3342 break;
3343
3344 case UNDEFINED_BUT_USED:
3345 if (UndefinedButUsed.size() % 2 != 0) {
3346 Error("Invalid existing UndefinedButUsed");
3347 return Failure;
3348 }
3349
3350 if (Record.size() % 2 != 0) {
3351 Error("invalid undefined-but-used record");
3352 return Failure;
3353 }
3354 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
3355 UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++]));
3356 UndefinedButUsed.push_back(
3357 ReadSourceLocation(F, Record, I).getRawEncoding());
3358 }
3359 break;
3360
3361 case DELETE_EXPRS_TO_ANALYZE:
3362 for (unsigned I = 0, N = Record.size(); I != N;) {
3363 DelayedDeleteExprs.push_back(getGlobalDeclID(F, Record[I++]));
3364 const uint64_t Count = Record[I++];
3365 DelayedDeleteExprs.push_back(Count);
3366 for (uint64_t C = 0; C < Count; ++C) {
3367 DelayedDeleteExprs.push_back(ReadSourceLocation(F, Record, I).getRawEncoding());
3368 bool IsArrayForm = Record[I++] == 1;
3369 DelayedDeleteExprs.push_back(IsArrayForm);
3370 }
3371 }
3372 break;
3373
3374 case IMPORTED_MODULES:
3375 if (!F.isModule()) {
3376 // If we aren't loading a module (which has its own exports), make
3377 // all of the imported modules visible.
3378 // FIXME: Deal with macros-only imports.
3379 for (unsigned I = 0, N = Record.size(); I != N; /**/) {
3380 unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]);
3381 SourceLocation Loc = ReadSourceLocation(F, Record, I);
3382 if (GlobalID) {
3383 ImportedModules.push_back(ImportedSubmodule(GlobalID, Loc));
3384 if (DeserializationListener)
3385 DeserializationListener->ModuleImportRead(GlobalID, Loc);
3386 }
3387 }
3388 }
3389 break;
3390
3391 case MACRO_OFFSET: {
3392 if (F.LocalNumMacros != 0) {
3393 Error("duplicate MACRO_OFFSET record in AST file");
3394 return Failure;
3395 }
3396 F.MacroOffsets = (const uint32_t *)Blob.data();
3397 F.LocalNumMacros = Record[0];
3398 unsigned LocalBaseMacroID = Record[1];
3399 F.BaseMacroID = getTotalNumMacros();
3400
3401 if (F.LocalNumMacros > 0) {
3402 // Introduce the global -> local mapping for macros within this module.
3403 GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F));
3404
3405 // Introduce the local -> global mapping for macros within this module.
3406 F.MacroRemap.insertOrReplace(
3407 std::make_pair(LocalBaseMacroID,
3408 F.BaseMacroID - LocalBaseMacroID));
3409
3410 MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros);
3411 }
3412 break;
3413 }
3414
3415 case LATE_PARSED_TEMPLATE:
3416 LateParsedTemplates.append(Record.begin(), Record.end());
3417 break;
3418
3419 case OPTIMIZE_PRAGMA_OPTIONS:
3420 if (Record.size() != 1) {
3421 Error("invalid pragma optimize record");
3422 return Failure;
3423 }
3424 OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]);
3425 break;
3426
3427 case MSSTRUCT_PRAGMA_OPTIONS:
3428 if (Record.size() != 1) {
3429 Error("invalid pragma ms_struct record");
3430 return Failure;
3431 }
3432 PragmaMSStructState = Record[0];
3433 break;
3434
3435 case POINTERS_TO_MEMBERS_PRAGMA_OPTIONS:
3436 if (Record.size() != 2) {
3437 Error("invalid pragma ms_struct record");
3438 return Failure;
3439 }
3440 PragmaMSPointersToMembersState = Record[0];
3441 PointersToMembersPragmaLocation = ReadSourceLocation(F, Record[1]);
3442 break;
3443
3444 case UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES:
3445 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3446 UnusedLocalTypedefNameCandidates.push_back(
3447 getGlobalDeclID(F, Record[I]));
3448 break;
3449
3450 case CUDA_PRAGMA_FORCE_HOST_DEVICE_DEPTH:
3451 if (Record.size() != 1) {
3452 Error("invalid cuda pragma options record");
3453 return Failure;
3454 }
3455 ForceCUDAHostDeviceDepth = Record[0];
3456 break;
3457
3458 case PACK_PRAGMA_OPTIONS: {
3459 if (Record.size() < 3) {
3460 Error("invalid pragma pack record");
3461 return Failure;
3462 }
3463 PragmaPackCurrentValue = Record[0];
3464 PragmaPackCurrentLocation = ReadSourceLocation(F, Record[1]);
3465 unsigned NumStackEntries = Record[2];
3466 unsigned Idx = 3;
3467 // Reset the stack when importing a new module.
3468 PragmaPackStack.clear();
3469 for (unsigned I = 0; I < NumStackEntries; ++I) {
3470 PragmaPackStackEntry Entry;
3471 Entry.Value = Record[Idx++];
3472 Entry.Location = ReadSourceLocation(F, Record[Idx++]);
3473 Entry.PushLocation = ReadSourceLocation(F, Record[Idx++]);
3474 PragmaPackStrings.push_back(ReadString(Record, Idx));
3475 Entry.SlotLabel = PragmaPackStrings.back();
3476 PragmaPackStack.push_back(Entry);
3477 }
3478 break;
3479 }
3480 }
3481 }
3482}
3483
3484void ASTReader::ReadModuleOffsetMap(ModuleFile &F) const {
3485 assert(!F.ModuleOffsetMap.empty() && "no module offset map to read")(static_cast <bool> (!F.ModuleOffsetMap.empty() &&
"no module offset map to read") ? void (0) : __assert_fail (
"!F.ModuleOffsetMap.empty() && \"no module offset map to read\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 3485, __extension__ __PRETTY_FUNCTION__))
;
3486
3487 // Additional remapping information.
3488 const unsigned char *Data = (const unsigned char*)F.ModuleOffsetMap.data();
3489 const unsigned char *DataEnd = Data + F.ModuleOffsetMap.size();
3490 F.ModuleOffsetMap = StringRef();
3491
3492 // If we see this entry before SOURCE_LOCATION_OFFSETS, add placeholders.
3493 if (F.SLocRemap.find(0) == F.SLocRemap.end()) {
3494 F.SLocRemap.insert(std::make_pair(0U, 0));
3495 F.SLocRemap.insert(std::make_pair(2U, 1));
3496 }
3497
3498 // Continuous range maps we may be updating in our module.
3499 using RemapBuilder = ContinuousRangeMap<uint32_t, int, 2>::Builder;
3500 RemapBuilder SLocRemap(F.SLocRemap);
3501 RemapBuilder IdentifierRemap(F.IdentifierRemap);
3502 RemapBuilder MacroRemap(F.MacroRemap);
3503 RemapBuilder PreprocessedEntityRemap(F.PreprocessedEntityRemap);
3504 RemapBuilder SubmoduleRemap(F.SubmoduleRemap);
3505 RemapBuilder SelectorRemap(F.SelectorRemap);
3506 RemapBuilder DeclRemap(F.DeclRemap);
3507 RemapBuilder TypeRemap(F.TypeRemap);
3508
3509 while (Data < DataEnd) {
3510 // FIXME: Looking up dependency modules by filename is horrible. Let's
3511 // start fixing this with prebuilt and explicit modules and see how it
3512 // goes...
3513 using namespace llvm::support;
3514 ModuleKind Kind = static_cast<ModuleKind>(
3515 endian::readNext<uint8_t, little, unaligned>(Data));
3516 uint16_t Len = endian::readNext<uint16_t, little, unaligned>(Data);
3517 StringRef Name = StringRef((const char*)Data, Len);
3518 Data += Len;
3519 ModuleFile *OM = (Kind == MK_PrebuiltModule || Kind == MK_ExplicitModule
3520 ? ModuleMgr.lookupByModuleName(Name)
3521 : ModuleMgr.lookupByFileName(Name));
3522 if (!OM) {
3523 std::string Msg =
3524 "SourceLocation remap refers to unknown module, cannot find ";
3525 Msg.append(Name);
3526 Error(Msg);
3527 return;
3528 }
3529
3530 uint32_t SLocOffset =
3531 endian::readNext<uint32_t, little, unaligned>(Data);
3532 uint32_t IdentifierIDOffset =
3533 endian::readNext<uint32_t, little, unaligned>(Data);
3534 uint32_t MacroIDOffset =
3535 endian::readNext<uint32_t, little, unaligned>(Data);
3536 uint32_t PreprocessedEntityIDOffset =
3537 endian::readNext<uint32_t, little, unaligned>(Data);
3538 uint32_t SubmoduleIDOffset =
3539 endian::readNext<uint32_t, little, unaligned>(Data);
3540 uint32_t SelectorIDOffset =
3541 endian::readNext<uint32_t, little, unaligned>(Data);
3542 uint32_t DeclIDOffset =
3543 endian::readNext<uint32_t, little, unaligned>(Data);
3544 uint32_t TypeIndexOffset =
3545 endian::readNext<uint32_t, little, unaligned>(Data);
3546
3547 uint32_t None = std::numeric_limits<uint32_t>::max();
3548
3549 auto mapOffset = [&](uint32_t Offset, uint32_t BaseOffset,
3550 RemapBuilder &Remap) {
3551 if (Offset != None)
3552 Remap.insert(std::make_pair(Offset,
3553 static_cast<int>(BaseOffset - Offset)));
3554 };
3555 mapOffset(SLocOffset, OM->SLocEntryBaseOffset, SLocRemap);
3556 mapOffset(IdentifierIDOffset, OM->BaseIdentifierID, IdentifierRemap);
3557 mapOffset(MacroIDOffset, OM->BaseMacroID, MacroRemap);
3558 mapOffset(PreprocessedEntityIDOffset, OM->BasePreprocessedEntityID,
3559 PreprocessedEntityRemap);
3560 mapOffset(SubmoduleIDOffset, OM->BaseSubmoduleID, SubmoduleRemap);
3561 mapOffset(SelectorIDOffset, OM->BaseSelectorID, SelectorRemap);
3562 mapOffset(DeclIDOffset, OM->BaseDeclID, DeclRemap);
3563 mapOffset(TypeIndexOffset, OM->BaseTypeIndex, TypeRemap);
3564
3565 // Global -> local mappings.
3566 F.GlobalToLocalDeclIDs[OM] = DeclIDOffset;
3567 }
3568}
3569
3570ASTReader::ASTReadResult
3571ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F,
3572 const ModuleFile *ImportedBy,
3573 unsigned ClientLoadCapabilities) {
3574 unsigned Idx = 0;
3575 F.ModuleMapPath = ReadPath(F, Record, Idx);
3576
3577 // Try to resolve ModuleName in the current header search context and
3578 // verify that it is found in the same module map file as we saved. If the
3579 // top-level AST file is a main file, skip this check because there is no
3580 // usable header search context.
3581 assert(!F.ModuleName.empty() &&(static_cast <bool> (!F.ModuleName.empty() && "MODULE_NAME should come before MODULE_MAP_FILE"
) ? void (0) : __assert_fail ("!F.ModuleName.empty() && \"MODULE_NAME should come before MODULE_MAP_FILE\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 3582, __extension__ __PRETTY_FUNCTION__))
3582 "MODULE_NAME should come before MODULE_MAP_FILE")(static_cast <bool> (!F.ModuleName.empty() && "MODULE_NAME should come before MODULE_MAP_FILE"
) ? void (0) : __assert_fail ("!F.ModuleName.empty() && \"MODULE_NAME should come before MODULE_MAP_FILE\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 3582, __extension__ __PRETTY_FUNCTION__))
;
3583 if (F.Kind == MK_ImplicitModule && ModuleMgr.begin()->Kind != MK_MainFile) {
3584 // An implicitly-loaded module file should have its module listed in some
3585 // module map file that we've already loaded.
3586 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName);
3587 auto &Map = PP.getHeaderSearchInfo().getModuleMap();
3588 const FileEntry *ModMap = M ? Map.getModuleMapFileForUniquing(M) : nullptr;
3589 if (!ModMap) {
3590 assert(ImportedBy && "top-level import should be verified")(static_cast <bool> (ImportedBy && "top-level import should be verified"
) ? void (0) : __assert_fail ("ImportedBy && \"top-level import should be verified\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 3590, __extension__ __PRETTY_FUNCTION__))
;
3591 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) {
3592 if (auto *ASTFE = M ? M->getASTFile() : nullptr) {
3593 // This module was defined by an imported (explicit) module.
3594 Diag(diag::err_module_file_conflict) << F.ModuleName << F.FileName
3595 << ASTFE->getName();
3596 } else {
3597 // This module was built with a different module map.
3598 Diag(diag::err_imported_module_not_found)
3599 << F.ModuleName << F.FileName << ImportedBy->FileName
3600 << F.ModuleMapPath;
3601 // In case it was imported by a PCH, there's a chance the user is
3602 // just missing to include the search path to the directory containing
3603 // the modulemap.
3604 if (ImportedBy->Kind == MK_PCH)
3605 Diag(diag::note_imported_by_pch_module_not_found)
3606 << llvm::sys::path::parent_path(F.ModuleMapPath);
3607 }
3608 }
3609 return OutOfDate;
3610 }
3611
3612 assert(M->Name == F.ModuleName && "found module with different name")(static_cast <bool> (M->Name == F.ModuleName &&
"found module with different name") ? void (0) : __assert_fail
("M->Name == F.ModuleName && \"found module with different name\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 3612, __extension__ __PRETTY_FUNCTION__))
;
3613
3614 // Check the primary module map file.
3615 const FileEntry *StoredModMap = FileMgr.getFile(F.ModuleMapPath);
3616 if (StoredModMap == nullptr || StoredModMap != ModMap) {
3617 assert(ModMap && "found module is missing module map file")(static_cast <bool> (ModMap && "found module is missing module map file"
) ? void (0) : __assert_fail ("ModMap && \"found module is missing module map file\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 3617, __extension__ __PRETTY_FUNCTION__))
;
3618 assert(ImportedBy && "top-level import should be verified")(static_cast <bool> (ImportedBy && "top-level import should be verified"
) ? void (0) : __assert_fail ("ImportedBy && \"top-level import should be verified\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 3618, __extension__ __PRETTY_FUNCTION__))
;
3619 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3620 Diag(diag::err_imported_module_modmap_changed)
3621 << F.ModuleName << ImportedBy->FileName
3622 << ModMap->getName() << F.ModuleMapPath;
3623 return OutOfDate;
3624 }
3625
3626 llvm::SmallPtrSet<const FileEntry *, 1> AdditionalStoredMaps;
3627 for (unsigned I = 0, N = Record[Idx++]; I < N; ++I) {
3628 // FIXME: we should use input files rather than storing names.
3629 std::string Filename = ReadPath(F, Record, Idx);
3630 const FileEntry *F =
3631 FileMgr.getFile(Filename, false, false);
3632 if (F == nullptr) {
3633 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3634 Error("could not find file '" + Filename +"' referenced by AST file");
3635 return OutOfDate;
3636 }
3637 AdditionalStoredMaps.insert(F);
3638 }
3639
3640 // Check any additional module map files (e.g. module.private.modulemap)
3641 // that are not in the pcm.
3642 if (auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) {
3643 for (const FileEntry *ModMap : *AdditionalModuleMaps) {
3644 // Remove files that match
3645 // Note: SmallPtrSet::erase is really remove
3646 if (!AdditionalStoredMaps.erase(ModMap)) {
3647 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3648 Diag(diag::err_module_different_modmap)
3649 << F.ModuleName << /*new*/0 << ModMap->getName();
3650 return OutOfDate;
3651 }
3652 }
3653 }
3654
3655 // Check any additional module map files that are in the pcm, but not
3656 // found in header search. Cases that match are already removed.
3657 for (const FileEntry *ModMap : AdditionalStoredMaps) {
3658 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3659 Diag(diag::err_module_different_modmap)
3660 << F.ModuleName << /*not new*/1 << ModMap->getName();
3661 return OutOfDate;
3662 }
3663 }
3664
3665 if (Listener)
3666 Listener->ReadModuleMapFile(F.ModuleMapPath);
3667 return Success;
3668}
3669
3670/// \brief Move the given method to the back of the global list of methods.
3671static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) {
3672 // Find the entry for this selector in the method pool.
3673 Sema::GlobalMethodPool::iterator Known
3674 = S.MethodPool.find(Method->getSelector());
3675 if (Known == S.MethodPool.end())
3676 return;
3677
3678 // Retrieve the appropriate method list.
3679 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
3680 : Known->second.second;
3681 bool Found = false;
3682 for (ObjCMethodList *List = &Start; List; List = List->getNext()) {
3683 if (!Found) {
3684 if (List->getMethod() == Method) {
3685 Found = true;
3686 } else {
3687 // Keep searching.
3688 continue;
3689 }
3690 }
3691
3692 if (List->getNext())
3693 List->setMethod(List->getNext()->getMethod());
3694 else
3695 List->setMethod(Method);
3696 }
3697}
3698
3699void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner) {
3700 assert(Owner->NameVisibility != Module::Hidden && "nothing to make visible?")(static_cast <bool> (Owner->NameVisibility != Module
::Hidden && "nothing to make visible?") ? void (0) : __assert_fail
("Owner->NameVisibility != Module::Hidden && \"nothing to make visible?\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 3700, __extension__ __PRETTY_FUNCTION__))
;
3701 for (Decl *D : Names) {
3702 bool wasHidden = D->isHidden();
3703 D->setVisibleDespiteOwningModule();
3704
3705 if (wasHidden && SemaObj) {
3706 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) {
3707 moveMethodToBackOfGlobalList(*SemaObj, Method);
3708 }
3709 }
3710 }
3711}
3712
3713void ASTReader::makeModuleVisible(Module *Mod,
3714 Module::NameVisibilityKind NameVisibility,
3715 SourceLocation ImportLoc) {
3716 llvm::SmallPtrSet<Module *, 4> Visited;
3717 SmallVector<Module *, 4> Stack;
3718 Stack.push_back(Mod);
3719 while (!Stack.empty()) {
3720 Mod = Stack.pop_back_val();
3721
3722 if (NameVisibility <= Mod->NameVisibility) {
3723 // This module already has this level of visibility (or greater), so
3724 // there is nothing more to do.
3725 continue;
3726 }
3727
3728 if (!Mod->isAvailable()) {
3729 // Modules that aren't available cannot be made visible.
3730 continue;
3731 }
3732
3733 // Update the module's name visibility.
3734 Mod->NameVisibility = NameVisibility;
3735
3736 // If we've already deserialized any names from this module,
3737 // mark them as visible.
3738 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
3739 if (Hidden != HiddenNamesMap.end()) {
3740 auto HiddenNames = std::move(*Hidden);
3741 HiddenNamesMap.erase(Hidden);
3742 makeNamesVisible(HiddenNames.second, HiddenNames.first);
3743 assert(HiddenNamesMap.find(Mod) == HiddenNamesMap.end() &&(static_cast <bool> (HiddenNamesMap.find(Mod) == HiddenNamesMap
.end() && "making names visible added hidden names") ?
void (0) : __assert_fail ("HiddenNamesMap.find(Mod) == HiddenNamesMap.end() && \"making names visible added hidden names\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 3744, __extension__ __PRETTY_FUNCTION__))
3744 "making names visible added hidden names")(static_cast <bool> (HiddenNamesMap.find(Mod) == HiddenNamesMap
.end() && "making names visible added hidden names") ?
void (0) : __assert_fail ("HiddenNamesMap.find(Mod) == HiddenNamesMap.end() && \"making names visible added hidden names\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 3744, __extension__ __PRETTY_FUNCTION__))
;
3745 }
3746
3747 // Push any exported modules onto the stack to be marked as visible.
3748 SmallVector<Module *, 16> Exports;
3749 Mod->getExportedModules(Exports);
3750 for (SmallVectorImpl<Module *>::iterator
3751 I = Exports.begin(), E = Exports.end(); I != E; ++I) {
3752 Module *Exported = *I;
3753 if (Visited.insert(Exported).second)
3754 Stack.push_back(Exported);
3755 }
3756 }
3757}
3758
3759/// We've merged the definition \p MergedDef into the existing definition
3760/// \p Def. Ensure that \p Def is made visible whenever \p MergedDef is made
3761/// visible.
3762void ASTReader::mergeDefinitionVisibility(NamedDecl *Def,
3763 NamedDecl *MergedDef) {
3764 // FIXME: This doesn't correctly handle the case where MergedDef is visible
3765 // in modules other than its owning module. We should instead give the
3766 // ASTContext a list of merged definitions for Def.
3767 if (Def->isHidden()) {
3768 // If MergedDef is visible or becomes visible, make the definition visible.
3769 if (!MergedDef->isHidden())
3770 Def->setVisibleDespiteOwningModule();
3771 else if (getContext().getLangOpts().ModulesLocalVisibility) {
3772 getContext().mergeDefinitionIntoModule(
3773 Def, MergedDef->getImportedOwningModule(),
3774 /*NotifyListeners*/ false);
3775 PendingMergedDefinitionsToDeduplicate.insert(Def);
3776 } else {
3777 auto SubmoduleID = MergedDef->getOwningModuleID();
3778 assert(SubmoduleID && "hidden definition in no module")(static_cast <bool> (SubmoduleID && "hidden definition in no module"
) ? void (0) : __assert_fail ("SubmoduleID && \"hidden definition in no module\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 3778, __extension__ __PRETTY_FUNCTION__))
;
3779 HiddenNamesMap[getSubmodule(SubmoduleID)].push_back(Def);
3780 }
3781 }
3782}
3783
3784bool ASTReader::loadGlobalIndex() {
3785 if (GlobalIndex)
3786 return false;
3787
3788 if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
3789 !PP.getLangOpts().Modules)
3790 return true;
3791
3792 // Try to load the global index.
3793 TriedLoadingGlobalIndex = true;
3794 StringRef ModuleCachePath
3795 = getPreprocessor().getHeaderSearchInfo().getModuleCachePath();
3796 std::pair<GlobalModuleIndex *, GlobalModuleIndex::ErrorCode> Result
3797 = GlobalModuleIndex::readIndex(ModuleCachePath);
3798 if (!Result.first)
3799 return true;
3800
3801 GlobalIndex.reset(Result.first);
3802 ModuleMgr.setGlobalIndex(GlobalIndex.get());
3803 return false;
3804}
3805
3806bool ASTReader::isGlobalIndexUnavailable() const {
3807 return PP.getLangOpts().Modules && UseGlobalIndex &&
3808 !hasGlobalIndex() && TriedLoadingGlobalIndex;
3809}
3810
3811static void updateModuleTimestamp(ModuleFile &MF) {
3812 // Overwrite the timestamp file contents so that file's mtime changes.
3813 std::string TimestampFilename = MF.getTimestampFilename();
3814 std::error_code EC;
3815 llvm::raw_fd_ostream OS(TimestampFilename, EC, llvm::sys::fs::F_Text);
3816 if (EC)
3817 return;
3818 OS << "Timestamp file\n";
3819 OS.close();
3820 OS.clear_error(); // Avoid triggering a fatal error.
3821}
3822
3823/// \brief Given a cursor at the start of an AST file, scan ahead and drop the
3824/// cursor into the start of the given block ID, returning false on success and
3825/// true on failure.
3826static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) {
3827 while (true) {
3828 llvm::BitstreamEntry Entry = Cursor.advance();
3829 switch (Entry.Kind) {
3830 case llvm::BitstreamEntry::Error:
3831 case llvm::BitstreamEntry::EndBlock:
3832 return true;
3833
3834 case llvm::BitstreamEntry::Record:
3835 // Ignore top-level records.
3836 Cursor.skipRecord(Entry.ID);
3837 break;
3838
3839 case llvm::BitstreamEntry::SubBlock:
3840 if (Entry.ID == BlockID) {
3841 if (Cursor.EnterSubBlock(BlockID))
3842 return true;
3843 // Found it!
3844 return false;
3845 }
3846
3847 if (Cursor.SkipBlock())
3848 return true;
3849 }
3850 }
3851}
3852
3853ASTReader::ASTReadResult ASTReader::ReadAST(StringRef FileName,
3854 ModuleKind Type,
3855 SourceLocation ImportLoc,
3856 unsigned ClientLoadCapabilities,
3857 SmallVectorImpl<ImportedSubmodule> *Imported) {
3858 llvm::SaveAndRestore<SourceLocation>
3859 SetCurImportLocRAII(CurrentImportLoc, ImportLoc);
3860
3861 // Defer any pending actions until we get to the end of reading the AST file.
3862 Deserializing AnASTFile(this);
3863
3864 // Bump the generation number.
3865 unsigned PreviousGeneration = 0;
3866 if (ContextObj)
3867 PreviousGeneration = incrementGeneration(*ContextObj);
3868
3869 unsigned NumModules = ModuleMgr.size();
3870 SmallVector<ImportedModule, 4> Loaded;
3871 switch (ASTReadResult ReadResult =
3872 ReadASTCore(FileName, Type, ImportLoc,
3873 /*ImportedBy=*/nullptr, Loaded, 0, 0,
3874 ASTFileSignature(), ClientLoadCapabilities)) {
3875 case Failure:
3876 case Missing:
3877 case OutOfDate:
3878 case VersionMismatch:
3879 case ConfigurationMismatch:
3880 case HadErrors: {
3881 llvm::SmallPtrSet<ModuleFile *, 4> LoadedSet;
3882 for (const ImportedModule &IM : Loaded)
3883 LoadedSet.insert(IM.Mod);
3884
3885 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, LoadedSet,
3886 PP.getLangOpts().Modules
3887 ? &PP.getHeaderSearchInfo().getModuleMap()
3888 : nullptr);
3889
3890 // If we find that any modules are unusable, the global index is going
3891 // to be out-of-date. Just remove it.
3892 GlobalIndex.reset();
3893 ModuleMgr.setGlobalIndex(nullptr);
3894 return ReadResult;
3895 }
3896 case Success:
3897 break;
3898 }
3899
3900 // Here comes stuff that we only do once the entire chain is loaded.
3901
3902 // Load the AST blocks of all of the modules that we loaded.
3903 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
3904 MEnd = Loaded.end();
3905 M != MEnd; ++M) {
3906 ModuleFile &F = *M->Mod;
3907
3908 // Read the AST block.
3909 if (ASTReadResult Result = ReadASTBlock(F, ClientLoadCapabilities))
3910 return Result;
3911
3912 // Read the extension blocks.
3913 while (!SkipCursorToBlock(F.Stream, EXTENSION_BLOCK_ID)) {
3914 if (ASTReadResult Result = ReadExtensionBlock(F))
3915 return Result;
3916 }
3917
3918 // Once read, set the ModuleFile bit base offset and update the size in
3919 // bits of all files we've seen.
3920 F.GlobalBitOffset = TotalModulesSizeInBits;
3921 TotalModulesSizeInBits += F.SizeInBits;
3922 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F));
3923
3924 // Preload SLocEntries.
3925 for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) {
3926 int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID;
3927 // Load it through the SourceManager and don't call ReadSLocEntry()
3928 // directly because the entry may have already been loaded in which case
3929 // calling ReadSLocEntry() directly would trigger an assertion in
3930 // SourceManager.
3931 SourceMgr.getLoadedSLocEntryByID(Index);
3932 }
3933
3934 // Map the original source file ID into the ID space of the current
3935 // compilation.
3936 if (F.OriginalSourceFileID.isValid()) {
3937 F.OriginalSourceFileID = FileID::get(
3938 F.SLocEntryBaseID + F.OriginalSourceFileID.getOpaqueValue() - 1);
3939 }
3940
3941 // Preload all the pending interesting identifiers by marking them out of
3942 // date.
3943 for (auto Offset : F.PreloadIdentifierOffsets) {
3944 const unsigned char *Data = reinterpret_cast<const unsigned char *>(
3945 F.IdentifierTableData + Offset);
3946
3947 ASTIdentifierLookupTrait Trait(*this, F);
3948 auto KeyDataLen = Trait.ReadKeyDataLength(Data);
3949 auto Key = Trait.ReadKey(Data, KeyDataLen.first);
3950 auto &II = PP.getIdentifierTable().getOwn(Key);
3951 II.setOutOfDate(true);
3952
3953 // Mark this identifier as being from an AST file so that we can track
3954 // whether we need to serialize it.
3955 markIdentifierFromAST(*this, II);
3956
3957 // Associate the ID with the identifier so that the writer can reuse it.
3958 auto ID = Trait.ReadIdentifierID(Data + KeyDataLen.first);
3959 SetIdentifierInfo(ID, &II);
3960 }
3961 }
3962
3963 // Setup the import locations and notify the module manager that we've
3964 // committed to these module files.
3965 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
3966 MEnd = Loaded.end();
3967 M != MEnd; ++M) {
3968 ModuleFile &F = *M->Mod;
3969
3970 ModuleMgr.moduleFileAccepted(&F);
3971
3972 // Set the import location.
3973 F.DirectImportLoc = ImportLoc;
3974 // FIXME: We assume that locations from PCH / preamble do not need
3975 // any translation.
3976 if (!M->ImportedBy)
3977 F.ImportLoc = M->ImportLoc;
3978 else
3979 F.ImportLoc = TranslateSourceLocation(*M->ImportedBy, M->ImportLoc);
3980 }
3981
3982 if (!PP.getLangOpts().CPlusPlus ||
3983 (Type != MK_ImplicitModule && Type != MK_ExplicitModule &&
3984 Type != MK_PrebuiltModule)) {
3985 // Mark all of the identifiers in the identifier table as being out of date,
3986 // so that various accessors know to check the loaded modules when the
3987 // identifier is used.
3988 //
3989 // For C++ modules, we don't need information on many identifiers (just
3990 // those that provide macros or are poisoned), so we mark all of
3991 // the interesting ones via PreloadIdentifierOffsets.
3992 for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(),
3993 IdEnd = PP.getIdentifierTable().end();
3994 Id != IdEnd; ++Id)
3995 Id->second->setOutOfDate(true);
3996 }
3997 // Mark selectors as out of date.
3998 for (auto Sel : SelectorGeneration)
3999 SelectorOutOfDate[Sel.first] = true;
4000
4001 // Resolve any unresolved module exports.
4002 for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) {
4003 UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I];
4004 SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID);
4005 Module *ResolvedMod = getSubmodule(GlobalID);
4006
4007 switch (Unresolved.Kind) {
4008 case UnresolvedModuleRef::Conflict:
4009 if (ResolvedMod) {
4010 Module::Conflict Conflict;
4011 Conflict.Other = ResolvedMod;
4012 Conflict.Message = Unresolved.String.str();
4013 Unresolved.Mod->Conflicts.push_back(Conflict);
4014 }
4015 continue;
4016
4017 case UnresolvedModuleRef::Import:
4018 if (ResolvedMod)
4019 Unresolved.Mod->Imports.insert(ResolvedMod);
4020 continue;
4021
4022 case UnresolvedModuleRef::Export:
4023 if (ResolvedMod || Unresolved.IsWildcard)
4024 Unresolved.Mod->Exports.push_back(
4025 Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard));
4026 continue;
4027 }
4028 }
4029 UnresolvedModuleRefs.clear();
4030
4031 if (Imported)
4032 Imported->append(ImportedModules.begin(),
4033 ImportedModules.end());
4034
4035 // FIXME: How do we load the 'use'd modules? They may not be submodules.
4036 // Might be unnecessary as use declarations are only used to build the
4037 // module itself.
4038
4039 if (ContextObj)
4040 InitializeContext();
4041
4042 if (SemaObj)
4043 UpdateSema();
4044
4045 if (DeserializationListener)
4046 DeserializationListener->ReaderInitialized(this);
4047
4048 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
4049 if (PrimaryModule.OriginalSourceFileID.isValid()) {
4050 // If this AST file is a precompiled preamble, then set the
4051 // preamble file ID of the source manager to the file source file
4052 // from which the preamble was built.
4053 if (Type == MK_Preamble) {
4054 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID);
4055 } else if (Type == MK_MainFile) {
4056 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID);
4057 }
4058 }
4059
4060 // For any Objective-C class definitions we have already loaded, make sure
4061 // that we load any additional categories.
4062 if (ContextObj) {
4063 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
4064 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
4065 ObjCClassesLoaded[I],
4066 PreviousGeneration);
4067 }
4068 }
4069
4070 if (PP.getHeaderSearchInfo()
4071 .getHeaderSearchOpts()
4072 .ModulesValidateOncePerBuildSession) {
4073 // Now we are certain that the module and all modules it depends on are
4074 // up to date. Create or update timestamp files for modules that are
4075 // located in the module cache (not for PCH files that could be anywhere
4076 // in the filesystem).
4077 for (unsigned I = 0, N = Loaded.size(); I != N; ++I) {
4078 ImportedModule &M = Loaded[I];
4079 if (M.Mod->Kind == MK_ImplicitModule) {
4080 updateModuleTimestamp(*M.Mod);
4081 }
4082 }
4083 }
4084
4085 return Success;
4086}
4087
4088static ASTFileSignature readASTFileSignature(StringRef PCH);
4089
4090/// \brief Whether \p Stream starts with the AST/PCH file magic number 'CPCH'.
4091static bool startsWithASTFileMagic(BitstreamCursor &Stream) {
4092 return Stream.canSkipToPos(4) &&
4093 Stream.Read(8) == 'C' &&
4094 Stream.Read(8) == 'P' &&
4095 Stream.Read(8) == 'C' &&
4096 Stream.Read(8) == 'H';
4097}
4098
4099static unsigned moduleKindForDiagnostic(ModuleKind Kind) {
4100 switch (Kind) {
4101 case MK_PCH:
4102 return 0; // PCH
4103 case MK_ImplicitModule:
4104 case MK_ExplicitModule:
4105 case MK_PrebuiltModule:
4106 return 1; // module
4107 case MK_MainFile:
4108 case MK_Preamble:
4109 return 2; // main source file
4110 }
4111 llvm_unreachable("unknown module kind")::llvm::llvm_unreachable_internal("unknown module kind", "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 4111)
;
4112}
4113
4114ASTReader::ASTReadResult
4115ASTReader::ReadASTCore(StringRef FileName,
4116 ModuleKind Type,
4117 SourceLocation ImportLoc,
4118 ModuleFile *ImportedBy,
4119 SmallVectorImpl<ImportedModule> &Loaded,
4120 off_t ExpectedSize, time_t ExpectedModTime,
4121 ASTFileSignature ExpectedSignature,
4122 unsigned ClientLoadCapabilities) {
4123 ModuleFile *M;
4124 std::string ErrorStr;
4125 ModuleManager::AddModuleResult AddResult
4126 = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy,
4127 getGeneration(), ExpectedSize, ExpectedModTime,
4128 ExpectedSignature, readASTFileSignature,
4129 M, ErrorStr);
4130
4131 switch (AddResult) {
4132 case ModuleManager::AlreadyLoaded:
4133 return Success;
4134
4135 case ModuleManager::NewlyLoaded:
4136 // Load module file below.
4137 break;
4138
4139 case ModuleManager::Missing:
4140 // The module file was missing; if the client can handle that, return
4141 // it.
4142 if (ClientLoadCapabilities & ARR_Missing)
4143 return Missing;
4144
4145 // Otherwise, return an error.
4146 Diag(diag::err_module_file_not_found) << moduleKindForDiagnostic(Type)
4147 << FileName << !ErrorStr.empty()
4148 << ErrorStr;
4149 return Failure;
4150
4151 case ModuleManager::OutOfDate:
4152 // We couldn't load the module file because it is out-of-date. If the
4153 // client can handle out-of-date, return it.
4154 if (ClientLoadCapabilities & ARR_OutOfDate)
4155 return OutOfDate;
4156
4157 // Otherwise, return an error.
4158 Diag(diag::err_module_file_out_of_date) << moduleKindForDiagnostic(Type)
4159 << FileName << !ErrorStr.empty()
4160 << ErrorStr;
4161 return Failure;
4162 }
4163
4164 assert(M && "Missing module file")(static_cast <bool> (M && "Missing module file"
) ? void (0) : __assert_fail ("M && \"Missing module file\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 4164, __extension__ __PRETTY_FUNCTION__))
;
4165
4166 ModuleFile &F = *M;
4167 BitstreamCursor &Stream = F.Stream;
4168 Stream = BitstreamCursor(PCHContainerRdr.ExtractPCH(*F.Buffer));
4169 F.SizeInBits = F.Buffer->getBufferSize() * 8;
4170
4171 // Sniff for the signature.
4172 if (!startsWithASTFileMagic(Stream)) {
4173 Diag(diag::err_module_file_invalid) << moduleKindForDiagnostic(Type)
4174 << FileName;
4175 return Failure;
4176 }
4177
4178 // This is used for compatibility with older PCH formats.
4179 bool HaveReadControlBlock = false;
4180 while (true) {
4181 llvm::BitstreamEntry Entry = Stream.advance();
4182
4183 switch (Entry.Kind) {
4184 case llvm::BitstreamEntry::Error:
4185 case llvm::BitstreamEntry::Record:
4186 case llvm::BitstreamEntry::EndBlock:
4187 Error("invalid record at top-level of AST file");
4188 return Failure;
4189
4190 case llvm::BitstreamEntry::SubBlock:
4191 break;
4192 }
4193
4194 switch (Entry.ID) {
4195 case CONTROL_BLOCK_ID:
4196 HaveReadControlBlock = true;
4197 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
4198 case Success:
4199 // Check that we didn't try to load a non-module AST file as a module.
4200 //
4201 // FIXME: Should we also perform the converse check? Loading a module as
4202 // a PCH file sort of works, but it's a bit wonky.
4203 if ((Type == MK_ImplicitModule || Type == MK_ExplicitModule ||
4204 Type == MK_PrebuiltModule) &&
4205 F.ModuleName.empty()) {
4206 auto Result = (Type == MK_ImplicitModule) ? OutOfDate : Failure;
4207 if (Result != OutOfDate ||
4208 (ClientLoadCapabilities & ARR_OutOfDate) == 0)
4209 Diag(diag::err_module_file_not_module) << FileName;
4210 return Result;
4211 }
4212 break;
4213
4214 case Failure: return Failure;
4215 case Missing: return Missing;
4216 case OutOfDate: return OutOfDate;
4217 case VersionMismatch: return VersionMismatch;
4218 case ConfigurationMismatch: return ConfigurationMismatch;
4219 case HadErrors: return HadErrors;
4220 }
4221 break;
4222
4223 case AST_BLOCK_ID:
4224 if (!HaveReadControlBlock) {
4225 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
4226 Diag(diag::err_pch_version_too_old);
4227 return VersionMismatch;
4228 }
4229
4230 // Record that we've loaded this module.
4231 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc));
4232 return Success;
4233
4234 case UNHASHED_CONTROL_BLOCK_ID:
4235 // This block is handled using look-ahead during ReadControlBlock. We
4236 // shouldn't get here!
4237 Error("malformed block record in AST file");
4238 return Failure;
4239
4240 default:
4241 if (Stream.SkipBlock()) {
4242 Error("malformed block record in AST file");
4243 return Failure;
4244 }
4245 break;
4246 }
4247 }
4248
4249 return Success;
4250}
4251
4252ASTReader::ASTReadResult
4253ASTReader::readUnhashedControlBlock(ModuleFile &F, bool WasImportedBy,
4254 unsigned ClientLoadCapabilities) {
4255 const HeaderSearchOptions &HSOpts =
4256 PP.getHeaderSearchInfo().getHeaderSearchOpts();
4257 bool AllowCompatibleConfigurationMismatch =
4258 F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule;
4259
4260 ASTReadResult Result = readUnhashedControlBlockImpl(
4261 &F, F.Data, ClientLoadCapabilities, AllowCompatibleConfigurationMismatch,
4262 Listener.get(),
4263 WasImportedBy ? false : HSOpts.ModulesValidateDiagnosticOptions);
4264
4265 // If F was directly imported by another module, it's implicitly validated by
4266 // the importing module.
4267 if (DisableValidation || WasImportedBy ||
4268 (AllowConfigurationMismatch && Result == ConfigurationMismatch))
4269 return Success;
4270
4271 if (Result == Failure) {
4272 Error("malformed block record in AST file");
4273 return Failure;
4274 }
4275
4276 if (Result == OutOfDate && F.Kind == MK_ImplicitModule) {
4277 // If this module has already been finalized in the PCMCache, we're stuck
4278 // with it; we can only load a single version of each module.
4279 //
4280 // This can happen when a module is imported in two contexts: in one, as a
4281 // user module; in another, as a system module (due to an import from
4282 // another module marked with the [system] flag). It usually indicates a
4283 // bug in the module map: this module should also be marked with [system].
4284 //
4285 // If -Wno-system-headers (the default), and the first import is as a
4286 // system module, then validation will fail during the as-user import,
4287 // since -Werror flags won't have been validated. However, it's reasonable
4288 // to treat this consistently as a system module.
4289 //
4290 // If -Wsystem-headers, the PCM on disk was built with
4291 // -Wno-system-headers, and the first import is as a user module, then
4292 // validation will fail during the as-system import since the PCM on disk
4293 // doesn't guarantee that -Werror was respected. However, the -Werror
4294 // flags were checked during the initial as-user import.
4295 if (PCMCache.isBufferFinal(F.FileName)) {
4296 Diag(diag::warn_module_system_bit_conflict) << F.FileName;
4297 return Success;
4298 }
4299 }
4300
4301 return Result;
4302}
4303
4304ASTReader::ASTReadResult ASTReader::readUnhashedControlBlockImpl(
4305 ModuleFile *F, llvm::StringRef StreamData, unsigned ClientLoadCapabilities,
4306 bool AllowCompatibleConfigurationMismatch, ASTReaderListener *Listener,
4307 bool ValidateDiagnosticOptions) {
4308 // Initialize a stream.
4309 BitstreamCursor Stream(StreamData);
4310
4311 // Sniff for the signature.
4312 if (!startsWithASTFileMagic(Stream))
4313 return Failure;
4314
4315 // Scan for the UNHASHED_CONTROL_BLOCK_ID block.
4316 if (SkipCursorToBlock(Stream, UNHASHED_CONTROL_BLOCK_ID))
4317 return Failure;
4318
4319 // Read all of the records in the options block.
4320 RecordData Record;
4321 ASTReadResult Result = Success;
4322 while (true) {
4323 llvm::BitstreamEntry Entry = Stream.advance();
4324
4325 switch (Entry.Kind) {
4326 case llvm::BitstreamEntry::Error:
4327 case llvm::BitstreamEntry::SubBlock:
4328 return Failure;
4329
4330 case llvm::BitstreamEntry::EndBlock:
4331 return Result;
4332
4333 case llvm::BitstreamEntry::Record:
4334 // The interesting case.
4335 break;
4336 }
4337
4338 // Read and process a record.
4339 Record.clear();
4340 switch (
4341 (UnhashedControlBlockRecordTypes)Stream.readRecord(Entry.ID, Record)) {
4342 case SIGNATURE:
4343 if (F)
4344 std::copy(Record.begin(), Record.end(), F->Signature.data());
4345 break;
4346 case DIAGNOSTIC_OPTIONS: {
4347 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
4348 if (Listener && ValidateDiagnosticOptions &&
4349 !AllowCompatibleConfigurationMismatch &&
4350 ParseDiagnosticOptions(Record, Complain, *Listener))
4351 Result = OutOfDate; // Don't return early. Read the signature.
4352 break;
4353 }
4354 case DIAG_PRAGMA_MAPPINGS:
4355 if (!F)
4356 break;
4357 if (F->PragmaDiagMappings.empty())
4358 F->PragmaDiagMappings.swap(Record);
4359 else
4360 F->PragmaDiagMappings.insert(F->PragmaDiagMappings.end(),
4361 Record.begin(), Record.end());
4362 break;
4363 }
4364 }
4365}
4366
4367/// Parse a record and blob containing module file extension metadata.
4368static bool parseModuleFileExtensionMetadata(
4369 const SmallVectorImpl<uint64_t> &Record,
4370 StringRef Blob,
4371 ModuleFileExtensionMetadata &Metadata) {
4372 if (Record.size() < 4) return true;
4373
4374 Metadata.MajorVersion = Record[0];
4375 Metadata.MinorVersion = Record[1];
4376
4377 unsigned BlockNameLen = Record[2];
4378 unsigned UserInfoLen = Record[3];
4379
4380 if (BlockNameLen + UserInfoLen > Blob.size()) return true;
4381
4382 Metadata.BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen);
4383 Metadata.UserInfo = std::string(Blob.data() + BlockNameLen,
4384 Blob.data() + BlockNameLen + UserInfoLen);
4385 return false;
4386}
4387
4388ASTReader::ASTReadResult ASTReader::ReadExtensionBlock(ModuleFile &F) {
4389 BitstreamCursor &Stream = F.Stream;
4390
4391 RecordData Record;
4392 while (true) {
4393 llvm::BitstreamEntry Entry = Stream.advance();
4394 switch (Entry.Kind) {
4395 case llvm::BitstreamEntry::SubBlock:
4396 if (Stream.SkipBlock())
4397 return Failure;
4398
4399 continue;
4400
4401 case llvm::BitstreamEntry::EndBlock:
4402 return Success;
4403
4404 case llvm::BitstreamEntry::Error:
4405 return HadErrors;
4406
4407 case llvm::BitstreamEntry::Record:
4408 break;
4409 }
4410
4411 Record.clear();
4412 StringRef Blob;
4413 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob);
4414 switch (RecCode) {
4415 case EXTENSION_METADATA: {
4416 ModuleFileExtensionMetadata Metadata;
4417 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata))
4418 return Failure;
4419
4420 // Find a module file extension with this block name.
4421 auto Known = ModuleFileExtensions.find(Metadata.BlockName);
4422 if (Known == ModuleFileExtensions.end()) break;
4423
4424 // Form a reader.
4425 if (auto Reader = Known->second->createExtensionReader(Metadata, *this,
4426 F, Stream)) {
4427 F.ExtensionReaders.push_back(std::move(Reader));
4428 }
4429
4430 break;
4431 }
4432 }
4433 }
4434
4435 return Success;
4436}
4437
4438void ASTReader::InitializeContext() {
4439 assert(ContextObj && "no context to initialize")(static_cast <bool> (ContextObj && "no context to initialize"
) ? void (0) : __assert_fail ("ContextObj && \"no context to initialize\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 4439, __extension__ __PRETTY_FUNCTION__))
;
4440 ASTContext &Context = *ContextObj;
4441
4442 // If there's a listener, notify them that we "read" the translation unit.
4443 if (DeserializationListener)
4444 DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID,
4445 Context.getTranslationUnitDecl());
4446
4447 // FIXME: Find a better way to deal with collisions between these
4448 // built-in types. Right now, we just ignore the problem.
4449
4450 // Load the special types.
4451 if (SpecialTypes.size() >= NumSpecialTypeIDs) {
4452 if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) {
4453 if (!Context.CFConstantStringTypeDecl)
4454 Context.setCFConstantStringType(GetType(String));
4455 }
4456
4457 if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) {
4458 QualType FileType = GetType(File);
4459 if (FileType.isNull()) {
4460 Error("FILE type is NULL");
4461 return;
4462 }
4463
4464 if (!Context.FILEDecl) {
4465 if (const TypedefType *Typedef = FileType->getAs<TypedefType>())
4466 Context.setFILEDecl(Typedef->getDecl());
4467 else {
4468 const TagType *Tag = FileType->getAs<TagType>();
4469 if (!Tag) {
4470 Error("Invalid FILE type in AST file");
4471 return;
4472 }
4473 Context.setFILEDecl(Tag->getDecl());
4474 }
4475 }
4476 }
4477
4478 if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) {
4479 QualType Jmp_bufType = GetType(Jmp_buf);
4480 if (Jmp_bufType.isNull()) {
4481 Error("jmp_buf type is NULL");
4482 return;
4483 }
4484
4485 if (!Context.jmp_bufDecl) {
4486 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>())
4487 Context.setjmp_bufDecl(Typedef->getDecl());
4488 else {
4489 const TagType *Tag = Jmp_bufType->getAs<TagType>();
4490 if (!Tag) {
4491 Error("Invalid jmp_buf type in AST file");
4492 return;
4493 }
4494 Context.setjmp_bufDecl(Tag->getDecl());
4495 }
4496 }
4497 }
4498
4499 if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) {
4500 QualType Sigjmp_bufType = GetType(Sigjmp_buf);
4501 if (Sigjmp_bufType.isNull()) {
4502 Error("sigjmp_buf type is NULL");
4503 return;
4504 }
4505
4506 if (!Context.sigjmp_bufDecl) {
4507 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>())
4508 Context.setsigjmp_bufDecl(Typedef->getDecl());
4509 else {
4510 const TagType *Tag = Sigjmp_bufType->getAs<TagType>();
4511 assert(Tag && "Invalid sigjmp_buf type in AST file")(static_cast <bool> (Tag && "Invalid sigjmp_buf type in AST file"
) ? void (0) : __assert_fail ("Tag && \"Invalid sigjmp_buf type in AST file\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 4511, __extension__ __PRETTY_FUNCTION__))
;
4512 Context.setsigjmp_bufDecl(Tag->getDecl());
4513 }
4514 }
4515 }
4516
4517 if (unsigned ObjCIdRedef
4518 = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) {
4519 if (Context.ObjCIdRedefinitionType.isNull())
4520 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef);
4521 }
4522
4523 if (unsigned ObjCClassRedef
4524 = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) {
4525 if (Context.ObjCClassRedefinitionType.isNull())
4526 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef);
4527 }
4528
4529 if (unsigned ObjCSelRedef
4530 = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) {
4531 if (Context.ObjCSelRedefinitionType.isNull())
4532 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef);
4533 }
4534
4535 if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) {
4536 QualType Ucontext_tType = GetType(Ucontext_t);
4537 if (Ucontext_tType.isNull()) {
4538 Error("ucontext_t type is NULL");
4539 return;
4540 }
4541
4542 if (!Context.ucontext_tDecl) {
4543 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>())
4544 Context.setucontext_tDecl(Typedef->getDecl());
4545 else {
4546 const TagType *Tag = Ucontext_tType->getAs<TagType>();
4547 assert(Tag && "Invalid ucontext_t type in AST file")(static_cast <bool> (Tag && "Invalid ucontext_t type in AST file"
) ? void (0) : __assert_fail ("Tag && \"Invalid ucontext_t type in AST file\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 4547, __extension__ __PRETTY_FUNCTION__))
;
4548 Context.setucontext_tDecl(Tag->getDecl());
4549 }
4550 }
4551 }
4552 }
4553
4554 ReadPragmaDiagnosticMappings(Context.getDiagnostics());
4555
4556 // If there were any CUDA special declarations, deserialize them.
4557 if (!CUDASpecialDeclRefs.empty()) {
4558 assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!")(static_cast <bool> (CUDASpecialDeclRefs.size() == 1 &&
"More decl refs than expected!") ? void (0) : __assert_fail (
"CUDASpecialDeclRefs.size() == 1 && \"More decl refs than expected!\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 4558, __extension__ __PRETTY_FUNCTION__))
;
4559 Context.setcudaConfigureCallDecl(
4560 cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0])));
4561 }
4562
4563 // Re-export any modules that were imported by a non-module AST file.
4564 // FIXME: This does not make macro-only imports visible again.
4565 for (auto &Import : ImportedModules) {
4566 if (Module *Imported = getSubmodule(Import.ID)) {
4567 makeModuleVisible(Imported, Module::AllVisible,
4568 /*ImportLoc=*/Import.ImportLoc);
4569 if (Import.ImportLoc.isValid())
4570 PP.makeModuleVisible(Imported, Import.ImportLoc);
4571 // FIXME: should we tell Sema to make the module visible too?
4572 }
4573 }
4574 ImportedModules.clear();
4575}
4576
4577void ASTReader::finalizeForWriting() {
4578 // Nothing to do for now.
4579}
4580
4581/// \brief Reads and return the signature record from \p PCH's control block, or
4582/// else returns 0.
4583static ASTFileSignature readASTFileSignature(StringRef PCH) {
4584 BitstreamCursor Stream(PCH);
4585 if (!startsWithASTFileMagic(Stream))
4586 return ASTFileSignature();
4587
4588 // Scan for the UNHASHED_CONTROL_BLOCK_ID block.
4589 if (SkipCursorToBlock(Stream, UNHASHED_CONTROL_BLOCK_ID))
4590 return ASTFileSignature();
4591
4592 // Scan for SIGNATURE inside the diagnostic options block.
4593 ASTReader::RecordData Record;
4594 while (true) {
4595 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
4596 if (Entry.Kind != llvm::BitstreamEntry::Record)
4597 return ASTFileSignature();
4598
4599 Record.clear();
4600 StringRef Blob;
4601 if (SIGNATURE == Stream.readRecord(Entry.ID, Record, &Blob))
4602 return {{{(uint32_t)Record[0], (uint32_t)Record[1], (uint32_t)Record[2],
4603 (uint32_t)Record[3], (uint32_t)Record[4]}}};
4604 }
4605}
4606
4607/// \brief Retrieve the name of the original source file name
4608/// directly from the AST file, without actually loading the AST
4609/// file.
4610std::string ASTReader::getOriginalSourceFile(
4611 const std::string &ASTFileName, FileManager &FileMgr,
4612 const PCHContainerReader &PCHContainerRdr, DiagnosticsEngine &Diags) {
4613 // Open the AST file.
4614 auto Buffer = FileMgr.getBufferForFile(ASTFileName);
4615 if (!Buffer) {
4616 Diags.Report(diag::err_fe_unable_to_read_pch_file)
4617 << ASTFileName << Buffer.getError().message();
4618 return std::string();
4619 }
4620
4621 // Initialize the stream
4622 BitstreamCursor Stream(PCHContainerRdr.ExtractPCH(**Buffer));
4623
4624 // Sniff for the signature.
4625 if (!startsWithASTFileMagic(Stream)) {
4626 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName;
4627 return std::string();
4628 }
4629
4630 // Scan for the CONTROL_BLOCK_ID block.
4631 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) {
4632 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
4633 return std::string();
4634 }
4635
4636 // Scan for ORIGINAL_FILE inside the control block.
4637 RecordData Record;
4638 while (true) {
4639 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
4640 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
4641 return std::string();
4642
4643 if (Entry.Kind != llvm::BitstreamEntry::Record) {
4644 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
4645 return std::string();
4646 }
4647
4648 Record.clear();
4649 StringRef Blob;
4650 if (Stream.readRecord(Entry.ID, Record, &Blob) == ORIGINAL_FILE)
4651 return Blob.str();
4652 }
4653}
4654
4655namespace {
4656
4657 class SimplePCHValidator : public ASTReaderListener {
4658 const LangOptions &ExistingLangOpts;
4659 const TargetOptions &ExistingTargetOpts;
4660 const PreprocessorOptions &ExistingPPOpts;
4661 std::string ExistingModuleCachePath;
4662 FileManager &FileMgr;
4663
4664 public:
4665 SimplePCHValidator(const LangOptions &ExistingLangOpts,
4666 const TargetOptions &ExistingTargetOpts,
4667 const PreprocessorOptions &ExistingPPOpts,
4668 StringRef ExistingModuleCachePath,
4669 FileManager &FileMgr)
4670 : ExistingLangOpts(ExistingLangOpts),
4671 ExistingTargetOpts(ExistingTargetOpts),
4672 ExistingPPOpts(ExistingPPOpts),
4673 ExistingModuleCachePath(ExistingModuleCachePath),
4674 FileMgr(FileMgr) {}
4675
4676 bool ReadLanguageOptions(const LangOptions &LangOpts, bool Complain,
4677 bool AllowCompatibleDifferences) override {
4678 return checkLanguageOptions(ExistingLangOpts, LangOpts, nullptr,
4679 AllowCompatibleDifferences);
4680 }
4681
4682 bool ReadTargetOptions(const TargetOptions &TargetOpts, bool Complain,
4683 bool AllowCompatibleDifferences) override {
4684 return checkTargetOptions(ExistingTargetOpts, TargetOpts, nullptr,
4685 AllowCompatibleDifferences);
4686 }
4687
4688 bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
4689 StringRef SpecificModuleCachePath,
4690 bool Complain) override {
4691 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
4692 ExistingModuleCachePath,
4693 nullptr, ExistingLangOpts);
4694 }
4695
4696 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
4697 bool Complain,
4698 std::string &SuggestedPredefines) override {
4699 return checkPreprocessorOptions(ExistingPPOpts, PPOpts, nullptr, FileMgr,
4700 SuggestedPredefines, ExistingLangOpts);
4701 }
4702 };
4703
4704} // namespace
4705
4706bool ASTReader::readASTFileControlBlock(
4707 StringRef Filename, FileManager &FileMgr,
4708 const PCHContainerReader &PCHContainerRdr,
4709 bool FindModuleFileExtensions,
4710 ASTReaderListener &Listener, bool ValidateDiagnosticOptions) {
4711 // Open the AST file.
4712 // FIXME: This allows use of the VFS; we do not allow use of the
4713 // VFS when actually loading a module.
4714 auto Buffer = FileMgr.getBufferForFile(Filename);
4715 if (!Buffer) {
4716 return true;
4717 }
4718
4719 // Initialize the stream
4720 StringRef Bytes = PCHContainerRdr.ExtractPCH(**Buffer);
4721 BitstreamCursor Stream(Bytes);
4722
4723 // Sniff for the signature.
4724 if (!startsWithASTFileMagic(Stream))
4725 return true;
4726
4727 // Scan for the CONTROL_BLOCK_ID block.
4728 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID))
4729 return true;
4730
4731 bool NeedsInputFiles = Listener.needsInputFileVisitation();
4732 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
4733 bool NeedsImports = Listener.needsImportVisitation();
4734 BitstreamCursor InputFilesCursor;
4735
4736 RecordData Record;
4737 std::string ModuleDir;
4738 bool DoneWithControlBlock = false;
4739 while (!DoneWithControlBlock) {
4740 llvm::BitstreamEntry Entry = Stream.advance();
4741
4742 switch (Entry.Kind) {
4743 case llvm::BitstreamEntry::SubBlock: {
4744 switch (Entry.ID) {
4745 case OPTIONS_BLOCK_ID: {
4746 std::string IgnoredSuggestedPredefines;
4747 if (ReadOptionsBlock(Stream, ARR_ConfigurationMismatch | ARR_OutOfDate,
4748 /*AllowCompatibleConfigurationMismatch*/ false,
4749 Listener, IgnoredSuggestedPredefines) != Success)
4750 return true;
4751 break;
4752 }
4753
4754 case INPUT_FILES_BLOCK_ID:
4755 InputFilesCursor = Stream;
4756 if (Stream.SkipBlock() ||
4757 (NeedsInputFiles &&
4758 ReadBlockAbbrevs(InputFilesCursor, INPUT_FILES_BLOCK_ID)))
4759 return true;
4760 break;
4761
4762 default:
4763 if (Stream.SkipBlock())
4764 return true;
4765 break;
4766 }
4767
4768 continue;
4769 }
4770
4771 case llvm::BitstreamEntry::EndBlock:
4772 DoneWithControlBlock = true;
4773 break;
4774
4775 case llvm::BitstreamEntry::Error:
4776 return true;
4777
4778 case llvm::BitstreamEntry::Record:
4779 break;
4780 }
4781
4782 if (DoneWithControlBlock) break;
4783
4784 Record.clear();
4785 StringRef Blob;
4786 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob);
4787 switch ((ControlRecordTypes)RecCode) {
4788 case METADATA:
4789 if (Record[0] != VERSION_MAJOR)
4790 return true;
4791 if (Listener.ReadFullVersionInformation(Blob))
4792 return true;
4793 break;
4794 case MODULE_NAME:
4795 Listener.ReadModuleName(Blob);
4796 break;
4797 case MODULE_DIRECTORY:
4798 ModuleDir = Blob;
4799 break;
4800 case MODULE_MAP_FILE: {
4801 unsigned Idx = 0;
4802 auto Path = ReadString(Record, Idx);
4803 ResolveImportedPath(Path, ModuleDir);
4804 Listener.ReadModuleMapFile(Path);
4805 break;
4806 }
4807 case INPUT_FILE_OFFSETS: {
4808 if (!NeedsInputFiles)
4809 break;
4810
4811 unsigned NumInputFiles = Record[0];
4812 unsigned NumUserFiles = Record[1];
4813 const uint64_t *InputFileOffs = (const uint64_t *)Blob.data();
4814 for (unsigned I = 0; I != NumInputFiles; ++I) {
4815 // Go find this input file.
4816 bool isSystemFile = I >= NumUserFiles;
4817
4818 if (isSystemFile && !NeedsSystemInputFiles)
4819 break; // the rest are system input files
4820
4821 BitstreamCursor &Cursor = InputFilesCursor;
4822 SavedStreamPosition SavedPosition(Cursor);
4823 Cursor.JumpToBit(InputFileOffs[I]);
4824
4825 unsigned Code = Cursor.ReadCode();
4826 RecordData Record;
4827 StringRef Blob;
4828 bool shouldContinue = false;
4829 switch ((InputFileRecordTypes)Cursor.readRecord(Code, Record, &Blob)) {
4830 case INPUT_FILE:
4831 bool Overridden = static_cast<bool>(Record[3]);
4832 std::string Filename = Blob;
4833 ResolveImportedPath(Filename, ModuleDir);
4834 shouldContinue = Listener.visitInputFile(
4835 Filename, isSystemFile, Overridden, /*IsExplicitModule*/false);
4836 break;
4837 }
4838 if (!shouldContinue)
4839 break;
4840 }
4841 break;
4842 }
4843
4844 case IMPORTS: {
4845 if (!NeedsImports)
4846 break;
4847
4848 unsigned Idx = 0, N = Record.size();
4849 while (Idx < N) {
4850 // Read information about the AST file.
4851 Idx += 5; // ImportLoc, Size, ModTime, Signature
4852 SkipString(Record, Idx); // Module name; FIXME: pass to listener?
4853 std::string Filename = ReadString(Record, Idx);
4854 ResolveImportedPath(Filename, ModuleDir);
4855 Listener.visitImport(Filename);
4856 }
4857 break;
4858 }
4859
4860 default:
4861 // No other validation to perform.
4862 break;
4863 }
4864 }
4865
4866 // Look for module file extension blocks, if requested.
4867 if (FindModuleFileExtensions) {
4868 BitstreamCursor SavedStream = Stream;
4869 while (!SkipCursorToBlock(Stream, EXTENSION_BLOCK_ID)) {
4870 bool DoneWithExtensionBlock = false;
4871 while (!DoneWithExtensionBlock) {
4872 llvm::BitstreamEntry Entry = Stream.advance();
4873
4874 switch (Entry.Kind) {
4875 case llvm::BitstreamEntry::SubBlock:
4876 if (Stream.SkipBlock())
4877 return true;
4878
4879 continue;
4880
4881 case llvm::BitstreamEntry::EndBlock:
4882 DoneWithExtensionBlock = true;
4883 continue;
4884
4885 case llvm::BitstreamEntry::Error:
4886 return true;
4887
4888 case llvm::BitstreamEntry::Record:
4889 break;
4890 }
4891
4892 Record.clear();
4893 StringRef Blob;
4894 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob);
4895 switch (RecCode) {
4896 case EXTENSION_METADATA: {
4897 ModuleFileExtensionMetadata Metadata;
4898 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata))
4899 return true;
4900
4901 Listener.readModuleFileExtension(Metadata);
4902 break;
4903 }
4904 }
4905 }
4906 }
4907 Stream = SavedStream;
4908 }
4909
4910 // Scan for the UNHASHED_CONTROL_BLOCK_ID block.
4911 if (readUnhashedControlBlockImpl(
4912 nullptr, Bytes, ARR_ConfigurationMismatch | ARR_OutOfDate,
4913 /*AllowCompatibleConfigurationMismatch*/ false, &Listener,
4914 ValidateDiagnosticOptions) != Success)
4915 return true;
4916
4917 return false;
4918}
4919
4920bool ASTReader::isAcceptableASTFile(StringRef Filename, FileManager &FileMgr,
4921 const PCHContainerReader &PCHContainerRdr,
4922 const LangOptions &LangOpts,
4923 const TargetOptions &TargetOpts,
4924 const PreprocessorOptions &PPOpts,
4925 StringRef ExistingModuleCachePath) {
4926 SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts,
4927 ExistingModuleCachePath, FileMgr);
4928 return !readASTFileControlBlock(Filename, FileMgr, PCHContainerRdr,
4929 /*FindModuleFileExtensions=*/false,
4930 validator,
4931 /*ValidateDiagnosticOptions=*/true);
4932}
4933
4934ASTReader::ASTReadResult
4935ASTReader::ReadSubmoduleBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
4936 // Enter the submodule block.
4937 if (F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) {
4938 Error("malformed submodule block record in AST file");
4939 return Failure;
4940 }
4941
4942 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
4943 bool First = true;
4944 Module *CurrentModule = nullptr;
4945 RecordData Record;
4946 while (true) {
4947 llvm::BitstreamEntry Entry = F.Stream.advanceSkippingSubblocks();
4948
4949 switch (Entry.Kind) {
4950 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
4951 case llvm::BitstreamEntry::Error:
4952 Error("malformed block record in AST file");
4953 return Failure;
4954 case llvm::BitstreamEntry::EndBlock:
4955 return Success;
4956 case llvm::BitstreamEntry::Record:
4957 // The interesting case.
4958 break;
4959 }
4960
4961 // Read a record.
4962 StringRef Blob;
4963 Record.clear();
4964 auto Kind = F.Stream.readRecord(Entry.ID, Record, &Blob);
4965
4966 if ((Kind == SUBMODULE_METADATA) != First) {
4967 Error("submodule metadata record should be at beginning of block");
4968 return Failure;
4969 }
4970 First = false;
4971
4972 // Submodule information is only valid if we have a current module.
4973 // FIXME: Should we error on these cases?
4974 if (!CurrentModule && Kind != SUBMODULE_METADATA &&
4975 Kind != SUBMODULE_DEFINITION)
4976 continue;
4977
4978 switch (Kind) {
4979 default: // Default behavior: ignore.
4980 break;
4981
4982 case SUBMODULE_DEFINITION: {
4983 if (Record.size() < 8) {
4984 Error("malformed module definition");
4985 return Failure;
4986 }
4987
4988 StringRef Name = Blob;
4989 unsigned Idx = 0;
4990 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]);
4991 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]);
4992 Module::ModuleKind Kind = (Module::ModuleKind)Record[Idx++];
4993 bool IsFramework = Record[Idx++];
4994 bool IsExplicit = Record[Idx++];
4995 bool IsSystem = Record[Idx++];
4996 bool IsExternC = Record[Idx++];
4997 bool InferSubmodules = Record[Idx++];
4998 bool InferExplicitSubmodules = Record[Idx++];
4999 bool InferExportWildcard = Record[Idx++];
5000 bool ConfigMacrosExhaustive = Record[Idx++];
5001
5002 Module *ParentModule = nullptr;
5003 if (Parent)
5004 ParentModule = getSubmodule(Parent);
5005
5006 // Retrieve this (sub)module from the module map, creating it if
5007 // necessary.
5008 CurrentModule =
5009 ModMap.findOrCreateModule(Name, ParentModule, IsFramework, IsExplicit)
5010 .first;
5011
5012 // FIXME: set the definition loc for CurrentModule, or call
5013 // ModMap.setInferredModuleAllowedBy()
5014
5015 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS;
5016 if (GlobalIndex >= SubmodulesLoaded.size() ||
5017 SubmodulesLoaded[GlobalIndex]) {
5018 Error("too many submodules");
5019 return Failure;
5020 }
5021
5022 if (!ParentModule) {
5023 if (const FileEntry *CurFile = CurrentModule->getASTFile()) {
5024 if (CurFile != F.File) {
5025 if (!Diags.isDiagnosticInFlight()) {
5026 Diag(diag::err_module_file_conflict)
5027 << CurrentModule->getTopLevelModuleName()
5028 << CurFile->getName()
5029 << F.File->getName();
5030 }
5031 return Failure;
5032 }
5033 }
5034
5035 CurrentModule->setASTFile(F.File);
5036 CurrentModule->PresumedModuleMapFile = F.ModuleMapPath;
5037 }
5038
5039 CurrentModule->Kind = Kind;
5040 CurrentModule->Signature = F.Signature;
5041 CurrentModule->IsFromModuleFile = true;
5042 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem;
5043 CurrentModule->IsExternC = IsExternC;
5044 CurrentModule->InferSubmodules = InferSubmodules;
5045 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules;
5046 CurrentModule->InferExportWildcard = InferExportWildcard;
5047 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive;
5048 if (DeserializationListener)
5049 DeserializationListener->ModuleRead(GlobalID, CurrentModule);
5050
5051 SubmodulesLoaded[GlobalIndex] = CurrentModule;
5052
5053 // Clear out data that will be replaced by what is in the module file.
5054 CurrentModule->LinkLibraries.clear();
5055 CurrentModule->ConfigMacros.clear();
5056 CurrentModule->UnresolvedConflicts.clear();
5057 CurrentModule->Conflicts.clear();
5058
5059 // The module is available unless it's missing a requirement; relevant
5060 // requirements will be (re-)added by SUBMODULE_REQUIRES records.
5061 // Missing headers that were present when the module was built do not
5062 // make it unavailable -- if we got this far, this must be an explicitly
5063 // imported module file.
5064 CurrentModule->Requirements.clear();
5065 CurrentModule->MissingHeaders.clear();
5066 CurrentModule->IsMissingRequirement =
5067 ParentModule && ParentModule->IsMissingRequirement;
5068 CurrentModule->IsAvailable = !CurrentModule->IsMissingRequirement;
5069 break;
5070 }
5071
5072 case SUBMODULE_UMBRELLA_HEADER: {
5073 std::string Filename = Blob;
5074 ResolveImportedPath(F, Filename);
5075 if (auto *Umbrella = PP.getFileManager().getFile(Filename)) {
5076 if (!CurrentModule->getUmbrellaHeader())
5077 ModMap.setUmbrellaHeader(CurrentModule, Umbrella, Blob);
5078 else if (CurrentModule->getUmbrellaHeader().Entry != Umbrella) {
5079 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
5080 Error("mismatched umbrella headers in submodule");
5081 return OutOfDate;
5082 }
5083 }
5084 break;
5085 }
5086
5087 case SUBMODULE_HEADER:
5088 case SUBMODULE_EXCLUDED_HEADER:
5089 case SUBMODULE_PRIVATE_HEADER:
5090 // We lazily associate headers with their modules via the HeaderInfo table.
5091 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
5092 // of complete filenames or remove it entirely.
5093 break;
5094
5095 case SUBMODULE_TEXTUAL_HEADER:
5096 case SUBMODULE_PRIVATE_TEXTUAL_HEADER:
5097 // FIXME: Textual headers are not marked in the HeaderInfo table. Load
5098 // them here.
5099 break;
5100
5101 case SUBMODULE_TOPHEADER:
5102 CurrentModule->addTopHeaderFilename(Blob);
5103 break;
5104
5105 case SUBMODULE_UMBRELLA_DIR: {
5106 std::string Dirname = Blob;
5107 ResolveImportedPath(F, Dirname);
5108 if (auto *Umbrella = PP.getFileManager().getDirectory(Dirname)) {
5109 if (!CurrentModule->getUmbrellaDir())
5110 ModMap.setUmbrellaDir(CurrentModule, Umbrella, Blob);
5111 else if (CurrentModule->getUmbrellaDir().Entry != Umbrella) {
5112 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
5113 Error("mismatched umbrella directories in submodule");
5114 return OutOfDate;
5115 }
5116 }
5117 break;
5118 }
5119
5120 case SUBMODULE_METADATA: {
5121 F.BaseSubmoduleID = getTotalNumSubmodules();
5122 F.LocalNumSubmodules = Record[0];
5123 unsigned LocalBaseSubmoduleID = Record[1];
5124 if (F.LocalNumSubmodules > 0) {
5125 // Introduce the global -> local mapping for submodules within this
5126 // module.
5127 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F));
5128
5129 // Introduce the local -> global mapping for submodules within this
5130 // module.
5131 F.SubmoduleRemap.insertOrReplace(
5132 std::make_pair(LocalBaseSubmoduleID,
5133 F.BaseSubmoduleID - LocalBaseSubmoduleID));
5134
5135 SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules);
5136 }
5137 break;
5138 }
5139
5140 case SUBMODULE_IMPORTS:
5141 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) {
5142 UnresolvedModuleRef Unresolved;
5143 Unresolved.File = &F;
5144 Unresolved.Mod = CurrentModule;
5145 Unresolved.ID = Record[Idx];
5146 Unresolved.Kind = UnresolvedModuleRef::Import;
5147 Unresolved.IsWildcard = false;
5148 UnresolvedModuleRefs.push_back(Unresolved);
5149 }
5150 break;
5151
5152 case SUBMODULE_EXPORTS:
5153 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) {
5154 UnresolvedModuleRef Unresolved;
5155 Unresolved.File = &F;
5156 Unresolved.Mod = CurrentModule;
5157 Unresolved.ID = Record[Idx];
5158 Unresolved.Kind = UnresolvedModuleRef::Export;
5159 Unresolved.IsWildcard = Record[Idx + 1];
5160 UnresolvedModuleRefs.push_back(Unresolved);
5161 }
5162
5163 // Once we've loaded the set of exports, there's no reason to keep
5164 // the parsed, unresolved exports around.
5165 CurrentModule->UnresolvedExports.clear();
5166 break;
5167
5168 case SUBMODULE_REQUIRES:
5169 CurrentModule->addRequirement(Blob, Record[0], PP.getLangOpts(),
5170 PP.getTargetInfo());
5171 break;
5172
5173 case SUBMODULE_LINK_LIBRARY:
5174 CurrentModule->LinkLibraries.push_back(
5175 Module::LinkLibrary(Blob, Record[0]));
5176 break;
5177
5178 case SUBMODULE_CONFIG_MACRO:
5179 CurrentModule->ConfigMacros.push_back(Blob.str());
5180 break;
5181
5182 case SUBMODULE_CONFLICT: {
5183 UnresolvedModuleRef Unresolved;
5184 Unresolved.File = &F;
5185 Unresolved.Mod = CurrentModule;
5186 Unresolved.ID = Record[0];
5187 Unresolved.Kind = UnresolvedModuleRef::Conflict;
5188 Unresolved.IsWildcard = false;
5189 Unresolved.String = Blob;
5190 UnresolvedModuleRefs.push_back(Unresolved);
5191 break;
5192 }
5193
5194 case SUBMODULE_INITIALIZERS: {
5195 if (!ContextObj)
5196 break;
5197 SmallVector<uint32_t, 16> Inits;
5198 for (auto &ID : Record)
5199 Inits.push_back(getGlobalDeclID(F, ID));
5200 ContextObj->addLazyModuleInitializers(CurrentModule, Inits);
5201 break;
5202 }
5203
5204 case SUBMODULE_EXPORT_AS:
5205 CurrentModule->ExportAsModule = Blob.str();
5206 break;
5207 }
5208 }
5209}
5210
5211/// \brief Parse the record that corresponds to a LangOptions data
5212/// structure.
5213///
5214/// This routine parses the language options from the AST file and then gives
5215/// them to the AST listener if one is set.
5216///
5217/// \returns true if the listener deems the file unacceptable, false otherwise.
5218bool ASTReader::ParseLanguageOptions(const RecordData &Record,
5219 bool Complain,
5220 ASTReaderListener &Listener,
5221 bool AllowCompatibleDifferences) {
5222 LangOptions LangOpts;
5223 unsigned Idx = 0;
5224#define LANGOPT(Name, Bits, Default, Description) \
5225 LangOpts.Name = Record[Idx++];
5226#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
5227 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
5228#include "clang/Basic/LangOptions.def"
5229#define SANITIZER(NAME, ID) \
5230 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]);
5231#include "clang/Basic/Sanitizers.def"
5232
5233 for (unsigned N = Record[Idx++]; N; --N)
5234 LangOpts.ModuleFeatures.push_back(ReadString(Record, Idx));
5235
5236 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++];
5237 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx);
5238 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion);
5239
5240 LangOpts.CurrentModule = ReadString(Record, Idx);
5241
5242 // Comment options.
5243 for (unsigned N = Record[Idx++]; N; --N) {
5244 LangOpts.CommentOpts.BlockCommandNames.push_back(
5245 ReadString(Record, Idx));
5246 }
5247 LangOpts.CommentOpts.ParseAllComments = Record[Idx++];
5248
5249 // OpenMP offloading options.
5250 for (unsigned N = Record[Idx++]; N; --N) {
5251 LangOpts.OMPTargetTriples.push_back(llvm::Triple(ReadString(Record, Idx)));
5252 }
5253
5254 LangOpts.OMPHostIRFile = ReadString(Record, Idx);
5255
5256 return Listener.ReadLanguageOptions(LangOpts, Complain,
5257 AllowCompatibleDifferences);
5258}
5259
5260bool ASTReader::ParseTargetOptions(const RecordData &Record, bool Complain,
5261 ASTReaderListener &Listener,
5262 bool AllowCompatibleDifferences) {
5263 unsigned Idx = 0;
5264 TargetOptions TargetOpts;
5265 TargetOpts.Triple = ReadString(Record, Idx);
5266 TargetOpts.CPU = ReadString(Record, Idx);
5267 TargetOpts.ABI = ReadString(Record, Idx);
5268 for (unsigned N = Record[Idx++]; N; --N) {
5269 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx));
5270 }
5271 for (unsigned N = Record[Idx++]; N; --N) {
5272 TargetOpts.Features.push_back(ReadString(Record, Idx));
5273 }
5274
5275 return Listener.ReadTargetOptions(TargetOpts, Complain,
5276 AllowCompatibleDifferences);
5277}
5278
5279bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain,
5280 ASTReaderListener &Listener) {
5281 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions);
5282 unsigned Idx = 0;
5283#define DIAGOPT(Name, Bits, Default) DiagOpts->Name = Record[Idx++];
5284#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
5285 DiagOpts->set##Name(static_cast<Type>(Record[Idx++]));
5286#include "clang/Basic/DiagnosticOptions.def"
5287
5288 for (unsigned N = Record[Idx++]; N; --N)
5289 DiagOpts->Warnings.push_back(ReadString(Record, Idx));
5290 for (unsigned N = Record[Idx++]; N; --N)
5291 DiagOpts->Remarks.push_back(ReadString(Record, Idx));
5292
5293 return Listener.ReadDiagnosticOptions(DiagOpts, Complain);
5294}
5295
5296bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain,
5297 ASTReaderListener &Listener) {
5298 FileSystemOptions FSOpts;
5299 unsigned Idx = 0;
5300 FSOpts.WorkingDir = ReadString(Record, Idx);
5301 return Listener.ReadFileSystemOptions(FSOpts, Complain);
5302}
5303
5304bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record,
5305 bool Complain,
5306 ASTReaderListener &Listener) {
5307 HeaderSearchOptions HSOpts;
5308 unsigned Idx = 0;
5309 HSOpts.Sysroot = ReadString(Record, Idx);
5310
5311 // Include entries.
5312 for (unsigned N = Record[Idx++]; N; --N) {
5313 std::string Path = ReadString(Record, Idx);
5314 frontend::IncludeDirGroup Group
5315 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]);
5316 bool IsFramework = Record[Idx++];
5317 bool IgnoreSysRoot = Record[Idx++];
5318 HSOpts.UserEntries.emplace_back(std::move(Path), Group, IsFramework,
5319 IgnoreSysRoot);
5320 }
5321
5322 // System header prefixes.
5323 for (unsigned N = Record[Idx++]; N; --N) {
5324 std::string Prefix = ReadString(Record, Idx);
5325 bool IsSystemHeader = Record[Idx++];
5326 HSOpts.SystemHeaderPrefixes.emplace_back(std::move(Prefix), IsSystemHeader);
5327 }
5328
5329 HSOpts.ResourceDir = ReadString(Record, Idx);
5330 HSOpts.ModuleCachePath = ReadString(Record, Idx);
5331 HSOpts.ModuleUserBuildPath = ReadString(Record, Idx);
5332 HSOpts.DisableModuleHash = Record[Idx++];
5333 HSOpts.ImplicitModuleMaps = Record[Idx++];
5334 HSOpts.ModuleMapFileHomeIsCwd = Record[Idx++];
5335 HSOpts.UseBuiltinIncludes = Record[Idx++];
5336 HSOpts.UseStandardSystemIncludes = Record[Idx++];
5337 HSOpts.UseStandardCXXIncludes = Record[Idx++];
5338 HSOpts.UseLibcxx = Record[Idx++];
5339 std::string SpecificModuleCachePath = ReadString(Record, Idx);
5340
5341 return Listener.ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
5342 Complain);
5343}
5344
5345bool ASTReader::ParsePreprocessorOptions(const RecordData &Record,
5346 bool Complain,
5347 ASTReaderListener &Listener,
5348 std::string &SuggestedPredefines) {
5349 PreprocessorOptions PPOpts;
5350 unsigned Idx = 0;
5351
5352 // Macro definitions/undefs
5353 for (unsigned N = Record[Idx++]; N; --N) {
5354 std::string Macro = ReadString(Record, Idx);
5355 bool IsUndef = Record[Idx++];
5356 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef));
5357 }
5358
5359 // Includes
5360 for (unsigned N = Record[Idx++]; N; --N) {
5361 PPOpts.Includes.push_back(ReadString(Record, Idx));
5362 }
5363
5364 // Macro Includes
5365 for (unsigned N = Record[Idx++]; N; --N) {
5366 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx));
5367 }
5368
5369 PPOpts.UsePredefines = Record[Idx++];
5370 PPOpts.DetailedRecord = Record[Idx++];
5371 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx);
5372 PPOpts.ImplicitPTHInclude = ReadString(Record, Idx);
5373 PPOpts.ObjCXXARCStandardLibrary =
5374 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]);
5375 SuggestedPredefines.clear();
5376 return Listener.ReadPreprocessorOptions(PPOpts, Complain,
5377 SuggestedPredefines);
5378}
5379
5380std::pair<ModuleFile *, unsigned>
5381ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) {
5382 GlobalPreprocessedEntityMapType::iterator
5383 I = GlobalPreprocessedEntityMap.find(GlobalIndex);
5384 assert(I != GlobalPreprocessedEntityMap.end() &&(static_cast <bool> (I != GlobalPreprocessedEntityMap.end
() && "Corrupted global preprocessed entity map") ? void
(0) : __assert_fail ("I != GlobalPreprocessedEntityMap.end() && \"Corrupted global preprocessed entity map\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 5385, __extension__ __PRETTY_FUNCTION__))
5385 "Corrupted global preprocessed entity map")(static_cast <bool> (I != GlobalPreprocessedEntityMap.end
() && "Corrupted global preprocessed entity map") ? void
(0) : __assert_fail ("I != GlobalPreprocessedEntityMap.end() && \"Corrupted global preprocessed entity map\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 5385, __extension__ __PRETTY_FUNCTION__))
;
5386 ModuleFile *M = I->second;
5387 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID;
5388 return std::make_pair(M, LocalIndex);
5389}
5390
5391llvm::iterator_range<PreprocessingRecord::iterator>
5392ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const {
5393 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
5394 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID,
5395 Mod.NumPreprocessedEntities);
5396
5397 return llvm::make_range(PreprocessingRecord::iterator(),
5398 PreprocessingRecord::iterator());
5399}
5400
5401llvm::iterator_range<ASTReader::ModuleDeclIterator>
5402ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) {
5403 return llvm::make_range(
5404 ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls),
5405 ModuleDeclIterator(this, &Mod,
5406 Mod.FileSortedDecls + Mod.NumFileSortedDecls));
5407}
5408
5409SourceRange ASTReader::ReadSkippedRange(unsigned GlobalIndex) {
5410 auto I = GlobalSkippedRangeMap.find(GlobalIndex);
5411 assert(I != GlobalSkippedRangeMap.end() &&(static_cast <bool> (I != GlobalSkippedRangeMap.end() &&
"Corrupted global skipped range map") ? void (0) : __assert_fail
("I != GlobalSkippedRangeMap.end() && \"Corrupted global skipped range map\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 5412, __extension__ __PRETTY_FUNCTION__))
5412 "Corrupted global skipped range map")(static_cast <bool> (I != GlobalSkippedRangeMap.end() &&
"Corrupted global skipped range map") ? void (0) : __assert_fail
("I != GlobalSkippedRangeMap.end() && \"Corrupted global skipped range map\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 5412, __extension__ __PRETTY_FUNCTION__))
;
5413 ModuleFile *M = I->second;
5414 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedSkippedRangeID;
5415 assert(LocalIndex < M->NumPreprocessedSkippedRanges)(static_cast <bool> (LocalIndex < M->NumPreprocessedSkippedRanges
) ? void (0) : __assert_fail ("LocalIndex < M->NumPreprocessedSkippedRanges"
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 5415, __extension__ __PRETTY_FUNCTION__))
;
5416 PPSkippedRange RawRange = M->PreprocessedSkippedRangeOffsets[LocalIndex];
5417 SourceRange Range(TranslateSourceLocation(*M, RawRange.getBegin()),
5418 TranslateSourceLocation(*M, RawRange.getEnd()));
5419 assert(Range.isValid())(static_cast <bool> (Range.isValid()) ? void (0) : __assert_fail
("Range.isValid()", "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 5419, __extension__ __PRETTY_FUNCTION__))
;
5420 return Range;
5421}
5422
5423PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) {
5424 PreprocessedEntityID PPID = Index+1;
5425 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
5426 ModuleFile &M = *PPInfo.first;
5427 unsigned LocalIndex = PPInfo.second;
5428 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
5429
5430 if (!PP.getPreprocessingRecord()) {
5431 Error("no preprocessing record");
5432 return nullptr;
5433 }
5434
5435 SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor);
5436 M.PreprocessorDetailCursor.JumpToBit(PPOffs.BitOffset);
5437
5438 llvm::BitstreamEntry Entry =
5439 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
5440 if (Entry.Kind != llvm::BitstreamEntry::Record)
5441 return nullptr;
5442
5443 // Read the record.
5444 SourceRange Range(TranslateSourceLocation(M, PPOffs.getBegin()),
5445 TranslateSourceLocation(M, PPOffs.getEnd()));
5446 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
5447 StringRef Blob;
5448 RecordData Record;
5449 PreprocessorDetailRecordTypes RecType =
5450 (PreprocessorDetailRecordTypes)M.PreprocessorDetailCursor.readRecord(
5451 Entry.ID, Record, &Blob);
5452 switch (RecType) {
5453 case PPD_MACRO_EXPANSION: {
5454 bool isBuiltin = Record[0];
5455 IdentifierInfo *Name = nullptr;
5456 MacroDefinitionRecord *Def = nullptr;
5457 if (isBuiltin)
5458 Name = getLocalIdentifier(M, Record[1]);
5459 else {
5460 PreprocessedEntityID GlobalID =
5461 getGlobalPreprocessedEntityID(M, Record[1]);
5462 Def = cast<MacroDefinitionRecord>(
5463 PPRec.getLoadedPreprocessedEntity(GlobalID - 1));
5464 }
5465
5466 MacroExpansion *ME;
5467 if (isBuiltin)
5468 ME = new (PPRec) MacroExpansion(Name, Range);
5469 else
5470 ME = new (PPRec) MacroExpansion(Def, Range);
5471
5472 return ME;
5473 }
5474
5475 case PPD_MACRO_DEFINITION: {
5476 // Decode the identifier info and then check again; if the macro is
5477 // still defined and associated with the identifier,
5478 IdentifierInfo *II = getLocalIdentifier(M, Record[0]);
5479 MacroDefinitionRecord *MD = new (PPRec) MacroDefinitionRecord(II, Range);
5480
5481 if (DeserializationListener)
5482 DeserializationListener->MacroDefinitionRead(PPID, MD);
5483
5484 return MD;
5485 }
5486
5487 case PPD_INCLUSION_DIRECTIVE: {
5488 const char *FullFileNameStart = Blob.data() + Record[0];
5489 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]);
5490 const FileEntry *File = nullptr;
5491 if (!FullFileName.empty())
5492 File = PP.getFileManager().getFile(FullFileName);
5493
5494 // FIXME: Stable encoding
5495 InclusionDirective::InclusionKind Kind
5496 = static_cast<InclusionDirective::InclusionKind>(Record[2]);
5497 InclusionDirective *ID
5498 = new (PPRec) InclusionDirective(PPRec, Kind,
5499 StringRef(Blob.data(), Record[0]),
5500 Record[1], Record[3],
5501 File,
5502 Range);
5503 return ID;
5504 }
5505 }
5506
5507 llvm_unreachable("Invalid PreprocessorDetailRecordTypes")::llvm::llvm_unreachable_internal("Invalid PreprocessorDetailRecordTypes"
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 5507)
;
5508}
5509
5510/// \brief Find the next module that contains entities and return the ID
5511/// of the first entry.
5512///
5513/// \param SLocMapI points at a chunk of a module that contains no
5514/// preprocessed entities or the entities it contains are not the ones we are
5515/// looking for.
5516PreprocessedEntityID ASTReader::findNextPreprocessedEntity(
5517 GlobalSLocOffsetMapType::const_iterator SLocMapI) const {
5518 ++SLocMapI;
5519 for (GlobalSLocOffsetMapType::const_iterator
5520 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
5521 ModuleFile &M = *SLocMapI->second;
5522 if (M.NumPreprocessedEntities)
5523 return M.BasePreprocessedEntityID;
5524 }
5525
5526 return getTotalNumPreprocessedEntities();
5527}
5528
5529namespace {
5530
5531struct PPEntityComp {
5532 const ASTReader &Reader;
5533 ModuleFile &M;
5534
5535 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) {}
5536
5537 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const {
5538 SourceLocation LHS = getLoc(L);
5539 SourceLocation RHS = getLoc(R);
5540 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
5541 }
5542
5543 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const {
5544 SourceLocation LHS = getLoc(L);
5545 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
5546 }
5547
5548 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const {
5549 SourceLocation RHS = getLoc(R);
5550 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
5551 }
5552
5553 SourceLocation getLoc(const PPEntityOffset &PPE) const {
5554 return Reader.TranslateSourceLocation(M, PPE.getBegin());
5555 }
5556};
5557
5558} // namespace
5559
5560PreprocessedEntityID ASTReader::findPreprocessedEntity(SourceLocation Loc,
5561 bool EndsAfter) const {
5562 if (SourceMgr.isLocalSourceLocation(Loc))
5563 return getTotalNumPreprocessedEntities();
5564
5565 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
5566 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
5567 assert(SLocMapI != GlobalSLocOffsetMap.end() &&(static_cast <bool> (SLocMapI != GlobalSLocOffsetMap.end
() && "Corrupted global sloc offset map") ? void (0) :
__assert_fail ("SLocMapI != GlobalSLocOffsetMap.end() && \"Corrupted global sloc offset map\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 5568, __extension__ __PRETTY_FUNCTION__))
5568 "Corrupted global sloc offset map")(static_cast <bool> (SLocMapI != GlobalSLocOffsetMap.end
() && "Corrupted global sloc offset map") ? void (0) :
__assert_fail ("SLocMapI != GlobalSLocOffsetMap.end() && \"Corrupted global sloc offset map\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 5568, __extension__ __PRETTY_FUNCTION__))
;
5569
5570 if (SLocMapI->second->NumPreprocessedEntities == 0)
5571 return findNextPreprocessedEntity(SLocMapI);
5572
5573 ModuleFile &M = *SLocMapI->second;
5574
5575 using pp_iterator = const PPEntityOffset *;
5576
5577 pp_iterator pp_begin = M.PreprocessedEntityOffsets;
5578 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities;
5579
5580 size_t Count = M.NumPreprocessedEntities;
5581 size_t Half;
5582 pp_iterator First = pp_begin;
5583 pp_iterator PPI;
5584
5585 if (EndsAfter) {
5586 PPI = std::upper_bound(pp_begin, pp_end, Loc,
5587 PPEntityComp(*this, M));
5588 } else {
5589 // Do a binary search manually instead of using std::lower_bound because
5590 // The end locations of entities may be unordered (when a macro expansion
5591 // is inside another macro argument), but for this case it is not important
5592 // whether we get the first macro expansion or its containing macro.
5593 while (Count > 0) {
5594 Half = Count / 2;
5595 PPI = First;
5596 std::advance(PPI, Half);
5597 if (SourceMgr.isBeforeInTranslationUnit(
5598 TranslateSourceLocation(M, PPI->getEnd()), Loc)) {
5599 First = PPI;
5600 ++First;
5601 Count = Count - Half - 1;
5602 } else
5603 Count = Half;
5604 }
5605 }
5606
5607 if (PPI == pp_end)
5608 return findNextPreprocessedEntity(SLocMapI);
5609
5610 return M.BasePreprocessedEntityID + (PPI - pp_begin);
5611}
5612
5613/// \brief Returns a pair of [Begin, End) indices of preallocated
5614/// preprocessed entities that \arg Range encompasses.
5615std::pair<unsigned, unsigned>
5616 ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) {
5617 if (Range.isInvalid())
5618 return std::make_pair(0,0);
5619 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()))(static_cast <bool> (!SourceMgr.isBeforeInTranslationUnit
(Range.getEnd(),Range.getBegin())) ? void (0) : __assert_fail
("!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin())"
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 5619, __extension__ __PRETTY_FUNCTION__))
;
5620
5621 PreprocessedEntityID BeginID =
5622 findPreprocessedEntity(Range.getBegin(), false);
5623 PreprocessedEntityID EndID = findPreprocessedEntity(Range.getEnd(), true);
5624 return std::make_pair(BeginID, EndID);
5625}
5626
5627/// \brief Optionally returns true or false if the preallocated preprocessed
5628/// entity with index \arg Index came from file \arg FID.
5629Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index,
5630 FileID FID) {
5631 if (FID.isInvalid())
5632 return false;
5633
5634 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
5635 ModuleFile &M = *PPInfo.first;
5636 unsigned LocalIndex = PPInfo.second;
5637 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
5638
5639 SourceLocation Loc = TranslateSourceLocation(M, PPOffs.getBegin());
5640 if (Loc.isInvalid())
5641 return false;
5642
5643 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
5644 return true;
5645 else
5646 return false;
5647}
5648
5649namespace {
5650
5651 /// \brief Visitor used to search for information about a header file.
5652 class HeaderFileInfoVisitor {
5653 const FileEntry *FE;
5654 Optional<HeaderFileInfo> HFI;
5655
5656 public:
5657 explicit HeaderFileInfoVisitor(const FileEntry *FE) : FE(FE) {}
5658
5659 bool operator()(ModuleFile &M) {
5660 HeaderFileInfoLookupTable *Table
5661 = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable);
5662 if (!Table)
5663 return false;
5664
5665 // Look in the on-disk hash table for an entry for this file name.
5666 HeaderFileInfoLookupTable::iterator Pos = Table->find(FE);
5667 if (Pos == Table->end())
5668 return false;
5669
5670 HFI = *Pos;
5671 return true;
5672 }
5673
5674 Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; }
5675 };
5676
5677} // namespace
5678
5679HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) {
5680 HeaderFileInfoVisitor Visitor(FE);
5681 ModuleMgr.visit(Visitor);
5682 if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
5683 return *HFI;
5684
5685 return HeaderFileInfo();
5686}
5687
5688void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) {
5689 using DiagState = DiagnosticsEngine::DiagState;
5690 SmallVector<DiagState *, 32> DiagStates;
5691
5692 for (ModuleFile &F : ModuleMgr) {
5693 unsigned Idx = 0;
5694 auto &Record = F.PragmaDiagMappings;
5695 if (Record.empty())
5696 continue;
5697
5698 DiagStates.clear();
5699
5700 auto ReadDiagState =
5701 [&](const DiagState &BasedOn, SourceLocation Loc,
5702 bool IncludeNonPragmaStates) -> DiagnosticsEngine::DiagState * {
5703 unsigned BackrefID = Record[Idx++];
5704 if (BackrefID != 0)
5705 return DiagStates[BackrefID - 1];
5706
5707 // A new DiagState was created here.
5708 Diag.DiagStates.push_back(BasedOn);
5709 DiagState *NewState = &Diag.DiagStates.back();
5710 DiagStates.push_back(NewState);
5711 unsigned Size = Record[Idx++];
5712 assert(Idx + Size * 2 <= Record.size() &&(static_cast <bool> (Idx + Size * 2 <= Record.size()
&& "Invalid data, not enough diag/map pairs") ? void
(0) : __assert_fail ("Idx + Size * 2 <= Record.size() && \"Invalid data, not enough diag/map pairs\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 5713, __extension__ __PRETTY_FUNCTION__))
5713 "Invalid data, not enough diag/map pairs")(static_cast <bool> (Idx + Size * 2 <= Record.size()
&& "Invalid data, not enough diag/map pairs") ? void
(0) : __assert_fail ("Idx + Size * 2 <= Record.size() && \"Invalid data, not enough diag/map pairs\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 5713, __extension__ __PRETTY_FUNCTION__))
;
5714 while (Size--) {
5715 unsigned DiagID = Record[Idx++];
5716 DiagnosticMapping NewMapping =
5717 DiagnosticMapping::deserialize(Record[Idx++]);
5718 if (!NewMapping.isPragma() && !IncludeNonPragmaStates)
5719 continue;
5720
5721 DiagnosticMapping &Mapping = NewState->getOrAddMapping(DiagID);
5722
5723 // If this mapping was specified as a warning but the severity was
5724 // upgraded due to diagnostic settings, simulate the current diagnostic
5725 // settings (and use a warning).
5726 if (NewMapping.wasUpgradedFromWarning() && !Mapping.isErrorOrFatal()) {
5727 NewMapping.setSeverity(diag::Severity::Warning);
5728 NewMapping.setUpgradedFromWarning(false);
5729 }
5730
5731 Mapping = NewMapping;
5732 }
5733 return NewState;
5734 };
5735
5736 // Read the first state.
5737 DiagState *FirstState;
5738 if (F.Kind == MK_ImplicitModule) {
5739 // Implicitly-built modules are reused with different diagnostic
5740 // settings. Use the initial diagnostic state from Diag to simulate this
5741 // compilation's diagnostic settings.
5742 FirstState = Diag.DiagStatesByLoc.FirstDiagState;
5743 DiagStates.push_back(FirstState);
5744
5745 // Skip the initial diagnostic state from the serialized module.
5746 assert(Record[1] == 0 &&(static_cast <bool> (Record[1] == 0 && "Invalid data, unexpected backref in initial state"
) ? void (0) : __assert_fail ("Record[1] == 0 && \"Invalid data, unexpected backref in initial state\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 5747, __extension__ __PRETTY_FUNCTION__))
5747 "Invalid data, unexpected backref in initial state")(static_cast <bool> (Record[1] == 0 && "Invalid data, unexpected backref in initial state"
) ? void (0) : __assert_fail ("Record[1] == 0 && \"Invalid data, unexpected backref in initial state\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 5747, __extension__ __PRETTY_FUNCTION__))
;
5748 Idx = 3 + Record[2] * 2;
5749 assert(Idx < Record.size() &&(static_cast <bool> (Idx < Record.size() && "Invalid data, not enough state change pairs in initial state"
) ? void (0) : __assert_fail ("Idx < Record.size() && \"Invalid data, not enough state change pairs in initial state\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 5750, __extension__ __PRETTY_FUNCTION__))
5750 "Invalid data, not enough state change pairs in initial state")(static_cast <bool> (Idx < Record.size() && "Invalid data, not enough state change pairs in initial state"
) ? void (0) : __assert_fail ("Idx < Record.size() && \"Invalid data, not enough state change pairs in initial state\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 5750, __extension__ __PRETTY_FUNCTION__))
;
5751 } else if (F.isModule()) {
5752 // For an explicit module, preserve the flags from the module build
5753 // command line (-w, -Weverything, -Werror, ...) along with any explicit
5754 // -Wblah flags.
5755 unsigned Flags = Record[Idx++];
5756 DiagState Initial;
5757 Initial.SuppressSystemWarnings = Flags & 1; Flags >>= 1;
5758 Initial.ErrorsAsFatal = Flags & 1; Flags >>= 1;
5759 Initial.WarningsAsErrors = Flags & 1; Flags >>= 1;
5760 Initial.EnableAllWarnings = Flags & 1; Flags >>= 1;
5761 Initial.IgnoreAllWarnings = Flags & 1; Flags >>= 1;
5762 Initial.ExtBehavior = (diag::Severity)Flags;
5763 FirstState = ReadDiagState(Initial, SourceLocation(), true);
5764
5765 assert(F.OriginalSourceFileID.isValid())(static_cast <bool> (F.OriginalSourceFileID.isValid()) ?
void (0) : __assert_fail ("F.OriginalSourceFileID.isValid()"
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 5765, __extension__ __PRETTY_FUNCTION__))
;
5766
5767 // Set up the root buffer of the module to start with the initial
5768 // diagnostic state of the module itself, to cover files that contain no
5769 // explicit transitions (for which we did not serialize anything).
5770 Diag.DiagStatesByLoc.Files[F.OriginalSourceFileID]
5771 .StateTransitions.push_back({FirstState, 0});
5772 } else {
5773 // For prefix ASTs, start with whatever the user configured on the
5774 // command line.
5775 Idx++; // Skip flags.
5776 FirstState = ReadDiagState(*Diag.DiagStatesByLoc.CurDiagState,
5777 SourceLocation(), false);
5778 }
5779
5780 // Read the state transitions.
5781 unsigned NumLocations = Record[Idx++];
5782 while (NumLocations--) {
5783 assert(Idx < Record.size() &&(static_cast <bool> (Idx < Record.size() && "Invalid data, missing pragma diagnostic states"
) ? void (0) : __assert_fail ("Idx < Record.size() && \"Invalid data, missing pragma diagnostic states\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 5784, __extension__ __PRETTY_FUNCTION__))
5784 "Invalid data, missing pragma diagnostic states")(static_cast <bool> (Idx < Record.size() && "Invalid data, missing pragma diagnostic states"
) ? void (0) : __assert_fail ("Idx < Record.size() && \"Invalid data, missing pragma diagnostic states\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 5784, __extension__ __PRETTY_FUNCTION__))
;
5785 SourceLocation Loc = ReadSourceLocation(F, Record[Idx++]);
5786 auto IDAndOffset = SourceMgr.getDecomposedLoc(Loc);
5787 assert(IDAndOffset.first.isValid() && "invalid FileID for transition")(static_cast <bool> (IDAndOffset.first.isValid() &&
"invalid FileID for transition") ? void (0) : __assert_fail (
"IDAndOffset.first.isValid() && \"invalid FileID for transition\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 5787, __extension__ __PRETTY_FUNCTION__))
;
5788 assert(IDAndOffset.second == 0 && "not a start location for a FileID")(static_cast <bool> (IDAndOffset.second == 0 &&
"not a start location for a FileID") ? void (0) : __assert_fail
("IDAndOffset.second == 0 && \"not a start location for a FileID\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 5788, __extension__ __PRETTY_FUNCTION__))
;
5789 unsigned Transitions = Record[Idx++];
5790
5791 // Note that we don't need to set up Parent/ParentOffset here, because
5792 // we won't be changing the diagnostic state within imported FileIDs
5793 // (other than perhaps appending to the main source file, which has no
5794 // parent).
5795 auto &F = Diag.DiagStatesByLoc.Files[IDAndOffset.first];
5796 F.StateTransitions.reserve(F.StateTransitions.size() + Transitions);
5797 for (unsigned I = 0; I != Transitions; ++I) {
5798 unsigned Offset = Record[Idx++];
5799 auto *State =
5800 ReadDiagState(*FirstState, Loc.getLocWithOffset(Offset), false);
5801 F.StateTransitions.push_back({State, Offset});
5802 }
5803 }
5804
5805 // Read the final state.
5806 assert(Idx < Record.size() &&(static_cast <bool> (Idx < Record.size() && "Invalid data, missing final pragma diagnostic state"
) ? void (0) : __assert_fail ("Idx < Record.size() && \"Invalid data, missing final pragma diagnostic state\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 5807, __extension__ __PRETTY_FUNCTION__))
5807 "Invalid data, missing final pragma diagnostic state")(static_cast <bool> (Idx < Record.size() && "Invalid data, missing final pragma diagnostic state"
) ? void (0) : __assert_fail ("Idx < Record.size() && \"Invalid data, missing final pragma diagnostic state\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 5807, __extension__ __PRETTY_FUNCTION__))
;
5808 SourceLocation CurStateLoc =
5809 ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]);
5810 auto *CurState = ReadDiagState(*FirstState, CurStateLoc, false);
5811
5812 if (!F.isModule()) {
5813 Diag.DiagStatesByLoc.CurDiagState = CurState;
5814 Diag.DiagStatesByLoc.CurDiagStateLoc = CurStateLoc;
5815
5816 // Preserve the property that the imaginary root file describes the
5817 // current state.
5818 FileID NullFile;
5819 auto &T = Diag.DiagStatesByLoc.Files[NullFile].StateTransitions;
5820 if (T.empty())
5821 T.push_back({CurState, 0});
5822 else
5823 T[0].State = CurState;
5824 }
5825
5826 // Don't try to read these mappings again.
5827 Record.clear();
5828 }
5829}
5830
5831/// \brief Get the correct cursor and offset for loading a type.
5832ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) {
5833 GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index);
5834 assert(I != GlobalTypeMap.end() && "Corrupted global type map")(static_cast <bool> (I != GlobalTypeMap.end() &&
"Corrupted global type map") ? void (0) : __assert_fail ("I != GlobalTypeMap.end() && \"Corrupted global type map\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 5834, __extension__ __PRETTY_FUNCTION__))
;
5835 ModuleFile *M = I->second;
5836 return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex]);
5837}
5838
5839/// \brief Read and return the type with the given index..
5840///
5841/// The index is the type ID, shifted and minus the number of predefs. This
5842/// routine actually reads the record corresponding to the type at the given
5843/// location. It is a helper routine for GetType, which deals with reading type
5844/// IDs.
5845QualType ASTReader::readTypeRecord(unsigned Index) {
5846 assert(ContextObj && "reading type with no AST context")(static_cast <bool> (ContextObj && "reading type with no AST context"
) ? void (0) : __assert_fail ("ContextObj && \"reading type with no AST context\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 5846, __extension__ __PRETTY_FUNCTION__))
;
5847 ASTContext &Context = *ContextObj;
5848 RecordLocation Loc = TypeCursorForIndex(Index);
5849 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
5850
5851 // Keep track of where we are in the stream, then jump back there
5852 // after reading this type.
5853 SavedStreamPosition SavedPosition(DeclsCursor);
5854
5855 ReadingKindTracker ReadingKind(Read_Type, *this);
5856
5857 // Note that we are loading a type record.
5858 Deserializing AType(this);
5859
5860 unsigned Idx = 0;
5861 DeclsCursor.JumpToBit(Loc.Offset);
5862 RecordData Record;
5863 unsigned Code = DeclsCursor.ReadCode();
5864 switch ((TypeCode)DeclsCursor.readRecord(Code, Record)) {
5865 case TYPE_EXT_QUAL: {
5866 if (Record.size() != 2) {
5867 Error("Incorrect encoding of extended qualifier type");
5868 return QualType();
5869 }
5870 QualType Base = readType(*Loc.F, Record, Idx);
5871 Qualifiers Quals = Qualifiers::fromOpaqueValue(Record[Idx++]);
5872 return Context.getQualifiedType(Base, Quals);
5873 }
5874
5875 case TYPE_COMPLEX: {
5876 if (Record.size() != 1) {
5877 Error("Incorrect encoding of complex type");
5878 return QualType();
5879 }
5880 QualType ElemType = readType(*Loc.F, Record, Idx);
5881 return Context.getComplexType(ElemType);
5882 }
5883
5884 case TYPE_POINTER: {
5885 if (Record.size() != 1) {
5886 Error("Incorrect encoding of pointer type");
5887 return QualType();
5888 }
5889 QualType PointeeType = readType(*Loc.F, Record, Idx);
5890 return Context.getPointerType(PointeeType);
5891 }
5892
5893 case TYPE_DECAYED: {
5894 if (Record.size() != 1) {
5895 Error("Incorrect encoding of decayed type");
5896 return QualType();
5897 }
5898 QualType OriginalType = readType(*Loc.F, Record, Idx);
5899 QualType DT = Context.getAdjustedParameterType(OriginalType);
5900 if (!isa<DecayedType>(DT))
5901 Error("Decayed type does not decay");
5902 return DT;
5903 }
5904
5905 case TYPE_ADJUSTED: {
5906 if (Record.size() != 2) {
5907 Error("Incorrect encoding of adjusted type");
5908 return QualType();
5909 }
5910 QualType OriginalTy = readType(*Loc.F, Record, Idx);
5911 QualType AdjustedTy = readType(*Loc.F, Record, Idx);
5912 return Context.getAdjustedType(OriginalTy, AdjustedTy);
5913 }
5914
5915 case TYPE_BLOCK_POINTER: {
5916 if (Record.size() != 1) {
5917 Error("Incorrect encoding of block pointer type");
5918 return QualType();
5919 }
5920 QualType PointeeType = readType(*Loc.F, Record, Idx);
5921 return Context.getBlockPointerType(PointeeType);
5922 }
5923
5924 case TYPE_LVALUE_REFERENCE: {
5925 if (Record.size() != 2) {
5926 Error("Incorrect encoding of lvalue reference type");
5927 return QualType();
5928 }
5929 QualType PointeeType = readType(*Loc.F, Record, Idx);
5930 return Context.getLValueReferenceType(PointeeType, Record[1]);
5931 }
5932
5933 case TYPE_RVALUE_REFERENCE: {
5934 if (Record.size() != 1) {
5935 Error("Incorrect encoding of rvalue reference type");
5936 return QualType();
5937 }
5938 QualType PointeeType = readType(*Loc.F, Record, Idx);
5939 return Context.getRValueReferenceType(PointeeType);
5940 }
5941
5942 case TYPE_MEMBER_POINTER: {
5943 if (Record.size() != 2) {
5944 Error("Incorrect encoding of member pointer type");
5945 return QualType();
5946 }
5947 QualType PointeeType = readType(*Loc.F, Record, Idx);
5948 QualType ClassType = readType(*Loc.F, Record, Idx);
5949 if (PointeeType.isNull() || ClassType.isNull())
5950 return QualType();
5951
5952 return Context.getMemberPointerType(PointeeType, ClassType.getTypePtr());
5953 }
5954
5955 case TYPE_CONSTANT_ARRAY: {
5956 QualType ElementType = readType(*Loc.F, Record, Idx);
5957 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5958 unsigned IndexTypeQuals = Record[2];
5959 unsigned Idx = 3;
5960 llvm::APInt Size = ReadAPInt(Record, Idx);
5961 return Context.getConstantArrayType(ElementType, Size,
5962 ASM, IndexTypeQuals);
5963 }
5964
5965 case TYPE_INCOMPLETE_ARRAY: {
5966 QualType ElementType = readType(*Loc.F, Record, Idx);
5967 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5968 unsigned IndexTypeQuals = Record[2];
5969 return Context.getIncompleteArrayType(ElementType, ASM, IndexTypeQuals);
5970 }
5971
5972 case TYPE_VARIABLE_ARRAY: {
5973 QualType ElementType = readType(*Loc.F, Record, Idx);
5974 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5975 unsigned IndexTypeQuals = Record[2];
5976 SourceLocation LBLoc = ReadSourceLocation(*Loc.F, Record[3]);
5977 SourceLocation RBLoc = ReadSourceLocation(*Loc.F, Record[4]);
5978 return Context.getVariableArrayType(ElementType, ReadExpr(*Loc.F),
5979 ASM, IndexTypeQuals,
5980 SourceRange(LBLoc, RBLoc));
5981 }
5982
5983 case TYPE_VECTOR: {
5984 if (Record.size() != 3) {
5985 Error("incorrect encoding of vector type in AST file");
5986 return QualType();
5987 }
5988
5989 QualType ElementType = readType(*Loc.F, Record, Idx);
5990 unsigned NumElements = Record[1];
5991 unsigned VecKind = Record[2];
5992 return Context.getVectorType(ElementType, NumElements,
5993 (VectorType::VectorKind)VecKind);
5994 }
5995
5996 case TYPE_EXT_VECTOR: {
5997 if (Record.size() != 3) {
5998 Error("incorrect encoding of extended vector type in AST file");
5999 return QualType();
6000 }
6001
6002 QualType ElementType = readType(*Loc.F, Record, Idx);
6003 unsigned NumElements = Record[1];
6004 return Context.getExtVectorType(ElementType, NumElements);
6005 }
6006
6007 case TYPE_FUNCTION_NO_PROTO: {
6008 if (Record.size() != 8) {
6009 Error("incorrect encoding of no-proto function type");
6010 return QualType();
6011 }
6012 QualType ResultType = readType(*Loc.F, Record, Idx);
6013 FunctionType::ExtInfo Info(Record[1], Record[2], Record[3],
6014 (CallingConv)Record[4], Record[5], Record[6],
6015 Record[7]);
6016 return Context.getFunctionNoProtoType(ResultType, Info);
6017 }
6018
6019 case TYPE_FUNCTION_PROTO: {
6020 QualType ResultType = readType(*Loc.F, Record, Idx);
6021
6022 FunctionProtoType::ExtProtoInfo EPI;
6023 EPI.ExtInfo = FunctionType::ExtInfo(/*noreturn*/ Record[1],
6024 /*hasregparm*/ Record[2],
6025 /*regparm*/ Record[3],
6026 static_cast<CallingConv>(Record[4]),
6027 /*produces*/ Record[5],
6028 /*nocallersavedregs*/ Record[6],
6029 /*nocfcheck*/ Record[7]);
6030
6031 unsigned Idx = 8;
6032
6033 EPI.Variadic = Record[Idx++];
6034 EPI.HasTrailingReturn = Record[Idx++];
6035 EPI.TypeQuals = Record[Idx++];
6036 EPI.RefQualifier = static_cast<RefQualifierKind>(Record[Idx++]);
6037 SmallVector<QualType, 8> ExceptionStorage;
6038 readExceptionSpec(*Loc.F, ExceptionStorage, EPI.ExceptionSpec, Record, Idx);
6039
6040 unsigned NumParams = Record[Idx++];
6041 SmallVector<QualType, 16> ParamTypes;
6042 for (unsigned I = 0; I != NumParams; ++I)
6043 ParamTypes.push_back(readType(*Loc.F, Record, Idx));
6044
6045 SmallVector<FunctionProtoType::ExtParameterInfo, 4> ExtParameterInfos;
6046 if (Idx != Record.size()) {
6047 for (unsigned I = 0; I != NumParams; ++I)
6048 ExtParameterInfos.push_back(
6049 FunctionProtoType::ExtParameterInfo
6050 ::getFromOpaqueValue(Record[Idx++]));
6051 EPI.ExtParameterInfos = ExtParameterInfos.data();
6052 }
6053
6054 assert(Idx == Record.size())(static_cast <bool> (Idx == Record.size()) ? void (0) :
__assert_fail ("Idx == Record.size()", "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 6054, __extension__ __PRETTY_FUNCTION__))
;
6055
6056 return Context.getFunctionType(ResultType, ParamTypes, EPI);
6057 }
6058
6059 case TYPE_UNRESOLVED_USING: {
6060 unsigned Idx = 0;
6061 return Context.getTypeDeclType(
6062 ReadDeclAs<UnresolvedUsingTypenameDecl>(*Loc.F, Record, Idx));
6063 }
6064
6065 case TYPE_TYPEDEF: {
6066 if (Record.size() != 2) {
6067 Error("incorrect encoding of typedef type");
6068 return QualType();
6069 }
6070 unsigned Idx = 0;
6071 TypedefNameDecl *Decl = ReadDeclAs<TypedefNameDecl>(*Loc.F, Record, Idx);
6072 QualType Canonical = readType(*Loc.F, Record, Idx);
6073 if (!Canonical.isNull())
6074 Canonical = Context.getCanonicalType(Canonical);
6075 return Context.getTypedefType(Decl, Canonical);
6076 }
6077
6078 case TYPE_TYPEOF_EXPR:
6079 return Context.getTypeOfExprType(ReadExpr(*Loc.F));
6080
6081 case TYPE_TYPEOF: {
6082 if (Record.size() != 1) {
6083 Error("incorrect encoding of typeof(type) in AST file");
6084 return QualType();
6085 }
6086 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
6087 return Context.getTypeOfType(UnderlyingType);
6088 }
6089
6090 case TYPE_DECLTYPE: {
6091 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
6092 return Context.getDecltypeType(ReadExpr(*Loc.F), UnderlyingType);
6093 }
6094
6095 case TYPE_UNARY_TRANSFORM: {
6096 QualType BaseType = readType(*Loc.F, Record, Idx);
6097 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
6098 UnaryTransformType::UTTKind UKind = (UnaryTransformType::UTTKind)Record[2];
6099 return Context.getUnaryTransformType(BaseType, UnderlyingType, UKind);
6100 }
6101
6102 case TYPE_AUTO: {
6103 QualType Deduced = readType(*Loc.F, Record, Idx);
6104 AutoTypeKeyword Keyword = (AutoTypeKeyword)Record[Idx++];
6105 bool IsDependent = Deduced.isNull() ? Record[Idx++] : false;
6106 return Context.getAutoType(Deduced, Keyword, IsDependent);
6107 }
6108
6109 case TYPE_DEDUCED_TEMPLATE_SPECIALIZATION: {
6110 TemplateName Name = ReadTemplateName(*Loc.F, Record, Idx);
6111 QualType Deduced = readType(*Loc.F, Record, Idx);
6112 bool IsDependent = Deduced.isNull() ? Record[Idx++] : false;
6113 return Context.getDeducedTemplateSpecializationType(Name, Deduced,
6114 IsDependent);
6115 }
6116
6117 case TYPE_RECORD: {
6118 if (Record.size() != 2) {
6119 Error("incorrect encoding of record type");
6120 return QualType();
6121 }
6122 unsigned Idx = 0;
6123 bool IsDependent = Record[Idx++];
6124 RecordDecl *RD = ReadDeclAs<RecordDecl>(*Loc.F, Record, Idx);
6125 RD = cast_or_null<RecordDecl>(RD->getCanonicalDecl());
6126 QualType T = Context.getRecordType(RD);
6127 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
6128 return T;
6129 }
6130
6131 case TYPE_ENUM: {
6132 if (Record.size() != 2) {
6133 Error("incorrect encoding of enum type");
6134 return QualType();
6135 }
6136 unsigned Idx = 0;
6137 bool IsDependent = Record[Idx++];
6138 QualType T
6139 = Context.getEnumType(ReadDeclAs<EnumDecl>(*Loc.F, Record, Idx));
6140 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
6141 return T;
6142 }
6143
6144 case TYPE_ATTRIBUTED: {
6145 if (Record.size() != 3) {
6146 Error("incorrect encoding of attributed type");
6147 return QualType();
6148 }
6149 QualType modifiedType = readType(*Loc.F, Record, Idx);
6150 QualType equivalentType = readType(*Loc.F, Record, Idx);
6151 AttributedType::Kind kind = static_cast<AttributedType::Kind>(Record[2]);
6152 return Context.getAttributedType(kind, modifiedType, equivalentType);
6153 }
6154
6155 case TYPE_PAREN: {
6156 if (Record.size() != 1) {
6157 Error("incorrect encoding of paren type");
6158 return QualType();
6159 }
6160 QualType InnerType = readType(*Loc.F, Record, Idx);
6161 return Context.getParenType(InnerType);
6162 }
6163
6164 case TYPE_PACK_EXPANSION: {
6165 if (Record.size() != 2) {
6166 Error("incorrect encoding of pack expansion type");
6167 return QualType();
6168 }
6169 QualType Pattern = readType(*Loc.F, Record, Idx);
6170 if (Pattern.isNull())
6171 return QualType();
6172 Optional<unsigned> NumExpansions;
6173 if (Record[1])
6174 NumExpansions = Record[1] - 1;
6175 return Context.getPackExpansionType(Pattern, NumExpansions);
6176 }
6177
6178 case TYPE_ELABORATED: {
6179 unsigned Idx = 0;
6180 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
6181 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
6182 QualType NamedType = readType(*Loc.F, Record, Idx);
6183 return Context.getElaboratedType(Keyword, NNS, NamedType);
6184 }
6185
6186 case TYPE_OBJC_INTERFACE: {
6187 unsigned Idx = 0;
6188 ObjCInterfaceDecl *ItfD
6189 = ReadDeclAs<ObjCInterfaceDecl>(*Loc.F, Record, Idx);
6190 return Context.getObjCInterfaceType(ItfD->getCanonicalDecl());
6191 }
6192
6193 case TYPE_OBJC_TYPE_PARAM: {
6194 unsigned Idx = 0;
6195 ObjCTypeParamDecl *Decl
6196 = ReadDeclAs<ObjCTypeParamDecl>(*Loc.F, Record, Idx);
6197 unsigned NumProtos = Record[Idx++];
6198 SmallVector<ObjCProtocolDecl*, 4> Protos;
6199 for (unsigned I = 0; I != NumProtos; ++I)
6200 Protos.push_back(ReadDeclAs<ObjCProtocolDecl>(*Loc.F, Record, Idx));
6201 return Context.getObjCTypeParamType(Decl, Protos);
6202 }
6203
6204 case TYPE_OBJC_OBJECT: {
6205 unsigned Idx = 0;
6206 QualType Base = readType(*Loc.F, Record, Idx);
6207 unsigned NumTypeArgs = Record[Idx++];
6208 SmallVector<QualType, 4> TypeArgs;
6209 for (unsigned I = 0; I != NumTypeArgs; ++I)
6210 TypeArgs.push_back(readType(*Loc.F, Record, Idx));
6211 unsigned NumProtos = Record[Idx++];
6212 SmallVector<ObjCProtocolDecl*, 4> Protos;
6213 for (unsigned I = 0; I != NumProtos; ++I)
6214 Protos.push_back(ReadDeclAs<ObjCProtocolDecl>(*Loc.F, Record, Idx));
6215 bool IsKindOf = Record[Idx++];
6216 return Context.getObjCObjectType(Base, TypeArgs, Protos, IsKindOf);
6217 }
6218
6219 case TYPE_OBJC_OBJECT_POINTER: {
6220 unsigned Idx = 0;
6221 QualType Pointee = readType(*Loc.F, Record, Idx);
6222 return Context.getObjCObjectPointerType(Pointee);
6223 }
6224
6225 case TYPE_SUBST_TEMPLATE_TYPE_PARM: {
6226 unsigned Idx = 0;
6227 QualType Parm = readType(*Loc.F, Record, Idx);
6228 QualType Replacement = readType(*Loc.F, Record, Idx);
6229 return Context.getSubstTemplateTypeParmType(
6230 cast<TemplateTypeParmType>(Parm),
6231 Context.getCanonicalType(Replacement));
6232 }
6233
6234 case TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK: {
6235 unsigned Idx = 0;
6236 QualType Parm = readType(*Loc.F, Record, Idx);
6237 TemplateArgument ArgPack = ReadTemplateArgument(*Loc.F, Record, Idx);
6238 return Context.getSubstTemplateTypeParmPackType(
6239 cast<TemplateTypeParmType>(Parm),
6240 ArgPack);
6241 }
6242
6243 case TYPE_INJECTED_CLASS_NAME: {
6244 CXXRecordDecl *D = ReadDeclAs<CXXRecordDecl>(*Loc.F, Record, Idx);
6245 QualType TST = readType(*Loc.F, Record, Idx); // probably derivable
6246 // FIXME: ASTContext::getInjectedClassNameType is not currently suitable
6247 // for AST reading, too much interdependencies.
6248 const Type *T = nullptr;
6249 for (auto *DI = D; DI; DI = DI->getPreviousDecl()) {
6250 if (const Type *Existing = DI->getTypeForDecl()) {
6251 T = Existing;
6252 break;
6253 }
6254 }
6255 if (!T) {
6256 T = new (Context, TypeAlignment) InjectedClassNameType(D, TST);
6257 for (auto *DI = D; DI; DI = DI->getPreviousDecl())
6258 DI->setTypeForDecl(T);
6259 }
6260 return QualType(T, 0);
6261 }
6262
6263 case TYPE_TEMPLATE_TYPE_PARM: {
6264 unsigned Idx = 0;
6265 unsigned Depth = Record[Idx++];
6266 unsigned Index = Record[Idx++];
6267 bool Pack = Record[Idx++];
6268 TemplateTypeParmDecl *D
6269 = ReadDeclAs<TemplateTypeParmDecl>(*Loc.F, Record, Idx);
6270 return Context.getTemplateTypeParmType(Depth, Index, Pack, D);
6271 }
6272
6273 case TYPE_DEPENDENT_NAME: {
6274 unsigned Idx = 0;
6275 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
6276 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
6277 const IdentifierInfo *Name = GetIdentifierInfo(*Loc.F, Record, Idx);
6278 QualType Canon = readType(*Loc.F, Record, Idx);
6279 if (!Canon.isNull())
6280 Canon = Context.getCanonicalType(Canon);
6281 return Context.getDependentNameType(Keyword, NNS, Name, Canon);
6282 }
6283
6284 case TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION: {
6285 unsigned Idx = 0;
6286 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
6287 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
6288 const IdentifierInfo *Name = GetIdentifierInfo(*Loc.F, Record, Idx);
6289 unsigned NumArgs = Record[Idx++];
6290 SmallVector<TemplateArgument, 8> Args;
6291 Args.reserve(NumArgs);
6292 while (NumArgs--)
6293 Args.push_back(ReadTemplateArgument(*Loc.F, Record, Idx));
6294 return Context.getDependentTemplateSpecializationType(Keyword, NNS, Name,
6295 Args);
6296 }
6297
6298 case TYPE_DEPENDENT_SIZED_ARRAY: {
6299 unsigned Idx = 0;
6300
6301 // ArrayType
6302 QualType ElementType = readType(*Loc.F, Record, Idx);
6303 ArrayType::ArraySizeModifier ASM
6304 = (ArrayType::ArraySizeModifier)Record[Idx++];
6305 unsigned IndexTypeQuals = Record[Idx++];
6306
6307 // DependentSizedArrayType
6308 Expr *NumElts = ReadExpr(*Loc.F);
6309 SourceRange Brackets = ReadSourceRange(*Loc.F, Record, Idx);
6310
6311 return Context.getDependentSizedArrayType(ElementType, NumElts, ASM,
6312 IndexTypeQuals, Brackets);
6313 }
6314
6315 case TYPE_TEMPLATE_SPECIALIZATION: {
6316 unsigned Idx = 0;
6317 bool IsDependent = Record[Idx++];
6318 TemplateName Name = ReadTemplateName(*Loc.F, Record, Idx);
6319 SmallVector<TemplateArgument, 8> Args;
6320 ReadTemplateArgumentList(Args, *Loc.F, Record, Idx);
6321 QualType Underlying = readType(*Loc.F, Record, Idx);
6322 QualType T;
6323 if (Underlying.isNull())
6324 T = Context.getCanonicalTemplateSpecializationType(Name, Args);
6325 else
6326 T = Context.getTemplateSpecializationType(Name, Args, Underlying);
6327 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
6328 return T;
6329 }
6330
6331 case TYPE_ATOMIC: {
6332 if (Record.size() != 1) {
6333 Error("Incorrect encoding of atomic type");
6334 return QualType();
6335 }
6336 QualType ValueType = readType(*Loc.F, Record, Idx);
6337 return Context.getAtomicType(ValueType);
6338 }
6339
6340 case TYPE_PIPE: {
6341 if (Record.size() != 2) {
6342 Error("Incorrect encoding of pipe type");
6343 return QualType();
6344 }
6345
6346 // Reading the pipe element type.
6347 QualType ElementType = readType(*Loc.F, Record, Idx);
6348 unsigned ReadOnly = Record[1];
6349 return Context.getPipeType(ElementType, ReadOnly);
6350 }
6351
6352 case TYPE_DEPENDENT_SIZED_EXT_VECTOR: {
6353 unsigned Idx = 0;
6354
6355 // DependentSizedExtVectorType
6356 QualType ElementType = readType(*Loc.F, Record, Idx);
6357 Expr *SizeExpr = ReadExpr(*Loc.F);
6358 SourceLocation AttrLoc = ReadSourceLocation(*Loc.F, Record, Idx);
6359
6360 return Context.getDependentSizedExtVectorType(ElementType, SizeExpr,
6361 AttrLoc);
6362 }
6363
6364 case TYPE_DEPENDENT_ADDRESS_SPACE: {
6365 unsigned Idx = 0;
6366
6367 // DependentAddressSpaceType
6368 QualType PointeeType = readType(*Loc.F, Record, Idx);
6369 Expr *AddrSpaceExpr = ReadExpr(*Loc.F);
6370 SourceLocation AttrLoc = ReadSourceLocation(*Loc.F, Record, Idx);
6371
6372 return Context.getDependentAddressSpaceType(PointeeType, AddrSpaceExpr,
6373 AttrLoc);
6374 }
6375 }
6376 llvm_unreachable("Invalid TypeCode!")::llvm::llvm_unreachable_internal("Invalid TypeCode!", "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 6376)
;
6377}
6378
6379void ASTReader::readExceptionSpec(ModuleFile &ModuleFile,
6380 SmallVectorImpl<QualType> &Exceptions,
6381 FunctionProtoType::ExceptionSpecInfo &ESI,
6382 const RecordData &Record, unsigned &Idx) {
6383 ExceptionSpecificationType EST =
6384 static_cast<ExceptionSpecificationType>(Record[Idx++]);
6385 ESI.Type = EST;
6386 if (EST == EST_Dynamic) {
6387 for (unsigned I = 0, N = Record[Idx++]; I != N; ++I)
6388 Exceptions.push_back(readType(ModuleFile, Record, Idx));
6389 ESI.Exceptions = Exceptions;
6390 } else if (EST == EST_ComputedNoexcept) {
6391 ESI.NoexceptExpr = ReadExpr(ModuleFile);
6392 } else if (EST == EST_Uninstantiated) {
6393 ESI.SourceDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
6394 ESI.SourceTemplate = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
6395 } else if (EST == EST_Unevaluated) {
6396 ESI.SourceDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
6397 }
6398}
6399
6400namespace clang {
6401
6402class TypeLocReader : public TypeLocVisitor<TypeLocReader> {
6403 ModuleFile *F;
6404 ASTReader *Reader;
6405 const ASTReader::RecordData &Record;
6406 unsigned &Idx;
6407
6408 SourceLocation ReadSourceLocation() {
6409 return Reader->ReadSourceLocation(*F, Record, Idx);
6410 }
6411
6412 TypeSourceInfo *GetTypeSourceInfo() {
6413 return Reader->GetTypeSourceInfo(*F, Record, Idx);
6414 }
6415
6416 NestedNameSpecifierLoc ReadNestedNameSpecifierLoc() {
6417 return Reader->ReadNestedNameSpecifierLoc(*F, Record, Idx);
6418 }
6419
6420public:
6421 TypeLocReader(ModuleFile &F, ASTReader &Reader,
6422 const ASTReader::RecordData &Record, unsigned &Idx)
6423 : F(&F), Reader(&Reader), Record(Record), Idx(Idx) {}
6424
6425 // We want compile-time assurance that we've enumerated all of
6426 // these, so unfortunately we have to declare them first, then
6427 // define them out-of-line.
6428#define ABSTRACT_TYPELOC(CLASS, PARENT)
6429#define TYPELOC(CLASS, PARENT) \
6430 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
6431#include "clang/AST/TypeLocNodes.def"
6432
6433 void VisitFunctionTypeLoc(FunctionTypeLoc);
6434 void VisitArrayTypeLoc(ArrayTypeLoc);
6435};
6436
6437} // namespace clang
6438
6439void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
6440 // nothing to do
6441}
6442
6443void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
6444 TL.setBuiltinLoc(ReadSourceLocation());
6445 if (TL.needsExtraLocalData()) {
6446 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Record[Idx++]));
6447 TL.setWrittenSignSpec(static_cast<DeclSpec::TSS>(Record[Idx++]));
6448 TL.setWrittenWidthSpec(static_cast<DeclSpec::TSW>(Record[Idx++]));
6449 TL.setModeAttr(Record[Idx++]);
6450 }
6451}
6452
6453void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
6454 TL.setNameLoc(ReadSourceLocation());
6455}
6456
6457void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
6458 TL.setStarLoc(ReadSourceLocation());
6459}
6460
6461void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
6462 // nothing to do
6463}
6464
6465void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
6466 // nothing to do
6467}
6468
6469void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
6470 TL.setCaretLoc(ReadSourceLocation());
6471}
6472
6473void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
6474 TL.setAmpLoc(ReadSourceLocation());
6475}
6476
6477void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
6478 TL.setAmpAmpLoc(ReadSourceLocation());
6479}
6480
6481void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
6482 TL.setStarLoc(ReadSourceLocation());
6483 TL.setClassTInfo(GetTypeSourceInfo());
6484}
6485
6486void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) {
6487 TL.setLBracketLoc(ReadSourceLocation());
6488 TL.setRBracketLoc(ReadSourceLocation());
6489 if (Record[Idx++])
6490 TL.setSizeExpr(Reader->ReadExpr(*F));
6491 else
6492 TL.setSizeExpr(nullptr);
6493}
6494
6495void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) {
6496 VisitArrayTypeLoc(TL);
6497}
6498
6499void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) {
6500 VisitArrayTypeLoc(TL);
6501}
6502
6503void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
6504 VisitArrayTypeLoc(TL);
6505}
6506
6507void TypeLocReader::VisitDependentSizedArrayTypeLoc(
6508 DependentSizedArrayTypeLoc TL) {
6509 VisitArrayTypeLoc(TL);
6510}
6511
6512void TypeLocReader::VisitDependentAddressSpaceTypeLoc(
6513 DependentAddressSpaceTypeLoc TL) {
6514
6515 TL.setAttrNameLoc(ReadSourceLocation());
6516 SourceRange range;
6517 range.setBegin(ReadSourceLocation());
6518 range.setEnd(ReadSourceLocation());
6519 TL.setAttrOperandParensRange(range);
6520 TL.setAttrExprOperand(Reader->ReadExpr(*F));
6521}
6522
6523void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
6524 DependentSizedExtVectorTypeLoc TL) {
6525 TL.setNameLoc(ReadSourceLocation());
6526}
6527
6528void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
6529 TL.setNameLoc(ReadSourceLocation());
6530}
6531
6532void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
6533 TL.setNameLoc(ReadSourceLocation());
6534}
6535
6536void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) {
6537 TL.setLocalRangeBegin(ReadSourceLocation());
6538 TL.setLParenLoc(ReadSourceLocation());
6539 TL.setRParenLoc(ReadSourceLocation());
6540 TL.setExceptionSpecRange(SourceRange(Reader->ReadSourceLocation(*F, Record, Idx),
6541 Reader->ReadSourceLocation(*F, Record, Idx)));
6542 TL.setLocalRangeEnd(ReadSourceLocation());
6543 for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) {
6544 TL.setParam(i, Reader->ReadDeclAs<ParmVarDecl>(*F, Record, Idx));
6545 }
6546}
6547
6548void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) {
6549 VisitFunctionTypeLoc(TL);
6550}
6551
6552void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) {
6553 VisitFunctionTypeLoc(TL);
6554}
6555
6556void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
6557 TL.setNameLoc(ReadSourceLocation());
6558}
6559
6560void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
6561 TL.setNameLoc(ReadSourceLocation());
6562}
6563
6564void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
6565 TL.setTypeofLoc(ReadSourceLocation());
6566 TL.setLParenLoc(ReadSourceLocation());
6567 TL.setRParenLoc(ReadSourceLocation());
6568}
6569
6570void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
6571 TL.setTypeofLoc(ReadSourceLocation());
6572 TL.setLParenLoc(ReadSourceLocation());
6573 TL.setRParenLoc(ReadSourceLocation());
6574 TL.setUnderlyingTInfo(GetTypeSourceInfo());
6575}
6576
6577void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
6578 TL.setNameLoc(ReadSourceLocation());
6579}
6580
6581void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
6582 TL.setKWLoc(ReadSourceLocation());
6583 TL.setLParenLoc(ReadSourceLocation());
6584 TL.setRParenLoc(ReadSourceLocation());
6585 TL.setUnderlyingTInfo(GetTypeSourceInfo());
6586}
6587
6588void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) {
6589 TL.setNameLoc(ReadSourceLocation());
6590}
6591
6592void TypeLocReader::VisitDeducedTemplateSpecializationTypeLoc(
6593 DeducedTemplateSpecializationTypeLoc TL) {
6594 TL.setTemplateNameLoc(ReadSourceLocation());
6595}
6596
6597void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) {
6598 TL.setNameLoc(ReadSourceLocation());
6599}
6600
6601void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) {
6602 TL.setNameLoc(ReadSourceLocation());
6603}
6604
6605void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
6606 TL.setAttrNameLoc(ReadSourceLocation());
6607 if (TL.hasAttrOperand()) {
6608 SourceRange range;
6609 range.setBegin(ReadSourceLocation());
6610 range.setEnd(ReadSourceLocation());
6611 TL.setAttrOperandParensRange(range);
6612 }
6613 if (TL.hasAttrExprOperand()) {
6614 if (Record[Idx++])
6615 TL.setAttrExprOperand(Reader->ReadExpr(*F));
6616 else
6617 TL.setAttrExprOperand(nullptr);
6618 } else if (TL.hasAttrEnumOperand())
6619 TL.setAttrEnumOperandLoc(ReadSourceLocation());
6620}
6621
6622void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
6623 TL.setNameLoc(ReadSourceLocation());
6624}
6625
6626void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
6627 SubstTemplateTypeParmTypeLoc TL) {
6628 TL.setNameLoc(ReadSourceLocation());
6629}
6630
6631void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
6632 SubstTemplateTypeParmPackTypeLoc TL) {
6633 TL.setNameLoc(ReadSourceLocation());
6634}
6635
6636void TypeLocReader::VisitTemplateSpecializationTypeLoc(
6637 TemplateSpecializationTypeLoc TL) {
6638 TL.setTemplateKeywordLoc(ReadSourceLocation());
6639 TL.setTemplateNameLoc(ReadSourceLocation());
6640 TL.setLAngleLoc(ReadSourceLocation());
6641 TL.setRAngleLoc(ReadSourceLocation());
6642 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i)
6643 TL.setArgLocInfo(
6644 i,
6645 Reader->GetTemplateArgumentLocInfo(
6646 *F, TL.getTypePtr()->getArg(i).getKind(), Record, Idx));
6647}
6648
6649void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
6650 TL.setLParenLoc(ReadSourceLocation());
6651 TL.setRParenLoc(ReadSourceLocation());
6652}
6653
6654void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
6655 TL.setElaboratedKeywordLoc(ReadSourceLocation());
6656 TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
6657}
6658
6659void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
6660 TL.setNameLoc(ReadSourceLocation());
6661}
6662
6663void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
6664 TL.setElaboratedKeywordLoc(ReadSourceLocation());
6665 TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
6666 TL.setNameLoc(ReadSourceLocation());
6667}
6668
6669void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc(
6670 DependentTemplateSpecializationTypeLoc TL) {
6671 TL.setElaboratedKeywordLoc(ReadSourceLocation());
6672 TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
6673 TL.setTemplateKeywordLoc(ReadSourceLocation());
6674 TL.setTemplateNameLoc(ReadSourceLocation());
6675 TL.setLAngleLoc(ReadSourceLocation());
6676 TL.setRAngleLoc(ReadSourceLocation());
6677 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
6678 TL.setArgLocInfo(
6679 I,
6680 Reader->GetTemplateArgumentLocInfo(
6681 *F, TL.getTypePtr()->getArg(I).getKind(), Record, Idx));
6682}
6683
6684void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
6685 TL.setEllipsisLoc(ReadSourceLocation());
6686}
6687
6688void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
6689 TL.setNameLoc(ReadSourceLocation());
6690}
6691
6692void TypeLocReader::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) {
6693 if (TL.getNumProtocols()) {
6694 TL.setProtocolLAngleLoc(ReadSourceLocation());
6695 TL.setProtocolRAngleLoc(ReadSourceLocation());
6696 }
6697 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
6698 TL.setProtocolLoc(i, ReadSourceLocation());
6699}
6700
6701void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
6702 TL.setHasBaseTypeAsWritten(Record[Idx++]);
6703 TL.setTypeArgsLAngleLoc(ReadSourceLocation());
6704 TL.setTypeArgsRAngleLoc(ReadSourceLocation());
6705 for (unsigned i = 0, e = TL.getNumTypeArgs(); i != e; ++i)
6706 TL.setTypeArgTInfo(i, GetTypeSourceInfo());
6707 TL.setProtocolLAngleLoc(ReadSourceLocation());
6708 TL.setProtocolRAngleLoc(ReadSourceLocation());
6709 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
6710 TL.setProtocolLoc(i, ReadSourceLocation());
6711}
6712
6713void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
6714 TL.setStarLoc(ReadSourceLocation());
6715}
6716
6717void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
6718 TL.setKWLoc(ReadSourceLocation());
6719 TL.setLParenLoc(ReadSourceLocation());
6720 TL.setRParenLoc(ReadSourceLocation());
6721}
6722
6723void TypeLocReader::VisitPipeTypeLoc(PipeTypeLoc TL) {
6724 TL.setKWLoc(ReadSourceLocation());
6725}
6726
6727TypeSourceInfo *
6728ASTReader::GetTypeSourceInfo(ModuleFile &F, const ASTReader::RecordData &Record,
6729 unsigned &Idx) {
6730 QualType InfoTy = readType(F, Record, Idx);
6731 if (InfoTy.isNull())
6732 return nullptr;
6733
6734 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy);
6735 TypeLocReader TLR(F, *this, Record, Idx);
6736 for (TypeLoc TL = TInfo->getTypeLoc(); !TL.isNull(); TL = TL.getNextTypeLoc())
6737 TLR.Visit(TL);
6738 return TInfo;
6739}
6740
6741QualType ASTReader::GetType(TypeID ID) {
6742 assert(ContextObj && "reading type with no AST context")(static_cast <bool> (ContextObj && "reading type with no AST context"
) ? void (0) : __assert_fail ("ContextObj && \"reading type with no AST context\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 6742, __extension__ __PRETTY_FUNCTION__))
;
6743 ASTContext &Context = *ContextObj;
6744
6745 unsigned FastQuals = ID & Qualifiers::FastMask;
6746 unsigned Index = ID >> Qualifiers::FastWidth;
6747
6748 if (Index < NUM_PREDEF_TYPE_IDS) {
6749 QualType T;
6750 switch ((PredefinedTypeIDs)Index) {
6751 case PREDEF_TYPE_NULL_ID:
6752 return QualType();
6753 case PREDEF_TYPE_VOID_ID:
6754 T = Context.VoidTy;
6755 break;
6756 case PREDEF_TYPE_BOOL_ID:
6757 T = Context.BoolTy;
6758 break;
6759 case PREDEF_TYPE_CHAR_U_ID:
6760 case PREDEF_TYPE_CHAR_S_ID:
6761 // FIXME: Check that the signedness of CharTy is correct!
6762 T = Context.CharTy;
6763 break;
6764 case PREDEF_TYPE_UCHAR_ID:
6765 T = Context.UnsignedCharTy;
6766 break;
6767 case PREDEF_TYPE_USHORT_ID:
6768 T = Context.UnsignedShortTy;
6769 break;
6770 case PREDEF_TYPE_UINT_ID:
6771 T = Context.UnsignedIntTy;
6772 break;
6773 case PREDEF_TYPE_ULONG_ID:
6774 T = Context.UnsignedLongTy;
6775 break;
6776 case PREDEF_TYPE_ULONGLONG_ID:
6777 T = Context.UnsignedLongLongTy;
6778 break;
6779 case PREDEF_TYPE_UINT128_ID:
6780 T = Context.UnsignedInt128Ty;
6781 break;
6782 case PREDEF_TYPE_SCHAR_ID:
6783 T = Context.SignedCharTy;
6784 break;
6785 case PREDEF_TYPE_WCHAR_ID:
6786 T = Context.WCharTy;
6787 break;
6788 case PREDEF_TYPE_SHORT_ID:
6789 T = Context.ShortTy;
6790 break;
6791 case PREDEF_TYPE_INT_ID:
6792 T = Context.IntTy;
6793 break;
6794 case PREDEF_TYPE_LONG_ID:
6795 T = Context.LongTy;
6796 break;
6797 case PREDEF_TYPE_LONGLONG_ID:
6798 T = Context.LongLongTy;
6799 break;
6800 case PREDEF_TYPE_INT128_ID:
6801 T = Context.Int128Ty;
6802 break;
6803 case PREDEF_TYPE_HALF_ID:
6804 T = Context.HalfTy;
6805 break;
6806 case PREDEF_TYPE_FLOAT_ID:
6807 T = Context.FloatTy;
6808 break;
6809 case PREDEF_TYPE_DOUBLE_ID:
6810 T = Context.DoubleTy;
6811 break;
6812 case PREDEF_TYPE_LONGDOUBLE_ID:
6813 T = Context.LongDoubleTy;
6814 break;
6815 case PREDEF_TYPE_FLOAT16_ID:
6816 T = Context.Float16Ty;
6817 break;
6818 case PREDEF_TYPE_FLOAT128_ID:
6819 T = Context.Float128Ty;
6820 break;
6821 case PREDEF_TYPE_OVERLOAD_ID:
6822 T = Context.OverloadTy;
6823 break;
6824 case PREDEF_TYPE_BOUND_MEMBER:
6825 T = Context.BoundMemberTy;
6826 break;
6827 case PREDEF_TYPE_PSEUDO_OBJECT:
6828 T = Context.PseudoObjectTy;
6829 break;
6830 case PREDEF_TYPE_DEPENDENT_ID:
6831 T = Context.DependentTy;
6832 break;
6833 case PREDEF_TYPE_UNKNOWN_ANY:
6834 T = Context.UnknownAnyTy;
6835 break;
6836 case PREDEF_TYPE_NULLPTR_ID:
6837 T = Context.NullPtrTy;
6838 break;
6839 case PREDEF_TYPE_CHAR16_ID:
6840 T = Context.Char16Ty;
6841 break;
6842 case PREDEF_TYPE_CHAR32_ID:
6843 T = Context.Char32Ty;
6844 break;
6845 case PREDEF_TYPE_OBJC_ID:
6846 T = Context.ObjCBuiltinIdTy;
6847 break;
6848 case PREDEF_TYPE_OBJC_CLASS:
6849 T = Context.ObjCBuiltinClassTy;
6850 break;
6851 case PREDEF_TYPE_OBJC_SEL:
6852 T = Context.ObjCBuiltinSelTy;
6853 break;
6854#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
6855 case PREDEF_TYPE_##Id##_ID: \
6856 T = Context.SingletonId; \
6857 break;
6858#include "clang/Basic/OpenCLImageTypes.def"
6859 case PREDEF_TYPE_SAMPLER_ID:
6860 T = Context.OCLSamplerTy;
6861 break;
6862 case PREDEF_TYPE_EVENT_ID:
6863 T = Context.OCLEventTy;
6864 break;
6865 case PREDEF_TYPE_CLK_EVENT_ID:
6866 T = Context.OCLClkEventTy;
6867 break;
6868 case PREDEF_TYPE_QUEUE_ID:
6869 T = Context.OCLQueueTy;
6870 break;
6871 case PREDEF_TYPE_RESERVE_ID_ID:
6872 T = Context.OCLReserveIDTy;
6873 break;
6874 case PREDEF_TYPE_AUTO_DEDUCT:
6875 T = Context.getAutoDeductType();
6876 break;
6877 case PREDEF_TYPE_AUTO_RREF_DEDUCT:
6878 T = Context.getAutoRRefDeductType();
6879 break;
6880 case PREDEF_TYPE_ARC_UNBRIDGED_CAST:
6881 T = Context.ARCUnbridgedCastTy;
6882 break;
6883 case PREDEF_TYPE_BUILTIN_FN:
6884 T = Context.BuiltinFnTy;
6885 break;
6886 case PREDEF_TYPE_OMP_ARRAY_SECTION:
6887 T = Context.OMPArraySectionTy;
6888 break;
6889 }
6890
6891 assert(!T.isNull() && "Unknown predefined type")(static_cast <bool> (!T.isNull() && "Unknown predefined type"
) ? void (0) : __assert_fail ("!T.isNull() && \"Unknown predefined type\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 6891, __extension__ __PRETTY_FUNCTION__))
;
6892 return T.withFastQualifiers(FastQuals);
6893 }
6894
6895 Index -= NUM_PREDEF_TYPE_IDS;
6896 assert(Index < TypesLoaded.size() && "Type index out-of-range")(static_cast <bool> (Index < TypesLoaded.size() &&
"Type index out-of-range") ? void (0) : __assert_fail ("Index < TypesLoaded.size() && \"Type index out-of-range\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 6896, __extension__ __PRETTY_FUNCTION__))
;
6897 if (TypesLoaded[Index].isNull()) {
6898 TypesLoaded[Index] = readTypeRecord(Index);
6899 if (TypesLoaded[Index].isNull())
6900 return QualType();
6901
6902 TypesLoaded[Index]->setFromAST();
6903 if (DeserializationListener)
6904 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID),
6905 TypesLoaded[Index]);
6906 }
6907
6908 return TypesLoaded[Index].withFastQualifiers(FastQuals);
6909}
6910
6911QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) {
6912 return GetType(getGlobalTypeID(F, LocalID));
6913}
6914
6915serialization::TypeID
6916ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const {
6917 unsigned FastQuals = LocalID & Qualifiers::FastMask;
6918 unsigned LocalIndex = LocalID >> Qualifiers::FastWidth;
6919
6920 if (LocalIndex < NUM_PREDEF_TYPE_IDS)
6921 return LocalID;
6922
6923 if (!F.ModuleOffsetMap.empty())
6924 ReadModuleOffsetMap(F);
6925
6926 ContinuousRangeMap<uint32_t, int, 2>::iterator I
6927 = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS);
6928 assert(I != F.TypeRemap.end() && "Invalid index into type index remap")(static_cast <bool> (I != F.TypeRemap.end() && "Invalid index into type index remap"
) ? void (0) : __assert_fail ("I != F.TypeRemap.end() && \"Invalid index into type index remap\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 6928, __extension__ __PRETTY_FUNCTION__))
;
6929
6930 unsigned GlobalIndex = LocalIndex + I->second;
6931 return (GlobalIndex << Qualifiers::FastWidth) | FastQuals;
6932}
6933
6934TemplateArgumentLocInfo
6935ASTReader::GetTemplateArgumentLocInfo(ModuleFile &F,
6936 TemplateArgument::ArgKind Kind,
6937 const RecordData &Record,
6938 unsigned &Index) {
6939 switch (Kind) {
6940 case TemplateArgument::Expression:
6941 return ReadExpr(F);
6942 case TemplateArgument::Type:
6943 return GetTypeSourceInfo(F, Record, Index);
6944 case TemplateArgument::Template: {
6945 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
6946 Index);
6947 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
6948 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
6949 SourceLocation());
6950 }
6951 case TemplateArgument::TemplateExpansion: {
6952 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
6953 Index);
6954 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
6955 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Index);
6956 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
6957 EllipsisLoc);
6958 }
6959 case TemplateArgument::Null:
6960 case TemplateArgument::Integral:
6961 case TemplateArgument::Declaration:
6962 case TemplateArgument::NullPtr:
6963 case TemplateArgument::Pack:
6964 // FIXME: Is this right?
6965 return TemplateArgumentLocInfo();
6966 }
6967 llvm_unreachable("unexpected template argument loc")::llvm::llvm_unreachable_internal("unexpected template argument loc"
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 6967)
;
6968}
6969
6970TemplateArgumentLoc
6971ASTReader::ReadTemplateArgumentLoc(ModuleFile &F,
6972 const RecordData &Record, unsigned &Index) {
6973 TemplateArgument Arg = ReadTemplateArgument(F, Record, Index);
6974
6975 if (Arg.getKind() == TemplateArgument::Expression) {
6976 if (Record[Index++]) // bool InfoHasSameExpr.
6977 return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr()));
6978 }
6979 return TemplateArgumentLoc(Arg, GetTemplateArgumentLocInfo(F, Arg.getKind(),
6980 Record, Index));
6981}
6982
6983const ASTTemplateArgumentListInfo*
6984ASTReader::ReadASTTemplateArgumentListInfo(ModuleFile &F,
6985 const RecordData &Record,
6986 unsigned &Index) {
6987 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Index);
6988 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Index);
6989 unsigned NumArgsAsWritten = Record[Index++];
6990 TemplateArgumentListInfo TemplArgsInfo(LAngleLoc, RAngleLoc);
6991 for (unsigned i = 0; i != NumArgsAsWritten; ++i)
6992 TemplArgsInfo.addArgument(ReadTemplateArgumentLoc(F, Record, Index));
6993 return ASTTemplateArgumentListInfo::Create(getContext(), TemplArgsInfo);
6994}
6995
6996Decl *ASTReader::GetExternalDecl(uint32_t ID) {
6997 return GetDecl(ID);
6998}
6999
7000void ASTReader::CompleteRedeclChain(const Decl *D) {
7001 if (NumCurrentElementsDeserializing) {
7002 // We arrange to not care about the complete redeclaration chain while we're
7003 // deserializing. Just remember that the AST has marked this one as complete
7004 // but that it's not actually complete yet, so we know we still need to
7005 // complete it later.
7006 PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D));
7007 return;
7008 }
7009
7010 const DeclContext *DC = D->getDeclContext()->getRedeclContext();
7011
7012 // If this is a named declaration, complete it by looking it up
7013 // within its context.
7014 //
7015 // FIXME: Merging a function definition should merge
7016 // all mergeable entities within it.
7017 if (isa<TranslationUnitDecl>(DC) || isa<NamespaceDecl>(DC) ||
7018 isa<CXXRecordDecl>(DC) || isa<EnumDecl>(DC)) {
7019 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) {
7020 if (!getContext().getLangOpts().CPlusPlus &&
7021 isa<TranslationUnitDecl>(DC)) {
7022 // Outside of C++, we don't have a lookup table for the TU, so update
7023 // the identifier instead. (For C++ modules, we don't store decls
7024 // in the serialized identifier table, so we do the lookup in the TU.)
7025 auto *II = Name.getAsIdentifierInfo();
7026 assert(II && "non-identifier name in C?")(static_cast <bool> (II && "non-identifier name in C?"
) ? void (0) : __assert_fail ("II && \"non-identifier name in C?\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 7026, __extension__ __PRETTY_FUNCTION__))
;
7027 if (II->isOutOfDate())
7028 updateOutOfDateIdentifier(*II);
7029 } else
7030 DC->lookup(Name);
7031 } else if (needsAnonymousDeclarationNumber(cast<NamedDecl>(D))) {
7032 // Find all declarations of this kind from the relevant context.
7033 for (auto *DCDecl : cast<Decl>(D->getLexicalDeclContext())->redecls()) {
7034 auto *DC = cast<DeclContext>(DCDecl);
7035 SmallVector<Decl*, 8> Decls;
7036 FindExternalLexicalDecls(
7037 DC, [&](Decl::Kind K) { return K == D->getKind(); }, Decls);
7038 }
7039 }
7040 }
7041
7042 if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D))
7043 CTSD->getSpecializedTemplate()->LoadLazySpecializations();
7044 if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D))
7045 VTSD->getSpecializedTemplate()->LoadLazySpecializations();
7046 if (auto *FD = dyn_cast<FunctionDecl>(D)) {
7047 if (auto *Template = FD->getPrimaryTemplate())
7048 Template->LoadLazySpecializations();
7049 }
7050}
7051
7052CXXCtorInitializer **
7053ASTReader::GetExternalCXXCtorInitializers(uint64_t Offset) {
7054 RecordLocation Loc = getLocalBitOffset(Offset);
7055 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
7056 SavedStreamPosition SavedPosition(Cursor);
7057 Cursor.JumpToBit(Loc.Offset);
7058 ReadingKindTracker ReadingKind(Read_Decl, *this);
7059
7060 RecordData Record;
7061 unsigned Code = Cursor.ReadCode();
7062 unsigned RecCode = Cursor.readRecord(Code, Record);
7063 if (RecCode != DECL_CXX_CTOR_INITIALIZERS) {
7064 Error("malformed AST file: missing C++ ctor initializers");
7065 return nullptr;
7066 }
7067
7068 unsigned Idx = 0;
7069 return ReadCXXCtorInitializers(*Loc.F, Record, Idx);
7070}
7071
7072CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) {
7073 assert(ContextObj && "reading base specifiers with no AST context")(static_cast <bool> (ContextObj && "reading base specifiers with no AST context"
) ? void (0) : __assert_fail ("ContextObj && \"reading base specifiers with no AST context\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 7073, __extension__ __PRETTY_FUNCTION__))
;
7074 ASTContext &Context = *ContextObj;
7075
7076 RecordLocation Loc = getLocalBitOffset(Offset);
7077 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
7078 SavedStreamPosition SavedPosition(Cursor);
7079 Cursor.JumpToBit(Loc.Offset);
7080 ReadingKindTracker ReadingKind(Read_Decl, *this);
7081 RecordData Record;
7082 unsigned Code = Cursor.ReadCode();
7083 unsigned RecCode = Cursor.readRecord(Code, Record);
7084 if (RecCode != DECL_CXX_BASE_SPECIFIERS) {
7085 Error("malformed AST file: missing C++ base specifiers");
7086 return nullptr;
7087 }
7088
7089 unsigned Idx = 0;
7090 unsigned NumBases = Record[Idx++];
7091 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases);
7092 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases];
7093 for (unsigned I = 0; I != NumBases; ++I)
7094 Bases[I] = ReadCXXBaseSpecifier(*Loc.F, Record, Idx);
7095 return Bases;
7096}
7097
7098serialization::DeclID
7099ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const {
7100 if (LocalID < NUM_PREDEF_DECL_IDS)
7101 return LocalID;
7102
7103 if (!F.ModuleOffsetMap.empty())
7104 ReadModuleOffsetMap(F);
7105
7106 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7107 = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS);
7108 assert(I != F.DeclRemap.end() && "Invalid index into decl index remap")(static_cast <bool> (I != F.DeclRemap.end() && "Invalid index into decl index remap"
) ? void (0) : __assert_fail ("I != F.DeclRemap.end() && \"Invalid index into decl index remap\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 7108, __extension__ __PRETTY_FUNCTION__))
;
7109
7110 return LocalID + I->second;
7111}
7112
7113bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID,
7114 ModuleFile &M) const {
7115 // Predefined decls aren't from any module.
7116 if (ID < NUM_PREDEF_DECL_IDS)
7117 return false;
7118
7119 return ID - NUM_PREDEF_DECL_IDS >= M.BaseDeclID &&
7120 ID - NUM_PREDEF_DECL_IDS < M.BaseDeclID + M.LocalNumDecls;
7121}
7122
7123ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) {
7124 if (!D->isFromASTFile())
7125 return nullptr;
7126 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID());
7127 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map")(static_cast <bool> (I != GlobalDeclMap.end() &&
"Corrupted global declaration map") ? void (0) : __assert_fail
("I != GlobalDeclMap.end() && \"Corrupted global declaration map\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 7127, __extension__ __PRETTY_FUNCTION__))
;
7128 return I->second;
7129}
7130
7131SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) {
7132 if (ID < NUM_PREDEF_DECL_IDS)
7133 return SourceLocation();
7134
7135 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
7136
7137 if (Index > DeclsLoaded.size()) {
7138 Error("declaration ID out-of-range for AST file");
7139 return SourceLocation();
7140 }
7141
7142 if (Decl *D = DeclsLoaded[Index])
7143 return D->getLocation();
7144
7145 SourceLocation Loc;
7146 DeclCursorForID(ID, Loc);
7147 return Loc;
7148}
7149
7150static Decl *getPredefinedDecl(ASTContext &Context, PredefinedDeclIDs ID) {
7151 switch (ID) {
7152 case PREDEF_DECL_NULL_ID:
7153 return nullptr;
7154
7155 case PREDEF_DECL_TRANSLATION_UNIT_ID:
7156 return Context.getTranslationUnitDecl();
7157
7158 case PREDEF_DECL_OBJC_ID_ID:
7159 return Context.getObjCIdDecl();
7160
7161 case PREDEF_DECL_OBJC_SEL_ID:
7162 return Context.getObjCSelDecl();
7163
7164 case PREDEF_DECL_OBJC_CLASS_ID:
7165 return Context.getObjCClassDecl();
7166
7167 case PREDEF_DECL_OBJC_PROTOCOL_ID:
7168 return Context.getObjCProtocolDecl();
7169
7170 case PREDEF_DECL_INT_128_ID:
7171 return Context.getInt128Decl();
7172
7173 case PREDEF_DECL_UNSIGNED_INT_128_ID:
7174 return Context.getUInt128Decl();
7175
7176 case PREDEF_DECL_OBJC_INSTANCETYPE_ID:
7177 return Context.getObjCInstanceTypeDecl();
7178
7179 case PREDEF_DECL_BUILTIN_VA_LIST_ID:
7180 return Context.getBuiltinVaListDecl();
7181
7182 case PREDEF_DECL_VA_LIST_TAG:
7183 return Context.getVaListTagDecl();
7184
7185 case PREDEF_DECL_BUILTIN_MS_VA_LIST_ID:
7186 return Context.getBuiltinMSVaListDecl();
7187
7188 case PREDEF_DECL_EXTERN_C_CONTEXT_ID:
7189 return Context.getExternCContextDecl();
7190
7191 case PREDEF_DECL_MAKE_INTEGER_SEQ_ID:
7192 return Context.getMakeIntegerSeqDecl();
7193
7194 case PREDEF_DECL_CF_CONSTANT_STRING_ID:
7195 return Context.getCFConstantStringDecl();
7196
7197 case PREDEF_DECL_CF_CONSTANT_STRING_TAG_ID:
7198 return Context.getCFConstantStringTagDecl();
7199
7200 case PREDEF_DECL_TYPE_PACK_ELEMENT_ID:
7201 return Context.getTypePackElementDecl();
7202 }
7203 llvm_unreachable("PredefinedDeclIDs unknown enum value")::llvm::llvm_unreachable_internal("PredefinedDeclIDs unknown enum value"
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 7203)
;
7204}
7205
7206Decl *ASTReader::GetExistingDecl(DeclID ID) {
7207 assert(ContextObj && "reading decl with no AST context")(static_cast <bool> (ContextObj && "reading decl with no AST context"
) ? void (0) : __assert_fail ("ContextObj && \"reading decl with no AST context\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 7207, __extension__ __PRETTY_FUNCTION__))
;
7208 if (ID < NUM_PREDEF_DECL_IDS) {
7209 Decl *D = getPredefinedDecl(*ContextObj, (PredefinedDeclIDs)ID);
7210 if (D) {
7211 // Track that we have merged the declaration with ID \p ID into the
7212 // pre-existing predefined declaration \p D.
7213 auto &Merged = KeyDecls[D->getCanonicalDecl()];
7214 if (Merged.empty())
7215 Merged.push_back(ID);
7216 }
7217 return D;
7218 }
7219
7220 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
7221
7222 if (Index >= DeclsLoaded.size()) {
7223 assert(0 && "declaration ID out-of-range for AST file")(static_cast <bool> (0 && "declaration ID out-of-range for AST file"
) ? void (0) : __assert_fail ("0 && \"declaration ID out-of-range for AST file\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 7223, __extension__ __PRETTY_FUNCTION__))
;
7224 Error("declaration ID out-of-range for AST file");
7225 return nullptr;
7226 }
7227
7228 return DeclsLoaded[Index];
7229}
7230
7231Decl *ASTReader::GetDecl(DeclID ID) {
7232 if (ID < NUM_PREDEF_DECL_IDS)
7233 return GetExistingDecl(ID);
7234
7235 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
7236
7237 if (Index >= DeclsLoaded.size()) {
7238 assert(0 && "declaration ID out-of-range for AST file")(static_cast <bool> (0 && "declaration ID out-of-range for AST file"
) ? void (0) : __assert_fail ("0 && \"declaration ID out-of-range for AST file\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 7238, __extension__ __PRETTY_FUNCTION__))
;
7239 Error("declaration ID out-of-range for AST file");
7240 return nullptr;
7241 }
7242
7243 if (!DeclsLoaded[Index]) {
7244 ReadDeclRecord(ID);
7245 if (DeserializationListener)
7246 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
7247 }
7248
7249 return DeclsLoaded[Index];
7250}
7251
7252DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M,
7253 DeclID GlobalID) {
7254 if (GlobalID < NUM_PREDEF_DECL_IDS)
7255 return GlobalID;
7256
7257 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID);
7258 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map")(static_cast <bool> (I != GlobalDeclMap.end() &&
"Corrupted global declaration map") ? void (0) : __assert_fail
("I != GlobalDeclMap.end() && \"Corrupted global declaration map\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 7258, __extension__ __PRETTY_FUNCTION__))
;
7259 ModuleFile *Owner = I->second;
7260
7261 llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos
7262 = M.GlobalToLocalDeclIDs.find(Owner);
7263 if (Pos == M.GlobalToLocalDeclIDs.end())
7264 return 0;
7265
7266 return GlobalID - Owner->BaseDeclID + Pos->second;
7267}
7268
7269serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F,
7270 const RecordData &Record,
7271 unsigned &Idx) {
7272 if (Idx >= Record.size()) {
7273 Error("Corrupted AST file");
7274 return 0;
7275 }
7276
7277 return getGlobalDeclID(F, Record[Idx++]);
7278}
7279
7280/// \brief Resolve the offset of a statement into a statement.
7281///
7282/// This operation will read a new statement from the external
7283/// source each time it is called, and is meant to be used via a
7284/// LazyOffsetPtr (which is used by Decls for the body of functions, etc).
7285Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) {
7286 // Switch case IDs are per Decl.
7287 ClearSwitchCaseIDs();
7288
7289 // Offset here is a global offset across the entire chain.
7290 RecordLocation Loc = getLocalBitOffset(Offset);
7291 Loc.F->DeclsCursor.JumpToBit(Loc.Offset);
7292 assert(NumCurrentElementsDeserializing == 0 &&(static_cast <bool> (NumCurrentElementsDeserializing ==
0 && "should not be called while already deserializing"
) ? void (0) : __assert_fail ("NumCurrentElementsDeserializing == 0 && \"should not be called while already deserializing\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 7293, __extension__ __PRETTY_FUNCTION__))
7293 "should not be called while already deserializing")(static_cast <bool> (NumCurrentElementsDeserializing ==
0 && "should not be called while already deserializing"
) ? void (0) : __assert_fail ("NumCurrentElementsDeserializing == 0 && \"should not be called while already deserializing\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 7293, __extension__ __PRETTY_FUNCTION__))
;
7294 Deserializing D(this);
7295 return ReadStmtFromStream(*Loc.F);
7296}
7297
7298void ASTReader::FindExternalLexicalDecls(
7299 const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant,
7300 SmallVectorImpl<Decl *> &Decls) {
7301 bool PredefsVisited[NUM_PREDEF_DECL_IDS] = {};
7302
7303 auto Visit = [&] (ModuleFile *M, LexicalContents LexicalDecls) {
7304 assert(LexicalDecls.size() % 2 == 0 && "expected an even number of entries")(static_cast <bool> (LexicalDecls.size() % 2 == 0 &&
"expected an even number of entries") ? void (0) : __assert_fail
("LexicalDecls.size() % 2 == 0 && \"expected an even number of entries\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 7304, __extension__ __PRETTY_FUNCTION__))
;
7305 for (int I = 0, N = LexicalDecls.size(); I != N; I += 2) {
7306 auto K = (Decl::Kind)+LexicalDecls[I];
7307 if (!IsKindWeWant(K))
7308 continue;
7309
7310 auto ID = (serialization::DeclID)+LexicalDecls[I + 1];
7311
7312 // Don't add predefined declarations to the lexical context more
7313 // than once.
7314 if (ID < NUM_PREDEF_DECL_IDS) {
7315 if (PredefsVisited[ID])
7316 continue;
7317
7318 PredefsVisited[ID] = true;
7319 }
7320
7321 if (Decl *D = GetLocalDecl(*M, ID)) {
7322 assert(D->getKind() == K && "wrong kind for lexical decl")(static_cast <bool> (D->getKind() == K && "wrong kind for lexical decl"
) ? void (0) : __assert_fail ("D->getKind() == K && \"wrong kind for lexical decl\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 7322, __extension__ __PRETTY_FUNCTION__))
;
7323 if (!DC->isDeclInLexicalTraversal(D))
7324 Decls.push_back(D);
7325 }
7326 }
7327 };
7328
7329 if (isa<TranslationUnitDecl>(DC)) {
7330 for (auto Lexical : TULexicalDecls)
7331 Visit(Lexical.first, Lexical.second);
7332 } else {
7333 auto I = LexicalDecls.find(DC);
7334 if (I != LexicalDecls.end())
7335 Visit(I->second.first, I->second.second);
7336 }
7337
7338 ++NumLexicalDeclContextsRead;
7339}
7340
7341namespace {
7342
7343class DeclIDComp {
7344 ASTReader &Reader;
7345 ModuleFile &Mod;
7346
7347public:
7348 DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {}
7349
7350 bool operator()(LocalDeclID L, LocalDeclID R) const {
7351 SourceLocation LHS = getLocation(L);
7352 SourceLocation RHS = getLocation(R);
7353 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
7354 }
7355
7356 bool operator()(SourceLocation LHS, LocalDeclID R) const {
7357 SourceLocation RHS = getLocation(R);
7358 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
7359 }
7360
7361 bool operator()(LocalDeclID L, SourceLocation RHS) const {
7362 SourceLocation LHS = getLocation(L);
7363 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
7364 }
7365
7366 SourceLocation getLocation(LocalDeclID ID) const {
7367 return Reader.getSourceManager().getFileLoc(
7368 Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID)));
7369 }
7370};
7371
7372} // namespace
7373
7374void ASTReader::FindFileRegionDecls(FileID File,
7375 unsigned Offset, unsigned Length,
7376 SmallVectorImpl<Decl *> &Decls) {
7377 SourceManager &SM = getSourceManager();
7378
7379 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File);
7380 if (I == FileDeclIDs.end())
7381 return;
7382
7383 FileDeclsInfo &DInfo = I->second;
7384 if (DInfo.Decls.empty())
7385 return;
7386
7387 SourceLocation
7388 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset);
7389 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length);
7390
7391 DeclIDComp DIDComp(*this, *DInfo.Mod);
7392 ArrayRef<serialization::LocalDeclID>::iterator
7393 BeginIt = std::lower_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
7394 BeginLoc, DIDComp);
7395 if (BeginIt != DInfo.Decls.begin())
7396 --BeginIt;
7397
7398 // If we are pointing at a top-level decl inside an objc container, we need
7399 // to backtrack until we find it otherwise we will fail to report that the
7400 // region overlaps with an objc container.
7401 while (BeginIt != DInfo.Decls.begin() &&
7402 GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt))
7403 ->isTopLevelDeclInObjCContainer())
7404 --BeginIt;
7405
7406 ArrayRef<serialization::LocalDeclID>::iterator
7407 EndIt = std::upper_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
7408 EndLoc, DIDComp);
7409 if (EndIt != DInfo.Decls.end())
7410 ++EndIt;
7411
7412 for (ArrayRef<serialization::LocalDeclID>::iterator
7413 DIt = BeginIt; DIt != EndIt; ++DIt)
7414 Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt)));
7415}
7416
7417bool
7418ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC,
7419 DeclarationName Name) {
7420 assert(DC->hasExternalVisibleStorage() && DC == DC->getPrimaryContext() &&(static_cast <bool> (DC->hasExternalVisibleStorage()
&& DC == DC->getPrimaryContext() && "DeclContext has no visible decls in storage"
) ? void (0) : __assert_fail ("DC->hasExternalVisibleStorage() && DC == DC->getPrimaryContext() && \"DeclContext has no visible decls in storage\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 7421, __extension__ __PRETTY_FUNCTION__))
7421 "DeclContext has no visible decls in storage")(static_cast <bool> (DC->hasExternalVisibleStorage()
&& DC == DC->getPrimaryContext() && "DeclContext has no visible decls in storage"
) ? void (0) : __assert_fail ("DC->hasExternalVisibleStorage() && DC == DC->getPrimaryContext() && \"DeclContext has no visible decls in storage\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 7421, __extension__ __PRETTY_FUNCTION__))
;
7422 if (!Name)
1
Taking false branch
7423 return false;
7424
7425 auto It = Lookups.find(DC);
7426 if (It == Lookups.end())
2
Assuming the condition is false
3
Taking false branch
7427 return false;
7428
7429 Deserializing LookupResults(this);
7430
7431 // Load the list of declarations.
7432 SmallVector<NamedDecl *, 64> Decls;
7433 for (DeclID ID : It->second.Table.find(Name)) {
4
Calling 'MultiOnDiskHashTable::find'
7434 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID));
7435 if (ND->getDeclName() == Name)
7436 Decls.push_back(ND);
7437 }
7438
7439 ++NumVisibleDeclContextsRead;
7440 SetExternalVisibleDeclsForName(DC, Name, Decls);
7441 return !Decls.empty();
7442}
7443
7444void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) {
7445 if (!DC->hasExternalVisibleStorage())
7446 return;
7447
7448 auto It = Lookups.find(DC);
7449 assert(It != Lookups.end() &&(static_cast <bool> (It != Lookups.end() && "have external visible storage but no lookup tables"
) ? void (0) : __assert_fail ("It != Lookups.end() && \"have external visible storage but no lookup tables\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 7450, __extension__ __PRETTY_FUNCTION__))
7450 "have external visible storage but no lookup tables")(static_cast <bool> (It != Lookups.end() && "have external visible storage but no lookup tables"
) ? void (0) : __assert_fail ("It != Lookups.end() && \"have external visible storage but no lookup tables\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 7450, __extension__ __PRETTY_FUNCTION__))
;
7451
7452 DeclsMap Decls;
7453
7454 for (DeclID ID : It->second.Table.findAll()) {
7455 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID));
7456 Decls[ND->getDeclName()].push_back(ND);
7457 }
7458
7459 ++NumVisibleDeclContextsRead;
7460
7461 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) {
7462 SetExternalVisibleDeclsForName(DC, I->first, I->second);
7463 }
7464 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false);
7465}
7466
7467const serialization::reader::DeclContextLookupTable *
7468ASTReader::getLoadedLookupTables(DeclContext *Primary) const {
7469 auto I = Lookups.find(Primary);
7470 return I == Lookups.end() ? nullptr : &I->second;
7471}
7472
7473/// \brief Under non-PCH compilation the consumer receives the objc methods
7474/// before receiving the implementation, and codegen depends on this.
7475/// We simulate this by deserializing and passing to consumer the methods of the
7476/// implementation before passing the deserialized implementation decl.
7477static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD,
7478 ASTConsumer *Consumer) {
7479 assert(ImplD && Consumer)(static_cast <bool> (ImplD && Consumer) ? void (
0) : __assert_fail ("ImplD && Consumer", "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 7479, __extension__ __PRETTY_FUNCTION__))
;
7480
7481 for (auto *I : ImplD->methods())
7482 Consumer->HandleInterestingDecl(DeclGroupRef(I));
7483
7484 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD));
7485}
7486
7487void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
7488 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
7489 PassObjCImplDeclToConsumer(ImplD, Consumer);
7490 else
7491 Consumer->HandleInterestingDecl(DeclGroupRef(D));
7492}
7493
7494void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) {
7495 this->Consumer = Consumer;
7496
7497 if (Consumer)
7498 PassInterestingDeclsToConsumer();
7499
7500 if (DeserializationListener)
7501 DeserializationListener->ReaderInitialized(this);
7502}
7503
7504void ASTReader::PrintStats() {
7505 std::fprintf(stderrstderr, "*** AST File Statistics:\n");
7506
7507 unsigned NumTypesLoaded
7508 = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(),
7509 QualType());
7510 unsigned NumDeclsLoaded
7511 = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(),
7512 (Decl *)nullptr);
7513 unsigned NumIdentifiersLoaded
7514 = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(),
7515 IdentifiersLoaded.end(),
7516 (IdentifierInfo *)nullptr);
7517 unsigned NumMacrosLoaded
7518 = MacrosLoaded.size() - std::count(MacrosLoaded.begin(),
7519 MacrosLoaded.end(),
7520 (MacroInfo *)nullptr);
7521 unsigned NumSelectorsLoaded
7522 = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(),
7523 SelectorsLoaded.end(),
7524 Selector());
7525
7526 if (unsigned TotalNumSLocEntries = getTotalNumSLocs())
7527 std::fprintf(stderrstderr, " %u/%u source location entries read (%f%%)\n",
7528 NumSLocEntriesRead, TotalNumSLocEntries,
7529 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
7530 if (!TypesLoaded.empty())
7531 std::fprintf(stderrstderr, " %u/%u types read (%f%%)\n",
7532 NumTypesLoaded, (unsigned)TypesLoaded.size(),
7533 ((float)NumTypesLoaded/TypesLoaded.size() * 100));
7534 if (!DeclsLoaded.empty())
7535 std::fprintf(stderrstderr, " %u/%u declarations read (%f%%)\n",
7536 NumDeclsLoaded, (unsigned)DeclsLoaded.size(),
7537 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100));
7538 if (!IdentifiersLoaded.empty())
7539 std::fprintf(stderrstderr, " %u/%u identifiers read (%f%%)\n",
7540 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(),
7541 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
7542 if (!MacrosLoaded.empty())
7543 std::fprintf(stderrstderr, " %u/%u macros read (%f%%)\n",
7544 NumMacrosLoaded, (unsigned)MacrosLoaded.size(),
7545 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100));
7546 if (!SelectorsLoaded.empty())
7547 std::fprintf(stderrstderr, " %u/%u selectors read (%f%%)\n",
7548 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(),
7549 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
7550 if (TotalNumStatements)
7551 std::fprintf(stderrstderr, " %u/%u statements read (%f%%)\n",
7552 NumStatementsRead, TotalNumStatements,
7553 ((float)NumStatementsRead/TotalNumStatements * 100));
7554 if (TotalNumMacros)
7555 std::fprintf(stderrstderr, " %u/%u macros read (%f%%)\n",
7556 NumMacrosRead, TotalNumMacros,
7557 ((float)NumMacrosRead/TotalNumMacros * 100));
7558 if (TotalLexicalDeclContexts)
7559 std::fprintf(stderrstderr, " %u/%u lexical declcontexts read (%f%%)\n",
7560 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
7561 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
7562 * 100));
7563 if (TotalVisibleDeclContexts)
7564 std::fprintf(stderrstderr, " %u/%u visible declcontexts read (%f%%)\n",
7565 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
7566 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
7567 * 100));
7568 if (TotalNumMethodPoolEntries)
7569 std::fprintf(stderrstderr, " %u/%u method pool entries read (%f%%)\n",
7570 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
7571 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
7572 * 100));
7573 if (NumMethodPoolLookups)
7574 std::fprintf(stderrstderr, " %u/%u method pool lookups succeeded (%f%%)\n",
7575 NumMethodPoolHits, NumMethodPoolLookups,
7576 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
7577 if (NumMethodPoolTableLookups)
7578 std::fprintf(stderrstderr, " %u/%u method pool table lookups succeeded (%f%%)\n",
7579 NumMethodPoolTableHits, NumMethodPoolTableLookups,
7580 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups
7581 * 100.0));
7582 if (NumIdentifierLookupHits)
7583 std::fprintf(stderrstderr,
7584 " %u / %u identifier table lookups succeeded (%f%%)\n",
7585 NumIdentifierLookupHits, NumIdentifierLookups,
7586 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
7587
7588 if (GlobalIndex) {
7589 std::fprintf(stderrstderr, "\n");
7590 GlobalIndex->printStats();
7591 }
7592
7593 std::fprintf(stderrstderr, "\n");
7594 dump();
7595 std::fprintf(stderrstderr, "\n");
7596}
7597
7598template<typename Key, typename ModuleFile, unsigned InitialCapacity>
7599LLVM_DUMP_METHOD__attribute__((noinline)) __attribute__((__used__)) static void
7600dumpModuleIDMap(StringRef Name,
7601 const ContinuousRangeMap<Key, ModuleFile *,
7602 InitialCapacity> &Map) {
7603 if (Map.begin() == Map.end())
7604 return;
7605
7606 using MapType = ContinuousRangeMap<Key, ModuleFile *, InitialCapacity>;
7607
7608 llvm::errs() << Name << ":\n";
7609 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
7610 I != IEnd; ++I) {
7611 llvm::errs() << " " << I->first << " -> " << I->second->FileName
7612 << "\n";
7613 }
7614}
7615
7616LLVM_DUMP_METHOD__attribute__((noinline)) __attribute__((__used__)) void ASTReader::dump() {
7617 llvm::errs() << "*** PCH/ModuleFile Remappings:\n";
7618 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap);
7619 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap);
7620 dumpModuleIDMap("Global type map", GlobalTypeMap);
7621 dumpModuleIDMap("Global declaration map", GlobalDeclMap);
7622 dumpModuleIDMap("Global identifier map", GlobalIdentifierMap);
7623 dumpModuleIDMap("Global macro map", GlobalMacroMap);
7624 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap);
7625 dumpModuleIDMap("Global selector map", GlobalSelectorMap);
7626 dumpModuleIDMap("Global preprocessed entity map",
7627 GlobalPreprocessedEntityMap);
7628
7629 llvm::errs() << "\n*** PCH/Modules Loaded:";
7630 for (ModuleFile &M : ModuleMgr)
7631 M.dump();
7632}
7633
7634/// Return the amount of memory used by memory buffers, breaking down
7635/// by heap-backed versus mmap'ed memory.
7636void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const {
7637 for (ModuleFile &I : ModuleMgr) {
7638 if (llvm::MemoryBuffer *buf = I.Buffer) {
7639 size_t bytes = buf->getBufferSize();
7640 switch (buf->getBufferKind()) {
7641 case llvm::MemoryBuffer::MemoryBuffer_Malloc:
7642 sizes.malloc_bytes += bytes;
7643 break;
7644 case llvm::MemoryBuffer::MemoryBuffer_MMap:
7645 sizes.mmap_bytes += bytes;
7646 break;
7647 }
7648 }
7649 }
7650}
7651
7652void ASTReader::InitializeSema(Sema &S) {
7653 SemaObj = &S;
7654 S.addExternalSource(this);
7655
7656 // Makes sure any declarations that were deserialized "too early"
7657 // still get added to the identifier's declaration chains.
7658 for (uint64_t ID : PreloadedDeclIDs) {
7659 NamedDecl *D = cast<NamedDecl>(GetDecl(ID));
7660 pushExternalDeclIntoScope(D, D->getDeclName());
7661 }
7662 PreloadedDeclIDs.clear();
7663
7664 // FIXME: What happens if these are changed by a module import?
7665 if (!FPPragmaOptions.empty()) {
7666 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS")(static_cast <bool> (FPPragmaOptions.size() == 1 &&
"Wrong number of FP_PRAGMA_OPTIONS") ? void (0) : __assert_fail
("FPPragmaOptions.size() == 1 && \"Wrong number of FP_PRAGMA_OPTIONS\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 7666, __extension__ __PRETTY_FUNCTION__))
;
7667 SemaObj->FPFeatures = FPOptions(FPPragmaOptions[0]);
7668 }
7669
7670 SemaObj->OpenCLFeatures.copy(OpenCLExtensions);
7671 SemaObj->OpenCLTypeExtMap = OpenCLTypeExtMap;
7672 SemaObj->OpenCLDeclExtMap = OpenCLDeclExtMap;
7673
7674 UpdateSema();
7675}
7676
7677void ASTReader::UpdateSema() {
7678 assert(SemaObj && "no Sema to update")(static_cast <bool> (SemaObj && "no Sema to update"
) ? void (0) : __assert_fail ("SemaObj && \"no Sema to update\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 7678, __extension__ __PRETTY_FUNCTION__))
;
7679
7680 // Load the offsets of the declarations that Sema references.
7681 // They will be lazily deserialized when needed.
7682 if (!SemaDeclRefs.empty()) {
7683 assert(SemaDeclRefs.size() % 3 == 0)(static_cast <bool> (SemaDeclRefs.size() % 3 == 0) ? void
(0) : __assert_fail ("SemaDeclRefs.size() % 3 == 0", "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 7683, __extension__ __PRETTY_FUNCTION__))
;
7684 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 3) {
7685 if (!SemaObj->StdNamespace)
7686 SemaObj->StdNamespace = SemaDeclRefs[I];
7687 if (!SemaObj->StdBadAlloc)
7688 SemaObj->StdBadAlloc = SemaDeclRefs[I+1];
7689 if (!SemaObj->StdAlignValT)
7690 SemaObj->StdAlignValT = SemaDeclRefs[I+2];
7691 }
7692 SemaDeclRefs.clear();
7693 }
7694
7695 // Update the state of pragmas. Use the same API as if we had encountered the
7696 // pragma in the source.
7697 if(OptimizeOffPragmaLocation.isValid())
7698 SemaObj->ActOnPragmaOptimize(/* IsOn = */ false, OptimizeOffPragmaLocation);
7699 if (PragmaMSStructState != -1)
7700 SemaObj->ActOnPragmaMSStruct((PragmaMSStructKind)PragmaMSStructState);
7701 if (PointersToMembersPragmaLocation.isValid()) {
7702 SemaObj->ActOnPragmaMSPointersToMembers(
7703 (LangOptions::PragmaMSPointersToMembersKind)
7704 PragmaMSPointersToMembersState,
7705 PointersToMembersPragmaLocation);
7706 }
7707 SemaObj->ForceCUDAHostDeviceDepth = ForceCUDAHostDeviceDepth;
7708
7709 if (PragmaPackCurrentValue) {
7710 // The bottom of the stack might have a default value. It must be adjusted
7711 // to the current value to ensure that the packing state is preserved after
7712 // popping entries that were included/imported from a PCH/module.
7713 bool DropFirst = false;
7714 if (!PragmaPackStack.empty() &&
7715 PragmaPackStack.front().Location.isInvalid()) {
7716 assert(PragmaPackStack.front().Value == SemaObj->PackStack.DefaultValue &&(static_cast <bool> (PragmaPackStack.front().Value == SemaObj
->PackStack.DefaultValue && "Expected a default alignment value"
) ? void (0) : __assert_fail ("PragmaPackStack.front().Value == SemaObj->PackStack.DefaultValue && \"Expected a default alignment value\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 7717, __extension__ __PRETTY_FUNCTION__))
7717 "Expected a default alignment value")(static_cast <bool> (PragmaPackStack.front().Value == SemaObj
->PackStack.DefaultValue && "Expected a default alignment value"
) ? void (0) : __assert_fail ("PragmaPackStack.front().Value == SemaObj->PackStack.DefaultValue && \"Expected a default alignment value\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 7717, __extension__ __PRETTY_FUNCTION__))
;
7718 SemaObj->PackStack.Stack.emplace_back(
7719 PragmaPackStack.front().SlotLabel, SemaObj->PackStack.CurrentValue,
7720 SemaObj->PackStack.CurrentPragmaLocation,
7721 PragmaPackStack.front().PushLocation);
7722 DropFirst = true;
7723 }
7724 for (const auto &Entry :
7725 llvm::makeArrayRef(PragmaPackStack).drop_front(DropFirst ? 1 : 0))
7726 SemaObj->PackStack.Stack.emplace_back(Entry.SlotLabel, Entry.Value,
7727 Entry.Location, Entry.PushLocation);
7728 if (PragmaPackCurrentLocation.isInvalid()) {
7729 assert(*PragmaPackCurrentValue == SemaObj->PackStack.DefaultValue &&(static_cast <bool> (*PragmaPackCurrentValue == SemaObj
->PackStack.DefaultValue && "Expected a default alignment value"
) ? void (0) : __assert_fail ("*PragmaPackCurrentValue == SemaObj->PackStack.DefaultValue && \"Expected a default alignment value\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 7730, __extension__ __PRETTY_FUNCTION__))
7730 "Expected a default alignment value")(static_cast <bool> (*PragmaPackCurrentValue == SemaObj
->PackStack.DefaultValue && "Expected a default alignment value"
) ? void (0) : __assert_fail ("*PragmaPackCurrentValue == SemaObj->PackStack.DefaultValue && \"Expected a default alignment value\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 7730, __extension__ __PRETTY_FUNCTION__))
;
7731 // Keep the current values.
7732 } else {
7733 SemaObj->PackStack.CurrentValue = *PragmaPackCurrentValue;
7734 SemaObj->PackStack.CurrentPragmaLocation = PragmaPackCurrentLocation;
7735 }
7736 }
7737}
7738
7739IdentifierInfo *ASTReader::get(StringRef Name) {
7740 // Note that we are loading an identifier.
7741 Deserializing AnIdentifier(this);
7742
7743 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0,
7744 NumIdentifierLookups,
7745 NumIdentifierLookupHits);
7746
7747 // We don't need to do identifier table lookups in C++ modules (we preload
7748 // all interesting declarations, and don't need to use the scope for name
7749 // lookups). Perform the lookup in PCH files, though, since we don't build
7750 // a complete initial identifier table if we're carrying on from a PCH.
7751 if (PP.getLangOpts().CPlusPlus) {
7752 for (auto F : ModuleMgr.pch_modules())
7753 if (Visitor(*F))
7754 break;
7755 } else {
7756 // If there is a global index, look there first to determine which modules
7757 // provably do not have any results for this identifier.
7758 GlobalModuleIndex::HitSet Hits;
7759 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
7760 if (!loadGlobalIndex()) {
7761 if (GlobalIndex->lookupIdentifier(Name, Hits)) {
7762 HitsPtr = &Hits;
7763 }
7764 }
7765
7766 ModuleMgr.visit(Visitor, HitsPtr);
7767 }
7768
7769 IdentifierInfo *II = Visitor.getIdentifierInfo();
7770 markIdentifierUpToDate(II);
7771 return II;
7772}
7773
7774namespace clang {
7775
7776 /// \brief An identifier-lookup iterator that enumerates all of the
7777 /// identifiers stored within a set of AST files.
7778 class ASTIdentifierIterator : public IdentifierIterator {
7779 /// \brief The AST reader whose identifiers are being enumerated.
7780 const ASTReader &Reader;
7781
7782 /// \brief The current index into the chain of AST files stored in
7783 /// the AST reader.
7784 unsigned Index;
7785
7786 /// \brief The current position within the identifier lookup table
7787 /// of the current AST file.
7788 ASTIdentifierLookupTable::key_iterator Current;
7789
7790 /// \brief The end position within the identifier lookup table of
7791 /// the current AST file.
7792 ASTIdentifierLookupTable::key_iterator End;
7793
7794 /// \brief Whether to skip any modules in the ASTReader.
7795 bool SkipModules;
7796
7797 public:
7798 explicit ASTIdentifierIterator(const ASTReader &Reader,
7799 bool SkipModules = false);
7800
7801 StringRef Next() override;
7802 };
7803
7804} // namespace clang
7805
7806ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader,
7807 bool SkipModules)
7808 : Reader(Reader), Index(Reader.ModuleMgr.size()), SkipModules(SkipModules) {
7809}
7810
7811StringRef ASTIdentifierIterator::Next() {
7812 while (Current == End) {
7813 // If we have exhausted all of our AST files, we're done.
7814 if (Index == 0)
7815 return StringRef();
7816
7817 --Index;
7818 ModuleFile &F = Reader.ModuleMgr[Index];
7819 if (SkipModules && F.isModule())
7820 continue;
7821
7822 ASTIdentifierLookupTable *IdTable =
7823 (ASTIdentifierLookupTable *)F.IdentifierLookupTable;
7824 Current = IdTable->key_begin();
7825 End = IdTable->key_end();
7826 }
7827
7828 // We have any identifiers remaining in the current AST file; return
7829 // the next one.
7830 StringRef Result = *Current;
7831 ++Current;
7832 return Result;
7833}
7834
7835namespace {
7836
7837/// A utility for appending two IdentifierIterators.
7838class ChainedIdentifierIterator : public IdentifierIterator {
7839 std::unique_ptr<IdentifierIterator> Current;
7840 std::unique_ptr<IdentifierIterator> Queued;
7841
7842public:
7843 ChainedIdentifierIterator(std::unique_ptr<IdentifierIterator> First,
7844 std::unique_ptr<IdentifierIterator> Second)
7845 : Current(std::move(First)), Queued(std::move(Second)) {}
7846
7847 StringRef Next() override {
7848 if (!Current)
7849 return StringRef();
7850
7851 StringRef result = Current->Next();
7852 if (!result.empty())
7853 return result;
7854
7855 // Try the queued iterator, which may itself be empty.
7856 Current.reset();
7857 std::swap(Current, Queued);
7858 return Next();
7859 }
7860};
7861
7862} // namespace
7863
7864IdentifierIterator *ASTReader::getIdentifiers() {
7865 if (!loadGlobalIndex()) {
7866 std::unique_ptr<IdentifierIterator> ReaderIter(
7867 new ASTIdentifierIterator(*this, /*SkipModules=*/true));
7868 std::unique_ptr<IdentifierIterator> ModulesIter(
7869 GlobalIndex->createIdentifierIterator());
7870 return new ChainedIdentifierIterator(std::move(ReaderIter),
7871 std::move(ModulesIter));
7872 }
7873
7874 return new ASTIdentifierIterator(*this);
7875}
7876
7877namespace clang {
7878namespace serialization {
7879
7880 class ReadMethodPoolVisitor {
7881 ASTReader &Reader;
7882 Selector Sel;
7883 unsigned PriorGeneration;
7884 unsigned InstanceBits = 0;
7885 unsigned FactoryBits = 0;
7886 bool InstanceHasMoreThanOneDecl = false;
7887 bool FactoryHasMoreThanOneDecl = false;
7888 SmallVector<ObjCMethodDecl *, 4> InstanceMethods;
7889 SmallVector<ObjCMethodDecl *, 4> FactoryMethods;
7890
7891 public:
7892 ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel,
7893 unsigned PriorGeneration)
7894 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) {}
7895
7896 bool operator()(ModuleFile &M) {
7897 if (!M.SelectorLookupTable)
7898 return false;
7899
7900 // If we've already searched this module file, skip it now.
7901 if (M.Generation <= PriorGeneration)
7902 return true;
7903
7904 ++Reader.NumMethodPoolTableLookups;
7905 ASTSelectorLookupTable *PoolTable
7906 = (ASTSelectorLookupTable*)M.SelectorLookupTable;
7907 ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel);
7908 if (Pos == PoolTable->end())
7909 return false;
7910
7911 ++Reader.NumMethodPoolTableHits;
7912 ++Reader.NumSelectorsRead;
7913 // FIXME: Not quite happy with the statistics here. We probably should
7914 // disable this tracking when called via LoadSelector.
7915 // Also, should entries without methods count as misses?
7916 ++Reader.NumMethodPoolEntriesRead;
7917 ASTSelectorLookupTrait::data_type Data = *Pos;
7918 if (Reader.DeserializationListener)
7919 Reader.DeserializationListener->SelectorRead(Data.ID, Sel);
7920
7921 InstanceMethods.append(Data.Instance.begin(), Data.Instance.end());
7922 FactoryMethods.append(Data.Factory.begin(), Data.Factory.end());
7923 InstanceBits = Data.InstanceBits;
7924 FactoryBits = Data.FactoryBits;
7925 InstanceHasMoreThanOneDecl = Data.InstanceHasMoreThanOneDecl;
7926 FactoryHasMoreThanOneDecl = Data.FactoryHasMoreThanOneDecl;
7927 return true;
7928 }
7929
7930 /// \brief Retrieve the instance methods found by this visitor.
7931 ArrayRef<ObjCMethodDecl *> getInstanceMethods() const {
7932 return InstanceMethods;
7933 }
7934
7935 /// \brief Retrieve the instance methods found by this visitor.
7936 ArrayRef<ObjCMethodDecl *> getFactoryMethods() const {
7937 return FactoryMethods;
7938 }
7939
7940 unsigned getInstanceBits() const { return InstanceBits; }
7941 unsigned getFactoryBits() const { return FactoryBits; }
7942
7943 bool instanceHasMoreThanOneDecl() const {
7944 return InstanceHasMoreThanOneDecl;
7945 }
7946
7947 bool factoryHasMoreThanOneDecl() const { return FactoryHasMoreThanOneDecl; }
7948 };
7949
7950} // namespace serialization
7951} // namespace clang
7952
7953/// \brief Add the given set of methods to the method list.
7954static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods,
7955 ObjCMethodList &List) {
7956 for (unsigned I = 0, N = Methods.size(); I != N; ++I) {
7957 S.addMethodToGlobalList(&List, Methods[I]);
7958 }
7959}
7960
7961void ASTReader::ReadMethodPool(Selector Sel) {
7962 // Get the selector generation and update it to the current generation.
7963 unsigned &Generation = SelectorGeneration[Sel];
7964 unsigned PriorGeneration = Generation;
7965 Generation = getGeneration();
7966 SelectorOutOfDate[Sel] = false;
7967
7968 // Search for methods defined with this selector.
7969 ++NumMethodPoolLookups;
7970 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration);
7971 ModuleMgr.visit(Visitor);
7972
7973 if (Visitor.getInstanceMethods().empty() &&
7974 Visitor.getFactoryMethods().empty())
7975 return;
7976
7977 ++NumMethodPoolHits;
7978
7979 if (!getSema())
7980 return;
7981
7982 Sema &S = *getSema();
7983 Sema::GlobalMethodPool::iterator Pos
7984 = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first;
7985
7986 Pos->second.first.setBits(Visitor.getInstanceBits());
7987 Pos->second.first.setHasMoreThanOneDecl(Visitor.instanceHasMoreThanOneDecl());
7988 Pos->second.second.setBits(Visitor.getFactoryBits());
7989 Pos->second.second.setHasMoreThanOneDecl(Visitor.factoryHasMoreThanOneDecl());
7990
7991 // Add methods to the global pool *after* setting hasMoreThanOneDecl, since
7992 // when building a module we keep every method individually and may need to
7993 // update hasMoreThanOneDecl as we add the methods.
7994 addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first);
7995 addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second);
7996}
7997
7998void ASTReader::updateOutOfDateSelector(Selector Sel) {
7999 if (SelectorOutOfDate[Sel])
8000 ReadMethodPool(Sel);
8001}
8002
8003void ASTReader::ReadKnownNamespaces(
8004 SmallVectorImpl<NamespaceDecl *> &Namespaces) {
8005 Namespaces.clear();
8006
8007 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
8008 if (NamespaceDecl *Namespace
8009 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I])))
8010 Namespaces.push_back(Namespace);
8011 }
8012}
8013
8014void ASTReader::ReadUndefinedButUsed(
8015 llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) {
8016 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
8017 NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++]));
8018 SourceLocation Loc =
8019 SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]);
8020 Undefined.insert(std::make_pair(D, Loc));
8021 }
8022}
8023
8024void ASTReader::ReadMismatchingDeleteExpressions(llvm::MapVector<
8025 FieldDecl *, llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> &
8026 Exprs) {
8027 for (unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) {
8028 FieldDecl *FD = cast<FieldDecl>(GetDecl(DelayedDeleteExprs[Idx++]));
8029 uint64_t Count = DelayedDeleteExprs[Idx++];
8030 for (uint64_t C = 0; C < Count; ++C) {
8031 SourceLocation DeleteLoc =
8032 SourceLocation::getFromRawEncoding(DelayedDeleteExprs[Idx++]);
8033 const bool IsArrayForm = DelayedDeleteExprs[Idx++];
8034 Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm));
8035 }
8036 }
8037}
8038
8039void ASTReader::ReadTentativeDefinitions(
8040 SmallVectorImpl<VarDecl *> &TentativeDefs) {
8041 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
8042 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I]));
8043 if (Var)
8044 TentativeDefs.push_back(Var);
8045 }
8046 TentativeDefinitions.clear();
8047}
8048
8049void ASTReader::ReadUnusedFileScopedDecls(
8050 SmallVectorImpl<const DeclaratorDecl *> &Decls) {
8051 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
8052 DeclaratorDecl *D
8053 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I]));
8054 if (D)
8055 Decls.push_back(D);
8056 }
8057 UnusedFileScopedDecls.clear();
8058}
8059
8060void ASTReader::ReadDelegatingConstructors(
8061 SmallVectorImpl<CXXConstructorDecl *> &Decls) {
8062 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
8063 CXXConstructorDecl *D
8064 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I]));
8065 if (D)
8066 Decls.push_back(D);
8067 }
8068 DelegatingCtorDecls.clear();
8069}
8070
8071void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) {
8072 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
8073 TypedefNameDecl *D
8074 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I]));
8075 if (D)
8076 Decls.push_back(D);
8077 }
8078 ExtVectorDecls.clear();
8079}
8080
8081void ASTReader::ReadUnusedLocalTypedefNameCandidates(
8082 llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) {
8083 for (unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N;
8084 ++I) {
8085 TypedefNameDecl *D = dyn_cast_or_null<TypedefNameDecl>(
8086 GetDecl(UnusedLocalTypedefNameCandidates[I]));
8087 if (D)
8088 Decls.insert(D);
8089 }
8090 UnusedLocalTypedefNameCandidates.clear();
8091}
8092
8093void ASTReader::ReadReferencedSelectors(
8094 SmallVectorImpl<std::pair<Selector, SourceLocation>> &Sels) {
8095 if (ReferencedSelectorsData.empty())
8096 return;
8097
8098 // If there are @selector references added them to its pool. This is for
8099 // implementation of -Wselector.
8100 unsigned int DataSize = ReferencedSelectorsData.size()-1;
8101 unsigned I = 0;
8102 while (I < DataSize) {
8103 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]);
8104 SourceLocation SelLoc
8105 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]);
8106 Sels.push_back(std::make_pair(Sel, SelLoc));
8107 }
8108 ReferencedSelectorsData.clear();
8109}
8110
8111void ASTReader::ReadWeakUndeclaredIdentifiers(
8112 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo>> &WeakIDs) {
8113 if (WeakUndeclaredIdentifiers.empty())
8114 return;
8115
8116 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) {
8117 IdentifierInfo *WeakId
8118 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
8119 IdentifierInfo *AliasId
8120 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
8121 SourceLocation Loc
8122 = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]);
8123 bool Used = WeakUndeclaredIdentifiers[I++];
8124 WeakInfo WI(AliasId, Loc);
8125 WI.setUsed(Used);
8126 WeakIDs.push_back(std::make_pair(WeakId, WI));
8127 }
8128 WeakUndeclaredIdentifiers.clear();
8129}
8130
8131void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) {
8132 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) {
8133 ExternalVTableUse VT;
8134 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++]));
8135 VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]);
8136 VT.DefinitionRequired = VTableUses[Idx++];
8137 VTables.push_back(VT);
8138 }
8139
8140 VTableUses.clear();
8141}
8142
8143void ASTReader::ReadPendingInstantiations(
8144 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation>> &Pending) {
8145 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
8146 ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++]));
8147 SourceLocation Loc
8148 = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]);
8149
8150 Pending.push_back(std::make_pair(D, Loc));
8151 }
8152 PendingInstantiations.clear();
8153}
8154
8155void ASTReader::ReadLateParsedTemplates(
8156 llvm::MapVector<const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>
8157 &LPTMap) {
8158 for (unsigned Idx = 0, N = LateParsedTemplates.size(); Idx < N;
8159 /* In loop */) {
8160 FunctionDecl *FD = cast<FunctionDecl>(GetDecl(LateParsedTemplates[Idx++]));
8161
8162 auto LT = llvm::make_unique<LateParsedTemplate>();
8163 LT->D = GetDecl(LateParsedTemplates[Idx++]);
8164
8165 ModuleFile *F = getOwningModuleFile(LT->D);
8166 assert(F && "No module")(static_cast <bool> (F && "No module") ? void (
0) : __assert_fail ("F && \"No module\"", "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 8166, __extension__ __PRETTY_FUNCTION__))
;
8167
8168 unsigned TokN = LateParsedTemplates[Idx++];
8169 LT->Toks.reserve(TokN);
8170 for (unsigned T = 0; T < TokN; ++T)
8171 LT->Toks.push_back(ReadToken(*F, LateParsedTemplates, Idx));
8172
8173 LPTMap.insert(std::make_pair(FD, std::move(LT)));
8174 }
8175
8176 LateParsedTemplates.clear();
8177}
8178
8179void ASTReader::LoadSelector(Selector Sel) {
8180 // It would be complicated to avoid reading the methods anyway. So don't.
8181 ReadMethodPool(Sel);
8182}
8183
8184void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) {
8185 assert(ID && "Non-zero identifier ID required")(static_cast <bool> (ID && "Non-zero identifier ID required"
) ? void (0) : __assert_fail ("ID && \"Non-zero identifier ID required\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 8185, __extension__ __PRETTY_FUNCTION__))
;
8186 assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range")(static_cast <bool> (ID <= IdentifiersLoaded.size() &&
"identifier ID out of range") ? void (0) : __assert_fail ("ID <= IdentifiersLoaded.size() && \"identifier ID out of range\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 8186, __extension__ __PRETTY_FUNCTION__))
;
8187 IdentifiersLoaded[ID - 1] = II;
8188 if (DeserializationListener)
8189 DeserializationListener->IdentifierRead(ID, II);
8190}
8191
8192/// \brief Set the globally-visible declarations associated with the given
8193/// identifier.
8194///
8195/// If the AST reader is currently in a state where the given declaration IDs
8196/// cannot safely be resolved, they are queued until it is safe to resolve
8197/// them.
8198///
8199/// \param II an IdentifierInfo that refers to one or more globally-visible
8200/// declarations.
8201///
8202/// \param DeclIDs the set of declaration IDs with the name @p II that are
8203/// visible at global scope.
8204///
8205/// \param Decls if non-null, this vector will be populated with the set of
8206/// deserialized declarations. These declarations will not be pushed into
8207/// scope.
8208void
8209ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II,
8210 const SmallVectorImpl<uint32_t> &DeclIDs,
8211 SmallVectorImpl<Decl *> *Decls) {
8212 if (NumCurrentElementsDeserializing && !Decls) {
8213 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
8214 return;
8215 }
8216
8217 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
8218 if (!SemaObj) {
8219 // Queue this declaration so that it will be added to the
8220 // translation unit scope and identifier's declaration chain
8221 // once a Sema object is known.
8222 PreloadedDeclIDs.push_back(DeclIDs[I]);
8223 continue;
8224 }
8225
8226 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I]));
8227
8228 // If we're simply supposed to record the declarations, do so now.
8229 if (Decls) {
8230 Decls->push_back(D);
8231 continue;
8232 }
8233
8234 // Introduce this declaration into the translation-unit scope
8235 // and add it to the declaration chain for this identifier, so
8236 // that (unqualified) name lookup will find it.
8237 pushExternalDeclIntoScope(D, II);
8238 }
8239}
8240
8241IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) {
8242 if (ID == 0)
8243 return nullptr;
8244
8245 if (IdentifiersLoaded.empty()) {
8246 Error("no identifier table in AST file");
8247 return nullptr;
8248 }
8249
8250 ID -= 1;
8251 if (!IdentifiersLoaded[ID]) {
8252 GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1);
8253 assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map")(static_cast <bool> (I != GlobalIdentifierMap.end() &&
"Corrupted global identifier map") ? void (0) : __assert_fail
("I != GlobalIdentifierMap.end() && \"Corrupted global identifier map\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 8253, __extension__ __PRETTY_FUNCTION__))
;
8254 ModuleFile *M = I->second;
8255 unsigned Index = ID - M->BaseIdentifierID;
8256 const char *Str = M->IdentifierTableData + M->IdentifierOffsets[Index];
8257
8258 // All of the strings in the AST file are preceded by a 16-bit length.
8259 // Extract that 16-bit length to avoid having to execute strlen().
8260 // NOTE: 'StrLenPtr' is an 'unsigned char*' so that we load bytes as
8261 // unsigned integers. This is important to avoid integer overflow when
8262 // we cast them to 'unsigned'.
8263 const unsigned char *StrLenPtr = (const unsigned char*) Str - 2;
8264 unsigned StrLen = (((unsigned) StrLenPtr[0])
8265 | (((unsigned) StrLenPtr[1]) << 8)) - 1;
8266 auto &II = PP.getIdentifierTable().get(StringRef(Str, StrLen));
8267 IdentifiersLoaded[ID] = &II;
8268 markIdentifierFromAST(*this, II);
8269 if (DeserializationListener)
8270 DeserializationListener->IdentifierRead(ID + 1, &II);
8271 }
8272
8273 return IdentifiersLoaded[ID];
8274}
8275
8276IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) {
8277 return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID));
8278}
8279
8280IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) {
8281 if (LocalID < NUM_PREDEF_IDENT_IDS)
8282 return LocalID;
8283
8284 if (!M.ModuleOffsetMap.empty())
8285 ReadModuleOffsetMap(M);
8286
8287 ContinuousRangeMap<uint32_t, int, 2>::iterator I
8288 = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS);
8289 assert(I != M.IdentifierRemap.end()(static_cast <bool> (I != M.IdentifierRemap.end() &&
"Invalid index into identifier index remap") ? void (0) : __assert_fail
("I != M.IdentifierRemap.end() && \"Invalid index into identifier index remap\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 8290, __extension__ __PRETTY_FUNCTION__))
8290 && "Invalid index into identifier index remap")(static_cast <bool> (I != M.IdentifierRemap.end() &&
"Invalid index into identifier index remap") ? void (0) : __assert_fail
("I != M.IdentifierRemap.end() && \"Invalid index into identifier index remap\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 8290, __extension__ __PRETTY_FUNCTION__))
;
8291
8292 return LocalID + I->second;
8293}
8294
8295MacroInfo *ASTReader::getMacro(MacroID ID) {
8296 if (ID == 0)
8297 return nullptr;
8298
8299 if (MacrosLoaded.empty()) {
8300 Error("no macro table in AST file");
8301 return nullptr;
8302 }
8303
8304 ID -= NUM_PREDEF_MACRO_IDS;
8305 if (!MacrosLoaded[ID]) {
8306 GlobalMacroMapType::iterator I
8307 = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS);
8308 assert(I != GlobalMacroMap.end() && "Corrupted global macro map")(static_cast <bool> (I != GlobalMacroMap.end() &&
"Corrupted global macro map") ? void (0) : __assert_fail ("I != GlobalMacroMap.end() && \"Corrupted global macro map\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 8308, __extension__ __PRETTY_FUNCTION__))
;
8309 ModuleFile *M = I->second;
8310 unsigned Index = ID - M->BaseMacroID;
8311 MacrosLoaded[ID] = ReadMacroRecord(*M, M->MacroOffsets[Index]);
8312
8313 if (DeserializationListener)
8314 DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS,
8315 MacrosLoaded[ID]);
8316 }
8317
8318 return MacrosLoaded[ID];
8319}
8320
8321MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) {
8322 if (LocalID < NUM_PREDEF_MACRO_IDS)
8323 return LocalID;
8324
8325 if (!M.ModuleOffsetMap.empty())
8326 ReadModuleOffsetMap(M);
8327
8328 ContinuousRangeMap<uint32_t, int, 2>::iterator I
8329 = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS);
8330 assert(I != M.MacroRemap.end() && "Invalid index into macro index remap")(static_cast <bool> (I != M.MacroRemap.end() &&
"Invalid index into macro index remap") ? void (0) : __assert_fail
("I != M.MacroRemap.end() && \"Invalid index into macro index remap\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 8330, __extension__ __PRETTY_FUNCTION__))
;
8331
8332 return LocalID + I->second;
8333}
8334
8335serialization::SubmoduleID
8336ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) {
8337 if (LocalID < NUM_PREDEF_SUBMODULE_IDS)
8338 return LocalID;
8339
8340 if (!M.ModuleOffsetMap.empty())
8341 ReadModuleOffsetMap(M);
8342
8343 ContinuousRangeMap<uint32_t, int, 2>::iterator I
8344 = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS);
8345 assert(I != M.SubmoduleRemap.end()(static_cast <bool> (I != M.SubmoduleRemap.end() &&
"Invalid index into submodule index remap") ? void (0) : __assert_fail
("I != M.SubmoduleRemap.end() && \"Invalid index into submodule index remap\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 8346, __extension__ __PRETTY_FUNCTION__))
8346 && "Invalid index into submodule index remap")(static_cast <bool> (I != M.SubmoduleRemap.end() &&
"Invalid index into submodule index remap") ? void (0) : __assert_fail
("I != M.SubmoduleRemap.end() && \"Invalid index into submodule index remap\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 8346, __extension__ __PRETTY_FUNCTION__))
;
8347
8348 return LocalID + I->second;
8349}
8350
8351Module *ASTReader::getSubmodule(SubmoduleID GlobalID) {
8352 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) {
8353 assert(GlobalID == 0 && "Unhandled global submodule ID")(static_cast <bool> (GlobalID == 0 && "Unhandled global submodule ID"
) ? void (0) : __assert_fail ("GlobalID == 0 && \"Unhandled global submodule ID\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 8353, __extension__ __PRETTY_FUNCTION__))
;
8354 return nullptr;
8355 }
8356
8357 if (GlobalID > SubmodulesLoaded.size()) {
8358 Error("submodule ID out of range in AST file");
8359 return nullptr;
8360 }
8361
8362 return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS];
8363}
8364
8365Module *ASTReader::getModule(unsigned ID) {
8366 return getSubmodule(ID);
8367}
8368
8369ModuleFile *ASTReader::getLocalModuleFile(ModuleFile &F, unsigned ID) {
8370 if (ID & 1) {
8371 // It's a module, look it up by submodule ID.
8372 auto I = GlobalSubmoduleMap.find(getGlobalSubmoduleID(F, ID >> 1));
8373 return I == GlobalSubmoduleMap.end() ? nullptr : I->second;
8374 } else {
8375 // It's a prefix (preamble, PCH, ...). Look it up by index.
8376 unsigned IndexFromEnd = ID >> 1;
8377 assert(IndexFromEnd && "got reference to unknown module file")(static_cast <bool> (IndexFromEnd && "got reference to unknown module file"
) ? void (0) : __assert_fail ("IndexFromEnd && \"got reference to unknown module file\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 8377, __extension__ __PRETTY_FUNCTION__))
;
8378 return getModuleManager().pch_modules().end()[-IndexFromEnd];
8379 }
8380}
8381
8382unsigned ASTReader::getModuleFileID(ModuleFile *F) {
8383 if (!F)
8384 return 1;
8385
8386 // For a file representing a module, use the submodule ID of the top-level
8387 // module as the file ID. For any other kind of file, the number of such
8388 // files loaded beforehand will be the same on reload.
8389 // FIXME: Is this true even if we have an explicit module file and a PCH?
8390 if (F->isModule())
8391 return ((F->BaseSubmoduleID + NUM_PREDEF_SUBMODULE_IDS) << 1) | 1;
8392
8393 auto PCHModules = getModuleManager().pch_modules();
8394 auto I = std::find(PCHModules.begin(), PCHModules.end(), F);
8395 assert(I != PCHModules.end() && "emitting reference to unknown file")(static_cast <bool> (I != PCHModules.end() && "emitting reference to unknown file"
) ? void (0) : __assert_fail ("I != PCHModules.end() && \"emitting reference to unknown file\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 8395, __extension__ __PRETTY_FUNCTION__))
;
8396 return (I - PCHModules.end()) << 1;
8397}
8398
8399llvm::Optional<ExternalASTSource::ASTSourceDescriptor>
8400ASTReader::getSourceDescriptor(unsigned ID) {
8401 if (const Module *M = getSubmodule(ID))
8402 return ExternalASTSource::ASTSourceDescriptor(*M);
8403
8404 // If there is only a single PCH, return it instead.
8405 // Chained PCH are not supported.
8406 const auto &PCHChain = ModuleMgr.pch_modules();
8407 if (std::distance(std::begin(PCHChain), std::end(PCHChain))) {
8408 ModuleFile &MF = ModuleMgr.getPrimaryModule();
8409 StringRef ModuleName = llvm::sys::path::filename(MF.OriginalSourceFileName);
8410 StringRef FileName = llvm::sys::path::filename(MF.FileName);
8411 return ASTReader::ASTSourceDescriptor(ModuleName, MF.OriginalDir, FileName,
8412 MF.Signature);
8413 }
8414 return None;
8415}
8416
8417ExternalASTSource::ExtKind ASTReader::hasExternalDefinitions(const Decl *FD) {
8418 auto I = DefinitionSource.find(FD);
8419 if (I == DefinitionSource.end())
8420 return EK_ReplyHazy;
8421 return I->second ? EK_Never : EK_Always;
8422}
8423
8424Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) {
8425 return DecodeSelector(getGlobalSelectorID(M, LocalID));
8426}
8427
8428Selector ASTReader::DecodeSelector(serialization::SelectorID ID) {
8429 if (ID == 0)
8430 return Selector();
8431
8432 if (ID > SelectorsLoaded.size()) {
8433 Error("selector ID out of range in AST file");
8434 return Selector();
8435 }
8436
8437 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) {
8438 // Load this selector from the selector table.
8439 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID);
8440 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map")(static_cast <bool> (I != GlobalSelectorMap.end() &&
"Corrupted global selector map") ? void (0) : __assert_fail (
"I != GlobalSelectorMap.end() && \"Corrupted global selector map\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 8440, __extension__ __PRETTY_FUNCTION__))
;
8441 ModuleFile &M = *I->second;
8442 ASTSelectorLookupTrait Trait(*this, M);
8443 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS;
8444 SelectorsLoaded[ID - 1] =
8445 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0);
8446 if (DeserializationListener)
8447 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
8448 }
8449
8450 return SelectorsLoaded[ID - 1];
8451}
8452
8453Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) {
8454 return DecodeSelector(ID);
8455}
8456
8457uint32_t ASTReader::GetNumExternalSelectors() {
8458 // ID 0 (the null selector) is considered an external selector.
8459 return getTotalNumSelectors() + 1;
8460}
8461
8462serialization::SelectorID
8463ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const {
8464 if (LocalID < NUM_PREDEF_SELECTOR_IDS)
8465 return LocalID;
8466
8467 if (!M.ModuleOffsetMap.empty())
8468 ReadModuleOffsetMap(M);
8469
8470 ContinuousRangeMap<uint32_t, int, 2>::iterator I
8471 = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS);
8472 assert(I != M.SelectorRemap.end()(static_cast <bool> (I != M.SelectorRemap.end() &&
"Invalid index into selector index remap") ? void (0) : __assert_fail
("I != M.SelectorRemap.end() && \"Invalid index into selector index remap\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 8473, __extension__ __PRETTY_FUNCTION__))
8473 && "Invalid index into selector index remap")(static_cast <bool> (I != M.SelectorRemap.end() &&
"Invalid index into selector index remap") ? void (0) : __assert_fail
("I != M.SelectorRemap.end() && \"Invalid index into selector index remap\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 8473, __extension__ __PRETTY_FUNCTION__))
;
8474
8475 return LocalID + I->second;
8476}
8477
8478DeclarationName
8479ASTReader::ReadDeclarationName(ModuleFile &F,
8480 const RecordData &Record, unsigned &Idx) {
8481 ASTContext &Context = getContext();
8482 DeclarationName::NameKind Kind = (DeclarationName::NameKind)Record[Idx++];
8483 switch (Kind) {
8484 case DeclarationName::Identifier:
8485 return DeclarationName(GetIdentifierInfo(F, Record, Idx));
8486
8487 case DeclarationName::ObjCZeroArgSelector:
8488 case DeclarationName::ObjCOneArgSelector:
8489 case DeclarationName::ObjCMultiArgSelector:
8490 return DeclarationName(ReadSelector(F, Record, Idx));
8491
8492 case DeclarationName::CXXConstructorName:
8493 return Context.DeclarationNames.getCXXConstructorName(
8494 Context.getCanonicalType(readType(F, Record, Idx)));
8495
8496 case DeclarationName::CXXDestructorName:
8497 return Context.DeclarationNames.getCXXDestructorName(
8498 Context.getCanonicalType(readType(F, Record, Idx)));
8499
8500 case DeclarationName::CXXDeductionGuideName:
8501 return Context.DeclarationNames.getCXXDeductionGuideName(
8502 ReadDeclAs<TemplateDecl>(F, Record, Idx));
8503
8504 case DeclarationName::CXXConversionFunctionName:
8505 return Context.DeclarationNames.getCXXConversionFunctionName(
8506 Context.getCanonicalType(readType(F, Record, Idx)));
8507
8508 case DeclarationName::CXXOperatorName:
8509 return Context.DeclarationNames.getCXXOperatorName(
8510 (OverloadedOperatorKind)Record[Idx++]);
8511
8512 case DeclarationName::CXXLiteralOperatorName:
8513 return Context.DeclarationNames.getCXXLiteralOperatorName(
8514 GetIdentifierInfo(F, Record, Idx));
8515
8516 case DeclarationName::CXXUsingDirective:
8517 return DeclarationName::getUsingDirectiveName();
8518 }
8519
8520 llvm_unreachable("Invalid NameKind!")::llvm::llvm_unreachable_internal("Invalid NameKind!", "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 8520)
;
8521}
8522
8523void ASTReader::ReadDeclarationNameLoc(ModuleFile &F,
8524 DeclarationNameLoc &DNLoc,
8525 DeclarationName Name,
8526 const RecordData &Record, unsigned &Idx) {
8527 switch (Name.getNameKind()) {
8528 case DeclarationName::CXXConstructorName:
8529 case DeclarationName::CXXDestructorName:
8530 case DeclarationName::CXXConversionFunctionName:
8531 DNLoc.NamedType.TInfo = GetTypeSourceInfo(F, Record, Idx);
8532 break;
8533
8534 case DeclarationName::CXXOperatorName:
8535 DNLoc.CXXOperatorName.BeginOpNameLoc
8536 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
8537 DNLoc.CXXOperatorName.EndOpNameLoc
8538 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
8539 break;
8540
8541 case DeclarationName::CXXLiteralOperatorName:
8542 DNLoc.CXXLiteralOperatorName.OpNameLoc
8543 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
8544 break;
8545
8546 case DeclarationName::Identifier:
8547 case DeclarationName::ObjCZeroArgSelector:
8548 case DeclarationName::ObjCOneArgSelector:
8549 case DeclarationName::ObjCMultiArgSelector:
8550 case DeclarationName::CXXUsingDirective:
8551 case DeclarationName::CXXDeductionGuideName:
8552 break;
8553 }
8554}
8555
8556void ASTReader::ReadDeclarationNameInfo(ModuleFile &F,
8557 DeclarationNameInfo &NameInfo,
8558 const RecordData &Record, unsigned &Idx) {
8559 NameInfo.setName(ReadDeclarationName(F, Record, Idx));
8560 NameInfo.setLoc(ReadSourceLocation(F, Record, Idx));
8561 DeclarationNameLoc DNLoc;
8562 ReadDeclarationNameLoc(F, DNLoc, NameInfo.getName(), Record, Idx);
8563 NameInfo.setInfo(DNLoc);
8564}
8565
8566void ASTReader::ReadQualifierInfo(ModuleFile &F, QualifierInfo &Info,
8567 const RecordData &Record, unsigned &Idx) {
8568 Info.QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx);
8569 unsigned NumTPLists = Record[Idx++];
8570 Info.NumTemplParamLists = NumTPLists;
8571 if (NumTPLists) {
8572 Info.TemplParamLists =
8573 new (getContext()) TemplateParameterList *[NumTPLists];
8574 for (unsigned i = 0; i != NumTPLists; ++i)
8575 Info.TemplParamLists[i] = ReadTemplateParameterList(F, Record, Idx);
8576 }
8577}
8578
8579TemplateName
8580ASTReader::ReadTemplateName(ModuleFile &F, const RecordData &Record,
8581 unsigned &Idx) {
8582 ASTContext &Context = getContext();
8583 TemplateName::NameKind Kind = (TemplateName::NameKind)Record[Idx++];
8584 switch (Kind) {
8585 case TemplateName::Template:
8586 return TemplateName(ReadDeclAs<TemplateDecl>(F, Record, Idx));
8587
8588 case TemplateName::OverloadedTemplate: {
8589 unsigned size = Record[Idx++];
8590 UnresolvedSet<8> Decls;
8591 while (size--)
8592 Decls.addDecl(ReadDeclAs<NamedDecl>(F, Record, Idx));
8593
8594 return Context.getOverloadedTemplateName(Decls.begin(), Decls.end());
8595 }
8596
8597 case TemplateName::QualifiedTemplate: {
8598 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
8599 bool hasTemplKeyword = Record[Idx++];
8600 TemplateDecl *Template = ReadDeclAs<TemplateDecl>(F, Record, Idx);
8601 return Context.getQualifiedTemplateName(NNS, hasTemplKeyword, Template);
8602 }
8603
8604 case TemplateName::DependentTemplate: {
8605 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
8606 if (Record[Idx++]) // isIdentifier
8607 return Context.getDependentTemplateName(NNS,
8608 GetIdentifierInfo(F, Record,
8609 Idx));
8610 return Context.getDependentTemplateName(NNS,
8611 (OverloadedOperatorKind)Record[Idx++]);
8612 }
8613
8614 case TemplateName::SubstTemplateTemplateParm: {
8615 TemplateTemplateParmDecl *param
8616 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
8617 if (!param) return TemplateName();
8618 TemplateName replacement = ReadTemplateName(F, Record, Idx);
8619 return Context.getSubstTemplateTemplateParm(param, replacement);
8620 }
8621
8622 case TemplateName::SubstTemplateTemplateParmPack: {
8623 TemplateTemplateParmDecl *Param
8624 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
8625 if (!Param)
8626 return TemplateName();
8627
8628 TemplateArgument ArgPack = ReadTemplateArgument(F, Record, Idx);
8629 if (ArgPack.getKind() != TemplateArgument::Pack)
8630 return TemplateName();
8631
8632 return Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
8633 }
8634 }
8635
8636 llvm_unreachable("Unhandled template name kind!")::llvm::llvm_unreachable_internal("Unhandled template name kind!"
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 8636)
;
8637}
8638
8639TemplateArgument ASTReader::ReadTemplateArgument(ModuleFile &F,
8640 const RecordData &Record,
8641 unsigned &Idx,
8642 bool Canonicalize) {
8643 ASTContext &Context = getContext();
8644 if (Canonicalize) {
8645 // The caller wants a canonical template argument. Sometimes the AST only
8646 // wants template arguments in canonical form (particularly as the template
8647 // argument lists of template specializations) so ensure we preserve that
8648 // canonical form across serialization.
8649 TemplateArgument Arg = ReadTemplateArgument(F, Record, Idx, false);
8650 return Context.getCanonicalTemplateArgument(Arg);
8651 }
8652
8653 TemplateArgument::ArgKind Kind = (TemplateArgument::ArgKind)Record[Idx++];
8654 switch (Kind) {
8655 case TemplateArgument::Null:
8656 return TemplateArgument();
8657 case TemplateArgument::Type:
8658 return TemplateArgument(readType(F, Record, Idx));
8659 case TemplateArgument::Declaration: {
8660 ValueDecl *D = ReadDeclAs<ValueDecl>(F, Record, Idx);
8661 return TemplateArgument(D, readType(F, Record, Idx));
8662 }
8663 case TemplateArgument::NullPtr:
8664 return TemplateArgument(readType(F, Record, Idx), /*isNullPtr*/true);
8665 case TemplateArgument::Integral: {
8666 llvm::APSInt Value = ReadAPSInt(Record, Idx);
8667 QualType T = readType(F, Record, Idx);
8668 return TemplateArgument(Context, Value, T);
8669 }
8670 case TemplateArgument::Template:
8671 return TemplateArgument(ReadTemplateName(F, Record, Idx));
8672 case TemplateArgument::TemplateExpansion: {
8673 TemplateName Name = ReadTemplateName(F, Record, Idx);
8674 Optional<unsigned> NumTemplateExpansions;
8675 if (unsigned NumExpansions = Record[Idx++])
8676 NumTemplateExpansions = NumExpansions - 1;
8677 return TemplateArgument(Name, NumTemplateExpansions);
8678 }
8679 case TemplateArgument::Expression:
8680 return TemplateArgument(ReadExpr(F));
8681 case TemplateArgument::Pack: {
8682 unsigned NumArgs = Record[Idx++];
8683 TemplateArgument *Args = new (Context) TemplateArgument[NumArgs];
8684 for (unsigned I = 0; I != NumArgs; ++I)
8685 Args[I] = ReadTemplateArgument(F, Record, Idx);
8686 return TemplateArgument(llvm::makeArrayRef(Args, NumArgs));
8687 }
8688 }
8689
8690 llvm_unreachable("Unhandled template argument kind!")::llvm::llvm_unreachable_internal("Unhandled template argument kind!"
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 8690)
;
8691}
8692
8693TemplateParameterList *
8694ASTReader::ReadTemplateParameterList(ModuleFile &F,
8695 const RecordData &Record, unsigned &Idx) {
8696 SourceLocation TemplateLoc = ReadSourceLocation(F, Record, Idx);
8697 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Idx);
8698 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Idx);
8699
8700 unsigned NumParams = Record[Idx++];
8701 SmallVector<NamedDecl *, 16> Params;
8702 Params.reserve(NumParams);
8703 while (NumParams--)
8704 Params.push_back(ReadDeclAs<NamedDecl>(F, Record, Idx));
8705
8706 // TODO: Concepts
8707 TemplateParameterList *TemplateParams = TemplateParameterList::Create(
8708 getContext(), TemplateLoc, LAngleLoc, Params, RAngleLoc, nullptr);
8709 return TemplateParams;
8710}
8711
8712void
8713ASTReader::
8714ReadTemplateArgumentList(SmallVectorImpl<TemplateArgument> &TemplArgs,
8715 ModuleFile &F, const RecordData &Record,
8716 unsigned &Idx, bool Canonicalize) {
8717 unsigned NumTemplateArgs = Record[Idx++];
8718 TemplArgs.reserve(NumTemplateArgs);
8719 while (NumTemplateArgs--)
8720 TemplArgs.push_back(ReadTemplateArgument(F, Record, Idx, Canonicalize));
8721}
8722
8723/// \brief Read a UnresolvedSet structure.
8724void ASTReader::ReadUnresolvedSet(ModuleFile &F, LazyASTUnresolvedSet &Set,
8725 const RecordData &Record, unsigned &Idx) {
8726 unsigned NumDecls = Record[Idx++];
8727 Set.reserve(getContext(), NumDecls);
8728 while (NumDecls--) {
8729 DeclID ID = ReadDeclID(F, Record, Idx);
8730 AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
8731 Set.addLazyDecl(getContext(), ID, AS);
8732 }
8733}
8734
8735CXXBaseSpecifier
8736ASTReader::ReadCXXBaseSpecifier(ModuleFile &F,
8737 const RecordData &Record, unsigned &Idx) {
8738 bool isVirtual = static_cast<bool>(Record[Idx++]);
8739 bool isBaseOfClass = static_cast<bool>(Record[Idx++]);
8740 AccessSpecifier AS = static_cast<AccessSpecifier>(Record[Idx++]);
8741 bool inheritConstructors = static_cast<bool>(Record[Idx++]);
8742 TypeSourceInfo *TInfo = GetTypeSourceInfo(F, Record, Idx);
8743 SourceRange Range = ReadSourceRange(F, Record, Idx);
8744 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Idx);
8745 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo,
8746 EllipsisLoc);
8747 Result.setInheritConstructors(inheritConstructors);
8748 return Result;
8749}
8750
8751CXXCtorInitializer **
8752ASTReader::ReadCXXCtorInitializers(ModuleFile &F, const RecordData &Record,
8753 unsigned &Idx) {
8754 ASTContext &Context = getContext();
8755 unsigned NumInitializers = Record[Idx++];
8756 assert(NumInitializers && "wrote ctor initializers but have no inits")(static_cast <bool> (NumInitializers && "wrote ctor initializers but have no inits"
) ? void (0) : __assert_fail ("NumInitializers && \"wrote ctor initializers but have no inits\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 8756, __extension__ __PRETTY_FUNCTION__))
;
8757 auto **CtorInitializers = new (Context) CXXCtorInitializer*[NumInitializers];
8758 for (unsigned i = 0; i != NumInitializers; ++i) {
8759 TypeSourceInfo *TInfo = nullptr;
8760 bool IsBaseVirtual = false;
8761 FieldDecl *Member = nullptr;
8762 IndirectFieldDecl *IndirectMember = nullptr;
8763
8764 CtorInitializerType Type = (CtorInitializerType)Record[Idx++];
8765 switch (Type) {
8766 case CTOR_INITIALIZER_BASE:
8767 TInfo = GetTypeSourceInfo(F, Record, Idx);
8768 IsBaseVirtual = Record[Idx++];
8769 break;
8770
8771 case CTOR_INITIALIZER_DELEGATING:
8772 TInfo = GetTypeSourceInfo(F, Record, Idx);
8773 break;
8774
8775 case CTOR_INITIALIZER_MEMBER:
8776 Member = ReadDeclAs<FieldDecl>(F, Record, Idx);
8777 break;
8778
8779 case CTOR_INITIALIZER_INDIRECT_MEMBER:
8780 IndirectMember = ReadDeclAs<IndirectFieldDecl>(F, Record, Idx);
8781 break;
8782 }
8783
8784 SourceLocation MemberOrEllipsisLoc = ReadSourceLocation(F, Record, Idx);
8785 Expr *Init = ReadExpr(F);
8786 SourceLocation LParenLoc = ReadSourceLocation(F, Record, Idx);
8787 SourceLocation RParenLoc = ReadSourceLocation(F, Record, Idx);
8788
8789 CXXCtorInitializer *BOMInit;
8790 if (Type == CTOR_INITIALIZER_BASE)
8791 BOMInit = new (Context)
8792 CXXCtorInitializer(Context, TInfo, IsBaseVirtual, LParenLoc, Init,
8793 RParenLoc, MemberOrEllipsisLoc);
8794 else if (Type == CTOR_INITIALIZER_DELEGATING)
8795 BOMInit = new (Context)
8796 CXXCtorInitializer(Context, TInfo, LParenLoc, Init, RParenLoc);
8797 else if (Member)
8798 BOMInit = new (Context)
8799 CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc, LParenLoc,
8800 Init, RParenLoc);
8801 else
8802 BOMInit = new (Context)
8803 CXXCtorInitializer(Context, IndirectMember, MemberOrEllipsisLoc,
8804 LParenLoc, Init, RParenLoc);
8805
8806 if (/*IsWritten*/Record[Idx++]) {
8807 unsigned SourceOrder = Record[Idx++];
8808 BOMInit->setSourceOrder(SourceOrder);
8809 }
8810
8811 CtorInitializers[i] = BOMInit;
8812 }
8813
8814 return CtorInitializers;
8815}
8816
8817NestedNameSpecifier *
8818ASTReader::ReadNestedNameSpecifier(ModuleFile &F,
8819 const RecordData &Record, unsigned &Idx) {
8820 ASTContext &Context = getContext();
8821 unsigned N = Record[Idx++];
8822 NestedNameSpecifier *NNS = nullptr, *Prev = nullptr;
8823 for (unsigned I = 0; I != N; ++I) {
8824 NestedNameSpecifier::SpecifierKind Kind
8825 = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
8826 switch (Kind) {
8827 case NestedNameSpecifier::Identifier: {
8828 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
8829 NNS = NestedNameSpecifier::Create(Context, Prev, II);
8830 break;
8831 }
8832
8833 case NestedNameSpecifier::Namespace: {
8834 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
8835 NNS = NestedNameSpecifier::Create(Context, Prev, NS);
8836 break;
8837 }
8838
8839 case NestedNameSpecifier::NamespaceAlias: {
8840 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
8841 NNS = NestedNameSpecifier::Create(Context, Prev, Alias);
8842 break;
8843 }
8844
8845 case NestedNameSpecifier::TypeSpec:
8846 case NestedNameSpecifier::TypeSpecWithTemplate: {
8847 const Type *T = readType(F, Record, Idx).getTypePtrOrNull();
8848 if (!T)
8849 return nullptr;
8850
8851 bool Template = Record[Idx++];
8852 NNS = NestedNameSpecifier::Create(Context, Prev, Template, T);
8853 break;
8854 }
8855
8856 case NestedNameSpecifier::Global:
8857 NNS = NestedNameSpecifier::GlobalSpecifier(Context);
8858 // No associated value, and there can't be a prefix.
8859 break;
8860
8861 case NestedNameSpecifier::Super: {
8862 CXXRecordDecl *RD = ReadDeclAs<CXXRecordDecl>(F, Record, Idx);
8863 NNS = NestedNameSpecifier::SuperSpecifier(Context, RD);
8864 break;
8865 }
8866 }
8867 Prev = NNS;
8868 }
8869 return NNS;
8870}
8871
8872NestedNameSpecifierLoc
8873ASTReader::ReadNestedNameSpecifierLoc(ModuleFile &F, const RecordData &Record,
8874 unsigned &Idx) {
8875 ASTContext &Context = getContext();
8876 unsigned N = Record[Idx++];
8877 NestedNameSpecifierLocBuilder Builder;
8878 for (unsigned I = 0; I != N; ++I) {
8879 NestedNameSpecifier::SpecifierKind Kind
8880 = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
8881 switch (Kind) {
8882 case NestedNameSpecifier::Identifier: {
8883 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
8884 SourceRange Range = ReadSourceRange(F, Record, Idx);
8885 Builder.Extend(Context, II, Range.getBegin(), Range.getEnd());
8886 break;
8887 }
8888
8889 case NestedNameSpecifier::Namespace: {
8890 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
8891 SourceRange Range = ReadSourceRange(F, Record, Idx);
8892 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
8893 break;
8894 }
8895
8896 case NestedNameSpecifier::NamespaceAlias: {
8897 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
8898 SourceRange Range = ReadSourceRange(F, Record, Idx);
8899 Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd());
8900 break;
8901 }
8902
8903 case NestedNameSpecifier::TypeSpec:
8904 case NestedNameSpecifier::TypeSpecWithTemplate: {
8905 bool Template = Record[Idx++];
8906 TypeSourceInfo *T = GetTypeSourceInfo(F, Record, Idx);
8907 if (!T)
8908 return NestedNameSpecifierLoc();
8909 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
8910
8911 // FIXME: 'template' keyword location not saved anywhere, so we fake it.
8912 Builder.Extend(Context,
8913 Template? T->getTypeLoc().getBeginLoc() : SourceLocation(),
8914 T->getTypeLoc(), ColonColonLoc);
8915 break;
8916 }
8917
8918 case NestedNameSpecifier::Global: {
8919 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
8920 Builder.MakeGlobal(Context, ColonColonLoc);
8921 break;
8922 }
8923
8924 case NestedNameSpecifier::Super: {
8925 CXXRecordDecl *RD = ReadDeclAs<CXXRecordDecl>(F, Record, Idx);
8926 SourceRange Range = ReadSourceRange(F, Record, Idx);
8927 Builder.MakeSuper(Context, RD, Range.getBegin(), Range.getEnd());
8928 break;
8929 }
8930 }
8931 }
8932
8933 return Builder.getWithLocInContext(Context);
8934}
8935
8936SourceRange
8937ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record,
8938 unsigned &Idx) {
8939 SourceLocation beg = ReadSourceLocation(F, Record, Idx);
8940 SourceLocation end = ReadSourceLocation(F, Record, Idx);
8941 return SourceRange(beg, end);
8942}
8943
8944/// \brief Read an integral value
8945llvm::APInt ASTReader::ReadAPInt(const RecordData &Record, unsigned &Idx) {
8946 unsigned BitWidth = Record[Idx++];
8947 unsigned NumWords = llvm::APInt::getNumWords(BitWidth);
8948 llvm::APInt Result(BitWidth, NumWords, &Record[Idx]);
8949 Idx += NumWords;
8950 return Result;
8951}
8952
8953/// \brief Read a signed integral value
8954llvm::APSInt ASTReader::ReadAPSInt(const RecordData &Record, unsigned &Idx) {
8955 bool isUnsigned = Record[Idx++];
8956 return llvm::APSInt(ReadAPInt(Record, Idx), isUnsigned);
8957}
8958
8959/// \brief Read a floating-point value
8960llvm::APFloat ASTReader::ReadAPFloat(const RecordData &Record,
8961 const llvm::fltSemantics &Sem,
8962 unsigned &Idx) {
8963 return llvm::APFloat(Sem, ReadAPInt(Record, Idx));
8964}
8965
8966// \brief Read a string
8967std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) {
8968 unsigned Len = Record[Idx++];
8969 std::string Result(Record.data() + Idx, Record.data() + Idx + Len);
8970 Idx += Len;
8971 return Result;
8972}
8973
8974std::string ASTReader::ReadPath(ModuleFile &F, const RecordData &Record,
8975 unsigned &Idx) {
8976 std::string Filename = ReadString(Record, Idx);
8977 ResolveImportedPath(F, Filename);
8978 return Filename;
8979}
8980
8981VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record,
8982 unsigned &Idx) {
8983 unsigned Major = Record[Idx++];
8984 unsigned Minor = Record[Idx++];
8985 unsigned Subminor = Record[Idx++];
8986 if (Minor == 0)
8987 return VersionTuple(Major);
8988 if (Subminor == 0)
8989 return VersionTuple(Major, Minor - 1);
8990 return VersionTuple(Major, Minor - 1, Subminor - 1);
8991}
8992
8993CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F,
8994 const RecordData &Record,
8995 unsigned &Idx) {
8996 CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx);
8997 return CXXTemporary::Create(getContext(), Decl);
8998}
8999
9000DiagnosticBuilder ASTReader::Diag(unsigned DiagID) const {
9001 return Diag(CurrentImportLoc, DiagID);
9002}
9003
9004DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) const {
9005 return Diags.Report(Loc, DiagID);
9006}
9007
9008/// \brief Retrieve the identifier table associated with the
9009/// preprocessor.
9010IdentifierTable &ASTReader::getIdentifierTable() {
9011 return PP.getIdentifierTable();
9012}
9013
9014/// \brief Record that the given ID maps to the given switch-case
9015/// statement.
9016void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) {
9017 assert((*CurrSwitchCaseStmts)[ID] == nullptr &&(static_cast <bool> ((*CurrSwitchCaseStmts)[ID] == nullptr
&& "Already have a SwitchCase with this ID") ? void (
0) : __assert_fail ("(*CurrSwitchCaseStmts)[ID] == nullptr && \"Already have a SwitchCase with this ID\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 9018, __extension__ __PRETTY_FUNCTION__))
9018 "Already have a SwitchCase with this ID")(static_cast <bool> ((*CurrSwitchCaseStmts)[ID] == nullptr
&& "Already have a SwitchCase with this ID") ? void (
0) : __assert_fail ("(*CurrSwitchCaseStmts)[ID] == nullptr && \"Already have a SwitchCase with this ID\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 9018, __extension__ __PRETTY_FUNCTION__))
;
9019 (*CurrSwitchCaseStmts)[ID] = SC;
9020}
9021
9022/// \brief Retrieve the switch-case statement with the given ID.
9023SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) {
9024 assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID")(static_cast <bool> ((*CurrSwitchCaseStmts)[ID] != nullptr
&& "No SwitchCase with this ID") ? void (0) : __assert_fail
("(*CurrSwitchCaseStmts)[ID] != nullptr && \"No SwitchCase with this ID\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 9024, __extension__ __PRETTY_FUNCTION__))
;
9025 return (*CurrSwitchCaseStmts)[ID];
9026}
9027
9028void ASTReader::ClearSwitchCaseIDs() {
9029 CurrSwitchCaseStmts->clear();
9030}
9031
9032void ASTReader::ReadComments() {
9033 ASTContext &Context = getContext();
9034 std::vector<RawComment *> Comments;
9035 for (SmallVectorImpl<std::pair<BitstreamCursor,
9036 serialization::ModuleFile *>>::iterator
9037 I = CommentsCursors.begin(),
9038 E = CommentsCursors.end();
9039 I != E; ++I) {
9040 Comments.clear();
9041 BitstreamCursor &Cursor = I->first;
9042 serialization::ModuleFile &F = *I->second;
9043 SavedStreamPosition SavedPosition(Cursor);
9044
9045 RecordData Record;
9046 while (true) {
9047 llvm::BitstreamEntry Entry =
9048 Cursor.advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd);
9049
9050 switch (Entry.Kind) {
9051 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
9052 case llvm::BitstreamEntry::Error:
9053 Error("malformed block record in AST file");
9054 return;
9055 case llvm::BitstreamEntry::EndBlock:
9056 goto NextCursor;
9057 case llvm::BitstreamEntry::Record:
9058 // The interesting case.
9059 break;
9060 }
9061
9062 // Read a record.
9063 Record.clear();
9064 switch ((CommentRecordTypes)Cursor.readRecord(Entry.ID, Record)) {
9065 case COMMENTS_RAW_COMMENT: {
9066 unsigned Idx = 0;
9067 SourceRange SR = ReadSourceRange(F, Record, Idx);
9068 RawComment::CommentKind Kind =
9069 (RawComment::CommentKind) Record[Idx++];
9070 bool IsTrailingComment = Record[Idx++];
9071 bool IsAlmostTrailingComment = Record[Idx++];
9072 Comments.push_back(new (Context) RawComment(
9073 SR, Kind, IsTrailingComment, IsAlmostTrailingComment));
9074 break;
9075 }
9076 }
9077 }
9078 NextCursor:
9079 // De-serialized SourceLocations get negative FileIDs for other modules,
9080 // potentially invalidating the original order. Sort it again.
9081 llvm::sort(Comments.begin(), Comments.end(),
9082 BeforeThanCompare<RawComment>(SourceMgr));
9083 Context.Comments.addDeserializedComments(Comments);
9084 }
9085}
9086
9087void ASTReader::visitInputFiles(serialization::ModuleFile &MF,
9088 bool IncludeSystem, bool Complain,
9089 llvm::function_ref<void(const serialization::InputFile &IF,
9090 bool isSystem)> Visitor) {
9091 unsigned NumUserInputs = MF.NumUserInputFiles;
9092 unsigned NumInputs = MF.InputFilesLoaded.size();
9093 assert(NumUserInputs <= NumInputs)(static_cast <bool> (NumUserInputs <= NumInputs) ? void
(0) : __assert_fail ("NumUserInputs <= NumInputs", "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 9093, __extension__ __PRETTY_FUNCTION__))
;
9094 unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
9095 for (unsigned I = 0; I < N; ++I) {
9096 bool IsSystem = I >= NumUserInputs;
9097 InputFile IF = getInputFile(MF, I+1, Complain);
9098 Visitor(IF, IsSystem);
9099 }
9100}
9101
9102void ASTReader::visitTopLevelModuleMaps(
9103 serialization::ModuleFile &MF,
9104 llvm::function_ref<void(const FileEntry *FE)> Visitor) {
9105 unsigned NumInputs = MF.InputFilesLoaded.size();
9106 for (unsigned I = 0; I < NumInputs; ++I) {
9107 InputFileInfo IFI = readInputFileInfo(MF, I + 1);
9108 if (IFI.TopLevelModuleMap)
9109 // FIXME: This unnecessarily re-reads the InputFileInfo.
9110 if (auto *FE = getInputFile(MF, I + 1).getFile())
9111 Visitor(FE);
9112 }
9113}
9114
9115std::string ASTReader::getOwningModuleNameForDiagnostic(const Decl *D) {
9116 // If we know the owning module, use it.
9117 if (Module *M = D->getImportedOwningModule())
9118 return M->getFullModuleName();
9119
9120 // Otherwise, use the name of the top-level module the decl is within.
9121 if (ModuleFile *M = getOwningModuleFile(D))
9122 return M->ModuleName;
9123
9124 // Not from a module.
9125 return {};
9126}
9127
9128void ASTReader::finishPendingActions() {
9129 while (!PendingIdentifierInfos.empty() ||
9130 !PendingIncompleteDeclChains.empty() || !PendingDeclChains.empty() ||
9131 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() ||
9132 !PendingUpdateRecords.empty()) {
9133 // If any identifiers with corresponding top-level declarations have
9134 // been loaded, load those declarations now.
9135 using TopLevelDeclsMap =
9136 llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2>>;
9137 TopLevelDeclsMap TopLevelDecls;
9138
9139 while (!PendingIdentifierInfos.empty()) {
9140 IdentifierInfo *II = PendingIdentifierInfos.back().first;
9141 SmallVector<uint32_t, 4> DeclIDs =
9142 std::move(PendingIdentifierInfos.back().second);
9143 PendingIdentifierInfos.pop_back();
9144
9145 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]);
9146 }
9147
9148 // For each decl chain that we wanted to complete while deserializing, mark
9149 // it as "still needs to be completed".
9150 for (unsigned I = 0; I != PendingIncompleteDeclChains.size(); ++I) {
9151 markIncompleteDeclChain(PendingIncompleteDeclChains[I]);
9152 }
9153 PendingIncompleteDeclChains.clear();
9154
9155 // Load pending declaration chains.
9156 for (unsigned I = 0; I != PendingDeclChains.size(); ++I)
9157 loadPendingDeclChain(PendingDeclChains[I].first, PendingDeclChains[I].second);
9158 PendingDeclChains.clear();
9159
9160 // Make the most recent of the top-level declarations visible.
9161 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
9162 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
9163 IdentifierInfo *II = TLD->first;
9164 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
9165 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II);
9166 }
9167 }
9168
9169 // Load any pending macro definitions.
9170 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
9171 IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
9172 SmallVector<PendingMacroInfo, 2> GlobalIDs;
9173 GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
9174 // Initialize the macro history from chained-PCHs ahead of module imports.
9175 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
9176 ++IDIdx) {
9177 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
9178 if (!Info.M->isModule())
9179 resolvePendingMacro(II, Info);
9180 }
9181 // Handle module imports.
9182 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
9183 ++IDIdx) {
9184 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
9185 if (Info.M->isModule())
9186 resolvePendingMacro(II, Info);
9187 }
9188 }
9189 PendingMacroIDs.clear();
9190
9191 // Wire up the DeclContexts for Decls that we delayed setting until
9192 // recursive loading is completed.
9193 while (!PendingDeclContextInfos.empty()) {
9194 PendingDeclContextInfo Info = PendingDeclContextInfos.front();
9195 PendingDeclContextInfos.pop_front();
9196 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC));
9197 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC));
9198 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext());
9199 }
9200
9201 // Perform any pending declaration updates.
9202 while (!PendingUpdateRecords.empty()) {
9203 auto Update = PendingUpdateRecords.pop_back_val();
9204 ReadingKindTracker ReadingKind(Read_Decl, *this);
9205 loadDeclUpdateRecords(Update);
9206 }
9207 }
9208
9209 // At this point, all update records for loaded decls are in place, so any
9210 // fake class definitions should have become real.
9211 assert(PendingFakeDefinitionData.empty() &&(static_cast <bool> (PendingFakeDefinitionData.empty() &&
"faked up a class definition but never saw the real one") ? void
(0) : __assert_fail ("PendingFakeDefinitionData.empty() && \"faked up a class definition but never saw the real one\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 9212, __extension__ __PRETTY_FUNCTION__))
9212 "faked up a class definition but never saw the real one")(static_cast <bool> (PendingFakeDefinitionData.empty() &&
"faked up a class definition but never saw the real one") ? void
(0) : __assert_fail ("PendingFakeDefinitionData.empty() && \"faked up a class definition but never saw the real one\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 9212, __extension__ __PRETTY_FUNCTION__))
;
9213
9214 // If we deserialized any C++ or Objective-C class definitions, any
9215 // Objective-C protocol definitions, or any redeclarable templates, make sure
9216 // that all redeclarations point to the definitions. Note that this can only
9217 // happen now, after the redeclaration chains have been fully wired.
9218 for (Decl *D : PendingDefinitions) {
9219 if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
9220 if (const TagType *TagT = dyn_cast<TagType>(TD->getTypeForDecl())) {
9221 // Make sure that the TagType points at the definition.
9222 const_cast<TagType*>(TagT)->decl = TD;
9223 }
9224
9225 if (auto RD = dyn_cast<CXXRecordDecl>(D)) {
9226 for (auto *R = getMostRecentExistingDecl(RD); R;
9227 R = R->getPreviousDecl()) {
9228 assert((R == D) ==(static_cast <bool> ((R == D) == cast<CXXRecordDecl>
(R)->isThisDeclarationADefinition() && "declaration thinks it's the definition but it isn't"
) ? void (0) : __assert_fail ("(R == D) == cast<CXXRecordDecl>(R)->isThisDeclarationADefinition() && \"declaration thinks it's the definition but it isn't\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 9230, __extension__ __PRETTY_FUNCTION__))
9229 cast<CXXRecordDecl>(R)->isThisDeclarationADefinition() &&(static_cast <bool> ((R == D) == cast<CXXRecordDecl>
(R)->isThisDeclarationADefinition() && "declaration thinks it's the definition but it isn't"
) ? void (0) : __assert_fail ("(R == D) == cast<CXXRecordDecl>(R)->isThisDeclarationADefinition() && \"declaration thinks it's the definition but it isn't\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 9230, __extension__ __PRETTY_FUNCTION__))
9230 "declaration thinks it's the definition but it isn't")(static_cast <bool> ((R == D) == cast<CXXRecordDecl>
(R)->isThisDeclarationADefinition() && "declaration thinks it's the definition but it isn't"
) ? void (0) : __assert_fail ("(R == D) == cast<CXXRecordDecl>(R)->isThisDeclarationADefinition() && \"declaration thinks it's the definition but it isn't\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 9230, __extension__ __PRETTY_FUNCTION__))
;
9231 cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData;
9232 }
9233 }
9234
9235 continue;
9236 }
9237
9238 if (auto ID = dyn_cast<ObjCInterfaceDecl>(D)) {
9239 // Make sure that the ObjCInterfaceType points at the definition.
9240 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl))
9241 ->Decl = ID;
9242
9243 for (auto *R = getMostRecentExistingDecl(ID); R; R = R->getPreviousDecl())
9244 cast<ObjCInterfaceDecl>(R)->Data = ID->Data;
9245
9246 continue;
9247 }
9248
9249 if (auto PD = dyn_cast<ObjCProtocolDecl>(D)) {
9250 for (auto *R = getMostRecentExistingDecl(PD); R; R = R->getPreviousDecl())
9251 cast<ObjCProtocolDecl>(R)->Data = PD->Data;
9252
9253 continue;
9254 }
9255
9256 auto RTD = cast<RedeclarableTemplateDecl>(D)->getCanonicalDecl();
9257 for (auto *R = getMostRecentExistingDecl(RTD); R; R = R->getPreviousDecl())
9258 cast<RedeclarableTemplateDecl>(R)->Common = RTD->Common;
9259 }
9260 PendingDefinitions.clear();
9261
9262 // Load the bodies of any functions or methods we've encountered. We do
9263 // this now (delayed) so that we can be sure that the declaration chains
9264 // have been fully wired up (hasBody relies on this).
9265 // FIXME: We shouldn't require complete redeclaration chains here.
9266 for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
9267 PBEnd = PendingBodies.end();
9268 PB != PBEnd; ++PB) {
9269 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
9270 // FIXME: Check for =delete/=default?
9271 // FIXME: Complain about ODR violations here?
9272 const FunctionDecl *Defn = nullptr;
9273 if (!getContext().getLangOpts().Modules || !FD->hasBody(Defn)) {
9274 FD->setLazyBody(PB->second);
9275 } else {
9276 auto *NonConstDefn = const_cast<FunctionDecl*>(Defn);
9277 mergeDefinitionVisibility(NonConstDefn, FD);
9278
9279 if (!FD->isLateTemplateParsed() &&
9280 !NonConstDefn->isLateTemplateParsed() &&
9281 FD->getODRHash() != NonConstDefn->getODRHash()) {
9282 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
9283 }
9284 }
9285 continue;
9286 }
9287
9288 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first);
9289 if (!getContext().getLangOpts().Modules || !MD->hasBody())
9290 MD->setLazyBody(PB->second);
9291 }
9292 PendingBodies.clear();
9293
9294 // Do some cleanup.
9295 for (auto *ND : PendingMergedDefinitionsToDeduplicate)
9296 getContext().deduplicateMergedDefinitonsFor(ND);
9297 PendingMergedDefinitionsToDeduplicate.clear();
9298}
9299
9300void ASTReader::diagnoseOdrViolations() {
9301 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty() &&
9302 PendingFunctionOdrMergeFailures.empty())
9303 return;
9304
9305 // Trigger the import of the full definition of each class that had any
9306 // odr-merging problems, so we can produce better diagnostics for them.
9307 // These updates may in turn find and diagnose some ODR failures, so take
9308 // ownership of the set first.
9309 auto OdrMergeFailures = std::move(PendingOdrMergeFailures);
9310 PendingOdrMergeFailures.clear();
9311 for (auto &Merge : OdrMergeFailures) {
9312 Merge.first->buildLookup();
9313 Merge.first->decls_begin();
9314 Merge.first->bases_begin();
9315 Merge.first->vbases_begin();
9316 for (auto &RecordPair : Merge.second) {
9317 auto *RD = RecordPair.first;
9318 RD->decls_begin();
9319 RD->bases_begin();
9320 RD->vbases_begin();
9321 }
9322 }
9323
9324 // Trigger the import of functions.
9325 auto FunctionOdrMergeFailures = std::move(PendingFunctionOdrMergeFailures);
9326 PendingFunctionOdrMergeFailures.clear();
9327 for (auto &Merge : FunctionOdrMergeFailures) {
9328 Merge.first->buildLookup();
9329 Merge.first->decls_begin();
9330 Merge.first->getBody();
9331 for (auto &FD : Merge.second) {
9332 FD->buildLookup();
9333 FD->decls_begin();
9334 FD->getBody();
9335 }
9336 }
9337
9338 // For each declaration from a merged context, check that the canonical
9339 // definition of that context also contains a declaration of the same
9340 // entity.
9341 //
9342 // Caution: this loop does things that might invalidate iterators into
9343 // PendingOdrMergeChecks. Don't turn this into a range-based for loop!
9344 while (!PendingOdrMergeChecks.empty()) {
9345 NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
9346
9347 // FIXME: Skip over implicit declarations for now. This matters for things
9348 // like implicitly-declared special member functions. This isn't entirely
9349 // correct; we can end up with multiple unmerged declarations of the same
9350 // implicit entity.
9351 if (D->isImplicit())
9352 continue;
9353
9354 DeclContext *CanonDef = D->getDeclContext();
9355
9356 bool Found = false;
9357 const Decl *DCanon = D->getCanonicalDecl();
9358
9359 for (auto RI : D->redecls()) {
9360 if (RI->getLexicalDeclContext() == CanonDef) {
9361 Found = true;
9362 break;
9363 }
9364 }
9365 if (Found)
9366 continue;
9367
9368 // Quick check failed, time to do the slow thing. Note, we can't just
9369 // look up the name of D in CanonDef here, because the member that is
9370 // in CanonDef might not be found by name lookup (it might have been
9371 // replaced by a more recent declaration in the lookup table), and we
9372 // can't necessarily find it in the redeclaration chain because it might
9373 // be merely mergeable, not redeclarable.
9374 llvm::SmallVector<const NamedDecl*, 4> Candidates;
9375 for (auto *CanonMember : CanonDef->decls()) {
9376 if (CanonMember->getCanonicalDecl() == DCanon) {
9377 // This can happen if the declaration is merely mergeable and not
9378 // actually redeclarable (we looked for redeclarations earlier).
9379 //
9380 // FIXME: We should be able to detect this more efficiently, without
9381 // pulling in all of the members of CanonDef.
9382 Found = true;
9383 break;
9384 }
9385 if (auto *ND = dyn_cast<NamedDecl>(CanonMember))
9386 if (ND->getDeclName() == D->getDeclName())
9387 Candidates.push_back(ND);
9388 }
9389
9390 if (!Found) {
9391 // The AST doesn't like TagDecls becoming invalid after they've been
9392 // completed. We only really need to mark FieldDecls as invalid here.
9393 if (!isa<TagDecl>(D))
9394 D->setInvalidDecl();
9395
9396 // Ensure we don't accidentally recursively enter deserialization while
9397 // we're producing our diagnostic.
9398 Deserializing RecursionGuard(this);
9399
9400 std::string CanonDefModule =
9401 getOwningModuleNameForDiagnostic(cast<Decl>(CanonDef));
9402 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl)
9403 << D << getOwningModuleNameForDiagnostic(D)
9404 << CanonDef << CanonDefModule.empty() << CanonDefModule;
9405
9406 if (Candidates.empty())
9407 Diag(cast<Decl>(CanonDef)->getLocation(),
9408 diag::note_module_odr_violation_no_possible_decls) << D;
9409 else {
9410 for (unsigned I = 0, N = Candidates.size(); I != N; ++I)
9411 Diag(Candidates[I]->getLocation(),
9412 diag::note_module_odr_violation_possible_decl)
9413 << Candidates[I];
9414 }
9415
9416 DiagnosedOdrMergeFailures.insert(CanonDef);
9417 }
9418 }
9419
9420 if (OdrMergeFailures.empty() && FunctionOdrMergeFailures.empty())
9421 return;
9422
9423 // Ensure we don't accidentally recursively enter deserialization while
9424 // we're producing our diagnostics.
9425 Deserializing RecursionGuard(this);
9426
9427 // Common code for hashing helpers.
9428 ODRHash Hash;
9429 auto ComputeQualTypeODRHash = [&Hash](QualType Ty) {
9430 Hash.clear();
9431 Hash.AddQualType(Ty);
9432 return Hash.CalculateHash();
9433 };
9434
9435 auto ComputeODRHash = [&Hash](const Stmt *S) {
9436 assert(S)(static_cast <bool> (S) ? void (0) : __assert_fail ("S"
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 9436, __extension__ __PRETTY_FUNCTION__))
;
9437 Hash.clear();
9438 Hash.AddStmt(S);
9439 return Hash.CalculateHash();
9440 };
9441
9442 auto ComputeSubDeclODRHash = [&Hash](const Decl *D) {
9443 assert(D)(static_cast <bool> (D) ? void (0) : __assert_fail ("D"
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 9443, __extension__ __PRETTY_FUNCTION__))
;
9444 Hash.clear();
9445 Hash.AddSubDecl(D);
9446 return Hash.CalculateHash();
9447 };
9448
9449 // Issue any pending ODR-failure diagnostics.
9450 for (auto &Merge : OdrMergeFailures) {
9451 // If we've already pointed out a specific problem with this class, don't
9452 // bother issuing a general "something's different" diagnostic.
9453 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
9454 continue;
9455
9456 bool Diagnosed = false;
9457 CXXRecordDecl *FirstRecord = Merge.first;
9458 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstRecord);
9459 for (auto &RecordPair : Merge.second) {
9460 CXXRecordDecl *SecondRecord = RecordPair.first;
9461 // Multiple different declarations got merged together; tell the user
9462 // where they came from.
9463 if (FirstRecord == SecondRecord)
9464 continue;
9465
9466 std::string SecondModule = getOwningModuleNameForDiagnostic(SecondRecord);
9467
9468 auto *FirstDD = FirstRecord->DefinitionData;
9469 auto *SecondDD = RecordPair.second;
9470
9471 assert(FirstDD && SecondDD && "Definitions without DefinitionData")(static_cast <bool> (FirstDD && SecondDD &&
"Definitions without DefinitionData") ? void (0) : __assert_fail
("FirstDD && SecondDD && \"Definitions without DefinitionData\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 9471, __extension__ __PRETTY_FUNCTION__))
;
9472
9473 // Diagnostics from DefinitionData are emitted here.
9474 if (FirstDD != SecondDD) {
9475 enum ODRDefinitionDataDifference {
9476 NumBases,
9477 NumVBases,
9478 BaseType,
9479 BaseVirtual,
9480 BaseAccess,
9481 };
9482 auto ODRDiagError = [FirstRecord, &FirstModule,
9483 this](SourceLocation Loc, SourceRange Range,
9484 ODRDefinitionDataDifference DiffType) {
9485 return Diag(Loc, diag::err_module_odr_violation_definition_data)
9486 << FirstRecord << FirstModule.empty() << FirstModule << Range
9487 << DiffType;
9488 };
9489 auto ODRDiagNote = [&SecondModule,
9490 this](SourceLocation Loc, SourceRange Range,
9491 ODRDefinitionDataDifference DiffType) {
9492 return Diag(Loc, diag::note_module_odr_violation_definition_data)
9493 << SecondModule << Range << DiffType;
9494 };
9495
9496 unsigned FirstNumBases = FirstDD->NumBases;
9497 unsigned FirstNumVBases = FirstDD->NumVBases;
9498 unsigned SecondNumBases = SecondDD->NumBases;
9499 unsigned SecondNumVBases = SecondDD->NumVBases;
9500
9501 auto GetSourceRange = [](struct CXXRecordDecl::DefinitionData *DD) {
9502 unsigned NumBases = DD->NumBases;
9503 if (NumBases == 0) return SourceRange();
9504 auto bases = DD->bases();
9505 return SourceRange(bases[0].getLocStart(),
9506 bases[NumBases - 1].getLocEnd());
9507 };
9508
9509 if (FirstNumBases != SecondNumBases) {
9510 ODRDiagError(FirstRecord->getLocation(), GetSourceRange(FirstDD),
9511 NumBases)
9512 << FirstNumBases;
9513 ODRDiagNote(SecondRecord->getLocation(), GetSourceRange(SecondDD),
9514 NumBases)
9515 << SecondNumBases;
9516 Diagnosed = true;
9517 break;
9518 }
9519
9520 if (FirstNumVBases != SecondNumVBases) {
9521 ODRDiagError(FirstRecord->getLocation(), GetSourceRange(FirstDD),
9522 NumVBases)
9523 << FirstNumVBases;
9524 ODRDiagNote(SecondRecord->getLocation(), GetSourceRange(SecondDD),
9525 NumVBases)
9526 << SecondNumVBases;
9527 Diagnosed = true;
9528 break;
9529 }
9530
9531 auto FirstBases = FirstDD->bases();
9532 auto SecondBases = SecondDD->bases();
9533 unsigned i = 0;
9534 for (i = 0; i < FirstNumBases; ++i) {
9535 auto FirstBase = FirstBases[i];
9536 auto SecondBase = SecondBases[i];
9537 if (ComputeQualTypeODRHash(FirstBase.getType()) !=
9538 ComputeQualTypeODRHash(SecondBase.getType())) {
9539 ODRDiagError(FirstRecord->getLocation(), FirstBase.getSourceRange(),
9540 BaseType)
9541 << (i + 1) << FirstBase.getType();
9542 ODRDiagNote(SecondRecord->getLocation(),
9543 SecondBase.getSourceRange(), BaseType)
9544 << (i + 1) << SecondBase.getType();
9545 break;
9546 }
9547
9548 if (FirstBase.isVirtual() != SecondBase.isVirtual()) {
9549 ODRDiagError(FirstRecord->getLocation(), FirstBase.getSourceRange(),
9550 BaseVirtual)
9551 << (i + 1) << FirstBase.isVirtual() << FirstBase.getType();
9552 ODRDiagNote(SecondRecord->getLocation(),
9553 SecondBase.getSourceRange(), BaseVirtual)
9554 << (i + 1) << SecondBase.isVirtual() << SecondBase.getType();
9555 break;
9556 }
9557
9558 if (FirstBase.getAccessSpecifierAsWritten() !=
9559 SecondBase.getAccessSpecifierAsWritten()) {
9560 ODRDiagError(FirstRecord->getLocation(), FirstBase.getSourceRange(),
9561 BaseAccess)
9562 << (i + 1) << FirstBase.getType()
9563 << (int)FirstBase.getAccessSpecifierAsWritten();
9564 ODRDiagNote(SecondRecord->getLocation(),
9565 SecondBase.getSourceRange(), BaseAccess)
9566 << (i + 1) << SecondBase.getType()
9567 << (int)SecondBase.getAccessSpecifierAsWritten();
9568 break;
9569 }
9570 }
9571
9572 if (i != FirstNumBases) {
9573 Diagnosed = true;
9574 break;
9575 }
9576 }
9577
9578 using DeclHashes = llvm::SmallVector<std::pair<Decl *, unsigned>, 4>;
9579
9580 const ClassTemplateDecl *FirstTemplate =
9581 FirstRecord->getDescribedClassTemplate();
9582 const ClassTemplateDecl *SecondTemplate =
9583 SecondRecord->getDescribedClassTemplate();
9584
9585 assert(!FirstTemplate == !SecondTemplate &&(static_cast <bool> (!FirstTemplate == !SecondTemplate &&
"Both pointers should be null or non-null") ? void (0) : __assert_fail
("!FirstTemplate == !SecondTemplate && \"Both pointers should be null or non-null\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 9586, __extension__ __PRETTY_FUNCTION__))
9586 "Both pointers should be null or non-null")(static_cast <bool> (!FirstTemplate == !SecondTemplate &&
"Both pointers should be null or non-null") ? void (0) : __assert_fail
("!FirstTemplate == !SecondTemplate && \"Both pointers should be null or non-null\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 9586, __extension__ __PRETTY_FUNCTION__))
;
9587
9588 enum ODRTemplateDifference {
9589 ParamEmptyName,
9590 ParamName,
9591 ParamSingleDefaultArgument,
9592 ParamDifferentDefaultArgument,
9593 };
9594
9595 if (FirstTemplate && SecondTemplate) {
9596 DeclHashes FirstTemplateHashes;
9597 DeclHashes SecondTemplateHashes;
9598
9599 auto PopulateTemplateParameterHashs =
9600 [&ComputeSubDeclODRHash](DeclHashes &Hashes,
9601 const ClassTemplateDecl *TD) {
9602 for (auto *D : TD->getTemplateParameters()->asArray()) {
9603 Hashes.emplace_back(D, ComputeSubDeclODRHash(D));
9604 }
9605 };
9606
9607 PopulateTemplateParameterHashs(FirstTemplateHashes, FirstTemplate);
9608 PopulateTemplateParameterHashs(SecondTemplateHashes, SecondTemplate);
9609
9610 assert(FirstTemplateHashes.size() == SecondTemplateHashes.size() &&(static_cast <bool> (FirstTemplateHashes.size() == SecondTemplateHashes
.size() && "Number of template parameters should be equal."
) ? void (0) : __assert_fail ("FirstTemplateHashes.size() == SecondTemplateHashes.size() && \"Number of template parameters should be equal.\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 9611, __extension__ __PRETTY_FUNCTION__))
9611 "Number of template parameters should be equal.")(static_cast <bool> (FirstTemplateHashes.size() == SecondTemplateHashes
.size() && "Number of template parameters should be equal."
) ? void (0) : __assert_fail ("FirstTemplateHashes.size() == SecondTemplateHashes.size() && \"Number of template parameters should be equal.\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 9611, __extension__ __PRETTY_FUNCTION__))
;
9612
9613 auto FirstIt = FirstTemplateHashes.begin();
9614 auto FirstEnd = FirstTemplateHashes.end();
9615 auto SecondIt = SecondTemplateHashes.begin();
9616 for (; FirstIt != FirstEnd; ++FirstIt, ++SecondIt) {
9617 if (FirstIt->second == SecondIt->second)
9618 continue;
9619
9620 auto ODRDiagError = [FirstRecord, &FirstModule,
9621 this](SourceLocation Loc, SourceRange Range,
9622 ODRTemplateDifference DiffType) {
9623 return Diag(Loc, diag::err_module_odr_violation_template_parameter)
9624 << FirstRecord << FirstModule.empty() << FirstModule << Range
9625 << DiffType;
9626 };
9627 auto ODRDiagNote = [&SecondModule,
9628 this](SourceLocation Loc, SourceRange Range,
9629 ODRTemplateDifference DiffType) {
9630 return Diag(Loc, diag::note_module_odr_violation_template_parameter)
9631 << SecondModule << Range << DiffType;
9632 };
9633
9634 const NamedDecl* FirstDecl = cast<NamedDecl>(FirstIt->first);
9635 const NamedDecl* SecondDecl = cast<NamedDecl>(SecondIt->first);
9636
9637 assert(FirstDecl->getKind() == SecondDecl->getKind() &&(static_cast <bool> (FirstDecl->getKind() == SecondDecl
->getKind() && "Parameter Decl's should be the same kind."
) ? void (0) : __assert_fail ("FirstDecl->getKind() == SecondDecl->getKind() && \"Parameter Decl's should be the same kind.\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 9638, __extension__ __PRETTY_FUNCTION__))
9638 "Parameter Decl's should be the same kind.")(static_cast <bool> (FirstDecl->getKind() == SecondDecl
->getKind() && "Parameter Decl's should be the same kind."
) ? void (0) : __assert_fail ("FirstDecl->getKind() == SecondDecl->getKind() && \"Parameter Decl's should be the same kind.\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 9638, __extension__ __PRETTY_FUNCTION__))
;
9639
9640 DeclarationName FirstName = FirstDecl->getDeclName();
9641 DeclarationName SecondName = SecondDecl->getDeclName();
9642
9643 if (FirstName != SecondName) {
9644 const bool FirstNameEmpty =
9645 FirstName.isIdentifier() && !FirstName.getAsIdentifierInfo();
9646 const bool SecondNameEmpty =
9647 SecondName.isIdentifier() && !SecondName.getAsIdentifierInfo();
9648 assert((!FirstNameEmpty || !SecondNameEmpty) &&(static_cast <bool> ((!FirstNameEmpty || !SecondNameEmpty
) && "Both template parameters cannot be unnamed.") ?
void (0) : __assert_fail ("(!FirstNameEmpty || !SecondNameEmpty) && \"Both template parameters cannot be unnamed.\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 9649, __extension__ __PRETTY_FUNCTION__))
9649 "Both template parameters cannot be unnamed.")(static_cast <bool> ((!FirstNameEmpty || !SecondNameEmpty
) && "Both template parameters cannot be unnamed.") ?
void (0) : __assert_fail ("(!FirstNameEmpty || !SecondNameEmpty) && \"Both template parameters cannot be unnamed.\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 9649, __extension__ __PRETTY_FUNCTION__))
;
9650 ODRDiagError(FirstDecl->getLocation(), FirstDecl->getSourceRange(),
9651 FirstNameEmpty ? ParamEmptyName : ParamName)
9652 << FirstName;
9653 ODRDiagNote(SecondDecl->getLocation(), SecondDecl->getSourceRange(),
9654 SecondNameEmpty ? ParamEmptyName : ParamName)
9655 << SecondName;
9656 break;
9657 }
9658
9659 switch (FirstDecl->getKind()) {
9660 default:
9661 llvm_unreachable("Invalid template parameter type.")::llvm::llvm_unreachable_internal("Invalid template parameter type."
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 9661)
;
9662 case Decl::TemplateTypeParm: {
9663 const auto *FirstParam = cast<TemplateTypeParmDecl>(FirstDecl);
9664 const auto *SecondParam = cast<TemplateTypeParmDecl>(SecondDecl);
9665 const bool HasFirstDefaultArgument =
9666 FirstParam->hasDefaultArgument() &&
9667 !FirstParam->defaultArgumentWasInherited();
9668 const bool HasSecondDefaultArgument =
9669 SecondParam->hasDefaultArgument() &&
9670 !SecondParam->defaultArgumentWasInherited();
9671
9672 if (HasFirstDefaultArgument != HasSecondDefaultArgument) {
9673 ODRDiagError(FirstDecl->getLocation(),
9674 FirstDecl->getSourceRange(),
9675 ParamSingleDefaultArgument)
9676 << HasFirstDefaultArgument;
9677 ODRDiagNote(SecondDecl->getLocation(),
9678 SecondDecl->getSourceRange(),
9679 ParamSingleDefaultArgument)
9680 << HasSecondDefaultArgument;
9681 break;
9682 }
9683
9684 assert(HasFirstDefaultArgument && HasSecondDefaultArgument &&(static_cast <bool> (HasFirstDefaultArgument &&
HasSecondDefaultArgument && "Expecting default arguments."
) ? void (0) : __assert_fail ("HasFirstDefaultArgument && HasSecondDefaultArgument && \"Expecting default arguments.\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 9685, __extension__ __PRETTY_FUNCTION__))
9685 "Expecting default arguments.")(static_cast <bool> (HasFirstDefaultArgument &&
HasSecondDefaultArgument && "Expecting default arguments."
) ? void (0) : __assert_fail ("HasFirstDefaultArgument && HasSecondDefaultArgument && \"Expecting default arguments.\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 9685, __extension__ __PRETTY_FUNCTION__))
;
9686
9687 ODRDiagError(FirstDecl->getLocation(), FirstDecl->getSourceRange(),
9688 ParamDifferentDefaultArgument);
9689 ODRDiagNote(SecondDecl->getLocation(), SecondDecl->getSourceRange(),
9690 ParamDifferentDefaultArgument);
9691
9692 break;
9693 }
9694 case Decl::NonTypeTemplateParm: {
9695 const auto *FirstParam = cast<NonTypeTemplateParmDecl>(FirstDecl);
9696 const auto *SecondParam = cast<NonTypeTemplateParmDecl>(SecondDecl);
9697 const bool HasFirstDefaultArgument =
9698 FirstParam->hasDefaultArgument() &&
9699 !FirstParam->defaultArgumentWasInherited();
9700 const bool HasSecondDefaultArgument =
9701 SecondParam->hasDefaultArgument() &&
9702 !SecondParam->defaultArgumentWasInherited();
9703
9704 if (HasFirstDefaultArgument != HasSecondDefaultArgument) {
9705 ODRDiagError(FirstDecl->getLocation(),
9706 FirstDecl->getSourceRange(),
9707 ParamSingleDefaultArgument)
9708 << HasFirstDefaultArgument;
9709 ODRDiagNote(SecondDecl->getLocation(),
9710 SecondDecl->getSourceRange(),
9711 ParamSingleDefaultArgument)
9712 << HasSecondDefaultArgument;
9713 break;
9714 }
9715
9716 assert(HasFirstDefaultArgument && HasSecondDefaultArgument &&(static_cast <bool> (HasFirstDefaultArgument &&
HasSecondDefaultArgument && "Expecting default arguments."
) ? void (0) : __assert_fail ("HasFirstDefaultArgument && HasSecondDefaultArgument && \"Expecting default arguments.\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 9717, __extension__ __PRETTY_FUNCTION__))
9717 "Expecting default arguments.")(static_cast <bool> (HasFirstDefaultArgument &&
HasSecondDefaultArgument && "Expecting default arguments."
) ? void (0) : __assert_fail ("HasFirstDefaultArgument && HasSecondDefaultArgument && \"Expecting default arguments.\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 9717, __extension__ __PRETTY_FUNCTION__))
;
9718
9719 ODRDiagError(FirstDecl->getLocation(), FirstDecl->getSourceRange(),
9720 ParamDifferentDefaultArgument);
9721 ODRDiagNote(SecondDecl->getLocation(), SecondDecl->getSourceRange(),
9722 ParamDifferentDefaultArgument);
9723
9724 break;
9725 }
9726 case Decl::TemplateTemplateParm: {
9727 const auto *FirstParam = cast<TemplateTemplateParmDecl>(FirstDecl);
9728 const auto *SecondParam =
9729 cast<TemplateTemplateParmDecl>(SecondDecl);
9730 const bool HasFirstDefaultArgument =
9731 FirstParam->hasDefaultArgument() &&
9732 !FirstParam->defaultArgumentWasInherited();
9733 const bool HasSecondDefaultArgument =
9734 SecondParam->hasDefaultArgument() &&
9735 !SecondParam->defaultArgumentWasInherited();
9736
9737 if (HasFirstDefaultArgument != HasSecondDefaultArgument) {
9738 ODRDiagError(FirstDecl->getLocation(),
9739 FirstDecl->getSourceRange(),
9740 ParamSingleDefaultArgument)
9741 << HasFirstDefaultArgument;
9742 ODRDiagNote(SecondDecl->getLocation(),
9743 SecondDecl->getSourceRange(),
9744 ParamSingleDefaultArgument)
9745 << HasSecondDefaultArgument;
9746 break;
9747 }
9748
9749 assert(HasFirstDefaultArgument && HasSecondDefaultArgument &&(static_cast <bool> (HasFirstDefaultArgument &&
HasSecondDefaultArgument && "Expecting default arguments."
) ? void (0) : __assert_fail ("HasFirstDefaultArgument && HasSecondDefaultArgument && \"Expecting default arguments.\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 9750, __extension__ __PRETTY_FUNCTION__))
9750 "Expecting default arguments.")(static_cast <bool> (HasFirstDefaultArgument &&
HasSecondDefaultArgument && "Expecting default arguments."
) ? void (0) : __assert_fail ("HasFirstDefaultArgument && HasSecondDefaultArgument && \"Expecting default arguments.\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 9750, __extension__ __PRETTY_FUNCTION__))
;
9751
9752 ODRDiagError(FirstDecl->getLocation(), FirstDecl->getSourceRange(),
9753 ParamDifferentDefaultArgument);
9754 ODRDiagNote(SecondDecl->getLocation(), SecondDecl->getSourceRange(),
9755 ParamDifferentDefaultArgument);
9756
9757 break;
9758 }
9759 }
9760
9761 break;
9762 }
9763
9764 if (FirstIt != FirstEnd) {
9765 Diagnosed = true;
9766 break;
9767 }
9768 }
9769
9770 DeclHashes FirstHashes;
9771 DeclHashes SecondHashes;
9772
9773 auto PopulateHashes = [&ComputeSubDeclODRHash, FirstRecord](
9774 DeclHashes &Hashes, CXXRecordDecl *Record) {
9775 for (auto *D : Record->decls()) {
9776 // Due to decl merging, the first CXXRecordDecl is the parent of
9777 // Decls in both records.
9778 if (!ODRHash::isWhitelistedDecl(D, FirstRecord))
9779 continue;
9780 Hashes.emplace_back(D, ComputeSubDeclODRHash(D));
9781 }
9782 };
9783 PopulateHashes(FirstHashes, FirstRecord);
9784 PopulateHashes(SecondHashes, SecondRecord);
9785
9786 // Used with err_module_odr_violation_mismatch_decl and
9787 // note_module_odr_violation_mismatch_decl
9788 // This list should be the same Decl's as in ODRHash::isWhiteListedDecl
9789 enum {
9790 EndOfClass,
9791 PublicSpecifer,
9792 PrivateSpecifer,
9793 ProtectedSpecifer,
9794 StaticAssert,
9795 Field,
9796 CXXMethod,
9797 TypeAlias,
9798 TypeDef,
9799 Var,
9800 Friend,
9801 Other
9802 } FirstDiffType = Other,
9803 SecondDiffType = Other;
9804
9805 auto DifferenceSelector = [](Decl *D) {
9806 assert(D && "valid Decl required")(static_cast <bool> (D && "valid Decl required"
) ? void (0) : __assert_fail ("D && \"valid Decl required\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 9806, __extension__ __PRETTY_FUNCTION__))
;
9807 switch (D->getKind()) {
9808 default:
9809 return Other;
9810 case Decl::AccessSpec:
9811 switch (D->getAccess()) {
9812 case AS_public:
9813 return PublicSpecifer;
9814 case AS_private:
9815 return PrivateSpecifer;
9816 case AS_protected:
9817 return ProtectedSpecifer;
9818 case AS_none:
9819 break;
9820 }
9821 llvm_unreachable("Invalid access specifier")::llvm::llvm_unreachable_internal("Invalid access specifier",
"/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 9821)
;
9822 case Decl::StaticAssert:
9823 return StaticAssert;
9824 case Decl::Field:
9825 return Field;
9826 case Decl::CXXMethod:
9827 case Decl::CXXConstructor:
9828 case Decl::CXXDestructor:
9829 return CXXMethod;
9830 case Decl::TypeAlias:
9831 return TypeAlias;
9832 case Decl::Typedef:
9833 return TypeDef;
9834 case Decl::Var:
9835 return Var;
9836 case Decl::Friend:
9837 return Friend;
9838 }
9839 };
9840
9841 Decl *FirstDecl = nullptr;
9842 Decl *SecondDecl = nullptr;
9843 auto FirstIt = FirstHashes.begin();
9844 auto SecondIt = SecondHashes.begin();
9845
9846 // If there is a diagnoseable difference, FirstDiffType and
9847 // SecondDiffType will not be Other and FirstDecl and SecondDecl will be
9848 // filled in if not EndOfClass.
9849 while (FirstIt != FirstHashes.end() || SecondIt != SecondHashes.end()) {
9850 if (FirstIt != FirstHashes.end() && SecondIt != SecondHashes.end() &&
9851 FirstIt->second == SecondIt->second) {
9852 ++FirstIt;
9853 ++SecondIt;
9854 continue;
9855 }
9856
9857 FirstDecl = FirstIt == FirstHashes.end() ? nullptr : FirstIt->first;
9858 SecondDecl = SecondIt == SecondHashes.end() ? nullptr : SecondIt->first;
9859
9860 FirstDiffType = FirstDecl ? DifferenceSelector(FirstDecl) : EndOfClass;
9861 SecondDiffType =
9862 SecondDecl ? DifferenceSelector(SecondDecl) : EndOfClass;
9863
9864 break;
9865 }
9866
9867 if (FirstDiffType == Other || SecondDiffType == Other) {
9868 // Reaching this point means an unexpected Decl was encountered
9869 // or no difference was detected. This causes a generic error
9870 // message to be emitted.
9871 Diag(FirstRecord->getLocation(),
9872 diag::err_module_odr_violation_different_definitions)
9873 << FirstRecord << FirstModule.empty() << FirstModule;
9874
9875 if (FirstDecl) {
9876 Diag(FirstDecl->getLocation(), diag::note_first_module_difference)
9877 << FirstRecord << FirstDecl->getSourceRange();
9878 }
9879
9880 Diag(SecondRecord->getLocation(),
9881 diag::note_module_odr_violation_different_definitions)
9882 << SecondModule;
9883
9884 if (SecondDecl) {
9885 Diag(SecondDecl->getLocation(), diag::note_second_module_difference)
9886 << SecondDecl->getSourceRange();
9887 }
9888
9889 Diagnosed = true;
9890 break;
9891 }
9892
9893 if (FirstDiffType != SecondDiffType) {
9894 SourceLocation FirstLoc;
9895 SourceRange FirstRange;
9896 if (FirstDiffType == EndOfClass) {
9897 FirstLoc = FirstRecord->getBraceRange().getEnd();
9898 } else {
9899 FirstLoc = FirstIt->first->getLocation();
9900 FirstRange = FirstIt->first->getSourceRange();
9901 }
9902 Diag(FirstLoc, diag::err_module_odr_violation_mismatch_decl)
9903 << FirstRecord << FirstModule.empty() << FirstModule << FirstRange
9904 << FirstDiffType;
9905
9906 SourceLocation SecondLoc;
9907 SourceRange SecondRange;
9908 if (SecondDiffType == EndOfClass) {
9909 SecondLoc = SecondRecord->getBraceRange().getEnd();
9910 } else {
9911 SecondLoc = SecondDecl->getLocation();
9912 SecondRange = SecondDecl->getSourceRange();
9913 }
9914 Diag(SecondLoc, diag::note_module_odr_violation_mismatch_decl)
9915 << SecondModule << SecondRange << SecondDiffType;
9916 Diagnosed = true;
9917 break;
9918 }
9919
9920 assert(FirstDiffType == SecondDiffType)(static_cast <bool> (FirstDiffType == SecondDiffType) ?
void (0) : __assert_fail ("FirstDiffType == SecondDiffType",
"/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 9920, __extension__ __PRETTY_FUNCTION__))
;
9921
9922 // Used with err_module_odr_violation_mismatch_decl_diff and
9923 // note_module_odr_violation_mismatch_decl_diff
9924 enum ODRDeclDifference{
9925 StaticAssertCondition,
9926 StaticAssertMessage,
9927 StaticAssertOnlyMessage,
9928 FieldName,
9929 FieldTypeName,
9930 FieldSingleBitField,
9931 FieldDifferentWidthBitField,
9932 FieldSingleMutable,
9933 FieldSingleInitializer,
9934 FieldDifferentInitializers,
9935 MethodName,
9936 MethodDeleted,
9937 MethodVirtual,
9938 MethodStatic,
9939 MethodVolatile,
9940 MethodConst,
9941 MethodInline,
9942 MethodNumberParameters,
9943 MethodParameterType,
9944 MethodParameterName,
9945 MethodParameterSingleDefaultArgument,
9946 MethodParameterDifferentDefaultArgument,
9947 TypedefName,
9948 TypedefType,
9949 VarName,
9950 VarType,
9951 VarSingleInitializer,
9952 VarDifferentInitializer,
9953 VarConstexpr,
9954 FriendTypeFunction,
9955 FriendType,
9956 FriendFunction,
9957 };
9958
9959 // These lambdas have the common portions of the ODR diagnostics. This
9960 // has the same return as Diag(), so addition parameters can be passed
9961 // in with operator<<
9962 auto ODRDiagError = [FirstRecord, &FirstModule, this](
9963 SourceLocation Loc, SourceRange Range, ODRDeclDifference DiffType) {
9964 return Diag(Loc, diag::err_module_odr_violation_mismatch_decl_diff)
9965 << FirstRecord << FirstModule.empty() << FirstModule << Range
9966 << DiffType;
9967 };
9968 auto ODRDiagNote = [&SecondModule, this](
9969 SourceLocation Loc, SourceRange Range, ODRDeclDifference DiffType) {
9970 return Diag(Loc, diag::note_module_odr_violation_mismatch_decl_diff)
9971 << SecondModule << Range << DiffType;
9972 };
9973
9974 switch (FirstDiffType) {
9975 case Other:
9976 case EndOfClass:
9977 case PublicSpecifer:
9978 case PrivateSpecifer:
9979 case ProtectedSpecifer:
9980 llvm_unreachable("Invalid diff type")::llvm::llvm_unreachable_internal("Invalid diff type", "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 9980)
;
9981
9982 case StaticAssert: {
9983 StaticAssertDecl *FirstSA = cast<StaticAssertDecl>(FirstDecl);
9984 StaticAssertDecl *SecondSA = cast<StaticAssertDecl>(SecondDecl);
9985
9986 Expr *FirstExpr = FirstSA->getAssertExpr();
9987 Expr *SecondExpr = SecondSA->getAssertExpr();
9988 unsigned FirstODRHash = ComputeODRHash(FirstExpr);
9989 unsigned SecondODRHash = ComputeODRHash(SecondExpr);
9990 if (FirstODRHash != SecondODRHash) {
9991 ODRDiagError(FirstExpr->getLocStart(), FirstExpr->getSourceRange(),
9992 StaticAssertCondition);
9993 ODRDiagNote(SecondExpr->getLocStart(),
9994 SecondExpr->getSourceRange(), StaticAssertCondition);
9995 Diagnosed = true;
9996 break;
9997 }
9998
9999 StringLiteral *FirstStr = FirstSA->getMessage();
10000 StringLiteral *SecondStr = SecondSA->getMessage();
10001 assert((FirstStr || SecondStr) && "Both messages cannot be empty")(static_cast <bool> ((FirstStr || SecondStr) &&
"Both messages cannot be empty") ? void (0) : __assert_fail (
"(FirstStr || SecondStr) && \"Both messages cannot be empty\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 10001, __extension__ __PRETTY_FUNCTION__))
;
10002 if ((FirstStr && !SecondStr) || (!FirstStr && SecondStr)) {
10003 SourceLocation FirstLoc, SecondLoc;
10004 SourceRange FirstRange, SecondRange;
10005 if (FirstStr) {
10006 FirstLoc = FirstStr->getLocStart();
10007 FirstRange = FirstStr->getSourceRange();
10008 } else {
10009 FirstLoc = FirstSA->getLocStart();
10010 FirstRange = FirstSA->getSourceRange();
10011 }
10012 if (SecondStr) {
10013 SecondLoc = SecondStr->getLocStart();
10014 SecondRange = SecondStr->getSourceRange();
10015 } else {
10016 SecondLoc = SecondSA->getLocStart();
10017 SecondRange = SecondSA->getSourceRange();
10018 }
10019 ODRDiagError(FirstLoc, FirstRange, StaticAssertOnlyMessage)
10020 << (FirstStr == nullptr);
10021 ODRDiagNote(SecondLoc, SecondRange, StaticAssertOnlyMessage)
10022 << (SecondStr == nullptr);
10023 Diagnosed = true;
10024 break;
10025 }
10026
10027 if (FirstStr && SecondStr &&
10028 FirstStr->getString() != SecondStr->getString()) {
10029 ODRDiagError(FirstStr->getLocStart(), FirstStr->getSourceRange(),
10030 StaticAssertMessage);
10031 ODRDiagNote(SecondStr->getLocStart(), SecondStr->getSourceRange(),
10032 StaticAssertMessage);
10033 Diagnosed = true;
10034 break;
10035 }
10036 break;
10037 }
10038 case Field: {
10039 FieldDecl *FirstField = cast<FieldDecl>(FirstDecl);
10040 FieldDecl *SecondField = cast<FieldDecl>(SecondDecl);
10041 IdentifierInfo *FirstII = FirstField->getIdentifier();
10042 IdentifierInfo *SecondII = SecondField->getIdentifier();
10043 if (FirstII->getName() != SecondII->getName()) {
10044 ODRDiagError(FirstField->getLocation(), FirstField->getSourceRange(),
10045 FieldName)
10046 << FirstII;
10047 ODRDiagNote(SecondField->getLocation(), SecondField->getSourceRange(),
10048 FieldName)
10049 << SecondII;
10050
10051 Diagnosed = true;
10052 break;
10053 }
10054
10055 assert(getContext().hasSameType(FirstField->getType(),(static_cast <bool> (getContext().hasSameType(FirstField
->getType(), SecondField->getType())) ? void (0) : __assert_fail
("getContext().hasSameType(FirstField->getType(), SecondField->getType())"
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 10056, __extension__ __PRETTY_FUNCTION__))
10056 SecondField->getType()))(static_cast <bool> (getContext().hasSameType(FirstField
->getType(), SecondField->getType())) ? void (0) : __assert_fail
("getContext().hasSameType(FirstField->getType(), SecondField->getType())"
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 10056, __extension__ __PRETTY_FUNCTION__))
;
10057
10058 QualType FirstType = FirstField->getType();
10059 QualType SecondType = SecondField->getType();
10060 if (ComputeQualTypeODRHash(FirstType) !=
10061 ComputeQualTypeODRHash(SecondType)) {
10062 ODRDiagError(FirstField->getLocation(), FirstField->getSourceRange(),
10063 FieldTypeName)
10064 << FirstII << FirstType;
10065 ODRDiagNote(SecondField->getLocation(), SecondField->getSourceRange(),
10066 FieldTypeName)
10067 << SecondII << SecondType;
10068
10069 Diagnosed = true;
10070 break;
10071 }
10072
10073 const bool IsFirstBitField = FirstField->isBitField();
10074 const bool IsSecondBitField = SecondField->isBitField();
10075 if (IsFirstBitField != IsSecondBitField) {
10076 ODRDiagError(FirstField->getLocation(), FirstField->getSourceRange(),
10077 FieldSingleBitField)
10078 << FirstII << IsFirstBitField;
10079 ODRDiagNote(SecondField->getLocation(), SecondField->getSourceRange(),
10080 FieldSingleBitField)
10081 << SecondII << IsSecondBitField;
10082 Diagnosed = true;
10083 break;
10084 }
10085
10086 if (IsFirstBitField && IsSecondBitField) {
10087 ODRDiagError(FirstField->getLocation(), FirstField->getSourceRange(),
10088 FieldDifferentWidthBitField)
10089 << FirstII << FirstField->getBitWidth()->getSourceRange();
10090 ODRDiagNote(SecondField->getLocation(), SecondField->getSourceRange(),
10091 FieldDifferentWidthBitField)
10092 << SecondII << SecondField->getBitWidth()->getSourceRange();
10093 Diagnosed = true;
10094 break;
10095 }
10096
10097 const bool IsFirstMutable = FirstField->isMutable();
10098 const bool IsSecondMutable = SecondField->isMutable();
10099 if (IsFirstMutable != IsSecondMutable) {
10100 ODRDiagError(FirstField->getLocation(), FirstField->getSourceRange(),
10101 FieldSingleMutable)
10102 << FirstII << IsFirstMutable;
10103 ODRDiagNote(SecondField->getLocation(), SecondField->getSourceRange(),
10104 FieldSingleMutable)
10105 << SecondII << IsSecondMutable;
10106 Diagnosed = true;
10107 break;
10108 }
10109
10110 const Expr *FirstInitializer = FirstField->getInClassInitializer();
10111 const Expr *SecondInitializer = SecondField->getInClassInitializer();
10112 if ((!FirstInitializer && SecondInitializer) ||
10113 (FirstInitializer && !SecondInitializer)) {
10114 ODRDiagError(FirstField->getLocation(), FirstField->getSourceRange(),
10115 FieldSingleInitializer)
10116 << FirstII << (FirstInitializer != nullptr);
10117 ODRDiagNote(SecondField->getLocation(), SecondField->getSourceRange(),
10118 FieldSingleInitializer)
10119 << SecondII << (SecondInitializer != nullptr);
10120 Diagnosed = true;
10121 break;
10122 }
10123
10124 if (FirstInitializer && SecondInitializer) {
10125 unsigned FirstInitHash = ComputeODRHash(FirstInitializer);
10126 unsigned SecondInitHash = ComputeODRHash(SecondInitializer);
10127 if (FirstInitHash != SecondInitHash) {
10128 ODRDiagError(FirstField->getLocation(),
10129 FirstField->getSourceRange(),
10130 FieldDifferentInitializers)
10131 << FirstII << FirstInitializer->getSourceRange();
10132 ODRDiagNote(SecondField->getLocation(),
10133 SecondField->getSourceRange(),
10134 FieldDifferentInitializers)
10135 << SecondII << SecondInitializer->getSourceRange();
10136 Diagnosed = true;
10137 break;
10138 }
10139 }
10140
10141 break;
10142 }
10143 case CXXMethod: {
10144 enum {
10145 DiagMethod,
10146 DiagConstructor,
10147 DiagDestructor,
10148 } FirstMethodType,
10149 SecondMethodType;
10150 auto GetMethodTypeForDiagnostics = [](const CXXMethodDecl* D) {
10151 if (isa<CXXConstructorDecl>(D)) return DiagConstructor;
10152 if (isa<CXXDestructorDecl>(D)) return DiagDestructor;
10153 return DiagMethod;
10154 };
10155 const CXXMethodDecl *FirstMethod = cast<CXXMethodDecl>(FirstDecl);
10156 const CXXMethodDecl *SecondMethod = cast<CXXMethodDecl>(SecondDecl);
10157 FirstMethodType = GetMethodTypeForDiagnostics(FirstMethod);
10158 SecondMethodType = GetMethodTypeForDiagnostics(SecondMethod);
10159 auto FirstName = FirstMethod->getDeclName();
10160 auto SecondName = SecondMethod->getDeclName();
10161 if (FirstMethodType != SecondMethodType || FirstName != SecondName) {
10162 ODRDiagError(FirstMethod->getLocation(),
10163 FirstMethod->getSourceRange(), MethodName)
10164 << FirstMethodType << FirstName;
10165 ODRDiagNote(SecondMethod->getLocation(),
10166 SecondMethod->getSourceRange(), MethodName)
10167 << SecondMethodType << SecondName;
10168
10169 Diagnosed = true;
10170 break;
10171 }
10172
10173 const bool FirstDeleted = FirstMethod->isDeleted();
10174 const bool SecondDeleted = SecondMethod->isDeleted();
10175 if (FirstDeleted != SecondDeleted) {
10176 ODRDiagError(FirstMethod->getLocation(),
10177 FirstMethod->getSourceRange(), MethodDeleted)
10178 << FirstMethodType << FirstName << FirstDeleted;
10179
10180 ODRDiagNote(SecondMethod->getLocation(),
10181 SecondMethod->getSourceRange(), MethodDeleted)
10182 << SecondMethodType << SecondName << SecondDeleted;
10183 Diagnosed = true;
10184 break;
10185 }
10186
10187 const bool FirstVirtual = FirstMethod->isVirtualAsWritten();
10188 const bool SecondVirtual = SecondMethod->isVirtualAsWritten();
10189 const bool FirstPure = FirstMethod->isPure();
10190 const bool SecondPure = SecondMethod->isPure();
10191 if ((FirstVirtual || SecondVirtual) &&
10192 (FirstVirtual != SecondVirtual || FirstPure != SecondPure)) {
10193 ODRDiagError(FirstMethod->getLocation(),
10194 FirstMethod->getSourceRange(), MethodVirtual)
10195 << FirstMethodType << FirstName << FirstPure << FirstVirtual;
10196 ODRDiagNote(SecondMethod->getLocation(),
10197 SecondMethod->getSourceRange(), MethodVirtual)
10198 << SecondMethodType << SecondName << SecondPure << SecondVirtual;
10199 Diagnosed = true;
10200 break;
10201 }
10202
10203 // CXXMethodDecl::isStatic uses the canonical Decl. With Decl merging,
10204 // FirstDecl is the canonical Decl of SecondDecl, so the storage
10205 // class needs to be checked instead.
10206 const auto FirstStorage = FirstMethod->getStorageClass();
10207 const auto SecondStorage = SecondMethod->getStorageClass();
10208 const bool FirstStatic = FirstStorage == SC_Static;
10209 const bool SecondStatic = SecondStorage == SC_Static;
10210 if (FirstStatic != SecondStatic) {
10211 ODRDiagError(FirstMethod->getLocation(),
10212 FirstMethod->getSourceRange(), MethodStatic)
10213 << FirstMethodType << FirstName << FirstStatic;
10214 ODRDiagNote(SecondMethod->getLocation(),
10215 SecondMethod->getSourceRange(), MethodStatic)
10216 << SecondMethodType << SecondName << SecondStatic;
10217 Diagnosed = true;
10218 break;
10219 }
10220
10221 const bool FirstVolatile = FirstMethod->isVolatile();
10222 const bool SecondVolatile = SecondMethod->isVolatile();
10223 if (FirstVolatile != SecondVolatile) {
10224 ODRDiagError(FirstMethod->getLocation(),
10225 FirstMethod->getSourceRange(), MethodVolatile)
10226 << FirstMethodType << FirstName << FirstVolatile;
10227 ODRDiagNote(SecondMethod->getLocation(),
10228 SecondMethod->getSourceRange(), MethodVolatile)
10229 << SecondMethodType << SecondName << SecondVolatile;
10230 Diagnosed = true;
10231 break;
10232 }
10233
10234 const bool FirstConst = FirstMethod->isConst();
10235 const bool SecondConst = SecondMethod->isConst();
10236 if (FirstConst != SecondConst) {
10237 ODRDiagError(FirstMethod->getLocation(),
10238 FirstMethod->getSourceRange(), MethodConst)
10239 << FirstMethodType << FirstName << FirstConst;
10240 ODRDiagNote(SecondMethod->getLocation(),
10241 SecondMethod->getSourceRange(), MethodConst)
10242 << SecondMethodType << SecondName << SecondConst;
10243 Diagnosed = true;
10244 break;
10245 }
10246
10247 const bool FirstInline = FirstMethod->isInlineSpecified();
10248 const bool SecondInline = SecondMethod->isInlineSpecified();
10249 if (FirstInline != SecondInline) {
10250 ODRDiagError(FirstMethod->getLocation(),
10251 FirstMethod->getSourceRange(), MethodInline)
10252 << FirstMethodType << FirstName << FirstInline;
10253 ODRDiagNote(SecondMethod->getLocation(),
10254 SecondMethod->getSourceRange(), MethodInline)
10255 << SecondMethodType << SecondName << SecondInline;
10256 Diagnosed = true;
10257 break;
10258 }
10259
10260 const unsigned FirstNumParameters = FirstMethod->param_size();
10261 const unsigned SecondNumParameters = SecondMethod->param_size();
10262 if (FirstNumParameters != SecondNumParameters) {
10263 ODRDiagError(FirstMethod->getLocation(),
10264 FirstMethod->getSourceRange(), MethodNumberParameters)
10265 << FirstMethodType << FirstName << FirstNumParameters;
10266 ODRDiagNote(SecondMethod->getLocation(),
10267 SecondMethod->getSourceRange(), MethodNumberParameters)
10268 << SecondMethodType << SecondName << SecondNumParameters;
10269 Diagnosed = true;
10270 break;
10271 }
10272
10273 // Need this status boolean to know when break out of the switch.
10274 bool ParameterMismatch = false;
10275 for (unsigned I = 0; I < FirstNumParameters; ++I) {
10276 const ParmVarDecl *FirstParam = FirstMethod->getParamDecl(I);
10277 const ParmVarDecl *SecondParam = SecondMethod->getParamDecl(I);
10278
10279 QualType FirstParamType = FirstParam->getType();
10280 QualType SecondParamType = SecondParam->getType();
10281 if (FirstParamType != SecondParamType &&
10282 ComputeQualTypeODRHash(FirstParamType) !=
10283 ComputeQualTypeODRHash(SecondParamType)) {
10284 if (const DecayedType *ParamDecayedType =
10285 FirstParamType->getAs<DecayedType>()) {
10286 ODRDiagError(FirstMethod->getLocation(),
10287 FirstMethod->getSourceRange(), MethodParameterType)
10288 << FirstMethodType << FirstName << (I + 1) << FirstParamType
10289 << true << ParamDecayedType->getOriginalType();
10290 } else {
10291 ODRDiagError(FirstMethod->getLocation(),
10292 FirstMethod->getSourceRange(), MethodParameterType)
10293 << FirstMethodType << FirstName << (I + 1) << FirstParamType
10294 << false;
10295 }
10296
10297 if (const DecayedType *ParamDecayedType =
10298 SecondParamType->getAs<DecayedType>()) {
10299 ODRDiagNote(SecondMethod->getLocation(),
10300 SecondMethod->getSourceRange(), MethodParameterType)
10301 << SecondMethodType << SecondName << (I + 1)
10302 << SecondParamType << true
10303 << ParamDecayedType->getOriginalType();
10304 } else {
10305 ODRDiagNote(SecondMethod->getLocation(),
10306 SecondMethod->getSourceRange(), MethodParameterType)
10307 << SecondMethodType << SecondName << (I + 1)
10308 << SecondParamType << false;
10309 }
10310 ParameterMismatch = true;
10311 break;
10312 }
10313
10314 DeclarationName FirstParamName = FirstParam->getDeclName();
10315 DeclarationName SecondParamName = SecondParam->getDeclName();
10316 if (FirstParamName != SecondParamName) {
10317 ODRDiagError(FirstMethod->getLocation(),
10318 FirstMethod->getSourceRange(), MethodParameterName)
10319 << FirstMethodType << FirstName << (I + 1) << FirstParamName;
10320 ODRDiagNote(SecondMethod->getLocation(),
10321 SecondMethod->getSourceRange(), MethodParameterName)
10322 << SecondMethodType << SecondName << (I + 1) << SecondParamName;
10323 ParameterMismatch = true;
10324 break;
10325 }
10326
10327 const Expr *FirstInit = FirstParam->getInit();
10328 const Expr *SecondInit = SecondParam->getInit();
10329 if ((FirstInit == nullptr) != (SecondInit == nullptr)) {
10330 ODRDiagError(FirstMethod->getLocation(),
10331 FirstMethod->getSourceRange(),
10332 MethodParameterSingleDefaultArgument)
10333 << FirstMethodType << FirstName << (I + 1)
10334 << (FirstInit == nullptr)
10335 << (FirstInit ? FirstInit->getSourceRange() : SourceRange());
10336 ODRDiagNote(SecondMethod->getLocation(),
10337 SecondMethod->getSourceRange(),
10338 MethodParameterSingleDefaultArgument)
10339 << SecondMethodType << SecondName << (I + 1)
10340 << (SecondInit == nullptr)
10341 << (SecondInit ? SecondInit->getSourceRange() : SourceRange());
10342 ParameterMismatch = true;
10343 break;
10344 }
10345
10346 if (FirstInit && SecondInit &&
10347 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) {
10348 ODRDiagError(FirstMethod->getLocation(),
10349 FirstMethod->getSourceRange(),
10350 MethodParameterDifferentDefaultArgument)
10351 << FirstMethodType << FirstName << (I + 1)
10352 << FirstInit->getSourceRange();
10353 ODRDiagNote(SecondMethod->getLocation(),
10354 SecondMethod->getSourceRange(),
10355 MethodParameterDifferentDefaultArgument)
10356 << SecondMethodType << SecondName << (I + 1)
10357 << SecondInit->getSourceRange();
10358 ParameterMismatch = true;
10359 break;
10360
10361 }
10362 }
10363
10364 if (ParameterMismatch) {
10365 Diagnosed = true;
10366 break;
10367 }
10368
10369 break;
10370 }
10371 case TypeAlias:
10372 case TypeDef: {
10373 TypedefNameDecl *FirstTD = cast<TypedefNameDecl>(FirstDecl);
10374 TypedefNameDecl *SecondTD = cast<TypedefNameDecl>(SecondDecl);
10375 auto FirstName = FirstTD->getDeclName();
10376 auto SecondName = SecondTD->getDeclName();
10377 if (FirstName != SecondName) {
10378 ODRDiagError(FirstTD->getLocation(), FirstTD->getSourceRange(),
10379 TypedefName)
10380 << (FirstDiffType == TypeAlias) << FirstName;
10381 ODRDiagNote(SecondTD->getLocation(), SecondTD->getSourceRange(),
10382 TypedefName)
10383 << (FirstDiffType == TypeAlias) << SecondName;
10384 Diagnosed = true;
10385 break;
10386 }
10387
10388 QualType FirstType = FirstTD->getUnderlyingType();
10389 QualType SecondType = SecondTD->getUnderlyingType();
10390 if (ComputeQualTypeODRHash(FirstType) !=
10391 ComputeQualTypeODRHash(SecondType)) {
10392 ODRDiagError(FirstTD->getLocation(), FirstTD->getSourceRange(),
10393 TypedefType)
10394 << (FirstDiffType == TypeAlias) << FirstName << FirstType;
10395 ODRDiagNote(SecondTD->getLocation(), SecondTD->getSourceRange(),
10396 TypedefType)
10397 << (FirstDiffType == TypeAlias) << SecondName << SecondType;
10398 Diagnosed = true;
10399 break;
10400 }
10401 break;
10402 }
10403 case Var: {
10404 VarDecl *FirstVD = cast<VarDecl>(FirstDecl);
10405 VarDecl *SecondVD = cast<VarDecl>(SecondDecl);
10406 auto FirstName = FirstVD->getDeclName();
10407 auto SecondName = SecondVD->getDeclName();
10408 if (FirstName != SecondName) {
10409 ODRDiagError(FirstVD->getLocation(), FirstVD->getSourceRange(),
10410 VarName)
10411 << FirstName;
10412 ODRDiagNote(SecondVD->getLocation(), SecondVD->getSourceRange(),
10413 VarName)
10414 << SecondName;
10415 Diagnosed = true;
10416 break;
10417 }
10418
10419 QualType FirstType = FirstVD->getType();
10420 QualType SecondType = SecondVD->getType();
10421 if (ComputeQualTypeODRHash(FirstType) !=
10422 ComputeQualTypeODRHash(SecondType)) {
10423 ODRDiagError(FirstVD->getLocation(), FirstVD->getSourceRange(),
10424 VarType)
10425 << FirstName << FirstType;
10426 ODRDiagNote(SecondVD->getLocation(), SecondVD->getSourceRange(),
10427 VarType)
10428 << SecondName << SecondType;
10429 Diagnosed = true;
10430 break;
10431 }
10432
10433 const Expr *FirstInit = FirstVD->getInit();
10434 const Expr *SecondInit = SecondVD->getInit();
10435 if ((FirstInit == nullptr) != (SecondInit == nullptr)) {
10436 ODRDiagError(FirstVD->getLocation(), FirstVD->getSourceRange(),
10437 VarSingleInitializer)
10438 << FirstName << (FirstInit == nullptr)
10439 << (FirstInit ? FirstInit->getSourceRange(): SourceRange());
10440 ODRDiagNote(SecondVD->getLocation(), SecondVD->getSourceRange(),
10441 VarSingleInitializer)
10442 << SecondName << (SecondInit == nullptr)
10443 << (SecondInit ? SecondInit->getSourceRange() : SourceRange());
10444 Diagnosed = true;
10445 break;
10446 }
10447
10448 if (FirstInit && SecondInit &&
10449 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) {
10450 ODRDiagError(FirstVD->getLocation(), FirstVD->getSourceRange(),
10451 VarDifferentInitializer)
10452 << FirstName << FirstInit->getSourceRange();
10453 ODRDiagNote(SecondVD->getLocation(), SecondVD->getSourceRange(),
10454 VarDifferentInitializer)
10455 << SecondName << SecondInit->getSourceRange();
10456 Diagnosed = true;
10457 break;
10458 }
10459
10460 const bool FirstIsConstexpr = FirstVD->isConstexpr();
10461 const bool SecondIsConstexpr = SecondVD->isConstexpr();
10462 if (FirstIsConstexpr != SecondIsConstexpr) {
10463 ODRDiagError(FirstVD->getLocation(), FirstVD->getSourceRange(),
10464 VarConstexpr)
10465 << FirstName << FirstIsConstexpr;
10466 ODRDiagNote(SecondVD->getLocation(), SecondVD->getSourceRange(),
10467 VarConstexpr)
10468 << SecondName << SecondIsConstexpr;
10469 Diagnosed = true;
10470 break;
10471 }
10472 break;
10473 }
10474 case Friend: {
10475 FriendDecl *FirstFriend = cast<FriendDecl>(FirstDecl);
10476 FriendDecl *SecondFriend = cast<FriendDecl>(SecondDecl);
10477
10478 NamedDecl *FirstND = FirstFriend->getFriendDecl();
10479 NamedDecl *SecondND = SecondFriend->getFriendDecl();
10480
10481 TypeSourceInfo *FirstTSI = FirstFriend->getFriendType();
10482 TypeSourceInfo *SecondTSI = SecondFriend->getFriendType();
10483
10484 if (FirstND && SecondND) {
10485 ODRDiagError(FirstFriend->getFriendLoc(),
10486 FirstFriend->getSourceRange(), FriendFunction)
10487 << FirstND;
10488 ODRDiagNote(SecondFriend->getFriendLoc(),
10489 SecondFriend->getSourceRange(), FriendFunction)
10490 << SecondND;
10491
10492 Diagnosed = true;
10493 break;
10494 }
10495
10496 if (FirstTSI && SecondTSI) {
10497 QualType FirstFriendType = FirstTSI->getType();
10498 QualType SecondFriendType = SecondTSI->getType();
10499 assert(ComputeQualTypeODRHash(FirstFriendType) !=(static_cast <bool> (ComputeQualTypeODRHash(FirstFriendType
) != ComputeQualTypeODRHash(SecondFriendType)) ? void (0) : __assert_fail
("ComputeQualTypeODRHash(FirstFriendType) != ComputeQualTypeODRHash(SecondFriendType)"
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 10500, __extension__ __PRETTY_FUNCTION__))
10500 ComputeQualTypeODRHash(SecondFriendType))(static_cast <bool> (ComputeQualTypeODRHash(FirstFriendType
) != ComputeQualTypeODRHash(SecondFriendType)) ? void (0) : __assert_fail
("ComputeQualTypeODRHash(FirstFriendType) != ComputeQualTypeODRHash(SecondFriendType)"
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 10500, __extension__ __PRETTY_FUNCTION__))
;
10501 ODRDiagError(FirstFriend->getFriendLoc(),
10502 FirstFriend->getSourceRange(), FriendType)
10503 << FirstFriendType;
10504 ODRDiagNote(SecondFriend->getFriendLoc(),
10505 SecondFriend->getSourceRange(), FriendType)
10506 << SecondFriendType;
10507 Diagnosed = true;
10508 break;
10509 }
10510
10511 ODRDiagError(FirstFriend->getFriendLoc(), FirstFriend->getSourceRange(),
10512 FriendTypeFunction)
10513 << (FirstTSI == nullptr);
10514 ODRDiagNote(SecondFriend->getFriendLoc(),
10515 SecondFriend->getSourceRange(), FriendTypeFunction)
10516 << (SecondTSI == nullptr);
10517
10518 Diagnosed = true;
10519 break;
10520 }
10521 }
10522
10523 if (Diagnosed)
10524 continue;
10525
10526 Diag(FirstDecl->getLocation(),
10527 diag::err_module_odr_violation_mismatch_decl_unknown)
10528 << FirstRecord << FirstModule.empty() << FirstModule << FirstDiffType
10529 << FirstDecl->getSourceRange();
10530 Diag(SecondDecl->getLocation(),
10531 diag::note_module_odr_violation_mismatch_decl_unknown)
10532 << SecondModule << FirstDiffType << SecondDecl->getSourceRange();
10533 Diagnosed = true;
10534 }
10535
10536 if (!Diagnosed) {
10537 // All definitions are updates to the same declaration. This happens if a
10538 // module instantiates the declaration of a class template specialization
10539 // and two or more other modules instantiate its definition.
10540 //
10541 // FIXME: Indicate which modules had instantiations of this definition.
10542 // FIXME: How can this even happen?
10543 Diag(Merge.first->getLocation(),
10544 diag::err_module_odr_violation_different_instantiations)
10545 << Merge.first;
10546 }
10547 }
10548
10549 // Issue ODR failures diagnostics for functions.
10550 for (auto &Merge : FunctionOdrMergeFailures) {
10551 enum ODRFunctionDifference {
10552 ReturnType,
10553 ParameterName,
10554 ParameterType,
10555 ParameterSingleDefaultArgument,
10556 ParameterDifferentDefaultArgument,
10557 FunctionBody,
10558 };
10559
10560 FunctionDecl *FirstFunction = Merge.first;
10561 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstFunction);
10562
10563 bool Diagnosed = false;
10564 for (auto &SecondFunction : Merge.second) {
10565
10566 if (FirstFunction == SecondFunction)
10567 continue;
10568
10569 std::string SecondModule =
10570 getOwningModuleNameForDiagnostic(SecondFunction);
10571
10572 auto ODRDiagError = [FirstFunction, &FirstModule,
10573 this](SourceLocation Loc, SourceRange Range,
10574 ODRFunctionDifference DiffType) {
10575 return Diag(Loc, diag::err_module_odr_violation_function)
10576 << FirstFunction << FirstModule.empty() << FirstModule << Range
10577 << DiffType;
10578 };
10579 auto ODRDiagNote = [&SecondModule, this](SourceLocation Loc,
10580 SourceRange Range,
10581 ODRFunctionDifference DiffType) {
10582 return Diag(Loc, diag::note_module_odr_violation_function)
10583 << SecondModule << Range << DiffType;
10584 };
10585
10586 if (ComputeQualTypeODRHash(FirstFunction->getReturnType()) !=
10587 ComputeQualTypeODRHash(SecondFunction->getReturnType())) {
10588 ODRDiagError(FirstFunction->getReturnTypeSourceRange().getBegin(),
10589 FirstFunction->getReturnTypeSourceRange(), ReturnType)
10590 << FirstFunction->getReturnType();
10591 ODRDiagNote(SecondFunction->getReturnTypeSourceRange().getBegin(),
10592 SecondFunction->getReturnTypeSourceRange(), ReturnType)
10593 << SecondFunction->getReturnType();
10594 Diagnosed = true;
10595 break;
10596 }
10597
10598 assert(FirstFunction->param_size() == SecondFunction->param_size() &&(static_cast <bool> (FirstFunction->param_size() == SecondFunction
->param_size() && "Merged functions with different number of parameters"
) ? void (0) : __assert_fail ("FirstFunction->param_size() == SecondFunction->param_size() && \"Merged functions with different number of parameters\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 10599, __extension__ __PRETTY_FUNCTION__))
10599 "Merged functions with different number of parameters")(static_cast <bool> (FirstFunction->param_size() == SecondFunction
->param_size() && "Merged functions with different number of parameters"
) ? void (0) : __assert_fail ("FirstFunction->param_size() == SecondFunction->param_size() && \"Merged functions with different number of parameters\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 10599, __extension__ __PRETTY_FUNCTION__))
;
10600
10601 auto ParamSize = FirstFunction->param_size();
10602 bool ParameterMismatch = false;
10603 for (unsigned I = 0; I < ParamSize; ++I) {
10604 auto *FirstParam = FirstFunction->getParamDecl(I);
10605 auto *SecondParam = SecondFunction->getParamDecl(I);
10606
10607 assert(getContext().hasSameType(FirstParam->getType(),(static_cast <bool> (getContext().hasSameType(FirstParam
->getType(), SecondParam->getType()) && "Merged function has different parameter types."
) ? void (0) : __assert_fail ("getContext().hasSameType(FirstParam->getType(), SecondParam->getType()) && \"Merged function has different parameter types.\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 10609, __extension__ __PRETTY_FUNCTION__))
10608 SecondParam->getType()) &&(static_cast <bool> (getContext().hasSameType(FirstParam
->getType(), SecondParam->getType()) && "Merged function has different parameter types."
) ? void (0) : __assert_fail ("getContext().hasSameType(FirstParam->getType(), SecondParam->getType()) && \"Merged function has different parameter types.\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 10609, __extension__ __PRETTY_FUNCTION__))
10609 "Merged function has different parameter types.")(static_cast <bool> (getContext().hasSameType(FirstParam
->getType(), SecondParam->getType()) && "Merged function has different parameter types."
) ? void (0) : __assert_fail ("getContext().hasSameType(FirstParam->getType(), SecondParam->getType()) && \"Merged function has different parameter types.\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 10609, __extension__ __PRETTY_FUNCTION__))
;
10610
10611 if (FirstParam->getDeclName() != SecondParam->getDeclName()) {
10612 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(),
10613 ParameterName)
10614 << I + 1 << FirstParam->getDeclName();
10615 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(),
10616 ParameterName)
10617 << I + 1 << SecondParam->getDeclName();
10618 ParameterMismatch = true;
10619 break;
10620 };
10621
10622 QualType FirstParamType = FirstParam->getType();
10623 QualType SecondParamType = SecondParam->getType();
10624 if (FirstParamType != SecondParamType &&
10625 ComputeQualTypeODRHash(FirstParamType) !=
10626 ComputeQualTypeODRHash(SecondParamType)) {
10627 if (const DecayedType *ParamDecayedType =
10628 FirstParamType->getAs<DecayedType>()) {
10629 ODRDiagError(FirstParam->getLocation(),
10630 FirstParam->getSourceRange(), ParameterType)
10631 << (I + 1) << FirstParamType << true
10632 << ParamDecayedType->getOriginalType();
10633 } else {
10634 ODRDiagError(FirstParam->getLocation(),
10635 FirstParam->getSourceRange(), ParameterType)
10636 << (I + 1) << FirstParamType << false;
10637 }
10638
10639 if (const DecayedType *ParamDecayedType =
10640 SecondParamType->getAs<DecayedType>()) {
10641 ODRDiagNote(SecondParam->getLocation(),
10642 SecondParam->getSourceRange(), ParameterType)
10643 << (I + 1) << SecondParamType << true
10644 << ParamDecayedType->getOriginalType();
10645 } else {
10646 ODRDiagNote(SecondParam->getLocation(),
10647 SecondParam->getSourceRange(), ParameterType)
10648 << (I + 1) << SecondParamType << false;
10649 }
10650 ParameterMismatch = true;
10651 break;
10652 }
10653
10654 const Expr *FirstInit = FirstParam->getInit();
10655 const Expr *SecondInit = SecondParam->getInit();
10656 if ((FirstInit == nullptr) != (SecondInit == nullptr)) {
10657 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(),
10658 ParameterSingleDefaultArgument)
10659 << (I + 1) << (FirstInit == nullptr)
10660 << (FirstInit ? FirstInit->getSourceRange() : SourceRange());
10661 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(),
10662 ParameterSingleDefaultArgument)
10663 << (I + 1) << (SecondInit == nullptr)
10664 << (SecondInit ? SecondInit->getSourceRange() : SourceRange());
10665 ParameterMismatch = true;
10666 break;
10667 }
10668
10669 if (FirstInit && SecondInit &&
10670 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) {
10671 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(),
10672 ParameterDifferentDefaultArgument)
10673 << (I + 1) << FirstInit->getSourceRange();
10674 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(),
10675 ParameterDifferentDefaultArgument)
10676 << (I + 1) << SecondInit->getSourceRange();
10677 ParameterMismatch = true;
10678 break;
10679 }
10680
10681 assert(ComputeSubDeclODRHash(FirstParam) ==(static_cast <bool> (ComputeSubDeclODRHash(FirstParam) ==
ComputeSubDeclODRHash(SecondParam) && "Undiagnosed parameter difference."
) ? void (0) : __assert_fail ("ComputeSubDeclODRHash(FirstParam) == ComputeSubDeclODRHash(SecondParam) && \"Undiagnosed parameter difference.\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 10683, __extension__ __PRETTY_FUNCTION__))
10682 ComputeSubDeclODRHash(SecondParam) &&(static_cast <bool> (ComputeSubDeclODRHash(FirstParam) ==
ComputeSubDeclODRHash(SecondParam) && "Undiagnosed parameter difference."
) ? void (0) : __assert_fail ("ComputeSubDeclODRHash(FirstParam) == ComputeSubDeclODRHash(SecondParam) && \"Undiagnosed parameter difference.\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 10683, __extension__ __PRETTY_FUNCTION__))
10683 "Undiagnosed parameter difference.")(static_cast <bool> (ComputeSubDeclODRHash(FirstParam) ==
ComputeSubDeclODRHash(SecondParam) && "Undiagnosed parameter difference."
) ? void (0) : __assert_fail ("ComputeSubDeclODRHash(FirstParam) == ComputeSubDeclODRHash(SecondParam) && \"Undiagnosed parameter difference.\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 10683, __extension__ __PRETTY_FUNCTION__))
;
10684 }
10685
10686 if (ParameterMismatch) {
10687 Diagnosed = true;
10688 break;
10689 }
10690
10691 // If no error has been generated before now, assume the problem is in
10692 // the body and generate a message.
10693 ODRDiagError(FirstFunction->getLocation(),
10694 FirstFunction->getSourceRange(), FunctionBody);
10695 ODRDiagNote(SecondFunction->getLocation(),
10696 SecondFunction->getSourceRange(), FunctionBody);
10697 Diagnosed = true;
10698 break;
10699 }
10700 (void)Diagnosed;
10701 assert(Diagnosed && "Unable to emit ODR diagnostic.")(static_cast <bool> (Diagnosed && "Unable to emit ODR diagnostic."
) ? void (0) : __assert_fail ("Diagnosed && \"Unable to emit ODR diagnostic.\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 10701, __extension__ __PRETTY_FUNCTION__))
;
10702 }
10703}
10704
10705void ASTReader::StartedDeserializing() {
10706 if (++NumCurrentElementsDeserializing == 1 && ReadTimer.get())
10707 ReadTimer->startTimer();
10708}
10709
10710void ASTReader::FinishedDeserializing() {
10711 assert(NumCurrentElementsDeserializing &&(static_cast <bool> (NumCurrentElementsDeserializing &&
"FinishedDeserializing not paired with StartedDeserializing"
) ? void (0) : __assert_fail ("NumCurrentElementsDeserializing && \"FinishedDeserializing not paired with StartedDeserializing\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 10712, __extension__ __PRETTY_FUNCTION__))
10712 "FinishedDeserializing not paired with StartedDeserializing")(static_cast <bool> (NumCurrentElementsDeserializing &&
"FinishedDeserializing not paired with StartedDeserializing"
) ? void (0) : __assert_fail ("NumCurrentElementsDeserializing && \"FinishedDeserializing not paired with StartedDeserializing\""
, "/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReader.cpp"
, 10712, __extension__ __PRETTY_FUNCTION__))
;
10713 if (NumCurrentElementsDeserializing == 1) {
10714 // We decrease NumCurrentElementsDeserializing only after pending actions
10715 // are finished, to avoid recursively re-calling finishPendingActions().
10716 finishPendingActions();
10717 }
10718 --NumCurrentElementsDeserializing;
10719
10720 if (NumCurrentElementsDeserializing == 0) {
10721 // Propagate exception specification updates along redeclaration chains.
10722 while (!PendingExceptionSpecUpdates.empty()) {
10723 auto Updates = std::move(PendingExceptionSpecUpdates);
10724 PendingExceptionSpecUpdates.clear();
10725 for (auto Update : Updates) {
10726 ProcessingUpdatesRAIIObj ProcessingUpdates(*this);
10727 auto *FPT = Update.second->getType()->castAs<FunctionProtoType>();
10728 auto ESI = FPT->getExtProtoInfo().ExceptionSpec;
10729 if (auto *Listener = getContext().getASTMutationListener())
10730 Listener->ResolvedExceptionSpec(cast<FunctionDecl>(Update.second));
10731 for (auto *Redecl : Update.second->redecls())
10732 getContext().adjustExceptionSpec(cast<FunctionDecl>(Redecl), ESI);
10733 }
10734 }
10735
10736 if (ReadTimer)
10737 ReadTimer->stopTimer();
10738
10739 diagnoseOdrViolations();
10740
10741 // We are not in recursive loading, so it's safe to pass the "interesting"
10742 // decls to the consumer.
10743 if (Consumer)
10744 PassInterestingDeclsToConsumer();
10745 }
10746}
10747
10748void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) {
10749 if (IdentifierInfo *II = Name.getAsIdentifierInfo()) {
10750 // Remove any fake results before adding any real ones.
10751 auto It = PendingFakeLookupResults.find(II);
10752 if (It != PendingFakeLookupResults.end()) {
10753 for (auto *ND : It->second)
10754 SemaObj->IdResolver.RemoveDecl(ND);
10755 // FIXME: this works around module+PCH performance issue.
10756 // Rather than erase the result from the map, which is O(n), just clear
10757 // the vector of NamedDecls.
10758 It->second.clear();
10759 }
10760 }
10761
10762 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
10763 SemaObj->TUScope->AddDecl(D);
10764 } else if (SemaObj->TUScope) {
10765 // Adding the decl to IdResolver may have failed because it was already in
10766 // (even though it was not added in scope). If it is already in, make sure
10767 // it gets in the scope as well.
10768 if (std::find(SemaObj->IdResolver.begin(Name),
10769 SemaObj->IdResolver.end(), D) != SemaObj->IdResolver.end())
10770 SemaObj->TUScope->AddDecl(D);
10771 }
10772}
10773
10774ASTReader::ASTReader(Preprocessor &PP, ASTContext *Context,
10775 const PCHContainerReader &PCHContainerRdr,
10776 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
10777 StringRef isysroot, bool DisableValidation,
10778 bool AllowASTWithCompilerErrors,
10779 bool AllowConfigurationMismatch, bool ValidateSystemInputs,
10780 bool UseGlobalIndex,
10781 std::unique_ptr<llvm::Timer> ReadTimer)
10782 : Listener(DisableValidation
10783 ? cast<ASTReaderListener>(new SimpleASTReaderListener(PP))
10784 : cast<ASTReaderListener>(new PCHValidator(PP, *this))),
10785 SourceMgr(PP.getSourceManager()), FileMgr(PP.getFileManager()),
10786 PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()), PP(PP),
10787 ContextObj(Context),
10788 ModuleMgr(PP.getFileManager(), PP.getPCMCache(), PCHContainerRdr,
10789 PP.getHeaderSearchInfo()),
10790 PCMCache(PP.getPCMCache()), DummyIdResolver(PP),
10791 ReadTimer(std::move(ReadTimer)), isysroot(isysroot),
10792 DisableValidation(DisableValidation),
10793 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
10794 AllowConfigurationMismatch(AllowConfigurationMismatch),
10795 ValidateSystemInputs(ValidateSystemInputs),
10796 UseGlobalIndex(UseGlobalIndex), CurrSwitchCaseStmts(&SwitchCaseStmts) {
10797 SourceMgr.setExternalSLocEntrySource(this);
10798
10799 for (const auto &Ext : Extensions) {
10800 auto BlockName = Ext->getExtensionMetadata().BlockName;
10801 auto Known = ModuleFileExtensions.find(BlockName);
10802 if (Known != ModuleFileExtensions.end()) {
10803 Diags.Report(diag::warn_duplicate_module_file_extension)
10804 << BlockName;
10805 continue;
10806 }
10807
10808 ModuleFileExtensions.insert({BlockName, Ext});
10809 }
10810}
10811
10812ASTReader::~ASTReader() {
10813 if (OwnsDeserializationListener)
10814 delete DeserializationListener;
10815}
10816
10817IdentifierResolver &ASTReader::getIdResolver() {
10818 return SemaObj ? SemaObj->IdResolver : DummyIdResolver;
10819}
10820
10821unsigned ASTRecordReader::readRecord(llvm::BitstreamCursor &Cursor,
10822 unsigned AbbrevID) {
10823 Idx = 0;
10824 Record.clear();
10825 return Cursor.readRecord(AbbrevID, Record);
10826}

/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/MultiOnDiskHashTable.h

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

/build/llvm-toolchain-snapshot-7~svn329677/tools/clang/lib/Serialization/ASTReaderInternals.h

1//===- ASTReaderInternals.h - AST Reader Internals --------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file provides internal definitions used in the AST reader.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_CLANG_LIB_SERIALIZATION_ASTREADERINTERNALS_H
15#define LLVM_CLANG_LIB_SERIALIZATION_ASTREADERINTERNALS_H
16
17#include "MultiOnDiskHashTable.h"
18#include "clang/AST/DeclarationName.h"
19#include "clang/Basic/LLVM.h"
20#include "clang/Serialization/ASTBitCodes.h"
21#include "llvm/ADT/DenseSet.h"
22#include "llvm/ADT/SmallVector.h"
23#include "llvm/ADT/StringRef.h"
24#include "llvm/Support/OnDiskHashTable.h"
25#include <ctime>
26#include <utility>
27
28namespace clang {
29
30class ASTReader;
31class FileEntry;
32struct HeaderFileInfo;
33class HeaderSearch;
34class IdentifierTable;
35class ObjCMethodDecl;
36
37namespace serialization {
38
39class ModuleFile;
40
41namespace reader {
42
43/// \brief Class that performs name lookup into a DeclContext stored
44/// in an AST file.
45class ASTDeclContextNameLookupTrait {
46 ASTReader &Reader;
47 ModuleFile &F;
48
49public:
50 // Maximum number of lookup tables we allow before condensing the tables.
51 static const int MaxTables = 4;
52
53 /// The lookup result is a list of global declaration IDs.
54 using data_type = SmallVector<DeclID, 4>;
55
56 struct data_type_builder {
57 data_type &Data;
58 llvm::DenseSet<DeclID> Found;
59
60 data_type_builder(data_type &D) : Data(D) {}
61
62 void insert(DeclID ID) {
63 // Just use a linear scan unless we have more than a few IDs.
64 if (Found.empty() && !Data.empty()) {
65 if (Data.size() <= 4) {
66 for (auto I : Found)
67 if (I == ID)
68 return;
69 Data.push_back(ID);
70 return;
71 }
72
73 // Switch to tracking found IDs in the set.
74 Found.insert(Data.begin(), Data.end());
75 }
76
77 if (Found.insert(ID).second)
78 Data.push_back(ID);
79 }
80 };
81 using hash_value_type = unsigned;
82 using offset_type = unsigned;
83 using file_type = ModuleFile *;
84
85 using external_key_type = DeclarationName;
86 using internal_key_type = DeclarationNameKey;
87
88 explicit ASTDeclContextNameLookupTrait(ASTReader &Reader, ModuleFile &F)
89 : Reader(Reader), F(F) {}
90
91 static bool EqualKey(const internal_key_type &a, const internal_key_type &b) {
92 return a == b;
93 }
94
95 static hash_value_type ComputeHash(const internal_key_type &Key) {
96 return Key.getHash();
11
Calling 'DeclarationNameKey::getHash'
97 }
98
99 static internal_key_type GetInternalKey(const external_key_type &Name) {
100 return Name;
101 }
102
103 static std::pair<unsigned, unsigned>
104 ReadKeyDataLength(const unsigned char *&d);
105
106 internal_key_type ReadKey(const unsigned char *d, unsigned);
107
108 void ReadDataInto(internal_key_type, const unsigned char *d,
109 unsigned DataLen, data_type_builder &Val);
110
111 static void MergeDataInto(const data_type &From, data_type_builder &To) {
112 To.Data.reserve(To.Data.size() + From.size());
113 for (DeclID ID : From)
114 To.insert(ID);
115 }
116
117 file_type ReadFileRef(const unsigned char *&d);
118};
119
120struct DeclContextLookupTable {
121 MultiOnDiskHashTable<ASTDeclContextNameLookupTrait> Table;
122};
123
124/// \brief Base class for the trait describing the on-disk hash table for the
125/// identifiers in an AST file.
126///
127/// This class is not useful by itself; rather, it provides common
128/// functionality for accessing the on-disk hash table of identifiers
129/// in an AST file. Different subclasses customize that functionality
130/// based on what information they are interested in. Those subclasses
131/// must provide the \c data_type type and the ReadData operation, only.
132class ASTIdentifierLookupTraitBase {
133public:
134 using external_key_type = StringRef;
135 using internal_key_type = StringRef;
136 using hash_value_type = unsigned;
137 using offset_type = unsigned;
138
139 static bool EqualKey(const internal_key_type& a, const internal_key_type& b) {
140 return a == b;
141 }
142
143 static hash_value_type ComputeHash(const internal_key_type& a);
144
145 static std::pair<unsigned, unsigned>
146 ReadKeyDataLength(const unsigned char*& d);
147
148 // This hopefully will just get inlined and removed by the optimizer.
149 static const internal_key_type&
150 GetInternalKey(const external_key_type& x) { return x; }
151
152 // This hopefully will just get inlined and removed by the optimizer.
153 static const external_key_type&
154 GetExternalKey(const internal_key_type& x) { return x; }
155
156 static internal_key_type ReadKey(const unsigned char* d, unsigned n);
157};
158
159/// \brief Class that performs lookup for an identifier stored in an AST file.
160class ASTIdentifierLookupTrait : public ASTIdentifierLookupTraitBase {
161 ASTReader &Reader;
162 ModuleFile &F;
163
164 // If we know the IdentifierInfo in advance, it is here and we will
165 // not build a new one. Used when deserializing information about an
166 // identifier that was constructed before the AST file was read.
167 IdentifierInfo *KnownII;
168
169public:
170 using data_type = IdentifierInfo *;
171
172 ASTIdentifierLookupTrait(ASTReader &Reader, ModuleFile &F,
173 IdentifierInfo *II = nullptr)
174 : Reader(Reader), F(F), KnownII(II) {}
175
176 data_type ReadData(const internal_key_type& k,
177 const unsigned char* d,
178 unsigned DataLen);
179
180 IdentID ReadIdentifierID(const unsigned char *d);
181
182 ASTReader &getReader() const { return Reader; }
183};
184
185/// \brief The on-disk hash table used to contain information about
186/// all of the identifiers in the program.
187using ASTIdentifierLookupTable =
188 llvm::OnDiskIterableChainedHashTable<ASTIdentifierLookupTrait>;
189
190/// \brief Class that performs lookup for a selector's entries in the global
191/// method pool stored in an AST file.
192class ASTSelectorLookupTrait {
193 ASTReader &Reader;
194 ModuleFile &F;
195
196public:
197 struct data_type {
198 SelectorID ID;
199 unsigned InstanceBits;
200 unsigned FactoryBits;
201 bool InstanceHasMoreThanOneDecl;
202 bool FactoryHasMoreThanOneDecl;
203 SmallVector<ObjCMethodDecl *, 2> Instance;
204 SmallVector<ObjCMethodDecl *, 2> Factory;
205 };
206
207 using external_key_type = Selector;
208 using internal_key_type = external_key_type;
209 using hash_value_type = unsigned;
210 using offset_type = unsigned;
211
212 ASTSelectorLookupTrait(ASTReader &Reader, ModuleFile &F)
213 : Reader(Reader), F(F) {}
214
215 static bool EqualKey(const internal_key_type& a,
216 const internal_key_type& b) {
217 return a == b;
218 }
219
220 static hash_value_type ComputeHash(Selector Sel);
221
222 static const internal_key_type&
223 GetInternalKey(const external_key_type& x) { return x; }
224
225 static std::pair<unsigned, unsigned>
226 ReadKeyDataLength(const unsigned char*& d);
227
228 internal_key_type ReadKey(const unsigned char* d, unsigned);
229 data_type ReadData(Selector, const unsigned char* d, unsigned DataLen);
230};
231
232/// \brief The on-disk hash table used for the global method pool.
233using ASTSelectorLookupTable =
234 llvm::OnDiskChainedHashTable<ASTSelectorLookupTrait>;
235
236/// \brief Trait class used to search the on-disk hash table containing all of
237/// the header search information.
238///
239/// The on-disk hash table contains a mapping from each header path to
240/// information about that header (how many times it has been included, its
241/// controlling macro, etc.). Note that we actually hash based on the size
242/// and mtime, and support "deep" comparisons of file names based on current
243/// inode numbers, so that the search can cope with non-normalized path names
244/// and symlinks.
245class HeaderFileInfoTrait {
246 ASTReader &Reader;
247 ModuleFile &M;
248 HeaderSearch *HS;
249 const char *FrameworkStrings;
250
251public:
252 using external_key_type = const FileEntry *;
253
254 struct internal_key_type {
255 off_t Size;
256 time_t ModTime;
257 StringRef Filename;
258 bool Imported;
259 };
260
261 using internal_key_ref = const internal_key_type &;
262
263 using data_type = HeaderFileInfo;
264 using hash_value_type = unsigned;
265 using offset_type = unsigned;
266
267 HeaderFileInfoTrait(ASTReader &Reader, ModuleFile &M, HeaderSearch *HS,
268 const char *FrameworkStrings)
269 : Reader(Reader), M(M), HS(HS), FrameworkStrings(FrameworkStrings) {}
270
271 static hash_value_type ComputeHash(internal_key_ref ikey);
272 internal_key_type GetInternalKey(const FileEntry *FE);
273 bool EqualKey(internal_key_ref a, internal_key_ref b);
274
275 static std::pair<unsigned, unsigned>
276 ReadKeyDataLength(const unsigned char*& d);
277
278 static internal_key_type ReadKey(const unsigned char *d, unsigned);
279
280 data_type ReadData(internal_key_ref,const unsigned char *d, unsigned DataLen);
281};
282
283/// \brief The on-disk hash table used for known header files.
284using HeaderFileInfoLookupTable =
285 llvm::OnDiskChainedHashTable<HeaderFileInfoTrait>;
286
287} // namespace reader
288
289} // namespace serialization
290
291} // namespace clang
292
293#endif // LLVM_CLANG_LIB_SERIALIZATION_ASTREADERINTERNALS_H