Bug Summary

File:llvm/include/llvm/Bitstream/BitstreamReader.h
Warning:line 221, column 39
The result of the right shift is undefined due to shifting by '64', which is greater or equal to the width of type 'llvm::SimpleBitstreamCursor::word_t'

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -disable-llvm-verifier -discard-value-names -main-file-name ASTReader.cpp -analyzer-store=region -analyzer-opt-analyze-nested-blocks -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=cplusplus -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -analyzer-config-compatibility-mode=true -mrelocation-model pic -pic-level 2 -mframe-pointer=none -relaxed-aliasing -fmath-errno -fno-rounding-math -mconstructor-aliases -munwind-tables -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/build-llvm/tools/clang/lib/Serialization -resource-dir /usr/lib/llvm-14/lib/clang/14.0.0 -D CLANG_ROUND_TRIP_CC1_ARGS=ON -D _DEBUG -D _GNU_SOURCE -D __STDC_CONSTANT_MACROS -D __STDC_FORMAT_MACROS -D __STDC_LIMIT_MACROS -I /build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/build-llvm/tools/clang/lib/Serialization -I /build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization -I /build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/include -I /build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/build-llvm/tools/clang/include -I /build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/build-llvm/include -I /build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/llvm/include -D NDEBUG -U NDEBUG -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/x86_64-linux-gnu/c++/10 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/backward -internal-isystem /usr/lib/llvm-14/lib/clang/14.0.0/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/10/../../../../x86_64-linux-gnu/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-class-memaccess -Wno-redundant-move -Wno-pessimizing-move -Wno-noexcept-type -Wno-comment -std=c++14 -fdeprecated-macro -fdebug-compilation-dir=/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/build-llvm/tools/clang/lib/Serialization -fdebug-prefix-map=/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0=. -ferror-limit 19 -fvisibility-inlines-hidden -stack-protector 2 -fgnuc-version=4.2.1 -vectorize-loops -vectorize-slp -analyzer-output=html -analyzer-config stable-report-filename=true -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /tmp/scan-build-2021-08-28-193554-24367-1 -x c++ /build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp

/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp

1//===- ASTReader.cpp - AST File Reader ------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines the ASTReader class, which reads AST files.
10//
11//===----------------------------------------------------------------------===//
12
13#include "ASTCommon.h"
14#include "ASTReaderInternals.h"
15#include "clang/AST/ASTConsumer.h"
16#include "clang/AST/ASTContext.h"
17#include "clang/AST/ASTMutationListener.h"
18#include "clang/AST/ASTUnresolvedSet.h"
19#include "clang/AST/AbstractTypeReader.h"
20#include "clang/AST/Decl.h"
21#include "clang/AST/DeclBase.h"
22#include "clang/AST/DeclCXX.h"
23#include "clang/AST/DeclFriend.h"
24#include "clang/AST/DeclGroup.h"
25#include "clang/AST/DeclObjC.h"
26#include "clang/AST/DeclTemplate.h"
27#include "clang/AST/DeclarationName.h"
28#include "clang/AST/Expr.h"
29#include "clang/AST/ExprCXX.h"
30#include "clang/AST/ExternalASTSource.h"
31#include "clang/AST/NestedNameSpecifier.h"
32#include "clang/AST/ODRHash.h"
33#include "clang/AST/OpenMPClause.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/DiagnosticError.h"
44#include "clang/Basic/DiagnosticOptions.h"
45#include "clang/Basic/ExceptionSpecificationType.h"
46#include "clang/Basic/FileManager.h"
47#include "clang/Basic/FileSystemOptions.h"
48#include "clang/Basic/IdentifierTable.h"
49#include "clang/Basic/LLVM.h"
50#include "clang/Basic/LangOptions.h"
51#include "clang/Basic/Module.h"
52#include "clang/Basic/ObjCRuntime.h"
53#include "clang/Basic/OpenMPKinds.h"
54#include "clang/Basic/OperatorKinds.h"
55#include "clang/Basic/PragmaKinds.h"
56#include "clang/Basic/Sanitizers.h"
57#include "clang/Basic/SourceLocation.h"
58#include "clang/Basic/SourceManager.h"
59#include "clang/Basic/SourceManagerInternals.h"
60#include "clang/Basic/Specifiers.h"
61#include "clang/Basic/TargetInfo.h"
62#include "clang/Basic/TargetOptions.h"
63#include "clang/Basic/TokenKinds.h"
64#include "clang/Basic/Version.h"
65#include "clang/Lex/HeaderSearch.h"
66#include "clang/Lex/HeaderSearchOptions.h"
67#include "clang/Lex/MacroInfo.h"
68#include "clang/Lex/ModuleMap.h"
69#include "clang/Lex/PreprocessingRecord.h"
70#include "clang/Lex/Preprocessor.h"
71#include "clang/Lex/PreprocessorOptions.h"
72#include "clang/Lex/Token.h"
73#include "clang/Sema/ObjCMethodList.h"
74#include "clang/Sema/Scope.h"
75#include "clang/Sema/Sema.h"
76#include "clang/Sema/Weak.h"
77#include "clang/Serialization/ASTBitCodes.h"
78#include "clang/Serialization/ASTDeserializationListener.h"
79#include "clang/Serialization/ASTRecordReader.h"
80#include "clang/Serialization/ContinuousRangeMap.h"
81#include "clang/Serialization/GlobalModuleIndex.h"
82#include "clang/Serialization/InMemoryModuleCache.h"
83#include "clang/Serialization/ModuleFile.h"
84#include "clang/Serialization/ModuleFileExtension.h"
85#include "clang/Serialization/ModuleManager.h"
86#include "clang/Serialization/PCHContainerOperations.h"
87#include "clang/Serialization/SerializationDiagnostic.h"
88#include "llvm/ADT/APFloat.h"
89#include "llvm/ADT/APInt.h"
90#include "llvm/ADT/APSInt.h"
91#include "llvm/ADT/ArrayRef.h"
92#include "llvm/ADT/DenseMap.h"
93#include "llvm/ADT/FloatingPointMode.h"
94#include "llvm/ADT/FoldingSet.h"
95#include "llvm/ADT/Hashing.h"
96#include "llvm/ADT/IntrusiveRefCntPtr.h"
97#include "llvm/ADT/None.h"
98#include "llvm/ADT/Optional.h"
99#include "llvm/ADT/STLExtras.h"
100#include "llvm/ADT/ScopeExit.h"
101#include "llvm/ADT/SmallPtrSet.h"
102#include "llvm/ADT/SmallString.h"
103#include "llvm/ADT/SmallVector.h"
104#include "llvm/ADT/StringExtras.h"
105#include "llvm/ADT/StringMap.h"
106#include "llvm/ADT/StringRef.h"
107#include "llvm/ADT/Triple.h"
108#include "llvm/ADT/iterator_range.h"
109#include "llvm/Bitstream/BitstreamReader.h"
110#include "llvm/Support/Casting.h"
111#include "llvm/Support/Compiler.h"
112#include "llvm/Support/Compression.h"
113#include "llvm/Support/DJB.h"
114#include "llvm/Support/Endian.h"
115#include "llvm/Support/Error.h"
116#include "llvm/Support/ErrorHandling.h"
117#include "llvm/Support/FileSystem.h"
118#include "llvm/Support/LEB128.h"
119#include "llvm/Support/MemoryBuffer.h"
120#include "llvm/Support/Path.h"
121#include "llvm/Support/SaveAndRestore.h"
122#include "llvm/Support/Timer.h"
123#include "llvm/Support/VersionTuple.h"
124#include "llvm/Support/raw_ostream.h"
125#include <algorithm>
126#include <cassert>
127#include <cstddef>
128#include <cstdint>
129#include <cstdio>
130#include <ctime>
131#include <iterator>
132#include <limits>
133#include <map>
134#include <memory>
135#include <string>
136#include <system_error>
137#include <tuple>
138#include <utility>
139#include <vector>
140
141using namespace clang;
142using namespace clang::serialization;
143using namespace clang::serialization::reader;
144using llvm::BitstreamCursor;
145using llvm::RoundingMode;
146
147//===----------------------------------------------------------------------===//
148// ChainedASTReaderListener implementation
149//===----------------------------------------------------------------------===//
150
151bool
152ChainedASTReaderListener::ReadFullVersionInformation(StringRef FullVersion) {
153 return First->ReadFullVersionInformation(FullVersion) ||
154 Second->ReadFullVersionInformation(FullVersion);
155}
156
157void ChainedASTReaderListener::ReadModuleName(StringRef ModuleName) {
158 First->ReadModuleName(ModuleName);
159 Second->ReadModuleName(ModuleName);
160}
161
162void ChainedASTReaderListener::ReadModuleMapFile(StringRef ModuleMapPath) {
163 First->ReadModuleMapFile(ModuleMapPath);
164 Second->ReadModuleMapFile(ModuleMapPath);
165}
166
167bool
168ChainedASTReaderListener::ReadLanguageOptions(const LangOptions &LangOpts,
169 bool Complain,
170 bool AllowCompatibleDifferences) {
171 return First->ReadLanguageOptions(LangOpts, Complain,
172 AllowCompatibleDifferences) ||
173 Second->ReadLanguageOptions(LangOpts, Complain,
174 AllowCompatibleDifferences);
175}
176
177bool ChainedASTReaderListener::ReadTargetOptions(
178 const TargetOptions &TargetOpts, bool Complain,
179 bool AllowCompatibleDifferences) {
180 return First->ReadTargetOptions(TargetOpts, Complain,
181 AllowCompatibleDifferences) ||
182 Second->ReadTargetOptions(TargetOpts, Complain,
183 AllowCompatibleDifferences);
184}
185
186bool ChainedASTReaderListener::ReadDiagnosticOptions(
187 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) {
188 return First->ReadDiagnosticOptions(DiagOpts, Complain) ||
189 Second->ReadDiagnosticOptions(DiagOpts, Complain);
190}
191
192bool
193ChainedASTReaderListener::ReadFileSystemOptions(const FileSystemOptions &FSOpts,
194 bool Complain) {
195 return First->ReadFileSystemOptions(FSOpts, Complain) ||
196 Second->ReadFileSystemOptions(FSOpts, Complain);
197}
198
199bool ChainedASTReaderListener::ReadHeaderSearchOptions(
200 const HeaderSearchOptions &HSOpts, StringRef SpecificModuleCachePath,
201 bool Complain) {
202 return First->ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
203 Complain) ||
204 Second->ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
205 Complain);
206}
207
208bool ChainedASTReaderListener::ReadPreprocessorOptions(
209 const PreprocessorOptions &PPOpts, bool Complain,
210 std::string &SuggestedPredefines) {
211 return First->ReadPreprocessorOptions(PPOpts, Complain,
212 SuggestedPredefines) ||
213 Second->ReadPreprocessorOptions(PPOpts, Complain, SuggestedPredefines);
214}
215
216void ChainedASTReaderListener::ReadCounter(const serialization::ModuleFile &M,
217 unsigned Value) {
218 First->ReadCounter(M, Value);
219 Second->ReadCounter(M, Value);
220}
221
222bool ChainedASTReaderListener::needsInputFileVisitation() {
223 return First->needsInputFileVisitation() ||
224 Second->needsInputFileVisitation();
225}
226
227bool ChainedASTReaderListener::needsSystemInputFileVisitation() {
228 return First->needsSystemInputFileVisitation() ||
229 Second->needsSystemInputFileVisitation();
230}
231
232void ChainedASTReaderListener::visitModuleFile(StringRef Filename,
233 ModuleKind Kind) {
234 First->visitModuleFile(Filename, Kind);
235 Second->visitModuleFile(Filename, Kind);
236}
237
238bool ChainedASTReaderListener::visitInputFile(StringRef Filename,
239 bool isSystem,
240 bool isOverridden,
241 bool isExplicitModule) {
242 bool Continue = false;
243 if (First->needsInputFileVisitation() &&
244 (!isSystem || First->needsSystemInputFileVisitation()))
245 Continue |= First->visitInputFile(Filename, isSystem, isOverridden,
246 isExplicitModule);
247 if (Second->needsInputFileVisitation() &&
248 (!isSystem || Second->needsSystemInputFileVisitation()))
249 Continue |= Second->visitInputFile(Filename, isSystem, isOverridden,
250 isExplicitModule);
251 return Continue;
252}
253
254void ChainedASTReaderListener::readModuleFileExtension(
255 const ModuleFileExtensionMetadata &Metadata) {
256 First->readModuleFileExtension(Metadata);
257 Second->readModuleFileExtension(Metadata);
258}
259
260//===----------------------------------------------------------------------===//
261// PCH validator implementation
262//===----------------------------------------------------------------------===//
263
264ASTReaderListener::~ASTReaderListener() = default;
265
266/// Compare the given set of language options against an existing set of
267/// language options.
268///
269/// \param Diags If non-NULL, diagnostics will be emitted via this engine.
270/// \param AllowCompatibleDifferences If true, differences between compatible
271/// language options will be permitted.
272///
273/// \returns true if the languagae options mis-match, false otherwise.
274static bool checkLanguageOptions(const LangOptions &LangOpts,
275 const LangOptions &ExistingLangOpts,
276 DiagnosticsEngine *Diags,
277 bool AllowCompatibleDifferences = true) {
278#define LANGOPT(Name, Bits, Default, Description) \
279 if (ExistingLangOpts.Name != LangOpts.Name) { \
280 if (Diags) \
281 Diags->Report(diag::err_pch_langopt_mismatch) \
282 << Description << LangOpts.Name << ExistingLangOpts.Name; \
283 return true; \
284 }
285
286#define VALUE_LANGOPT(Name, Bits, Default, Description) \
287 if (ExistingLangOpts.Name != LangOpts.Name) { \
288 if (Diags) \
289 Diags->Report(diag::err_pch_langopt_value_mismatch) \
290 << Description; \
291 return true; \
292 }
293
294#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
295 if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \
296 if (Diags) \
297 Diags->Report(diag::err_pch_langopt_value_mismatch) \
298 << Description; \
299 return true; \
300 }
301
302#define COMPATIBLE_LANGOPT(Name, Bits, Default, Description) \
303 if (!AllowCompatibleDifferences) \
304 LANGOPT(Name, Bits, Default, Description)
305
306#define COMPATIBLE_ENUM_LANGOPT(Name, Bits, Default, Description) \
307 if (!AllowCompatibleDifferences) \
308 ENUM_LANGOPT(Name, Bits, Default, Description)
309
310#define COMPATIBLE_VALUE_LANGOPT(Name, Bits, Default, Description) \
311 if (!AllowCompatibleDifferences) \
312 VALUE_LANGOPT(Name, Bits, Default, Description)
313
314#define BENIGN_LANGOPT(Name, Bits, Default, Description)
315#define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description)
316#define BENIGN_VALUE_LANGOPT(Name, Type, Bits, Default, Description)
317#include "clang/Basic/LangOptions.def"
318
319 if (ExistingLangOpts.ModuleFeatures != LangOpts.ModuleFeatures) {
320 if (Diags)
321 Diags->Report(diag::err_pch_langopt_value_mismatch) << "module features";
322 return true;
323 }
324
325 if (ExistingLangOpts.ObjCRuntime != LangOpts.ObjCRuntime) {
326 if (Diags)
327 Diags->Report(diag::err_pch_langopt_value_mismatch)
328 << "target Objective-C runtime";
329 return true;
330 }
331
332 if (ExistingLangOpts.CommentOpts.BlockCommandNames !=
333 LangOpts.CommentOpts.BlockCommandNames) {
334 if (Diags)
335 Diags->Report(diag::err_pch_langopt_value_mismatch)
336 << "block command names";
337 return true;
338 }
339
340 // Sanitizer feature mismatches are treated as compatible differences. If
341 // compatible differences aren't allowed, we still only want to check for
342 // mismatches of non-modular sanitizers (the only ones which can affect AST
343 // generation).
344 if (!AllowCompatibleDifferences) {
345 SanitizerMask ModularSanitizers = getPPTransparentSanitizers();
346 SanitizerSet ExistingSanitizers = ExistingLangOpts.Sanitize;
347 SanitizerSet ImportedSanitizers = LangOpts.Sanitize;
348 ExistingSanitizers.clear(ModularSanitizers);
349 ImportedSanitizers.clear(ModularSanitizers);
350 if (ExistingSanitizers.Mask != ImportedSanitizers.Mask) {
351 const std::string Flag = "-fsanitize=";
352 if (Diags) {
353#define SANITIZER(NAME, ID) \
354 { \
355 bool InExistingModule = ExistingSanitizers.has(SanitizerKind::ID); \
356 bool InImportedModule = ImportedSanitizers.has(SanitizerKind::ID); \
357 if (InExistingModule != InImportedModule) \
358 Diags->Report(diag::err_pch_targetopt_feature_mismatch) \
359 << InExistingModule << (Flag + NAME); \
360 }
361#include "clang/Basic/Sanitizers.def"
362 }
363 return true;
364 }
365 }
366
367 return false;
368}
369
370/// Compare the given set of target options against an existing set of
371/// target options.
372///
373/// \param Diags If non-NULL, diagnostics will be emitted via this engine.
374///
375/// \returns true if the target options mis-match, false otherwise.
376static bool checkTargetOptions(const TargetOptions &TargetOpts,
377 const TargetOptions &ExistingTargetOpts,
378 DiagnosticsEngine *Diags,
379 bool AllowCompatibleDifferences = true) {
380#define CHECK_TARGET_OPT(Field, Name) \
381 if (TargetOpts.Field != ExistingTargetOpts.Field) { \
382 if (Diags) \
383 Diags->Report(diag::err_pch_targetopt_mismatch) \
384 << Name << TargetOpts.Field << ExistingTargetOpts.Field; \
385 return true; \
386 }
387
388 // The triple and ABI must match exactly.
389 CHECK_TARGET_OPT(Triple, "target");
390 CHECK_TARGET_OPT(ABI, "target ABI");
391
392 // We can tolerate different CPUs in many cases, notably when one CPU
393 // supports a strict superset of another. When allowing compatible
394 // differences skip this check.
395 if (!AllowCompatibleDifferences) {
396 CHECK_TARGET_OPT(CPU, "target CPU");
397 CHECK_TARGET_OPT(TuneCPU, "tune CPU");
398 }
399
400#undef CHECK_TARGET_OPT
401
402 // Compare feature sets.
403 SmallVector<StringRef, 4> ExistingFeatures(
404 ExistingTargetOpts.FeaturesAsWritten.begin(),
405 ExistingTargetOpts.FeaturesAsWritten.end());
406 SmallVector<StringRef, 4> ReadFeatures(TargetOpts.FeaturesAsWritten.begin(),
407 TargetOpts.FeaturesAsWritten.end());
408 llvm::sort(ExistingFeatures);
409 llvm::sort(ReadFeatures);
410
411 // We compute the set difference in both directions explicitly so that we can
412 // diagnose the differences differently.
413 SmallVector<StringRef, 4> UnmatchedExistingFeatures, UnmatchedReadFeatures;
414 std::set_difference(
415 ExistingFeatures.begin(), ExistingFeatures.end(), ReadFeatures.begin(),
416 ReadFeatures.end(), std::back_inserter(UnmatchedExistingFeatures));
417 std::set_difference(ReadFeatures.begin(), ReadFeatures.end(),
418 ExistingFeatures.begin(), ExistingFeatures.end(),
419 std::back_inserter(UnmatchedReadFeatures));
420
421 // If we are allowing compatible differences and the read feature set is
422 // a strict subset of the existing feature set, there is nothing to diagnose.
423 if (AllowCompatibleDifferences && UnmatchedReadFeatures.empty())
424 return false;
425
426 if (Diags) {
427 for (StringRef Feature : UnmatchedReadFeatures)
428 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
429 << /* is-existing-feature */ false << Feature;
430 for (StringRef Feature : UnmatchedExistingFeatures)
431 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
432 << /* is-existing-feature */ true << Feature;
433 }
434
435 return !UnmatchedReadFeatures.empty() || !UnmatchedExistingFeatures.empty();
436}
437
438bool
439PCHValidator::ReadLanguageOptions(const LangOptions &LangOpts,
440 bool Complain,
441 bool AllowCompatibleDifferences) {
442 const LangOptions &ExistingLangOpts = PP.getLangOpts();
443 return checkLanguageOptions(LangOpts, ExistingLangOpts,
444 Complain ? &Reader.Diags : nullptr,
445 AllowCompatibleDifferences);
446}
447
448bool PCHValidator::ReadTargetOptions(const TargetOptions &TargetOpts,
449 bool Complain,
450 bool AllowCompatibleDifferences) {
451 const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts();
452 return checkTargetOptions(TargetOpts, ExistingTargetOpts,
453 Complain ? &Reader.Diags : nullptr,
454 AllowCompatibleDifferences);
455}
456
457namespace {
458
459using MacroDefinitionsMap =
460 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/>>;
461using DeclsMap = llvm::DenseMap<DeclarationName, SmallVector<NamedDecl *, 8>>;
462
463} // namespace
464
465static bool checkDiagnosticGroupMappings(DiagnosticsEngine &StoredDiags,
466 DiagnosticsEngine &Diags,
467 bool Complain) {
468 using Level = DiagnosticsEngine::Level;
469
470 // Check current mappings for new -Werror mappings, and the stored mappings
471 // for cases that were explicitly mapped to *not* be errors that are now
472 // errors because of options like -Werror.
473 DiagnosticsEngine *MappingSources[] = { &Diags, &StoredDiags };
474
475 for (DiagnosticsEngine *MappingSource : MappingSources) {
476 for (auto DiagIDMappingPair : MappingSource->getDiagnosticMappings()) {
477 diag::kind DiagID = DiagIDMappingPair.first;
478 Level CurLevel = Diags.getDiagnosticLevel(DiagID, SourceLocation());
479 if (CurLevel < DiagnosticsEngine::Error)
480 continue; // not significant
481 Level StoredLevel =
482 StoredDiags.getDiagnosticLevel(DiagID, SourceLocation());
483 if (StoredLevel < DiagnosticsEngine::Error) {
484 if (Complain)
485 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror=" +
486 Diags.getDiagnosticIDs()->getWarningOptionForDiag(DiagID).str();
487 return true;
488 }
489 }
490 }
491
492 return false;
493}
494
495static bool isExtHandlingFromDiagsError(DiagnosticsEngine &Diags) {
496 diag::Severity Ext = Diags.getExtensionHandlingBehavior();
497 if (Ext == diag::Severity::Warning && Diags.getWarningsAsErrors())
498 return true;
499 return Ext >= diag::Severity::Error;
500}
501
502static bool checkDiagnosticMappings(DiagnosticsEngine &StoredDiags,
503 DiagnosticsEngine &Diags,
504 bool IsSystem, bool Complain) {
505 // Top-level options
506 if (IsSystem) {
507 if (Diags.getSuppressSystemWarnings())
508 return false;
509 // If -Wsystem-headers was not enabled before, be conservative
510 if (StoredDiags.getSuppressSystemWarnings()) {
511 if (Complain)
512 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Wsystem-headers";
513 return true;
514 }
515 }
516
517 if (Diags.getWarningsAsErrors() && !StoredDiags.getWarningsAsErrors()) {
518 if (Complain)
519 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror";
520 return true;
521 }
522
523 if (Diags.getWarningsAsErrors() && Diags.getEnableAllWarnings() &&
524 !StoredDiags.getEnableAllWarnings()) {
525 if (Complain)
526 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Weverything -Werror";
527 return true;
528 }
529
530 if (isExtHandlingFromDiagsError(Diags) &&
531 !isExtHandlingFromDiagsError(StoredDiags)) {
532 if (Complain)
533 Diags.Report(diag::err_pch_diagopt_mismatch) << "-pedantic-errors";
534 return true;
535 }
536
537 return checkDiagnosticGroupMappings(StoredDiags, Diags, Complain);
538}
539
540/// Return the top import module if it is implicit, nullptr otherwise.
541static Module *getTopImportImplicitModule(ModuleManager &ModuleMgr,
542 Preprocessor &PP) {
543 // If the original import came from a file explicitly generated by the user,
544 // don't check the diagnostic mappings.
545 // FIXME: currently this is approximated by checking whether this is not a
546 // module import of an implicitly-loaded module file.
547 // Note: ModuleMgr.rbegin() may not be the current module, but it must be in
548 // the transitive closure of its imports, since unrelated modules cannot be
549 // imported until after this module finishes validation.
550 ModuleFile *TopImport = &*ModuleMgr.rbegin();
551 while (!TopImport->ImportedBy.empty())
552 TopImport = TopImport->ImportedBy[0];
553 if (TopImport->Kind != MK_ImplicitModule)
554 return nullptr;
555
556 StringRef ModuleName = TopImport->ModuleName;
557 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 557, __extension__ __PRETTY_FUNCTION__))
;
558
559 Module *M = PP.getHeaderSearchInfo().lookupModule(ModuleName);
560 assert(M && "missing module")(static_cast <bool> (M && "missing module") ? void
(0) : __assert_fail ("M && \"missing module\"", "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 560, __extension__ __PRETTY_FUNCTION__))
;
561 return M;
562}
563
564bool PCHValidator::ReadDiagnosticOptions(
565 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) {
566 DiagnosticsEngine &ExistingDiags = PP.getDiagnostics();
567 IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(ExistingDiags.getDiagnosticIDs());
568 IntrusiveRefCntPtr<DiagnosticsEngine> Diags(
569 new DiagnosticsEngine(DiagIDs, DiagOpts.get()));
570 // This should never fail, because we would have processed these options
571 // before writing them to an ASTFile.
572 ProcessWarningOptions(*Diags, *DiagOpts, /*Report*/false);
573
574 ModuleManager &ModuleMgr = Reader.getModuleManager();
575 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 575, __extension__ __PRETTY_FUNCTION__))
;
576
577 Module *TopM = getTopImportImplicitModule(ModuleMgr, PP);
578 if (!TopM)
579 return false;
580
581 // FIXME: if the diagnostics are incompatible, save a DiagnosticOptions that
582 // contains the union of their flags.
583 return checkDiagnosticMappings(*Diags, ExistingDiags, TopM->IsSystem,
584 Complain);
585}
586
587/// Collect the macro definitions provided by the given preprocessor
588/// options.
589static void
590collectMacroDefinitions(const PreprocessorOptions &PPOpts,
591 MacroDefinitionsMap &Macros,
592 SmallVectorImpl<StringRef> *MacroNames = nullptr) {
593 for (unsigned I = 0, N = PPOpts.Macros.size(); I != N; ++I) {
594 StringRef Macro = PPOpts.Macros[I].first;
595 bool IsUndef = PPOpts.Macros[I].second;
596
597 std::pair<StringRef, StringRef> MacroPair = Macro.split('=');
598 StringRef MacroName = MacroPair.first;
599 StringRef MacroBody = MacroPair.second;
600
601 // For an #undef'd macro, we only care about the name.
602 if (IsUndef) {
603 if (MacroNames && !Macros.count(MacroName))
604 MacroNames->push_back(MacroName);
605
606 Macros[MacroName] = std::make_pair("", true);
607 continue;
608 }
609
610 // For a #define'd macro, figure out the actual definition.
611 if (MacroName.size() == Macro.size())
612 MacroBody = "1";
613 else {
614 // Note: GCC drops anything following an end-of-line character.
615 StringRef::size_type End = MacroBody.find_first_of("\n\r");
616 MacroBody = MacroBody.substr(0, End);
617 }
618
619 if (MacroNames && !Macros.count(MacroName))
620 MacroNames->push_back(MacroName);
621 Macros[MacroName] = std::make_pair(MacroBody, false);
622 }
623}
624
625/// Check the preprocessor options deserialized from the control block
626/// against the preprocessor options in an existing preprocessor.
627///
628/// \param Diags If non-null, produce diagnostics for any mismatches incurred.
629/// \param Validate If true, validate preprocessor options. If false, allow
630/// macros defined by \p ExistingPPOpts to override those defined by
631/// \p PPOpts in SuggestedPredefines.
632static bool checkPreprocessorOptions(const PreprocessorOptions &PPOpts,
633 const PreprocessorOptions &ExistingPPOpts,
634 DiagnosticsEngine *Diags,
635 FileManager &FileMgr,
636 std::string &SuggestedPredefines,
637 const LangOptions &LangOpts,
638 bool Validate = true) {
639 // Check macro definitions.
640 MacroDefinitionsMap ASTFileMacros;
641 collectMacroDefinitions(PPOpts, ASTFileMacros);
642 MacroDefinitionsMap ExistingMacros;
643 SmallVector<StringRef, 4> ExistingMacroNames;
644 collectMacroDefinitions(ExistingPPOpts, ExistingMacros, &ExistingMacroNames);
645
646 for (unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) {
647 // Dig out the macro definition in the existing preprocessor options.
648 StringRef MacroName = ExistingMacroNames[I];
649 std::pair<StringRef, bool> Existing = ExistingMacros[MacroName];
650
651 // Check whether we know anything about this macro name or not.
652 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/>>::iterator Known =
653 ASTFileMacros.find(MacroName);
654 if (!Validate || Known == ASTFileMacros.end()) {
655 // FIXME: Check whether this identifier was referenced anywhere in the
656 // AST file. If so, we should reject the AST file. Unfortunately, this
657 // information isn't in the control block. What shall we do about it?
658
659 if (Existing.second) {
660 SuggestedPredefines += "#undef ";
661 SuggestedPredefines += MacroName.str();
662 SuggestedPredefines += '\n';
663 } else {
664 SuggestedPredefines += "#define ";
665 SuggestedPredefines += MacroName.str();
666 SuggestedPredefines += ' ';
667 SuggestedPredefines += Existing.first.str();
668 SuggestedPredefines += '\n';
669 }
670 continue;
671 }
672
673 // If the macro was defined in one but undef'd in the other, we have a
674 // conflict.
675 if (Existing.second != Known->second.second) {
676 if (Diags) {
677 Diags->Report(diag::err_pch_macro_def_undef)
678 << MacroName << Known->second.second;
679 }
680 return true;
681 }
682
683 // If the macro was #undef'd in both, or if the macro bodies are identical,
684 // it's fine.
685 if (Existing.second || Existing.first == Known->second.first)
686 continue;
687
688 // The macro bodies differ; complain.
689 if (Diags) {
690 Diags->Report(diag::err_pch_macro_def_conflict)
691 << MacroName << Known->second.first << Existing.first;
692 }
693 return true;
694 }
695
696 // Check whether we're using predefines.
697 if (PPOpts.UsePredefines != ExistingPPOpts.UsePredefines && Validate) {
698 if (Diags) {
699 Diags->Report(diag::err_pch_undef) << ExistingPPOpts.UsePredefines;
700 }
701 return true;
702 }
703
704 // Detailed record is important since it is used for the module cache hash.
705 if (LangOpts.Modules &&
706 PPOpts.DetailedRecord != ExistingPPOpts.DetailedRecord && Validate) {
707 if (Diags) {
708 Diags->Report(diag::err_pch_pp_detailed_record) << PPOpts.DetailedRecord;
709 }
710 return true;
711 }
712
713 // Compute the #include and #include_macros lines we need.
714 for (unsigned I = 0, N = ExistingPPOpts.Includes.size(); I != N; ++I) {
715 StringRef File = ExistingPPOpts.Includes[I];
716
717 if (!ExistingPPOpts.ImplicitPCHInclude.empty() &&
718 !ExistingPPOpts.PCHThroughHeader.empty()) {
719 // In case the through header is an include, we must add all the includes
720 // to the predefines so the start point can be determined.
721 SuggestedPredefines += "#include \"";
722 SuggestedPredefines += File;
723 SuggestedPredefines += "\"\n";
724 continue;
725 }
726
727 if (File == ExistingPPOpts.ImplicitPCHInclude)
728 continue;
729
730 if (std::find(PPOpts.Includes.begin(), PPOpts.Includes.end(), File)
731 != PPOpts.Includes.end())
732 continue;
733
734 SuggestedPredefines += "#include \"";
735 SuggestedPredefines += File;
736 SuggestedPredefines += "\"\n";
737 }
738
739 for (unsigned I = 0, N = ExistingPPOpts.MacroIncludes.size(); I != N; ++I) {
740 StringRef File = ExistingPPOpts.MacroIncludes[I];
741 if (std::find(PPOpts.MacroIncludes.begin(), PPOpts.MacroIncludes.end(),
742 File)
743 != PPOpts.MacroIncludes.end())
744 continue;
745
746 SuggestedPredefines += "#__include_macros \"";
747 SuggestedPredefines += File;
748 SuggestedPredefines += "\"\n##\n";
749 }
750
751 return false;
752}
753
754bool PCHValidator::ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
755 bool Complain,
756 std::string &SuggestedPredefines) {
757 const PreprocessorOptions &ExistingPPOpts = PP.getPreprocessorOpts();
758
759 return checkPreprocessorOptions(PPOpts, ExistingPPOpts,
760 Complain? &Reader.Diags : nullptr,
761 PP.getFileManager(),
762 SuggestedPredefines,
763 PP.getLangOpts());
764}
765
766bool SimpleASTReaderListener::ReadPreprocessorOptions(
767 const PreprocessorOptions &PPOpts,
768 bool Complain,
769 std::string &SuggestedPredefines) {
770 return checkPreprocessorOptions(PPOpts,
771 PP.getPreprocessorOpts(),
772 nullptr,
773 PP.getFileManager(),
774 SuggestedPredefines,
775 PP.getLangOpts(),
776 false);
777}
778
779/// Check the header search options deserialized from the control block
780/// against the header search options in an existing preprocessor.
781///
782/// \param Diags If non-null, produce diagnostics for any mismatches incurred.
783static bool checkHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
784 StringRef SpecificModuleCachePath,
785 StringRef ExistingModuleCachePath,
786 DiagnosticsEngine *Diags,
787 const LangOptions &LangOpts,
788 const PreprocessorOptions &PPOpts) {
789 if (LangOpts.Modules) {
790 if (SpecificModuleCachePath != ExistingModuleCachePath &&
791 !PPOpts.AllowPCHWithDifferentModulesCachePath) {
792 if (Diags)
793 Diags->Report(diag::err_pch_modulecache_mismatch)
794 << SpecificModuleCachePath << ExistingModuleCachePath;
795 return true;
796 }
797 }
798
799 return false;
800}
801
802bool PCHValidator::ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
803 StringRef SpecificModuleCachePath,
804 bool Complain) {
805 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
806 PP.getHeaderSearchInfo().getModuleCachePath(),
807 Complain ? &Reader.Diags : nullptr,
808 PP.getLangOpts(), PP.getPreprocessorOpts());
809}
810
811void PCHValidator::ReadCounter(const ModuleFile &M, unsigned Value) {
812 PP.setCounterValue(Value);
813}
814
815//===----------------------------------------------------------------------===//
816// AST reader implementation
817//===----------------------------------------------------------------------===//
818
819static uint64_t readULEB(const unsigned char *&P) {
820 unsigned Length = 0;
821 const char *Error = nullptr;
822
823 uint64_t Val = llvm::decodeULEB128(P, &Length, nullptr, &Error);
824 if (Error)
825 llvm::report_fatal_error(Error);
826 P += Length;
827 return Val;
828}
829
830/// Read ULEB-encoded key length and data length.
831static std::pair<unsigned, unsigned>
832readULEBKeyDataLength(const unsigned char *&P) {
833 unsigned KeyLen = readULEB(P);
834 if ((unsigned)KeyLen != KeyLen)
835 llvm::report_fatal_error("key too large");
836
837 unsigned DataLen = readULEB(P);
838 if ((unsigned)DataLen != DataLen)
839 llvm::report_fatal_error("data too large");
840
841 return std::make_pair(KeyLen, DataLen);
842}
843
844void ASTReader::setDeserializationListener(ASTDeserializationListener *Listener,
845 bool TakeOwnership) {
846 DeserializationListener = Listener;
847 OwnsDeserializationListener = TakeOwnership;
848}
849
850unsigned ASTSelectorLookupTrait::ComputeHash(Selector Sel) {
851 return serialization::ComputeHash(Sel);
852}
853
854std::pair<unsigned, unsigned>
855ASTSelectorLookupTrait::ReadKeyDataLength(const unsigned char*& d) {
856 return readULEBKeyDataLength(d);
857}
858
859ASTSelectorLookupTrait::internal_key_type
860ASTSelectorLookupTrait::ReadKey(const unsigned char* d, unsigned) {
861 using namespace llvm::support;
862
863 SelectorTable &SelTable = Reader.getContext().Selectors;
864 unsigned N = endian::readNext<uint16_t, little, unaligned>(d);
865 IdentifierInfo *FirstII = Reader.getLocalIdentifier(
866 F, endian::readNext<uint32_t, little, unaligned>(d));
867 if (N == 0)
868 return SelTable.getNullarySelector(FirstII);
869 else if (N == 1)
870 return SelTable.getUnarySelector(FirstII);
871
872 SmallVector<IdentifierInfo *, 16> Args;
873 Args.push_back(FirstII);
874 for (unsigned I = 1; I != N; ++I)
875 Args.push_back(Reader.getLocalIdentifier(
876 F, endian::readNext<uint32_t, little, unaligned>(d)));
877
878 return SelTable.getSelector(N, Args.data());
879}
880
881ASTSelectorLookupTrait::data_type
882ASTSelectorLookupTrait::ReadData(Selector, const unsigned char* d,
883 unsigned DataLen) {
884 using namespace llvm::support;
885
886 data_type Result;
887
888 Result.ID = Reader.getGlobalSelectorID(
889 F, endian::readNext<uint32_t, little, unaligned>(d));
890 unsigned FullInstanceBits = endian::readNext<uint16_t, little, unaligned>(d);
891 unsigned FullFactoryBits = endian::readNext<uint16_t, little, unaligned>(d);
892 Result.InstanceBits = FullInstanceBits & 0x3;
893 Result.InstanceHasMoreThanOneDecl = (FullInstanceBits >> 2) & 0x1;
894 Result.FactoryBits = FullFactoryBits & 0x3;
895 Result.FactoryHasMoreThanOneDecl = (FullFactoryBits >> 2) & 0x1;
896 unsigned NumInstanceMethods = FullInstanceBits >> 3;
897 unsigned NumFactoryMethods = FullFactoryBits >> 3;
898
899 // Load instance methods
900 for (unsigned I = 0; I != NumInstanceMethods; ++I) {
901 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
902 F, endian::readNext<uint32_t, little, unaligned>(d)))
903 Result.Instance.push_back(Method);
904 }
905
906 // Load factory methods
907 for (unsigned I = 0; I != NumFactoryMethods; ++I) {
908 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
909 F, endian::readNext<uint32_t, little, unaligned>(d)))
910 Result.Factory.push_back(Method);
911 }
912
913 return Result;
914}
915
916unsigned ASTIdentifierLookupTraitBase::ComputeHash(const internal_key_type& a) {
917 return llvm::djbHash(a);
918}
919
920std::pair<unsigned, unsigned>
921ASTIdentifierLookupTraitBase::ReadKeyDataLength(const unsigned char*& d) {
922 return readULEBKeyDataLength(d);
923}
924
925ASTIdentifierLookupTraitBase::internal_key_type
926ASTIdentifierLookupTraitBase::ReadKey(const unsigned char* d, unsigned n) {
927 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 927, __extension__ __PRETTY_FUNCTION__))
;
928 return StringRef((const char*) d, n-1);
929}
930
931/// Whether the given identifier is "interesting".
932static bool isInterestingIdentifier(ASTReader &Reader, IdentifierInfo &II,
933 bool IsModule) {
934 return II.hadMacroDefinition() || II.isPoisoned() ||
935 (!IsModule && II.getObjCOrBuiltinID()) ||
936 II.hasRevertedTokenIDToIdentifier() ||
937 (!(IsModule && Reader.getPreprocessor().getLangOpts().CPlusPlus) &&
938 II.getFETokenInfo());
939}
940
941static bool readBit(unsigned &Bits) {
942 bool Value = Bits & 0x1;
943 Bits >>= 1;
944 return Value;
945}
946
947IdentID ASTIdentifierLookupTrait::ReadIdentifierID(const unsigned char *d) {
948 using namespace llvm::support;
949
950 unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d);
951 return Reader.getGlobalIdentifierID(F, RawID >> 1);
952}
953
954static void markIdentifierFromAST(ASTReader &Reader, IdentifierInfo &II) {
955 if (!II.isFromAST()) {
956 II.setIsFromAST();
957 bool IsModule = Reader.getPreprocessor().getCurrentModule() != nullptr;
958 if (isInterestingIdentifier(Reader, II, IsModule))
959 II.setChangedSinceDeserialization();
960 }
961}
962
963IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k,
964 const unsigned char* d,
965 unsigned DataLen) {
966 using namespace llvm::support;
967
968 unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d);
969 bool IsInteresting = RawID & 0x01;
970
971 // Wipe out the "is interesting" bit.
972 RawID = RawID >> 1;
973
974 // Build the IdentifierInfo and link the identifier ID with it.
975 IdentifierInfo *II = KnownII;
976 if (!II) {
977 II = &Reader.getIdentifierTable().getOwn(k);
978 KnownII = II;
979 }
980 markIdentifierFromAST(Reader, *II);
981 Reader.markIdentifierUpToDate(II);
982
983 IdentID ID = Reader.getGlobalIdentifierID(F, RawID);
984 if (!IsInteresting) {
985 // For uninteresting identifiers, there's nothing else to do. Just notify
986 // the reader that we've finished loading this identifier.
987 Reader.SetIdentifierInfo(ID, II);
988 return II;
989 }
990
991 unsigned ObjCOrBuiltinID = endian::readNext<uint16_t, little, unaligned>(d);
992 unsigned Bits = endian::readNext<uint16_t, little, unaligned>(d);
993 bool CPlusPlusOperatorKeyword = readBit(Bits);
994 bool HasRevertedTokenIDToIdentifier = readBit(Bits);
995 bool Poisoned = readBit(Bits);
996 bool ExtensionToken = readBit(Bits);
997 bool HadMacroDefinition = readBit(Bits);
998
999 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 999, __extension__ __PRETTY_FUNCTION__))
;
1000 DataLen -= 8;
1001
1002 // Set or check the various bits in the IdentifierInfo structure.
1003 // Token IDs are read-only.
1004 if (HasRevertedTokenIDToIdentifier && II->getTokenID() != tok::identifier)
1005 II->revertTokenIDToIdentifier();
1006 if (!F.isModule())
1007 II->setObjCOrBuiltinID(ObjCOrBuiltinID);
1008 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 1009, __extension__ __PRETTY_FUNCTION__))
1009 "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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 1009, __extension__ __PRETTY_FUNCTION__))
;
1010 (void)ExtensionToken;
1011 if (Poisoned)
1012 II->setIsPoisoned(true);
1013 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 1014, __extension__ __PRETTY_FUNCTION__))
1014 "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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 1014, __extension__ __PRETTY_FUNCTION__))
;
1015 (void)CPlusPlusOperatorKeyword;
1016
1017 // If this identifier is a macro, deserialize the macro
1018 // definition.
1019 if (HadMacroDefinition) {
1020 uint32_t MacroDirectivesOffset =
1021 endian::readNext<uint32_t, little, unaligned>(d);
1022 DataLen -= 4;
1023
1024 Reader.addPendingMacro(II, &F, MacroDirectivesOffset);
1025 }
1026
1027 Reader.SetIdentifierInfo(ID, II);
1028
1029 // Read all of the declarations visible at global scope with this
1030 // name.
1031 if (DataLen > 0) {
1032 SmallVector<uint32_t, 4> DeclIDs;
1033 for (; DataLen > 0; DataLen -= 4)
1034 DeclIDs.push_back(Reader.getGlobalDeclID(
1035 F, endian::readNext<uint32_t, little, unaligned>(d)));
1036 Reader.SetGloballyVisibleDecls(II, DeclIDs);
1037 }
1038
1039 return II;
1040}
1041
1042DeclarationNameKey::DeclarationNameKey(DeclarationName Name)
1043 : Kind(Name.getNameKind()) {
1044 switch (Kind) {
1045 case DeclarationName::Identifier:
1046 Data = (uint64_t)Name.getAsIdentifierInfo();
1047 break;
1048 case DeclarationName::ObjCZeroArgSelector:
1049 case DeclarationName::ObjCOneArgSelector:
1050 case DeclarationName::ObjCMultiArgSelector:
1051 Data = (uint64_t)Name.getObjCSelector().getAsOpaquePtr();
1052 break;
1053 case DeclarationName::CXXOperatorName:
1054 Data = Name.getCXXOverloadedOperator();
1055 break;
1056 case DeclarationName::CXXLiteralOperatorName:
1057 Data = (uint64_t)Name.getCXXLiteralIdentifier();
1058 break;
1059 case DeclarationName::CXXDeductionGuideName:
1060 Data = (uint64_t)Name.getCXXDeductionGuideTemplate()
1061 ->getDeclName().getAsIdentifierInfo();
1062 break;
1063 case DeclarationName::CXXConstructorName:
1064 case DeclarationName::CXXDestructorName:
1065 case DeclarationName::CXXConversionFunctionName:
1066 case DeclarationName::CXXUsingDirective:
1067 Data = 0;
1068 break;
1069 }
1070}
1071
1072unsigned DeclarationNameKey::getHash() const {
1073 llvm::FoldingSetNodeID ID;
1074 ID.AddInteger(Kind);
1075
1076 switch (Kind) {
1077 case DeclarationName::Identifier:
1078 case DeclarationName::CXXLiteralOperatorName:
1079 case DeclarationName::CXXDeductionGuideName:
1080 ID.AddString(((IdentifierInfo*)Data)->getName());
1081 break;
1082 case DeclarationName::ObjCZeroArgSelector:
1083 case DeclarationName::ObjCOneArgSelector:
1084 case DeclarationName::ObjCMultiArgSelector:
1085 ID.AddInteger(serialization::ComputeHash(Selector(Data)));
1086 break;
1087 case DeclarationName::CXXOperatorName:
1088 ID.AddInteger((OverloadedOperatorKind)Data);
1089 break;
1090 case DeclarationName::CXXConstructorName:
1091 case DeclarationName::CXXDestructorName:
1092 case DeclarationName::CXXConversionFunctionName:
1093 case DeclarationName::CXXUsingDirective:
1094 break;
1095 }
1096
1097 return ID.ComputeHash();
1098}
1099
1100ModuleFile *
1101ASTDeclContextNameLookupTrait::ReadFileRef(const unsigned char *&d) {
1102 using namespace llvm::support;
1103
1104 uint32_t ModuleFileID = endian::readNext<uint32_t, little, unaligned>(d);
1105 return Reader.getLocalModuleFile(F, ModuleFileID);
1106}
1107
1108std::pair<unsigned, unsigned>
1109ASTDeclContextNameLookupTrait::ReadKeyDataLength(const unsigned char *&d) {
1110 return readULEBKeyDataLength(d);
1111}
1112
1113ASTDeclContextNameLookupTrait::internal_key_type
1114ASTDeclContextNameLookupTrait::ReadKey(const unsigned char *d, unsigned) {
1115 using namespace llvm::support;
1116
1117 auto Kind = (DeclarationName::NameKind)*d++;
1118 uint64_t Data;
1119 switch (Kind) {
1120 case DeclarationName::Identifier:
1121 case DeclarationName::CXXLiteralOperatorName:
1122 case DeclarationName::CXXDeductionGuideName:
1123 Data = (uint64_t)Reader.getLocalIdentifier(
1124 F, endian::readNext<uint32_t, little, unaligned>(d));
1125 break;
1126 case DeclarationName::ObjCZeroArgSelector:
1127 case DeclarationName::ObjCOneArgSelector:
1128 case DeclarationName::ObjCMultiArgSelector:
1129 Data =
1130 (uint64_t)Reader.getLocalSelector(
1131 F, endian::readNext<uint32_t, little, unaligned>(
1132 d)).getAsOpaquePtr();
1133 break;
1134 case DeclarationName::CXXOperatorName:
1135 Data = *d++; // OverloadedOperatorKind
1136 break;
1137 case DeclarationName::CXXConstructorName:
1138 case DeclarationName::CXXDestructorName:
1139 case DeclarationName::CXXConversionFunctionName:
1140 case DeclarationName::CXXUsingDirective:
1141 Data = 0;
1142 break;
1143 }
1144
1145 return DeclarationNameKey(Kind, Data);
1146}
1147
1148void ASTDeclContextNameLookupTrait::ReadDataInto(internal_key_type,
1149 const unsigned char *d,
1150 unsigned DataLen,
1151 data_type_builder &Val) {
1152 using namespace llvm::support;
1153
1154 for (unsigned NumDecls = DataLen / 4; NumDecls; --NumDecls) {
1155 uint32_t LocalID = endian::readNext<uint32_t, little, unaligned>(d);
1156 Val.insert(Reader.getGlobalDeclID(F, LocalID));
1157 }
1158}
1159
1160bool ASTReader::ReadLexicalDeclContextStorage(ModuleFile &M,
1161 BitstreamCursor &Cursor,
1162 uint64_t Offset,
1163 DeclContext *DC) {
1164 assert(Offset != 0)(static_cast <bool> (Offset != 0) ? void (0) : __assert_fail
("Offset != 0", "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 1164, __extension__ __PRETTY_FUNCTION__))
;
1165
1166 SavedStreamPosition SavedPosition(Cursor);
1167 if (llvm::Error Err = Cursor.JumpToBit(Offset)) {
1168 Error(std::move(Err));
1169 return true;
1170 }
1171
1172 RecordData Record;
1173 StringRef Blob;
1174 Expected<unsigned> MaybeCode = Cursor.ReadCode();
1175 if (!MaybeCode) {
1176 Error(MaybeCode.takeError());
1177 return true;
1178 }
1179 unsigned Code = MaybeCode.get();
1180
1181 Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record, &Blob);
1182 if (!MaybeRecCode) {
1183 Error(MaybeRecCode.takeError());
1184 return true;
1185 }
1186 unsigned RecCode = MaybeRecCode.get();
1187 if (RecCode != DECL_CONTEXT_LEXICAL) {
1188 Error("Expected lexical block");
1189 return true;
1190 }
1191
1192 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 1193, __extension__ __PRETTY_FUNCTION__))
1193 "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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 1193, __extension__ __PRETTY_FUNCTION__))
;
1194 // If we are handling a C++ class template instantiation, we can see multiple
1195 // lexical updates for the same record. It's important that we select only one
1196 // of them, so that field numbering works properly. Just pick the first one we
1197 // see.
1198 auto &Lex = LexicalDecls[DC];
1199 if (!Lex.first) {
1200 Lex = std::make_pair(
1201 &M, llvm::makeArrayRef(
1202 reinterpret_cast<const llvm::support::unaligned_uint32_t *>(
1203 Blob.data()),
1204 Blob.size() / 4));
1205 }
1206 DC->setHasExternalLexicalStorage(true);
1207 return false;
1208}
1209
1210bool ASTReader::ReadVisibleDeclContextStorage(ModuleFile &M,
1211 BitstreamCursor &Cursor,
1212 uint64_t Offset,
1213 DeclID ID) {
1214 assert(Offset != 0)(static_cast <bool> (Offset != 0) ? void (0) : __assert_fail
("Offset != 0", "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 1214, __extension__ __PRETTY_FUNCTION__))
;
1215
1216 SavedStreamPosition SavedPosition(Cursor);
1217 if (llvm::Error Err = Cursor.JumpToBit(Offset)) {
1218 Error(std::move(Err));
1219 return true;
1220 }
1221
1222 RecordData Record;
1223 StringRef Blob;
1224 Expected<unsigned> MaybeCode = Cursor.ReadCode();
1225 if (!MaybeCode) {
1226 Error(MaybeCode.takeError());
1227 return true;
1228 }
1229 unsigned Code = MaybeCode.get();
1230
1231 Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record, &Blob);
1232 if (!MaybeRecCode) {
1233 Error(MaybeRecCode.takeError());
1234 return true;
1235 }
1236 unsigned RecCode = MaybeRecCode.get();
1237 if (RecCode != DECL_CONTEXT_VISIBLE) {
1238 Error("Expected visible lookup table block");
1239 return true;
1240 }
1241
1242 // We can't safely determine the primary context yet, so delay attaching the
1243 // lookup table until we're done with recursive deserialization.
1244 auto *Data = (const unsigned char*)Blob.data();
1245 PendingVisibleUpdates[ID].push_back(PendingVisibleUpdate{&M, Data});
1246 return false;
1247}
1248
1249void ASTReader::Error(StringRef Msg) const {
1250 Error(diag::err_fe_pch_malformed, Msg);
1251 if (PP.getLangOpts().Modules && !Diags.isDiagnosticInFlight() &&
1252 !PP.getHeaderSearchInfo().getModuleCachePath().empty()) {
1253 Diag(diag::note_module_cache_path)
1254 << PP.getHeaderSearchInfo().getModuleCachePath();
1255 }
1256}
1257
1258void ASTReader::Error(unsigned DiagID, StringRef Arg1, StringRef Arg2,
1259 StringRef Arg3) const {
1260 if (Diags.isDiagnosticInFlight())
1261 Diags.SetDelayedDiagnostic(DiagID, Arg1, Arg2, Arg3);
1262 else
1263 Diag(DiagID) << Arg1 << Arg2 << Arg3;
1264}
1265
1266void ASTReader::Error(llvm::Error &&Err) const {
1267 llvm::Error RemainingErr =
1268 handleErrors(std::move(Err), [this](const DiagnosticError &E) {
1269 auto Diag = E.getDiagnostic().second;
1270
1271 // Ideally we'd just emit it, but have to handle a possible in-flight
1272 // diagnostic. Note that the location is currently ignored as well.
1273 auto NumArgs = Diag.getStorage()->NumDiagArgs;
1274 assert(NumArgs <= 3 && "Can only have up to 3 arguments")(static_cast <bool> (NumArgs <= 3 && "Can only have up to 3 arguments"
) ? void (0) : __assert_fail ("NumArgs <= 3 && \"Can only have up to 3 arguments\""
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 1274, __extension__ __PRETTY_FUNCTION__))
;
1275 StringRef Arg1, Arg2, Arg3;
1276 switch (NumArgs) {
1277 case 3:
1278 Arg3 = Diag.getStringArg(2);
1279 LLVM_FALLTHROUGH[[gnu::fallthrough]];
1280 case 2:
1281 Arg2 = Diag.getStringArg(1);
1282 LLVM_FALLTHROUGH[[gnu::fallthrough]];
1283 case 1:
1284 Arg1 = Diag.getStringArg(0);
1285 }
1286 Error(Diag.getDiagID(), Arg1, Arg2, Arg3);
1287 });
1288 if (RemainingErr)
1289 Error(toString(std::move(RemainingErr)));
1290}
1291
1292//===----------------------------------------------------------------------===//
1293// Source Manager Deserialization
1294//===----------------------------------------------------------------------===//
1295
1296/// Read the line table in the source manager block.
1297void ASTReader::ParseLineTable(ModuleFile &F, const RecordData &Record) {
1298 unsigned Idx = 0;
1299 LineTableInfo &LineTable = SourceMgr.getLineTable();
1300
1301 // Parse the file names
1302 std::map<int, int> FileIDs;
1303 FileIDs[-1] = -1; // For unspecified filenames.
1304 for (unsigned I = 0; Record[Idx]; ++I) {
1305 // Extract the file name
1306 auto Filename = ReadPath(F, Record, Idx);
1307 FileIDs[I] = LineTable.getLineTableFilenameID(Filename);
1308 }
1309 ++Idx;
1310
1311 // Parse the line entries
1312 std::vector<LineEntry> Entries;
1313 while (Idx < Record.size()) {
1314 int FID = Record[Idx++];
1315 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 1315, __extension__ __PRETTY_FUNCTION__))
;
1316 // Remap FileID from 1-based old view.
1317 FID += F.SLocEntryBaseID - 1;
1318
1319 // Extract the line entries
1320 unsigned NumEntries = Record[Idx++];
1321 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 1321, __extension__ __PRETTY_FUNCTION__))
;
1322 Entries.clear();
1323 Entries.reserve(NumEntries);
1324 for (unsigned I = 0; I != NumEntries; ++I) {
1325 unsigned FileOffset = Record[Idx++];
1326 unsigned LineNo = Record[Idx++];
1327 int FilenameID = FileIDs[Record[Idx++]];
1328 SrcMgr::CharacteristicKind FileKind
1329 = (SrcMgr::CharacteristicKind)Record[Idx++];
1330 unsigned IncludeOffset = Record[Idx++];
1331 Entries.push_back(LineEntry::get(FileOffset, LineNo, FilenameID,
1332 FileKind, IncludeOffset));
1333 }
1334 LineTable.AddEntry(FileID::get(FID), Entries);
1335 }
1336}
1337
1338/// Read a source manager block
1339llvm::Error ASTReader::ReadSourceManagerBlock(ModuleFile &F) {
1340 using namespace SrcMgr;
1341
1342 BitstreamCursor &SLocEntryCursor = F.SLocEntryCursor;
1343
1344 // Set the source-location entry cursor to the current position in
1345 // the stream. This cursor will be used to read the contents of the
1346 // source manager block initially, and then lazily read
1347 // source-location entries as needed.
1348 SLocEntryCursor = F.Stream;
1349
1350 // The stream itself is going to skip over the source manager block.
1351 if (llvm::Error Err = F.Stream.SkipBlock())
1352 return Err;
1353
1354 // Enter the source manager block.
1355 if (llvm::Error Err = SLocEntryCursor.EnterSubBlock(SOURCE_MANAGER_BLOCK_ID))
1356 return Err;
1357 F.SourceManagerBlockStartOffset = SLocEntryCursor.GetCurrentBitNo();
1358
1359 RecordData Record;
1360 while (true) {
1361 Expected<llvm::BitstreamEntry> MaybeE =
1362 SLocEntryCursor.advanceSkippingSubblocks();
1363 if (!MaybeE)
1364 return MaybeE.takeError();
1365 llvm::BitstreamEntry E = MaybeE.get();
1366
1367 switch (E.Kind) {
1368 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1369 case llvm::BitstreamEntry::Error:
1370 return llvm::createStringError(std::errc::illegal_byte_sequence,
1371 "malformed block record in AST file");
1372 case llvm::BitstreamEntry::EndBlock:
1373 return llvm::Error::success();
1374 case llvm::BitstreamEntry::Record:
1375 // The interesting case.
1376 break;
1377 }
1378
1379 // Read a record.
1380 Record.clear();
1381 StringRef Blob;
1382 Expected<unsigned> MaybeRecord =
1383 SLocEntryCursor.readRecord(E.ID, Record, &Blob);
1384 if (!MaybeRecord)
1385 return MaybeRecord.takeError();
1386 switch (MaybeRecord.get()) {
1387 default: // Default behavior: ignore.
1388 break;
1389
1390 case SM_SLOC_FILE_ENTRY:
1391 case SM_SLOC_BUFFER_ENTRY:
1392 case SM_SLOC_EXPANSION_ENTRY:
1393 // Once we hit one of the source location entries, we're done.
1394 return llvm::Error::success();
1395 }
1396 }
1397}
1398
1399/// If a header file is not found at the path that we expect it to be
1400/// and the PCH file was moved from its original location, try to resolve the
1401/// file by assuming that header+PCH were moved together and the header is in
1402/// the same place relative to the PCH.
1403static std::string
1404resolveFileRelativeToOriginalDir(const std::string &Filename,
1405 const std::string &OriginalDir,
1406 const std::string &CurrDir) {
1407 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 1408, __extension__ __PRETTY_FUNCTION__))
1408 "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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 1408, __extension__ __PRETTY_FUNCTION__))
;
1409
1410 using namespace llvm::sys;
1411
1412 SmallString<128> filePath(Filename);
1413 fs::make_absolute(filePath);
1414 assert(path::is_absolute(OriginalDir))(static_cast <bool> (path::is_absolute(OriginalDir)) ? void
(0) : __assert_fail ("path::is_absolute(OriginalDir)", "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 1414, __extension__ __PRETTY_FUNCTION__))
;
1415 SmallString<128> currPCHPath(CurrDir);
1416
1417 path::const_iterator fileDirI = path::begin(path::parent_path(filePath)),
1418 fileDirE = path::end(path::parent_path(filePath));
1419 path::const_iterator origDirI = path::begin(OriginalDir),
1420 origDirE = path::end(OriginalDir);
1421 // Skip the common path components from filePath and OriginalDir.
1422 while (fileDirI != fileDirE && origDirI != origDirE &&
1423 *fileDirI == *origDirI) {
1424 ++fileDirI;
1425 ++origDirI;
1426 }
1427 for (; origDirI != origDirE; ++origDirI)
1428 path::append(currPCHPath, "..");
1429 path::append(currPCHPath, fileDirI, fileDirE);
1430 path::append(currPCHPath, path::filename(Filename));
1431 return std::string(currPCHPath.str());
1432}
1433
1434bool ASTReader::ReadSLocEntry(int ID) {
1435 if (ID == 0)
1436 return false;
1437
1438 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1439 Error("source location entry ID out-of-range for AST file");
1440 return true;
1441 }
1442
1443 // Local helper to read the (possibly-compressed) buffer data following the
1444 // entry record.
1445 auto ReadBuffer = [this](
1446 BitstreamCursor &SLocEntryCursor,
1447 StringRef Name) -> std::unique_ptr<llvm::MemoryBuffer> {
1448 RecordData Record;
1449 StringRef Blob;
1450 Expected<unsigned> MaybeCode = SLocEntryCursor.ReadCode();
1451 if (!MaybeCode) {
1452 Error(MaybeCode.takeError());
1453 return nullptr;
1454 }
1455 unsigned Code = MaybeCode.get();
1456
1457 Expected<unsigned> MaybeRecCode =
1458 SLocEntryCursor.readRecord(Code, Record, &Blob);
1459 if (!MaybeRecCode) {
1460 Error(MaybeRecCode.takeError());
1461 return nullptr;
1462 }
1463 unsigned RecCode = MaybeRecCode.get();
1464
1465 if (RecCode == SM_SLOC_BUFFER_BLOB_COMPRESSED) {
1466 if (!llvm::zlib::isAvailable()) {
1467 Error("zlib is not available");
1468 return nullptr;
1469 }
1470 SmallString<0> Uncompressed;
1471 if (llvm::Error E =
1472 llvm::zlib::uncompress(Blob, Uncompressed, Record[0])) {
1473 Error("could not decompress embedded file contents: " +
1474 llvm::toString(std::move(E)));
1475 return nullptr;
1476 }
1477 return llvm::MemoryBuffer::getMemBufferCopy(Uncompressed, Name);
1478 } else if (RecCode == SM_SLOC_BUFFER_BLOB) {
1479 return llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name, true);
1480 } else {
1481 Error("AST record has invalid code");
1482 return nullptr;
1483 }
1484 };
1485
1486 ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second;
1487 if (llvm::Error Err = F->SLocEntryCursor.JumpToBit(
1488 F->SLocEntryOffsetsBase +
1489 F->SLocEntryOffsets[ID - F->SLocEntryBaseID])) {
1490 Error(std::move(Err));
1491 return true;
1492 }
1493
1494 BitstreamCursor &SLocEntryCursor = F->SLocEntryCursor;
1495 SourceLocation::UIntTy BaseOffset = F->SLocEntryBaseOffset;
1496
1497 ++NumSLocEntriesRead;
1498 Expected<llvm::BitstreamEntry> MaybeEntry = SLocEntryCursor.advance();
1499 if (!MaybeEntry) {
1500 Error(MaybeEntry.takeError());
1501 return true;
1502 }
1503 llvm::BitstreamEntry Entry = MaybeEntry.get();
1504
1505 if (Entry.Kind != llvm::BitstreamEntry::Record) {
1506 Error("incorrectly-formatted source location entry in AST file");
1507 return true;
1508 }
1509
1510 RecordData Record;
1511 StringRef Blob;
1512 Expected<unsigned> MaybeSLOC =
1513 SLocEntryCursor.readRecord(Entry.ID, Record, &Blob);
1514 if (!MaybeSLOC) {
1515 Error(MaybeSLOC.takeError());
1516 return true;
1517 }
1518 switch (MaybeSLOC.get()) {
1519 default:
1520 Error("incorrectly-formatted source location entry in AST file");
1521 return true;
1522
1523 case SM_SLOC_FILE_ENTRY: {
1524 // We will detect whether a file changed and return 'Failure' for it, but
1525 // we will also try to fail gracefully by setting up the SLocEntry.
1526 unsigned InputID = Record[4];
1527 InputFile IF = getInputFile(*F, InputID);
1528 Optional<FileEntryRef> File = IF.getFile();
1529 bool OverriddenBuffer = IF.isOverridden();
1530
1531 // Note that we only check if a File was returned. If it was out-of-date
1532 // we have complained but we will continue creating a FileID to recover
1533 // gracefully.
1534 if (!File)
1535 return true;
1536
1537 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
1538 if (IncludeLoc.isInvalid() && F->Kind != MK_MainFile) {
1539 // This is the module's main file.
1540 IncludeLoc = getImportLocation(F);
1541 }
1542 SrcMgr::CharacteristicKind
1543 FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
1544 FileID FID = SourceMgr.createFileID(*File, IncludeLoc, FileCharacter, ID,
1545 BaseOffset + Record[0]);
1546 SrcMgr::FileInfo &FileInfo =
1547 const_cast<SrcMgr::FileInfo&>(SourceMgr.getSLocEntry(FID).getFile());
1548 FileInfo.NumCreatedFIDs = Record[5];
1549 if (Record[3])
1550 FileInfo.setHasLineDirectives();
1551
1552 unsigned NumFileDecls = Record[7];
1553 if (NumFileDecls && ContextObj) {
1554 const DeclID *FirstDecl = F->FileSortedDecls + Record[6];
1555 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 1555, __extension__ __PRETTY_FUNCTION__))
;
1556 FileDeclIDs[FID] = FileDeclsInfo(F, llvm::makeArrayRef(FirstDecl,
1557 NumFileDecls));
1558 }
1559
1560 const SrcMgr::ContentCache &ContentCache =
1561 SourceMgr.getOrCreateContentCache(*File, isSystem(FileCharacter));
1562 if (OverriddenBuffer && !ContentCache.BufferOverridden &&
1563 ContentCache.ContentsEntry == ContentCache.OrigEntry &&
1564 !ContentCache.getBufferIfLoaded()) {
1565 auto Buffer = ReadBuffer(SLocEntryCursor, File->getName());
1566 if (!Buffer)
1567 return true;
1568 SourceMgr.overrideFileContents(*File, std::move(Buffer));
1569 }
1570
1571 break;
1572 }
1573
1574 case SM_SLOC_BUFFER_ENTRY: {
1575 const char *Name = Blob.data();
1576 unsigned Offset = Record[0];
1577 SrcMgr::CharacteristicKind
1578 FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
1579 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
1580 if (IncludeLoc.isInvalid() && F->isModule()) {
1581 IncludeLoc = getImportLocation(F);
1582 }
1583
1584 auto Buffer = ReadBuffer(SLocEntryCursor, Name);
1585 if (!Buffer)
1586 return true;
1587 SourceMgr.createFileID(std::move(Buffer), FileCharacter, ID,
1588 BaseOffset + Offset, IncludeLoc);
1589 break;
1590 }
1591
1592 case SM_SLOC_EXPANSION_ENTRY: {
1593 SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1]);
1594 SourceMgr.createExpansionLoc(SpellingLoc,
1595 ReadSourceLocation(*F, Record[2]),
1596 ReadSourceLocation(*F, Record[3]),
1597 Record[5],
1598 Record[4],
1599 ID,
1600 BaseOffset + Record[0]);
1601 break;
1602 }
1603 }
1604
1605 return false;
1606}
1607
1608std::pair<SourceLocation, StringRef> ASTReader::getModuleImportLoc(int ID) {
1609 if (ID == 0)
1610 return std::make_pair(SourceLocation(), "");
1611
1612 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1613 Error("source location entry ID out-of-range for AST file");
1614 return std::make_pair(SourceLocation(), "");
1615 }
1616
1617 // Find which module file this entry lands in.
1618 ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second;
1619 if (!M->isModule())
1620 return std::make_pair(SourceLocation(), "");
1621
1622 // FIXME: Can we map this down to a particular submodule? That would be
1623 // ideal.
1624 return std::make_pair(M->ImportLoc, StringRef(M->ModuleName));
1625}
1626
1627/// Find the location where the module F is imported.
1628SourceLocation ASTReader::getImportLocation(ModuleFile *F) {
1629 if (F->ImportLoc.isValid())
1630 return F->ImportLoc;
1631
1632 // Otherwise we have a PCH. It's considered to be "imported" at the first
1633 // location of its includer.
1634 if (F->ImportedBy.empty() || !F->ImportedBy[0]) {
1635 // Main file is the importer.
1636 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 1636, __extension__ __PRETTY_FUNCTION__))
;
1637 return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID());
1638 }
1639 return F->ImportedBy[0]->FirstLoc;
1640}
1641
1642/// Enter a subblock of the specified BlockID with the specified cursor. Read
1643/// the abbreviations that are at the top of the block and then leave the cursor
1644/// pointing into the block.
1645llvm::Error ASTReader::ReadBlockAbbrevs(BitstreamCursor &Cursor,
1646 unsigned BlockID,
1647 uint64_t *StartOfBlockOffset) {
1648 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID))
1649 return Err;
1650
1651 if (StartOfBlockOffset)
1652 *StartOfBlockOffset = Cursor.GetCurrentBitNo();
1653
1654 while (true) {
1655 uint64_t Offset = Cursor.GetCurrentBitNo();
1656 Expected<unsigned> MaybeCode = Cursor.ReadCode();
1657 if (!MaybeCode)
1658 return MaybeCode.takeError();
1659 unsigned Code = MaybeCode.get();
1660
1661 // We expect all abbrevs to be at the start of the block.
1662 if (Code != llvm::bitc::DEFINE_ABBREV) {
1663 if (llvm::Error Err = Cursor.JumpToBit(Offset))
1664 return Err;
1665 return llvm::Error::success();
1666 }
1667 if (llvm::Error Err = Cursor.ReadAbbrevRecord())
1668 return Err;
1669 }
1670}
1671
1672Token ASTReader::ReadToken(ModuleFile &F, const RecordDataImpl &Record,
1673 unsigned &Idx) {
1674 Token Tok;
1675 Tok.startToken();
1676 Tok.setLocation(ReadSourceLocation(F, Record, Idx));
1677 Tok.setLength(Record[Idx++]);
1678 if (IdentifierInfo *II = getLocalIdentifier(F, Record[Idx++]))
1679 Tok.setIdentifierInfo(II);
1680 Tok.setKind((tok::TokenKind)Record[Idx++]);
1681 Tok.setFlag((Token::TokenFlags)Record[Idx++]);
1682 return Tok;
1683}
1684
1685MacroInfo *ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) {
1686 BitstreamCursor &Stream = F.MacroCursor;
1687
1688 // Keep track of where we are in the stream, then jump back there
1689 // after reading this macro.
1690 SavedStreamPosition SavedPosition(Stream);
1691
1692 if (llvm::Error Err = Stream.JumpToBit(Offset)) {
1693 // FIXME this drops errors on the floor.
1694 consumeError(std::move(Err));
1695 return nullptr;
1696 }
1697 RecordData Record;
1698 SmallVector<IdentifierInfo*, 16> MacroParams;
1699 MacroInfo *Macro = nullptr;
1700
1701 while (true) {
1702 // Advance to the next record, but if we get to the end of the block, don't
1703 // pop it (removing all the abbreviations from the cursor) since we want to
1704 // be able to reseek within the block and read entries.
1705 unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd;
1706 Expected<llvm::BitstreamEntry> MaybeEntry =
1707 Stream.advanceSkippingSubblocks(Flags);
1708 if (!MaybeEntry) {
1709 Error(MaybeEntry.takeError());
1710 return Macro;
1711 }
1712 llvm::BitstreamEntry Entry = MaybeEntry.get();
1713
1714 switch (Entry.Kind) {
1715 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1716 case llvm::BitstreamEntry::Error:
1717 Error("malformed block record in AST file");
1718 return Macro;
1719 case llvm::BitstreamEntry::EndBlock:
1720 return Macro;
1721 case llvm::BitstreamEntry::Record:
1722 // The interesting case.
1723 break;
1724 }
1725
1726 // Read a record.
1727 Record.clear();
1728 PreprocessorRecordTypes RecType;
1729 if (Expected<unsigned> MaybeRecType = Stream.readRecord(Entry.ID, Record))
1730 RecType = (PreprocessorRecordTypes)MaybeRecType.get();
1731 else {
1732 Error(MaybeRecType.takeError());
1733 return Macro;
1734 }
1735 switch (RecType) {
1736 case PP_MODULE_MACRO:
1737 case PP_MACRO_DIRECTIVE_HISTORY:
1738 return Macro;
1739
1740 case PP_MACRO_OBJECT_LIKE:
1741 case PP_MACRO_FUNCTION_LIKE: {
1742 // If we already have a macro, that means that we've hit the end
1743 // of the definition of the macro we were looking for. We're
1744 // done.
1745 if (Macro)
1746 return Macro;
1747
1748 unsigned NextIndex = 1; // Skip identifier ID.
1749 SourceLocation Loc = ReadSourceLocation(F, Record, NextIndex);
1750 MacroInfo *MI = PP.AllocateMacroInfo(Loc);
1751 MI->setDefinitionEndLoc(ReadSourceLocation(F, Record, NextIndex));
1752 MI->setIsUsed(Record[NextIndex++]);
1753 MI->setUsedForHeaderGuard(Record[NextIndex++]);
1754
1755 if (RecType == PP_MACRO_FUNCTION_LIKE) {
1756 // Decode function-like macro info.
1757 bool isC99VarArgs = Record[NextIndex++];
1758 bool isGNUVarArgs = Record[NextIndex++];
1759 bool hasCommaPasting = Record[NextIndex++];
1760 MacroParams.clear();
1761 unsigned NumArgs = Record[NextIndex++];
1762 for (unsigned i = 0; i != NumArgs; ++i)
1763 MacroParams.push_back(getLocalIdentifier(F, Record[NextIndex++]));
1764
1765 // Install function-like macro info.
1766 MI->setIsFunctionLike();
1767 if (isC99VarArgs) MI->setIsC99Varargs();
1768 if (isGNUVarArgs) MI->setIsGNUVarargs();
1769 if (hasCommaPasting) MI->setHasCommaPasting();
1770 MI->setParameterList(MacroParams, PP.getPreprocessorAllocator());
1771 }
1772
1773 // Remember that we saw this macro last so that we add the tokens that
1774 // form its body to it.
1775 Macro = MI;
1776
1777 if (NextIndex + 1 == Record.size() && PP.getPreprocessingRecord() &&
1778 Record[NextIndex]) {
1779 // We have a macro definition. Register the association
1780 PreprocessedEntityID
1781 GlobalID = getGlobalPreprocessedEntityID(F, Record[NextIndex]);
1782 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
1783 PreprocessingRecord::PPEntityID PPID =
1784 PPRec.getPPEntityID(GlobalID - 1, /*isLoaded=*/true);
1785 MacroDefinitionRecord *PPDef = cast_or_null<MacroDefinitionRecord>(
1786 PPRec.getPreprocessedEntity(PPID));
1787 if (PPDef)
1788 PPRec.RegisterMacroDefinition(Macro, PPDef);
1789 }
1790
1791 ++NumMacrosRead;
1792 break;
1793 }
1794
1795 case PP_TOKEN: {
1796 // If we see a TOKEN before a PP_MACRO_*, then the file is
1797 // erroneous, just pretend we didn't see this.
1798 if (!Macro) break;
1799
1800 unsigned Idx = 0;
1801 Token Tok = ReadToken(F, Record, Idx);
1802 Macro->AddTokenToBody(Tok);
1803 break;
1804 }
1805 }
1806 }
1807}
1808
1809PreprocessedEntityID
1810ASTReader::getGlobalPreprocessedEntityID(ModuleFile &M,
1811 unsigned LocalID) const {
1812 if (!M.ModuleOffsetMap.empty())
1813 ReadModuleOffsetMap(M);
1814
1815 ContinuousRangeMap<uint32_t, int, 2>::const_iterator
1816 I = M.PreprocessedEntityRemap.find(LocalID - NUM_PREDEF_PP_ENTITY_IDS);
1817 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 1818, __extension__ __PRETTY_FUNCTION__))
1818 && "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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 1818, __extension__ __PRETTY_FUNCTION__))
;
1819
1820 return LocalID + I->second;
1821}
1822
1823unsigned HeaderFileInfoTrait::ComputeHash(internal_key_ref ikey) {
1824 return llvm::hash_combine(ikey.Size, ikey.ModTime);
1825}
1826
1827HeaderFileInfoTrait::internal_key_type
1828HeaderFileInfoTrait::GetInternalKey(const FileEntry *FE) {
1829 internal_key_type ikey = {FE->getSize(),
1830 M.HasTimestamps ? FE->getModificationTime() : 0,
1831 FE->getName(), /*Imported*/ false};
1832 return ikey;
1833}
1834
1835bool HeaderFileInfoTrait::EqualKey(internal_key_ref a, internal_key_ref b) {
1836 if (a.Size != b.Size || (a.ModTime && b.ModTime && a.ModTime != b.ModTime))
1837 return false;
1838
1839 if (llvm::sys::path::is_absolute(a.Filename) && a.Filename == b.Filename)
1840 return true;
1841
1842 // Determine whether the actual files are equivalent.
1843 FileManager &FileMgr = Reader.getFileManager();
1844 auto GetFile = [&](const internal_key_type &Key) -> const FileEntry* {
1845 if (!Key.Imported) {
1846 if (auto File = FileMgr.getFile(Key.Filename))
1847 return *File;
1848 return nullptr;
1849 }
1850
1851 std::string Resolved = std::string(Key.Filename);
1852 Reader.ResolveImportedPath(M, Resolved);
1853 if (auto File = FileMgr.getFile(Resolved))
1854 return *File;
1855 return nullptr;
1856 };
1857
1858 const FileEntry *FEA = GetFile(a);
1859 const FileEntry *FEB = GetFile(b);
1860 return FEA && FEA == FEB;
1861}
1862
1863std::pair<unsigned, unsigned>
1864HeaderFileInfoTrait::ReadKeyDataLength(const unsigned char*& d) {
1865 return readULEBKeyDataLength(d);
1866}
1867
1868HeaderFileInfoTrait::internal_key_type
1869HeaderFileInfoTrait::ReadKey(const unsigned char *d, unsigned) {
1870 using namespace llvm::support;
1871
1872 internal_key_type ikey;
1873 ikey.Size = off_t(endian::readNext<uint64_t, little, unaligned>(d));
1874 ikey.ModTime = time_t(endian::readNext<uint64_t, little, unaligned>(d));
1875 ikey.Filename = (const char *)d;
1876 ikey.Imported = true;
1877 return ikey;
1878}
1879
1880HeaderFileInfoTrait::data_type
1881HeaderFileInfoTrait::ReadData(internal_key_ref key, const unsigned char *d,
1882 unsigned DataLen) {
1883 using namespace llvm::support;
1884
1885 const unsigned char *End = d + DataLen;
1886 HeaderFileInfo HFI;
1887 unsigned Flags = *d++;
1888 // FIXME: Refactor with mergeHeaderFileInfo in HeaderSearch.cpp.
1889 HFI.isImport |= (Flags >> 5) & 0x01;
1890 HFI.isPragmaOnce |= (Flags >> 4) & 0x01;
1891 HFI.DirInfo = (Flags >> 1) & 0x07;
1892 HFI.IndexHeaderMapHeader = Flags & 0x01;
1893 // FIXME: Find a better way to handle this. Maybe just store a
1894 // "has been included" flag?
1895 HFI.NumIncludes = std::max(endian::readNext<uint16_t, little, unaligned>(d),
1896 HFI.NumIncludes);
1897 HFI.ControllingMacroID = Reader.getGlobalIdentifierID(
1898 M, endian::readNext<uint32_t, little, unaligned>(d));
1899 if (unsigned FrameworkOffset =
1900 endian::readNext<uint32_t, little, unaligned>(d)) {
1901 // The framework offset is 1 greater than the actual offset,
1902 // since 0 is used as an indicator for "no framework name".
1903 StringRef FrameworkName(FrameworkStrings + FrameworkOffset - 1);
1904 HFI.Framework = HS->getUniqueFrameworkName(FrameworkName);
1905 }
1906
1907 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 1908, __extension__ __PRETTY_FUNCTION__))
1908 "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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 1908, __extension__ __PRETTY_FUNCTION__))
;
1909 while (d != End) {
1910 uint32_t LocalSMID = endian::readNext<uint32_t, little, unaligned>(d);
1911 auto HeaderRole = static_cast<ModuleMap::ModuleHeaderRole>(LocalSMID & 3);
1912 LocalSMID >>= 2;
1913
1914 // This header is part of a module. Associate it with the module to enable
1915 // implicit module import.
1916 SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID);
1917 Module *Mod = Reader.getSubmodule(GlobalSMID);
1918 FileManager &FileMgr = Reader.getFileManager();
1919 ModuleMap &ModMap =
1920 Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap();
1921
1922 std::string Filename = std::string(key.Filename);
1923 if (key.Imported)
1924 Reader.ResolveImportedPath(M, Filename);
1925 // FIXME: NameAsWritten
1926 Module::Header H = {std::string(key.Filename), "",
1927 *FileMgr.getFile(Filename)};
1928 ModMap.addHeader(Mod, H, HeaderRole, /*Imported*/true);
1929 HFI.isModuleHeader |= !(HeaderRole & ModuleMap::TextualHeader);
1930 }
1931
1932 // This HeaderFileInfo was externally loaded.
1933 HFI.External = true;
1934 HFI.IsValid = true;
1935 return HFI;
1936}
1937
1938void ASTReader::addPendingMacro(IdentifierInfo *II, ModuleFile *M,
1939 uint32_t MacroDirectivesOffset) {
1940 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 1940, __extension__ __PRETTY_FUNCTION__))
;
1941 PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset));
1942}
1943
1944void ASTReader::ReadDefinedMacros() {
1945 // Note that we are loading defined macros.
1946 Deserializing Macros(this);
1947
1948 for (ModuleFile &I : llvm::reverse(ModuleMgr)) {
1949 BitstreamCursor &MacroCursor = I.MacroCursor;
1950
1951 // If there was no preprocessor block, skip this file.
1952 if (MacroCursor.getBitcodeBytes().empty())
1953 continue;
1954
1955 BitstreamCursor Cursor = MacroCursor;
1956 if (llvm::Error Err = Cursor.JumpToBit(I.MacroStartOffset)) {
1957 Error(std::move(Err));
1958 return;
1959 }
1960
1961 RecordData Record;
1962 while (true) {
1963 Expected<llvm::BitstreamEntry> MaybeE = Cursor.advanceSkippingSubblocks();
1964 if (!MaybeE) {
1965 Error(MaybeE.takeError());
1966 return;
1967 }
1968 llvm::BitstreamEntry E = MaybeE.get();
1969
1970 switch (E.Kind) {
1971 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1972 case llvm::BitstreamEntry::Error:
1973 Error("malformed block record in AST file");
1974 return;
1975 case llvm::BitstreamEntry::EndBlock:
1976 goto NextCursor;
1977
1978 case llvm::BitstreamEntry::Record: {
1979 Record.clear();
1980 Expected<unsigned> MaybeRecord = Cursor.readRecord(E.ID, Record);
1981 if (!MaybeRecord) {
1982 Error(MaybeRecord.takeError());
1983 return;
1984 }
1985 switch (MaybeRecord.get()) {
1986 default: // Default behavior: ignore.
1987 break;
1988
1989 case PP_MACRO_OBJECT_LIKE:
1990 case PP_MACRO_FUNCTION_LIKE: {
1991 IdentifierInfo *II = getLocalIdentifier(I, Record[0]);
1992 if (II->isOutOfDate())
1993 updateOutOfDateIdentifier(*II);
1994 break;
1995 }
1996
1997 case PP_TOKEN:
1998 // Ignore tokens.
1999 break;
2000 }
2001 break;
2002 }
2003 }
2004 }
2005 NextCursor: ;
2006 }
2007}
2008
2009namespace {
2010
2011 /// Visitor class used to look up identifirs in an AST file.
2012 class IdentifierLookupVisitor {
2013 StringRef Name;
2014 unsigned NameHash;
2015 unsigned PriorGeneration;
2016 unsigned &NumIdentifierLookups;
2017 unsigned &NumIdentifierLookupHits;
2018 IdentifierInfo *Found = nullptr;
2019
2020 public:
2021 IdentifierLookupVisitor(StringRef Name, unsigned PriorGeneration,
2022 unsigned &NumIdentifierLookups,
2023 unsigned &NumIdentifierLookupHits)
2024 : Name(Name), NameHash(ASTIdentifierLookupTrait::ComputeHash(Name)),
2025 PriorGeneration(PriorGeneration),
2026 NumIdentifierLookups(NumIdentifierLookups),
2027 NumIdentifierLookupHits(NumIdentifierLookupHits) {}
2028
2029 bool operator()(ModuleFile &M) {
2030 // If we've already searched this module file, skip it now.
2031 if (M.Generation <= PriorGeneration)
2032 return true;
2033
2034 ASTIdentifierLookupTable *IdTable
2035 = (ASTIdentifierLookupTable *)M.IdentifierLookupTable;
2036 if (!IdTable)
2037 return false;
2038
2039 ASTIdentifierLookupTrait Trait(IdTable->getInfoObj().getReader(), M,
2040 Found);
2041 ++NumIdentifierLookups;
2042 ASTIdentifierLookupTable::iterator Pos =
2043 IdTable->find_hashed(Name, NameHash, &Trait);
2044 if (Pos == IdTable->end())
2045 return false;
2046
2047 // Dereferencing the iterator has the effect of building the
2048 // IdentifierInfo node and populating it with the various
2049 // declarations it needs.
2050 ++NumIdentifierLookupHits;
2051 Found = *Pos;
2052 return true;
2053 }
2054
2055 // Retrieve the identifier info found within the module
2056 // files.
2057 IdentifierInfo *getIdentifierInfo() const { return Found; }
2058 };
2059
2060} // namespace
2061
2062void ASTReader::updateOutOfDateIdentifier(IdentifierInfo &II) {
2063 // Note that we are loading an identifier.
2064 Deserializing AnIdentifier(this);
2065
2066 unsigned PriorGeneration = 0;
2067 if (getContext().getLangOpts().Modules)
2068 PriorGeneration = IdentifierGeneration[&II];
2069
2070 // If there is a global index, look there first to determine which modules
2071 // provably do not have any results for this identifier.
2072 GlobalModuleIndex::HitSet Hits;
2073 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
2074 if (!loadGlobalIndex()) {
2075 if (GlobalIndex->lookupIdentifier(II.getName(), Hits)) {
2076 HitsPtr = &Hits;
2077 }
2078 }
2079
2080 IdentifierLookupVisitor Visitor(II.getName(), PriorGeneration,
2081 NumIdentifierLookups,
2082 NumIdentifierLookupHits);
2083 ModuleMgr.visit(Visitor, HitsPtr);
2084 markIdentifierUpToDate(&II);
2085}
2086
2087void ASTReader::markIdentifierUpToDate(IdentifierInfo *II) {
2088 if (!II)
2089 return;
2090
2091 II->setOutOfDate(false);
2092
2093 // Update the generation for this identifier.
2094 if (getContext().getLangOpts().Modules)
2095 IdentifierGeneration[II] = getGeneration();
2096}
2097
2098void ASTReader::resolvePendingMacro(IdentifierInfo *II,
2099 const PendingMacroInfo &PMInfo) {
2100 ModuleFile &M = *PMInfo.M;
2101
2102 BitstreamCursor &Cursor = M.MacroCursor;
2103 SavedStreamPosition SavedPosition(Cursor);
2104 if (llvm::Error Err =
2105 Cursor.JumpToBit(M.MacroOffsetsBase + PMInfo.MacroDirectivesOffset)) {
2106 Error(std::move(Err));
2107 return;
2108 }
2109
2110 struct ModuleMacroRecord {
2111 SubmoduleID SubModID;
2112 MacroInfo *MI;
2113 SmallVector<SubmoduleID, 8> Overrides;
2114 };
2115 llvm::SmallVector<ModuleMacroRecord, 8> ModuleMacros;
2116
2117 // We expect to see a sequence of PP_MODULE_MACRO records listing exported
2118 // macros, followed by a PP_MACRO_DIRECTIVE_HISTORY record with the complete
2119 // macro histroy.
2120 RecordData Record;
2121 while (true) {
2122 Expected<llvm::BitstreamEntry> MaybeEntry =
2123 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
2124 if (!MaybeEntry) {
2125 Error(MaybeEntry.takeError());
2126 return;
2127 }
2128 llvm::BitstreamEntry Entry = MaybeEntry.get();
2129
2130 if (Entry.Kind != llvm::BitstreamEntry::Record) {
2131 Error("malformed block record in AST file");
2132 return;
2133 }
2134
2135 Record.clear();
2136 Expected<unsigned> MaybePP = Cursor.readRecord(Entry.ID, Record);
2137 if (!MaybePP) {
2138 Error(MaybePP.takeError());
2139 return;
2140 }
2141 switch ((PreprocessorRecordTypes)MaybePP.get()) {
2142 case PP_MACRO_DIRECTIVE_HISTORY:
2143 break;
2144
2145 case PP_MODULE_MACRO: {
2146 ModuleMacros.push_back(ModuleMacroRecord());
2147 auto &Info = ModuleMacros.back();
2148 Info.SubModID = getGlobalSubmoduleID(M, Record[0]);
2149 Info.MI = getMacro(getGlobalMacroID(M, Record[1]));
2150 for (int I = 2, N = Record.size(); I != N; ++I)
2151 Info.Overrides.push_back(getGlobalSubmoduleID(M, Record[I]));
2152 continue;
2153 }
2154
2155 default:
2156 Error("malformed block record in AST file");
2157 return;
2158 }
2159
2160 // We found the macro directive history; that's the last record
2161 // for this macro.
2162 break;
2163 }
2164
2165 // Module macros are listed in reverse dependency order.
2166 {
2167 std::reverse(ModuleMacros.begin(), ModuleMacros.end());
2168 llvm::SmallVector<ModuleMacro*, 8> Overrides;
2169 for (auto &MMR : ModuleMacros) {
2170 Overrides.clear();
2171 for (unsigned ModID : MMR.Overrides) {
2172 Module *Mod = getSubmodule(ModID);
2173 auto *Macro = PP.getModuleMacro(Mod, II);
2174 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 2174, __extension__ __PRETTY_FUNCTION__))
;
2175 Overrides.push_back(Macro);
2176 }
2177
2178 bool Inserted = false;
2179 Module *Owner = getSubmodule(MMR.SubModID);
2180 PP.addModuleMacro(Owner, II, MMR.MI, Overrides, Inserted);
2181 }
2182 }
2183
2184 // Don't read the directive history for a module; we don't have anywhere
2185 // to put it.
2186 if (M.isModule())
2187 return;
2188
2189 // Deserialize the macro directives history in reverse source-order.
2190 MacroDirective *Latest = nullptr, *Earliest = nullptr;
2191 unsigned Idx = 0, N = Record.size();
2192 while (Idx < N) {
2193 MacroDirective *MD = nullptr;
2194 SourceLocation Loc = ReadSourceLocation(M, Record, Idx);
2195 MacroDirective::Kind K = (MacroDirective::Kind)Record[Idx++];
2196 switch (K) {
2197 case MacroDirective::MD_Define: {
2198 MacroInfo *MI = getMacro(getGlobalMacroID(M, Record[Idx++]));
2199 MD = PP.AllocateDefMacroDirective(MI, Loc);
2200 break;
2201 }
2202 case MacroDirective::MD_Undefine:
2203 MD = PP.AllocateUndefMacroDirective(Loc);
2204 break;
2205 case MacroDirective::MD_Visibility:
2206 bool isPublic = Record[Idx++];
2207 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic);
2208 break;
2209 }
2210
2211 if (!Latest)
2212 Latest = MD;
2213 if (Earliest)
2214 Earliest->setPrevious(MD);
2215 Earliest = MD;
2216 }
2217
2218 if (Latest)
2219 PP.setLoadedMacroDirective(II, Earliest, Latest);
2220}
2221
2222bool ASTReader::shouldDisableValidationForFile(
2223 const serialization::ModuleFile &M) const {
2224 if (DisableValidationKind == DisableValidationForModuleKind::None)
2225 return false;
2226
2227 // If a PCH is loaded and validation is disabled for PCH then disable
2228 // validation for the PCH and the modules it loads.
2229 ModuleKind K = CurrentDeserializingModuleKind.getValueOr(M.Kind);
2230
2231 switch (K) {
2232 case MK_MainFile:
2233 case MK_Preamble:
2234 case MK_PCH:
2235 return bool(DisableValidationKind & DisableValidationForModuleKind::PCH);
2236 case MK_ImplicitModule:
2237 case MK_ExplicitModule:
2238 case MK_PrebuiltModule:
2239 return bool(DisableValidationKind & DisableValidationForModuleKind::Module);
2240 }
2241
2242 return false;
2243}
2244
2245ASTReader::InputFileInfo
2246ASTReader::readInputFileInfo(ModuleFile &F, unsigned ID) {
2247 // Go find this input file.
2248 BitstreamCursor &Cursor = F.InputFilesCursor;
2249 SavedStreamPosition SavedPosition(Cursor);
2250 if (llvm::Error Err = Cursor.JumpToBit(F.InputFileOffsets[ID - 1])) {
2251 // FIXME this drops errors on the floor.
2252 consumeError(std::move(Err));
2253 }
2254
2255 Expected<unsigned> MaybeCode = Cursor.ReadCode();
2256 if (!MaybeCode) {
2257 // FIXME this drops errors on the floor.
2258 consumeError(MaybeCode.takeError());
2259 }
2260 unsigned Code = MaybeCode.get();
2261 RecordData Record;
2262 StringRef Blob;
2263
2264 if (Expected<unsigned> Maybe = Cursor.readRecord(Code, Record, &Blob))
2265 assert(static_cast<InputFileRecordTypes>(Maybe.get()) == INPUT_FILE &&(static_cast <bool> (static_cast<InputFileRecordTypes
>(Maybe.get()) == INPUT_FILE && "invalid record type for input file"
) ? void (0) : __assert_fail ("static_cast<InputFileRecordTypes>(Maybe.get()) == INPUT_FILE && \"invalid record type for input file\""
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 2266, __extension__ __PRETTY_FUNCTION__))
2266 "invalid record type for input file")(static_cast <bool> (static_cast<InputFileRecordTypes
>(Maybe.get()) == INPUT_FILE && "invalid record type for input file"
) ? void (0) : __assert_fail ("static_cast<InputFileRecordTypes>(Maybe.get()) == INPUT_FILE && \"invalid record type for input file\""
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 2266, __extension__ __PRETTY_FUNCTION__))
;
2267 else {
2268 // FIXME this drops errors on the floor.
2269 consumeError(Maybe.takeError());
2270 }
2271
2272 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 2272, __extension__ __PRETTY_FUNCTION__))
;
2273 InputFileInfo R;
2274 R.StoredSize = static_cast<off_t>(Record[1]);
2275 R.StoredTime = static_cast<time_t>(Record[2]);
2276 R.Overridden = static_cast<bool>(Record[3]);
2277 R.Transient = static_cast<bool>(Record[4]);
2278 R.TopLevelModuleMap = static_cast<bool>(Record[5]);
2279 R.Filename = std::string(Blob);
2280 ResolveImportedPath(F, R.Filename);
2281
2282 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance();
2283 if (!MaybeEntry) // FIXME this drops errors on the floor.
2284 consumeError(MaybeEntry.takeError());
2285 llvm::BitstreamEntry Entry = MaybeEntry.get();
2286 assert(Entry.Kind == llvm::BitstreamEntry::Record &&(static_cast <bool> (Entry.Kind == llvm::BitstreamEntry
::Record && "expected record type for input file hash"
) ? void (0) : __assert_fail ("Entry.Kind == llvm::BitstreamEntry::Record && \"expected record type for input file hash\""
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 2287, __extension__ __PRETTY_FUNCTION__))
2287 "expected record type for input file hash")(static_cast <bool> (Entry.Kind == llvm::BitstreamEntry
::Record && "expected record type for input file hash"
) ? void (0) : __assert_fail ("Entry.Kind == llvm::BitstreamEntry::Record && \"expected record type for input file hash\""
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 2287, __extension__ __PRETTY_FUNCTION__))
;
2288
2289 Record.clear();
2290 if (Expected<unsigned> Maybe = Cursor.readRecord(Entry.ID, Record))
2291 assert(static_cast<InputFileRecordTypes>(Maybe.get()) == INPUT_FILE_HASH &&(static_cast <bool> (static_cast<InputFileRecordTypes
>(Maybe.get()) == INPUT_FILE_HASH && "invalid record type for input file hash"
) ? void (0) : __assert_fail ("static_cast<InputFileRecordTypes>(Maybe.get()) == INPUT_FILE_HASH && \"invalid record type for input file hash\""
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 2292, __extension__ __PRETTY_FUNCTION__))
2292 "invalid record type for input file hash")(static_cast <bool> (static_cast<InputFileRecordTypes
>(Maybe.get()) == INPUT_FILE_HASH && "invalid record type for input file hash"
) ? void (0) : __assert_fail ("static_cast<InputFileRecordTypes>(Maybe.get()) == INPUT_FILE_HASH && \"invalid record type for input file hash\""
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 2292, __extension__ __PRETTY_FUNCTION__))
;
2293 else {
2294 // FIXME this drops errors on the floor.
2295 consumeError(Maybe.takeError());
2296 }
2297 R.ContentHash = (static_cast<uint64_t>(Record[1]) << 32) |
2298 static_cast<uint64_t>(Record[0]);
2299 return R;
2300}
2301
2302static unsigned moduleKindForDiagnostic(ModuleKind Kind);
2303InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) {
2304 // If this ID is bogus, just return an empty input file.
2305 if (ID == 0 || ID > F.InputFilesLoaded.size())
2306 return InputFile();
2307
2308 // If we've already loaded this input file, return it.
2309 if (F.InputFilesLoaded[ID-1].getFile())
2310 return F.InputFilesLoaded[ID-1];
2311
2312 if (F.InputFilesLoaded[ID-1].isNotFound())
2313 return InputFile();
2314
2315 // Go find this input file.
2316 BitstreamCursor &Cursor = F.InputFilesCursor;
2317 SavedStreamPosition SavedPosition(Cursor);
2318 if (llvm::Error Err = Cursor.JumpToBit(F.InputFileOffsets[ID - 1])) {
2319 // FIXME this drops errors on the floor.
2320 consumeError(std::move(Err));
2321 }
2322
2323 InputFileInfo FI = readInputFileInfo(F, ID);
2324 off_t StoredSize = FI.StoredSize;
2325 time_t StoredTime = FI.StoredTime;
2326 bool Overridden = FI.Overridden;
2327 bool Transient = FI.Transient;
2328 StringRef Filename = FI.Filename;
2329 uint64_t StoredContentHash = FI.ContentHash;
2330
2331 OptionalFileEntryRefDegradesToFileEntryPtr File =
2332 expectedToOptional(FileMgr.getFileRef(Filename, /*OpenFile=*/false));
2333
2334 // If we didn't find the file, resolve it relative to the
2335 // original directory from which this AST file was created.
2336 if (!File && !F.OriginalDir.empty() && !F.BaseDirectory.empty() &&
2337 F.OriginalDir != F.BaseDirectory) {
2338 std::string Resolved = resolveFileRelativeToOriginalDir(
2339 std::string(Filename), F.OriginalDir, F.BaseDirectory);
2340 if (!Resolved.empty())
2341 File = expectedToOptional(FileMgr.getFileRef(Resolved));
2342 }
2343
2344 // For an overridden file, create a virtual file with the stored
2345 // size/timestamp.
2346 if ((Overridden || Transient) && !File)
2347 File = FileMgr.getVirtualFileRef(Filename, StoredSize, StoredTime);
2348
2349 if (!File) {
2350 if (Complain) {
2351 std::string ErrorStr = "could not find file '";
2352 ErrorStr += Filename;
2353 ErrorStr += "' referenced by AST file '";
2354 ErrorStr += F.FileName;
2355 ErrorStr += "'";
2356 Error(ErrorStr);
2357 }
2358 // Record that we didn't find the file.
2359 F.InputFilesLoaded[ID-1] = InputFile::getNotFound();
2360 return InputFile();
2361 }
2362
2363 // Check if there was a request to override the contents of the file
2364 // that was part of the precompiled header. Overriding such a file
2365 // can lead to problems when lexing using the source locations from the
2366 // PCH.
2367 SourceManager &SM = getSourceManager();
2368 // FIXME: Reject if the overrides are different.
2369 if ((!Overridden && !Transient) && SM.isFileOverridden(File)) {
2370 if (Complain)
2371 Error(diag::err_fe_pch_file_overridden, Filename);
2372
2373 // After emitting the diagnostic, bypass the overriding file to recover
2374 // (this creates a separate FileEntry).
2375 File = SM.bypassFileContentsOverride(*File);
2376 if (!File) {
2377 F.InputFilesLoaded[ID - 1] = InputFile::getNotFound();
2378 return InputFile();
2379 }
2380 }
2381
2382 struct Change {
2383 enum ModificationKind {
2384 Size,
2385 ModTime,
2386 Content,
2387 None,
2388 } Kind;
2389 llvm::Optional<int64_t> Old = llvm::None;
2390 llvm::Optional<int64_t> New = llvm::None;
2391 };
2392 auto HasInputFileChanged = [&]() {
2393 if (StoredSize != File->getSize())
2394 return Change{Change::Size, StoredSize, File->getSize()};
2395 if (!shouldDisableValidationForFile(F) && StoredTime &&
2396 StoredTime != File->getModificationTime()) {
2397 Change MTimeChange = {Change::ModTime, StoredTime,
2398 File->getModificationTime()};
2399
2400 // In case the modification time changes but not the content,
2401 // accept the cached file as legit.
2402 if (ValidateASTInputFilesContent &&
2403 StoredContentHash != static_cast<uint64_t>(llvm::hash_code(-1))) {
2404 auto MemBuffOrError = FileMgr.getBufferForFile(File);
2405 if (!MemBuffOrError) {
2406 if (!Complain)
2407 return MTimeChange;
2408 std::string ErrorStr = "could not get buffer for file '";
2409 ErrorStr += File->getName();
2410 ErrorStr += "'";
2411 Error(ErrorStr);
2412 return MTimeChange;
2413 }
2414
2415 // FIXME: hash_value is not guaranteed to be stable!
2416 auto ContentHash = hash_value(MemBuffOrError.get()->getBuffer());
2417 if (StoredContentHash == static_cast<uint64_t>(ContentHash))
2418 return Change{Change::None};
2419
2420 return Change{Change::Content};
2421 }
2422 return MTimeChange;
2423 }
2424 return Change{Change::None};
2425 };
2426
2427 bool IsOutOfDate = false;
2428 auto FileChange = HasInputFileChanged();
2429 // For an overridden file, there is nothing to validate.
2430 if (!Overridden && FileChange.Kind != Change::None) {
2431 if (Complain && !Diags.isDiagnosticInFlight()) {
2432 // Build a list of the PCH imports that got us here (in reverse).
2433 SmallVector<ModuleFile *, 4> ImportStack(1, &F);
2434 while (!ImportStack.back()->ImportedBy.empty())
2435 ImportStack.push_back(ImportStack.back()->ImportedBy[0]);
2436
2437 // The top-level PCH is stale.
2438 StringRef TopLevelPCHName(ImportStack.back()->FileName);
2439 Diag(diag::err_fe_ast_file_modified)
2440 << Filename << moduleKindForDiagnostic(ImportStack.back()->Kind)
2441 << TopLevelPCHName << FileChange.Kind
2442 << (FileChange.Old && FileChange.New)
2443 << llvm::itostr(FileChange.Old.getValueOr(0))
2444 << llvm::itostr(FileChange.New.getValueOr(0));
2445
2446 // Print the import stack.
2447 if (ImportStack.size() > 1) {
2448 Diag(diag::note_pch_required_by)
2449 << Filename << ImportStack[0]->FileName;
2450 for (unsigned I = 1; I < ImportStack.size(); ++I)
2451 Diag(diag::note_pch_required_by)
2452 << ImportStack[I-1]->FileName << ImportStack[I]->FileName;
2453 }
2454
2455 Diag(diag::note_pch_rebuild_required) << TopLevelPCHName;
2456 }
2457
2458 IsOutOfDate = true;
2459 }
2460 // FIXME: If the file is overridden and we've already opened it,
2461 // issue an error (or split it into a separate FileEntry).
2462
2463 InputFile IF = InputFile(*File, Overridden || Transient, IsOutOfDate);
2464
2465 // Note that we've loaded this input file.
2466 F.InputFilesLoaded[ID-1] = IF;
2467 return IF;
2468}
2469
2470/// If we are loading a relocatable PCH or module file, and the filename
2471/// is not an absolute path, add the system or module root to the beginning of
2472/// the file name.
2473void ASTReader::ResolveImportedPath(ModuleFile &M, std::string &Filename) {
2474 // Resolve relative to the base directory, if we have one.
2475 if (!M.BaseDirectory.empty())
2476 return ResolveImportedPath(Filename, M.BaseDirectory);
2477}
2478
2479void ASTReader::ResolveImportedPath(std::string &Filename, StringRef Prefix) {
2480 if (Filename.empty() || llvm::sys::path::is_absolute(Filename))
2481 return;
2482
2483 SmallString<128> Buffer;
2484 llvm::sys::path::append(Buffer, Prefix, Filename);
2485 Filename.assign(Buffer.begin(), Buffer.end());
2486}
2487
2488static bool isDiagnosedResult(ASTReader::ASTReadResult ARR, unsigned Caps) {
2489 switch (ARR) {
2490 case ASTReader::Failure: return true;
2491 case ASTReader::Missing: return !(Caps & ASTReader::ARR_Missing);
2492 case ASTReader::OutOfDate: return !(Caps & ASTReader::ARR_OutOfDate);
2493 case ASTReader::VersionMismatch: return !(Caps & ASTReader::ARR_VersionMismatch);
2494 case ASTReader::ConfigurationMismatch:
2495 return !(Caps & ASTReader::ARR_ConfigurationMismatch);
2496 case ASTReader::HadErrors: return true;
2497 case ASTReader::Success: return false;
2498 }
2499
2500 llvm_unreachable("unknown ASTReadResult")::llvm::llvm_unreachable_internal("unknown ASTReadResult", "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 2500)
;
2501}
2502
2503ASTReader::ASTReadResult ASTReader::ReadOptionsBlock(
2504 BitstreamCursor &Stream, unsigned ClientLoadCapabilities,
2505 bool AllowCompatibleConfigurationMismatch, ASTReaderListener &Listener,
2506 std::string &SuggestedPredefines) {
2507 if (llvm::Error Err = Stream.EnterSubBlock(OPTIONS_BLOCK_ID)) {
2508 // FIXME this drops errors on the floor.
2509 consumeError(std::move(Err));
2510 return Failure;
2511 }
2512
2513 // Read all of the records in the options block.
2514 RecordData Record;
2515 ASTReadResult Result = Success;
2516 while (true) {
2517 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
2518 if (!MaybeEntry) {
2519 // FIXME this drops errors on the floor.
2520 consumeError(MaybeEntry.takeError());
2521 return Failure;
2522 }
2523 llvm::BitstreamEntry Entry = MaybeEntry.get();
2524
2525 switch (Entry.Kind) {
2526 case llvm::BitstreamEntry::Error:
2527 case llvm::BitstreamEntry::SubBlock:
2528 return Failure;
2529
2530 case llvm::BitstreamEntry::EndBlock:
2531 return Result;
2532
2533 case llvm::BitstreamEntry::Record:
2534 // The interesting case.
2535 break;
2536 }
2537
2538 // Read and process a record.
2539 Record.clear();
2540 Expected<unsigned> MaybeRecordType = Stream.readRecord(Entry.ID, Record);
2541 if (!MaybeRecordType) {
2542 // FIXME this drops errors on the floor.
2543 consumeError(MaybeRecordType.takeError());
2544 return Failure;
2545 }
2546 switch ((OptionsRecordTypes)MaybeRecordType.get()) {
2547 case LANGUAGE_OPTIONS: {
2548 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2549 if (ParseLanguageOptions(Record, Complain, Listener,
2550 AllowCompatibleConfigurationMismatch))
2551 Result = ConfigurationMismatch;
2552 break;
2553 }
2554
2555 case TARGET_OPTIONS: {
2556 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2557 if (ParseTargetOptions(Record, Complain, Listener,
2558 AllowCompatibleConfigurationMismatch))
2559 Result = ConfigurationMismatch;
2560 break;
2561 }
2562
2563 case FILE_SYSTEM_OPTIONS: {
2564 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2565 if (!AllowCompatibleConfigurationMismatch &&
2566 ParseFileSystemOptions(Record, Complain, Listener))
2567 Result = ConfigurationMismatch;
2568 break;
2569 }
2570
2571 case HEADER_SEARCH_OPTIONS: {
2572 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2573 if (!AllowCompatibleConfigurationMismatch &&
2574 ParseHeaderSearchOptions(Record, Complain, Listener))
2575 Result = ConfigurationMismatch;
2576 break;
2577 }
2578
2579 case PREPROCESSOR_OPTIONS:
2580 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2581 if (!AllowCompatibleConfigurationMismatch &&
2582 ParsePreprocessorOptions(Record, Complain, Listener,
2583 SuggestedPredefines))
2584 Result = ConfigurationMismatch;
2585 break;
2586 }
2587 }
2588}
2589
2590ASTReader::ASTReadResult
2591ASTReader::ReadControlBlock(ModuleFile &F,
2592 SmallVectorImpl<ImportedModule> &Loaded,
2593 const ModuleFile *ImportedBy,
2594 unsigned ClientLoadCapabilities) {
2595 BitstreamCursor &Stream = F.Stream;
2596
2597 if (llvm::Error Err = Stream.EnterSubBlock(CONTROL_BLOCK_ID)) {
2598 Error(std::move(Err));
2599 return Failure;
2600 }
2601
2602 // Lambda to read the unhashed control block the first time it's called.
2603 //
2604 // For PCM files, the unhashed control block cannot be read until after the
2605 // MODULE_NAME record. However, PCH files have no MODULE_NAME, and yet still
2606 // need to look ahead before reading the IMPORTS record. For consistency,
2607 // this block is always read somehow (see BitstreamEntry::EndBlock).
2608 bool HasReadUnhashedControlBlock = false;
2609 auto readUnhashedControlBlockOnce = [&]() {
2610 if (!HasReadUnhashedControlBlock) {
2611 HasReadUnhashedControlBlock = true;
2612 if (ASTReadResult Result =
2613 readUnhashedControlBlock(F, ImportedBy, ClientLoadCapabilities))
2614 return Result;
2615 }
2616 return Success;
2617 };
2618
2619 bool DisableValidation = shouldDisableValidationForFile(F);
2620
2621 // Read all of the records and blocks in the control block.
2622 RecordData Record;
2623 unsigned NumInputs = 0;
2624 unsigned NumUserInputs = 0;
2625 StringRef BaseDirectoryAsWritten;
2626 while (true) {
2627 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
2628 if (!MaybeEntry) {
2629 Error(MaybeEntry.takeError());
2630 return Failure;
2631 }
2632 llvm::BitstreamEntry Entry = MaybeEntry.get();
2633
2634 switch (Entry.Kind) {
2635 case llvm::BitstreamEntry::Error:
2636 Error("malformed block record in AST file");
2637 return Failure;
2638 case llvm::BitstreamEntry::EndBlock: {
2639 // Validate the module before returning. This call catches an AST with
2640 // no module name and no imports.
2641 if (ASTReadResult Result = readUnhashedControlBlockOnce())
2642 return Result;
2643
2644 // Validate input files.
2645 const HeaderSearchOptions &HSOpts =
2646 PP.getHeaderSearchInfo().getHeaderSearchOpts();
2647
2648 // All user input files reside at the index range [0, NumUserInputs), and
2649 // system input files reside at [NumUserInputs, NumInputs). For explicitly
2650 // loaded module files, ignore missing inputs.
2651 if (!DisableValidation && F.Kind != MK_ExplicitModule &&
2652 F.Kind != MK_PrebuiltModule) {
2653 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
2654
2655 // If we are reading a module, we will create a verification timestamp,
2656 // so we verify all input files. Otherwise, verify only user input
2657 // files.
2658
2659 unsigned N = NumUserInputs;
2660 if (ValidateSystemInputs ||
2661 (HSOpts.ModulesValidateOncePerBuildSession &&
2662 F.InputFilesValidationTimestamp <= HSOpts.BuildSessionTimestamp &&
2663 F.Kind == MK_ImplicitModule))
2664 N = NumInputs;
2665
2666 for (unsigned I = 0; I < N; ++I) {
2667 InputFile IF = getInputFile(F, I+1, Complain);
2668 if (!IF.getFile() || IF.isOutOfDate())
2669 return OutOfDate;
2670 }
2671 }
2672
2673 if (Listener)
2674 Listener->visitModuleFile(F.FileName, F.Kind);
2675
2676 if (Listener && Listener->needsInputFileVisitation()) {
2677 unsigned N = Listener->needsSystemInputFileVisitation() ? NumInputs
2678 : NumUserInputs;
2679 for (unsigned I = 0; I < N; ++I) {
2680 bool IsSystem = I >= NumUserInputs;
2681 InputFileInfo FI = readInputFileInfo(F, I+1);
2682 Listener->visitInputFile(FI.Filename, IsSystem, FI.Overridden,
2683 F.Kind == MK_ExplicitModule ||
2684 F.Kind == MK_PrebuiltModule);
2685 }
2686 }
2687
2688 return Success;
2689 }
2690
2691 case llvm::BitstreamEntry::SubBlock:
2692 switch (Entry.ID) {
2693 case INPUT_FILES_BLOCK_ID:
2694 F.InputFilesCursor = Stream;
2695 if (llvm::Error Err = Stream.SkipBlock()) {
2696 Error(std::move(Err));
2697 return Failure;
2698 }
2699 if (ReadBlockAbbrevs(F.InputFilesCursor, INPUT_FILES_BLOCK_ID)) {
2700 Error("malformed block record in AST file");
2701 return Failure;
2702 }
2703 continue;
2704
2705 case OPTIONS_BLOCK_ID:
2706 // If we're reading the first module for this group, check its options
2707 // are compatible with ours. For modules it imports, no further checking
2708 // is required, because we checked them when we built it.
2709 if (Listener && !ImportedBy) {
2710 // Should we allow the configuration of the module file to differ from
2711 // the configuration of the current translation unit in a compatible
2712 // way?
2713 //
2714 // FIXME: Allow this for files explicitly specified with -include-pch.
2715 bool AllowCompatibleConfigurationMismatch =
2716 F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule;
2717
2718 ASTReadResult Result =
2719 ReadOptionsBlock(Stream, ClientLoadCapabilities,
2720 AllowCompatibleConfigurationMismatch, *Listener,
2721 SuggestedPredefines);
2722 if (Result == Failure) {
2723 Error("malformed block record in AST file");
2724 return Result;
2725 }
2726
2727 if (DisableValidation ||
2728 (AllowConfigurationMismatch && Result == ConfigurationMismatch))
2729 Result = Success;
2730
2731 // If we can't load the module, exit early since we likely
2732 // will rebuild the module anyway. The stream may be in the
2733 // middle of a block.
2734 if (Result != Success)
2735 return Result;
2736 } else if (llvm::Error Err = Stream.SkipBlock()) {
2737 Error(std::move(Err));
2738 return Failure;
2739 }
2740 continue;
2741
2742 default:
2743 if (llvm::Error Err = Stream.SkipBlock()) {
2744 Error(std::move(Err));
2745 return Failure;
2746 }
2747 continue;
2748 }
2749
2750 case llvm::BitstreamEntry::Record:
2751 // The interesting case.
2752 break;
2753 }
2754
2755 // Read and process a record.
2756 Record.clear();
2757 StringRef Blob;
2758 Expected<unsigned> MaybeRecordType =
2759 Stream.readRecord(Entry.ID, Record, &Blob);
2760 if (!MaybeRecordType) {
2761 Error(MaybeRecordType.takeError());
2762 return Failure;
2763 }
2764 switch ((ControlRecordTypes)MaybeRecordType.get()) {
2765 case METADATA: {
2766 if (Record[0] != VERSION_MAJOR && !DisableValidation) {
2767 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
2768 Diag(Record[0] < VERSION_MAJOR? diag::err_pch_version_too_old
2769 : diag::err_pch_version_too_new);
2770 return VersionMismatch;
2771 }
2772
2773 bool hasErrors = Record[6];
2774 if (hasErrors && !DisableValidation) {
2775 // If requested by the caller and the module hasn't already been read
2776 // or compiled, mark modules on error as out-of-date.
2777 if ((ClientLoadCapabilities & ARR_TreatModuleWithErrorsAsOutOfDate) &&
2778 canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
2779 return OutOfDate;
2780
2781 if (!AllowASTWithCompilerErrors) {
2782 Diag(diag::err_pch_with_compiler_errors);
2783 return HadErrors;
2784 }
2785 }
2786 if (hasErrors) {
2787 Diags.ErrorOccurred = true;
2788 Diags.UncompilableErrorOccurred = true;
2789 Diags.UnrecoverableErrorOccurred = true;
2790 }
2791
2792 F.RelocatablePCH = Record[4];
2793 // Relative paths in a relocatable PCH are relative to our sysroot.
2794 if (F.RelocatablePCH)
2795 F.BaseDirectory = isysroot.empty() ? "/" : isysroot;
2796
2797 F.HasTimestamps = Record[5];
2798
2799 const std::string &CurBranch = getClangFullRepositoryVersion();
2800 StringRef ASTBranch = Blob;
2801 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) {
2802 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
2803 Diag(diag::err_pch_different_branch) << ASTBranch << CurBranch;
2804 return VersionMismatch;
2805 }
2806 break;
2807 }
2808
2809 case IMPORTS: {
2810 // Validate the AST before processing any imports (otherwise, untangling
2811 // them can be error-prone and expensive). A module will have a name and
2812 // will already have been validated, but this catches the PCH case.
2813 if (ASTReadResult Result = readUnhashedControlBlockOnce())
2814 return Result;
2815
2816 // Load each of the imported PCH files.
2817 unsigned Idx = 0, N = Record.size();
2818 while (Idx < N) {
2819 // Read information about the AST file.
2820 ModuleKind ImportedKind = (ModuleKind)Record[Idx++];
2821 // The import location will be the local one for now; we will adjust
2822 // all import locations of module imports after the global source
2823 // location info are setup, in ReadAST.
2824 SourceLocation ImportLoc =
2825 ReadUntranslatedSourceLocation(Record[Idx++]);
2826 off_t StoredSize = (off_t)Record[Idx++];
2827 time_t StoredModTime = (time_t)Record[Idx++];
2828 auto FirstSignatureByte = Record.begin() + Idx;
2829 ASTFileSignature StoredSignature = ASTFileSignature::create(
2830 FirstSignatureByte, FirstSignatureByte + ASTFileSignature::size);
2831 Idx += ASTFileSignature::size;
2832
2833 std::string ImportedName = ReadString(Record, Idx);
2834 std::string ImportedFile;
2835
2836 // For prebuilt and explicit modules first consult the file map for
2837 // an override. Note that here we don't search prebuilt module
2838 // directories, only the explicit name to file mappings. Also, we will
2839 // still verify the size/signature making sure it is essentially the
2840 // same file but perhaps in a different location.
2841 if (ImportedKind == MK_PrebuiltModule || ImportedKind == MK_ExplicitModule)
2842 ImportedFile = PP.getHeaderSearchInfo().getPrebuiltModuleFileName(
2843 ImportedName, /*FileMapOnly*/ true);
2844
2845 if (ImportedFile.empty())
2846 // Use BaseDirectoryAsWritten to ensure we use the same path in the
2847 // ModuleCache as when writing.
2848 ImportedFile = ReadPath(BaseDirectoryAsWritten, Record, Idx);
2849 else
2850 SkipPath(Record, Idx);
2851
2852 // If our client can't cope with us being out of date, we can't cope with
2853 // our dependency being missing.
2854 unsigned Capabilities = ClientLoadCapabilities;
2855 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
2856 Capabilities &= ~ARR_Missing;
2857
2858 // Load the AST file.
2859 auto Result = ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F,
2860 Loaded, StoredSize, StoredModTime,
2861 StoredSignature, Capabilities);
2862
2863 // If we diagnosed a problem, produce a backtrace.
2864 bool recompilingFinalized =
2865 Result == OutOfDate && (Capabilities & ARR_OutOfDate) &&
2866 getModuleManager().getModuleCache().isPCMFinal(F.FileName);
2867 if (isDiagnosedResult(Result, Capabilities) || recompilingFinalized)
2868 Diag(diag::note_module_file_imported_by)
2869 << F.FileName << !F.ModuleName.empty() << F.ModuleName;
2870 if (recompilingFinalized)
2871 Diag(diag::note_module_file_conflict);
2872
2873 switch (Result) {
2874 case Failure: return Failure;
2875 // If we have to ignore the dependency, we'll have to ignore this too.
2876 case Missing:
2877 case OutOfDate: return OutOfDate;
2878 case VersionMismatch: return VersionMismatch;
2879 case ConfigurationMismatch: return ConfigurationMismatch;
2880 case HadErrors: return HadErrors;
2881 case Success: break;
2882 }
2883 }
2884 break;
2885 }
2886
2887 case ORIGINAL_FILE:
2888 F.OriginalSourceFileID = FileID::get(Record[0]);
2889 F.ActualOriginalSourceFileName = std::string(Blob);
2890 F.OriginalSourceFileName = F.ActualOriginalSourceFileName;
2891 ResolveImportedPath(F, F.OriginalSourceFileName);
2892 break;
2893
2894 case ORIGINAL_FILE_ID:
2895 F.OriginalSourceFileID = FileID::get(Record[0]);
2896 break;
2897
2898 case ORIGINAL_PCH_DIR:
2899 F.OriginalDir = std::string(Blob);
2900 break;
2901
2902 case MODULE_NAME:
2903 F.ModuleName = std::string(Blob);
2904 Diag(diag::remark_module_import)
2905 << F.ModuleName << F.FileName << (ImportedBy ? true : false)
2906 << (ImportedBy ? StringRef(ImportedBy->ModuleName) : StringRef());
2907 if (Listener)
2908 Listener->ReadModuleName(F.ModuleName);
2909
2910 // Validate the AST as soon as we have a name so we can exit early on
2911 // failure.
2912 if (ASTReadResult Result = readUnhashedControlBlockOnce())
2913 return Result;
2914
2915 break;
2916
2917 case MODULE_DIRECTORY: {
2918 // Save the BaseDirectory as written in the PCM for computing the module
2919 // filename for the ModuleCache.
2920 BaseDirectoryAsWritten = Blob;
2921 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 2922, __extension__ __PRETTY_FUNCTION__))
2922 "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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 2922, __extension__ __PRETTY_FUNCTION__))
;
2923 // If we've already loaded a module map file covering this module, we may
2924 // have a better path for it (relative to the current build).
2925 Module *M = PP.getHeaderSearchInfo().lookupModule(
2926 F.ModuleName, /*AllowSearch*/ true,
2927 /*AllowExtraModuleMapSearch*/ true);
2928 if (M && M->Directory) {
2929 // If we're implicitly loading a module, the base directory can't
2930 // change between the build and use.
2931 // Don't emit module relocation error if we have -fno-validate-pch
2932 if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
2933 DisableValidationForModuleKind::Module) &&
2934 F.Kind != MK_ExplicitModule && F.Kind != MK_PrebuiltModule) {
2935 auto BuildDir = PP.getFileManager().getDirectory(Blob);
2936 if (!BuildDir || *BuildDir != M->Directory) {
2937 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
2938 Diag(diag::err_imported_module_relocated)
2939 << F.ModuleName << Blob << M->Directory->getName();
2940 return OutOfDate;
2941 }
2942 }
2943 F.BaseDirectory = std::string(M->Directory->getName());
2944 } else {
2945 F.BaseDirectory = std::string(Blob);
2946 }
2947 break;
2948 }
2949
2950 case MODULE_MAP_FILE:
2951 if (ASTReadResult Result =
2952 ReadModuleMapFileBlock(Record, F, ImportedBy, ClientLoadCapabilities))
2953 return Result;
2954 break;
2955
2956 case INPUT_FILE_OFFSETS:
2957 NumInputs = Record[0];
2958 NumUserInputs = Record[1];
2959 F.InputFileOffsets =
2960 (const llvm::support::unaligned_uint64_t *)Blob.data();
2961 F.InputFilesLoaded.resize(NumInputs);
2962 F.NumUserInputFiles = NumUserInputs;
2963 break;
2964 }
2965 }
2966}
2967
2968llvm::Error ASTReader::ReadASTBlock(ModuleFile &F,
2969 unsigned ClientLoadCapabilities) {
2970 BitstreamCursor &Stream = F.Stream;
2971
2972 if (llvm::Error Err = Stream.EnterSubBlock(AST_BLOCK_ID))
2973 return Err;
2974 F.ASTBlockStartOffset = Stream.GetCurrentBitNo();
2975
2976 // Read all of the records and blocks for the AST file.
2977 RecordData Record;
2978 while (true) {
2979 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
2980 if (!MaybeEntry)
2981 return MaybeEntry.takeError();
2982 llvm::BitstreamEntry Entry = MaybeEntry.get();
2983
2984 switch (Entry.Kind) {
2985 case llvm::BitstreamEntry::Error:
2986 return llvm::createStringError(
2987 std::errc::illegal_byte_sequence,
2988 "error at end of module block in AST file");
2989 case llvm::BitstreamEntry::EndBlock:
2990 // Outside of C++, we do not store a lookup map for the translation unit.
2991 // Instead, mark it as needing a lookup map to be built if this module
2992 // contains any declarations lexically within it (which it always does!).
2993 // This usually has no cost, since we very rarely need the lookup map for
2994 // the translation unit outside C++.
2995 if (ASTContext *Ctx = ContextObj) {
2996 DeclContext *DC = Ctx->getTranslationUnitDecl();
2997 if (DC->hasExternalLexicalStorage() && !Ctx->getLangOpts().CPlusPlus)
2998 DC->setMustBuildLookupTable();
2999 }
3000
3001 return llvm::Error::success();
3002 case llvm::BitstreamEntry::SubBlock:
3003 switch (Entry.ID) {
3004 case DECLTYPES_BLOCK_ID:
3005 // We lazily load the decls block, but we want to set up the
3006 // DeclsCursor cursor to point into it. Clone our current bitcode
3007 // cursor to it, enter the block and read the abbrevs in that block.
3008 // With the main cursor, we just skip over it.
3009 F.DeclsCursor = Stream;
3010 if (llvm::Error Err = Stream.SkipBlock())
3011 return Err;
3012 if (llvm::Error Err = ReadBlockAbbrevs(
3013 F.DeclsCursor, DECLTYPES_BLOCK_ID, &F.DeclsBlockStartOffset))
3014 return Err;
3015 break;
3016
3017 case PREPROCESSOR_BLOCK_ID:
3018 F.MacroCursor = Stream;
3019 if (!PP.getExternalSource())
3020 PP.setExternalSource(this);
3021
3022 if (llvm::Error Err = Stream.SkipBlock())
3023 return Err;
3024 if (llvm::Error Err =
3025 ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID))
3026 return Err;
3027 F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo();
3028 break;
3029
3030 case PREPROCESSOR_DETAIL_BLOCK_ID:
3031 F.PreprocessorDetailCursor = Stream;
3032
3033 if (llvm::Error Err = Stream.SkipBlock()) {
3034 return Err;
3035 }
3036 if (llvm::Error Err = ReadBlockAbbrevs(F.PreprocessorDetailCursor,
3037 PREPROCESSOR_DETAIL_BLOCK_ID))
3038 return Err;
3039 F.PreprocessorDetailStartOffset
3040 = F.PreprocessorDetailCursor.GetCurrentBitNo();
3041
3042 if (!PP.getPreprocessingRecord())
3043 PP.createPreprocessingRecord();
3044 if (!PP.getPreprocessingRecord()->getExternalSource())
3045 PP.getPreprocessingRecord()->SetExternalSource(*this);
3046 break;
3047
3048 case SOURCE_MANAGER_BLOCK_ID:
3049 if (llvm::Error Err = ReadSourceManagerBlock(F))
3050 return Err;
3051 break;
3052
3053 case SUBMODULE_BLOCK_ID:
3054 if (llvm::Error Err = ReadSubmoduleBlock(F, ClientLoadCapabilities))
3055 return Err;
3056 break;
3057
3058 case COMMENTS_BLOCK_ID: {
3059 BitstreamCursor C = Stream;
3060
3061 if (llvm::Error Err = Stream.SkipBlock())
3062 return Err;
3063 if (llvm::Error Err = ReadBlockAbbrevs(C, COMMENTS_BLOCK_ID))
3064 return Err;
3065 CommentsCursors.push_back(std::make_pair(C, &F));
3066 break;
3067 }
3068
3069 default:
3070 if (llvm::Error Err = Stream.SkipBlock())
3071 return Err;
3072 break;
3073 }
3074 continue;
3075
3076 case llvm::BitstreamEntry::Record:
3077 // The interesting case.
3078 break;
3079 }
3080
3081 // Read and process a record.
3082 Record.clear();
3083 StringRef Blob;
3084 Expected<unsigned> MaybeRecordType =
3085 Stream.readRecord(Entry.ID, Record, &Blob);
3086 if (!MaybeRecordType)
3087 return MaybeRecordType.takeError();
3088 ASTRecordTypes RecordType = (ASTRecordTypes)MaybeRecordType.get();
3089
3090 // If we're not loading an AST context, we don't care about most records.
3091 if (!ContextObj) {
3092 switch (RecordType) {
3093 case IDENTIFIER_TABLE:
3094 case IDENTIFIER_OFFSET:
3095 case INTERESTING_IDENTIFIERS:
3096 case STATISTICS:
3097 case PP_CONDITIONAL_STACK:
3098 case PP_COUNTER_VALUE:
3099 case SOURCE_LOCATION_OFFSETS:
3100 case MODULE_OFFSET_MAP:
3101 case SOURCE_MANAGER_LINE_TABLE:
3102 case SOURCE_LOCATION_PRELOADS:
3103 case PPD_ENTITIES_OFFSETS:
3104 case HEADER_SEARCH_TABLE:
3105 case IMPORTED_MODULES:
3106 case MACRO_OFFSET:
3107 break;
3108 default:
3109 continue;
3110 }
3111 }
3112
3113 switch (RecordType) {
3114 default: // Default behavior: ignore.
3115 break;
3116
3117 case TYPE_OFFSET: {
3118 if (F.LocalNumTypes != 0)
3119 return llvm::createStringError(
3120 std::errc::illegal_byte_sequence,
3121 "duplicate TYPE_OFFSET record in AST file");
3122 F.TypeOffsets = reinterpret_cast<const UnderalignedInt64 *>(Blob.data());
3123 F.LocalNumTypes = Record[0];
3124 unsigned LocalBaseTypeIndex = Record[1];
3125 F.BaseTypeIndex = getTotalNumTypes();
3126
3127 if (F.LocalNumTypes > 0) {
3128 // Introduce the global -> local mapping for types within this module.
3129 GlobalTypeMap.insert(std::make_pair(getTotalNumTypes(), &F));
3130
3131 // Introduce the local -> global mapping for types within this module.
3132 F.TypeRemap.insertOrReplace(
3133 std::make_pair(LocalBaseTypeIndex,
3134 F.BaseTypeIndex - LocalBaseTypeIndex));
3135
3136 TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes);
3137 }
3138 break;
3139 }
3140
3141 case DECL_OFFSET: {
3142 if (F.LocalNumDecls != 0)
3143 return llvm::createStringError(
3144 std::errc::illegal_byte_sequence,
3145 "duplicate DECL_OFFSET record in AST file");
3146 F.DeclOffsets = (const DeclOffset *)Blob.data();
3147 F.LocalNumDecls = Record[0];
3148 unsigned LocalBaseDeclID = Record[1];
3149 F.BaseDeclID = getTotalNumDecls();
3150
3151 if (F.LocalNumDecls > 0) {
3152 // Introduce the global -> local mapping for declarations within this
3153 // module.
3154 GlobalDeclMap.insert(
3155 std::make_pair(getTotalNumDecls() + NUM_PREDEF_DECL_IDS, &F));
3156
3157 // Introduce the local -> global mapping for declarations within this
3158 // module.
3159 F.DeclRemap.insertOrReplace(
3160 std::make_pair(LocalBaseDeclID, F.BaseDeclID - LocalBaseDeclID));
3161
3162 // Introduce the global -> local mapping for declarations within this
3163 // module.
3164 F.GlobalToLocalDeclIDs[&F] = LocalBaseDeclID;
3165
3166 DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls);
3167 }
3168 break;
3169 }
3170
3171 case TU_UPDATE_LEXICAL: {
3172 DeclContext *TU = ContextObj->getTranslationUnitDecl();
3173 LexicalContents Contents(
3174 reinterpret_cast<const llvm::support::unaligned_uint32_t *>(
3175 Blob.data()),
3176 static_cast<unsigned int>(Blob.size() / 4));
3177 TULexicalDecls.push_back(std::make_pair(&F, Contents));
3178 TU->setHasExternalLexicalStorage(true);
3179 break;
3180 }
3181
3182 case UPDATE_VISIBLE: {
3183 unsigned Idx = 0;
3184 serialization::DeclID ID = ReadDeclID(F, Record, Idx);
3185 auto *Data = (const unsigned char*)Blob.data();
3186 PendingVisibleUpdates[ID].push_back(PendingVisibleUpdate{&F, Data});
3187 // If we've already loaded the decl, perform the updates when we finish
3188 // loading this block.
3189 if (Decl *D = GetExistingDecl(ID))
3190 PendingUpdateRecords.push_back(
3191 PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
3192 break;
3193 }
3194
3195 case IDENTIFIER_TABLE:
3196 F.IdentifierTableData =
3197 reinterpret_cast<const unsigned char *>(Blob.data());
3198 if (Record[0]) {
3199 F.IdentifierLookupTable = ASTIdentifierLookupTable::Create(
3200 F.IdentifierTableData + Record[0],
3201 F.IdentifierTableData + sizeof(uint32_t),
3202 F.IdentifierTableData,
3203 ASTIdentifierLookupTrait(*this, F));
3204
3205 PP.getIdentifierTable().setExternalIdentifierLookup(this);
3206 }
3207 break;
3208
3209 case IDENTIFIER_OFFSET: {
3210 if (F.LocalNumIdentifiers != 0)
3211 return llvm::createStringError(
3212 std::errc::illegal_byte_sequence,
3213 "duplicate IDENTIFIER_OFFSET record in AST file");
3214 F.IdentifierOffsets = (const uint32_t *)Blob.data();
3215 F.LocalNumIdentifiers = Record[0];
3216 unsigned LocalBaseIdentifierID = Record[1];
3217 F.BaseIdentifierID = getTotalNumIdentifiers();
3218
3219 if (F.LocalNumIdentifiers > 0) {
3220 // Introduce the global -> local mapping for identifiers within this
3221 // module.
3222 GlobalIdentifierMap.insert(std::make_pair(getTotalNumIdentifiers() + 1,
3223 &F));
3224
3225 // Introduce the local -> global mapping for identifiers within this
3226 // module.
3227 F.IdentifierRemap.insertOrReplace(
3228 std::make_pair(LocalBaseIdentifierID,
3229 F.BaseIdentifierID - LocalBaseIdentifierID));
3230
3231 IdentifiersLoaded.resize(IdentifiersLoaded.size()
3232 + F.LocalNumIdentifiers);
3233 }
3234 break;
3235 }
3236
3237 case INTERESTING_IDENTIFIERS:
3238 F.PreloadIdentifierOffsets.assign(Record.begin(), Record.end());
3239 break;
3240
3241 case EAGERLY_DESERIALIZED_DECLS:
3242 // FIXME: Skip reading this record if our ASTConsumer doesn't care
3243 // about "interesting" decls (for instance, if we're building a module).
3244 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3245 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I]));
3246 break;
3247
3248 case MODULAR_CODEGEN_DECLS:
3249 // FIXME: Skip reading this record if our ASTConsumer doesn't care about
3250 // them (ie: if we're not codegenerating this module).
3251 if (F.Kind == MK_MainFile ||
3252 getContext().getLangOpts().BuildingPCHWithObjectFile)
3253 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3254 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I]));
3255 break;
3256
3257 case SPECIAL_TYPES:
3258 if (SpecialTypes.empty()) {
3259 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3260 SpecialTypes.push_back(getGlobalTypeID(F, Record[I]));
3261 break;
3262 }
3263
3264 if (SpecialTypes.size() != Record.size())
3265 return llvm::createStringError(std::errc::illegal_byte_sequence,
3266 "invalid special-types record");
3267
3268 for (unsigned I = 0, N = Record.size(); I != N; ++I) {
3269 serialization::TypeID ID = getGlobalTypeID(F, Record[I]);
3270 if (!SpecialTypes[I])
3271 SpecialTypes[I] = ID;
3272 // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate
3273 // merge step?
3274 }
3275 break;
3276
3277 case STATISTICS:
3278 TotalNumStatements += Record[0];
3279 TotalNumMacros += Record[1];
3280 TotalLexicalDeclContexts += Record[2];
3281 TotalVisibleDeclContexts += Record[3];
3282 break;
3283
3284 case UNUSED_FILESCOPED_DECLS:
3285 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3286 UnusedFileScopedDecls.push_back(getGlobalDeclID(F, Record[I]));
3287 break;
3288
3289 case DELEGATING_CTORS:
3290 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3291 DelegatingCtorDecls.push_back(getGlobalDeclID(F, Record[I]));
3292 break;
3293
3294 case WEAK_UNDECLARED_IDENTIFIERS:
3295 if (Record.size() % 4 != 0)
3296 return llvm::createStringError(std::errc::illegal_byte_sequence,
3297 "invalid weak identifiers record");
3298
3299 // FIXME: Ignore weak undeclared identifiers from non-original PCH
3300 // files. This isn't the way to do it :)
3301 WeakUndeclaredIdentifiers.clear();
3302
3303 // Translate the weak, undeclared identifiers into global IDs.
3304 for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) {
3305 WeakUndeclaredIdentifiers.push_back(
3306 getGlobalIdentifierID(F, Record[I++]));
3307 WeakUndeclaredIdentifiers.push_back(
3308 getGlobalIdentifierID(F, Record[I++]));
3309 WeakUndeclaredIdentifiers.push_back(
3310 ReadSourceLocation(F, Record, I).getRawEncoding());
3311 WeakUndeclaredIdentifiers.push_back(Record[I++]);
3312 }
3313 break;
3314
3315 case SELECTOR_OFFSETS: {
3316 F.SelectorOffsets = (const uint32_t *)Blob.data();
3317 F.LocalNumSelectors = Record[0];
3318 unsigned LocalBaseSelectorID = Record[1];
3319 F.BaseSelectorID = getTotalNumSelectors();
3320
3321 if (F.LocalNumSelectors > 0) {
3322 // Introduce the global -> local mapping for selectors within this
3323 // module.
3324 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F));
3325
3326 // Introduce the local -> global mapping for selectors within this
3327 // module.
3328 F.SelectorRemap.insertOrReplace(
3329 std::make_pair(LocalBaseSelectorID,
3330 F.BaseSelectorID - LocalBaseSelectorID));
3331
3332 SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors);
3333 }
3334 break;
3335 }
3336
3337 case METHOD_POOL:
3338 F.SelectorLookupTableData = (const unsigned char *)Blob.data();
3339 if (Record[0])
3340 F.SelectorLookupTable
3341 = ASTSelectorLookupTable::Create(
3342 F.SelectorLookupTableData + Record[0],
3343 F.SelectorLookupTableData,
3344 ASTSelectorLookupTrait(*this, F));
3345 TotalNumMethodPoolEntries += Record[1];
3346 break;
3347
3348 case REFERENCED_SELECTOR_POOL:
3349 if (!Record.empty()) {
3350 for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) {
3351 ReferencedSelectorsData.push_back(getGlobalSelectorID(F,
3352 Record[Idx++]));
3353 ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx).
3354 getRawEncoding());
3355 }
3356 }
3357 break;
3358
3359 case PP_CONDITIONAL_STACK:
3360 if (!Record.empty()) {
3361 unsigned Idx = 0, End = Record.size() - 1;
3362 bool ReachedEOFWhileSkipping = Record[Idx++];
3363 llvm::Optional<Preprocessor::PreambleSkipInfo> SkipInfo;
3364 if (ReachedEOFWhileSkipping) {
3365 SourceLocation HashToken = ReadSourceLocation(F, Record, Idx);
3366 SourceLocation IfTokenLoc = ReadSourceLocation(F, Record, Idx);
3367 bool FoundNonSkipPortion = Record[Idx++];
3368 bool FoundElse = Record[Idx++];
3369 SourceLocation ElseLoc = ReadSourceLocation(F, Record, Idx);
3370 SkipInfo.emplace(HashToken, IfTokenLoc, FoundNonSkipPortion,
3371 FoundElse, ElseLoc);
3372 }
3373 SmallVector<PPConditionalInfo, 4> ConditionalStack;
3374 while (Idx < End) {
3375 auto Loc = ReadSourceLocation(F, Record, Idx);
3376 bool WasSkipping = Record[Idx++];
3377 bool FoundNonSkip = Record[Idx++];
3378 bool FoundElse = Record[Idx++];
3379 ConditionalStack.push_back(
3380 {Loc, WasSkipping, FoundNonSkip, FoundElse});
3381 }
3382 PP.setReplayablePreambleConditionalStack(ConditionalStack, SkipInfo);
3383 }
3384 break;
3385
3386 case PP_COUNTER_VALUE:
3387 if (!Record.empty() && Listener)
3388 Listener->ReadCounter(F, Record[0]);
3389 break;
3390
3391 case FILE_SORTED_DECLS:
3392 F.FileSortedDecls = (const DeclID *)Blob.data();
3393 F.NumFileSortedDecls = Record[0];
3394 break;
3395
3396 case SOURCE_LOCATION_OFFSETS: {
3397 F.SLocEntryOffsets = (const uint32_t *)Blob.data();
3398 F.LocalNumSLocEntries = Record[0];
3399 SourceLocation::UIntTy SLocSpaceSize = Record[1];
3400 F.SLocEntryOffsetsBase = Record[2] + F.SourceManagerBlockStartOffset;
3401 std::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) =
3402 SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries,
3403 SLocSpaceSize);
3404 if (!F.SLocEntryBaseID)
3405 return llvm::createStringError(std::errc::invalid_argument,
3406 "ran out of source locations");
3407 // Make our entry in the range map. BaseID is negative and growing, so
3408 // we invert it. Because we invert it, though, we need the other end of
3409 // the range.
3410 unsigned RangeStart =
3411 unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1;
3412 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F));
3413 F.FirstLoc = SourceLocation::getFromRawEncoding(F.SLocEntryBaseOffset);
3414
3415 // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing.
3416 assert((F.SLocEntryBaseOffset & SourceLocation::MacroIDBit) == 0)(static_cast <bool> ((F.SLocEntryBaseOffset & SourceLocation
::MacroIDBit) == 0) ? void (0) : __assert_fail ("(F.SLocEntryBaseOffset & SourceLocation::MacroIDBit) == 0"
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 3416, __extension__ __PRETTY_FUNCTION__))
;
3417 GlobalSLocOffsetMap.insert(
3418 std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset
3419 - SLocSpaceSize,&F));
3420
3421 // Initialize the remapping table.
3422 // Invalid stays invalid.
3423 F.SLocRemap.insertOrReplace(std::make_pair(0U, 0));
3424 // This module. Base was 2 when being compiled.
3425 F.SLocRemap.insertOrReplace(std::make_pair(
3426 2U, static_cast<SourceLocation::IntTy>(F.SLocEntryBaseOffset - 2)));
3427
3428 TotalNumSLocEntries += F.LocalNumSLocEntries;
3429 break;
3430 }
3431
3432 case MODULE_OFFSET_MAP:
3433 F.ModuleOffsetMap = Blob;
3434 break;
3435
3436 case SOURCE_MANAGER_LINE_TABLE:
3437 ParseLineTable(F, Record);
3438 break;
3439
3440 case SOURCE_LOCATION_PRELOADS: {
3441 // Need to transform from the local view (1-based IDs) to the global view,
3442 // which is based off F.SLocEntryBaseID.
3443 if (!F.PreloadSLocEntries.empty())
3444 return llvm::createStringError(
3445 std::errc::illegal_byte_sequence,
3446 "Multiple SOURCE_LOCATION_PRELOADS records in AST file");
3447
3448 F.PreloadSLocEntries.swap(Record);
3449 break;
3450 }
3451
3452 case EXT_VECTOR_DECLS:
3453 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3454 ExtVectorDecls.push_back(getGlobalDeclID(F, Record[I]));
3455 break;
3456
3457 case VTABLE_USES:
3458 if (Record.size() % 3 != 0)
3459 return llvm::createStringError(std::errc::illegal_byte_sequence,
3460 "Invalid VTABLE_USES record");
3461
3462 // Later tables overwrite earlier ones.
3463 // FIXME: Modules will have some trouble with this. This is clearly not
3464 // the right way to do this.
3465 VTableUses.clear();
3466
3467 for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) {
3468 VTableUses.push_back(getGlobalDeclID(F, Record[Idx++]));
3469 VTableUses.push_back(
3470 ReadSourceLocation(F, Record, Idx).getRawEncoding());
3471 VTableUses.push_back(Record[Idx++]);
3472 }
3473 break;
3474
3475 case PENDING_IMPLICIT_INSTANTIATIONS:
3476 if (PendingInstantiations.size() % 2 != 0)
3477 return llvm::createStringError(
3478 std::errc::illegal_byte_sequence,
3479 "Invalid existing PendingInstantiations");
3480
3481 if (Record.size() % 2 != 0)
3482 return llvm::createStringError(
3483 std::errc::illegal_byte_sequence,
3484 "Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
3485
3486 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
3487 PendingInstantiations.push_back(getGlobalDeclID(F, Record[I++]));
3488 PendingInstantiations.push_back(
3489 ReadSourceLocation(F, Record, I).getRawEncoding());
3490 }
3491 break;
3492
3493 case SEMA_DECL_REFS:
3494 if (Record.size() != 3)
3495 return llvm::createStringError(std::errc::illegal_byte_sequence,
3496 "Invalid SEMA_DECL_REFS block");
3497 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3498 SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
3499 break;
3500
3501 case PPD_ENTITIES_OFFSETS: {
3502 F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data();
3503 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 3503, __extension__ __PRETTY_FUNCTION__))
;
3504 F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset);
3505
3506 unsigned LocalBasePreprocessedEntityID = Record[0];
3507
3508 unsigned StartingID;
3509 if (!PP.getPreprocessingRecord())
3510 PP.createPreprocessingRecord();
3511 if (!PP.getPreprocessingRecord()->getExternalSource())
3512 PP.getPreprocessingRecord()->SetExternalSource(*this);
3513 StartingID
3514 = PP.getPreprocessingRecord()
3515 ->allocateLoadedEntities(F.NumPreprocessedEntities);
3516 F.BasePreprocessedEntityID = StartingID;
3517
3518 if (F.NumPreprocessedEntities > 0) {
3519 // Introduce the global -> local mapping for preprocessed entities in
3520 // this module.
3521 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
3522
3523 // Introduce the local -> global mapping for preprocessed entities in
3524 // this module.
3525 F.PreprocessedEntityRemap.insertOrReplace(
3526 std::make_pair(LocalBasePreprocessedEntityID,
3527 F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID));
3528 }
3529
3530 break;
3531 }
3532
3533 case PPD_SKIPPED_RANGES: {
3534 F.PreprocessedSkippedRangeOffsets = (const PPSkippedRange*)Blob.data();
3535 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 3535, __extension__ __PRETTY_FUNCTION__))
;
3536 F.NumPreprocessedSkippedRanges = Blob.size() / sizeof(PPSkippedRange);
3537
3538 if (!PP.getPreprocessingRecord())
3539 PP.createPreprocessingRecord();
3540 if (!PP.getPreprocessingRecord()->getExternalSource())
3541 PP.getPreprocessingRecord()->SetExternalSource(*this);
3542 F.BasePreprocessedSkippedRangeID = PP.getPreprocessingRecord()
3543 ->allocateSkippedRanges(F.NumPreprocessedSkippedRanges);
3544
3545 if (F.NumPreprocessedSkippedRanges > 0)
3546 GlobalSkippedRangeMap.insert(
3547 std::make_pair(F.BasePreprocessedSkippedRangeID, &F));
3548 break;
3549 }
3550
3551 case DECL_UPDATE_OFFSETS:
3552 if (Record.size() % 2 != 0)
3553 return llvm::createStringError(
3554 std::errc::illegal_byte_sequence,
3555 "invalid DECL_UPDATE_OFFSETS block in AST file");
3556 for (unsigned I = 0, N = Record.size(); I != N; I += 2) {
3557 GlobalDeclID ID = getGlobalDeclID(F, Record[I]);
3558 DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I + 1]));
3559
3560 // If we've already loaded the decl, perform the updates when we finish
3561 // loading this block.
3562 if (Decl *D = GetExistingDecl(ID))
3563 PendingUpdateRecords.push_back(
3564 PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
3565 }
3566 break;
3567
3568 case OBJC_CATEGORIES_MAP:
3569 if (F.LocalNumObjCCategoriesInMap != 0)
3570 return llvm::createStringError(
3571 std::errc::illegal_byte_sequence,
3572 "duplicate OBJC_CATEGORIES_MAP record in AST file");
3573
3574 F.LocalNumObjCCategoriesInMap = Record[0];
3575 F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data();
3576 break;
3577
3578 case OBJC_CATEGORIES:
3579 F.ObjCCategories.swap(Record);
3580 break;
3581
3582 case CUDA_SPECIAL_DECL_REFS:
3583 // Later tables overwrite earlier ones.
3584 // FIXME: Modules will have trouble with this.
3585 CUDASpecialDeclRefs.clear();
3586 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3587 CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
3588 break;
3589
3590 case HEADER_SEARCH_TABLE:
3591 F.HeaderFileInfoTableData = Blob.data();
3592 F.LocalNumHeaderFileInfos = Record[1];
3593 if (Record[0]) {
3594 F.HeaderFileInfoTable
3595 = HeaderFileInfoLookupTable::Create(
3596 (const unsigned char *)F.HeaderFileInfoTableData + Record[0],
3597 (const unsigned char *)F.HeaderFileInfoTableData,
3598 HeaderFileInfoTrait(*this, F,
3599 &PP.getHeaderSearchInfo(),
3600 Blob.data() + Record[2]));
3601
3602 PP.getHeaderSearchInfo().SetExternalSource(this);
3603 if (!PP.getHeaderSearchInfo().getExternalLookup())
3604 PP.getHeaderSearchInfo().SetExternalLookup(this);
3605 }
3606 break;
3607
3608 case FP_PRAGMA_OPTIONS:
3609 // Later tables overwrite earlier ones.
3610 FPPragmaOptions.swap(Record);
3611 break;
3612
3613 case OPENCL_EXTENSIONS:
3614 for (unsigned I = 0, E = Record.size(); I != E; ) {
3615 auto Name = ReadString(Record, I);
3616 auto &OptInfo = OpenCLExtensions.OptMap[Name];
3617 OptInfo.Supported = Record[I++] != 0;
3618 OptInfo.Enabled = Record[I++] != 0;
3619 OptInfo.WithPragma = Record[I++] != 0;
3620 OptInfo.Avail = Record[I++];
3621 OptInfo.Core = Record[I++];
3622 OptInfo.Opt = Record[I++];
3623 }
3624 break;
3625
3626 case TENTATIVE_DEFINITIONS:
3627 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3628 TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I]));
3629 break;
3630
3631 case KNOWN_NAMESPACES:
3632 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3633 KnownNamespaces.push_back(getGlobalDeclID(F, Record[I]));
3634 break;
3635
3636 case UNDEFINED_BUT_USED:
3637 if (UndefinedButUsed.size() % 2 != 0)
3638 return llvm::createStringError(std::errc::illegal_byte_sequence,
3639 "Invalid existing UndefinedButUsed");
3640
3641 if (Record.size() % 2 != 0)
3642 return llvm::createStringError(std::errc::illegal_byte_sequence,
3643 "invalid undefined-but-used record");
3644 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
3645 UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++]));
3646 UndefinedButUsed.push_back(
3647 ReadSourceLocation(F, Record, I).getRawEncoding());
3648 }
3649 break;
3650
3651 case DELETE_EXPRS_TO_ANALYZE:
3652 for (unsigned I = 0, N = Record.size(); I != N;) {
3653 DelayedDeleteExprs.push_back(getGlobalDeclID(F, Record[I++]));
3654 const uint64_t Count = Record[I++];
3655 DelayedDeleteExprs.push_back(Count);
3656 for (uint64_t C = 0; C < Count; ++C) {
3657 DelayedDeleteExprs.push_back(ReadSourceLocation(F, Record, I).getRawEncoding());
3658 bool IsArrayForm = Record[I++] == 1;
3659 DelayedDeleteExprs.push_back(IsArrayForm);
3660 }
3661 }
3662 break;
3663
3664 case IMPORTED_MODULES:
3665 if (!F.isModule()) {
3666 // If we aren't loading a module (which has its own exports), make
3667 // all of the imported modules visible.
3668 // FIXME: Deal with macros-only imports.
3669 for (unsigned I = 0, N = Record.size(); I != N; /**/) {
3670 unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]);
3671 SourceLocation Loc = ReadSourceLocation(F, Record, I);
3672 if (GlobalID) {
3673 ImportedModules.push_back(ImportedSubmodule(GlobalID, Loc));
3674 if (DeserializationListener)
3675 DeserializationListener->ModuleImportRead(GlobalID, Loc);
3676 }
3677 }
3678 }
3679 break;
3680
3681 case MACRO_OFFSET: {
3682 if (F.LocalNumMacros != 0)
3683 return llvm::createStringError(
3684 std::errc::illegal_byte_sequence,
3685 "duplicate MACRO_OFFSET record in AST file");
3686 F.MacroOffsets = (const uint32_t *)Blob.data();
3687 F.LocalNumMacros = Record[0];
3688 unsigned LocalBaseMacroID = Record[1];
3689 F.MacroOffsetsBase = Record[2] + F.ASTBlockStartOffset;
3690 F.BaseMacroID = getTotalNumMacros();
3691
3692 if (F.LocalNumMacros > 0) {
3693 // Introduce the global -> local mapping for macros within this module.
3694 GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F));
3695
3696 // Introduce the local -> global mapping for macros within this module.
3697 F.MacroRemap.insertOrReplace(
3698 std::make_pair(LocalBaseMacroID,
3699 F.BaseMacroID - LocalBaseMacroID));
3700
3701 MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros);
3702 }
3703 break;
3704 }
3705
3706 case LATE_PARSED_TEMPLATE:
3707 LateParsedTemplates.emplace_back(
3708 std::piecewise_construct, std::forward_as_tuple(&F),
3709 std::forward_as_tuple(Record.begin(), Record.end()));
3710 break;
3711
3712 case OPTIMIZE_PRAGMA_OPTIONS:
3713 if (Record.size() != 1)
3714 return llvm::createStringError(std::errc::illegal_byte_sequence,
3715 "invalid pragma optimize record");
3716 OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]);
3717 break;
3718
3719 case MSSTRUCT_PRAGMA_OPTIONS:
3720 if (Record.size() != 1)
3721 return llvm::createStringError(std::errc::illegal_byte_sequence,
3722 "invalid pragma ms_struct record");
3723 PragmaMSStructState = Record[0];
3724 break;
3725
3726 case POINTERS_TO_MEMBERS_PRAGMA_OPTIONS:
3727 if (Record.size() != 2)
3728 return llvm::createStringError(
3729 std::errc::illegal_byte_sequence,
3730 "invalid pragma pointers to members record");
3731 PragmaMSPointersToMembersState = Record[0];
3732 PointersToMembersPragmaLocation = ReadSourceLocation(F, Record[1]);
3733 break;
3734
3735 case UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES:
3736 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3737 UnusedLocalTypedefNameCandidates.push_back(
3738 getGlobalDeclID(F, Record[I]));
3739 break;
3740
3741 case CUDA_PRAGMA_FORCE_HOST_DEVICE_DEPTH:
3742 if (Record.size() != 1)
3743 return llvm::createStringError(std::errc::illegal_byte_sequence,
3744 "invalid cuda pragma options record");
3745 ForceCUDAHostDeviceDepth = Record[0];
3746 break;
3747
3748 case ALIGN_PACK_PRAGMA_OPTIONS: {
3749 if (Record.size() < 3)
3750 return llvm::createStringError(std::errc::illegal_byte_sequence,
3751 "invalid pragma pack record");
3752 PragmaAlignPackCurrentValue = ReadAlignPackInfo(Record[0]);
3753 PragmaAlignPackCurrentLocation = ReadSourceLocation(F, Record[1]);
3754 unsigned NumStackEntries = Record[2];
3755 unsigned Idx = 3;
3756 // Reset the stack when importing a new module.
3757 PragmaAlignPackStack.clear();
3758 for (unsigned I = 0; I < NumStackEntries; ++I) {
3759 PragmaAlignPackStackEntry Entry;
3760 Entry.Value = ReadAlignPackInfo(Record[Idx++]);
3761 Entry.Location = ReadSourceLocation(F, Record[Idx++]);
3762 Entry.PushLocation = ReadSourceLocation(F, Record[Idx++]);
3763 PragmaAlignPackStrings.push_back(ReadString(Record, Idx));
3764 Entry.SlotLabel = PragmaAlignPackStrings.back();
3765 PragmaAlignPackStack.push_back(Entry);
3766 }
3767 break;
3768 }
3769
3770 case FLOAT_CONTROL_PRAGMA_OPTIONS: {
3771 if (Record.size() < 3)
3772 return llvm::createStringError(std::errc::illegal_byte_sequence,
3773 "invalid pragma float control record");
3774 FpPragmaCurrentValue = FPOptionsOverride::getFromOpaqueInt(Record[0]);
3775 FpPragmaCurrentLocation = ReadSourceLocation(F, Record[1]);
3776 unsigned NumStackEntries = Record[2];
3777 unsigned Idx = 3;
3778 // Reset the stack when importing a new module.
3779 FpPragmaStack.clear();
3780 for (unsigned I = 0; I < NumStackEntries; ++I) {
3781 FpPragmaStackEntry Entry;
3782 Entry.Value = FPOptionsOverride::getFromOpaqueInt(Record[Idx++]);
3783 Entry.Location = ReadSourceLocation(F, Record[Idx++]);
3784 Entry.PushLocation = ReadSourceLocation(F, Record[Idx++]);
3785 FpPragmaStrings.push_back(ReadString(Record, Idx));
3786 Entry.SlotLabel = FpPragmaStrings.back();
3787 FpPragmaStack.push_back(Entry);
3788 }
3789 break;
3790 }
3791
3792 case DECLS_TO_CHECK_FOR_DEFERRED_DIAGS:
3793 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3794 DeclsToCheckForDeferredDiags.insert(getGlobalDeclID(F, Record[I]));
3795 break;
3796 }
3797 }
3798}
3799
3800void ASTReader::ReadModuleOffsetMap(ModuleFile &F) const {
3801 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 3801, __extension__ __PRETTY_FUNCTION__))
;
3802
3803 // Additional remapping information.
3804 const unsigned char *Data = (const unsigned char*)F.ModuleOffsetMap.data();
3805 const unsigned char *DataEnd = Data + F.ModuleOffsetMap.size();
3806 F.ModuleOffsetMap = StringRef();
3807
3808 // If we see this entry before SOURCE_LOCATION_OFFSETS, add placeholders.
3809 if (F.SLocRemap.find(0) == F.SLocRemap.end()) {
3810 F.SLocRemap.insert(std::make_pair(0U, 0));
3811 F.SLocRemap.insert(std::make_pair(2U, 1));
3812 }
3813
3814 // Continuous range maps we may be updating in our module.
3815 using SLocRemapBuilder =
3816 ContinuousRangeMap<SourceLocation::UIntTy, SourceLocation::IntTy,
3817 2>::Builder;
3818 using RemapBuilder = ContinuousRangeMap<uint32_t, int, 2>::Builder;
3819 SLocRemapBuilder SLocRemap(F.SLocRemap);
3820 RemapBuilder IdentifierRemap(F.IdentifierRemap);
3821 RemapBuilder MacroRemap(F.MacroRemap);
3822 RemapBuilder PreprocessedEntityRemap(F.PreprocessedEntityRemap);
3823 RemapBuilder SubmoduleRemap(F.SubmoduleRemap);
3824 RemapBuilder SelectorRemap(F.SelectorRemap);
3825 RemapBuilder DeclRemap(F.DeclRemap);
3826 RemapBuilder TypeRemap(F.TypeRemap);
3827
3828 while (Data < DataEnd) {
3829 // FIXME: Looking up dependency modules by filename is horrible. Let's
3830 // start fixing this with prebuilt, explicit and implicit modules and see
3831 // how it goes...
3832 using namespace llvm::support;
3833 ModuleKind Kind = static_cast<ModuleKind>(
3834 endian::readNext<uint8_t, little, unaligned>(Data));
3835 uint16_t Len = endian::readNext<uint16_t, little, unaligned>(Data);
3836 StringRef Name = StringRef((const char*)Data, Len);
3837 Data += Len;
3838 ModuleFile *OM = (Kind == MK_PrebuiltModule || Kind == MK_ExplicitModule ||
3839 Kind == MK_ImplicitModule
3840 ? ModuleMgr.lookupByModuleName(Name)
3841 : ModuleMgr.lookupByFileName(Name));
3842 if (!OM) {
3843 std::string Msg =
3844 "SourceLocation remap refers to unknown module, cannot find ";
3845 Msg.append(std::string(Name));
3846 Error(Msg);
3847 return;
3848 }
3849
3850 SourceLocation::UIntTy SLocOffset =
3851 endian::readNext<uint32_t, little, unaligned>(Data);
3852 uint32_t IdentifierIDOffset =
3853 endian::readNext<uint32_t, little, unaligned>(Data);
3854 uint32_t MacroIDOffset =
3855 endian::readNext<uint32_t, little, unaligned>(Data);
3856 uint32_t PreprocessedEntityIDOffset =
3857 endian::readNext<uint32_t, little, unaligned>(Data);
3858 uint32_t SubmoduleIDOffset =
3859 endian::readNext<uint32_t, little, unaligned>(Data);
3860 uint32_t SelectorIDOffset =
3861 endian::readNext<uint32_t, little, unaligned>(Data);
3862 uint32_t DeclIDOffset =
3863 endian::readNext<uint32_t, little, unaligned>(Data);
3864 uint32_t TypeIndexOffset =
3865 endian::readNext<uint32_t, little, unaligned>(Data);
3866
3867 auto mapOffset = [&](uint32_t Offset, uint32_t BaseOffset,
3868 RemapBuilder &Remap) {
3869 constexpr uint32_t None = std::numeric_limits<uint32_t>::max();
3870 if (Offset != None)
3871 Remap.insert(std::make_pair(Offset,
3872 static_cast<int>(BaseOffset - Offset)));
3873 };
3874
3875 constexpr SourceLocation::UIntTy SLocNone =
3876 std::numeric_limits<SourceLocation::UIntTy>::max();
3877 if (SLocOffset != SLocNone)
3878 SLocRemap.insert(std::make_pair(
3879 SLocOffset, static_cast<SourceLocation::IntTy>(
3880 OM->SLocEntryBaseOffset - SLocOffset)));
3881
3882 mapOffset(IdentifierIDOffset, OM->BaseIdentifierID, IdentifierRemap);
3883 mapOffset(MacroIDOffset, OM->BaseMacroID, MacroRemap);
3884 mapOffset(PreprocessedEntityIDOffset, OM->BasePreprocessedEntityID,
3885 PreprocessedEntityRemap);
3886 mapOffset(SubmoduleIDOffset, OM->BaseSubmoduleID, SubmoduleRemap);
3887 mapOffset(SelectorIDOffset, OM->BaseSelectorID, SelectorRemap);
3888 mapOffset(DeclIDOffset, OM->BaseDeclID, DeclRemap);
3889 mapOffset(TypeIndexOffset, OM->BaseTypeIndex, TypeRemap);
3890
3891 // Global -> local mappings.
3892 F.GlobalToLocalDeclIDs[OM] = DeclIDOffset;
3893 }
3894}
3895
3896ASTReader::ASTReadResult
3897ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F,
3898 const ModuleFile *ImportedBy,
3899 unsigned ClientLoadCapabilities) {
3900 unsigned Idx = 0;
3901 F.ModuleMapPath = ReadPath(F, Record, Idx);
3902
3903 // Try to resolve ModuleName in the current header search context and
3904 // verify that it is found in the same module map file as we saved. If the
3905 // top-level AST file is a main file, skip this check because there is no
3906 // usable header search context.
3907 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 3908, __extension__ __PRETTY_FUNCTION__))
3908 "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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 3908, __extension__ __PRETTY_FUNCTION__))
;
3909 if (F.Kind == MK_ImplicitModule && ModuleMgr.begin()->Kind != MK_MainFile) {
3910 // An implicitly-loaded module file should have its module listed in some
3911 // module map file that we've already loaded.
3912 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName);
3913 auto &Map = PP.getHeaderSearchInfo().getModuleMap();
3914 const FileEntry *ModMap = M ? Map.getModuleMapFileForUniquing(M) : nullptr;
3915 // Don't emit module relocation error if we have -fno-validate-pch
3916 if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
3917 DisableValidationForModuleKind::Module) &&
3918 !ModMap) {
3919 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities)) {
3920 if (auto ASTFE = M ? M->getASTFile() : None) {
3921 // This module was defined by an imported (explicit) module.
3922 Diag(diag::err_module_file_conflict) << F.ModuleName << F.FileName
3923 << ASTFE->getName();
3924 } else {
3925 // This module was built with a different module map.
3926 Diag(diag::err_imported_module_not_found)
3927 << F.ModuleName << F.FileName
3928 << (ImportedBy ? ImportedBy->FileName : "") << F.ModuleMapPath
3929 << !ImportedBy;
3930 // In case it was imported by a PCH, there's a chance the user is
3931 // just missing to include the search path to the directory containing
3932 // the modulemap.
3933 if (ImportedBy && ImportedBy->Kind == MK_PCH)
3934 Diag(diag::note_imported_by_pch_module_not_found)
3935 << llvm::sys::path::parent_path(F.ModuleMapPath);
3936 }
3937 }
3938 return OutOfDate;
3939 }
3940
3941 assert(M && M->Name == F.ModuleName && "found module with different name")(static_cast <bool> (M && M->Name == F.ModuleName
&& "found module with different name") ? void (0) : __assert_fail
("M && M->Name == F.ModuleName && \"found module with different name\""
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 3941, __extension__ __PRETTY_FUNCTION__))
;
3942
3943 // Check the primary module map file.
3944 auto StoredModMap = FileMgr.getFile(F.ModuleMapPath);
3945 if (!StoredModMap || *StoredModMap != ModMap) {
3946 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 3946, __extension__ __PRETTY_FUNCTION__))
;
3947 assert((ImportedBy || F.Kind == MK_ImplicitModule) &&(static_cast <bool> ((ImportedBy || F.Kind == MK_ImplicitModule
) && "top-level import should be verified") ? void (0
) : __assert_fail ("(ImportedBy || F.Kind == MK_ImplicitModule) && \"top-level import should be verified\""
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 3948, __extension__ __PRETTY_FUNCTION__))
3948 "top-level import should be verified")(static_cast <bool> ((ImportedBy || F.Kind == MK_ImplicitModule
) && "top-level import should be verified") ? void (0
) : __assert_fail ("(ImportedBy || F.Kind == MK_ImplicitModule) && \"top-level import should be verified\""
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 3948, __extension__ __PRETTY_FUNCTION__))
;
3949 bool NotImported = F.Kind == MK_ImplicitModule && !ImportedBy;
3950 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
3951 Diag(diag::err_imported_module_modmap_changed)
3952 << F.ModuleName << (NotImported ? F.FileName : ImportedBy->FileName)
3953 << ModMap->getName() << F.ModuleMapPath << NotImported;
3954 return OutOfDate;
3955 }
3956
3957 llvm::SmallPtrSet<const FileEntry *, 1> AdditionalStoredMaps;
3958 for (unsigned I = 0, N = Record[Idx++]; I < N; ++I) {
3959 // FIXME: we should use input files rather than storing names.
3960 std::string Filename = ReadPath(F, Record, Idx);
3961 auto SF = FileMgr.getFile(Filename, false, false);
3962 if (!SF) {
3963 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
3964 Error("could not find file '" + Filename +"' referenced by AST file");
3965 return OutOfDate;
3966 }
3967 AdditionalStoredMaps.insert(*SF);
3968 }
3969
3970 // Check any additional module map files (e.g. module.private.modulemap)
3971 // that are not in the pcm.
3972 if (auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) {
3973 for (const FileEntry *ModMap : *AdditionalModuleMaps) {
3974 // Remove files that match
3975 // Note: SmallPtrSet::erase is really remove
3976 if (!AdditionalStoredMaps.erase(ModMap)) {
3977 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
3978 Diag(diag::err_module_different_modmap)
3979 << F.ModuleName << /*new*/0 << ModMap->getName();
3980 return OutOfDate;
3981 }
3982 }
3983 }
3984
3985 // Check any additional module map files that are in the pcm, but not
3986 // found in header search. Cases that match are already removed.
3987 for (const FileEntry *ModMap : AdditionalStoredMaps) {
3988 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
3989 Diag(diag::err_module_different_modmap)
3990 << F.ModuleName << /*not new*/1 << ModMap->getName();
3991 return OutOfDate;
3992 }
3993 }
3994
3995 if (Listener)
3996 Listener->ReadModuleMapFile(F.ModuleMapPath);
3997 return Success;
3998}
3999
4000/// Move the given method to the back of the global list of methods.
4001static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) {
4002 // Find the entry for this selector in the method pool.
4003 Sema::GlobalMethodPool::iterator Known
4004 = S.MethodPool.find(Method->getSelector());
4005 if (Known == S.MethodPool.end())
4006 return;
4007
4008 // Retrieve the appropriate method list.
4009 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
4010 : Known->second.second;
4011 bool Found = false;
4012 for (ObjCMethodList *List = &Start; List; List = List->getNext()) {
4013 if (!Found) {
4014 if (List->getMethod() == Method) {
4015 Found = true;
4016 } else {
4017 // Keep searching.
4018 continue;
4019 }
4020 }
4021
4022 if (List->getNext())
4023 List->setMethod(List->getNext()->getMethod());
4024 else
4025 List->setMethod(Method);
4026 }
4027}
4028
4029void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner) {
4030 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 4030, __extension__ __PRETTY_FUNCTION__))
;
4031 for (Decl *D : Names) {
4032 bool wasHidden = !D->isUnconditionallyVisible();
4033 D->setVisibleDespiteOwningModule();
4034
4035 if (wasHidden && SemaObj) {
4036 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) {
4037 moveMethodToBackOfGlobalList(*SemaObj, Method);
4038 }
4039 }
4040 }
4041}
4042
4043void ASTReader::makeModuleVisible(Module *Mod,
4044 Module::NameVisibilityKind NameVisibility,
4045 SourceLocation ImportLoc) {
4046 llvm::SmallPtrSet<Module *, 4> Visited;
4047 SmallVector<Module *, 4> Stack;
4048 Stack.push_back(Mod);
4049 while (!Stack.empty()) {
4050 Mod = Stack.pop_back_val();
4051
4052 if (NameVisibility <= Mod->NameVisibility) {
4053 // This module already has this level of visibility (or greater), so
4054 // there is nothing more to do.
4055 continue;
4056 }
4057
4058 if (Mod->isUnimportable()) {
4059 // Modules that aren't importable cannot be made visible.
4060 continue;
4061 }
4062
4063 // Update the module's name visibility.
4064 Mod->NameVisibility = NameVisibility;
4065
4066 // If we've already deserialized any names from this module,
4067 // mark them as visible.
4068 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
4069 if (Hidden != HiddenNamesMap.end()) {
4070 auto HiddenNames = std::move(*Hidden);
4071 HiddenNamesMap.erase(Hidden);
4072 makeNamesVisible(HiddenNames.second, HiddenNames.first);
4073 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 4074, __extension__ __PRETTY_FUNCTION__))
4074 "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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 4074, __extension__ __PRETTY_FUNCTION__))
;
4075 }
4076
4077 // Push any exported modules onto the stack to be marked as visible.
4078 SmallVector<Module *, 16> Exports;
4079 Mod->getExportedModules(Exports);
4080 for (SmallVectorImpl<Module *>::iterator
4081 I = Exports.begin(), E = Exports.end(); I != E; ++I) {
4082 Module *Exported = *I;
4083 if (Visited.insert(Exported).second)
4084 Stack.push_back(Exported);
4085 }
4086 }
4087}
4088
4089/// We've merged the definition \p MergedDef into the existing definition
4090/// \p Def. Ensure that \p Def is made visible whenever \p MergedDef is made
4091/// visible.
4092void ASTReader::mergeDefinitionVisibility(NamedDecl *Def,
4093 NamedDecl *MergedDef) {
4094 if (!Def->isUnconditionallyVisible()) {
4095 // If MergedDef is visible or becomes visible, make the definition visible.
4096 if (MergedDef->isUnconditionallyVisible())
4097 Def->setVisibleDespiteOwningModule();
4098 else {
4099 getContext().mergeDefinitionIntoModule(
4100 Def, MergedDef->getImportedOwningModule(),
4101 /*NotifyListeners*/ false);
4102 PendingMergedDefinitionsToDeduplicate.insert(Def);
4103 }
4104 }
4105}
4106
4107bool ASTReader::loadGlobalIndex() {
4108 if (GlobalIndex)
4109 return false;
4110
4111 if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
4112 !PP.getLangOpts().Modules)
4113 return true;
4114
4115 // Try to load the global index.
4116 TriedLoadingGlobalIndex = true;
4117 StringRef ModuleCachePath
4118 = getPreprocessor().getHeaderSearchInfo().getModuleCachePath();
4119 std::pair<GlobalModuleIndex *, llvm::Error> Result =
4120 GlobalModuleIndex::readIndex(ModuleCachePath);
4121 if (llvm::Error Err = std::move(Result.second)) {
4122 assert(!Result.first)(static_cast <bool> (!Result.first) ? void (0) : __assert_fail
("!Result.first", "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 4122, __extension__ __PRETTY_FUNCTION__))
;
4123 consumeError(std::move(Err)); // FIXME this drops errors on the floor.
4124 return true;
4125 }
4126
4127 GlobalIndex.reset(Result.first);
4128 ModuleMgr.setGlobalIndex(GlobalIndex.get());
4129 return false;
4130}
4131
4132bool ASTReader::isGlobalIndexUnavailable() const {
4133 return PP.getLangOpts().Modules && UseGlobalIndex &&
4134 !hasGlobalIndex() && TriedLoadingGlobalIndex;
4135}
4136
4137static void updateModuleTimestamp(ModuleFile &MF) {
4138 // Overwrite the timestamp file contents so that file's mtime changes.
4139 std::string TimestampFilename = MF.getTimestampFilename();
4140 std::error_code EC;
4141 llvm::raw_fd_ostream OS(TimestampFilename, EC,
4142 llvm::sys::fs::OF_TextWithCRLF);
4143 if (EC)
4144 return;
4145 OS << "Timestamp file\n";
4146 OS.close();
4147 OS.clear_error(); // Avoid triggering a fatal error.
4148}
4149
4150/// Given a cursor at the start of an AST file, scan ahead and drop the
4151/// cursor into the start of the given block ID, returning false on success and
4152/// true on failure.
4153static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) {
4154 while (true) {
4155 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance();
4156 if (!MaybeEntry) {
4157 // FIXME this drops errors on the floor.
4158 consumeError(MaybeEntry.takeError());
4159 return true;
4160 }
4161 llvm::BitstreamEntry Entry = MaybeEntry.get();
4162
4163 switch (Entry.Kind) {
4164 case llvm::BitstreamEntry::Error:
4165 case llvm::BitstreamEntry::EndBlock:
4166 return true;
4167
4168 case llvm::BitstreamEntry::Record:
4169 // Ignore top-level records.
4170 if (Expected<unsigned> Skipped = Cursor.skipRecord(Entry.ID))
4171 break;
4172 else {
4173 // FIXME this drops errors on the floor.
4174 consumeError(Skipped.takeError());
4175 return true;
4176 }
4177
4178 case llvm::BitstreamEntry::SubBlock:
4179 if (Entry.ID == BlockID) {
4180 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) {
4181 // FIXME this drops the error on the floor.
4182 consumeError(std::move(Err));
4183 return true;
4184 }
4185 // Found it!
4186 return false;
4187 }
4188
4189 if (llvm::Error Err = Cursor.SkipBlock()) {
4190 // FIXME this drops the error on the floor.
4191 consumeError(std::move(Err));
4192 return true;
4193 }
4194 }
4195 }
4196}
4197
4198ASTReader::ASTReadResult ASTReader::ReadAST(StringRef FileName,
4199 ModuleKind Type,
4200 SourceLocation ImportLoc,
4201 unsigned ClientLoadCapabilities,
4202 SmallVectorImpl<ImportedSubmodule> *Imported) {
4203 llvm::SaveAndRestore<SourceLocation>
4204 SetCurImportLocRAII(CurrentImportLoc, ImportLoc);
4205 llvm::SaveAndRestore<Optional<ModuleKind>> SetCurModuleKindRAII(
4206 CurrentDeserializingModuleKind, Type);
4207
4208 // Defer any pending actions until we get to the end of reading the AST file.
4209 Deserializing AnASTFile(this);
4210
4211 // Bump the generation number.
4212 unsigned PreviousGeneration = 0;
4213 if (ContextObj)
4214 PreviousGeneration = incrementGeneration(*ContextObj);
4215
4216 unsigned NumModules = ModuleMgr.size();
4217 SmallVector<ImportedModule, 4> Loaded;
4218 if (ASTReadResult ReadResult =
4219 ReadASTCore(FileName, Type, ImportLoc,
4220 /*ImportedBy=*/nullptr, Loaded, 0, 0, ASTFileSignature(),
4221 ClientLoadCapabilities)) {
4222 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules,
4223 PP.getLangOpts().Modules
4224 ? &PP.getHeaderSearchInfo().getModuleMap()
4225 : nullptr);
4226
4227 // If we find that any modules are unusable, the global index is going
4228 // to be out-of-date. Just remove it.
4229 GlobalIndex.reset();
4230 ModuleMgr.setGlobalIndex(nullptr);
4231 return ReadResult;
4232 }
4233
4234 // Here comes stuff that we only do once the entire chain is loaded. Do *not*
4235 // remove modules from this point. Various fields are updated during reading
4236 // the AST block and removing the modules would result in dangling pointers.
4237 // They are generally only incidentally dereferenced, ie. a binary search
4238 // runs over `GlobalSLocEntryMap`, which could cause an invalid module to
4239 // be dereferenced but it wouldn't actually be used.
4240
4241 // Load the AST blocks of all of the modules that we loaded. We can still
4242 // hit errors parsing the ASTs at this point.
4243 for (ImportedModule &M : Loaded) {
4244 ModuleFile &F = *M.Mod;
4245
4246 // Read the AST block.
4247 if (llvm::Error Err = ReadASTBlock(F, ClientLoadCapabilities)) {
4248 Error(std::move(Err));
4249 return Failure;
4250 }
4251
4252 // The AST block should always have a definition for the main module.
4253 if (F.isModule() && !F.DidReadTopLevelSubmodule) {
4254 Error(diag::err_module_file_missing_top_level_submodule, F.FileName);
4255 return Failure;
4256 }
4257
4258 // Read the extension blocks.
4259 while (!SkipCursorToBlock(F.Stream, EXTENSION_BLOCK_ID)) {
4260 if (llvm::Error Err = ReadExtensionBlock(F)) {
4261 Error(std::move(Err));
4262 return Failure;
4263 }
4264 }
4265
4266 // Once read, set the ModuleFile bit base offset and update the size in
4267 // bits of all files we've seen.
4268 F.GlobalBitOffset = TotalModulesSizeInBits;
4269 TotalModulesSizeInBits += F.SizeInBits;
4270 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F));
4271 }
4272
4273 // Preload source locations and interesting indentifiers.
4274 for (ImportedModule &M : Loaded) {
4275 ModuleFile &F = *M.Mod;
4276
4277 // Preload SLocEntries.
4278 for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) {
4279 int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID;
4280 // Load it through the SourceManager and don't call ReadSLocEntry()
4281 // directly because the entry may have already been loaded in which case
4282 // calling ReadSLocEntry() directly would trigger an assertion in
4283 // SourceManager.
4284 SourceMgr.getLoadedSLocEntryByID(Index);
4285 }
4286
4287 // Map the original source file ID into the ID space of the current
4288 // compilation.
4289 if (F.OriginalSourceFileID.isValid()) {
4290 F.OriginalSourceFileID = FileID::get(
4291 F.SLocEntryBaseID + F.OriginalSourceFileID.getOpaqueValue() - 1);
4292 }
4293
4294 // Preload all the pending interesting identifiers by marking them out of
4295 // date.
4296 for (auto Offset : F.PreloadIdentifierOffsets) {
4297 const unsigned char *Data = F.IdentifierTableData + Offset;
4298
4299 ASTIdentifierLookupTrait Trait(*this, F);
4300 auto KeyDataLen = Trait.ReadKeyDataLength(Data);
4301 auto Key = Trait.ReadKey(Data, KeyDataLen.first);
4302 auto &II = PP.getIdentifierTable().getOwn(Key);
4303 II.setOutOfDate(true);
4304
4305 // Mark this identifier as being from an AST file so that we can track
4306 // whether we need to serialize it.
4307 markIdentifierFromAST(*this, II);
4308
4309 // Associate the ID with the identifier so that the writer can reuse it.
4310 auto ID = Trait.ReadIdentifierID(Data + KeyDataLen.first);
4311 SetIdentifierInfo(ID, &II);
4312 }
4313 }
4314
4315 // Setup the import locations and notify the module manager that we've
4316 // committed to these module files.
4317 for (ImportedModule &M : Loaded) {
4318 ModuleFile &F = *M.Mod;
4319
4320 ModuleMgr.moduleFileAccepted(&F);
4321
4322 // Set the import location.
4323 F.DirectImportLoc = ImportLoc;
4324 // FIXME: We assume that locations from PCH / preamble do not need
4325 // any translation.
4326 if (!M.ImportedBy)
4327 F.ImportLoc = M.ImportLoc;
4328 else
4329 F.ImportLoc = TranslateSourceLocation(*M.ImportedBy, M.ImportLoc);
4330 }
4331
4332 if (!PP.getLangOpts().CPlusPlus ||
4333 (Type != MK_ImplicitModule && Type != MK_ExplicitModule &&
4334 Type != MK_PrebuiltModule)) {
4335 // Mark all of the identifiers in the identifier table as being out of date,
4336 // so that various accessors know to check the loaded modules when the
4337 // identifier is used.
4338 //
4339 // For C++ modules, we don't need information on many identifiers (just
4340 // those that provide macros or are poisoned), so we mark all of
4341 // the interesting ones via PreloadIdentifierOffsets.
4342 for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(),
4343 IdEnd = PP.getIdentifierTable().end();
4344 Id != IdEnd; ++Id)
4345 Id->second->setOutOfDate(true);
4346 }
4347 // Mark selectors as out of date.
4348 for (auto Sel : SelectorGeneration)
4349 SelectorOutOfDate[Sel.first] = true;
4350
4351 // Resolve any unresolved module exports.
4352 for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) {
4353 UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I];
4354 SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID);
4355 Module *ResolvedMod = getSubmodule(GlobalID);
4356
4357 switch (Unresolved.Kind) {
4358 case UnresolvedModuleRef::Conflict:
4359 if (ResolvedMod) {
4360 Module::Conflict Conflict;
4361 Conflict.Other = ResolvedMod;
4362 Conflict.Message = Unresolved.String.str();
4363 Unresolved.Mod->Conflicts.push_back(Conflict);
4364 }
4365 continue;
4366
4367 case UnresolvedModuleRef::Import:
4368 if (ResolvedMod)
4369 Unresolved.Mod->Imports.insert(ResolvedMod);
4370 continue;
4371
4372 case UnresolvedModuleRef::Export:
4373 if (ResolvedMod || Unresolved.IsWildcard)
4374 Unresolved.Mod->Exports.push_back(
4375 Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard));
4376 continue;
4377 }
4378 }
4379 UnresolvedModuleRefs.clear();
4380
4381 if (Imported)
4382 Imported->append(ImportedModules.begin(),
4383 ImportedModules.end());
4384
4385 // FIXME: How do we load the 'use'd modules? They may not be submodules.
4386 // Might be unnecessary as use declarations are only used to build the
4387 // module itself.
4388
4389 if (ContextObj)
4390 InitializeContext();
4391
4392 if (SemaObj)
4393 UpdateSema();
4394
4395 if (DeserializationListener)
4396 DeserializationListener->ReaderInitialized(this);
4397
4398 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
4399 if (PrimaryModule.OriginalSourceFileID.isValid()) {
4400 // If this AST file is a precompiled preamble, then set the
4401 // preamble file ID of the source manager to the file source file
4402 // from which the preamble was built.
4403 if (Type == MK_Preamble) {
4404 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID);
4405 } else if (Type == MK_MainFile) {
4406 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID);
4407 }
4408 }
4409
4410 // For any Objective-C class definitions we have already loaded, make sure
4411 // that we load any additional categories.
4412 if (ContextObj) {
4413 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
4414 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
4415 ObjCClassesLoaded[I],
4416 PreviousGeneration);
4417 }
4418 }
4419
4420 if (PP.getHeaderSearchInfo()
4421 .getHeaderSearchOpts()
4422 .ModulesValidateOncePerBuildSession) {
4423 // Now we are certain that the module and all modules it depends on are
4424 // up to date. Create or update timestamp files for modules that are
4425 // located in the module cache (not for PCH files that could be anywhere
4426 // in the filesystem).
4427 for (unsigned I = 0, N = Loaded.size(); I != N; ++I) {
4428 ImportedModule &M = Loaded[I];
4429 if (M.Mod->Kind == MK_ImplicitModule) {
4430 updateModuleTimestamp(*M.Mod);
4431 }
4432 }
4433 }
4434
4435 return Success;
4436}
4437
4438static ASTFileSignature readASTFileSignature(StringRef PCH);
4439
4440/// Whether \p Stream doesn't start with the AST/PCH file magic number 'CPCH'.
4441static llvm::Error doesntStartWithASTFileMagic(BitstreamCursor &Stream) {
4442 // FIXME checking magic headers is done in other places such as
4443 // SerializedDiagnosticReader and GlobalModuleIndex, but error handling isn't
4444 // always done the same. Unify it all with a helper.
4445 if (!Stream.canSkipToPos(4))
4446 return llvm::createStringError(std::errc::illegal_byte_sequence,
4447 "file too small to contain AST file magic");
4448 for (unsigned C : {'C', 'P', 'C', 'H'})
4449 if (Expected<llvm::SimpleBitstreamCursor::word_t> Res = Stream.Read(8)) {
4450 if (Res.get() != C)
4451 return llvm::createStringError(
4452 std::errc::illegal_byte_sequence,
4453 "file doesn't start with AST file magic");
4454 } else
4455 return Res.takeError();
4456 return llvm::Error::success();
4457}
4458
4459static unsigned moduleKindForDiagnostic(ModuleKind Kind) {
4460 switch (Kind) {
4461 case MK_PCH:
4462 return 0; // PCH
4463 case MK_ImplicitModule:
4464 case MK_ExplicitModule:
4465 case MK_PrebuiltModule:
4466 return 1; // module
4467 case MK_MainFile:
4468 case MK_Preamble:
4469 return 2; // main source file
4470 }
4471 llvm_unreachable("unknown module kind")::llvm::llvm_unreachable_internal("unknown module kind", "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 4471)
;
4472}
4473
4474ASTReader::ASTReadResult
4475ASTReader::ReadASTCore(StringRef FileName,
4476 ModuleKind Type,
4477 SourceLocation ImportLoc,
4478 ModuleFile *ImportedBy,
4479 SmallVectorImpl<ImportedModule> &Loaded,
4480 off_t ExpectedSize, time_t ExpectedModTime,
4481 ASTFileSignature ExpectedSignature,
4482 unsigned ClientLoadCapabilities) {
4483 ModuleFile *M;
4484 std::string ErrorStr;
4485 ModuleManager::AddModuleResult AddResult
4486 = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy,
4487 getGeneration(), ExpectedSize, ExpectedModTime,
4488 ExpectedSignature, readASTFileSignature,
4489 M, ErrorStr);
4490
4491 switch (AddResult) {
4492 case ModuleManager::AlreadyLoaded:
4493 Diag(diag::remark_module_import)
4494 << M->ModuleName << M->FileName << (ImportedBy ? true : false)
4495 << (ImportedBy ? StringRef(ImportedBy->ModuleName) : StringRef());
4496 return Success;
4497
4498 case ModuleManager::NewlyLoaded:
4499 // Load module file below.
4500 break;
4501
4502 case ModuleManager::Missing:
4503 // The module file was missing; if the client can handle that, return
4504 // it.
4505 if (ClientLoadCapabilities & ARR_Missing)
4506 return Missing;
4507
4508 // Otherwise, return an error.
4509 Diag(diag::err_ast_file_not_found)
4510 << moduleKindForDiagnostic(Type) << FileName << !ErrorStr.empty()
4511 << ErrorStr;
4512 return Failure;
4513
4514 case ModuleManager::OutOfDate:
4515 // We couldn't load the module file because it is out-of-date. If the
4516 // client can handle out-of-date, return it.
4517 if (ClientLoadCapabilities & ARR_OutOfDate)
4518 return OutOfDate;
4519
4520 // Otherwise, return an error.
4521 Diag(diag::err_ast_file_out_of_date)
4522 << moduleKindForDiagnostic(Type) << FileName << !ErrorStr.empty()
4523 << ErrorStr;
4524 return Failure;
4525 }
4526
4527 assert(M && "Missing module file")(static_cast <bool> (M && "Missing module file"
) ? void (0) : __assert_fail ("M && \"Missing module file\""
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 4527, __extension__ __PRETTY_FUNCTION__))
;
4528
4529 bool ShouldFinalizePCM = false;
4530 auto FinalizeOrDropPCM = llvm::make_scope_exit([&]() {
4531 auto &MC = getModuleManager().getModuleCache();
4532 if (ShouldFinalizePCM)
4533 MC.finalizePCM(FileName);
4534 else
4535 MC.tryToDropPCM(FileName);
4536 });
4537 ModuleFile &F = *M;
4538 BitstreamCursor &Stream = F.Stream;
4539 Stream = BitstreamCursor(PCHContainerRdr.ExtractPCH(*F.Buffer));
4540 F.SizeInBits = F.Buffer->getBufferSize() * 8;
4541
4542 // Sniff for the signature.
4543 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
4544 Diag(diag::err_ast_file_invalid)
4545 << moduleKindForDiagnostic(Type) << FileName << std::move(Err);
4546 return Failure;
4547 }
4548
4549 // This is used for compatibility with older PCH formats.
4550 bool HaveReadControlBlock = false;
4551 while (true) {
4552 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
4553 if (!MaybeEntry) {
4554 Error(MaybeEntry.takeError());
4555 return Failure;
4556 }
4557 llvm::BitstreamEntry Entry = MaybeEntry.get();
4558
4559 switch (Entry.Kind) {
4560 case llvm::BitstreamEntry::Error:
4561 case llvm::BitstreamEntry::Record:
4562 case llvm::BitstreamEntry::EndBlock:
4563 Error("invalid record at top-level of AST file");
4564 return Failure;
4565
4566 case llvm::BitstreamEntry::SubBlock:
4567 break;
4568 }
4569
4570 switch (Entry.ID) {
4571 case CONTROL_BLOCK_ID:
4572 HaveReadControlBlock = true;
4573 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
4574 case Success:
4575 // Check that we didn't try to load a non-module AST file as a module.
4576 //
4577 // FIXME: Should we also perform the converse check? Loading a module as
4578 // a PCH file sort of works, but it's a bit wonky.
4579 if ((Type == MK_ImplicitModule || Type == MK_ExplicitModule ||
4580 Type == MK_PrebuiltModule) &&
4581 F.ModuleName.empty()) {
4582 auto Result = (Type == MK_ImplicitModule) ? OutOfDate : Failure;
4583 if (Result != OutOfDate ||
4584 (ClientLoadCapabilities & ARR_OutOfDate) == 0)
4585 Diag(diag::err_module_file_not_module) << FileName;
4586 return Result;
4587 }
4588 break;
4589
4590 case Failure: return Failure;
4591 case Missing: return Missing;
4592 case OutOfDate: return OutOfDate;
4593 case VersionMismatch: return VersionMismatch;
4594 case ConfigurationMismatch: return ConfigurationMismatch;
4595 case HadErrors: return HadErrors;
4596 }
4597 break;
4598
4599 case AST_BLOCK_ID:
4600 if (!HaveReadControlBlock) {
4601 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
4602 Diag(diag::err_pch_version_too_old);
4603 return VersionMismatch;
4604 }
4605
4606 // Record that we've loaded this module.
4607 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc));
4608 ShouldFinalizePCM = true;
4609 return Success;
4610
4611 case UNHASHED_CONTROL_BLOCK_ID:
4612 // This block is handled using look-ahead during ReadControlBlock. We
4613 // shouldn't get here!
4614 Error("malformed block record in AST file");
4615 return Failure;
4616
4617 default:
4618 if (llvm::Error Err = Stream.SkipBlock()) {
4619 Error(std::move(Err));
4620 return Failure;
4621 }
4622 break;
4623 }
4624 }
4625
4626 llvm_unreachable("unexpected break; expected return")::llvm::llvm_unreachable_internal("unexpected break; expected return"
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 4626)
;
4627}
4628
4629ASTReader::ASTReadResult
4630ASTReader::readUnhashedControlBlock(ModuleFile &F, bool WasImportedBy,
4631 unsigned ClientLoadCapabilities) {
4632 const HeaderSearchOptions &HSOpts =
4633 PP.getHeaderSearchInfo().getHeaderSearchOpts();
4634 bool AllowCompatibleConfigurationMismatch =
4635 F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule;
4636 bool DisableValidation = shouldDisableValidationForFile(F);
4637
4638 ASTReadResult Result = readUnhashedControlBlockImpl(
4639 &F, F.Data, ClientLoadCapabilities, AllowCompatibleConfigurationMismatch,
4640 Listener.get(),
4641 WasImportedBy ? false : HSOpts.ModulesValidateDiagnosticOptions);
4642
4643 // If F was directly imported by another module, it's implicitly validated by
4644 // the importing module.
4645 if (DisableValidation || WasImportedBy ||
4646 (AllowConfigurationMismatch && Result == ConfigurationMismatch))
4647 return Success;
4648
4649 if (Result == Failure) {
4650 Error("malformed block record in AST file");
4651 return Failure;
4652 }
4653
4654 if (Result == OutOfDate && F.Kind == MK_ImplicitModule) {
4655 // If this module has already been finalized in the ModuleCache, we're stuck
4656 // with it; we can only load a single version of each module.
4657 //
4658 // This can happen when a module is imported in two contexts: in one, as a
4659 // user module; in another, as a system module (due to an import from
4660 // another module marked with the [system] flag). It usually indicates a
4661 // bug in the module map: this module should also be marked with [system].
4662 //
4663 // If -Wno-system-headers (the default), and the first import is as a
4664 // system module, then validation will fail during the as-user import,
4665 // since -Werror flags won't have been validated. However, it's reasonable
4666 // to treat this consistently as a system module.
4667 //
4668 // If -Wsystem-headers, the PCM on disk was built with
4669 // -Wno-system-headers, and the first import is as a user module, then
4670 // validation will fail during the as-system import since the PCM on disk
4671 // doesn't guarantee that -Werror was respected. However, the -Werror
4672 // flags were checked during the initial as-user import.
4673 if (getModuleManager().getModuleCache().isPCMFinal(F.FileName)) {
4674 Diag(diag::warn_module_system_bit_conflict) << F.FileName;
4675 return Success;
4676 }
4677 }
4678
4679 return Result;
4680}
4681
4682ASTReader::ASTReadResult ASTReader::readUnhashedControlBlockImpl(
4683 ModuleFile *F, llvm::StringRef StreamData, unsigned ClientLoadCapabilities,
4684 bool AllowCompatibleConfigurationMismatch, ASTReaderListener *Listener,
4685 bool ValidateDiagnosticOptions) {
4686 // Initialize a stream.
4687 BitstreamCursor Stream(StreamData);
4688
4689 // Sniff for the signature.
4690 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
4691 // FIXME this drops the error on the floor.
4692 consumeError(std::move(Err));
4693 return Failure;
4694 }
4695
4696 // Scan for the UNHASHED_CONTROL_BLOCK_ID block.
4697 if (SkipCursorToBlock(Stream, UNHASHED_CONTROL_BLOCK_ID))
4698 return Failure;
4699
4700 // Read all of the records in the options block.
4701 RecordData Record;
4702 ASTReadResult Result = Success;
4703 while (true) {
4704 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
4705 if (!MaybeEntry) {
4706 // FIXME this drops the error on the floor.
4707 consumeError(MaybeEntry.takeError());
4708 return Failure;
4709 }
4710 llvm::BitstreamEntry Entry = MaybeEntry.get();
4711
4712 switch (Entry.Kind) {
4713 case llvm::BitstreamEntry::Error:
4714 case llvm::BitstreamEntry::SubBlock:
4715 return Failure;
4716
4717 case llvm::BitstreamEntry::EndBlock:
4718 return Result;
4719
4720 case llvm::BitstreamEntry::Record:
4721 // The interesting case.
4722 break;
4723 }
4724
4725 // Read and process a record.
4726 Record.clear();
4727 Expected<unsigned> MaybeRecordType = Stream.readRecord(Entry.ID, Record);
4728 if (!MaybeRecordType) {
4729 // FIXME this drops the error.
4730 return Failure;
4731 }
4732 switch ((UnhashedControlBlockRecordTypes)MaybeRecordType.get()) {
4733 case SIGNATURE:
4734 if (F)
4735 F->Signature = ASTFileSignature::create(Record.begin(), Record.end());
4736 break;
4737 case AST_BLOCK_HASH:
4738 if (F)
4739 F->ASTBlockHash =
4740 ASTFileSignature::create(Record.begin(), Record.end());
4741 break;
4742 case DIAGNOSTIC_OPTIONS: {
4743 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
4744 if (Listener && ValidateDiagnosticOptions &&
4745 !AllowCompatibleConfigurationMismatch &&
4746 ParseDiagnosticOptions(Record, Complain, *Listener))
4747 Result = OutOfDate; // Don't return early. Read the signature.
4748 break;
4749 }
4750 case DIAG_PRAGMA_MAPPINGS:
4751 if (!F)
4752 break;
4753 if (F->PragmaDiagMappings.empty())
4754 F->PragmaDiagMappings.swap(Record);
4755 else
4756 F->PragmaDiagMappings.insert(F->PragmaDiagMappings.end(),
4757 Record.begin(), Record.end());
4758 break;
4759 }
4760 }
4761}
4762
4763/// Parse a record and blob containing module file extension metadata.
4764static bool parseModuleFileExtensionMetadata(
4765 const SmallVectorImpl<uint64_t> &Record,
4766 StringRef Blob,
4767 ModuleFileExtensionMetadata &Metadata) {
4768 if (Record.size() < 4) return true;
4769
4770 Metadata.MajorVersion = Record[0];
4771 Metadata.MinorVersion = Record[1];
4772
4773 unsigned BlockNameLen = Record[2];
4774 unsigned UserInfoLen = Record[3];
4775
4776 if (BlockNameLen + UserInfoLen > Blob.size()) return true;
4777
4778 Metadata.BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen);
4779 Metadata.UserInfo = std::string(Blob.data() + BlockNameLen,
4780 Blob.data() + BlockNameLen + UserInfoLen);
4781 return false;
4782}
4783
4784llvm::Error ASTReader::ReadExtensionBlock(ModuleFile &F) {
4785 BitstreamCursor &Stream = F.Stream;
4786
4787 RecordData Record;
4788 while (true) {
4789 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
4790 if (!MaybeEntry)
4791 return MaybeEntry.takeError();
4792 llvm::BitstreamEntry Entry = MaybeEntry.get();
4793
4794 switch (Entry.Kind) {
4795 case llvm::BitstreamEntry::SubBlock:
4796 if (llvm::Error Err = Stream.SkipBlock())
4797 return Err;
4798 continue;
4799 case llvm::BitstreamEntry::EndBlock:
4800 return llvm::Error::success();
4801 case llvm::BitstreamEntry::Error:
4802 return llvm::createStringError(std::errc::illegal_byte_sequence,
4803 "malformed block record in AST file");
4804 case llvm::BitstreamEntry::Record:
4805 break;
4806 }
4807
4808 Record.clear();
4809 StringRef Blob;
4810 Expected<unsigned> MaybeRecCode =
4811 Stream.readRecord(Entry.ID, Record, &Blob);
4812 if (!MaybeRecCode)
4813 return MaybeRecCode.takeError();
4814 switch (MaybeRecCode.get()) {
4815 case EXTENSION_METADATA: {
4816 ModuleFileExtensionMetadata Metadata;
4817 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata))
4818 return llvm::createStringError(
4819 std::errc::illegal_byte_sequence,
4820 "malformed EXTENSION_METADATA in AST file");
4821
4822 // Find a module file extension with this block name.
4823 auto Known = ModuleFileExtensions.find(Metadata.BlockName);
4824 if (Known == ModuleFileExtensions.end()) break;
4825
4826 // Form a reader.
4827 if (auto Reader = Known->second->createExtensionReader(Metadata, *this,
4828 F, Stream)) {
4829 F.ExtensionReaders.push_back(std::move(Reader));
4830 }
4831
4832 break;
4833 }
4834 }
4835 }
4836
4837 return llvm::Error::success();
4838}
4839
4840void ASTReader::InitializeContext() {
4841 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 4841, __extension__ __PRETTY_FUNCTION__))
;
4842 ASTContext &Context = *ContextObj;
4843
4844 // If there's a listener, notify them that we "read" the translation unit.
4845 if (DeserializationListener)
4846 DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID,
4847 Context.getTranslationUnitDecl());
4848
4849 // FIXME: Find a better way to deal with collisions between these
4850 // built-in types. Right now, we just ignore the problem.
4851
4852 // Load the special types.
4853 if (SpecialTypes.size() >= NumSpecialTypeIDs) {
4854 if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) {
4855 if (!Context.CFConstantStringTypeDecl)
4856 Context.setCFConstantStringType(GetType(String));
4857 }
4858
4859 if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) {
4860 QualType FileType = GetType(File);
4861 if (FileType.isNull()) {
4862 Error("FILE type is NULL");
4863 return;
4864 }
4865
4866 if (!Context.FILEDecl) {
4867 if (const TypedefType *Typedef = FileType->getAs<TypedefType>())
4868 Context.setFILEDecl(Typedef->getDecl());
4869 else {
4870 const TagType *Tag = FileType->getAs<TagType>();
4871 if (!Tag) {
4872 Error("Invalid FILE type in AST file");
4873 return;
4874 }
4875 Context.setFILEDecl(Tag->getDecl());
4876 }
4877 }
4878 }
4879
4880 if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) {
4881 QualType Jmp_bufType = GetType(Jmp_buf);
4882 if (Jmp_bufType.isNull()) {
4883 Error("jmp_buf type is NULL");
4884 return;
4885 }
4886
4887 if (!Context.jmp_bufDecl) {
4888 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>())
4889 Context.setjmp_bufDecl(Typedef->getDecl());
4890 else {
4891 const TagType *Tag = Jmp_bufType->getAs<TagType>();
4892 if (!Tag) {
4893 Error("Invalid jmp_buf type in AST file");
4894 return;
4895 }
4896 Context.setjmp_bufDecl(Tag->getDecl());
4897 }
4898 }
4899 }
4900
4901 if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) {
4902 QualType Sigjmp_bufType = GetType(Sigjmp_buf);
4903 if (Sigjmp_bufType.isNull()) {
4904 Error("sigjmp_buf type is NULL");
4905 return;
4906 }
4907
4908 if (!Context.sigjmp_bufDecl) {
4909 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>())
4910 Context.setsigjmp_bufDecl(Typedef->getDecl());
4911 else {
4912 const TagType *Tag = Sigjmp_bufType->getAs<TagType>();
4913 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 4913, __extension__ __PRETTY_FUNCTION__))
;
4914 Context.setsigjmp_bufDecl(Tag->getDecl());
4915 }
4916 }
4917 }
4918
4919 if (unsigned ObjCIdRedef
4920 = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) {
4921 if (Context.ObjCIdRedefinitionType.isNull())
4922 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef);
4923 }
4924
4925 if (unsigned ObjCClassRedef
4926 = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) {
4927 if (Context.ObjCClassRedefinitionType.isNull())
4928 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef);
4929 }
4930
4931 if (unsigned ObjCSelRedef
4932 = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) {
4933 if (Context.ObjCSelRedefinitionType.isNull())
4934 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef);
4935 }
4936
4937 if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) {
4938 QualType Ucontext_tType = GetType(Ucontext_t);
4939 if (Ucontext_tType.isNull()) {
4940 Error("ucontext_t type is NULL");
4941 return;
4942 }
4943
4944 if (!Context.ucontext_tDecl) {
4945 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>())
4946 Context.setucontext_tDecl(Typedef->getDecl());
4947 else {
4948 const TagType *Tag = Ucontext_tType->getAs<TagType>();
4949 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 4949, __extension__ __PRETTY_FUNCTION__))
;
4950 Context.setucontext_tDecl(Tag->getDecl());
4951 }
4952 }
4953 }
4954 }
4955
4956 ReadPragmaDiagnosticMappings(Context.getDiagnostics());
4957
4958 // If there were any CUDA special declarations, deserialize them.
4959 if (!CUDASpecialDeclRefs.empty()) {
4960 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 4960, __extension__ __PRETTY_FUNCTION__))
;
4961 Context.setcudaConfigureCallDecl(
4962 cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0])));
4963 }
4964
4965 // Re-export any modules that were imported by a non-module AST file.
4966 // FIXME: This does not make macro-only imports visible again.
4967 for (auto &Import : ImportedModules) {
4968 if (Module *Imported = getSubmodule(Import.ID)) {
4969 makeModuleVisible(Imported, Module::AllVisible,
4970 /*ImportLoc=*/Import.ImportLoc);
4971 if (Import.ImportLoc.isValid())
4972 PP.makeModuleVisible(Imported, Import.ImportLoc);
4973 // This updates visibility for Preprocessor only. For Sema, which can be
4974 // nullptr here, we do the same later, in UpdateSema().
4975 }
4976 }
4977}
4978
4979void ASTReader::finalizeForWriting() {
4980 // Nothing to do for now.
4981}
4982
4983/// Reads and return the signature record from \p PCH's control block, or
4984/// else returns 0.
4985static ASTFileSignature readASTFileSignature(StringRef PCH) {
4986 BitstreamCursor Stream(PCH);
4987 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
4988 // FIXME this drops the error on the floor.
4989 consumeError(std::move(Err));
4990 return ASTFileSignature();
4991 }
4992
4993 // Scan for the UNHASHED_CONTROL_BLOCK_ID block.
4994 if (SkipCursorToBlock(Stream, UNHASHED_CONTROL_BLOCK_ID))
4995 return ASTFileSignature();
4996
4997 // Scan for SIGNATURE inside the diagnostic options block.
4998 ASTReader::RecordData Record;
4999 while (true) {
5000 Expected<llvm::BitstreamEntry> MaybeEntry =
5001 Stream.advanceSkippingSubblocks();
5002 if (!MaybeEntry) {
5003 // FIXME this drops the error on the floor.
5004 consumeError(MaybeEntry.takeError());
5005 return ASTFileSignature();
5006 }
5007 llvm::BitstreamEntry Entry = MaybeEntry.get();
5008
5009 if (Entry.Kind != llvm::BitstreamEntry::Record)
5010 return ASTFileSignature();
5011
5012 Record.clear();
5013 StringRef Blob;
5014 Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record, &Blob);
5015 if (!MaybeRecord) {
5016 // FIXME this drops the error on the floor.
5017 consumeError(MaybeRecord.takeError());
5018 return ASTFileSignature();
5019 }
5020 if (SIGNATURE == MaybeRecord.get())
5021 return ASTFileSignature::create(Record.begin(),
5022 Record.begin() + ASTFileSignature::size);
5023 }
5024}
5025
5026/// Retrieve the name of the original source file name
5027/// directly from the AST file, without actually loading the AST
5028/// file.
5029std::string ASTReader::getOriginalSourceFile(
5030 const std::string &ASTFileName, FileManager &FileMgr,
5031 const PCHContainerReader &PCHContainerRdr, DiagnosticsEngine &Diags) {
5032 // Open the AST file.
5033 auto Buffer = FileMgr.getBufferForFile(ASTFileName);
5034 if (!Buffer) {
5035 Diags.Report(diag::err_fe_unable_to_read_pch_file)
5036 << ASTFileName << Buffer.getError().message();
5037 return std::string();
5038 }
5039
5040 // Initialize the stream
5041 BitstreamCursor Stream(PCHContainerRdr.ExtractPCH(**Buffer));
5042
5043 // Sniff for the signature.
5044 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
5045 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName << std::move(Err);
5046 return std::string();
5047 }
5048
5049 // Scan for the CONTROL_BLOCK_ID block.
5050 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) {
5051 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
5052 return std::string();
5053 }
5054
5055 // Scan for ORIGINAL_FILE inside the control block.
5056 RecordData Record;
5057 while (true) {
5058 Expected<llvm::BitstreamEntry> MaybeEntry =
5059 Stream.advanceSkippingSubblocks();
5060 if (!MaybeEntry) {
5061 // FIXME this drops errors on the floor.
5062 consumeError(MaybeEntry.takeError());
5063 return std::string();
5064 }
5065 llvm::BitstreamEntry Entry = MaybeEntry.get();
5066
5067 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
5068 return std::string();
5069
5070 if (Entry.Kind != llvm::BitstreamEntry::Record) {
5071 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
5072 return std::string();
5073 }
5074
5075 Record.clear();
5076 StringRef Blob;
5077 Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record, &Blob);
5078 if (!MaybeRecord) {
5079 // FIXME this drops the errors on the floor.
5080 consumeError(MaybeRecord.takeError());
5081 return std::string();
5082 }
5083 if (ORIGINAL_FILE == MaybeRecord.get())
5084 return Blob.str();
5085 }
5086}
5087
5088namespace {
5089
5090 class SimplePCHValidator : public ASTReaderListener {
5091 const LangOptions &ExistingLangOpts;
5092 const TargetOptions &ExistingTargetOpts;
5093 const PreprocessorOptions &ExistingPPOpts;
5094 std::string ExistingModuleCachePath;
5095 FileManager &FileMgr;
5096
5097 public:
5098 SimplePCHValidator(const LangOptions &ExistingLangOpts,
5099 const TargetOptions &ExistingTargetOpts,
5100 const PreprocessorOptions &ExistingPPOpts,
5101 StringRef ExistingModuleCachePath, FileManager &FileMgr)
5102 : ExistingLangOpts(ExistingLangOpts),
5103 ExistingTargetOpts(ExistingTargetOpts),
5104 ExistingPPOpts(ExistingPPOpts),
5105 ExistingModuleCachePath(ExistingModuleCachePath), FileMgr(FileMgr) {}
5106
5107 bool ReadLanguageOptions(const LangOptions &LangOpts, bool Complain,
5108 bool AllowCompatibleDifferences) override {
5109 return checkLanguageOptions(ExistingLangOpts, LangOpts, nullptr,
5110 AllowCompatibleDifferences);
5111 }
5112
5113 bool ReadTargetOptions(const TargetOptions &TargetOpts, bool Complain,
5114 bool AllowCompatibleDifferences) override {
5115 return checkTargetOptions(ExistingTargetOpts, TargetOpts, nullptr,
5116 AllowCompatibleDifferences);
5117 }
5118
5119 bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
5120 StringRef SpecificModuleCachePath,
5121 bool Complain) override {
5122 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
5123 ExistingModuleCachePath, nullptr,
5124 ExistingLangOpts, ExistingPPOpts);
5125 }
5126
5127 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
5128 bool Complain,
5129 std::string &SuggestedPredefines) override {
5130 return checkPreprocessorOptions(ExistingPPOpts, PPOpts, nullptr, FileMgr,
5131 SuggestedPredefines, ExistingLangOpts);
5132 }
5133 };
5134
5135} // namespace
5136
5137bool ASTReader::readASTFileControlBlock(
5138 StringRef Filename, FileManager &FileMgr,
5139 const PCHContainerReader &PCHContainerRdr,
5140 bool FindModuleFileExtensions,
5141 ASTReaderListener &Listener, bool ValidateDiagnosticOptions) {
5142 // Open the AST file.
5143 // FIXME: This allows use of the VFS; we do not allow use of the
5144 // VFS when actually loading a module.
5145 auto Buffer = FileMgr.getBufferForFile(Filename);
5146 if (!Buffer) {
5147 return true;
5148 }
5149
5150 // Initialize the stream
5151 StringRef Bytes = PCHContainerRdr.ExtractPCH(**Buffer);
5152 BitstreamCursor Stream(Bytes);
5153
5154 // Sniff for the signature.
5155 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
5156 consumeError(std::move(Err)); // FIXME this drops errors on the floor.
5157 return true;
5158 }
5159
5160 // Scan for the CONTROL_BLOCK_ID block.
5161 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID))
5162 return true;
5163
5164 bool NeedsInputFiles = Listener.needsInputFileVisitation();
5165 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
5166 bool NeedsImports = Listener.needsImportVisitation();
5167 BitstreamCursor InputFilesCursor;
5168
5169 RecordData Record;
5170 std::string ModuleDir;
5171 bool DoneWithControlBlock = false;
5172 while (!DoneWithControlBlock) {
5173 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5174 if (!MaybeEntry) {
5175 // FIXME this drops the error on the floor.
5176 consumeError(MaybeEntry.takeError());
5177 return true;
5178 }
5179 llvm::BitstreamEntry Entry = MaybeEntry.get();
5180
5181 switch (Entry.Kind) {
5182 case llvm::BitstreamEntry::SubBlock: {
5183 switch (Entry.ID) {
5184 case OPTIONS_BLOCK_ID: {
5185 std::string IgnoredSuggestedPredefines;
5186 if (ReadOptionsBlock(Stream, ARR_ConfigurationMismatch | ARR_OutOfDate,
5187 /*AllowCompatibleConfigurationMismatch*/ false,
5188 Listener, IgnoredSuggestedPredefines) != Success)
5189 return true;
5190 break;
5191 }
5192
5193 case INPUT_FILES_BLOCK_ID:
5194 InputFilesCursor = Stream;
5195 if (llvm::Error Err = Stream.SkipBlock()) {
5196 // FIXME this drops the error on the floor.
5197 consumeError(std::move(Err));
5198 return true;
5199 }
5200 if (NeedsInputFiles &&
5201 ReadBlockAbbrevs(InputFilesCursor, INPUT_FILES_BLOCK_ID))
5202 return true;
5203 break;
5204
5205 default:
5206 if (llvm::Error Err = Stream.SkipBlock()) {
5207 // FIXME this drops the error on the floor.
5208 consumeError(std::move(Err));
5209 return true;
5210 }
5211 break;
5212 }
5213
5214 continue;
5215 }
5216
5217 case llvm::BitstreamEntry::EndBlock:
5218 DoneWithControlBlock = true;
5219 break;
5220
5221 case llvm::BitstreamEntry::Error:
5222 return true;
5223
5224 case llvm::BitstreamEntry::Record:
5225 break;
5226 }
5227
5228 if (DoneWithControlBlock) break;
5229
5230 Record.clear();
5231 StringRef Blob;
5232 Expected<unsigned> MaybeRecCode =
5233 Stream.readRecord(Entry.ID, Record, &Blob);
5234 if (!MaybeRecCode) {
5235 // FIXME this drops the error.
5236 return Failure;
5237 }
5238 switch ((ControlRecordTypes)MaybeRecCode.get()) {
5239 case METADATA:
5240 if (Record[0] != VERSION_MAJOR)
5241 return true;
5242 if (Listener.ReadFullVersionInformation(Blob))
5243 return true;
5244 break;
5245 case MODULE_NAME:
5246 Listener.ReadModuleName(Blob);
5247 break;
5248 case MODULE_DIRECTORY:
5249 ModuleDir = std::string(Blob);
5250 break;
5251 case MODULE_MAP_FILE: {
5252 unsigned Idx = 0;
5253 auto Path = ReadString(Record, Idx);
5254 ResolveImportedPath(Path, ModuleDir);
5255 Listener.ReadModuleMapFile(Path);
5256 break;
5257 }
5258 case INPUT_FILE_OFFSETS: {
5259 if (!NeedsInputFiles)
5260 break;
5261
5262 unsigned NumInputFiles = Record[0];
5263 unsigned NumUserFiles = Record[1];
5264 const llvm::support::unaligned_uint64_t *InputFileOffs =
5265 (const llvm::support::unaligned_uint64_t *)Blob.data();
5266 for (unsigned I = 0; I != NumInputFiles; ++I) {
5267 // Go find this input file.
5268 bool isSystemFile = I >= NumUserFiles;
5269
5270 if (isSystemFile && !NeedsSystemInputFiles)
5271 break; // the rest are system input files
5272
5273 BitstreamCursor &Cursor = InputFilesCursor;
5274 SavedStreamPosition SavedPosition(Cursor);
5275 if (llvm::Error Err = Cursor.JumpToBit(InputFileOffs[I])) {
5276 // FIXME this drops errors on the floor.
5277 consumeError(std::move(Err));
5278 }
5279
5280 Expected<unsigned> MaybeCode = Cursor.ReadCode();
5281 if (!MaybeCode) {
5282 // FIXME this drops errors on the floor.
5283 consumeError(MaybeCode.takeError());
5284 }
5285 unsigned Code = MaybeCode.get();
5286
5287 RecordData Record;
5288 StringRef Blob;
5289 bool shouldContinue = false;
5290 Expected<unsigned> MaybeRecordType =
5291 Cursor.readRecord(Code, Record, &Blob);
5292 if (!MaybeRecordType) {
5293 // FIXME this drops errors on the floor.
5294 consumeError(MaybeRecordType.takeError());
5295 }
5296 switch ((InputFileRecordTypes)MaybeRecordType.get()) {
5297 case INPUT_FILE_HASH:
5298 break;
5299 case INPUT_FILE:
5300 bool Overridden = static_cast<bool>(Record[3]);
5301 std::string Filename = std::string(Blob);
5302 ResolveImportedPath(Filename, ModuleDir);
5303 shouldContinue = Listener.visitInputFile(
5304 Filename, isSystemFile, Overridden, /*IsExplicitModule*/false);
5305 break;
5306 }
5307 if (!shouldContinue)
5308 break;
5309 }
5310 break;
5311 }
5312
5313 case IMPORTS: {
5314 if (!NeedsImports)
5315 break;
5316
5317 unsigned Idx = 0, N = Record.size();
5318 while (Idx < N) {
5319 // Read information about the AST file.
5320 Idx +=
5321 1 + 1 + 1 + 1 +
5322 ASTFileSignature::size; // Kind, ImportLoc, Size, ModTime, Signature
5323 std::string ModuleName = ReadString(Record, Idx);
5324 std::string Filename = ReadString(Record, Idx);
5325 ResolveImportedPath(Filename, ModuleDir);
5326 Listener.visitImport(ModuleName, Filename);
5327 }
5328 break;
5329 }
5330
5331 default:
5332 // No other validation to perform.
5333 break;
5334 }
5335 }
5336
5337 // Look for module file extension blocks, if requested.
5338 if (FindModuleFileExtensions) {
5339 BitstreamCursor SavedStream = Stream;
5340 while (!SkipCursorToBlock(Stream, EXTENSION_BLOCK_ID)) {
5341 bool DoneWithExtensionBlock = false;
5342 while (!DoneWithExtensionBlock) {
5343 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5344 if (!MaybeEntry) {
5345 // FIXME this drops the error.
5346 return true;
5347 }
5348 llvm::BitstreamEntry Entry = MaybeEntry.get();
5349
5350 switch (Entry.Kind) {
5351 case llvm::BitstreamEntry::SubBlock:
5352 if (llvm::Error Err = Stream.SkipBlock()) {
5353 // FIXME this drops the error on the floor.
5354 consumeError(std::move(Err));
5355 return true;
5356 }
5357 continue;
5358
5359 case llvm::BitstreamEntry::EndBlock:
5360 DoneWithExtensionBlock = true;
5361 continue;
5362
5363 case llvm::BitstreamEntry::Error:
5364 return true;
5365
5366 case llvm::BitstreamEntry::Record:
5367 break;
5368 }
5369
5370 Record.clear();
5371 StringRef Blob;
5372 Expected<unsigned> MaybeRecCode =
5373 Stream.readRecord(Entry.ID, Record, &Blob);
5374 if (!MaybeRecCode) {
5375 // FIXME this drops the error.
5376 return true;
5377 }
5378 switch (MaybeRecCode.get()) {
5379 case EXTENSION_METADATA: {
5380 ModuleFileExtensionMetadata Metadata;
5381 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata))
5382 return true;
5383
5384 Listener.readModuleFileExtension(Metadata);
5385 break;
5386 }
5387 }
5388 }
5389 }
5390 Stream = SavedStream;
5391 }
5392
5393 // Scan for the UNHASHED_CONTROL_BLOCK_ID block.
5394 if (readUnhashedControlBlockImpl(
5395 nullptr, Bytes, ARR_ConfigurationMismatch | ARR_OutOfDate,
5396 /*AllowCompatibleConfigurationMismatch*/ false, &Listener,
5397 ValidateDiagnosticOptions) != Success)
5398 return true;
5399
5400 return false;
5401}
5402
5403bool ASTReader::isAcceptableASTFile(StringRef Filename, FileManager &FileMgr,
5404 const PCHContainerReader &PCHContainerRdr,
5405 const LangOptions &LangOpts,
5406 const TargetOptions &TargetOpts,
5407 const PreprocessorOptions &PPOpts,
5408 StringRef ExistingModuleCachePath) {
5409 SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts,
5410 ExistingModuleCachePath, FileMgr);
5411 return !readASTFileControlBlock(Filename, FileMgr, PCHContainerRdr,
5412 /*FindModuleFileExtensions=*/false,
5413 validator,
5414 /*ValidateDiagnosticOptions=*/true);
5415}
5416
5417llvm::Error ASTReader::ReadSubmoduleBlock(ModuleFile &F,
5418 unsigned ClientLoadCapabilities) {
5419 // Enter the submodule block.
5420 if (llvm::Error Err = F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID))
5421 return Err;
5422
5423 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
5424 bool First = true;
5425 Module *CurrentModule = nullptr;
5426 RecordData Record;
5427 while (true) {
5428 Expected<llvm::BitstreamEntry> MaybeEntry =
5429 F.Stream.advanceSkippingSubblocks();
5430 if (!MaybeEntry)
5431 return MaybeEntry.takeError();
5432 llvm::BitstreamEntry Entry = MaybeEntry.get();
5433
5434 switch (Entry.Kind) {
5435 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
5436 case llvm::BitstreamEntry::Error:
5437 return llvm::createStringError(std::errc::illegal_byte_sequence,
5438 "malformed block record in AST file");
5439 case llvm::BitstreamEntry::EndBlock:
5440 return llvm::Error::success();
5441 case llvm::BitstreamEntry::Record:
5442 // The interesting case.
5443 break;
5444 }
5445
5446 // Read a record.
5447 StringRef Blob;
5448 Record.clear();
5449 Expected<unsigned> MaybeKind = F.Stream.readRecord(Entry.ID, Record, &Blob);
5450 if (!MaybeKind)
5451 return MaybeKind.takeError();
5452 unsigned Kind = MaybeKind.get();
5453
5454 if ((Kind == SUBMODULE_METADATA) != First)
5455 return llvm::createStringError(
5456 std::errc::illegal_byte_sequence,
5457 "submodule metadata record should be at beginning of block");
5458 First = false;
5459
5460 // Submodule information is only valid if we have a current module.
5461 // FIXME: Should we error on these cases?
5462 if (!CurrentModule && Kind != SUBMODULE_METADATA &&
5463 Kind != SUBMODULE_DEFINITION)
5464 continue;
5465
5466 switch (Kind) {
5467 default: // Default behavior: ignore.
5468 break;
5469
5470 case SUBMODULE_DEFINITION: {
5471 if (Record.size() < 12)
5472 return llvm::createStringError(std::errc::illegal_byte_sequence,
5473 "malformed module definition");
5474
5475 StringRef Name = Blob;
5476 unsigned Idx = 0;
5477 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]);
5478 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]);
5479 Module::ModuleKind Kind = (Module::ModuleKind)Record[Idx++];
5480 bool IsFramework = Record[Idx++];
5481 bool IsExplicit = Record[Idx++];
5482 bool IsSystem = Record[Idx++];
5483 bool IsExternC = Record[Idx++];
5484 bool InferSubmodules = Record[Idx++];
5485 bool InferExplicitSubmodules = Record[Idx++];
5486 bool InferExportWildcard = Record[Idx++];
5487 bool ConfigMacrosExhaustive = Record[Idx++];
5488 bool ModuleMapIsPrivate = Record[Idx++];
5489
5490 Module *ParentModule = nullptr;
5491 if (Parent)
5492 ParentModule = getSubmodule(Parent);
5493
5494 // Retrieve this (sub)module from the module map, creating it if
5495 // necessary.
5496 CurrentModule =
5497 ModMap.findOrCreateModule(Name, ParentModule, IsFramework, IsExplicit)
5498 .first;
5499
5500 // FIXME: set the definition loc for CurrentModule, or call
5501 // ModMap.setInferredModuleAllowedBy()
5502
5503 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS;
5504 if (GlobalIndex >= SubmodulesLoaded.size() ||
5505 SubmodulesLoaded[GlobalIndex])
5506 return llvm::createStringError(std::errc::invalid_argument,
5507 "too many submodules");
5508
5509 if (!ParentModule) {
5510 if (const FileEntry *CurFile = CurrentModule->getASTFile()) {
5511 // Don't emit module relocation error if we have -fno-validate-pch
5512 if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
5513 DisableValidationForModuleKind::Module) &&
5514 CurFile != F.File) {
5515 auto ConflictError =
5516 PartialDiagnostic(diag::err_module_file_conflict,
5517 ContextObj->DiagAllocator)
5518 << CurrentModule->getTopLevelModuleName() << CurFile->getName()
5519 << F.File->getName();
5520 return DiagnosticError::create(CurrentImportLoc, ConflictError);
5521 }
5522 }
5523
5524 F.DidReadTopLevelSubmodule = true;
5525 CurrentModule->setASTFile(F.File);
5526 CurrentModule->PresumedModuleMapFile = F.ModuleMapPath;
5527 }
5528
5529 CurrentModule->Kind = Kind;
5530 CurrentModule->Signature = F.Signature;
5531 CurrentModule->IsFromModuleFile = true;
5532 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem;
5533 CurrentModule->IsExternC = IsExternC;
5534 CurrentModule->InferSubmodules = InferSubmodules;
5535 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules;
5536 CurrentModule->InferExportWildcard = InferExportWildcard;
5537 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive;
5538 CurrentModule->ModuleMapIsPrivate = ModuleMapIsPrivate;
5539 if (DeserializationListener)
5540 DeserializationListener->ModuleRead(GlobalID, CurrentModule);
5541
5542 SubmodulesLoaded[GlobalIndex] = CurrentModule;
5543
5544 // Clear out data that will be replaced by what is in the module file.
5545 CurrentModule->LinkLibraries.clear();
5546 CurrentModule->ConfigMacros.clear();
5547 CurrentModule->UnresolvedConflicts.clear();
5548 CurrentModule->Conflicts.clear();
5549
5550 // The module is available unless it's missing a requirement; relevant
5551 // requirements will be (re-)added by SUBMODULE_REQUIRES records.
5552 // Missing headers that were present when the module was built do not
5553 // make it unavailable -- if we got this far, this must be an explicitly
5554 // imported module file.
5555 CurrentModule->Requirements.clear();
5556 CurrentModule->MissingHeaders.clear();
5557 CurrentModule->IsUnimportable =
5558 ParentModule && ParentModule->IsUnimportable;
5559 CurrentModule->IsAvailable = !CurrentModule->IsUnimportable;
5560 break;
5561 }
5562
5563 case SUBMODULE_UMBRELLA_HEADER: {
5564 // FIXME: This doesn't work for framework modules as `Filename` is the
5565 // name as written in the module file and does not include
5566 // `Headers/`, so this path will never exist.
5567 std::string Filename = std::string(Blob);
5568 ResolveImportedPath(F, Filename);
5569 if (auto Umbrella = PP.getFileManager().getFile(Filename)) {
5570 if (!CurrentModule->getUmbrellaHeader()) {
5571 // FIXME: NameAsWritten
5572 ModMap.setUmbrellaHeader(CurrentModule, *Umbrella, Blob, "");
5573 }
5574 // Note that it's too late at this point to return out of date if the
5575 // name from the PCM doesn't match up with the one in the module map,
5576 // but also quite unlikely since we will have already checked the
5577 // modification time and size of the module map file itself.
5578 }
5579 break;
5580 }
5581
5582 case SUBMODULE_HEADER:
5583 case SUBMODULE_EXCLUDED_HEADER:
5584 case SUBMODULE_PRIVATE_HEADER:
5585 // We lazily associate headers with their modules via the HeaderInfo table.
5586 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
5587 // of complete filenames or remove it entirely.
5588 break;
5589
5590 case SUBMODULE_TEXTUAL_HEADER:
5591 case SUBMODULE_PRIVATE_TEXTUAL_HEADER:
5592 // FIXME: Textual headers are not marked in the HeaderInfo table. Load
5593 // them here.
5594 break;
5595
5596 case SUBMODULE_TOPHEADER:
5597 CurrentModule->addTopHeaderFilename(Blob);
5598 break;
5599
5600 case SUBMODULE_UMBRELLA_DIR: {
5601 // See comments in SUBMODULE_UMBRELLA_HEADER
5602 std::string Dirname = std::string(Blob);
5603 ResolveImportedPath(F, Dirname);
5604 if (auto Umbrella = PP.getFileManager().getDirectory(Dirname)) {
5605 if (!CurrentModule->getUmbrellaDir()) {
5606 // FIXME: NameAsWritten
5607 ModMap.setUmbrellaDir(CurrentModule, *Umbrella, Blob, "");
5608 }
5609 }
5610 break;
5611 }
5612
5613 case SUBMODULE_METADATA: {
5614 F.BaseSubmoduleID = getTotalNumSubmodules();
5615 F.LocalNumSubmodules = Record[0];
5616 unsigned LocalBaseSubmoduleID = Record[1];
5617 if (F.LocalNumSubmodules > 0) {
5618 // Introduce the global -> local mapping for submodules within this
5619 // module.
5620 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F));
5621
5622 // Introduce the local -> global mapping for submodules within this
5623 // module.
5624 F.SubmoduleRemap.insertOrReplace(
5625 std::make_pair(LocalBaseSubmoduleID,
5626 F.BaseSubmoduleID - LocalBaseSubmoduleID));
5627
5628 SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules);
5629 }
5630 break;
5631 }
5632
5633 case SUBMODULE_IMPORTS:
5634 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) {
5635 UnresolvedModuleRef Unresolved;
5636 Unresolved.File = &F;
5637 Unresolved.Mod = CurrentModule;
5638 Unresolved.ID = Record[Idx];
5639 Unresolved.Kind = UnresolvedModuleRef::Import;
5640 Unresolved.IsWildcard = false;
5641 UnresolvedModuleRefs.push_back(Unresolved);
5642 }
5643 break;
5644
5645 case SUBMODULE_EXPORTS:
5646 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) {
5647 UnresolvedModuleRef Unresolved;
5648 Unresolved.File = &F;
5649 Unresolved.Mod = CurrentModule;
5650 Unresolved.ID = Record[Idx];
5651 Unresolved.Kind = UnresolvedModuleRef::Export;
5652 Unresolved.IsWildcard = Record[Idx + 1];
5653 UnresolvedModuleRefs.push_back(Unresolved);
5654 }
5655
5656 // Once we've loaded the set of exports, there's no reason to keep
5657 // the parsed, unresolved exports around.
5658 CurrentModule->UnresolvedExports.clear();
5659 break;
5660
5661 case SUBMODULE_REQUIRES:
5662 CurrentModule->addRequirement(Blob, Record[0], PP.getLangOpts(),
5663 PP.getTargetInfo());
5664 break;
5665
5666 case SUBMODULE_LINK_LIBRARY:
5667 ModMap.resolveLinkAsDependencies(CurrentModule);
5668 CurrentModule->LinkLibraries.push_back(
5669 Module::LinkLibrary(std::string(Blob), Record[0]));
5670 break;
5671
5672 case SUBMODULE_CONFIG_MACRO:
5673 CurrentModule->ConfigMacros.push_back(Blob.str());
5674 break;
5675
5676 case SUBMODULE_CONFLICT: {
5677 UnresolvedModuleRef Unresolved;
5678 Unresolved.File = &F;
5679 Unresolved.Mod = CurrentModule;
5680 Unresolved.ID = Record[0];
5681 Unresolved.Kind = UnresolvedModuleRef::Conflict;
5682 Unresolved.IsWildcard = false;
5683 Unresolved.String = Blob;
5684 UnresolvedModuleRefs.push_back(Unresolved);
5685 break;
5686 }
5687
5688 case SUBMODULE_INITIALIZERS: {
5689 if (!ContextObj)
5690 break;
5691 SmallVector<uint32_t, 16> Inits;
5692 for (auto &ID : Record)
5693 Inits.push_back(getGlobalDeclID(F, ID));
5694 ContextObj->addLazyModuleInitializers(CurrentModule, Inits);
5695 break;
5696 }
5697
5698 case SUBMODULE_EXPORT_AS:
5699 CurrentModule->ExportAsModule = Blob.str();
5700 ModMap.addLinkAsDependency(CurrentModule);
5701 break;
5702 }
5703 }
5704}
5705
5706/// Parse the record that corresponds to a LangOptions data
5707/// structure.
5708///
5709/// This routine parses the language options from the AST file and then gives
5710/// them to the AST listener if one is set.
5711///
5712/// \returns true if the listener deems the file unacceptable, false otherwise.
5713bool ASTReader::ParseLanguageOptions(const RecordData &Record,
5714 bool Complain,
5715 ASTReaderListener &Listener,
5716 bool AllowCompatibleDifferences) {
5717 LangOptions LangOpts;
5718 unsigned Idx = 0;
5719#define LANGOPT(Name, Bits, Default, Description) \
5720 LangOpts.Name = Record[Idx++];
5721#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
5722 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
5723#include "clang/Basic/LangOptions.def"
5724#define SANITIZER(NAME, ID) \
5725 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]);
5726#include "clang/Basic/Sanitizers.def"
5727
5728 for (unsigned N = Record[Idx++]; N; --N)
5729 LangOpts.ModuleFeatures.push_back(ReadString(Record, Idx));
5730
5731 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++];
5732 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx);
5733 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion);
5734
5735 LangOpts.CurrentModule = ReadString(Record, Idx);
5736
5737 // Comment options.
5738 for (unsigned N = Record[Idx++]; N; --N) {
5739 LangOpts.CommentOpts.BlockCommandNames.push_back(
5740 ReadString(Record, Idx));
5741 }
5742 LangOpts.CommentOpts.ParseAllComments = Record[Idx++];
5743
5744 // OpenMP offloading options.
5745 for (unsigned N = Record[Idx++]; N; --N) {
5746 LangOpts.OMPTargetTriples.push_back(llvm::Triple(ReadString(Record, Idx)));
5747 }
5748
5749 LangOpts.OMPHostIRFile = ReadString(Record, Idx);
5750
5751 return Listener.ReadLanguageOptions(LangOpts, Complain,
5752 AllowCompatibleDifferences);
5753}
5754
5755bool ASTReader::ParseTargetOptions(const RecordData &Record, bool Complain,
5756 ASTReaderListener &Listener,
5757 bool AllowCompatibleDifferences) {
5758 unsigned Idx = 0;
5759 TargetOptions TargetOpts;
5760 TargetOpts.Triple = ReadString(Record, Idx);
5761 TargetOpts.CPU = ReadString(Record, Idx);
5762 TargetOpts.TuneCPU = ReadString(Record, Idx);
5763 TargetOpts.ABI = ReadString(Record, Idx);
5764 for (unsigned N = Record[Idx++]; N; --N) {
5765 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx));
5766 }
5767 for (unsigned N = Record[Idx++]; N; --N) {
5768 TargetOpts.Features.push_back(ReadString(Record, Idx));
5769 }
5770
5771 return Listener.ReadTargetOptions(TargetOpts, Complain,
5772 AllowCompatibleDifferences);
5773}
5774
5775bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain,
5776 ASTReaderListener &Listener) {
5777 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions);
5778 unsigned Idx = 0;
5779#define DIAGOPT(Name, Bits, Default) DiagOpts->Name = Record[Idx++];
5780#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
5781 DiagOpts->set##Name(static_cast<Type>(Record[Idx++]));
5782#include "clang/Basic/DiagnosticOptions.def"
5783
5784 for (unsigned N = Record[Idx++]; N; --N)
5785 DiagOpts->Warnings.push_back(ReadString(Record, Idx));
5786 for (unsigned N = Record[Idx++]; N; --N)
5787 DiagOpts->Remarks.push_back(ReadString(Record, Idx));
5788
5789 return Listener.ReadDiagnosticOptions(DiagOpts, Complain);
5790}
5791
5792bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain,
5793 ASTReaderListener &Listener) {
5794 FileSystemOptions FSOpts;
5795 unsigned Idx = 0;
5796 FSOpts.WorkingDir = ReadString(Record, Idx);
5797 return Listener.ReadFileSystemOptions(FSOpts, Complain);
5798}
5799
5800bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record,
5801 bool Complain,
5802 ASTReaderListener &Listener) {
5803 HeaderSearchOptions HSOpts;
5804 unsigned Idx = 0;
5805 HSOpts.Sysroot = ReadString(Record, Idx);
5806
5807 // Include entries.
5808 for (unsigned N = Record[Idx++]; N; --N) {
5809 std::string Path = ReadString(Record, Idx);
5810 frontend::IncludeDirGroup Group
5811 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]);
5812 bool IsFramework = Record[Idx++];
5813 bool IgnoreSysRoot = Record[Idx++];
5814 HSOpts.UserEntries.emplace_back(std::move(Path), Group, IsFramework,
5815 IgnoreSysRoot);
5816 }
5817
5818 // System header prefixes.
5819 for (unsigned N = Record[Idx++]; N; --N) {
5820 std::string Prefix = ReadString(Record, Idx);
5821 bool IsSystemHeader = Record[Idx++];
5822 HSOpts.SystemHeaderPrefixes.emplace_back(std::move(Prefix), IsSystemHeader);
5823 }
5824
5825 HSOpts.ResourceDir = ReadString(Record, Idx);
5826 HSOpts.ModuleCachePath = ReadString(Record, Idx);
5827 HSOpts.ModuleUserBuildPath = ReadString(Record, Idx);
5828 HSOpts.DisableModuleHash = Record[Idx++];
5829 HSOpts.ImplicitModuleMaps = Record[Idx++];
5830 HSOpts.ModuleMapFileHomeIsCwd = Record[Idx++];
5831 HSOpts.EnablePrebuiltImplicitModules = Record[Idx++];
5832 HSOpts.UseBuiltinIncludes = Record[Idx++];
5833 HSOpts.UseStandardSystemIncludes = Record[Idx++];
5834 HSOpts.UseStandardCXXIncludes = Record[Idx++];
5835 HSOpts.UseLibcxx = Record[Idx++];
5836 std::string SpecificModuleCachePath = ReadString(Record, Idx);
5837
5838 return Listener.ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
5839 Complain);
5840}
5841
5842bool ASTReader::ParsePreprocessorOptions(const RecordData &Record,
5843 bool Complain,
5844 ASTReaderListener &Listener,
5845 std::string &SuggestedPredefines) {
5846 PreprocessorOptions PPOpts;
5847 unsigned Idx = 0;
5848
5849 // Macro definitions/undefs
5850 for (unsigned N = Record[Idx++]; N; --N) {
5851 std::string Macro = ReadString(Record, Idx);
5852 bool IsUndef = Record[Idx++];
5853 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef));
5854 }
5855
5856 // Includes
5857 for (unsigned N = Record[Idx++]; N; --N) {
5858 PPOpts.Includes.push_back(ReadString(Record, Idx));
5859 }
5860
5861 // Macro Includes
5862 for (unsigned N = Record[Idx++]; N; --N) {
5863 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx));
5864 }
5865
5866 PPOpts.UsePredefines = Record[Idx++];
5867 PPOpts.DetailedRecord = Record[Idx++];
5868 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx);
5869 PPOpts.ObjCXXARCStandardLibrary =
5870 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]);
5871 SuggestedPredefines.clear();
5872 return Listener.ReadPreprocessorOptions(PPOpts, Complain,
5873 SuggestedPredefines);
5874}
5875
5876std::pair<ModuleFile *, unsigned>
5877ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) {
5878 GlobalPreprocessedEntityMapType::iterator
5879 I = GlobalPreprocessedEntityMap.find(GlobalIndex);
5880 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 5881, __extension__ __PRETTY_FUNCTION__))
5881 "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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 5881, __extension__ __PRETTY_FUNCTION__))
;
5882 ModuleFile *M = I->second;
5883 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID;
5884 return std::make_pair(M, LocalIndex);
5885}
5886
5887llvm::iterator_range<PreprocessingRecord::iterator>
5888ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const {
5889 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
5890 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID,
5891 Mod.NumPreprocessedEntities);
5892
5893 return llvm::make_range(PreprocessingRecord::iterator(),
5894 PreprocessingRecord::iterator());
5895}
5896
5897bool ASTReader::canRecoverFromOutOfDate(StringRef ModuleFileName,
5898 unsigned int ClientLoadCapabilities) {
5899 return ClientLoadCapabilities & ARR_OutOfDate &&
5900 !getModuleManager().getModuleCache().isPCMFinal(ModuleFileName);
5901}
5902
5903llvm::iterator_range<ASTReader::ModuleDeclIterator>
5904ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) {
5905 return llvm::make_range(
5906 ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls),
5907 ModuleDeclIterator(this, &Mod,
5908 Mod.FileSortedDecls + Mod.NumFileSortedDecls));
5909}
5910
5911SourceRange ASTReader::ReadSkippedRange(unsigned GlobalIndex) {
5912 auto I = GlobalSkippedRangeMap.find(GlobalIndex);
5913 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 5914, __extension__ __PRETTY_FUNCTION__))
5914 "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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 5914, __extension__ __PRETTY_FUNCTION__))
;
5915 ModuleFile *M = I->second;
5916 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedSkippedRangeID;
5917 assert(LocalIndex < M->NumPreprocessedSkippedRanges)(static_cast <bool> (LocalIndex < M->NumPreprocessedSkippedRanges
) ? void (0) : __assert_fail ("LocalIndex < M->NumPreprocessedSkippedRanges"
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 5917, __extension__ __PRETTY_FUNCTION__))
;
5918 PPSkippedRange RawRange = M->PreprocessedSkippedRangeOffsets[LocalIndex];
5919 SourceRange Range(TranslateSourceLocation(*M, RawRange.getBegin()),
5920 TranslateSourceLocation(*M, RawRange.getEnd()));
5921 assert(Range.isValid())(static_cast <bool> (Range.isValid()) ? void (0) : __assert_fail
("Range.isValid()", "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 5921, __extension__ __PRETTY_FUNCTION__))
;
5922 return Range;
5923}
5924
5925PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) {
5926 PreprocessedEntityID PPID = Index+1;
5927 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
5928 ModuleFile &M = *PPInfo.first;
5929 unsigned LocalIndex = PPInfo.second;
5930 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
5931
5932 if (!PP.getPreprocessingRecord()) {
5933 Error("no preprocessing record");
5934 return nullptr;
5935 }
5936
5937 SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor);
5938 if (llvm::Error Err = M.PreprocessorDetailCursor.JumpToBit(
5939 M.MacroOffsetsBase + PPOffs.BitOffset)) {
5940 Error(std::move(Err));
5941 return nullptr;
5942 }
5943
5944 Expected<llvm::BitstreamEntry> MaybeEntry =
5945 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
5946 if (!MaybeEntry) {
5947 Error(MaybeEntry.takeError());
5948 return nullptr;
5949 }
5950 llvm::BitstreamEntry Entry = MaybeEntry.get();
5951
5952 if (Entry.Kind != llvm::BitstreamEntry::Record)
5953 return nullptr;
5954
5955 // Read the record.
5956 SourceRange Range(TranslateSourceLocation(M, PPOffs.getBegin()),
5957 TranslateSourceLocation(M, PPOffs.getEnd()));
5958 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
5959 StringRef Blob;
5960 RecordData Record;
5961 Expected<unsigned> MaybeRecType =
5962 M.PreprocessorDetailCursor.readRecord(Entry.ID, Record, &Blob);
5963 if (!MaybeRecType) {
5964 Error(MaybeRecType.takeError());
5965 return nullptr;
5966 }
5967 switch ((PreprocessorDetailRecordTypes)MaybeRecType.get()) {
5968 case PPD_MACRO_EXPANSION: {
5969 bool isBuiltin = Record[0];
5970 IdentifierInfo *Name = nullptr;
5971 MacroDefinitionRecord *Def = nullptr;
5972 if (isBuiltin)
5973 Name = getLocalIdentifier(M, Record[1]);
5974 else {
5975 PreprocessedEntityID GlobalID =
5976 getGlobalPreprocessedEntityID(M, Record[1]);
5977 Def = cast<MacroDefinitionRecord>(
5978 PPRec.getLoadedPreprocessedEntity(GlobalID - 1));
5979 }
5980
5981 MacroExpansion *ME;
5982 if (isBuiltin)
5983 ME = new (PPRec) MacroExpansion(Name, Range);
5984 else
5985 ME = new (PPRec) MacroExpansion(Def, Range);
5986
5987 return ME;
5988 }
5989
5990 case PPD_MACRO_DEFINITION: {
5991 // Decode the identifier info and then check again; if the macro is
5992 // still defined and associated with the identifier,
5993 IdentifierInfo *II = getLocalIdentifier(M, Record[0]);
5994 MacroDefinitionRecord *MD = new (PPRec) MacroDefinitionRecord(II, Range);
5995
5996 if (DeserializationListener)
5997 DeserializationListener->MacroDefinitionRead(PPID, MD);
5998
5999 return MD;
6000 }
6001
6002 case PPD_INCLUSION_DIRECTIVE: {
6003 const char *FullFileNameStart = Blob.data() + Record[0];
6004 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]);
6005 const FileEntry *File = nullptr;
6006 if (!FullFileName.empty())
6007 if (auto FE = PP.getFileManager().getFile(FullFileName))
6008 File = *FE;
6009
6010 // FIXME: Stable encoding
6011 InclusionDirective::InclusionKind Kind
6012 = static_cast<InclusionDirective::InclusionKind>(Record[2]);
6013 InclusionDirective *ID
6014 = new (PPRec) InclusionDirective(PPRec, Kind,
6015 StringRef(Blob.data(), Record[0]),
6016 Record[1], Record[3],
6017 File,
6018 Range);
6019 return ID;
6020 }
6021 }
6022
6023 llvm_unreachable("Invalid PreprocessorDetailRecordTypes")::llvm::llvm_unreachable_internal("Invalid PreprocessorDetailRecordTypes"
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 6023)
;
6024}
6025
6026/// Find the next module that contains entities and return the ID
6027/// of the first entry.
6028///
6029/// \param SLocMapI points at a chunk of a module that contains no
6030/// preprocessed entities or the entities it contains are not the ones we are
6031/// looking for.
6032PreprocessedEntityID ASTReader::findNextPreprocessedEntity(
6033 GlobalSLocOffsetMapType::const_iterator SLocMapI) const {
6034 ++SLocMapI;
6035 for (GlobalSLocOffsetMapType::const_iterator
6036 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
6037 ModuleFile &M = *SLocMapI->second;
6038 if (M.NumPreprocessedEntities)
6039 return M.BasePreprocessedEntityID;
6040 }
6041
6042 return getTotalNumPreprocessedEntities();
6043}
6044
6045namespace {
6046
6047struct PPEntityComp {
6048 const ASTReader &Reader;
6049 ModuleFile &M;
6050
6051 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) {}
6052
6053 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const {
6054 SourceLocation LHS = getLoc(L);
6055 SourceLocation RHS = getLoc(R);
6056 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6057 }
6058
6059 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const {
6060 SourceLocation LHS = getLoc(L);
6061 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6062 }
6063
6064 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const {
6065 SourceLocation RHS = getLoc(R);
6066 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6067 }
6068
6069 SourceLocation getLoc(const PPEntityOffset &PPE) const {
6070 return Reader.TranslateSourceLocation(M, PPE.getBegin());
6071 }
6072};
6073
6074} // namespace
6075
6076PreprocessedEntityID ASTReader::findPreprocessedEntity(SourceLocation Loc,
6077 bool EndsAfter) const {
6078 if (SourceMgr.isLocalSourceLocation(Loc))
6079 return getTotalNumPreprocessedEntities();
6080
6081 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
6082 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
6083 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 6084, __extension__ __PRETTY_FUNCTION__))
6084 "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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 6084, __extension__ __PRETTY_FUNCTION__))
;
6085
6086 if (SLocMapI->second->NumPreprocessedEntities == 0)
6087 return findNextPreprocessedEntity(SLocMapI);
6088
6089 ModuleFile &M = *SLocMapI->second;
6090
6091 using pp_iterator = const PPEntityOffset *;
6092
6093 pp_iterator pp_begin = M.PreprocessedEntityOffsets;
6094 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities;
6095
6096 size_t Count = M.NumPreprocessedEntities;
6097 size_t Half;
6098 pp_iterator First = pp_begin;
6099 pp_iterator PPI;
6100
6101 if (EndsAfter) {
6102 PPI = std::upper_bound(pp_begin, pp_end, Loc,
6103 PPEntityComp(*this, M));
6104 } else {
6105 // Do a binary search manually instead of using std::lower_bound because
6106 // The end locations of entities may be unordered (when a macro expansion
6107 // is inside another macro argument), but for this case it is not important
6108 // whether we get the first macro expansion or its containing macro.
6109 while (Count > 0) {
6110 Half = Count / 2;
6111 PPI = First;
6112 std::advance(PPI, Half);
6113 if (SourceMgr.isBeforeInTranslationUnit(
6114 TranslateSourceLocation(M, PPI->getEnd()), Loc)) {
6115 First = PPI;
6116 ++First;
6117 Count = Count - Half - 1;
6118 } else
6119 Count = Half;
6120 }
6121 }
6122
6123 if (PPI == pp_end)
6124 return findNextPreprocessedEntity(SLocMapI);
6125
6126 return M.BasePreprocessedEntityID + (PPI - pp_begin);
6127}
6128
6129/// Returns a pair of [Begin, End) indices of preallocated
6130/// preprocessed entities that \arg Range encompasses.
6131std::pair<unsigned, unsigned>
6132 ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) {
6133 if (Range.isInvalid())
6134 return std::make_pair(0,0);
6135 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 6135, __extension__ __PRETTY_FUNCTION__))
;
6136
6137 PreprocessedEntityID BeginID =
6138 findPreprocessedEntity(Range.getBegin(), false);
6139 PreprocessedEntityID EndID = findPreprocessedEntity(Range.getEnd(), true);
6140 return std::make_pair(BeginID, EndID);
6141}
6142
6143/// Optionally returns true or false if the preallocated preprocessed
6144/// entity with index \arg Index came from file \arg FID.
6145Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index,
6146 FileID FID) {
6147 if (FID.isInvalid())
6148 return false;
6149
6150 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
6151 ModuleFile &M = *PPInfo.first;
6152 unsigned LocalIndex = PPInfo.second;
6153 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
6154
6155 SourceLocation Loc = TranslateSourceLocation(M, PPOffs.getBegin());
6156 if (Loc.isInvalid())
6157 return false;
6158
6159 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
6160 return true;
6161 else
6162 return false;
6163}
6164
6165namespace {
6166
6167 /// Visitor used to search for information about a header file.
6168 class HeaderFileInfoVisitor {
6169 const FileEntry *FE;
6170 Optional<HeaderFileInfo> HFI;
6171
6172 public:
6173 explicit HeaderFileInfoVisitor(const FileEntry *FE) : FE(FE) {}
6174
6175 bool operator()(ModuleFile &M) {
6176 HeaderFileInfoLookupTable *Table
6177 = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable);
6178 if (!Table)
6179 return false;
6180
6181 // Look in the on-disk hash table for an entry for this file name.
6182 HeaderFileInfoLookupTable::iterator Pos = Table->find(FE);
6183 if (Pos == Table->end())
6184 return false;
6185
6186 HFI = *Pos;
6187 return true;
6188 }
6189
6190 Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; }
6191 };
6192
6193} // namespace
6194
6195HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) {
6196 HeaderFileInfoVisitor Visitor(FE);
6197 ModuleMgr.visit(Visitor);
6198 if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
6199 return *HFI;
6200
6201 return HeaderFileInfo();
6202}
6203
6204void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) {
6205 using DiagState = DiagnosticsEngine::DiagState;
6206 SmallVector<DiagState *, 32> DiagStates;
6207
6208 for (ModuleFile &F : ModuleMgr) {
6209 unsigned Idx = 0;
6210 auto &Record = F.PragmaDiagMappings;
6211 if (Record.empty())
6212 continue;
6213
6214 DiagStates.clear();
6215
6216 auto ReadDiagState =
6217 [&](const DiagState &BasedOn, SourceLocation Loc,
6218 bool IncludeNonPragmaStates) -> DiagnosticsEngine::DiagState * {
6219 unsigned BackrefID = Record[Idx++];
6220 if (BackrefID != 0)
6221 return DiagStates[BackrefID - 1];
6222
6223 // A new DiagState was created here.
6224 Diag.DiagStates.push_back(BasedOn);
6225 DiagState *NewState = &Diag.DiagStates.back();
6226 DiagStates.push_back(NewState);
6227 unsigned Size = Record[Idx++];
6228 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 6229, __extension__ __PRETTY_FUNCTION__))
6229 "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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 6229, __extension__ __PRETTY_FUNCTION__))
;
6230 while (Size--) {
6231 unsigned DiagID = Record[Idx++];
6232 DiagnosticMapping NewMapping =
6233 DiagnosticMapping::deserialize(Record[Idx++]);
6234 if (!NewMapping.isPragma() && !IncludeNonPragmaStates)
6235 continue;
6236
6237 DiagnosticMapping &Mapping = NewState->getOrAddMapping(DiagID);
6238
6239 // If this mapping was specified as a warning but the severity was
6240 // upgraded due to diagnostic settings, simulate the current diagnostic
6241 // settings (and use a warning).
6242 if (NewMapping.wasUpgradedFromWarning() && !Mapping.isErrorOrFatal()) {
6243 NewMapping.setSeverity(diag::Severity::Warning);
6244 NewMapping.setUpgradedFromWarning(false);
6245 }
6246
6247 Mapping = NewMapping;
6248 }
6249 return NewState;
6250 };
6251
6252 // Read the first state.
6253 DiagState *FirstState;
6254 if (F.Kind == MK_ImplicitModule) {
6255 // Implicitly-built modules are reused with different diagnostic
6256 // settings. Use the initial diagnostic state from Diag to simulate this
6257 // compilation's diagnostic settings.
6258 FirstState = Diag.DiagStatesByLoc.FirstDiagState;
6259 DiagStates.push_back(FirstState);
6260
6261 // Skip the initial diagnostic state from the serialized module.
6262 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 6263, __extension__ __PRETTY_FUNCTION__))
6263 "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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 6263, __extension__ __PRETTY_FUNCTION__))
;
6264 Idx = 3 + Record[2] * 2;
6265 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 6266, __extension__ __PRETTY_FUNCTION__))
6266 "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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 6266, __extension__ __PRETTY_FUNCTION__))
;
6267 } else if (F.isModule()) {
6268 // For an explicit module, preserve the flags from the module build
6269 // command line (-w, -Weverything, -Werror, ...) along with any explicit
6270 // -Wblah flags.
6271 unsigned Flags = Record[Idx++];
6272 DiagState Initial;
6273 Initial.SuppressSystemWarnings = Flags & 1; Flags >>= 1;
6274 Initial.ErrorsAsFatal = Flags & 1; Flags >>= 1;
6275 Initial.WarningsAsErrors = Flags & 1; Flags >>= 1;
6276 Initial.EnableAllWarnings = Flags & 1; Flags >>= 1;
6277 Initial.IgnoreAllWarnings = Flags & 1; Flags >>= 1;
6278 Initial.ExtBehavior = (diag::Severity)Flags;
6279 FirstState = ReadDiagState(Initial, SourceLocation(), true);
6280
6281 assert(F.OriginalSourceFileID.isValid())(static_cast <bool> (F.OriginalSourceFileID.isValid()) ?
void (0) : __assert_fail ("F.OriginalSourceFileID.isValid()"
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 6281, __extension__ __PRETTY_FUNCTION__))
;
6282
6283 // Set up the root buffer of the module to start with the initial
6284 // diagnostic state of the module itself, to cover files that contain no
6285 // explicit transitions (for which we did not serialize anything).
6286 Diag.DiagStatesByLoc.Files[F.OriginalSourceFileID]
6287 .StateTransitions.push_back({FirstState, 0});
6288 } else {
6289 // For prefix ASTs, start with whatever the user configured on the
6290 // command line.
6291 Idx++; // Skip flags.
6292 FirstState = ReadDiagState(*Diag.DiagStatesByLoc.CurDiagState,
6293 SourceLocation(), false);
6294 }
6295
6296 // Read the state transitions.
6297 unsigned NumLocations = Record[Idx++];
6298 while (NumLocations--) {
6299 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 6300, __extension__ __PRETTY_FUNCTION__))
6300 "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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 6300, __extension__ __PRETTY_FUNCTION__))
;
6301 SourceLocation Loc = ReadSourceLocation(F, Record[Idx++]);
6302 auto IDAndOffset = SourceMgr.getDecomposedLoc(Loc);
6303 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 6303, __extension__ __PRETTY_FUNCTION__))
;
6304 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 6304, __extension__ __PRETTY_FUNCTION__))
;
6305 unsigned Transitions = Record[Idx++];
6306
6307 // Note that we don't need to set up Parent/ParentOffset here, because
6308 // we won't be changing the diagnostic state within imported FileIDs
6309 // (other than perhaps appending to the main source file, which has no
6310 // parent).
6311 auto &F = Diag.DiagStatesByLoc.Files[IDAndOffset.first];
6312 F.StateTransitions.reserve(F.StateTransitions.size() + Transitions);
6313 for (unsigned I = 0; I != Transitions; ++I) {
6314 unsigned Offset = Record[Idx++];
6315 auto *State =
6316 ReadDiagState(*FirstState, Loc.getLocWithOffset(Offset), false);
6317 F.StateTransitions.push_back({State, Offset});
6318 }
6319 }
6320
6321 // Read the final state.
6322 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 6323, __extension__ __PRETTY_FUNCTION__))
6323 "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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 6323, __extension__ __PRETTY_FUNCTION__))
;
6324 SourceLocation CurStateLoc =
6325 ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]);
6326 auto *CurState = ReadDiagState(*FirstState, CurStateLoc, false);
6327
6328 if (!F.isModule()) {
6329 Diag.DiagStatesByLoc.CurDiagState = CurState;
6330 Diag.DiagStatesByLoc.CurDiagStateLoc = CurStateLoc;
6331
6332 // Preserve the property that the imaginary root file describes the
6333 // current state.
6334 FileID NullFile;
6335 auto &T = Diag.DiagStatesByLoc.Files[NullFile].StateTransitions;
6336 if (T.empty())
6337 T.push_back({CurState, 0});
6338 else
6339 T[0].State = CurState;
6340 }
6341
6342 // Don't try to read these mappings again.
6343 Record.clear();
6344 }
6345}
6346
6347/// Get the correct cursor and offset for loading a type.
6348ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) {
6349 GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index);
6350 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 6350, __extension__ __PRETTY_FUNCTION__))
;
6351 ModuleFile *M = I->second;
6352 return RecordLocation(
6353 M, M->TypeOffsets[Index - M->BaseTypeIndex].getBitOffset() +
6354 M->DeclsBlockStartOffset);
6355}
6356
6357static llvm::Optional<Type::TypeClass> getTypeClassForCode(TypeCode code) {
6358 switch (code) {
6359#define TYPE_BIT_CODE(CLASS_ID, CODE_ID, CODE_VALUE) \
6360 case TYPE_##CODE_ID: return Type::CLASS_ID;
6361#include "clang/Serialization/TypeBitCodes.def"
6362 default: return llvm::None;
6363 }
6364}
6365
6366/// Read and return the type with the given index..
6367///
6368/// The index is the type ID, shifted and minus the number of predefs. This
6369/// routine actually reads the record corresponding to the type at the given
6370/// location. It is a helper routine for GetType, which deals with reading type
6371/// IDs.
6372QualType ASTReader::readTypeRecord(unsigned Index) {
6373 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 6373, __extension__ __PRETTY_FUNCTION__))
;
6374 ASTContext &Context = *ContextObj;
6375 RecordLocation Loc = TypeCursorForIndex(Index);
6376 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
6377
6378 // Keep track of where we are in the stream, then jump back there
6379 // after reading this type.
6380 SavedStreamPosition SavedPosition(DeclsCursor);
6381
6382 ReadingKindTracker ReadingKind(Read_Type, *this);
6383
6384 // Note that we are loading a type record.
6385 Deserializing AType(this);
6386
6387 if (llvm::Error Err = DeclsCursor.JumpToBit(Loc.Offset)) {
6388 Error(std::move(Err));
6389 return QualType();
6390 }
6391 Expected<unsigned> RawCode = DeclsCursor.ReadCode();
6392 if (!RawCode) {
6393 Error(RawCode.takeError());
6394 return QualType();
6395 }
6396
6397 ASTRecordReader Record(*this, *Loc.F);
6398 Expected<unsigned> Code = Record.readRecord(DeclsCursor, RawCode.get());
6399 if (!Code) {
6400 Error(Code.takeError());
6401 return QualType();
6402 }
6403 if (Code.get() == TYPE_EXT_QUAL) {
6404 QualType baseType = Record.readQualType();
6405 Qualifiers quals = Record.readQualifiers();
6406 return Context.getQualifiedType(baseType, quals);
6407 }
6408
6409 auto maybeClass = getTypeClassForCode((TypeCode) Code.get());
6410 if (!maybeClass) {
6411 Error("Unexpected code for type");
6412 return QualType();
6413 }
6414
6415 serialization::AbstractTypeReader<ASTRecordReader> TypeReader(Record);
6416 return TypeReader.read(*maybeClass);
6417}
6418
6419namespace clang {
6420
6421class TypeLocReader : public TypeLocVisitor<TypeLocReader> {
6422 ASTRecordReader &Reader;
6423
6424 SourceLocation readSourceLocation() {
6425 return Reader.readSourceLocation();
6426 }
6427
6428 TypeSourceInfo *GetTypeSourceInfo() {
6429 return Reader.readTypeSourceInfo();
6430 }
6431
6432 NestedNameSpecifierLoc ReadNestedNameSpecifierLoc() {
6433 return Reader.readNestedNameSpecifierLoc();
6434 }
6435
6436 Attr *ReadAttr() {
6437 return Reader.readAttr();
6438 }
6439
6440public:
6441 TypeLocReader(ASTRecordReader &Reader) : Reader(Reader) {}
6442
6443 // We want compile-time assurance that we've enumerated all of
6444 // these, so unfortunately we have to declare them first, then
6445 // define them out-of-line.
6446#define ABSTRACT_TYPELOC(CLASS, PARENT)
6447#define TYPELOC(CLASS, PARENT) \
6448 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
6449#include "clang/AST/TypeLocNodes.def"
6450
6451 void VisitFunctionTypeLoc(FunctionTypeLoc);
6452 void VisitArrayTypeLoc(ArrayTypeLoc);
6453};
6454
6455} // namespace clang
6456
6457void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
6458 // nothing to do
6459}
6460
6461void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
6462 TL.setBuiltinLoc(readSourceLocation());
6463 if (TL.needsExtraLocalData()) {
6464 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Reader.readInt()));
6465 TL.setWrittenSignSpec(static_cast<TypeSpecifierSign>(Reader.readInt()));
6466 TL.setWrittenWidthSpec(static_cast<TypeSpecifierWidth>(Reader.readInt()));
6467 TL.setModeAttr(Reader.readInt());
6468 }
6469}
6470
6471void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
6472 TL.setNameLoc(readSourceLocation());
6473}
6474
6475void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
6476 TL.setStarLoc(readSourceLocation());
6477}
6478
6479void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
6480 // nothing to do
6481}
6482
6483void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
6484 // nothing to do
6485}
6486
6487void TypeLocReader::VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) {
6488 TL.setExpansionLoc(readSourceLocation());
6489}
6490
6491void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
6492 TL.setCaretLoc(readSourceLocation());
6493}
6494
6495void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
6496 TL.setAmpLoc(readSourceLocation());
6497}
6498
6499void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
6500 TL.setAmpAmpLoc(readSourceLocation());
6501}
6502
6503void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
6504 TL.setStarLoc(readSourceLocation());
6505 TL.setClassTInfo(GetTypeSourceInfo());
6506}
6507
6508void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) {
6509 TL.setLBracketLoc(readSourceLocation());
6510 TL.setRBracketLoc(readSourceLocation());
6511 if (Reader.readBool())
6512 TL.setSizeExpr(Reader.readExpr());
6513 else
6514 TL.setSizeExpr(nullptr);
6515}
6516
6517void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) {
6518 VisitArrayTypeLoc(TL);
6519}
6520
6521void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) {
6522 VisitArrayTypeLoc(TL);
6523}
6524
6525void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
6526 VisitArrayTypeLoc(TL);
6527}
6528
6529void TypeLocReader::VisitDependentSizedArrayTypeLoc(
6530 DependentSizedArrayTypeLoc TL) {
6531 VisitArrayTypeLoc(TL);
6532}
6533
6534void TypeLocReader::VisitDependentAddressSpaceTypeLoc(
6535 DependentAddressSpaceTypeLoc TL) {
6536
6537 TL.setAttrNameLoc(readSourceLocation());
6538 TL.setAttrOperandParensRange(Reader.readSourceRange());
6539 TL.setAttrExprOperand(Reader.readExpr());
6540}
6541
6542void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
6543 DependentSizedExtVectorTypeLoc TL) {
6544 TL.setNameLoc(readSourceLocation());
6545}
6546
6547void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
6548 TL.setNameLoc(readSourceLocation());
6549}
6550
6551void TypeLocReader::VisitDependentVectorTypeLoc(
6552 DependentVectorTypeLoc TL) {
6553 TL.setNameLoc(readSourceLocation());
6554}
6555
6556void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
6557 TL.setNameLoc(readSourceLocation());
6558}
6559
6560void TypeLocReader::VisitConstantMatrixTypeLoc(ConstantMatrixTypeLoc TL) {
6561 TL.setAttrNameLoc(readSourceLocation());
6562 TL.setAttrOperandParensRange(Reader.readSourceRange());
6563 TL.setAttrRowOperand(Reader.readExpr());
6564 TL.setAttrColumnOperand(Reader.readExpr());
6565}
6566
6567void TypeLocReader::VisitDependentSizedMatrixTypeLoc(
6568 DependentSizedMatrixTypeLoc TL) {
6569 TL.setAttrNameLoc(readSourceLocation());
6570 TL.setAttrOperandParensRange(Reader.readSourceRange());
6571 TL.setAttrRowOperand(Reader.readExpr());
6572 TL.setAttrColumnOperand(Reader.readExpr());
6573}
6574
6575void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) {
6576 TL.setLocalRangeBegin(readSourceLocation());
6577 TL.setLParenLoc(readSourceLocation());
6578 TL.setRParenLoc(readSourceLocation());
6579 TL.setExceptionSpecRange(Reader.readSourceRange());
6580 TL.setLocalRangeEnd(readSourceLocation());
6581 for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) {
6582 TL.setParam(i, Reader.readDeclAs<ParmVarDecl>());
6583 }
6584}
6585
6586void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) {
6587 VisitFunctionTypeLoc(TL);
6588}
6589
6590void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) {
6591 VisitFunctionTypeLoc(TL);
6592}
6593
6594void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
6595 TL.setNameLoc(readSourceLocation());
6596}
6597
6598void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
6599 TL.setNameLoc(readSourceLocation());
6600}
6601
6602void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
6603 TL.setTypeofLoc(readSourceLocation());
6604 TL.setLParenLoc(readSourceLocation());
6605 TL.setRParenLoc(readSourceLocation());
6606}
6607
6608void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
6609 TL.setTypeofLoc(readSourceLocation());
6610 TL.setLParenLoc(readSourceLocation());
6611 TL.setRParenLoc(readSourceLocation());
6612 TL.setUnderlyingTInfo(GetTypeSourceInfo());
6613}
6614
6615void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
6616 TL.setNameLoc(readSourceLocation());
6617}
6618
6619void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
6620 TL.setKWLoc(readSourceLocation());
6621 TL.setLParenLoc(readSourceLocation());
6622 TL.setRParenLoc(readSourceLocation());
6623 TL.setUnderlyingTInfo(GetTypeSourceInfo());
6624}
6625
6626void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) {
6627 TL.setNameLoc(readSourceLocation());
6628 if (Reader.readBool()) {
6629 TL.setNestedNameSpecifierLoc(ReadNestedNameSpecifierLoc());
6630 TL.setTemplateKWLoc(readSourceLocation());
6631 TL.setConceptNameLoc(readSourceLocation());
6632 TL.setFoundDecl(Reader.readDeclAs<NamedDecl>());
6633 TL.setLAngleLoc(readSourceLocation());
6634 TL.setRAngleLoc(readSourceLocation());
6635 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i)
6636 TL.setArgLocInfo(i, Reader.readTemplateArgumentLocInfo(
6637 TL.getTypePtr()->getArg(i).getKind()));
6638 }
6639}
6640
6641void TypeLocReader::VisitDeducedTemplateSpecializationTypeLoc(
6642 DeducedTemplateSpecializationTypeLoc TL) {
6643 TL.setTemplateNameLoc(readSourceLocation());
6644}
6645
6646void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) {
6647 TL.setNameLoc(readSourceLocation());
6648}
6649
6650void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) {
6651 TL.setNameLoc(readSourceLocation());
6652}
6653
6654void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
6655 TL.setAttr(ReadAttr());
6656}
6657
6658void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
6659 TL.setNameLoc(readSourceLocation());
6660}
6661
6662void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
6663 SubstTemplateTypeParmTypeLoc TL) {
6664 TL.setNameLoc(readSourceLocation());
6665}
6666
6667void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
6668 SubstTemplateTypeParmPackTypeLoc TL) {
6669 TL.setNameLoc(readSourceLocation());
6670}
6671
6672void TypeLocReader::VisitTemplateSpecializationTypeLoc(
6673 TemplateSpecializationTypeLoc TL) {
6674 TL.setTemplateKeywordLoc(readSourceLocation());
6675 TL.setTemplateNameLoc(readSourceLocation());
6676 TL.setLAngleLoc(readSourceLocation());
6677 TL.setRAngleLoc(readSourceLocation());
6678 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i)
6679 TL.setArgLocInfo(
6680 i,
6681 Reader.readTemplateArgumentLocInfo(
6682 TL.getTypePtr()->getArg(i).getKind()));
6683}
6684
6685void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
6686 TL.setLParenLoc(readSourceLocation());
6687 TL.setRParenLoc(readSourceLocation());
6688}
6689
6690void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
6691 TL.setElaboratedKeywordLoc(readSourceLocation());
6692 TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
6693}
6694
6695void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
6696 TL.setNameLoc(readSourceLocation());
6697}
6698
6699void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
6700 TL.setElaboratedKeywordLoc(readSourceLocation());
6701 TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
6702 TL.setNameLoc(readSourceLocation());
6703}
6704
6705void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc(
6706 DependentTemplateSpecializationTypeLoc TL) {
6707 TL.setElaboratedKeywordLoc(readSourceLocation());
6708 TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
6709 TL.setTemplateKeywordLoc(readSourceLocation());
6710 TL.setTemplateNameLoc(readSourceLocation());
6711 TL.setLAngleLoc(readSourceLocation());
6712 TL.setRAngleLoc(readSourceLocation());
6713 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
6714 TL.setArgLocInfo(
6715 I,
6716 Reader.readTemplateArgumentLocInfo(
6717 TL.getTypePtr()->getArg(I).getKind()));
6718}
6719
6720void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
6721 TL.setEllipsisLoc(readSourceLocation());
6722}
6723
6724void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
6725 TL.setNameLoc(readSourceLocation());
6726}
6727
6728void TypeLocReader::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) {
6729 if (TL.getNumProtocols()) {
6730 TL.setProtocolLAngleLoc(readSourceLocation());
6731 TL.setProtocolRAngleLoc(readSourceLocation());
6732 }
6733 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
6734 TL.setProtocolLoc(i, readSourceLocation());
6735}
6736
6737void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
6738 TL.setHasBaseTypeAsWritten(Reader.readBool());
6739 TL.setTypeArgsLAngleLoc(readSourceLocation());
6740 TL.setTypeArgsRAngleLoc(readSourceLocation());
6741 for (unsigned i = 0, e = TL.getNumTypeArgs(); i != e; ++i)
6742 TL.setTypeArgTInfo(i, GetTypeSourceInfo());
6743 TL.setProtocolLAngleLoc(readSourceLocation());
6744 TL.setProtocolRAngleLoc(readSourceLocation());
6745 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
6746 TL.setProtocolLoc(i, readSourceLocation());
6747}
6748
6749void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
6750 TL.setStarLoc(readSourceLocation());
6751}
6752
6753void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
6754 TL.setKWLoc(readSourceLocation());
6755 TL.setLParenLoc(readSourceLocation());
6756 TL.setRParenLoc(readSourceLocation());
6757}
6758
6759void TypeLocReader::VisitPipeTypeLoc(PipeTypeLoc TL) {
6760 TL.setKWLoc(readSourceLocation());
6761}
6762
6763void TypeLocReader::VisitExtIntTypeLoc(clang::ExtIntTypeLoc TL) {
6764 TL.setNameLoc(readSourceLocation());
6765}
6766void TypeLocReader::VisitDependentExtIntTypeLoc(
6767 clang::DependentExtIntTypeLoc TL) {
6768 TL.setNameLoc(readSourceLocation());
6769}
6770
6771
6772void ASTRecordReader::readTypeLoc(TypeLoc TL) {
6773 TypeLocReader TLR(*this);
6774 for (; !TL.isNull(); TL = TL.getNextTypeLoc())
6775 TLR.Visit(TL);
6776}
6777
6778TypeSourceInfo *ASTRecordReader::readTypeSourceInfo() {
6779 QualType InfoTy = readType();
6780 if (InfoTy.isNull())
6781 return nullptr;
6782
6783 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy);
6784 readTypeLoc(TInfo->getTypeLoc());
6785 return TInfo;
6786}
6787
6788QualType ASTReader::GetType(TypeID ID) {
6789 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 6789, __extension__ __PRETTY_FUNCTION__))
;
6790 ASTContext &Context = *ContextObj;
6791
6792 unsigned FastQuals = ID & Qualifiers::FastMask;
6793 unsigned Index = ID >> Qualifiers::FastWidth;
6794
6795 if (Index < NUM_PREDEF_TYPE_IDS) {
6796 QualType T;
6797 switch ((PredefinedTypeIDs)Index) {
6798 case PREDEF_TYPE_NULL_ID:
6799 return QualType();
6800 case PREDEF_TYPE_VOID_ID:
6801 T = Context.VoidTy;
6802 break;
6803 case PREDEF_TYPE_BOOL_ID:
6804 T = Context.BoolTy;
6805 break;
6806 case PREDEF_TYPE_CHAR_U_ID:
6807 case PREDEF_TYPE_CHAR_S_ID:
6808 // FIXME: Check that the signedness of CharTy is correct!
6809 T = Context.CharTy;
6810 break;
6811 case PREDEF_TYPE_UCHAR_ID:
6812 T = Context.UnsignedCharTy;
6813 break;
6814 case PREDEF_TYPE_USHORT_ID:
6815 T = Context.UnsignedShortTy;
6816 break;
6817 case PREDEF_TYPE_UINT_ID:
6818 T = Context.UnsignedIntTy;
6819 break;
6820 case PREDEF_TYPE_ULONG_ID:
6821 T = Context.UnsignedLongTy;
6822 break;
6823 case PREDEF_TYPE_ULONGLONG_ID:
6824 T = Context.UnsignedLongLongTy;
6825 break;
6826 case PREDEF_TYPE_UINT128_ID:
6827 T = Context.UnsignedInt128Ty;
6828 break;
6829 case PREDEF_TYPE_SCHAR_ID:
6830 T = Context.SignedCharTy;
6831 break;
6832 case PREDEF_TYPE_WCHAR_ID:
6833 T = Context.WCharTy;
6834 break;
6835 case PREDEF_TYPE_SHORT_ID:
6836 T = Context.ShortTy;
6837 break;
6838 case PREDEF_TYPE_INT_ID:
6839 T = Context.IntTy;
6840 break;
6841 case PREDEF_TYPE_LONG_ID:
6842 T = Context.LongTy;
6843 break;
6844 case PREDEF_TYPE_LONGLONG_ID:
6845 T = Context.LongLongTy;
6846 break;
6847 case PREDEF_TYPE_INT128_ID:
6848 T = Context.Int128Ty;
6849 break;
6850 case PREDEF_TYPE_BFLOAT16_ID:
6851 T = Context.BFloat16Ty;
6852 break;
6853 case PREDEF_TYPE_HALF_ID:
6854 T = Context.HalfTy;
6855 break;
6856 case PREDEF_TYPE_FLOAT_ID:
6857 T = Context.FloatTy;
6858 break;
6859 case PREDEF_TYPE_DOUBLE_ID:
6860 T = Context.DoubleTy;
6861 break;
6862 case PREDEF_TYPE_LONGDOUBLE_ID:
6863 T = Context.LongDoubleTy;
6864 break;
6865 case PREDEF_TYPE_SHORT_ACCUM_ID:
6866 T = Context.ShortAccumTy;
6867 break;
6868 case PREDEF_TYPE_ACCUM_ID:
6869 T = Context.AccumTy;
6870 break;
6871 case PREDEF_TYPE_LONG_ACCUM_ID:
6872 T = Context.LongAccumTy;
6873 break;
6874 case PREDEF_TYPE_USHORT_ACCUM_ID:
6875 T = Context.UnsignedShortAccumTy;
6876 break;
6877 case PREDEF_TYPE_UACCUM_ID:
6878 T = Context.UnsignedAccumTy;
6879 break;
6880 case PREDEF_TYPE_ULONG_ACCUM_ID:
6881 T = Context.UnsignedLongAccumTy;
6882 break;
6883 case PREDEF_TYPE_SHORT_FRACT_ID:
6884 T = Context.ShortFractTy;
6885 break;
6886 case PREDEF_TYPE_FRACT_ID:
6887 T = Context.FractTy;
6888 break;
6889 case PREDEF_TYPE_LONG_FRACT_ID:
6890 T = Context.LongFractTy;
6891 break;
6892 case PREDEF_TYPE_USHORT_FRACT_ID:
6893 T = Context.UnsignedShortFractTy;
6894 break;
6895 case PREDEF_TYPE_UFRACT_ID:
6896 T = Context.UnsignedFractTy;
6897 break;
6898 case PREDEF_TYPE_ULONG_FRACT_ID:
6899 T = Context.UnsignedLongFractTy;
6900 break;
6901 case PREDEF_TYPE_SAT_SHORT_ACCUM_ID:
6902 T = Context.SatShortAccumTy;
6903 break;
6904 case PREDEF_TYPE_SAT_ACCUM_ID:
6905 T = Context.SatAccumTy;
6906 break;
6907 case PREDEF_TYPE_SAT_LONG_ACCUM_ID:
6908 T = Context.SatLongAccumTy;
6909 break;
6910 case PREDEF_TYPE_SAT_USHORT_ACCUM_ID:
6911 T = Context.SatUnsignedShortAccumTy;
6912 break;
6913 case PREDEF_TYPE_SAT_UACCUM_ID:
6914 T = Context.SatUnsignedAccumTy;
6915 break;
6916 case PREDEF_TYPE_SAT_ULONG_ACCUM_ID:
6917 T = Context.SatUnsignedLongAccumTy;
6918 break;
6919 case PREDEF_TYPE_SAT_SHORT_FRACT_ID:
6920 T = Context.SatShortFractTy;
6921 break;
6922 case PREDEF_TYPE_SAT_FRACT_ID:
6923 T = Context.SatFractTy;
6924 break;
6925 case PREDEF_TYPE_SAT_LONG_FRACT_ID:
6926 T = Context.SatLongFractTy;
6927 break;
6928 case PREDEF_TYPE_SAT_USHORT_FRACT_ID:
6929 T = Context.SatUnsignedShortFractTy;
6930 break;
6931 case PREDEF_TYPE_SAT_UFRACT_ID:
6932 T = Context.SatUnsignedFractTy;
6933 break;
6934 case PREDEF_TYPE_SAT_ULONG_FRACT_ID:
6935 T = Context.SatUnsignedLongFractTy;
6936 break;
6937 case PREDEF_TYPE_FLOAT16_ID:
6938 T = Context.Float16Ty;
6939 break;
6940 case PREDEF_TYPE_FLOAT128_ID:
6941 T = Context.Float128Ty;
6942 break;
6943 case PREDEF_TYPE_OVERLOAD_ID:
6944 T = Context.OverloadTy;
6945 break;
6946 case PREDEF_TYPE_BOUND_MEMBER:
6947 T = Context.BoundMemberTy;
6948 break;
6949 case PREDEF_TYPE_PSEUDO_OBJECT:
6950 T = Context.PseudoObjectTy;
6951 break;
6952 case PREDEF_TYPE_DEPENDENT_ID:
6953 T = Context.DependentTy;
6954 break;
6955 case PREDEF_TYPE_UNKNOWN_ANY:
6956 T = Context.UnknownAnyTy;
6957 break;
6958 case PREDEF_TYPE_NULLPTR_ID:
6959 T = Context.NullPtrTy;
6960 break;
6961 case PREDEF_TYPE_CHAR8_ID:
6962 T = Context.Char8Ty;
6963 break;
6964 case PREDEF_TYPE_CHAR16_ID:
6965 T = Context.Char16Ty;
6966 break;
6967 case PREDEF_TYPE_CHAR32_ID:
6968 T = Context.Char32Ty;
6969 break;
6970 case PREDEF_TYPE_OBJC_ID:
6971 T = Context.ObjCBuiltinIdTy;
6972 break;
6973 case PREDEF_TYPE_OBJC_CLASS:
6974 T = Context.ObjCBuiltinClassTy;
6975 break;
6976 case PREDEF_TYPE_OBJC_SEL:
6977 T = Context.ObjCBuiltinSelTy;
6978 break;
6979#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
6980 case PREDEF_TYPE_##Id##_ID: \
6981 T = Context.SingletonId; \
6982 break;
6983#include "clang/Basic/OpenCLImageTypes.def"
6984#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
6985 case PREDEF_TYPE_##Id##_ID: \
6986 T = Context.Id##Ty; \
6987 break;
6988#include "clang/Basic/OpenCLExtensionTypes.def"
6989 case PREDEF_TYPE_SAMPLER_ID:
6990 T = Context.OCLSamplerTy;
6991 break;
6992 case PREDEF_TYPE_EVENT_ID:
6993 T = Context.OCLEventTy;
6994 break;
6995 case PREDEF_TYPE_CLK_EVENT_ID:
6996 T = Context.OCLClkEventTy;
6997 break;
6998 case PREDEF_TYPE_QUEUE_ID:
6999 T = Context.OCLQueueTy;
7000 break;
7001 case PREDEF_TYPE_RESERVE_ID_ID:
7002 T = Context.OCLReserveIDTy;
7003 break;
7004 case PREDEF_TYPE_AUTO_DEDUCT:
7005 T = Context.getAutoDeductType();
7006 break;
7007 case PREDEF_TYPE_AUTO_RREF_DEDUCT:
7008 T = Context.getAutoRRefDeductType();
7009 break;
7010 case PREDEF_TYPE_ARC_UNBRIDGED_CAST:
7011 T = Context.ARCUnbridgedCastTy;
7012 break;
7013 case PREDEF_TYPE_BUILTIN_FN:
7014 T = Context.BuiltinFnTy;
7015 break;
7016 case PREDEF_TYPE_INCOMPLETE_MATRIX_IDX:
7017 T = Context.IncompleteMatrixIdxTy;
7018 break;
7019 case PREDEF_TYPE_OMP_ARRAY_SECTION:
7020 T = Context.OMPArraySectionTy;
7021 break;
7022 case PREDEF_TYPE_OMP_ARRAY_SHAPING:
7023 T = Context.OMPArraySectionTy;
7024 break;
7025 case PREDEF_TYPE_OMP_ITERATOR:
7026 T = Context.OMPIteratorTy;
7027 break;
7028#define SVE_TYPE(Name, Id, SingletonId) \
7029 case PREDEF_TYPE_##Id##_ID: \
7030 T = Context.SingletonId; \
7031 break;
7032#include "clang/Basic/AArch64SVEACLETypes.def"
7033#define PPC_VECTOR_TYPE(Name, Id, Size) \
7034 case PREDEF_TYPE_##Id##_ID: \
7035 T = Context.Id##Ty; \
7036 break;
7037#include "clang/Basic/PPCTypes.def"
7038#define RVV_TYPE(Name, Id, SingletonId) \
7039 case PREDEF_TYPE_##Id##_ID: \
7040 T = Context.SingletonId; \
7041 break;
7042#include "clang/Basic/RISCVVTypes.def"
7043 }
7044
7045 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 7045, __extension__ __PRETTY_FUNCTION__))
;
7046 return T.withFastQualifiers(FastQuals);
7047 }
7048
7049 Index -= NUM_PREDEF_TYPE_IDS;
7050 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 7050, __extension__ __PRETTY_FUNCTION__))
;
7051 if (TypesLoaded[Index].isNull()) {
7052 TypesLoaded[Index] = readTypeRecord(Index);
7053 if (TypesLoaded[Index].isNull())
7054 return QualType();
7055
7056 TypesLoaded[Index]->setFromAST();
7057 if (DeserializationListener)
7058 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID),
7059 TypesLoaded[Index]);
7060 }
7061
7062 return TypesLoaded[Index].withFastQualifiers(FastQuals);
7063}
7064
7065QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) {
7066 return GetType(getGlobalTypeID(F, LocalID));
7067}
7068
7069serialization::TypeID
7070ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const {
7071 unsigned FastQuals = LocalID & Qualifiers::FastMask;
7072 unsigned LocalIndex = LocalID >> Qualifiers::FastWidth;
7073
7074 if (LocalIndex < NUM_PREDEF_TYPE_IDS)
7075 return LocalID;
7076
7077 if (!F.ModuleOffsetMap.empty())
7078 ReadModuleOffsetMap(F);
7079
7080 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7081 = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS);
7082 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 7082, __extension__ __PRETTY_FUNCTION__))
;
7083
7084 unsigned GlobalIndex = LocalIndex + I->second;
7085 return (GlobalIndex << Qualifiers::FastWidth) | FastQuals;
7086}
7087
7088TemplateArgumentLocInfo
7089ASTRecordReader::readTemplateArgumentLocInfo(TemplateArgument::ArgKind Kind) {
7090 switch (Kind) {
7091 case TemplateArgument::Expression:
7092 return readExpr();
7093 case TemplateArgument::Type:
7094 return readTypeSourceInfo();
7095 case TemplateArgument::Template: {
7096 NestedNameSpecifierLoc QualifierLoc =
7097 readNestedNameSpecifierLoc();
7098 SourceLocation TemplateNameLoc = readSourceLocation();
7099 return TemplateArgumentLocInfo(getASTContext(), QualifierLoc,
7100 TemplateNameLoc, SourceLocation());
7101 }
7102 case TemplateArgument::TemplateExpansion: {
7103 NestedNameSpecifierLoc QualifierLoc = readNestedNameSpecifierLoc();
7104 SourceLocation TemplateNameLoc = readSourceLocation();
7105 SourceLocation EllipsisLoc = readSourceLocation();
7106 return TemplateArgumentLocInfo(getASTContext(), QualifierLoc,
7107 TemplateNameLoc, EllipsisLoc);
7108 }
7109 case TemplateArgument::Null:
7110 case TemplateArgument::Integral:
7111 case TemplateArgument::Declaration:
7112 case TemplateArgument::NullPtr:
7113 case TemplateArgument::Pack:
7114 // FIXME: Is this right?
7115 return TemplateArgumentLocInfo();
7116 }
7117 llvm_unreachable("unexpected template argument loc")::llvm::llvm_unreachable_internal("unexpected template argument loc"
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 7117)
;
7118}
7119
7120TemplateArgumentLoc ASTRecordReader::readTemplateArgumentLoc() {
7121 TemplateArgument Arg = readTemplateArgument();
7122
7123 if (Arg.getKind() == TemplateArgument::Expression) {
7124 if (readBool()) // bool InfoHasSameExpr.
7125 return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr()));
7126 }
7127 return TemplateArgumentLoc(Arg, readTemplateArgumentLocInfo(Arg.getKind()));
7128}
7129
7130const ASTTemplateArgumentListInfo *
7131ASTRecordReader::readASTTemplateArgumentListInfo() {
7132 SourceLocation LAngleLoc = readSourceLocation();
7133 SourceLocation RAngleLoc = readSourceLocation();
7134 unsigned NumArgsAsWritten = readInt();
7135 TemplateArgumentListInfo TemplArgsInfo(LAngleLoc, RAngleLoc);
7136 for (unsigned i = 0; i != NumArgsAsWritten; ++i)
7137 TemplArgsInfo.addArgument(readTemplateArgumentLoc());
7138 return ASTTemplateArgumentListInfo::Create(getContext(), TemplArgsInfo);
7139}
7140
7141Decl *ASTReader::GetExternalDecl(uint32_t ID) {
7142 return GetDecl(ID);
7143}
7144
7145void ASTReader::CompleteRedeclChain(const Decl *D) {
7146 if (NumCurrentElementsDeserializing) {
7147 // We arrange to not care about the complete redeclaration chain while we're
7148 // deserializing. Just remember that the AST has marked this one as complete
7149 // but that it's not actually complete yet, so we know we still need to
7150 // complete it later.
7151 PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D));
7152 return;
7153 }
7154
7155 if (!D->getDeclContext()) {
7156 assert(isa<TranslationUnitDecl>(D) && "Not a TU?")(static_cast <bool> (isa<TranslationUnitDecl>(D) &&
"Not a TU?") ? void (0) : __assert_fail ("isa<TranslationUnitDecl>(D) && \"Not a TU?\""
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 7156, __extension__ __PRETTY_FUNCTION__))
;
7157 return;
7158 }
7159
7160 const DeclContext *DC = D->getDeclContext()->getRedeclContext();
7161
7162 // If this is a named declaration, complete it by looking it up
7163 // within its context.
7164 //
7165 // FIXME: Merging a function definition should merge
7166 // all mergeable entities within it.
7167 if (isa<TranslationUnitDecl>(DC) || isa<NamespaceDecl>(DC) ||
7168 isa<CXXRecordDecl>(DC) || isa<EnumDecl>(DC)) {
7169 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) {
7170 if (!getContext().getLangOpts().CPlusPlus &&
7171 isa<TranslationUnitDecl>(DC)) {
7172 // Outside of C++, we don't have a lookup table for the TU, so update
7173 // the identifier instead. (For C++ modules, we don't store decls
7174 // in the serialized identifier table, so we do the lookup in the TU.)
7175 auto *II = Name.getAsIdentifierInfo();
7176 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 7176, __extension__ __PRETTY_FUNCTION__))
;
7177 if (II->isOutOfDate())
7178 updateOutOfDateIdentifier(*II);
7179 } else
7180 DC->lookup(Name);
7181 } else if (needsAnonymousDeclarationNumber(cast<NamedDecl>(D))) {
7182 // Find all declarations of this kind from the relevant context.
7183 for (auto *DCDecl : cast<Decl>(D->getLexicalDeclContext())->redecls()) {
7184 auto *DC = cast<DeclContext>(DCDecl);
7185 SmallVector<Decl*, 8> Decls;
7186 FindExternalLexicalDecls(
7187 DC, [&](Decl::Kind K) { return K == D->getKind(); }, Decls);
7188 }
7189 }
7190 }
7191
7192 if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D))
7193 CTSD->getSpecializedTemplate()->LoadLazySpecializations();
7194 if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D))
7195 VTSD->getSpecializedTemplate()->LoadLazySpecializations();
7196 if (auto *FD = dyn_cast<FunctionDecl>(D)) {
7197 if (auto *Template = FD->getPrimaryTemplate())
7198 Template->LoadLazySpecializations();
7199 }
7200}
7201
7202CXXCtorInitializer **
7203ASTReader::GetExternalCXXCtorInitializers(uint64_t Offset) {
7204 RecordLocation Loc = getLocalBitOffset(Offset);
7205 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
7206 SavedStreamPosition SavedPosition(Cursor);
7207 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
7208 Error(std::move(Err));
7209 return nullptr;
7210 }
7211 ReadingKindTracker ReadingKind(Read_Decl, *this);
7212
7213 Expected<unsigned> MaybeCode = Cursor.ReadCode();
7214 if (!MaybeCode) {
7215 Error(MaybeCode.takeError());
7216 return nullptr;
7217 }
7218 unsigned Code = MaybeCode.get();
7219
7220 ASTRecordReader Record(*this, *Loc.F);
7221 Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code);
7222 if (!MaybeRecCode) {
7223 Error(MaybeRecCode.takeError());
7224 return nullptr;
7225 }
7226 if (MaybeRecCode.get() != DECL_CXX_CTOR_INITIALIZERS) {
7227 Error("malformed AST file: missing C++ ctor initializers");
7228 return nullptr;
7229 }
7230
7231 return Record.readCXXCtorInitializers();
7232}
7233
7234CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) {
7235 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 7235, __extension__ __PRETTY_FUNCTION__))
;
7236 ASTContext &Context = *ContextObj;
7237
7238 RecordLocation Loc = getLocalBitOffset(Offset);
7239 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
7240 SavedStreamPosition SavedPosition(Cursor);
7241 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
7242 Error(std::move(Err));
7243 return nullptr;
7244 }
7245 ReadingKindTracker ReadingKind(Read_Decl, *this);
7246
7247 Expected<unsigned> MaybeCode = Cursor.ReadCode();
7248 if (!MaybeCode) {
7249 Error(MaybeCode.takeError());
7250 return nullptr;
7251 }
7252 unsigned Code = MaybeCode.get();
7253
7254 ASTRecordReader Record(*this, *Loc.F);
7255 Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code);
7256 if (!MaybeRecCode) {
7257 Error(MaybeCode.takeError());
7258 return nullptr;
7259 }
7260 unsigned RecCode = MaybeRecCode.get();
7261
7262 if (RecCode != DECL_CXX_BASE_SPECIFIERS) {
7263 Error("malformed AST file: missing C++ base specifiers");
7264 return nullptr;
7265 }
7266
7267 unsigned NumBases = Record.readInt();
7268 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases);
7269 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases];
7270 for (unsigned I = 0; I != NumBases; ++I)
7271 Bases[I] = Record.readCXXBaseSpecifier();
7272 return Bases;
7273}
7274
7275serialization::DeclID
7276ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const {
7277 if (LocalID < NUM_PREDEF_DECL_IDS)
7278 return LocalID;
7279
7280 if (!F.ModuleOffsetMap.empty())
7281 ReadModuleOffsetMap(F);
7282
7283 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7284 = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS);
7285 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 7285, __extension__ __PRETTY_FUNCTION__))
;
7286
7287 return LocalID + I->second;
7288}
7289
7290bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID,
7291 ModuleFile &M) const {
7292 // Predefined decls aren't from any module.
7293 if (ID < NUM_PREDEF_DECL_IDS)
7294 return false;
7295
7296 return ID - NUM_PREDEF_DECL_IDS >= M.BaseDeclID &&
7297 ID - NUM_PREDEF_DECL_IDS < M.BaseDeclID + M.LocalNumDecls;
7298}
7299
7300ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) {
7301 if (!D->isFromASTFile())
7302 return nullptr;
7303 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID());
7304 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 7304, __extension__ __PRETTY_FUNCTION__))
;
7305 return I->second;
7306}
7307
7308SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) {
7309 if (ID < NUM_PREDEF_DECL_IDS)
7310 return SourceLocation();
7311
7312 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
7313
7314 if (Index > DeclsLoaded.size()) {
7315 Error("declaration ID out-of-range for AST file");
7316 return SourceLocation();
7317 }
7318
7319 if (Decl *D = DeclsLoaded[Index])
7320 return D->getLocation();
7321
7322 SourceLocation Loc;
7323 DeclCursorForID(ID, Loc);
7324 return Loc;
7325}
7326
7327static Decl *getPredefinedDecl(ASTContext &Context, PredefinedDeclIDs ID) {
7328 switch (ID) {
7329 case PREDEF_DECL_NULL_ID:
7330 return nullptr;
7331
7332 case PREDEF_DECL_TRANSLATION_UNIT_ID:
7333 return Context.getTranslationUnitDecl();
7334
7335 case PREDEF_DECL_OBJC_ID_ID:
7336 return Context.getObjCIdDecl();
7337
7338 case PREDEF_DECL_OBJC_SEL_ID:
7339 return Context.getObjCSelDecl();
7340
7341 case PREDEF_DECL_OBJC_CLASS_ID:
7342 return Context.getObjCClassDecl();
7343
7344 case PREDEF_DECL_OBJC_PROTOCOL_ID:
7345 return Context.getObjCProtocolDecl();
7346
7347 case PREDEF_DECL_INT_128_ID:
7348 return Context.getInt128Decl();
7349
7350 case PREDEF_DECL_UNSIGNED_INT_128_ID:
7351 return Context.getUInt128Decl();
7352
7353 case PREDEF_DECL_OBJC_INSTANCETYPE_ID:
7354 return Context.getObjCInstanceTypeDecl();
7355
7356 case PREDEF_DECL_BUILTIN_VA_LIST_ID:
7357 return Context.getBuiltinVaListDecl();
7358
7359 case PREDEF_DECL_VA_LIST_TAG:
7360 return Context.getVaListTagDecl();
7361
7362 case PREDEF_DECL_BUILTIN_MS_VA_LIST_ID:
7363 return Context.getBuiltinMSVaListDecl();
7364
7365 case PREDEF_DECL_BUILTIN_MS_GUID_ID:
7366 return Context.getMSGuidTagDecl();
7367
7368 case PREDEF_DECL_EXTERN_C_CONTEXT_ID:
7369 return Context.getExternCContextDecl();
7370
7371 case PREDEF_DECL_MAKE_INTEGER_SEQ_ID:
7372 return Context.getMakeIntegerSeqDecl();
7373
7374 case PREDEF_DECL_CF_CONSTANT_STRING_ID:
7375 return Context.getCFConstantStringDecl();
7376
7377 case PREDEF_DECL_CF_CONSTANT_STRING_TAG_ID:
7378 return Context.getCFConstantStringTagDecl();
7379
7380 case PREDEF_DECL_TYPE_PACK_ELEMENT_ID:
7381 return Context.getTypePackElementDecl();
7382 }
7383 llvm_unreachable("PredefinedDeclIDs unknown enum value")::llvm::llvm_unreachable_internal("PredefinedDeclIDs unknown enum value"
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 7383)
;
7384}
7385
7386Decl *ASTReader::GetExistingDecl(DeclID ID) {
7387 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 7387, __extension__ __PRETTY_FUNCTION__))
;
7388 if (ID < NUM_PREDEF_DECL_IDS) {
7389 Decl *D = getPredefinedDecl(*ContextObj, (PredefinedDeclIDs)ID);
7390 if (D) {
7391 // Track that we have merged the declaration with ID \p ID into the
7392 // pre-existing predefined declaration \p D.
7393 auto &Merged = KeyDecls[D->getCanonicalDecl()];
7394 if (Merged.empty())
7395 Merged.push_back(ID);
7396 }
7397 return D;
7398 }
7399
7400 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
7401
7402 if (Index >= DeclsLoaded.size()) {
7403 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 7403, __extension__ __PRETTY_FUNCTION__))
;
7404 Error("declaration ID out-of-range for AST file");
7405 return nullptr;
7406 }
7407
7408 return DeclsLoaded[Index];
7409}
7410
7411Decl *ASTReader::GetDecl(DeclID ID) {
7412 if (ID < NUM_PREDEF_DECL_IDS)
7413 return GetExistingDecl(ID);
7414
7415 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
7416
7417 if (Index >= DeclsLoaded.size()) {
7418 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 7418, __extension__ __PRETTY_FUNCTION__))
;
7419 Error("declaration ID out-of-range for AST file");
7420 return nullptr;
7421 }
7422
7423 if (!DeclsLoaded[Index]) {
7424 ReadDeclRecord(ID);
7425 if (DeserializationListener)
7426 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
7427 }
7428
7429 return DeclsLoaded[Index];
7430}
7431
7432DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M,
7433 DeclID GlobalID) {
7434 if (GlobalID < NUM_PREDEF_DECL_IDS)
7435 return GlobalID;
7436
7437 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID);
7438 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 7438, __extension__ __PRETTY_FUNCTION__))
;
7439 ModuleFile *Owner = I->second;
7440
7441 llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos
7442 = M.GlobalToLocalDeclIDs.find(Owner);
7443 if (Pos == M.GlobalToLocalDeclIDs.end())
7444 return 0;
7445
7446 return GlobalID - Owner->BaseDeclID + Pos->second;
7447}
7448
7449serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F,
7450 const RecordData &Record,
7451 unsigned &Idx) {
7452 if (Idx >= Record.size()) {
7453 Error("Corrupted AST file");
7454 return 0;
7455 }
7456
7457 return getGlobalDeclID(F, Record[Idx++]);
7458}
7459
7460/// Resolve the offset of a statement into a statement.
7461///
7462/// This operation will read a new statement from the external
7463/// source each time it is called, and is meant to be used via a
7464/// LazyOffsetPtr (which is used by Decls for the body of functions, etc).
7465Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) {
7466 // Switch case IDs are per Decl.
7467 ClearSwitchCaseIDs();
7468
7469 // Offset here is a global offset across the entire chain.
7470 RecordLocation Loc = getLocalBitOffset(Offset);
7471 if (llvm::Error Err = Loc.F->DeclsCursor.JumpToBit(Loc.Offset)) {
7472 Error(std::move(Err));
7473 return nullptr;
7474 }
7475 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 7476, __extension__ __PRETTY_FUNCTION__))
7476 "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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 7476, __extension__ __PRETTY_FUNCTION__))
;
7477 Deserializing D(this);
7478 return ReadStmtFromStream(*Loc.F);
7479}
7480
7481void ASTReader::FindExternalLexicalDecls(
7482 const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant,
7483 SmallVectorImpl<Decl *> &Decls) {
7484 bool PredefsVisited[NUM_PREDEF_DECL_IDS] = {};
7485
7486 auto Visit = [&] (ModuleFile *M, LexicalContents LexicalDecls) {
7487 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 7487, __extension__ __PRETTY_FUNCTION__))
;
7488 for (int I = 0, N = LexicalDecls.size(); I != N; I += 2) {
7489 auto K = (Decl::Kind)+LexicalDecls[I];
7490 if (!IsKindWeWant(K))
7491 continue;
7492
7493 auto ID = (serialization::DeclID)+LexicalDecls[I + 1];
7494
7495 // Don't add predefined declarations to the lexical context more
7496 // than once.
7497 if (ID < NUM_PREDEF_DECL_IDS) {
7498 if (PredefsVisited[ID])
7499 continue;
7500
7501 PredefsVisited[ID] = true;
7502 }
7503
7504 if (Decl *D = GetLocalDecl(*M, ID)) {
7505 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 7505, __extension__ __PRETTY_FUNCTION__))
;
7506 if (!DC->isDeclInLexicalTraversal(D))
7507 Decls.push_back(D);
7508 }
7509 }
7510 };
7511
7512 if (isa<TranslationUnitDecl>(DC)) {
7513 for (auto Lexical : TULexicalDecls)
7514 Visit(Lexical.first, Lexical.second);
7515 } else {
7516 auto I = LexicalDecls.find(DC);
7517 if (I != LexicalDecls.end())
7518 Visit(I->second.first, I->second.second);
7519 }
7520
7521 ++NumLexicalDeclContextsRead;
7522}
7523
7524namespace {
7525
7526class DeclIDComp {
7527 ASTReader &Reader;
7528 ModuleFile &Mod;
7529
7530public:
7531 DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {}
7532
7533 bool operator()(LocalDeclID L, LocalDeclID R) const {
7534 SourceLocation LHS = getLocation(L);
7535 SourceLocation RHS = getLocation(R);
7536 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
7537 }
7538
7539 bool operator()(SourceLocation LHS, LocalDeclID R) const {
7540 SourceLocation RHS = getLocation(R);
7541 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
7542 }
7543
7544 bool operator()(LocalDeclID L, SourceLocation RHS) const {
7545 SourceLocation LHS = getLocation(L);
7546 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
7547 }
7548
7549 SourceLocation getLocation(LocalDeclID ID) const {
7550 return Reader.getSourceManager().getFileLoc(
7551 Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID)));
7552 }
7553};
7554
7555} // namespace
7556
7557void ASTReader::FindFileRegionDecls(FileID File,
7558 unsigned Offset, unsigned Length,
7559 SmallVectorImpl<Decl *> &Decls) {
7560 SourceManager &SM = getSourceManager();
7561
7562 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File);
7563 if (I == FileDeclIDs.end())
7564 return;
7565
7566 FileDeclsInfo &DInfo = I->second;
7567 if (DInfo.Decls.empty())
7568 return;
7569
7570 SourceLocation
7571 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset);
7572 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length);
7573
7574 DeclIDComp DIDComp(*this, *DInfo.Mod);
7575 ArrayRef<serialization::LocalDeclID>::iterator BeginIt =
7576 llvm::lower_bound(DInfo.Decls, BeginLoc, DIDComp);
7577 if (BeginIt != DInfo.Decls.begin())
7578 --BeginIt;
7579
7580 // If we are pointing at a top-level decl inside an objc container, we need
7581 // to backtrack until we find it otherwise we will fail to report that the
7582 // region overlaps with an objc container.
7583 while (BeginIt != DInfo.Decls.begin() &&
7584 GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt))
7585 ->isTopLevelDeclInObjCContainer())
7586 --BeginIt;
7587
7588 ArrayRef<serialization::LocalDeclID>::iterator EndIt =
7589 llvm::upper_bound(DInfo.Decls, EndLoc, DIDComp);
7590 if (EndIt != DInfo.Decls.end())
7591 ++EndIt;
7592
7593 for (ArrayRef<serialization::LocalDeclID>::iterator
7594 DIt = BeginIt; DIt != EndIt; ++DIt)
7595 Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt)));
7596}
7597
7598bool
7599ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC,
7600 DeclarationName Name) {
7601 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 7602, __extension__ __PRETTY_FUNCTION__))
7602 "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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 7602, __extension__ __PRETTY_FUNCTION__))
;
7603 if (!Name)
7604 return false;
7605
7606 auto It = Lookups.find(DC);
7607 if (It == Lookups.end())
7608 return false;
7609
7610 Deserializing LookupResults(this);
7611
7612 // Load the list of declarations.
7613 SmallVector<NamedDecl *, 64> Decls;
7614 llvm::SmallPtrSet<NamedDecl *, 8> Found;
7615 for (DeclID ID : It->second.Table.find(Name)) {
7616 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID));
7617 if (ND->getDeclName() == Name && Found.insert(ND).second)
7618 Decls.push_back(ND);
7619 }
7620
7621 ++NumVisibleDeclContextsRead;
7622 SetExternalVisibleDeclsForName(DC, Name, Decls);
7623 return !Decls.empty();
7624}
7625
7626void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) {
7627 if (!DC->hasExternalVisibleStorage())
7628 return;
7629
7630 auto It = Lookups.find(DC);
7631 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 7632, __extension__ __PRETTY_FUNCTION__))
7632 "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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 7632, __extension__ __PRETTY_FUNCTION__))
;
7633
7634 DeclsMap Decls;
7635
7636 for (DeclID ID : It->second.Table.findAll()) {
7637 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID));
7638 Decls[ND->getDeclName()].push_back(ND);
7639 }
7640
7641 ++NumVisibleDeclContextsRead;
7642
7643 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) {
7644 SetExternalVisibleDeclsForName(DC, I->first, I->second);
7645 }
7646 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false);
7647}
7648
7649const serialization::reader::DeclContextLookupTable *
7650ASTReader::getLoadedLookupTables(DeclContext *Primary) const {
7651 auto I = Lookups.find(Primary);
7652 return I == Lookups.end() ? nullptr : &I->second;
7653}
7654
7655/// Under non-PCH compilation the consumer receives the objc methods
7656/// before receiving the implementation, and codegen depends on this.
7657/// We simulate this by deserializing and passing to consumer the methods of the
7658/// implementation before passing the deserialized implementation decl.
7659static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD,
7660 ASTConsumer *Consumer) {
7661 assert(ImplD && Consumer)(static_cast <bool> (ImplD && Consumer) ? void (
0) : __assert_fail ("ImplD && Consumer", "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 7661, __extension__ __PRETTY_FUNCTION__))
;
7662
7663 for (auto *I : ImplD->methods())
7664 Consumer->HandleInterestingDecl(DeclGroupRef(I));
7665
7666 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD));
7667}
7668
7669void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
7670 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
7671 PassObjCImplDeclToConsumer(ImplD, Consumer);
7672 else
7673 Consumer->HandleInterestingDecl(DeclGroupRef(D));
7674}
7675
7676void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) {
7677 this->Consumer = Consumer;
7678
7679 if (Consumer)
7680 PassInterestingDeclsToConsumer();
7681
7682 if (DeserializationListener)
7683 DeserializationListener->ReaderInitialized(this);
7684}
7685
7686void ASTReader::PrintStats() {
7687 std::fprintf(stderrstderr, "*** AST File Statistics:\n");
7688
7689 unsigned NumTypesLoaded
7690 = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(),
7691 QualType());
7692 unsigned NumDeclsLoaded
7693 = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(),
7694 (Decl *)nullptr);
7695 unsigned NumIdentifiersLoaded
7696 = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(),
7697 IdentifiersLoaded.end(),
7698 (IdentifierInfo *)nullptr);
7699 unsigned NumMacrosLoaded
7700 = MacrosLoaded.size() - std::count(MacrosLoaded.begin(),
7701 MacrosLoaded.end(),
7702 (MacroInfo *)nullptr);
7703 unsigned NumSelectorsLoaded
7704 = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(),
7705 SelectorsLoaded.end(),
7706 Selector());
7707
7708 if (unsigned TotalNumSLocEntries = getTotalNumSLocs())
7709 std::fprintf(stderrstderr, " %u/%u source location entries read (%f%%)\n",
7710 NumSLocEntriesRead, TotalNumSLocEntries,
7711 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
7712 if (!TypesLoaded.empty())
7713 std::fprintf(stderrstderr, " %u/%u types read (%f%%)\n",
7714 NumTypesLoaded, (unsigned)TypesLoaded.size(),
7715 ((float)NumTypesLoaded/TypesLoaded.size() * 100));
7716 if (!DeclsLoaded.empty())
7717 std::fprintf(stderrstderr, " %u/%u declarations read (%f%%)\n",
7718 NumDeclsLoaded, (unsigned)DeclsLoaded.size(),
7719 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100));
7720 if (!IdentifiersLoaded.empty())
7721 std::fprintf(stderrstderr, " %u/%u identifiers read (%f%%)\n",
7722 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(),
7723 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
7724 if (!MacrosLoaded.empty())
7725 std::fprintf(stderrstderr, " %u/%u macros read (%f%%)\n",
7726 NumMacrosLoaded, (unsigned)MacrosLoaded.size(),
7727 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100));
7728 if (!SelectorsLoaded.empty())
7729 std::fprintf(stderrstderr, " %u/%u selectors read (%f%%)\n",
7730 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(),
7731 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
7732 if (TotalNumStatements)
7733 std::fprintf(stderrstderr, " %u/%u statements read (%f%%)\n",
7734 NumStatementsRead, TotalNumStatements,
7735 ((float)NumStatementsRead/TotalNumStatements * 100));
7736 if (TotalNumMacros)
7737 std::fprintf(stderrstderr, " %u/%u macros read (%f%%)\n",
7738 NumMacrosRead, TotalNumMacros,
7739 ((float)NumMacrosRead/TotalNumMacros * 100));
7740 if (TotalLexicalDeclContexts)
7741 std::fprintf(stderrstderr, " %u/%u lexical declcontexts read (%f%%)\n",
7742 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
7743 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
7744 * 100));
7745 if (TotalVisibleDeclContexts)
7746 std::fprintf(stderrstderr, " %u/%u visible declcontexts read (%f%%)\n",
7747 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
7748 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
7749 * 100));
7750 if (TotalNumMethodPoolEntries)
7751 std::fprintf(stderrstderr, " %u/%u method pool entries read (%f%%)\n",
7752 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
7753 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
7754 * 100));
7755 if (NumMethodPoolLookups)
7756 std::fprintf(stderrstderr, " %u/%u method pool lookups succeeded (%f%%)\n",
7757 NumMethodPoolHits, NumMethodPoolLookups,
7758 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
7759 if (NumMethodPoolTableLookups)
7760 std::fprintf(stderrstderr, " %u/%u method pool table lookups succeeded (%f%%)\n",
7761 NumMethodPoolTableHits, NumMethodPoolTableLookups,
7762 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups
7763 * 100.0));
7764 if (NumIdentifierLookupHits)
7765 std::fprintf(stderrstderr,
7766 " %u / %u identifier table lookups succeeded (%f%%)\n",
7767 NumIdentifierLookupHits, NumIdentifierLookups,
7768 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
7769
7770 if (GlobalIndex) {
7771 std::fprintf(stderrstderr, "\n");
7772 GlobalIndex->printStats();
7773 }
7774
7775 std::fprintf(stderrstderr, "\n");
7776 dump();
7777 std::fprintf(stderrstderr, "\n");
7778}
7779
7780template<typename Key, typename ModuleFile, unsigned InitialCapacity>
7781LLVM_DUMP_METHOD__attribute__((noinline)) __attribute__((__used__)) static void
7782dumpModuleIDMap(StringRef Name,
7783 const ContinuousRangeMap<Key, ModuleFile *,
7784 InitialCapacity> &Map) {
7785 if (Map.begin() == Map.end())
7786 return;
7787
7788 using MapType = ContinuousRangeMap<Key, ModuleFile *, InitialCapacity>;
7789
7790 llvm::errs() << Name << ":\n";
7791 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
7792 I != IEnd; ++I) {
7793 llvm::errs() << " " << I->first << " -> " << I->second->FileName
7794 << "\n";
7795 }
7796}
7797
7798LLVM_DUMP_METHOD__attribute__((noinline)) __attribute__((__used__)) void ASTReader::dump() {
7799 llvm::errs() << "*** PCH/ModuleFile Remappings:\n";
7800 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap);
7801 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap);
7802 dumpModuleIDMap("Global type map", GlobalTypeMap);
7803 dumpModuleIDMap("Global declaration map", GlobalDeclMap);
7804 dumpModuleIDMap("Global identifier map", GlobalIdentifierMap);
7805 dumpModuleIDMap("Global macro map", GlobalMacroMap);
7806 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap);
7807 dumpModuleIDMap("Global selector map", GlobalSelectorMap);
7808 dumpModuleIDMap("Global preprocessed entity map",
7809 GlobalPreprocessedEntityMap);
7810
7811 llvm::errs() << "\n*** PCH/Modules Loaded:";
7812 for (ModuleFile &M : ModuleMgr)
7813 M.dump();
7814}
7815
7816/// Return the amount of memory used by memory buffers, breaking down
7817/// by heap-backed versus mmap'ed memory.
7818void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const {
7819 for (ModuleFile &I : ModuleMgr) {
7820 if (llvm::MemoryBuffer *buf = I.Buffer) {
7821 size_t bytes = buf->getBufferSize();
7822 switch (buf->getBufferKind()) {
7823 case llvm::MemoryBuffer::MemoryBuffer_Malloc:
7824 sizes.malloc_bytes += bytes;
7825 break;
7826 case llvm::MemoryBuffer::MemoryBuffer_MMap:
7827 sizes.mmap_bytes += bytes;
7828 break;
7829 }
7830 }
7831 }
7832}
7833
7834void ASTReader::InitializeSema(Sema &S) {
7835 SemaObj = &S;
7836 S.addExternalSource(this);
7837
7838 // Makes sure any declarations that were deserialized "too early"
7839 // still get added to the identifier's declaration chains.
7840 for (uint64_t ID : PreloadedDeclIDs) {
7841 NamedDecl *D = cast<NamedDecl>(GetDecl(ID));
7842 pushExternalDeclIntoScope(D, D->getDeclName());
7843 }
7844 PreloadedDeclIDs.clear();
7845
7846 // FIXME: What happens if these are changed by a module import?
7847 if (!FPPragmaOptions.empty()) {
7848 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 7848, __extension__ __PRETTY_FUNCTION__))
;
7849 FPOptionsOverride NewOverrides =
7850 FPOptionsOverride::getFromOpaqueInt(FPPragmaOptions[0]);
7851 SemaObj->CurFPFeatures =
7852 NewOverrides.applyOverrides(SemaObj->getLangOpts());
7853 }
7854
7855 SemaObj->OpenCLFeatures = OpenCLExtensions;
7856
7857 UpdateSema();
7858}
7859
7860void ASTReader::UpdateSema() {
7861 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 7861, __extension__ __PRETTY_FUNCTION__))
;
7862
7863 // Load the offsets of the declarations that Sema references.
7864 // They will be lazily deserialized when needed.
7865 if (!SemaDeclRefs.empty()) {
7866 assert(SemaDeclRefs.size() % 3 == 0)(static_cast <bool> (SemaDeclRefs.size() % 3 == 0) ? void
(0) : __assert_fail ("SemaDeclRefs.size() % 3 == 0", "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 7866, __extension__ __PRETTY_FUNCTION__))
;
7867 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 3) {
7868 if (!SemaObj->StdNamespace)
7869 SemaObj->StdNamespace = SemaDeclRefs[I];
7870 if (!SemaObj->StdBadAlloc)
7871 SemaObj->StdBadAlloc = SemaDeclRefs[I+1];
7872 if (!SemaObj->StdAlignValT)
7873 SemaObj->StdAlignValT = SemaDeclRefs[I+2];
7874 }
7875 SemaDeclRefs.clear();
7876 }
7877
7878 // Update the state of pragmas. Use the same API as if we had encountered the
7879 // pragma in the source.
7880 if(OptimizeOffPragmaLocation.isValid())
7881 SemaObj->ActOnPragmaOptimize(/* On = */ false, OptimizeOffPragmaLocation);
7882 if (PragmaMSStructState != -1)
7883 SemaObj->ActOnPragmaMSStruct((PragmaMSStructKind)PragmaMSStructState);
7884 if (PointersToMembersPragmaLocation.isValid()) {
7885 SemaObj->ActOnPragmaMSPointersToMembers(
7886 (LangOptions::PragmaMSPointersToMembersKind)
7887 PragmaMSPointersToMembersState,
7888 PointersToMembersPragmaLocation);
7889 }
7890 SemaObj->ForceCUDAHostDeviceDepth = ForceCUDAHostDeviceDepth;
7891
7892 if (PragmaAlignPackCurrentValue) {
7893 // The bottom of the stack might have a default value. It must be adjusted
7894 // to the current value to ensure that the packing state is preserved after
7895 // popping entries that were included/imported from a PCH/module.
7896 bool DropFirst = false;
7897 if (!PragmaAlignPackStack.empty() &&
7898 PragmaAlignPackStack.front().Location.isInvalid()) {
7899 assert(PragmaAlignPackStack.front().Value ==(static_cast <bool> (PragmaAlignPackStack.front().Value
== SemaObj->AlignPackStack.DefaultValue && "Expected a default alignment value"
) ? void (0) : __assert_fail ("PragmaAlignPackStack.front().Value == SemaObj->AlignPackStack.DefaultValue && \"Expected a default alignment value\""
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 7901, __extension__ __PRETTY_FUNCTION__))
7900 SemaObj->AlignPackStack.DefaultValue &&(static_cast <bool> (PragmaAlignPackStack.front().Value
== SemaObj->AlignPackStack.DefaultValue && "Expected a default alignment value"
) ? void (0) : __assert_fail ("PragmaAlignPackStack.front().Value == SemaObj->AlignPackStack.DefaultValue && \"Expected a default alignment value\""
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 7901, __extension__ __PRETTY_FUNCTION__))
7901 "Expected a default alignment value")(static_cast <bool> (PragmaAlignPackStack.front().Value
== SemaObj->AlignPackStack.DefaultValue && "Expected a default alignment value"
) ? void (0) : __assert_fail ("PragmaAlignPackStack.front().Value == SemaObj->AlignPackStack.DefaultValue && \"Expected a default alignment value\""
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 7901, __extension__ __PRETTY_FUNCTION__))
;
7902 SemaObj->AlignPackStack.Stack.emplace_back(
7903 PragmaAlignPackStack.front().SlotLabel,
7904 SemaObj->AlignPackStack.CurrentValue,
7905 SemaObj->AlignPackStack.CurrentPragmaLocation,
7906 PragmaAlignPackStack.front().PushLocation);
7907 DropFirst = true;
7908 }
7909 for (const auto &Entry : llvm::makeArrayRef(PragmaAlignPackStack)
7910 .drop_front(DropFirst ? 1 : 0)) {
7911 SemaObj->AlignPackStack.Stack.emplace_back(
7912 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
7913 }
7914 if (PragmaAlignPackCurrentLocation.isInvalid()) {
7915 assert(*PragmaAlignPackCurrentValue ==(static_cast <bool> (*PragmaAlignPackCurrentValue == SemaObj
->AlignPackStack.DefaultValue && "Expected a default align and pack value"
) ? void (0) : __assert_fail ("*PragmaAlignPackCurrentValue == SemaObj->AlignPackStack.DefaultValue && \"Expected a default align and pack value\""
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 7917, __extension__ __PRETTY_FUNCTION__))
7916 SemaObj->AlignPackStack.DefaultValue &&(static_cast <bool> (*PragmaAlignPackCurrentValue == SemaObj
->AlignPackStack.DefaultValue && "Expected a default align and pack value"
) ? void (0) : __assert_fail ("*PragmaAlignPackCurrentValue == SemaObj->AlignPackStack.DefaultValue && \"Expected a default align and pack value\""
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 7917, __extension__ __PRETTY_FUNCTION__))
7917 "Expected a default align and pack value")(static_cast <bool> (*PragmaAlignPackCurrentValue == SemaObj
->AlignPackStack.DefaultValue && "Expected a default align and pack value"
) ? void (0) : __assert_fail ("*PragmaAlignPackCurrentValue == SemaObj->AlignPackStack.DefaultValue && \"Expected a default align and pack value\""
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 7917, __extension__ __PRETTY_FUNCTION__))
;
7918 // Keep the current values.
7919 } else {
7920 SemaObj->AlignPackStack.CurrentValue = *PragmaAlignPackCurrentValue;
7921 SemaObj->AlignPackStack.CurrentPragmaLocation =
7922 PragmaAlignPackCurrentLocation;
7923 }
7924 }
7925 if (FpPragmaCurrentValue) {
7926 // The bottom of the stack might have a default value. It must be adjusted
7927 // to the current value to ensure that fp-pragma state is preserved after
7928 // popping entries that were included/imported from a PCH/module.
7929 bool DropFirst = false;
7930 if (!FpPragmaStack.empty() && FpPragmaStack.front().Location.isInvalid()) {
7931 assert(FpPragmaStack.front().Value ==(static_cast <bool> (FpPragmaStack.front().Value == SemaObj
->FpPragmaStack.DefaultValue && "Expected a default pragma float_control value"
) ? void (0) : __assert_fail ("FpPragmaStack.front().Value == SemaObj->FpPragmaStack.DefaultValue && \"Expected a default pragma float_control value\""
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 7933, __extension__ __PRETTY_FUNCTION__))
7932 SemaObj->FpPragmaStack.DefaultValue &&(static_cast <bool> (FpPragmaStack.front().Value == SemaObj
->FpPragmaStack.DefaultValue && "Expected a default pragma float_control value"
) ? void (0) : __assert_fail ("FpPragmaStack.front().Value == SemaObj->FpPragmaStack.DefaultValue && \"Expected a default pragma float_control value\""
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 7933, __extension__ __PRETTY_FUNCTION__))
7933 "Expected a default pragma float_control value")(static_cast <bool> (FpPragmaStack.front().Value == SemaObj
->FpPragmaStack.DefaultValue && "Expected a default pragma float_control value"
) ? void (0) : __assert_fail ("FpPragmaStack.front().Value == SemaObj->FpPragmaStack.DefaultValue && \"Expected a default pragma float_control value\""
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 7933, __extension__ __PRETTY_FUNCTION__))
;
7934 SemaObj->FpPragmaStack.Stack.emplace_back(
7935 FpPragmaStack.front().SlotLabel, SemaObj->FpPragmaStack.CurrentValue,
7936 SemaObj->FpPragmaStack.CurrentPragmaLocation,
7937 FpPragmaStack.front().PushLocation);
7938 DropFirst = true;
7939 }
7940 for (const auto &Entry :
7941 llvm::makeArrayRef(FpPragmaStack).drop_front(DropFirst ? 1 : 0))
7942 SemaObj->FpPragmaStack.Stack.emplace_back(
7943 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
7944 if (FpPragmaCurrentLocation.isInvalid()) {
7945 assert(*FpPragmaCurrentValue == SemaObj->FpPragmaStack.DefaultValue &&(static_cast <bool> (*FpPragmaCurrentValue == SemaObj->
FpPragmaStack.DefaultValue && "Expected a default pragma float_control value"
) ? void (0) : __assert_fail ("*FpPragmaCurrentValue == SemaObj->FpPragmaStack.DefaultValue && \"Expected a default pragma float_control value\""
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 7946, __extension__ __PRETTY_FUNCTION__))
7946 "Expected a default pragma float_control value")(static_cast <bool> (*FpPragmaCurrentValue == SemaObj->
FpPragmaStack.DefaultValue && "Expected a default pragma float_control value"
) ? void (0) : __assert_fail ("*FpPragmaCurrentValue == SemaObj->FpPragmaStack.DefaultValue && \"Expected a default pragma float_control value\""
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 7946, __extension__ __PRETTY_FUNCTION__))
;
7947 // Keep the current values.
7948 } else {
7949 SemaObj->FpPragmaStack.CurrentValue = *FpPragmaCurrentValue;
7950 SemaObj->FpPragmaStack.CurrentPragmaLocation = FpPragmaCurrentLocation;
7951 }
7952 }
7953
7954 // For non-modular AST files, restore visiblity of modules.
7955 for (auto &Import : ImportedModules) {
7956 if (Import.ImportLoc.isInvalid())
7957 continue;
7958 if (Module *Imported = getSubmodule(Import.ID)) {
7959 SemaObj->makeModuleVisible(Imported, Import.ImportLoc);
7960 }
7961 }
7962}
7963
7964IdentifierInfo *ASTReader::get(StringRef Name) {
7965 // Note that we are loading an identifier.
7966 Deserializing AnIdentifier(this);
7967
7968 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0,
7969 NumIdentifierLookups,
7970 NumIdentifierLookupHits);
7971
7972 // We don't need to do identifier table lookups in C++ modules (we preload
7973 // all interesting declarations, and don't need to use the scope for name
7974 // lookups). Perform the lookup in PCH files, though, since we don't build
7975 // a complete initial identifier table if we're carrying on from a PCH.
7976 if (PP.getLangOpts().CPlusPlus) {
7977 for (auto F : ModuleMgr.pch_modules())
7978 if (Visitor(*F))
7979 break;
7980 } else {
7981 // If there is a global index, look there first to determine which modules
7982 // provably do not have any results for this identifier.
7983 GlobalModuleIndex::HitSet Hits;
7984 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
7985 if (!loadGlobalIndex()) {
7986 if (GlobalIndex->lookupIdentifier(Name, Hits)) {
7987 HitsPtr = &Hits;
7988 }
7989 }
7990
7991 ModuleMgr.visit(Visitor, HitsPtr);
7992 }
7993
7994 IdentifierInfo *II = Visitor.getIdentifierInfo();
7995 markIdentifierUpToDate(II);
7996 return II;
7997}
7998
7999namespace clang {
8000
8001 /// An identifier-lookup iterator that enumerates all of the
8002 /// identifiers stored within a set of AST files.
8003 class ASTIdentifierIterator : public IdentifierIterator {
8004 /// The AST reader whose identifiers are being enumerated.
8005 const ASTReader &Reader;
8006
8007 /// The current index into the chain of AST files stored in
8008 /// the AST reader.
8009 unsigned Index;
8010
8011 /// The current position within the identifier lookup table
8012 /// of the current AST file.
8013 ASTIdentifierLookupTable::key_iterator Current;
8014
8015 /// The end position within the identifier lookup table of
8016 /// the current AST file.
8017 ASTIdentifierLookupTable::key_iterator End;
8018
8019 /// Whether to skip any modules in the ASTReader.
8020 bool SkipModules;
8021
8022 public:
8023 explicit ASTIdentifierIterator(const ASTReader &Reader,
8024 bool SkipModules = false);
8025
8026 StringRef Next() override;
8027 };
8028
8029} // namespace clang
8030
8031ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader,
8032 bool SkipModules)
8033 : Reader(Reader), Index(Reader.ModuleMgr.size()), SkipModules(SkipModules) {
8034}
8035
8036StringRef ASTIdentifierIterator::Next() {
8037 while (Current == End) {
8038 // If we have exhausted all of our AST files, we're done.
8039 if (Index == 0)
8040 return StringRef();
8041
8042 --Index;
8043 ModuleFile &F = Reader.ModuleMgr[Index];
8044 if (SkipModules && F.isModule())
8045 continue;
8046
8047 ASTIdentifierLookupTable *IdTable =
8048 (ASTIdentifierLookupTable *)F.IdentifierLookupTable;
8049 Current = IdTable->key_begin();
8050 End = IdTable->key_end();
8051 }
8052
8053 // We have any identifiers remaining in the current AST file; return
8054 // the next one.
8055 StringRef Result = *Current;
8056 ++Current;
8057 return Result;
8058}
8059
8060namespace {
8061
8062/// A utility for appending two IdentifierIterators.
8063class ChainedIdentifierIterator : public IdentifierIterator {
8064 std::unique_ptr<IdentifierIterator> Current;
8065 std::unique_ptr<IdentifierIterator> Queued;
8066
8067public:
8068 ChainedIdentifierIterator(std::unique_ptr<IdentifierIterator> First,
8069 std::unique_ptr<IdentifierIterator> Second)
8070 : Current(std::move(First)), Queued(std::move(Second)) {}
8071
8072 StringRef Next() override {
8073 if (!Current)
8074 return StringRef();
8075
8076 StringRef result = Current->Next();
8077 if (!result.empty())
8078 return result;
8079
8080 // Try the queued iterator, which may itself be empty.
8081 Current.reset();
8082 std::swap(Current, Queued);
8083 return Next();
8084 }
8085};
8086
8087} // namespace
8088
8089IdentifierIterator *ASTReader::getIdentifiers() {
8090 if (!loadGlobalIndex()) {
8091 std::unique_ptr<IdentifierIterator> ReaderIter(
8092 new ASTIdentifierIterator(*this, /*SkipModules=*/true));
8093 std::unique_ptr<IdentifierIterator> ModulesIter(
8094 GlobalIndex->createIdentifierIterator());
8095 return new ChainedIdentifierIterator(std::move(ReaderIter),
8096 std::move(ModulesIter));
8097 }
8098
8099 return new ASTIdentifierIterator(*this);
8100}
8101
8102namespace clang {
8103namespace serialization {
8104
8105 class ReadMethodPoolVisitor {
8106 ASTReader &Reader;
8107 Selector Sel;
8108 unsigned PriorGeneration;
8109 unsigned InstanceBits = 0;
8110 unsigned FactoryBits = 0;
8111 bool InstanceHasMoreThanOneDecl = false;
8112 bool FactoryHasMoreThanOneDecl = false;
8113 SmallVector<ObjCMethodDecl *, 4> InstanceMethods;
8114 SmallVector<ObjCMethodDecl *, 4> FactoryMethods;
8115
8116 public:
8117 ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel,
8118 unsigned PriorGeneration)
8119 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) {}
8120
8121 bool operator()(ModuleFile &M) {
8122 if (!M.SelectorLookupTable)
8123 return false;
8124
8125 // If we've already searched this module file, skip it now.
8126 if (M.Generation <= PriorGeneration)
8127 return true;
8128
8129 ++Reader.NumMethodPoolTableLookups;
8130 ASTSelectorLookupTable *PoolTable
8131 = (ASTSelectorLookupTable*)M.SelectorLookupTable;
8132 ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel);
8133 if (Pos == PoolTable->end())
8134 return false;
8135
8136 ++Reader.NumMethodPoolTableHits;
8137 ++Reader.NumSelectorsRead;
8138 // FIXME: Not quite happy with the statistics here. We probably should
8139 // disable this tracking when called via LoadSelector.
8140 // Also, should entries without methods count as misses?
8141 ++Reader.NumMethodPoolEntriesRead;
8142 ASTSelectorLookupTrait::data_type Data = *Pos;
8143 if (Reader.DeserializationListener)
8144 Reader.DeserializationListener->SelectorRead(Data.ID, Sel);
8145
8146 InstanceMethods.append(Data.Instance.begin(), Data.Instance.end());
8147 FactoryMethods.append(Data.Factory.begin(), Data.Factory.end());
8148 InstanceBits = Data.InstanceBits;
8149 FactoryBits = Data.FactoryBits;
8150 InstanceHasMoreThanOneDecl = Data.InstanceHasMoreThanOneDecl;
8151 FactoryHasMoreThanOneDecl = Data.FactoryHasMoreThanOneDecl;
8152 return true;
8153 }
8154
8155 /// Retrieve the instance methods found by this visitor.
8156 ArrayRef<ObjCMethodDecl *> getInstanceMethods() const {
8157 return InstanceMethods;
8158 }
8159
8160 /// Retrieve the instance methods found by this visitor.
8161 ArrayRef<ObjCMethodDecl *> getFactoryMethods() const {
8162 return FactoryMethods;
8163 }
8164
8165 unsigned getInstanceBits() const { return InstanceBits; }
8166 unsigned getFactoryBits() const { return FactoryBits; }
8167
8168 bool instanceHasMoreThanOneDecl() const {
8169 return InstanceHasMoreThanOneDecl;
8170 }
8171
8172 bool factoryHasMoreThanOneDecl() const { return FactoryHasMoreThanOneDecl; }
8173 };
8174
8175} // namespace serialization
8176} // namespace clang
8177
8178/// Add the given set of methods to the method list.
8179static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods,
8180 ObjCMethodList &List) {
8181 for (unsigned I = 0, N = Methods.size(); I != N; ++I) {
8182 S.addMethodToGlobalList(&List, Methods[I]);
8183 }
8184}
8185
8186void ASTReader::ReadMethodPool(Selector Sel) {
8187 // Get the selector generation and update it to the current generation.
8188 unsigned &Generation = SelectorGeneration[Sel];
8189 unsigned PriorGeneration = Generation;
8190 Generation = getGeneration();
8191 SelectorOutOfDate[Sel] = false;
8192
8193 // Search for methods defined with this selector.
8194 ++NumMethodPoolLookups;
8195 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration);
8196 ModuleMgr.visit(Visitor);
8197
8198 if (Visitor.getInstanceMethods().empty() &&
8199 Visitor.getFactoryMethods().empty())
8200 return;
8201
8202 ++NumMethodPoolHits;
8203
8204 if (!getSema())
8205 return;
8206
8207 Sema &S = *getSema();
8208 Sema::GlobalMethodPool::iterator Pos
8209 = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first;
8210
8211 Pos->second.first.setBits(Visitor.getInstanceBits());
8212 Pos->second.first.setHasMoreThanOneDecl(Visitor.instanceHasMoreThanOneDecl());
8213 Pos->second.second.setBits(Visitor.getFactoryBits());
8214 Pos->second.second.setHasMoreThanOneDecl(Visitor.factoryHasMoreThanOneDecl());
8215
8216 // Add methods to the global pool *after* setting hasMoreThanOneDecl, since
8217 // when building a module we keep every method individually and may need to
8218 // update hasMoreThanOneDecl as we add the methods.
8219 addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first);
8220 addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second);
8221}
8222
8223void ASTReader::updateOutOfDateSelector(Selector Sel) {
8224 if (SelectorOutOfDate[Sel])
8225 ReadMethodPool(Sel);
8226}
8227
8228void ASTReader::ReadKnownNamespaces(
8229 SmallVectorImpl<NamespaceDecl *> &Namespaces) {
8230 Namespaces.clear();
8231
8232 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
8233 if (NamespaceDecl *Namespace
8234 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I])))
8235 Namespaces.push_back(Namespace);
8236 }
8237}
8238
8239void ASTReader::ReadUndefinedButUsed(
8240 llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) {
8241 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
8242 NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++]));
8243 SourceLocation Loc =
8244 SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]);
8245 Undefined.insert(std::make_pair(D, Loc));
8246 }
8247}
8248
8249void ASTReader::ReadMismatchingDeleteExpressions(llvm::MapVector<
8250 FieldDecl *, llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> &
8251 Exprs) {
8252 for (unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) {
8253 FieldDecl *FD = cast<FieldDecl>(GetDecl(DelayedDeleteExprs[Idx++]));
8254 uint64_t Count = DelayedDeleteExprs[Idx++];
8255 for (uint64_t C = 0; C < Count; ++C) {
8256 SourceLocation DeleteLoc =
8257 SourceLocation::getFromRawEncoding(DelayedDeleteExprs[Idx++]);
8258 const bool IsArrayForm = DelayedDeleteExprs[Idx++];
8259 Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm));
8260 }
8261 }
8262}
8263
8264void ASTReader::ReadTentativeDefinitions(
8265 SmallVectorImpl<VarDecl *> &TentativeDefs) {
8266 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
8267 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I]));
8268 if (Var)
8269 TentativeDefs.push_back(Var);
8270 }
8271 TentativeDefinitions.clear();
8272}
8273
8274void ASTReader::ReadUnusedFileScopedDecls(
8275 SmallVectorImpl<const DeclaratorDecl *> &Decls) {
8276 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
8277 DeclaratorDecl *D
8278 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I]));
8279 if (D)
8280 Decls.push_back(D);
8281 }
8282 UnusedFileScopedDecls.clear();
8283}
8284
8285void ASTReader::ReadDelegatingConstructors(
8286 SmallVectorImpl<CXXConstructorDecl *> &Decls) {
8287 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
8288 CXXConstructorDecl *D
8289 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I]));
8290 if (D)
8291 Decls.push_back(D);
8292 }
8293 DelegatingCtorDecls.clear();
8294}
8295
8296void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) {
8297 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
8298 TypedefNameDecl *D
8299 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I]));
8300 if (D)
8301 Decls.push_back(D);
8302 }
8303 ExtVectorDecls.clear();
8304}
8305
8306void ASTReader::ReadUnusedLocalTypedefNameCandidates(
8307 llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) {
8308 for (unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N;
8309 ++I) {
8310 TypedefNameDecl *D = dyn_cast_or_null<TypedefNameDecl>(
8311 GetDecl(UnusedLocalTypedefNameCandidates[I]));
8312 if (D)
8313 Decls.insert(D);
8314 }
8315 UnusedLocalTypedefNameCandidates.clear();
8316}
8317
8318void ASTReader::ReadDeclsToCheckForDeferredDiags(
8319 llvm::SmallSetVector<Decl *, 4> &Decls) {
8320 for (auto I : DeclsToCheckForDeferredDiags) {
8321 auto *D = dyn_cast_or_null<Decl>(GetDecl(I));
8322 if (D)
8323 Decls.insert(D);
8324 }
8325 DeclsToCheckForDeferredDiags.clear();
8326}
8327
8328void ASTReader::ReadReferencedSelectors(
8329 SmallVectorImpl<std::pair<Selector, SourceLocation>> &Sels) {
8330 if (ReferencedSelectorsData.empty())
8331 return;
8332
8333 // If there are @selector references added them to its pool. This is for
8334 // implementation of -Wselector.
8335 unsigned int DataSize = ReferencedSelectorsData.size()-1;
8336 unsigned I = 0;
8337 while (I < DataSize) {
8338 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]);
8339 SourceLocation SelLoc
8340 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]);
8341 Sels.push_back(std::make_pair(Sel, SelLoc));
8342 }
8343 ReferencedSelectorsData.clear();
8344}
8345
8346void ASTReader::ReadWeakUndeclaredIdentifiers(
8347 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo>> &WeakIDs) {
8348 if (WeakUndeclaredIdentifiers.empty())
8349 return;
8350
8351 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) {
8352 IdentifierInfo *WeakId
8353 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
8354 IdentifierInfo *AliasId
8355 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
8356 SourceLocation Loc
8357 = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]);
8358 bool Used = WeakUndeclaredIdentifiers[I++];
8359 WeakInfo WI(AliasId, Loc);
8360 WI.setUsed(Used);
8361 WeakIDs.push_back(std::make_pair(WeakId, WI));
8362 }
8363 WeakUndeclaredIdentifiers.clear();
8364}
8365
8366void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) {
8367 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) {
8368 ExternalVTableUse VT;
8369 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++]));
8370 VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]);
8371 VT.DefinitionRequired = VTableUses[Idx++];
8372 VTables.push_back(VT);
8373 }
8374
8375 VTableUses.clear();
8376}
8377
8378void ASTReader::ReadPendingInstantiations(
8379 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation>> &Pending) {
8380 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
8381 ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++]));
8382 SourceLocation Loc
8383 = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]);
8384
8385 Pending.push_back(std::make_pair(D, Loc));
8386 }
8387 PendingInstantiations.clear();
8388}
8389
8390void ASTReader::ReadLateParsedTemplates(
8391 llvm::MapVector<const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>
8392 &LPTMap) {
8393 for (auto &LPT : LateParsedTemplates) {
8394 ModuleFile *FMod = LPT.first;
8395 RecordDataImpl &LateParsed = LPT.second;
8396 for (unsigned Idx = 0, N = LateParsed.size(); Idx < N;
8397 /* In loop */) {
8398 FunctionDecl *FD =
8399 cast<FunctionDecl>(GetLocalDecl(*FMod, LateParsed[Idx++]));
8400
8401 auto LT = std::make_unique<LateParsedTemplate>();
8402 LT->D = GetLocalDecl(*FMod, LateParsed[Idx++]);
8403
8404 ModuleFile *F = getOwningModuleFile(LT->D);
8405 assert(F && "No module")(static_cast <bool> (F && "No module") ? void (
0) : __assert_fail ("F && \"No module\"", "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 8405, __extension__ __PRETTY_FUNCTION__))
;
8406
8407 unsigned TokN = LateParsed[Idx++];
8408 LT->Toks.reserve(TokN);
8409 for (unsigned T = 0; T < TokN; ++T)
8410 LT->Toks.push_back(ReadToken(*F, LateParsed, Idx));
8411
8412 LPTMap.insert(std::make_pair(FD, std::move(LT)));
8413 }
8414 }
8415}
8416
8417void ASTReader::LoadSelector(Selector Sel) {
8418 // It would be complicated to avoid reading the methods anyway. So don't.
8419 ReadMethodPool(Sel);
8420}
8421
8422void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) {
8423 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 8423, __extension__ __PRETTY_FUNCTION__))
;
8424 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 8424, __extension__ __PRETTY_FUNCTION__))
;
8425 IdentifiersLoaded[ID - 1] = II;
8426 if (DeserializationListener)
8427 DeserializationListener->IdentifierRead(ID, II);
8428}
8429
8430/// Set the globally-visible declarations associated with the given
8431/// identifier.
8432///
8433/// If the AST reader is currently in a state where the given declaration IDs
8434/// cannot safely be resolved, they are queued until it is safe to resolve
8435/// them.
8436///
8437/// \param II an IdentifierInfo that refers to one or more globally-visible
8438/// declarations.
8439///
8440/// \param DeclIDs the set of declaration IDs with the name @p II that are
8441/// visible at global scope.
8442///
8443/// \param Decls if non-null, this vector will be populated with the set of
8444/// deserialized declarations. These declarations will not be pushed into
8445/// scope.
8446void
8447ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II,
8448 const SmallVectorImpl<uint32_t> &DeclIDs,
8449 SmallVectorImpl<Decl *> *Decls) {
8450 if (NumCurrentElementsDeserializing && !Decls) {
8451 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
8452 return;
8453 }
8454
8455 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
8456 if (!SemaObj) {
8457 // Queue this declaration so that it will be added to the
8458 // translation unit scope and identifier's declaration chain
8459 // once a Sema object is known.
8460 PreloadedDeclIDs.push_back(DeclIDs[I]);
8461 continue;
8462 }
8463
8464 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I]));
8465
8466 // If we're simply supposed to record the declarations, do so now.
8467 if (Decls) {
8468 Decls->push_back(D);
8469 continue;
8470 }
8471
8472 // Introduce this declaration into the translation-unit scope
8473 // and add it to the declaration chain for this identifier, so
8474 // that (unqualified) name lookup will find it.
8475 pushExternalDeclIntoScope(D, II);
8476 }
8477}
8478
8479IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) {
8480 if (ID == 0)
8481 return nullptr;
8482
8483 if (IdentifiersLoaded.empty()) {
8484 Error("no identifier table in AST file");
8485 return nullptr;
8486 }
8487
8488 ID -= 1;
8489 if (!IdentifiersLoaded[ID]) {
8490 GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1);
8491 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 8491, __extension__ __PRETTY_FUNCTION__))
;
8492 ModuleFile *M = I->second;
8493 unsigned Index = ID - M->BaseIdentifierID;
8494 const unsigned char *Data =
8495 M->IdentifierTableData + M->IdentifierOffsets[Index];
8496
8497 ASTIdentifierLookupTrait Trait(*this, *M);
8498 auto KeyDataLen = Trait.ReadKeyDataLength(Data);
8499 auto Key = Trait.ReadKey(Data, KeyDataLen.first);
8500 auto &II = PP.getIdentifierTable().get(Key);
8501 IdentifiersLoaded[ID] = &II;
8502 markIdentifierFromAST(*this, II);
8503 if (DeserializationListener)
8504 DeserializationListener->IdentifierRead(ID + 1, &II);
8505 }
8506
8507 return IdentifiersLoaded[ID];
8508}
8509
8510IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) {
8511 return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID));
8512}
8513
8514IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) {
8515 if (LocalID < NUM_PREDEF_IDENT_IDS)
8516 return LocalID;
8517
8518 if (!M.ModuleOffsetMap.empty())
8519 ReadModuleOffsetMap(M);
8520
8521 ContinuousRangeMap<uint32_t, int, 2>::iterator I
8522 = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS);
8523 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 8524, __extension__ __PRETTY_FUNCTION__))
8524 && "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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 8524, __extension__ __PRETTY_FUNCTION__))
;
8525
8526 return LocalID + I->second;
8527}
8528
8529MacroInfo *ASTReader::getMacro(MacroID ID) {
8530 if (ID == 0)
8531 return nullptr;
8532
8533 if (MacrosLoaded.empty()) {
8534 Error("no macro table in AST file");
8535 return nullptr;
8536 }
8537
8538 ID -= NUM_PREDEF_MACRO_IDS;
8539 if (!MacrosLoaded[ID]) {
8540 GlobalMacroMapType::iterator I
8541 = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS);
8542 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 8542, __extension__ __PRETTY_FUNCTION__))
;
8543 ModuleFile *M = I->second;
8544 unsigned Index = ID - M->BaseMacroID;
8545 MacrosLoaded[ID] =
8546 ReadMacroRecord(*M, M->MacroOffsetsBase + M->MacroOffsets[Index]);
8547
8548 if (DeserializationListener)
8549 DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS,
8550 MacrosLoaded[ID]);
8551 }
8552
8553 return MacrosLoaded[ID];
8554}
8555
8556MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) {
8557 if (LocalID < NUM_PREDEF_MACRO_IDS)
8558 return LocalID;
8559
8560 if (!M.ModuleOffsetMap.empty())
8561 ReadModuleOffsetMap(M);
8562
8563 ContinuousRangeMap<uint32_t, int, 2>::iterator I
8564 = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS);
8565 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 8565, __extension__ __PRETTY_FUNCTION__))
;
8566
8567 return LocalID + I->second;
8568}
8569
8570serialization::SubmoduleID
8571ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) {
8572 if (LocalID < NUM_PREDEF_SUBMODULE_IDS)
8573 return LocalID;
8574
8575 if (!M.ModuleOffsetMap.empty())
8576 ReadModuleOffsetMap(M);
8577
8578 ContinuousRangeMap<uint32_t, int, 2>::iterator I
8579 = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS);
8580 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 8581, __extension__ __PRETTY_FUNCTION__))
8581 && "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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 8581, __extension__ __PRETTY_FUNCTION__))
;
8582
8583 return LocalID + I->second;
8584}
8585
8586Module *ASTReader::getSubmodule(SubmoduleID GlobalID) {
8587 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) {
8588 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 8588, __extension__ __PRETTY_FUNCTION__))
;
8589 return nullptr;
8590 }
8591
8592 if (GlobalID > SubmodulesLoaded.size()) {
8593 Error("submodule ID out of range in AST file");
8594 return nullptr;
8595 }
8596
8597 return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS];
8598}
8599
8600Module *ASTReader::getModule(unsigned ID) {
8601 return getSubmodule(ID);
8602}
8603
8604ModuleFile *ASTReader::getLocalModuleFile(ModuleFile &F, unsigned ID) {
8605 if (ID & 1) {
8606 // It's a module, look it up by submodule ID.
8607 auto I = GlobalSubmoduleMap.find(getGlobalSubmoduleID(F, ID >> 1));
8608 return I == GlobalSubmoduleMap.end() ? nullptr : I->second;
8609 } else {
8610 // It's a prefix (preamble, PCH, ...). Look it up by index.
8611 unsigned IndexFromEnd = ID >> 1;
8612 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 8612, __extension__ __PRETTY_FUNCTION__))
;
8613 return getModuleManager().pch_modules().end()[-IndexFromEnd];
8614 }
8615}
8616
8617unsigned ASTReader::getModuleFileID(ModuleFile *F) {
8618 if (!F)
8619 return 1;
8620
8621 // For a file representing a module, use the submodule ID of the top-level
8622 // module as the file ID. For any other kind of file, the number of such
8623 // files loaded beforehand will be the same on reload.
8624 // FIXME: Is this true even if we have an explicit module file and a PCH?
8625 if (F->isModule())
8626 return ((F->BaseSubmoduleID + NUM_PREDEF_SUBMODULE_IDS) << 1) | 1;
8627
8628 auto PCHModules = getModuleManager().pch_modules();
8629 auto I = llvm::find(PCHModules, F);
8630 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 8630, __extension__ __PRETTY_FUNCTION__))
;
8631 return (I - PCHModules.end()) << 1;
8632}
8633
8634llvm::Optional<ASTSourceDescriptor>
8635ASTReader::getSourceDescriptor(unsigned ID) {
8636 if (Module *M = getSubmodule(ID))
8637 return ASTSourceDescriptor(*M);
8638
8639 // If there is only a single PCH, return it instead.
8640 // Chained PCH are not supported.
8641 const auto &PCHChain = ModuleMgr.pch_modules();
8642 if (std::distance(std::begin(PCHChain), std::end(PCHChain))) {
8643 ModuleFile &MF = ModuleMgr.getPrimaryModule();
8644 StringRef ModuleName = llvm::sys::path::filename(MF.OriginalSourceFileName);
8645 StringRef FileName = llvm::sys::path::filename(MF.FileName);
8646 return ASTSourceDescriptor(ModuleName, MF.OriginalDir, FileName,
8647 MF.Signature);
8648 }
8649 return None;
8650}
8651
8652ExternalASTSource::ExtKind ASTReader::hasExternalDefinitions(const Decl *FD) {
8653 auto I = DefinitionSource.find(FD);
8654 if (I == DefinitionSource.end())
8655 return EK_ReplyHazy;
8656 return I->second ? EK_Never : EK_Always;
8657}
8658
8659Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) {
8660 return DecodeSelector(getGlobalSelectorID(M, LocalID));
8661}
8662
8663Selector ASTReader::DecodeSelector(serialization::SelectorID ID) {
8664 if (ID == 0)
8665 return Selector();
8666
8667 if (ID > SelectorsLoaded.size()) {
8668 Error("selector ID out of range in AST file");
8669 return Selector();
8670 }
8671
8672 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) {
8673 // Load this selector from the selector table.
8674 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID);
8675 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 8675, __extension__ __PRETTY_FUNCTION__))
;
8676 ModuleFile &M = *I->second;
8677 ASTSelectorLookupTrait Trait(*this, M);
8678 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS;
8679 SelectorsLoaded[ID - 1] =
8680 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0);
8681 if (DeserializationListener)
8682 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
8683 }
8684
8685 return SelectorsLoaded[ID - 1];
8686}
8687
8688Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) {
8689 return DecodeSelector(ID);
8690}
8691
8692uint32_t ASTReader::GetNumExternalSelectors() {
8693 // ID 0 (the null selector) is considered an external selector.
8694 return getTotalNumSelectors() + 1;
8695}
8696
8697serialization::SelectorID
8698ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const {
8699 if (LocalID < NUM_PREDEF_SELECTOR_IDS)
8700 return LocalID;
8701
8702 if (!M.ModuleOffsetMap.empty())
8703 ReadModuleOffsetMap(M);
8704
8705 ContinuousRangeMap<uint32_t, int, 2>::iterator I
8706 = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS);
8707 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 8708, __extension__ __PRETTY_FUNCTION__))
8708 && "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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 8708, __extension__ __PRETTY_FUNCTION__))
;
8709
8710 return LocalID + I->second;
8711}
8712
8713DeclarationNameLoc
8714ASTRecordReader::readDeclarationNameLoc(DeclarationName Name) {
8715 switch (Name.getNameKind()) {
8716 case DeclarationName::CXXConstructorName:
8717 case DeclarationName::CXXDestructorName:
8718 case DeclarationName::CXXConversionFunctionName:
8719 return DeclarationNameLoc::makeNamedTypeLoc(readTypeSourceInfo());
8720
8721 case DeclarationName::CXXOperatorName:
8722 return DeclarationNameLoc::makeCXXOperatorNameLoc(readSourceRange());
8723
8724 case DeclarationName::CXXLiteralOperatorName:
8725 return DeclarationNameLoc::makeCXXLiteralOperatorNameLoc(
8726 readSourceLocation());
8727
8728 case DeclarationName::Identifier:
8729 case DeclarationName::ObjCZeroArgSelector:
8730 case DeclarationName::ObjCOneArgSelector:
8731 case DeclarationName::ObjCMultiArgSelector:
8732 case DeclarationName::CXXUsingDirective:
8733 case DeclarationName::CXXDeductionGuideName:
8734 break;
8735 }
8736 return DeclarationNameLoc();
8737}
8738
8739DeclarationNameInfo ASTRecordReader::readDeclarationNameInfo() {
8740 DeclarationNameInfo NameInfo;
8741 NameInfo.setName(readDeclarationName());
8742 NameInfo.setLoc(readSourceLocation());
8743 NameInfo.setInfo(readDeclarationNameLoc(NameInfo.getName()));
8744 return NameInfo;
8745}
8746
8747void ASTRecordReader::readQualifierInfo(QualifierInfo &Info) {
8748 Info.QualifierLoc = readNestedNameSpecifierLoc();
8749 unsigned NumTPLists = readInt();
8750 Info.NumTemplParamLists = NumTPLists;
8751 if (NumTPLists) {
8752 Info.TemplParamLists =
8753 new (getContext()) TemplateParameterList *[NumTPLists];
8754 for (unsigned i = 0; i != NumTPLists; ++i)
8755 Info.TemplParamLists[i] = readTemplateParameterList();
8756 }
8757}
8758
8759TemplateParameterList *
8760ASTRecordReader::readTemplateParameterList() {
8761 SourceLocation TemplateLoc = readSourceLocation();
8762 SourceLocation LAngleLoc = readSourceLocation();
8763 SourceLocation RAngleLoc = readSourceLocation();
8764
8765 unsigned NumParams = readInt();
8766 SmallVector<NamedDecl *, 16> Params;
8767 Params.reserve(NumParams);
8768 while (NumParams--)
8769 Params.push_back(readDeclAs<NamedDecl>());
8770
8771 bool HasRequiresClause = readBool();
8772 Expr *RequiresClause = HasRequiresClause ? readExpr() : nullptr;
8773
8774 TemplateParameterList *TemplateParams = TemplateParameterList::Create(
8775 getContext(), TemplateLoc, LAngleLoc, Params, RAngleLoc, RequiresClause);
8776 return TemplateParams;
8777}
8778
8779void ASTRecordReader::readTemplateArgumentList(
8780 SmallVectorImpl<TemplateArgument> &TemplArgs,
8781 bool Canonicalize) {
8782 unsigned NumTemplateArgs = readInt();
8783 TemplArgs.reserve(NumTemplateArgs);
8784 while (NumTemplateArgs--)
8785 TemplArgs.push_back(readTemplateArgument(Canonicalize));
8786}
8787
8788/// Read a UnresolvedSet structure.
8789void ASTRecordReader::readUnresolvedSet(LazyASTUnresolvedSet &Set) {
8790 unsigned NumDecls = readInt();
8791 Set.reserve(getContext(), NumDecls);
8792 while (NumDecls--) {
8793 DeclID ID = readDeclID();
8794 AccessSpecifier AS = (AccessSpecifier) readInt();
8795 Set.addLazyDecl(getContext(), ID, AS);
8796 }
8797}
8798
8799CXXBaseSpecifier
8800ASTRecordReader::readCXXBaseSpecifier() {
8801 bool isVirtual = readBool();
8802 bool isBaseOfClass = readBool();
8803 AccessSpecifier AS = static_cast<AccessSpecifier>(readInt());
8804 bool inheritConstructors = readBool();
8805 TypeSourceInfo *TInfo = readTypeSourceInfo();
8806 SourceRange Range = readSourceRange();
8807 SourceLocation EllipsisLoc = readSourceLocation();
8808 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo,
8809 EllipsisLoc);
8810 Result.setInheritConstructors(inheritConstructors);
8811 return Result;
8812}
8813
8814CXXCtorInitializer **
8815ASTRecordReader::readCXXCtorInitializers() {
8816 ASTContext &Context = getContext();
8817 unsigned NumInitializers = readInt();
8818 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 8818, __extension__ __PRETTY_FUNCTION__))
;
8819 auto **CtorInitializers = new (Context) CXXCtorInitializer*[NumInitializers];
8820 for (unsigned i = 0; i != NumInitializers; ++i) {
8821 TypeSourceInfo *TInfo = nullptr;
8822 bool IsBaseVirtual = false;
8823 FieldDecl *Member = nullptr;
8824 IndirectFieldDecl *IndirectMember = nullptr;
8825
8826 CtorInitializerType Type = (CtorInitializerType) readInt();
8827 switch (Type) {
8828 case CTOR_INITIALIZER_BASE:
8829 TInfo = readTypeSourceInfo();
8830 IsBaseVirtual = readBool();
8831 break;
8832
8833 case CTOR_INITIALIZER_DELEGATING:
8834 TInfo = readTypeSourceInfo();
8835 break;
8836
8837 case CTOR_INITIALIZER_MEMBER:
8838 Member = readDeclAs<FieldDecl>();
8839 break;
8840
8841 case CTOR_INITIALIZER_INDIRECT_MEMBER:
8842 IndirectMember = readDeclAs<IndirectFieldDecl>();
8843 break;
8844 }
8845
8846 SourceLocation MemberOrEllipsisLoc = readSourceLocation();
8847 Expr *Init = readExpr();
8848 SourceLocation LParenLoc = readSourceLocation();
8849 SourceLocation RParenLoc = readSourceLocation();
8850
8851 CXXCtorInitializer *BOMInit;
8852 if (Type == CTOR_INITIALIZER_BASE)
8853 BOMInit = new (Context)
8854 CXXCtorInitializer(Context, TInfo, IsBaseVirtual, LParenLoc, Init,
8855 RParenLoc, MemberOrEllipsisLoc);
8856 else if (Type == CTOR_INITIALIZER_DELEGATING)
8857 BOMInit = new (Context)
8858 CXXCtorInitializer(Context, TInfo, LParenLoc, Init, RParenLoc);
8859 else if (Member)
8860 BOMInit = new (Context)
8861 CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc, LParenLoc,
8862 Init, RParenLoc);
8863 else
8864 BOMInit = new (Context)
8865 CXXCtorInitializer(Context, IndirectMember, MemberOrEllipsisLoc,
8866 LParenLoc, Init, RParenLoc);
8867
8868 if (/*IsWritten*/readBool()) {
8869 unsigned SourceOrder = readInt();
8870 BOMInit->setSourceOrder(SourceOrder);
8871 }
8872
8873 CtorInitializers[i] = BOMInit;
8874 }
8875
8876 return CtorInitializers;
8877}
8878
8879NestedNameSpecifierLoc
8880ASTRecordReader::readNestedNameSpecifierLoc() {
8881 ASTContext &Context = getContext();
8882 unsigned N = readInt();
8883 NestedNameSpecifierLocBuilder Builder;
8884 for (unsigned I = 0; I != N; ++I) {
8885 auto Kind = readNestedNameSpecifierKind();
8886 switch (Kind) {
8887 case NestedNameSpecifier::Identifier: {
8888 IdentifierInfo *II = readIdentifier();
8889 SourceRange Range = readSourceRange();
8890 Builder.Extend(Context, II, Range.getBegin(), Range.getEnd());
8891 break;
8892 }
8893
8894 case NestedNameSpecifier::Namespace: {
8895 NamespaceDecl *NS = readDeclAs<NamespaceDecl>();
8896 SourceRange Range = readSourceRange();
8897 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
8898 break;
8899 }
8900
8901 case NestedNameSpecifier::NamespaceAlias: {
8902 NamespaceAliasDecl *Alias = readDeclAs<NamespaceAliasDecl>();
8903 SourceRange Range = readSourceRange();
8904 Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd());
8905 break;
8906 }
8907
8908 case NestedNameSpecifier::TypeSpec:
8909 case NestedNameSpecifier::TypeSpecWithTemplate: {
8910 bool Template = readBool();
8911 TypeSourceInfo *T = readTypeSourceInfo();
8912 if (!T)
8913 return NestedNameSpecifierLoc();
8914 SourceLocation ColonColonLoc = readSourceLocation();
8915
8916 // FIXME: 'template' keyword location not saved anywhere, so we fake it.
8917 Builder.Extend(Context,
8918 Template? T->getTypeLoc().getBeginLoc() : SourceLocation(),
8919 T->getTypeLoc(), ColonColonLoc);
8920 break;
8921 }
8922
8923 case NestedNameSpecifier::Global: {
8924 SourceLocation ColonColonLoc = readSourceLocation();
8925 Builder.MakeGlobal(Context, ColonColonLoc);
8926 break;
8927 }
8928
8929 case NestedNameSpecifier::Super: {
8930 CXXRecordDecl *RD = readDeclAs<CXXRecordDecl>();
8931 SourceRange Range = readSourceRange();
8932 Builder.MakeSuper(Context, RD, Range.getBegin(), Range.getEnd());
8933 break;
8934 }
8935 }
8936 }
8937
8938 return Builder.getWithLocInContext(Context);
8939}
8940
8941SourceRange
8942ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record,
8943 unsigned &Idx) {
8944 SourceLocation beg = ReadSourceLocation(F, Record, Idx);
8945 SourceLocation end = ReadSourceLocation(F, Record, Idx);
8946 return SourceRange(beg, end);
8947}
8948
8949/// Read a floating-point value
8950llvm::APFloat ASTRecordReader::readAPFloat(const llvm::fltSemantics &Sem) {
8951 return llvm::APFloat(Sem, readAPInt());
8952}
8953
8954// Read a string
8955std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) {
8956 unsigned Len = Record[Idx++];
8957 std::string Result(Record.data() + Idx, Record.data() + Idx + Len);
8958 Idx += Len;
8959 return Result;
8960}
8961
8962std::string ASTReader::ReadPath(ModuleFile &F, const RecordData &Record,
8963 unsigned &Idx) {
8964 std::string Filename = ReadString(Record, Idx);
8965 ResolveImportedPath(F, Filename);
8966 return Filename;
8967}
8968
8969std::string ASTReader::ReadPath(StringRef BaseDirectory,
8970 const RecordData &Record, unsigned &Idx) {
8971 std::string Filename = ReadString(Record, Idx);
8972 if (!BaseDirectory.empty())
8973 ResolveImportedPath(Filename, BaseDirectory);
8974 return Filename;
8975}
8976
8977VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record,
8978 unsigned &Idx) {
8979 unsigned Major = Record[Idx++];
8980 unsigned Minor = Record[Idx++];
8981 unsigned Subminor = Record[Idx++];
8982 if (Minor == 0)
8983 return VersionTuple(Major);
8984 if (Subminor == 0)
8985 return VersionTuple(Major, Minor - 1);
8986 return VersionTuple(Major, Minor - 1, Subminor - 1);
8987}
8988
8989CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F,
8990 const RecordData &Record,
8991 unsigned &Idx) {
8992 CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx);
8993 return CXXTemporary::Create(getContext(), Decl);
8994}
8995
8996DiagnosticBuilder ASTReader::Diag(unsigned DiagID) const {
8997 return Diag(CurrentImportLoc, DiagID);
8998}
8999
9000DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) const {
9001 return Diags.Report(Loc, DiagID);
9002}
9003
9004/// Retrieve the identifier table associated with the
9005/// preprocessor.
9006IdentifierTable &ASTReader::getIdentifierTable() {
9007 return PP.getIdentifierTable();
9008}
9009
9010/// Record that the given ID maps to the given switch-case
9011/// statement.
9012void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) {
9013 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 9014, __extension__ __PRETTY_FUNCTION__))
9014 "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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 9014, __extension__ __PRETTY_FUNCTION__))
;
9015 (*CurrSwitchCaseStmts)[ID] = SC;
9016}
9017
9018/// Retrieve the switch-case statement with the given ID.
9019SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) {
9020 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 9020, __extension__ __PRETTY_FUNCTION__))
;
9021 return (*CurrSwitchCaseStmts)[ID];
9022}
9023
9024void ASTReader::ClearSwitchCaseIDs() {
9025 CurrSwitchCaseStmts->clear();
9026}
9027
9028void ASTReader::ReadComments() {
9029 ASTContext &Context = getContext();
9030 std::vector<RawComment *> Comments;
9031 for (SmallVectorImpl<std::pair<BitstreamCursor,
2
Loop condition is true. Entering loop body
9032 serialization::ModuleFile *>>::iterator
9033 I = CommentsCursors.begin(),
9034 E = CommentsCursors.end();
9035 I != E; ++I) {
1
Assuming 'I' is not equal to 'E'
9036 Comments.clear();
9037 BitstreamCursor &Cursor = I->first;
9038 serialization::ModuleFile &F = *I->second;
9039 SavedStreamPosition SavedPosition(Cursor);
9040
9041 RecordData Record;
9042 while (true) {
3
Loop condition is true. Entering loop body
9043 Expected<llvm::BitstreamEntry> MaybeEntry =
9044 Cursor.advanceSkippingSubblocks(
4
Calling 'BitstreamCursor::advanceSkippingSubblocks'
9045 BitstreamCursor::AF_DontPopBlockAtEnd);
9046 if (!MaybeEntry) {
9047 Error(MaybeEntry.takeError());
9048 return;
9049 }
9050 llvm::BitstreamEntry Entry = MaybeEntry.get();
9051
9052 switch (Entry.Kind) {
9053 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
9054 case llvm::BitstreamEntry::Error:
9055 Error("malformed block record in AST file");
9056 return;
9057 case llvm::BitstreamEntry::EndBlock:
9058 goto NextCursor;
9059 case llvm::BitstreamEntry::Record:
9060 // The interesting case.
9061 break;
9062 }
9063
9064 // Read a record.
9065 Record.clear();
9066 Expected<unsigned> MaybeComment = Cursor.readRecord(Entry.ID, Record);
9067 if (!MaybeComment) {
9068 Error(MaybeComment.takeError());
9069 return;
9070 }
9071 switch ((CommentRecordTypes)MaybeComment.get()) {
9072 case COMMENTS_RAW_COMMENT: {
9073 unsigned Idx = 0;
9074 SourceRange SR = ReadSourceRange(F, Record, Idx);
9075 RawComment::CommentKind Kind =
9076 (RawComment::CommentKind) Record[Idx++];
9077 bool IsTrailingComment = Record[Idx++];
9078 bool IsAlmostTrailingComment = Record[Idx++];
9079 Comments.push_back(new (Context) RawComment(
9080 SR, Kind, IsTrailingComment, IsAlmostTrailingComment));
9081 break;
9082 }
9083 }
9084 }
9085 NextCursor:
9086 llvm::DenseMap<FileID, std::map<unsigned, RawComment *>>
9087 FileToOffsetToComment;
9088 for (RawComment *C : Comments) {
9089 SourceLocation CommentLoc = C->getBeginLoc();
9090 if (CommentLoc.isValid()) {
9091 std::pair<FileID, unsigned> Loc =
9092 SourceMgr.getDecomposedLoc(CommentLoc);
9093 if (Loc.first.isValid())
9094 Context.Comments.OrderedComments[Loc.first].emplace(Loc.second, C);
9095 }
9096 }
9097 }
9098}
9099
9100void ASTReader::visitInputFiles(serialization::ModuleFile &MF,
9101 bool IncludeSystem, bool Complain,
9102 llvm::function_ref<void(const serialization::InputFile &IF,
9103 bool isSystem)> Visitor) {
9104 unsigned NumUserInputs = MF.NumUserInputFiles;
9105 unsigned NumInputs = MF.InputFilesLoaded.size();
9106 assert(NumUserInputs <= NumInputs)(static_cast <bool> (NumUserInputs <= NumInputs) ? void
(0) : __assert_fail ("NumUserInputs <= NumInputs", "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 9106, __extension__ __PRETTY_FUNCTION__))
;
9107 unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
9108 for (unsigned I = 0; I < N; ++I) {
9109 bool IsSystem = I >= NumUserInputs;
9110 InputFile IF = getInputFile(MF, I+1, Complain);
9111 Visitor(IF, IsSystem);
9112 }
9113}
9114
9115void ASTReader::visitTopLevelModuleMaps(
9116 serialization::ModuleFile &MF,
9117 llvm::function_ref<void(const FileEntry *FE)> Visitor) {
9118 unsigned NumInputs = MF.InputFilesLoaded.size();
9119 for (unsigned I = 0; I < NumInputs; ++I) {
9120 InputFileInfo IFI = readInputFileInfo(MF, I + 1);
9121 if (IFI.TopLevelModuleMap)
9122 // FIXME: This unnecessarily re-reads the InputFileInfo.
9123 if (auto FE = getInputFile(MF, I + 1).getFile())
9124 Visitor(FE);
9125 }
9126}
9127
9128std::string ASTReader::getOwningModuleNameForDiagnostic(const Decl *D) {
9129 // If we know the owning module, use it.
9130 if (Module *M = D->getImportedOwningModule())
9131 return M->getFullModuleName();
9132
9133 // Otherwise, use the name of the top-level module the decl is within.
9134 if (ModuleFile *M = getOwningModuleFile(D))
9135 return M->ModuleName;
9136
9137 // Not from a module.
9138 return {};
9139}
9140
9141void ASTReader::finishPendingActions() {
9142 while (!PendingIdentifierInfos.empty() || !PendingFunctionTypes.empty() ||
9143 !PendingIncompleteDeclChains.empty() || !PendingDeclChains.empty() ||
9144 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() ||
9145 !PendingUpdateRecords.empty()) {
9146 // If any identifiers with corresponding top-level declarations have
9147 // been loaded, load those declarations now.
9148 using TopLevelDeclsMap =
9149 llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2>>;
9150 TopLevelDeclsMap TopLevelDecls;
9151
9152 while (!PendingIdentifierInfos.empty()) {
9153 IdentifierInfo *II = PendingIdentifierInfos.back().first;
9154 SmallVector<uint32_t, 4> DeclIDs =
9155 std::move(PendingIdentifierInfos.back().second);
9156 PendingIdentifierInfos.pop_back();
9157
9158 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]);
9159 }
9160
9161 // Load each function type that we deferred loading because it was a
9162 // deduced type that might refer to a local type declared within itself.
9163 for (unsigned I = 0; I != PendingFunctionTypes.size(); ++I) {
9164 auto *FD = PendingFunctionTypes[I].first;
9165 FD->setType(GetType(PendingFunctionTypes[I].second));
9166
9167 // If we gave a function a deduced return type, remember that we need to
9168 // propagate that along the redeclaration chain.
9169 auto *DT = FD->getReturnType()->getContainedDeducedType();
9170 if (DT && DT->isDeduced())
9171 PendingDeducedTypeUpdates.insert(
9172 {FD->getCanonicalDecl(), FD->getReturnType()});
9173 }
9174 PendingFunctionTypes.clear();
9175
9176 // For each decl chain that we wanted to complete while deserializing, mark
9177 // it as "still needs to be completed".
9178 for (unsigned I = 0; I != PendingIncompleteDeclChains.size(); ++I) {
9179 markIncompleteDeclChain(PendingIncompleteDeclChains[I]);
9180 }
9181 PendingIncompleteDeclChains.clear();
9182
9183 // Load pending declaration chains.
9184 for (unsigned I = 0; I != PendingDeclChains.size(); ++I)
9185 loadPendingDeclChain(PendingDeclChains[I].first,
9186 PendingDeclChains[I].second);
9187 PendingDeclChains.clear();
9188
9189 // Make the most recent of the top-level declarations visible.
9190 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
9191 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
9192 IdentifierInfo *II = TLD->first;
9193 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
9194 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II);
9195 }
9196 }
9197
9198 // Load any pending macro definitions.
9199 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
9200 IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
9201 SmallVector<PendingMacroInfo, 2> GlobalIDs;
9202 GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
9203 // Initialize the macro history from chained-PCHs ahead of module imports.
9204 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
9205 ++IDIdx) {
9206 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
9207 if (!Info.M->isModule())
9208 resolvePendingMacro(II, Info);
9209 }
9210 // Handle module imports.
9211 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
9212 ++IDIdx) {
9213 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
9214 if (Info.M->isModule())
9215 resolvePendingMacro(II, Info);
9216 }
9217 }
9218 PendingMacroIDs.clear();
9219
9220 // Wire up the DeclContexts for Decls that we delayed setting until
9221 // recursive loading is completed.
9222 while (!PendingDeclContextInfos.empty()) {
9223 PendingDeclContextInfo Info = PendingDeclContextInfos.front();
9224 PendingDeclContextInfos.pop_front();
9225 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC));
9226 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC));
9227 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext());
9228 }
9229
9230 // Perform any pending declaration updates.
9231 while (!PendingUpdateRecords.empty()) {
9232 auto Update = PendingUpdateRecords.pop_back_val();
9233 ReadingKindTracker ReadingKind(Read_Decl, *this);
9234 loadDeclUpdateRecords(Update);
9235 }
9236 }
9237
9238 // At this point, all update records for loaded decls are in place, so any
9239 // fake class definitions should have become real.
9240 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 9241, __extension__ __PRETTY_FUNCTION__))
9241 "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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 9241, __extension__ __PRETTY_FUNCTION__))
;
9242
9243 // If we deserialized any C++ or Objective-C class definitions, any
9244 // Objective-C protocol definitions, or any redeclarable templates, make sure
9245 // that all redeclarations point to the definitions. Note that this can only
9246 // happen now, after the redeclaration chains have been fully wired.
9247 for (Decl *D : PendingDefinitions) {
9248 if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
9249 if (const TagType *TagT = dyn_cast<TagType>(TD->getTypeForDecl())) {
9250 // Make sure that the TagType points at the definition.
9251 const_cast<TagType*>(TagT)->decl = TD;
9252 }
9253
9254 if (auto RD = dyn_cast<CXXRecordDecl>(D)) {
9255 for (auto *R = getMostRecentExistingDecl(RD); R;
9256 R = R->getPreviousDecl()) {
9257 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 9259, __extension__ __PRETTY_FUNCTION__))
9258 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 9259, __extension__ __PRETTY_FUNCTION__))
9259 "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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 9259, __extension__ __PRETTY_FUNCTION__))
;
9260 cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData;
9261 }
9262 }
9263
9264 continue;
9265 }
9266
9267 if (auto ID = dyn_cast<ObjCInterfaceDecl>(D)) {
9268 // Make sure that the ObjCInterfaceType points at the definition.
9269 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl))
9270 ->Decl = ID;
9271
9272 for (auto *R = getMostRecentExistingDecl(ID); R; R = R->getPreviousDecl())
9273 cast<ObjCInterfaceDecl>(R)->Data = ID->Data;
9274
9275 continue;
9276 }
9277
9278 if (auto PD = dyn_cast<ObjCProtocolDecl>(D)) {
9279 for (auto *R = getMostRecentExistingDecl(PD); R; R = R->getPreviousDecl())
9280 cast<ObjCProtocolDecl>(R)->Data = PD->Data;
9281
9282 continue;
9283 }
9284
9285 auto RTD = cast<RedeclarableTemplateDecl>(D)->getCanonicalDecl();
9286 for (auto *R = getMostRecentExistingDecl(RTD); R; R = R->getPreviousDecl())
9287 cast<RedeclarableTemplateDecl>(R)->Common = RTD->Common;
9288 }
9289 PendingDefinitions.clear();
9290
9291 // Load the bodies of any functions or methods we've encountered. We do
9292 // this now (delayed) so that we can be sure that the declaration chains
9293 // have been fully wired up (hasBody relies on this).
9294 // FIXME: We shouldn't require complete redeclaration chains here.
9295 for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
9296 PBEnd = PendingBodies.end();
9297 PB != PBEnd; ++PB) {
9298 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
9299 // For a function defined inline within a class template, force the
9300 // canonical definition to be the one inside the canonical definition of
9301 // the template. This ensures that we instantiate from a correct view
9302 // of the template.
9303 //
9304 // Sadly we can't do this more generally: we can't be sure that all
9305 // copies of an arbitrary class definition will have the same members
9306 // defined (eg, some member functions may not be instantiated, and some
9307 // special members may or may not have been implicitly defined).
9308 if (auto *RD = dyn_cast<CXXRecordDecl>(FD->getLexicalParent()))
9309 if (RD->isDependentContext() && !RD->isThisDeclarationADefinition())
9310 continue;
9311
9312 // FIXME: Check for =delete/=default?
9313 // FIXME: Complain about ODR violations here?
9314 const FunctionDecl *Defn = nullptr;
9315 if (!getContext().getLangOpts().Modules || !FD->hasBody(Defn)) {
9316 FD->setLazyBody(PB->second);
9317 } else {
9318 auto *NonConstDefn = const_cast<FunctionDecl*>(Defn);
9319 mergeDefinitionVisibility(NonConstDefn, FD);
9320
9321 if (!FD->isLateTemplateParsed() &&
9322 !NonConstDefn->isLateTemplateParsed() &&
9323 FD->getODRHash() != NonConstDefn->getODRHash()) {
9324 if (!isa<CXXMethodDecl>(FD)) {
9325 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
9326 } else if (FD->getLexicalParent()->isFileContext() &&
9327 NonConstDefn->getLexicalParent()->isFileContext()) {
9328 // Only diagnose out-of-line method definitions. If they are
9329 // in class definitions, then an error will be generated when
9330 // processing the class bodies.
9331 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
9332 }
9333 }
9334 }
9335 continue;
9336 }
9337
9338 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first);
9339 if (!getContext().getLangOpts().Modules || !MD->hasBody())
9340 MD->setLazyBody(PB->second);
9341 }
9342 PendingBodies.clear();
9343
9344 // Do some cleanup.
9345 for (auto *ND : PendingMergedDefinitionsToDeduplicate)
9346 getContext().deduplicateMergedDefinitonsFor(ND);
9347 PendingMergedDefinitionsToDeduplicate.clear();
9348}
9349
9350void ASTReader::diagnoseOdrViolations() {
9351 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty() &&
9352 PendingFunctionOdrMergeFailures.empty() &&
9353 PendingEnumOdrMergeFailures.empty())
9354 return;
9355
9356 // Trigger the import of the full definition of each class that had any
9357 // odr-merging problems, so we can produce better diagnostics for them.
9358 // These updates may in turn find and diagnose some ODR failures, so take
9359 // ownership of the set first.
9360 auto OdrMergeFailures = std::move(PendingOdrMergeFailures);
9361 PendingOdrMergeFailures.clear();
9362 for (auto &Merge : OdrMergeFailures) {
9363 Merge.first->buildLookup();
9364 Merge.first->decls_begin();
9365 Merge.first->bases_begin();
9366 Merge.first->vbases_begin();
9367 for (auto &RecordPair : Merge.second) {
9368 auto *RD = RecordPair.first;
9369 RD->decls_begin();
9370 RD->bases_begin();
9371 RD->vbases_begin();
9372 }
9373 }
9374
9375 // Trigger the import of functions.
9376 auto FunctionOdrMergeFailures = std::move(PendingFunctionOdrMergeFailures);
9377 PendingFunctionOdrMergeFailures.clear();
9378 for (auto &Merge : FunctionOdrMergeFailures) {
9379 Merge.first->buildLookup();
9380 Merge.first->decls_begin();
9381 Merge.first->getBody();
9382 for (auto &FD : Merge.second) {
9383 FD->buildLookup();
9384 FD->decls_begin();
9385 FD->getBody();
9386 }
9387 }
9388
9389 // Trigger the import of enums.
9390 auto EnumOdrMergeFailures = std::move(PendingEnumOdrMergeFailures);
9391 PendingEnumOdrMergeFailures.clear();
9392 for (auto &Merge : EnumOdrMergeFailures) {
9393 Merge.first->decls_begin();
9394 for (auto &Enum : Merge.second) {
9395 Enum->decls_begin();
9396 }
9397 }
9398
9399 // For each declaration from a merged context, check that the canonical
9400 // definition of that context also contains a declaration of the same
9401 // entity.
9402 //
9403 // Caution: this loop does things that might invalidate iterators into
9404 // PendingOdrMergeChecks. Don't turn this into a range-based for loop!
9405 while (!PendingOdrMergeChecks.empty()) {
9406 NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
9407
9408 // FIXME: Skip over implicit declarations for now. This matters for things
9409 // like implicitly-declared special member functions. This isn't entirely
9410 // correct; we can end up with multiple unmerged declarations of the same
9411 // implicit entity.
9412 if (D->isImplicit())
9413 continue;
9414
9415 DeclContext *CanonDef = D->getDeclContext();
9416
9417 bool Found = false;
9418 const Decl *DCanon = D->getCanonicalDecl();
9419
9420 for (auto RI : D->redecls()) {
9421 if (RI->getLexicalDeclContext() == CanonDef) {
9422 Found = true;
9423 break;
9424 }
9425 }
9426 if (Found)
9427 continue;
9428
9429 // Quick check failed, time to do the slow thing. Note, we can't just
9430 // look up the name of D in CanonDef here, because the member that is
9431 // in CanonDef might not be found by name lookup (it might have been
9432 // replaced by a more recent declaration in the lookup table), and we
9433 // can't necessarily find it in the redeclaration chain because it might
9434 // be merely mergeable, not redeclarable.
9435 llvm::SmallVector<const NamedDecl*, 4> Candidates;
9436 for (auto *CanonMember : CanonDef->decls()) {
9437 if (CanonMember->getCanonicalDecl() == DCanon) {
9438 // This can happen if the declaration is merely mergeable and not
9439 // actually redeclarable (we looked for redeclarations earlier).
9440 //
9441 // FIXME: We should be able to detect this more efficiently, without
9442 // pulling in all of the members of CanonDef.
9443 Found = true;
9444 break;
9445 }
9446 if (auto *ND = dyn_cast<NamedDecl>(CanonMember))
9447 if (ND->getDeclName() == D->getDeclName())
9448 Candidates.push_back(ND);
9449 }
9450
9451 if (!Found) {
9452 // The AST doesn't like TagDecls becoming invalid after they've been
9453 // completed. We only really need to mark FieldDecls as invalid here.
9454 if (!isa<TagDecl>(D))
9455 D->setInvalidDecl();
9456
9457 // Ensure we don't accidentally recursively enter deserialization while
9458 // we're producing our diagnostic.
9459 Deserializing RecursionGuard(this);
9460
9461 std::string CanonDefModule =
9462 getOwningModuleNameForDiagnostic(cast<Decl>(CanonDef));
9463 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl)
9464 << D << getOwningModuleNameForDiagnostic(D)
9465 << CanonDef << CanonDefModule.empty() << CanonDefModule;
9466
9467 if (Candidates.empty())
9468 Diag(cast<Decl>(CanonDef)->getLocation(),
9469 diag::note_module_odr_violation_no_possible_decls) << D;
9470 else {
9471 for (unsigned I = 0, N = Candidates.size(); I != N; ++I)
9472 Diag(Candidates[I]->getLocation(),
9473 diag::note_module_odr_violation_possible_decl)
9474 << Candidates[I];
9475 }
9476
9477 DiagnosedOdrMergeFailures.insert(CanonDef);
9478 }
9479 }
9480
9481 if (OdrMergeFailures.empty() && FunctionOdrMergeFailures.empty() &&
9482 EnumOdrMergeFailures.empty())
9483 return;
9484
9485 // Ensure we don't accidentally recursively enter deserialization while
9486 // we're producing our diagnostics.
9487 Deserializing RecursionGuard(this);
9488
9489 // Common code for hashing helpers.
9490 ODRHash Hash;
9491 auto ComputeQualTypeODRHash = [&Hash](QualType Ty) {
9492 Hash.clear();
9493 Hash.AddQualType(Ty);
9494 return Hash.CalculateHash();
9495 };
9496
9497 auto ComputeODRHash = [&Hash](const Stmt *S) {
9498 assert(S)(static_cast <bool> (S) ? void (0) : __assert_fail ("S"
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 9498, __extension__ __PRETTY_FUNCTION__))
;
9499 Hash.clear();
9500 Hash.AddStmt(S);
9501 return Hash.CalculateHash();
9502 };
9503
9504 auto ComputeSubDeclODRHash = [&Hash](const Decl *D) {
9505 assert(D)(static_cast <bool> (D) ? void (0) : __assert_fail ("D"
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 9505, __extension__ __PRETTY_FUNCTION__))
;
9506 Hash.clear();
9507 Hash.AddSubDecl(D);
9508 return Hash.CalculateHash();
9509 };
9510
9511 auto ComputeTemplateArgumentODRHash = [&Hash](const TemplateArgument &TA) {
9512 Hash.clear();
9513 Hash.AddTemplateArgument(TA);
9514 return Hash.CalculateHash();
9515 };
9516
9517 auto ComputeTemplateParameterListODRHash =
9518 [&Hash](const TemplateParameterList *TPL) {
9519 assert(TPL)(static_cast <bool> (TPL) ? void (0) : __assert_fail ("TPL"
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 9519, __extension__ __PRETTY_FUNCTION__))
;
9520 Hash.clear();
9521 Hash.AddTemplateParameterList(TPL);
9522 return Hash.CalculateHash();
9523 };
9524
9525 // Used with err_module_odr_violation_mismatch_decl and
9526 // note_module_odr_violation_mismatch_decl
9527 // This list should be the same Decl's as in ODRHash::isDeclToBeProcessed
9528 enum ODRMismatchDecl {
9529 EndOfClass,
9530 PublicSpecifer,
9531 PrivateSpecifer,
9532 ProtectedSpecifer,
9533 StaticAssert,
9534 Field,
9535 CXXMethod,
9536 TypeAlias,
9537 TypeDef,
9538 Var,
9539 Friend,
9540 FunctionTemplate,
9541 Other
9542 };
9543
9544 // Used with err_module_odr_violation_mismatch_decl_diff and
9545 // note_module_odr_violation_mismatch_decl_diff
9546 enum ODRMismatchDeclDifference {
9547 StaticAssertCondition,
9548 StaticAssertMessage,
9549 StaticAssertOnlyMessage,
9550 FieldName,
9551 FieldTypeName,
9552 FieldSingleBitField,
9553 FieldDifferentWidthBitField,
9554 FieldSingleMutable,
9555 FieldSingleInitializer,
9556 FieldDifferentInitializers,
9557 MethodName,
9558 MethodDeleted,
9559 MethodDefaulted,
9560 MethodVirtual,
9561 MethodStatic,
9562 MethodVolatile,
9563 MethodConst,
9564 MethodInline,
9565 MethodNumberParameters,
9566 MethodParameterType,
9567 MethodParameterName,
9568 MethodParameterSingleDefaultArgument,
9569 MethodParameterDifferentDefaultArgument,
9570 MethodNoTemplateArguments,
9571 MethodDifferentNumberTemplateArguments,
9572 MethodDifferentTemplateArgument,
9573 MethodSingleBody,
9574 MethodDifferentBody,
9575 TypedefName,
9576 TypedefType,
9577 VarName,
9578 VarType,
9579 VarSingleInitializer,
9580 VarDifferentInitializer,
9581 VarConstexpr,
9582 FriendTypeFunction,
9583 FriendType,
9584 FriendFunction,
9585 FunctionTemplateDifferentNumberParameters,
9586 FunctionTemplateParameterDifferentKind,
9587 FunctionTemplateParameterName,
9588 FunctionTemplateParameterSingleDefaultArgument,
9589 FunctionTemplateParameterDifferentDefaultArgument,
9590 FunctionTemplateParameterDifferentType,
9591 FunctionTemplatePackParameter,
9592 };
9593
9594 // These lambdas have the common portions of the ODR diagnostics. This
9595 // has the same return as Diag(), so addition parameters can be passed
9596 // in with operator<<
9597 auto ODRDiagDeclError = [this](NamedDecl *FirstRecord, StringRef FirstModule,
9598 SourceLocation Loc, SourceRange Range,
9599 ODRMismatchDeclDifference DiffType) {
9600 return Diag(Loc, diag::err_module_odr_violation_mismatch_decl_diff)
9601 << FirstRecord << FirstModule.empty() << FirstModule << Range
9602 << DiffType;
9603 };
9604 auto ODRDiagDeclNote = [this](StringRef SecondModule, SourceLocation Loc,
9605 SourceRange Range, ODRMismatchDeclDifference DiffType) {
9606 return Diag(Loc, diag::note_module_odr_violation_mismatch_decl_diff)
9607 << SecondModule << Range << DiffType;
9608 };
9609
9610 auto ODRDiagField = [this, &ODRDiagDeclError, &ODRDiagDeclNote,
9611 &ComputeQualTypeODRHash, &ComputeODRHash](
9612 NamedDecl *FirstRecord, StringRef FirstModule,
9613 StringRef SecondModule, FieldDecl *FirstField,
9614 FieldDecl *SecondField) {
9615 IdentifierInfo *FirstII = FirstField->getIdentifier();
9616 IdentifierInfo *SecondII = SecondField->getIdentifier();
9617 if (FirstII->getName() != SecondII->getName()) {
9618 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(),
9619 FirstField->getSourceRange(), FieldName)
9620 << FirstII;
9621 ODRDiagDeclNote(SecondModule, SecondField->getLocation(),
9622 SecondField->getSourceRange(), FieldName)
9623 << SecondII;
9624
9625 return true;
9626 }
9627
9628 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 9629, __extension__ __PRETTY_FUNCTION__))
9629 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 9629, __extension__ __PRETTY_FUNCTION__))
;
9630
9631 QualType FirstType = FirstField->getType();
9632 QualType SecondType = SecondField->getType();
9633 if (ComputeQualTypeODRHash(FirstType) !=
9634 ComputeQualTypeODRHash(SecondType)) {
9635 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(),
9636 FirstField->getSourceRange(), FieldTypeName)
9637 << FirstII << FirstType;
9638 ODRDiagDeclNote(SecondModule, SecondField->getLocation(),
9639 SecondField->getSourceRange(), FieldTypeName)
9640 << SecondII << SecondType;
9641
9642 return true;
9643 }
9644
9645 const bool IsFirstBitField = FirstField->isBitField();
9646 const bool IsSecondBitField = SecondField->isBitField();
9647 if (IsFirstBitField != IsSecondBitField) {
9648 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(),
9649 FirstField->getSourceRange(), FieldSingleBitField)
9650 << FirstII << IsFirstBitField;
9651 ODRDiagDeclNote(SecondModule, SecondField->getLocation(),
9652 SecondField->getSourceRange(), FieldSingleBitField)
9653 << SecondII << IsSecondBitField;
9654 return true;
9655 }
9656
9657 if (IsFirstBitField && IsSecondBitField) {
9658 unsigned FirstBitWidthHash =
9659 ComputeODRHash(FirstField->getBitWidth());
9660 unsigned SecondBitWidthHash =
9661 ComputeODRHash(SecondField->getBitWidth());
9662 if (FirstBitWidthHash != SecondBitWidthHash) {
9663 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(),
9664 FirstField->getSourceRange(),
9665 FieldDifferentWidthBitField)
9666 << FirstII << FirstField->getBitWidth()->getSourceRange();
9667 ODRDiagDeclNote(SecondModule, SecondField->getLocation(),
9668 SecondField->getSourceRange(),
9669 FieldDifferentWidthBitField)
9670 << SecondII << SecondField->getBitWidth()->getSourceRange();
9671 return true;
9672 }
9673 }
9674
9675 if (!PP.getLangOpts().CPlusPlus)
9676 return false;
9677
9678 const bool IsFirstMutable = FirstField->isMutable();
9679 const bool IsSecondMutable = SecondField->isMutable();
9680 if (IsFirstMutable != IsSecondMutable) {
9681 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(),
9682 FirstField->getSourceRange(), FieldSingleMutable)
9683 << FirstII << IsFirstMutable;
9684 ODRDiagDeclNote(SecondModule, SecondField->getLocation(),
9685 SecondField->getSourceRange(), FieldSingleMutable)
9686 << SecondII << IsSecondMutable;
9687 return true;
9688 }
9689
9690 const Expr *FirstInitializer = FirstField->getInClassInitializer();
9691 const Expr *SecondInitializer = SecondField->getInClassInitializer();
9692 if ((!FirstInitializer && SecondInitializer) ||
9693 (FirstInitializer && !SecondInitializer)) {
9694 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(),
9695 FirstField->getSourceRange(), FieldSingleInitializer)
9696 << FirstII << (FirstInitializer != nullptr);
9697 ODRDiagDeclNote(SecondModule, SecondField->getLocation(),
9698 SecondField->getSourceRange(), FieldSingleInitializer)
9699 << SecondII << (SecondInitializer != nullptr);
9700 return true;
9701 }
9702
9703 if (FirstInitializer && SecondInitializer) {
9704 unsigned FirstInitHash = ComputeODRHash(FirstInitializer);
9705 unsigned SecondInitHash = ComputeODRHash(SecondInitializer);
9706 if (FirstInitHash != SecondInitHash) {
9707 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(),
9708 FirstField->getSourceRange(),
9709 FieldDifferentInitializers)
9710 << FirstII << FirstInitializer->getSourceRange();
9711 ODRDiagDeclNote(SecondModule, SecondField->getLocation(),
9712 SecondField->getSourceRange(),
9713 FieldDifferentInitializers)
9714 << SecondII << SecondInitializer->getSourceRange();
9715 return true;
9716 }
9717 }
9718
9719 return false;
9720 };
9721
9722 auto ODRDiagTypeDefOrAlias =
9723 [&ODRDiagDeclError, &ODRDiagDeclNote, &ComputeQualTypeODRHash](
9724 NamedDecl *FirstRecord, StringRef FirstModule, StringRef SecondModule,
9725 TypedefNameDecl *FirstTD, TypedefNameDecl *SecondTD,
9726 bool IsTypeAlias) {
9727 auto FirstName = FirstTD->getDeclName();
9728 auto SecondName = SecondTD->getDeclName();
9729 if (FirstName != SecondName) {
9730 ODRDiagDeclError(FirstRecord, FirstModule, FirstTD->getLocation(),
9731 FirstTD->getSourceRange(), TypedefName)
9732 << IsTypeAlias << FirstName;
9733 ODRDiagDeclNote(SecondModule, SecondTD->getLocation(),
9734 SecondTD->getSourceRange(), TypedefName)
9735 << IsTypeAlias << SecondName;
9736 return true;
9737 }
9738
9739 QualType FirstType = FirstTD->getUnderlyingType();
9740 QualType SecondType = SecondTD->getUnderlyingType();
9741 if (ComputeQualTypeODRHash(FirstType) !=
9742 ComputeQualTypeODRHash(SecondType)) {
9743 ODRDiagDeclError(FirstRecord, FirstModule, FirstTD->getLocation(),
9744 FirstTD->getSourceRange(), TypedefType)
9745 << IsTypeAlias << FirstName << FirstType;
9746 ODRDiagDeclNote(SecondModule, SecondTD->getLocation(),
9747 SecondTD->getSourceRange(), TypedefType)
9748 << IsTypeAlias << SecondName << SecondType;
9749 return true;
9750 }
9751
9752 return false;
9753 };
9754
9755 auto ODRDiagVar = [&ODRDiagDeclError, &ODRDiagDeclNote,
9756 &ComputeQualTypeODRHash, &ComputeODRHash,
9757 this](NamedDecl *FirstRecord, StringRef FirstModule,
9758 StringRef SecondModule, VarDecl *FirstVD,
9759 VarDecl *SecondVD) {
9760 auto FirstName = FirstVD->getDeclName();
9761 auto SecondName = SecondVD->getDeclName();
9762 if (FirstName != SecondName) {
9763 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(),
9764 FirstVD->getSourceRange(), VarName)
9765 << FirstName;
9766 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(),
9767 SecondVD->getSourceRange(), VarName)
9768 << SecondName;
9769 return true;
9770 }
9771
9772 QualType FirstType = FirstVD->getType();
9773 QualType SecondType = SecondVD->getType();
9774 if (ComputeQualTypeODRHash(FirstType) !=
9775 ComputeQualTypeODRHash(SecondType)) {
9776 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(),
9777 FirstVD->getSourceRange(), VarType)
9778 << FirstName << FirstType;
9779 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(),
9780 SecondVD->getSourceRange(), VarType)
9781 << SecondName << SecondType;
9782 return true;
9783 }
9784
9785 if (!PP.getLangOpts().CPlusPlus)
9786 return false;
9787
9788 const Expr *FirstInit = FirstVD->getInit();
9789 const Expr *SecondInit = SecondVD->getInit();
9790 if ((FirstInit == nullptr) != (SecondInit == nullptr)) {
9791 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(),
9792 FirstVD->getSourceRange(), VarSingleInitializer)
9793 << FirstName << (FirstInit == nullptr)
9794 << (FirstInit ? FirstInit->getSourceRange() : SourceRange());
9795 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(),
9796 SecondVD->getSourceRange(), VarSingleInitializer)
9797 << SecondName << (SecondInit == nullptr)
9798 << (SecondInit ? SecondInit->getSourceRange() : SourceRange());
9799 return true;
9800 }
9801
9802 if (FirstInit && SecondInit &&
9803 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) {
9804 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(),
9805 FirstVD->getSourceRange(), VarDifferentInitializer)
9806 << FirstName << FirstInit->getSourceRange();
9807 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(),
9808 SecondVD->getSourceRange(), VarDifferentInitializer)
9809 << SecondName << SecondInit->getSourceRange();
9810 return true;
9811 }
9812
9813 const bool FirstIsConstexpr = FirstVD->isConstexpr();
9814 const bool SecondIsConstexpr = SecondVD->isConstexpr();
9815 if (FirstIsConstexpr != SecondIsConstexpr) {
9816 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(),
9817 FirstVD->getSourceRange(), VarConstexpr)
9818 << FirstName << FirstIsConstexpr;
9819 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(),
9820 SecondVD->getSourceRange(), VarConstexpr)
9821 << SecondName << SecondIsConstexpr;
9822 return true;
9823 }
9824 return false;
9825 };
9826
9827 auto DifferenceSelector = [](Decl *D) {
9828 assert(D && "valid Decl required")(static_cast <bool> (D && "valid Decl required"
) ? void (0) : __assert_fail ("D && \"valid Decl required\""
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 9828, __extension__ __PRETTY_FUNCTION__))
;
9829 switch (D->getKind()) {
9830 default:
9831 return Other;
9832 case Decl::AccessSpec:
9833 switch (D->getAccess()) {
9834 case AS_public:
9835 return PublicSpecifer;
9836 case AS_private:
9837 return PrivateSpecifer;
9838 case AS_protected:
9839 return ProtectedSpecifer;
9840 case AS_none:
9841 break;
9842 }
9843 llvm_unreachable("Invalid access specifier")::llvm::llvm_unreachable_internal("Invalid access specifier",
"/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 9843)
;
9844 case Decl::StaticAssert:
9845 return StaticAssert;
9846 case Decl::Field:
9847 return Field;
9848 case Decl::CXXMethod:
9849 case Decl::CXXConstructor:
9850 case Decl::CXXDestructor:
9851 return CXXMethod;
9852 case Decl::TypeAlias:
9853 return TypeAlias;
9854 case Decl::Typedef:
9855 return TypeDef;
9856 case Decl::Var:
9857 return Var;
9858 case Decl::Friend:
9859 return Friend;
9860 case Decl::FunctionTemplate:
9861 return FunctionTemplate;
9862 }
9863 };
9864
9865 using DeclHashes = llvm::SmallVector<std::pair<Decl *, unsigned>, 4>;
9866 auto PopulateHashes = [&ComputeSubDeclODRHash](DeclHashes &Hashes,
9867 RecordDecl *Record,
9868 const DeclContext *DC) {
9869 for (auto *D : Record->decls()) {
9870 if (!ODRHash::isDeclToBeProcessed(D, DC))
9871 continue;
9872 Hashes.emplace_back(D, ComputeSubDeclODRHash(D));
9873 }
9874 };
9875
9876 struct DiffResult {
9877 Decl *FirstDecl = nullptr, *SecondDecl = nullptr;
9878 ODRMismatchDecl FirstDiffType = Other, SecondDiffType = Other;
9879 };
9880
9881 // If there is a diagnoseable difference, FirstDiffType and
9882 // SecondDiffType will not be Other and FirstDecl and SecondDecl will be
9883 // filled in if not EndOfClass.
9884 auto FindTypeDiffs = [&DifferenceSelector](DeclHashes &FirstHashes,
9885 DeclHashes &SecondHashes) {
9886 DiffResult DR;
9887 auto FirstIt = FirstHashes.begin();
9888 auto SecondIt = SecondHashes.begin();
9889 while (FirstIt != FirstHashes.end() || SecondIt != SecondHashes.end()) {
9890 if (FirstIt != FirstHashes.end() && SecondIt != SecondHashes.end() &&
9891 FirstIt->second == SecondIt->second) {
9892 ++FirstIt;
9893 ++SecondIt;
9894 continue;
9895 }
9896
9897 DR.FirstDecl = FirstIt == FirstHashes.end() ? nullptr : FirstIt->first;
9898 DR.SecondDecl =
9899 SecondIt == SecondHashes.end() ? nullptr : SecondIt->first;
9900
9901 DR.FirstDiffType =
9902 DR.FirstDecl ? DifferenceSelector(DR.FirstDecl) : EndOfClass;
9903 DR.SecondDiffType =
9904 DR.SecondDecl ? DifferenceSelector(DR.SecondDecl) : EndOfClass;
9905 return DR;
9906 }
9907 return DR;
9908 };
9909
9910 // Use this to diagnose that an unexpected Decl was encountered
9911 // or no difference was detected. This causes a generic error
9912 // message to be emitted.
9913 auto DiagnoseODRUnexpected = [this](DiffResult &DR, NamedDecl *FirstRecord,
9914 StringRef FirstModule,
9915 NamedDecl *SecondRecord,
9916 StringRef SecondModule) {
9917 Diag(FirstRecord->getLocation(),
9918 diag::err_module_odr_violation_different_definitions)
9919 << FirstRecord << FirstModule.empty() << FirstModule;
9920
9921 if (DR.FirstDecl) {
9922 Diag(DR.FirstDecl->getLocation(), diag::note_first_module_difference)
9923 << FirstRecord << DR.FirstDecl->getSourceRange();
9924 }
9925
9926 Diag(SecondRecord->getLocation(),
9927 diag::note_module_odr_violation_different_definitions)
9928 << SecondModule;
9929
9930 if (DR.SecondDecl) {
9931 Diag(DR.SecondDecl->getLocation(), diag::note_second_module_difference)
9932 << DR.SecondDecl->getSourceRange();
9933 }
9934 };
9935
9936 auto DiagnoseODRMismatch =
9937 [this](DiffResult &DR, NamedDecl *FirstRecord, StringRef FirstModule,
9938 NamedDecl *SecondRecord, StringRef SecondModule) {
9939 SourceLocation FirstLoc;
9940 SourceRange FirstRange;
9941 auto *FirstTag = dyn_cast<TagDecl>(FirstRecord);
9942 if (DR.FirstDiffType == EndOfClass && FirstTag) {
9943 FirstLoc = FirstTag->getBraceRange().getEnd();
9944 } else {
9945 FirstLoc = DR.FirstDecl->getLocation();
9946 FirstRange = DR.FirstDecl->getSourceRange();
9947 }
9948 Diag(FirstLoc, diag::err_module_odr_violation_mismatch_decl)
9949 << FirstRecord << FirstModule.empty() << FirstModule << FirstRange
9950 << DR.FirstDiffType;
9951
9952 SourceLocation SecondLoc;
9953 SourceRange SecondRange;
9954 auto *SecondTag = dyn_cast<TagDecl>(SecondRecord);
9955 if (DR.SecondDiffType == EndOfClass && SecondTag) {
9956 SecondLoc = SecondTag->getBraceRange().getEnd();
9957 } else {
9958 SecondLoc = DR.SecondDecl->getLocation();
9959 SecondRange = DR.SecondDecl->getSourceRange();
9960 }
9961 Diag(SecondLoc, diag::note_module_odr_violation_mismatch_decl)
9962 << SecondModule << SecondRange << DR.SecondDiffType;
9963 };
9964
9965 // Issue any pending ODR-failure diagnostics.
9966 for (auto &Merge : OdrMergeFailures) {
9967 // If we've already pointed out a specific problem with this class, don't
9968 // bother issuing a general "something's different" diagnostic.
9969 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
9970 continue;
9971
9972 bool Diagnosed = false;
9973 CXXRecordDecl *FirstRecord = Merge.first;
9974 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstRecord);
9975 for (auto &RecordPair : Merge.second) {
9976 CXXRecordDecl *SecondRecord = RecordPair.first;
9977 // Multiple different declarations got merged together; tell the user
9978 // where they came from.
9979 if (FirstRecord == SecondRecord)
9980 continue;
9981
9982 std::string SecondModule = getOwningModuleNameForDiagnostic(SecondRecord);
9983
9984 auto *FirstDD = FirstRecord->DefinitionData;
9985 auto *SecondDD = RecordPair.second;
9986
9987 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 9987, __extension__ __PRETTY_FUNCTION__))
;
9988
9989 // Diagnostics from DefinitionData are emitted here.
9990 if (FirstDD != SecondDD) {
9991 enum ODRDefinitionDataDifference {
9992 NumBases,
9993 NumVBases,
9994 BaseType,
9995 BaseVirtual,
9996 BaseAccess,
9997 };
9998 auto ODRDiagBaseError = [FirstRecord, &FirstModule,
9999 this](SourceLocation Loc, SourceRange Range,
10000 ODRDefinitionDataDifference DiffType) {
10001 return Diag(Loc, diag::err_module_odr_violation_definition_data)
10002 << FirstRecord << FirstModule.empty() << FirstModule << Range
10003 << DiffType;
10004 };
10005 auto ODRDiagBaseNote = [&SecondModule,
10006 this](SourceLocation Loc, SourceRange Range,
10007 ODRDefinitionDataDifference DiffType) {
10008 return Diag(Loc, diag::note_module_odr_violation_definition_data)
10009 << SecondModule << Range << DiffType;
10010 };
10011
10012 unsigned FirstNumBases = FirstDD->NumBases;
10013 unsigned FirstNumVBases = FirstDD->NumVBases;
10014 unsigned SecondNumBases = SecondDD->NumBases;
10015 unsigned SecondNumVBases = SecondDD->NumVBases;
10016
10017 auto GetSourceRange = [](struct CXXRecordDecl::DefinitionData *DD) {
10018 unsigned NumBases = DD->NumBases;
10019 if (NumBases == 0) return SourceRange();
10020 auto bases = DD->bases();
10021 return SourceRange(bases[0].getBeginLoc(),
10022 bases[NumBases - 1].getEndLoc());
10023 };
10024
10025 if (FirstNumBases != SecondNumBases) {
10026 ODRDiagBaseError(FirstRecord->getLocation(), GetSourceRange(FirstDD),
10027 NumBases)
10028 << FirstNumBases;
10029 ODRDiagBaseNote(SecondRecord->getLocation(), GetSourceRange(SecondDD),
10030 NumBases)
10031 << SecondNumBases;
10032 Diagnosed = true;
10033 break;
10034 }
10035
10036 if (FirstNumVBases != SecondNumVBases) {
10037 ODRDiagBaseError(FirstRecord->getLocation(), GetSourceRange(FirstDD),
10038 NumVBases)
10039 << FirstNumVBases;
10040 ODRDiagBaseNote(SecondRecord->getLocation(), GetSourceRange(SecondDD),
10041 NumVBases)
10042 << SecondNumVBases;
10043 Diagnosed = true;
10044 break;
10045 }
10046
10047 auto FirstBases = FirstDD->bases();
10048 auto SecondBases = SecondDD->bases();
10049 unsigned i = 0;
10050 for (i = 0; i < FirstNumBases; ++i) {
10051 auto FirstBase = FirstBases[i];
10052 auto SecondBase = SecondBases[i];
10053 if (ComputeQualTypeODRHash(FirstBase.getType()) !=
10054 ComputeQualTypeODRHash(SecondBase.getType())) {
10055 ODRDiagBaseError(FirstRecord->getLocation(),
10056 FirstBase.getSourceRange(), BaseType)
10057 << (i + 1) << FirstBase.getType();
10058 ODRDiagBaseNote(SecondRecord->getLocation(),
10059 SecondBase.getSourceRange(), BaseType)
10060 << (i + 1) << SecondBase.getType();
10061 break;
10062 }
10063
10064 if (FirstBase.isVirtual() != SecondBase.isVirtual()) {
10065 ODRDiagBaseError(FirstRecord->getLocation(),
10066 FirstBase.getSourceRange(), BaseVirtual)
10067 << (i + 1) << FirstBase.isVirtual() << FirstBase.getType();
10068 ODRDiagBaseNote(SecondRecord->getLocation(),
10069 SecondBase.getSourceRange(), BaseVirtual)
10070 << (i + 1) << SecondBase.isVirtual() << SecondBase.getType();
10071 break;
10072 }
10073
10074 if (FirstBase.getAccessSpecifierAsWritten() !=
10075 SecondBase.getAccessSpecifierAsWritten()) {
10076 ODRDiagBaseError(FirstRecord->getLocation(),
10077 FirstBase.getSourceRange(), BaseAccess)
10078 << (i + 1) << FirstBase.getType()
10079 << (int)FirstBase.getAccessSpecifierAsWritten();
10080 ODRDiagBaseNote(SecondRecord->getLocation(),
10081 SecondBase.getSourceRange(), BaseAccess)
10082 << (i + 1) << SecondBase.getType()
10083 << (int)SecondBase.getAccessSpecifierAsWritten();
10084 break;
10085 }
10086 }
10087
10088 if (i != FirstNumBases) {
10089 Diagnosed = true;
10090 break;
10091 }
10092 }
10093
10094 const ClassTemplateDecl *FirstTemplate =
10095 FirstRecord->getDescribedClassTemplate();
10096 const ClassTemplateDecl *SecondTemplate =
10097 SecondRecord->getDescribedClassTemplate();
10098
10099 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 10100, __extension__ __PRETTY_FUNCTION__))
10100 "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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 10100, __extension__ __PRETTY_FUNCTION__))
;
10101
10102 enum ODRTemplateDifference {
10103 ParamEmptyName,
10104 ParamName,
10105 ParamSingleDefaultArgument,
10106 ParamDifferentDefaultArgument,
10107 };
10108
10109 if (FirstTemplate && SecondTemplate) {
10110 DeclHashes FirstTemplateHashes;
10111 DeclHashes SecondTemplateHashes;
10112
10113 auto PopulateTemplateParameterHashs =
10114 [&ComputeSubDeclODRHash](DeclHashes &Hashes,
10115 const ClassTemplateDecl *TD) {
10116 for (auto *D : TD->getTemplateParameters()->asArray()) {
10117 Hashes.emplace_back(D, ComputeSubDeclODRHash(D));
10118 }
10119 };
10120
10121 PopulateTemplateParameterHashs(FirstTemplateHashes, FirstTemplate);
10122 PopulateTemplateParameterHashs(SecondTemplateHashes, SecondTemplate);
10123
10124 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 10125, __extension__ __PRETTY_FUNCTION__))
10125 "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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 10125, __extension__ __PRETTY_FUNCTION__))
;
10126
10127 auto FirstIt = FirstTemplateHashes.begin();
10128 auto FirstEnd = FirstTemplateHashes.end();
10129 auto SecondIt = SecondTemplateHashes.begin();
10130 for (; FirstIt != FirstEnd; ++FirstIt, ++SecondIt) {
10131 if (FirstIt->second == SecondIt->second)
10132 continue;
10133
10134 auto ODRDiagTemplateError = [FirstRecord, &FirstModule, this](
10135 SourceLocation Loc, SourceRange Range,
10136 ODRTemplateDifference DiffType) {
10137 return Diag(Loc, diag::err_module_odr_violation_template_parameter)
10138 << FirstRecord << FirstModule.empty() << FirstModule << Range
10139 << DiffType;
10140 };
10141 auto ODRDiagTemplateNote = [&SecondModule, this](
10142 SourceLocation Loc, SourceRange Range,
10143 ODRTemplateDifference DiffType) {
10144 return Diag(Loc, diag::note_module_odr_violation_template_parameter)
10145 << SecondModule << Range << DiffType;
10146 };
10147
10148 const NamedDecl* FirstDecl = cast<NamedDecl>(FirstIt->first);
10149 const NamedDecl* SecondDecl = cast<NamedDecl>(SecondIt->first);
10150
10151 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 10152, __extension__ __PRETTY_FUNCTION__))
10152 "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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 10152, __extension__ __PRETTY_FUNCTION__))
;
10153
10154 DeclarationName FirstName = FirstDecl->getDeclName();
10155 DeclarationName SecondName = SecondDecl->getDeclName();
10156
10157 if (FirstName != SecondName) {
10158 const bool FirstNameEmpty =
10159 FirstName.isIdentifier() && !FirstName.getAsIdentifierInfo();
10160 const bool SecondNameEmpty =
10161 SecondName.isIdentifier() && !SecondName.getAsIdentifierInfo();
10162 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 10163, __extension__ __PRETTY_FUNCTION__))
10163 "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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 10163, __extension__ __PRETTY_FUNCTION__))
;
10164 ODRDiagTemplateError(FirstDecl->getLocation(),
10165 FirstDecl->getSourceRange(),
10166 FirstNameEmpty ? ParamEmptyName : ParamName)
10167 << FirstName;
10168 ODRDiagTemplateNote(SecondDecl->getLocation(),
10169 SecondDecl->getSourceRange(),
10170 SecondNameEmpty ? ParamEmptyName : ParamName)
10171 << SecondName;
10172 break;
10173 }
10174
10175 switch (FirstDecl->getKind()) {
10176 default:
10177 llvm_unreachable("Invalid template parameter type.")::llvm::llvm_unreachable_internal("Invalid template parameter type."
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 10177)
;
10178 case Decl::TemplateTypeParm: {
10179 const auto *FirstParam = cast<TemplateTypeParmDecl>(FirstDecl);
10180 const auto *SecondParam = cast<TemplateTypeParmDecl>(SecondDecl);
10181 const bool HasFirstDefaultArgument =
10182 FirstParam->hasDefaultArgument() &&
10183 !FirstParam->defaultArgumentWasInherited();
10184 const bool HasSecondDefaultArgument =
10185 SecondParam->hasDefaultArgument() &&
10186 !SecondParam->defaultArgumentWasInherited();
10187
10188 if (HasFirstDefaultArgument != HasSecondDefaultArgument) {
10189 ODRDiagTemplateError(FirstDecl->getLocation(),
10190 FirstDecl->getSourceRange(),
10191 ParamSingleDefaultArgument)
10192 << HasFirstDefaultArgument;
10193 ODRDiagTemplateNote(SecondDecl->getLocation(),
10194 SecondDecl->getSourceRange(),
10195 ParamSingleDefaultArgument)
10196 << HasSecondDefaultArgument;
10197 break;
10198 }
10199
10200 assert(HasFirstDefaultArgument && HasSecondDefaultArgument &&(static_cast <bool> (HasFirstDefaultArgument &&
HasSecondDefaultArgument && "Expecting default arguments."
) ? void (0) : __assert_fail ("HasFirstDefaultArgument && HasSecondDefaultArgument && \"Expecting default arguments.\""
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 10201, __extension__ __PRETTY_FUNCTION__))
10201 "Expecting default arguments.")(static_cast <bool> (HasFirstDefaultArgument &&
HasSecondDefaultArgument && "Expecting default arguments."
) ? void (0) : __assert_fail ("HasFirstDefaultArgument && HasSecondDefaultArgument && \"Expecting default arguments.\""
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 10201, __extension__ __PRETTY_FUNCTION__))
;
10202
10203 ODRDiagTemplateError(FirstDecl->getLocation(),
10204 FirstDecl->getSourceRange(),
10205 ParamDifferentDefaultArgument);
10206 ODRDiagTemplateNote(SecondDecl->getLocation(),
10207 SecondDecl->getSourceRange(),
10208 ParamDifferentDefaultArgument);
10209
10210 break;
10211 }
10212 case Decl::NonTypeTemplateParm: {
10213 const auto *FirstParam = cast<NonTypeTemplateParmDecl>(FirstDecl);
10214 const auto *SecondParam = cast<NonTypeTemplateParmDecl>(SecondDecl);
10215 const bool HasFirstDefaultArgument =
10216 FirstParam->hasDefaultArgument() &&
10217 !FirstParam->defaultArgumentWasInherited();
10218 const bool HasSecondDefaultArgument =
10219 SecondParam->hasDefaultArgument() &&
10220 !SecondParam->defaultArgumentWasInherited();
10221
10222 if (HasFirstDefaultArgument != HasSecondDefaultArgument) {
10223 ODRDiagTemplateError(FirstDecl->getLocation(),
10224 FirstDecl->getSourceRange(),
10225 ParamSingleDefaultArgument)
10226 << HasFirstDefaultArgument;
10227 ODRDiagTemplateNote(SecondDecl->getLocation(),
10228 SecondDecl->getSourceRange(),
10229 ParamSingleDefaultArgument)
10230 << HasSecondDefaultArgument;
10231 break;
10232 }
10233
10234 assert(HasFirstDefaultArgument && HasSecondDefaultArgument &&(static_cast <bool> (HasFirstDefaultArgument &&
HasSecondDefaultArgument && "Expecting default arguments."
) ? void (0) : __assert_fail ("HasFirstDefaultArgument && HasSecondDefaultArgument && \"Expecting default arguments.\""
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 10235, __extension__ __PRETTY_FUNCTION__))
10235 "Expecting default arguments.")(static_cast <bool> (HasFirstDefaultArgument &&
HasSecondDefaultArgument && "Expecting default arguments."
) ? void (0) : __assert_fail ("HasFirstDefaultArgument && HasSecondDefaultArgument && \"Expecting default arguments.\""
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 10235, __extension__ __PRETTY_FUNCTION__))
;
10236
10237 ODRDiagTemplateError(FirstDecl->getLocation(),
10238 FirstDecl->getSourceRange(),
10239 ParamDifferentDefaultArgument);
10240 ODRDiagTemplateNote(SecondDecl->getLocation(),
10241 SecondDecl->getSourceRange(),
10242 ParamDifferentDefaultArgument);
10243
10244 break;
10245 }
10246 case Decl::TemplateTemplateParm: {
10247 const auto *FirstParam = cast<TemplateTemplateParmDecl>(FirstDecl);
10248 const auto *SecondParam =
10249 cast<TemplateTemplateParmDecl>(SecondDecl);
10250 const bool HasFirstDefaultArgument =
10251 FirstParam->hasDefaultArgument() &&
10252 !FirstParam->defaultArgumentWasInherited();
10253 const bool HasSecondDefaultArgument =
10254 SecondParam->hasDefaultArgument() &&
10255 !SecondParam->defaultArgumentWasInherited();
10256
10257 if (HasFirstDefaultArgument != HasSecondDefaultArgument) {
10258 ODRDiagTemplateError(FirstDecl->getLocation(),
10259 FirstDecl->getSourceRange(),
10260 ParamSingleDefaultArgument)
10261 << HasFirstDefaultArgument;
10262 ODRDiagTemplateNote(SecondDecl->getLocation(),
10263 SecondDecl->getSourceRange(),
10264 ParamSingleDefaultArgument)
10265 << HasSecondDefaultArgument;
10266 break;
10267 }
10268
10269 assert(HasFirstDefaultArgument && HasSecondDefaultArgument &&(static_cast <bool> (HasFirstDefaultArgument &&
HasSecondDefaultArgument && "Expecting default arguments."
) ? void (0) : __assert_fail ("HasFirstDefaultArgument && HasSecondDefaultArgument && \"Expecting default arguments.\""
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 10270, __extension__ __PRETTY_FUNCTION__))
10270 "Expecting default arguments.")(static_cast <bool> (HasFirstDefaultArgument &&
HasSecondDefaultArgument && "Expecting default arguments."
) ? void (0) : __assert_fail ("HasFirstDefaultArgument && HasSecondDefaultArgument && \"Expecting default arguments.\""
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 10270, __extension__ __PRETTY_FUNCTION__))
;
10271
10272 ODRDiagTemplateError(FirstDecl->getLocation(),
10273 FirstDecl->getSourceRange(),
10274 ParamDifferentDefaultArgument);
10275 ODRDiagTemplateNote(SecondDecl->getLocation(),
10276 SecondDecl->getSourceRange(),
10277 ParamDifferentDefaultArgument);
10278
10279 break;
10280 }
10281 }
10282
10283 break;
10284 }
10285
10286 if (FirstIt != FirstEnd) {
10287 Diagnosed = true;
10288 break;
10289 }
10290 }
10291
10292 DeclHashes FirstHashes;
10293 DeclHashes SecondHashes;
10294 const DeclContext *DC = FirstRecord;
10295 PopulateHashes(FirstHashes, FirstRecord, DC);
10296 PopulateHashes(SecondHashes, SecondRecord, DC);
10297
10298 auto DR = FindTypeDiffs(FirstHashes, SecondHashes);
10299 ODRMismatchDecl FirstDiffType = DR.FirstDiffType;
10300 ODRMismatchDecl SecondDiffType = DR.SecondDiffType;
10301 Decl *FirstDecl = DR.FirstDecl;
10302 Decl *SecondDecl = DR.SecondDecl;
10303
10304 if (FirstDiffType == Other || SecondDiffType == Other) {
10305 DiagnoseODRUnexpected(DR, FirstRecord, FirstModule, SecondRecord,
10306 SecondModule);
10307 Diagnosed = true;
10308 break;
10309 }
10310
10311 if (FirstDiffType != SecondDiffType) {
10312 DiagnoseODRMismatch(DR, FirstRecord, FirstModule, SecondRecord,
10313 SecondModule);
10314 Diagnosed = true;
10315 break;
10316 }
10317
10318 assert(FirstDiffType == SecondDiffType)(static_cast <bool> (FirstDiffType == SecondDiffType) ?
void (0) : __assert_fail ("FirstDiffType == SecondDiffType",
"/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 10318, __extension__ __PRETTY_FUNCTION__))
;
10319
10320 switch (FirstDiffType) {
10321 case Other:
10322 case EndOfClass:
10323 case PublicSpecifer:
10324 case PrivateSpecifer:
10325 case ProtectedSpecifer:
10326 llvm_unreachable("Invalid diff type")::llvm::llvm_unreachable_internal("Invalid diff type", "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 10326)
;
10327
10328 case StaticAssert: {
10329 StaticAssertDecl *FirstSA = cast<StaticAssertDecl>(FirstDecl);
10330 StaticAssertDecl *SecondSA = cast<StaticAssertDecl>(SecondDecl);
10331
10332 Expr *FirstExpr = FirstSA->getAssertExpr();
10333 Expr *SecondExpr = SecondSA->getAssertExpr();
10334 unsigned FirstODRHash = ComputeODRHash(FirstExpr);
10335 unsigned SecondODRHash = ComputeODRHash(SecondExpr);
10336 if (FirstODRHash != SecondODRHash) {
10337 ODRDiagDeclError(FirstRecord, FirstModule, FirstExpr->getBeginLoc(),
10338 FirstExpr->getSourceRange(), StaticAssertCondition);
10339 ODRDiagDeclNote(SecondModule, SecondExpr->getBeginLoc(),
10340 SecondExpr->getSourceRange(), StaticAssertCondition);
10341 Diagnosed = true;
10342 break;
10343 }
10344
10345 StringLiteral *FirstStr = FirstSA->getMessage();
10346 StringLiteral *SecondStr = SecondSA->getMessage();
10347 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 10347, __extension__ __PRETTY_FUNCTION__))
;
10348 if ((FirstStr && !SecondStr) || (!FirstStr && SecondStr)) {
10349 SourceLocation FirstLoc, SecondLoc;
10350 SourceRange FirstRange, SecondRange;
10351 if (FirstStr) {
10352 FirstLoc = FirstStr->getBeginLoc();
10353 FirstRange = FirstStr->getSourceRange();
10354 } else {
10355 FirstLoc = FirstSA->getBeginLoc();
10356 FirstRange = FirstSA->getSourceRange();
10357 }
10358 if (SecondStr) {
10359 SecondLoc = SecondStr->getBeginLoc();
10360 SecondRange = SecondStr->getSourceRange();
10361 } else {
10362 SecondLoc = SecondSA->getBeginLoc();
10363 SecondRange = SecondSA->getSourceRange();
10364 }
10365 ODRDiagDeclError(FirstRecord, FirstModule, FirstLoc, FirstRange,
10366 StaticAssertOnlyMessage)
10367 << (FirstStr == nullptr);
10368 ODRDiagDeclNote(SecondModule, SecondLoc, SecondRange,
10369 StaticAssertOnlyMessage)
10370 << (SecondStr == nullptr);
10371 Diagnosed = true;
10372 break;
10373 }
10374
10375 if (FirstStr && SecondStr &&
10376 FirstStr->getString() != SecondStr->getString()) {
10377 ODRDiagDeclError(FirstRecord, FirstModule, FirstStr->getBeginLoc(),
10378 FirstStr->getSourceRange(), StaticAssertMessage);
10379 ODRDiagDeclNote(SecondModule, SecondStr->getBeginLoc(),
10380 SecondStr->getSourceRange(), StaticAssertMessage);
10381 Diagnosed = true;
10382 break;
10383 }
10384 break;
10385 }
10386 case Field: {
10387 Diagnosed = ODRDiagField(FirstRecord, FirstModule, SecondModule,
10388 cast<FieldDecl>(FirstDecl),
10389 cast<FieldDecl>(SecondDecl));
10390 break;
10391 }
10392 case CXXMethod: {
10393 enum {
10394 DiagMethod,
10395 DiagConstructor,
10396 DiagDestructor,
10397 } FirstMethodType,
10398 SecondMethodType;
10399 auto GetMethodTypeForDiagnostics = [](const CXXMethodDecl* D) {
10400 if (isa<CXXConstructorDecl>(D)) return DiagConstructor;
10401 if (isa<CXXDestructorDecl>(D)) return DiagDestructor;
10402 return DiagMethod;
10403 };
10404 const CXXMethodDecl *FirstMethod = cast<CXXMethodDecl>(FirstDecl);
10405 const CXXMethodDecl *SecondMethod = cast<CXXMethodDecl>(SecondDecl);
10406 FirstMethodType = GetMethodTypeForDiagnostics(FirstMethod);
10407 SecondMethodType = GetMethodTypeForDiagnostics(SecondMethod);
10408 auto FirstName = FirstMethod->getDeclName();
10409 auto SecondName = SecondMethod->getDeclName();
10410 if (FirstMethodType != SecondMethodType || FirstName != SecondName) {
10411 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(),
10412 FirstMethod->getSourceRange(), MethodName)
10413 << FirstMethodType << FirstName;
10414 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10415 SecondMethod->getSourceRange(), MethodName)
10416 << SecondMethodType << SecondName;
10417
10418 Diagnosed = true;
10419 break;
10420 }
10421
10422 const bool FirstDeleted = FirstMethod->isDeletedAsWritten();
10423 const bool SecondDeleted = SecondMethod->isDeletedAsWritten();
10424 if (FirstDeleted != SecondDeleted) {
10425 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(),
10426 FirstMethod->getSourceRange(), MethodDeleted)
10427 << FirstMethodType << FirstName << FirstDeleted;
10428
10429 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10430 SecondMethod->getSourceRange(), MethodDeleted)
10431 << SecondMethodType << SecondName << SecondDeleted;
10432 Diagnosed = true;
10433 break;
10434 }
10435
10436 const bool FirstDefaulted = FirstMethod->isExplicitlyDefaulted();
10437 const bool SecondDefaulted = SecondMethod->isExplicitlyDefaulted();
10438 if (FirstDefaulted != SecondDefaulted) {
10439 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(),
10440 FirstMethod->getSourceRange(), MethodDefaulted)
10441 << FirstMethodType << FirstName << FirstDefaulted;
10442
10443 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10444 SecondMethod->getSourceRange(), MethodDefaulted)
10445 << SecondMethodType << SecondName << SecondDefaulted;
10446 Diagnosed = true;
10447 break;
10448 }
10449
10450 const bool FirstVirtual = FirstMethod->isVirtualAsWritten();
10451 const bool SecondVirtual = SecondMethod->isVirtualAsWritten();
10452 const bool FirstPure = FirstMethod->isPure();
10453 const bool SecondPure = SecondMethod->isPure();
10454 if ((FirstVirtual || SecondVirtual) &&
10455 (FirstVirtual != SecondVirtual || FirstPure != SecondPure)) {
10456 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(),
10457 FirstMethod->getSourceRange(), MethodVirtual)
10458 << FirstMethodType << FirstName << FirstPure << FirstVirtual;
10459 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10460 SecondMethod->getSourceRange(), MethodVirtual)
10461 << SecondMethodType << SecondName << SecondPure << SecondVirtual;
10462 Diagnosed = true;
10463 break;
10464 }
10465
10466 // CXXMethodDecl::isStatic uses the canonical Decl. With Decl merging,
10467 // FirstDecl is the canonical Decl of SecondDecl, so the storage
10468 // class needs to be checked instead.
10469 const auto FirstStorage = FirstMethod->getStorageClass();
10470 const auto SecondStorage = SecondMethod->getStorageClass();
10471 const bool FirstStatic = FirstStorage == SC_Static;
10472 const bool SecondStatic = SecondStorage == SC_Static;
10473 if (FirstStatic != SecondStatic) {
10474 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(),
10475 FirstMethod->getSourceRange(), MethodStatic)
10476 << FirstMethodType << FirstName << FirstStatic;
10477 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10478 SecondMethod->getSourceRange(), MethodStatic)
10479 << SecondMethodType << SecondName << SecondStatic;
10480 Diagnosed = true;
10481 break;
10482 }
10483
10484 const bool FirstVolatile = FirstMethod->isVolatile();
10485 const bool SecondVolatile = SecondMethod->isVolatile();
10486 if (FirstVolatile != SecondVolatile) {
10487 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(),
10488 FirstMethod->getSourceRange(), MethodVolatile)
10489 << FirstMethodType << FirstName << FirstVolatile;
10490 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10491 SecondMethod->getSourceRange(), MethodVolatile)
10492 << SecondMethodType << SecondName << SecondVolatile;
10493 Diagnosed = true;
10494 break;
10495 }
10496
10497 const bool FirstConst = FirstMethod->isConst();
10498 const bool SecondConst = SecondMethod->isConst();
10499 if (FirstConst != SecondConst) {
10500 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(),
10501 FirstMethod->getSourceRange(), MethodConst)
10502 << FirstMethodType << FirstName << FirstConst;
10503 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10504 SecondMethod->getSourceRange(), MethodConst)
10505 << SecondMethodType << SecondName << SecondConst;
10506 Diagnosed = true;
10507 break;
10508 }
10509
10510 const bool FirstInline = FirstMethod->isInlineSpecified();
10511 const bool SecondInline = SecondMethod->isInlineSpecified();
10512 if (FirstInline != SecondInline) {
10513 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(),
10514 FirstMethod->getSourceRange(), MethodInline)
10515 << FirstMethodType << FirstName << FirstInline;
10516 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10517 SecondMethod->getSourceRange(), MethodInline)
10518 << SecondMethodType << SecondName << SecondInline;
10519 Diagnosed = true;
10520 break;
10521 }
10522
10523 const unsigned FirstNumParameters = FirstMethod->param_size();
10524 const unsigned SecondNumParameters = SecondMethod->param_size();
10525 if (FirstNumParameters != SecondNumParameters) {
10526 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(),
10527 FirstMethod->getSourceRange(),
10528 MethodNumberParameters)
10529 << FirstMethodType << FirstName << FirstNumParameters;
10530 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10531 SecondMethod->getSourceRange(),
10532 MethodNumberParameters)
10533 << SecondMethodType << SecondName << SecondNumParameters;
10534 Diagnosed = true;
10535 break;
10536 }
10537
10538 // Need this status boolean to know when break out of the switch.
10539 bool ParameterMismatch = false;
10540 for (unsigned I = 0; I < FirstNumParameters; ++I) {
10541 const ParmVarDecl *FirstParam = FirstMethod->getParamDecl(I);
10542 const ParmVarDecl *SecondParam = SecondMethod->getParamDecl(I);
10543
10544 QualType FirstParamType = FirstParam->getType();
10545 QualType SecondParamType = SecondParam->getType();
10546 if (FirstParamType != SecondParamType &&
10547 ComputeQualTypeODRHash(FirstParamType) !=
10548 ComputeQualTypeODRHash(SecondParamType)) {
10549 if (const DecayedType *ParamDecayedType =
10550 FirstParamType->getAs<DecayedType>()) {
10551 ODRDiagDeclError(
10552 FirstRecord, FirstModule, FirstMethod->getLocation(),
10553 FirstMethod->getSourceRange(), MethodParameterType)
10554 << FirstMethodType << FirstName << (I + 1) << FirstParamType
10555 << true << ParamDecayedType->getOriginalType();
10556 } else {
10557 ODRDiagDeclError(
10558 FirstRecord, FirstModule, FirstMethod->getLocation(),
10559 FirstMethod->getSourceRange(), MethodParameterType)
10560 << FirstMethodType << FirstName << (I + 1) << FirstParamType
10561 << false;
10562 }
10563
10564 if (const DecayedType *ParamDecayedType =
10565 SecondParamType->getAs<DecayedType>()) {
10566 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10567 SecondMethod->getSourceRange(),
10568 MethodParameterType)
10569 << SecondMethodType << SecondName << (I + 1)
10570 << SecondParamType << true
10571 << ParamDecayedType->getOriginalType();
10572 } else {
10573 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10574 SecondMethod->getSourceRange(),
10575 MethodParameterType)
10576 << SecondMethodType << SecondName << (I + 1)
10577 << SecondParamType << false;
10578 }
10579 ParameterMismatch = true;
10580 break;
10581 }
10582
10583 DeclarationName FirstParamName = FirstParam->getDeclName();
10584 DeclarationName SecondParamName = SecondParam->getDeclName();
10585 if (FirstParamName != SecondParamName) {
10586 ODRDiagDeclError(FirstRecord, FirstModule,
10587 FirstMethod->getLocation(),
10588 FirstMethod->getSourceRange(), MethodParameterName)
10589 << FirstMethodType << FirstName << (I + 1) << FirstParamName;
10590 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10591 SecondMethod->getSourceRange(), MethodParameterName)
10592 << SecondMethodType << SecondName << (I + 1) << SecondParamName;
10593 ParameterMismatch = true;
10594 break;
10595 }
10596
10597 const Expr *FirstInit = FirstParam->getInit();
10598 const Expr *SecondInit = SecondParam->getInit();
10599 if ((FirstInit == nullptr) != (SecondInit == nullptr)) {
10600 ODRDiagDeclError(FirstRecord, FirstModule,
10601 FirstMethod->getLocation(),
10602 FirstMethod->getSourceRange(),
10603 MethodParameterSingleDefaultArgument)
10604 << FirstMethodType << FirstName << (I + 1)
10605 << (FirstInit == nullptr)
10606 << (FirstInit ? FirstInit->getSourceRange() : SourceRange());
10607 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10608 SecondMethod->getSourceRange(),
10609 MethodParameterSingleDefaultArgument)
10610 << SecondMethodType << SecondName << (I + 1)
10611 << (SecondInit == nullptr)
10612 << (SecondInit ? SecondInit->getSourceRange() : SourceRange());
10613 ParameterMismatch = true;
10614 break;
10615 }
10616
10617 if (FirstInit && SecondInit &&
10618 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) {
10619 ODRDiagDeclError(FirstRecord, FirstModule,
10620 FirstMethod->getLocation(),
10621 FirstMethod->getSourceRange(),
10622 MethodParameterDifferentDefaultArgument)
10623 << FirstMethodType << FirstName << (I + 1)
10624 << FirstInit->getSourceRange();
10625 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10626 SecondMethod->getSourceRange(),
10627 MethodParameterDifferentDefaultArgument)
10628 << SecondMethodType << SecondName << (I + 1)
10629 << SecondInit->getSourceRange();
10630 ParameterMismatch = true;
10631 break;
10632
10633 }
10634 }
10635
10636 if (ParameterMismatch) {
10637 Diagnosed = true;
10638 break;
10639 }
10640
10641 const auto *FirstTemplateArgs =
10642 FirstMethod->getTemplateSpecializationArgs();
10643 const auto *SecondTemplateArgs =
10644 SecondMethod->getTemplateSpecializationArgs();
10645
10646 if ((FirstTemplateArgs && !SecondTemplateArgs) ||
10647 (!FirstTemplateArgs && SecondTemplateArgs)) {
10648 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(),
10649 FirstMethod->getSourceRange(),
10650 MethodNoTemplateArguments)
10651 << FirstMethodType << FirstName << (FirstTemplateArgs != nullptr);
10652 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10653 SecondMethod->getSourceRange(),
10654 MethodNoTemplateArguments)
10655 << SecondMethodType << SecondName
10656 << (SecondTemplateArgs != nullptr);
10657
10658 Diagnosed = true;
10659 break;
10660 }
10661
10662 if (FirstTemplateArgs && SecondTemplateArgs) {
10663 // Remove pack expansions from argument list.
10664 auto ExpandTemplateArgumentList =
10665 [](const TemplateArgumentList *TAL) {
10666 llvm::SmallVector<const TemplateArgument *, 8> ExpandedList;
10667 for (const TemplateArgument &TA : TAL->asArray()) {
10668 if (TA.getKind() != TemplateArgument::Pack) {
10669 ExpandedList.push_back(&TA);
10670 continue;
10671 }
10672 for (const TemplateArgument &PackTA : TA.getPackAsArray()) {
10673 ExpandedList.push_back(&PackTA);
10674 }
10675 }
10676 return ExpandedList;
10677 };
10678 llvm::SmallVector<const TemplateArgument *, 8> FirstExpandedList =
10679 ExpandTemplateArgumentList(FirstTemplateArgs);
10680 llvm::SmallVector<const TemplateArgument *, 8> SecondExpandedList =
10681 ExpandTemplateArgumentList(SecondTemplateArgs);
10682
10683 if (FirstExpandedList.size() != SecondExpandedList.size()) {
10684 ODRDiagDeclError(FirstRecord, FirstModule,
10685 FirstMethod->getLocation(),
10686 FirstMethod->getSourceRange(),
10687 MethodDifferentNumberTemplateArguments)
10688 << FirstMethodType << FirstName
10689 << (unsigned)FirstExpandedList.size();
10690 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10691 SecondMethod->getSourceRange(),
10692 MethodDifferentNumberTemplateArguments)
10693 << SecondMethodType << SecondName
10694 << (unsigned)SecondExpandedList.size();
10695
10696 Diagnosed = true;
10697 break;
10698 }
10699
10700 bool TemplateArgumentMismatch = false;
10701 for (unsigned i = 0, e = FirstExpandedList.size(); i != e; ++i) {
10702 const TemplateArgument &FirstTA = *FirstExpandedList[i],
10703 &SecondTA = *SecondExpandedList[i];
10704 if (ComputeTemplateArgumentODRHash(FirstTA) ==
10705 ComputeTemplateArgumentODRHash(SecondTA)) {
10706 continue;
10707 }
10708
10709 ODRDiagDeclError(
10710 FirstRecord, FirstModule, FirstMethod->getLocation(),
10711 FirstMethod->getSourceRange(), MethodDifferentTemplateArgument)
10712 << FirstMethodType << FirstName << FirstTA << i + 1;
10713 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10714 SecondMethod->getSourceRange(),
10715 MethodDifferentTemplateArgument)
10716 << SecondMethodType << SecondName << SecondTA << i + 1;
10717
10718 TemplateArgumentMismatch = true;
10719 break;
10720 }
10721
10722 if (TemplateArgumentMismatch) {
10723 Diagnosed = true;
10724 break;
10725 }
10726 }
10727
10728 // Compute the hash of the method as if it has no body.
10729 auto ComputeCXXMethodODRHash = [&Hash](const CXXMethodDecl *D) {
10730 Hash.clear();
10731 Hash.AddFunctionDecl(D, true /*SkipBody*/);
10732 return Hash.CalculateHash();
10733 };
10734
10735 // Compare the hash generated to the hash stored. A difference means
10736 // that a body was present in the original source. Due to merging,
10737 // the stardard way of detecting a body will not work.
10738 const bool HasFirstBody =
10739 ComputeCXXMethodODRHash(FirstMethod) != FirstMethod->getODRHash();
10740 const bool HasSecondBody =
10741 ComputeCXXMethodODRHash(SecondMethod) != SecondMethod->getODRHash();
10742
10743 if (HasFirstBody != HasSecondBody) {
10744 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(),
10745 FirstMethod->getSourceRange(), MethodSingleBody)
10746 << FirstMethodType << FirstName << HasFirstBody;
10747 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10748 SecondMethod->getSourceRange(), MethodSingleBody)
10749 << SecondMethodType << SecondName << HasSecondBody;
10750 Diagnosed = true;
10751 break;
10752 }
10753
10754 if (HasFirstBody && HasSecondBody) {
10755 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(),
10756 FirstMethod->getSourceRange(), MethodDifferentBody)
10757 << FirstMethodType << FirstName;
10758 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10759 SecondMethod->getSourceRange(), MethodDifferentBody)
10760 << SecondMethodType << SecondName;
10761 Diagnosed = true;
10762 break;
10763 }
10764
10765 break;
10766 }
10767 case TypeAlias:
10768 case TypeDef: {
10769 Diagnosed = ODRDiagTypeDefOrAlias(
10770 FirstRecord, FirstModule, SecondModule,
10771 cast<TypedefNameDecl>(FirstDecl), cast<TypedefNameDecl>(SecondDecl),
10772 FirstDiffType == TypeAlias);
10773 break;
10774 }
10775 case Var: {
10776 Diagnosed =
10777 ODRDiagVar(FirstRecord, FirstModule, SecondModule,
10778 cast<VarDecl>(FirstDecl), cast<VarDecl>(SecondDecl));
10779 break;
10780 }
10781 case Friend: {
10782 FriendDecl *FirstFriend = cast<FriendDecl>(FirstDecl);
10783 FriendDecl *SecondFriend = cast<FriendDecl>(SecondDecl);
10784
10785 NamedDecl *FirstND = FirstFriend->getFriendDecl();
10786 NamedDecl *SecondND = SecondFriend->getFriendDecl();
10787
10788 TypeSourceInfo *FirstTSI = FirstFriend->getFriendType();
10789 TypeSourceInfo *SecondTSI = SecondFriend->getFriendType();
10790
10791 if (FirstND && SecondND) {
10792 ODRDiagDeclError(FirstRecord, FirstModule,
10793 FirstFriend->getFriendLoc(),
10794 FirstFriend->getSourceRange(), FriendFunction)
10795 << FirstND;
10796 ODRDiagDeclNote(SecondModule, SecondFriend->getFriendLoc(),
10797 SecondFriend->getSourceRange(), FriendFunction)
10798 << SecondND;
10799
10800 Diagnosed = true;
10801 break;
10802 }
10803
10804 if (FirstTSI && SecondTSI) {
10805 QualType FirstFriendType = FirstTSI->getType();
10806 QualType SecondFriendType = SecondTSI->getType();
10807 assert(ComputeQualTypeODRHash(FirstFriendType) !=(static_cast <bool> (ComputeQualTypeODRHash(FirstFriendType
) != ComputeQualTypeODRHash(SecondFriendType)) ? void (0) : __assert_fail
("ComputeQualTypeODRHash(FirstFriendType) != ComputeQualTypeODRHash(SecondFriendType)"
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 10808, __extension__ __PRETTY_FUNCTION__))
10808 ComputeQualTypeODRHash(SecondFriendType))(static_cast <bool> (ComputeQualTypeODRHash(FirstFriendType
) != ComputeQualTypeODRHash(SecondFriendType)) ? void (0) : __assert_fail
("ComputeQualTypeODRHash(FirstFriendType) != ComputeQualTypeODRHash(SecondFriendType)"
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 10808, __extension__ __PRETTY_FUNCTION__))
;
10809 ODRDiagDeclError(FirstRecord, FirstModule,
10810 FirstFriend->getFriendLoc(),
10811 FirstFriend->getSourceRange(), FriendType)
10812 << FirstFriendType;
10813 ODRDiagDeclNote(SecondModule, SecondFriend->getFriendLoc(),
10814 SecondFriend->getSourceRange(), FriendType)
10815 << SecondFriendType;
10816 Diagnosed = true;
10817 break;
10818 }
10819
10820 ODRDiagDeclError(FirstRecord, FirstModule, FirstFriend->getFriendLoc(),
10821 FirstFriend->getSourceRange(), FriendTypeFunction)
10822 << (FirstTSI == nullptr);
10823 ODRDiagDeclNote(SecondModule, SecondFriend->getFriendLoc(),
10824 SecondFriend->getSourceRange(), FriendTypeFunction)
10825 << (SecondTSI == nullptr);
10826
10827 Diagnosed = true;
10828 break;
10829 }
10830 case FunctionTemplate: {
10831 FunctionTemplateDecl *FirstTemplate =
10832 cast<FunctionTemplateDecl>(FirstDecl);
10833 FunctionTemplateDecl *SecondTemplate =
10834 cast<FunctionTemplateDecl>(SecondDecl);
10835
10836 TemplateParameterList *FirstTPL =
10837 FirstTemplate->getTemplateParameters();
10838 TemplateParameterList *SecondTPL =
10839 SecondTemplate->getTemplateParameters();
10840
10841 if (FirstTPL->size() != SecondTPL->size()) {
10842 ODRDiagDeclError(FirstRecord, FirstModule,
10843 FirstTemplate->getLocation(),
10844 FirstTemplate->getSourceRange(),
10845 FunctionTemplateDifferentNumberParameters)
10846 << FirstTemplate << FirstTPL->size();
10847 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(),
10848 SecondTemplate->getSourceRange(),
10849 FunctionTemplateDifferentNumberParameters)
10850 << SecondTemplate << SecondTPL->size();
10851
10852 Diagnosed = true;
10853 break;
10854 }
10855
10856 bool ParameterMismatch = false;
10857 for (unsigned i = 0, e = FirstTPL->size(); i != e; ++i) {
10858 NamedDecl *FirstParam = FirstTPL->getParam(i);
10859 NamedDecl *SecondParam = SecondTPL->getParam(i);
10860
10861 if (FirstParam->getKind() != SecondParam->getKind()) {
10862 enum {
10863 TemplateTypeParameter,
10864 NonTypeTemplateParameter,
10865 TemplateTemplateParameter,
10866 };
10867 auto GetParamType = [](NamedDecl *D) {
10868 switch (D->getKind()) {
10869 default:
10870 llvm_unreachable("Unexpected template parameter type")::llvm::llvm_unreachable_internal("Unexpected template parameter type"
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 10870)
;
10871 case Decl::TemplateTypeParm:
10872 return TemplateTypeParameter;
10873 case Decl::NonTypeTemplateParm:
10874 return NonTypeTemplateParameter;
10875 case Decl::TemplateTemplateParm:
10876 return TemplateTemplateParameter;
10877 }
10878 };
10879
10880 ODRDiagDeclError(FirstRecord, FirstModule,
10881 FirstTemplate->getLocation(),
10882 FirstTemplate->getSourceRange(),
10883 FunctionTemplateParameterDifferentKind)
10884 << FirstTemplate << (i + 1) << GetParamType(FirstParam);
10885 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(),
10886 SecondTemplate->getSourceRange(),
10887 FunctionTemplateParameterDifferentKind)
10888 << SecondTemplate << (i + 1) << GetParamType(SecondParam);
10889
10890 ParameterMismatch = true;
10891 break;
10892 }
10893
10894 if (FirstParam->getName() != SecondParam->getName()) {
10895 ODRDiagDeclError(
10896 FirstRecord, FirstModule, FirstTemplate->getLocation(),
10897 FirstTemplate->getSourceRange(), FunctionTemplateParameterName)
10898 << FirstTemplate << (i + 1) << (bool)FirstParam->getIdentifier()
10899 << FirstParam;
10900 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(),
10901 SecondTemplate->getSourceRange(),
10902 FunctionTemplateParameterName)
10903 << SecondTemplate << (i + 1)
10904 << (bool)SecondParam->getIdentifier() << SecondParam;
10905 ParameterMismatch = true;
10906 break;
10907 }
10908
10909 if (isa<TemplateTypeParmDecl>(FirstParam) &&
10910 isa<TemplateTypeParmDecl>(SecondParam)) {
10911 TemplateTypeParmDecl *FirstTTPD =
10912 cast<TemplateTypeParmDecl>(FirstParam);
10913 TemplateTypeParmDecl *SecondTTPD =
10914 cast<TemplateTypeParmDecl>(SecondParam);
10915 bool HasFirstDefaultArgument =
10916 FirstTTPD->hasDefaultArgument() &&
10917 !FirstTTPD->defaultArgumentWasInherited();
10918 bool HasSecondDefaultArgument =
10919 SecondTTPD->hasDefaultArgument() &&
10920 !SecondTTPD->defaultArgumentWasInherited();
10921 if (HasFirstDefaultArgument != HasSecondDefaultArgument) {
10922 ODRDiagDeclError(FirstRecord, FirstModule,
10923 FirstTemplate->getLocation(),
10924 FirstTemplate->getSourceRange(),
10925 FunctionTemplateParameterSingleDefaultArgument)
10926 << FirstTemplate << (i + 1) << HasFirstDefaultArgument;
10927 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(),
10928 SecondTemplate->getSourceRange(),
10929 FunctionTemplateParameterSingleDefaultArgument)
10930 << SecondTemplate << (i + 1) << HasSecondDefaultArgument;
10931 ParameterMismatch = true;
10932 break;
10933 }
10934
10935 if (HasFirstDefaultArgument && HasSecondDefaultArgument) {
10936 QualType FirstType = FirstTTPD->getDefaultArgument();
10937 QualType SecondType = SecondTTPD->getDefaultArgument();
10938 if (ComputeQualTypeODRHash(FirstType) !=
10939 ComputeQualTypeODRHash(SecondType)) {
10940 ODRDiagDeclError(
10941 FirstRecord, FirstModule, FirstTemplate->getLocation(),
10942 FirstTemplate->getSourceRange(),
10943 FunctionTemplateParameterDifferentDefaultArgument)
10944 << FirstTemplate << (i + 1) << FirstType;
10945 ODRDiagDeclNote(
10946 SecondModule, SecondTemplate->getLocation(),
10947 SecondTemplate->getSourceRange(),
10948 FunctionTemplateParameterDifferentDefaultArgument)
10949 << SecondTemplate << (i + 1) << SecondType;
10950 ParameterMismatch = true;
10951 break;
10952 }
10953 }
10954
10955 if (FirstTTPD->isParameterPack() !=
10956 SecondTTPD->isParameterPack()) {
10957 ODRDiagDeclError(FirstRecord, FirstModule,
10958 FirstTemplate->getLocation(),
10959 FirstTemplate->getSourceRange(),
10960 FunctionTemplatePackParameter)
10961 << FirstTemplate << (i + 1) << FirstTTPD->isParameterPack();
10962 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(),
10963 SecondTemplate->getSourceRange(),
10964 FunctionTemplatePackParameter)
10965 << SecondTemplate << (i + 1) << SecondTTPD->isParameterPack();
10966 ParameterMismatch = true;
10967 break;
10968 }
10969 }
10970
10971 if (isa<TemplateTemplateParmDecl>(FirstParam) &&
10972 isa<TemplateTemplateParmDecl>(SecondParam)) {
10973 TemplateTemplateParmDecl *FirstTTPD =
10974 cast<TemplateTemplateParmDecl>(FirstParam);
10975 TemplateTemplateParmDecl *SecondTTPD =
10976 cast<TemplateTemplateParmDecl>(SecondParam);
10977
10978 TemplateParameterList *FirstTPL =
10979 FirstTTPD->getTemplateParameters();
10980 TemplateParameterList *SecondTPL =
10981 SecondTTPD->getTemplateParameters();
10982
10983 if (ComputeTemplateParameterListODRHash(FirstTPL) !=
10984 ComputeTemplateParameterListODRHash(SecondTPL)) {
10985 ODRDiagDeclError(FirstRecord, FirstModule,
10986 FirstTemplate->getLocation(),
10987 FirstTemplate->getSourceRange(),
10988 FunctionTemplateParameterDifferentType)
10989 << FirstTemplate << (i + 1);
10990 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(),
10991 SecondTemplate->getSourceRange(),
10992 FunctionTemplateParameterDifferentType)
10993 << SecondTemplate << (i + 1);
10994 ParameterMismatch = true;
10995 break;
10996 }
10997
10998 bool HasFirstDefaultArgument =
10999 FirstTTPD->hasDefaultArgument() &&
11000 !FirstTTPD->defaultArgumentWasInherited();
11001 bool HasSecondDefaultArgument =
11002 SecondTTPD->hasDefaultArgument() &&
11003 !SecondTTPD->defaultArgumentWasInherited();
11004 if (HasFirstDefaultArgument != HasSecondDefaultArgument) {
11005 ODRDiagDeclError(FirstRecord, FirstModule,
11006 FirstTemplate->getLocation(),
11007 FirstTemplate->getSourceRange(),
11008 FunctionTemplateParameterSingleDefaultArgument)
11009 << FirstTemplate << (i + 1) << HasFirstDefaultArgument;
11010 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(),
11011 SecondTemplate->getSourceRange(),
11012 FunctionTemplateParameterSingleDefaultArgument)
11013 << SecondTemplate << (i + 1) << HasSecondDefaultArgument;
11014 ParameterMismatch = true;
11015 break;
11016 }
11017
11018 if (HasFirstDefaultArgument && HasSecondDefaultArgument) {
11019 TemplateArgument FirstTA =
11020 FirstTTPD->getDefaultArgument().getArgument();
11021 TemplateArgument SecondTA =
11022 SecondTTPD->getDefaultArgument().getArgument();
11023 if (ComputeTemplateArgumentODRHash(FirstTA) !=
11024 ComputeTemplateArgumentODRHash(SecondTA)) {
11025 ODRDiagDeclError(
11026 FirstRecord, FirstModule, FirstTemplate->getLocation(),
11027 FirstTemplate->getSourceRange(),
11028 FunctionTemplateParameterDifferentDefaultArgument)
11029 << FirstTemplate << (i + 1) << FirstTA;
11030 ODRDiagDeclNote(
11031 SecondModule, SecondTemplate->getLocation(),
11032 SecondTemplate->getSourceRange(),
11033 FunctionTemplateParameterDifferentDefaultArgument)
11034 << SecondTemplate << (i + 1) << SecondTA;
11035 ParameterMismatch = true;
11036 break;
11037 }
11038 }
11039
11040 if (FirstTTPD->isParameterPack() !=
11041 SecondTTPD->isParameterPack()) {
11042 ODRDiagDeclError(FirstRecord, FirstModule,
11043 FirstTemplate->getLocation(),
11044 FirstTemplate->getSourceRange(),
11045 FunctionTemplatePackParameter)
11046 << FirstTemplate << (i + 1) << FirstTTPD->isParameterPack();
11047 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(),
11048 SecondTemplate->getSourceRange(),
11049 FunctionTemplatePackParameter)
11050 << SecondTemplate << (i + 1) << SecondTTPD->isParameterPack();
11051 ParameterMismatch = true;
11052 break;
11053 }
11054 }
11055
11056 if (isa<NonTypeTemplateParmDecl>(FirstParam) &&
11057 isa<NonTypeTemplateParmDecl>(SecondParam)) {
11058 NonTypeTemplateParmDecl *FirstNTTPD =
11059 cast<NonTypeTemplateParmDecl>(FirstParam);
11060 NonTypeTemplateParmDecl *SecondNTTPD =
11061 cast<NonTypeTemplateParmDecl>(SecondParam);
11062
11063 QualType FirstType = FirstNTTPD->getType();
11064 QualType SecondType = SecondNTTPD->getType();
11065 if (ComputeQualTypeODRHash(FirstType) !=
11066 ComputeQualTypeODRHash(SecondType)) {
11067 ODRDiagDeclError(FirstRecord, FirstModule,
11068 FirstTemplate->getLocation(),
11069 FirstTemplate->getSourceRange(),
11070 FunctionTemplateParameterDifferentType)
11071 << FirstTemplate << (i + 1);
11072 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(),
11073 SecondTemplate->getSourceRange(),
11074 FunctionTemplateParameterDifferentType)
11075 << SecondTemplate << (i + 1);
11076 ParameterMismatch = true;
11077 break;
11078 }
11079
11080 bool HasFirstDefaultArgument =
11081 FirstNTTPD->hasDefaultArgument() &&
11082 !FirstNTTPD->defaultArgumentWasInherited();
11083 bool HasSecondDefaultArgument =
11084 SecondNTTPD->hasDefaultArgument() &&
11085 !SecondNTTPD->defaultArgumentWasInherited();
11086 if (HasFirstDefaultArgument != HasSecondDefaultArgument) {
11087 ODRDiagDeclError(FirstRecord, FirstModule,
11088 FirstTemplate->getLocation(),
11089 FirstTemplate->getSourceRange(),
11090 FunctionTemplateParameterSingleDefaultArgument)
11091 << FirstTemplate << (i + 1) << HasFirstDefaultArgument;
11092 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(),
11093 SecondTemplate->getSourceRange(),
11094 FunctionTemplateParameterSingleDefaultArgument)
11095 << SecondTemplate << (i + 1) << HasSecondDefaultArgument;
11096 ParameterMismatch = true;
11097 break;
11098 }
11099
11100 if (HasFirstDefaultArgument && HasSecondDefaultArgument) {
11101 Expr *FirstDefaultArgument = FirstNTTPD->getDefaultArgument();
11102 Expr *SecondDefaultArgument = SecondNTTPD->getDefaultArgument();
11103 if (ComputeODRHash(FirstDefaultArgument) !=
11104 ComputeODRHash(SecondDefaultArgument)) {
11105 ODRDiagDeclError(
11106 FirstRecord, FirstModule, FirstTemplate->getLocation(),
11107 FirstTemplate->getSourceRange(),
11108 FunctionTemplateParameterDifferentDefaultArgument)
11109 << FirstTemplate << (i + 1) << FirstDefaultArgument;
11110 ODRDiagDeclNote(
11111 SecondModule, SecondTemplate->getLocation(),
11112 SecondTemplate->getSourceRange(),
11113 FunctionTemplateParameterDifferentDefaultArgument)
11114 << SecondTemplate << (i + 1) << SecondDefaultArgument;
11115 ParameterMismatch = true;
11116 break;
11117 }
11118 }
11119
11120 if (FirstNTTPD->isParameterPack() !=
11121 SecondNTTPD->isParameterPack()) {
11122 ODRDiagDeclError(FirstRecord, FirstModule,
11123 FirstTemplate->getLocation(),
11124 FirstTemplate->getSourceRange(),
11125 FunctionTemplatePackParameter)
11126 << FirstTemplate << (i + 1) << FirstNTTPD->isParameterPack();
11127 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(),
11128 SecondTemplate->getSourceRange(),
11129 FunctionTemplatePackParameter)
11130 << SecondTemplate << (i + 1)
11131 << SecondNTTPD->isParameterPack();
11132 ParameterMismatch = true;
11133 break;
11134 }
11135 }
11136 }
11137
11138 if (ParameterMismatch) {
11139 Diagnosed = true;
11140 break;
11141 }
11142
11143 break;
11144 }
11145 }
11146
11147 if (Diagnosed)
11148 continue;
11149
11150 Diag(FirstDecl->getLocation(),
11151 diag::err_module_odr_violation_mismatch_decl_unknown)
11152 << FirstRecord << FirstModule.empty() << FirstModule << FirstDiffType
11153 << FirstDecl->getSourceRange();
11154 Diag(SecondDecl->getLocation(),
11155 diag::note_module_odr_violation_mismatch_decl_unknown)
11156 << SecondModule << FirstDiffType << SecondDecl->getSourceRange();
11157 Diagnosed = true;
11158 }
11159
11160 if (!Diagnosed) {
11161 // All definitions are updates to the same declaration. This happens if a
11162 // module instantiates the declaration of a class template specialization
11163 // and two or more other modules instantiate its definition.
11164 //
11165 // FIXME: Indicate which modules had instantiations of this definition.
11166 // FIXME: How can this even happen?
11167 Diag(Merge.first->getLocation(),
11168 diag::err_module_odr_violation_different_instantiations)
11169 << Merge.first;
11170 }
11171 }
11172
11173 // Issue ODR failures diagnostics for functions.
11174 for (auto &Merge : FunctionOdrMergeFailures) {
11175 enum ODRFunctionDifference {
11176 ReturnType,
11177 ParameterName,
11178 ParameterType,
11179 ParameterSingleDefaultArgument,
11180 ParameterDifferentDefaultArgument,
11181 FunctionBody,
11182 };
11183
11184 FunctionDecl *FirstFunction = Merge.first;
11185 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstFunction);
11186
11187 bool Diagnosed = false;
11188 for (auto &SecondFunction : Merge.second) {
11189
11190 if (FirstFunction == SecondFunction)
11191 continue;
11192
11193 std::string SecondModule =
11194 getOwningModuleNameForDiagnostic(SecondFunction);
11195
11196 auto ODRDiagError = [FirstFunction, &FirstModule,
11197 this](SourceLocation Loc, SourceRange Range,
11198 ODRFunctionDifference DiffType) {
11199 return Diag(Loc, diag::err_module_odr_violation_function)
11200 << FirstFunction << FirstModule.empty() << FirstModule << Range
11201 << DiffType;
11202 };
11203 auto ODRDiagNote = [&SecondModule, this](SourceLocation Loc,
11204 SourceRange Range,
11205 ODRFunctionDifference DiffType) {
11206 return Diag(Loc, diag::note_module_odr_violation_function)
11207 << SecondModule << Range << DiffType;
11208 };
11209
11210 if (ComputeQualTypeODRHash(FirstFunction->getReturnType()) !=
11211 ComputeQualTypeODRHash(SecondFunction->getReturnType())) {
11212 ODRDiagError(FirstFunction->getReturnTypeSourceRange().getBegin(),
11213 FirstFunction->getReturnTypeSourceRange(), ReturnType)
11214 << FirstFunction->getReturnType();
11215 ODRDiagNote(SecondFunction->getReturnTypeSourceRange().getBegin(),
11216 SecondFunction->getReturnTypeSourceRange(), ReturnType)
11217 << SecondFunction->getReturnType();
11218 Diagnosed = true;
11219 break;
11220 }
11221
11222 assert(FirstFunction->param_size() == SecondFunction->param_size() &&(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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 11223, __extension__ __PRETTY_FUNCTION__))
11223 "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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 11223, __extension__ __PRETTY_FUNCTION__))
;
11224
11225 auto ParamSize = FirstFunction->param_size();
11226 bool ParameterMismatch = false;
11227 for (unsigned I = 0; I < ParamSize; ++I) {
11228 auto *FirstParam = FirstFunction->getParamDecl(I);
11229 auto *SecondParam = SecondFunction->getParamDecl(I);
11230
11231 assert(getContext().hasSameType(FirstParam->getType(),(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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 11233, __extension__ __PRETTY_FUNCTION__))
11232 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 11233, __extension__ __PRETTY_FUNCTION__))
11233 "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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 11233, __extension__ __PRETTY_FUNCTION__))
;
11234
11235 if (FirstParam->getDeclName() != SecondParam->getDeclName()) {
11236 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(),
11237 ParameterName)
11238 << I + 1 << FirstParam->getDeclName();
11239 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(),
11240 ParameterName)
11241 << I + 1 << SecondParam->getDeclName();
11242 ParameterMismatch = true;
11243 break;
11244 };
11245
11246 QualType FirstParamType = FirstParam->getType();
11247 QualType SecondParamType = SecondParam->getType();
11248 if (FirstParamType != SecondParamType &&
11249 ComputeQualTypeODRHash(FirstParamType) !=
11250 ComputeQualTypeODRHash(SecondParamType)) {
11251 if (const DecayedType *ParamDecayedType =
11252 FirstParamType->getAs<DecayedType>()) {
11253 ODRDiagError(FirstParam->getLocation(),
11254 FirstParam->getSourceRange(), ParameterType)
11255 << (I + 1) << FirstParamType << true
11256 << ParamDecayedType->getOriginalType();
11257 } else {
11258 ODRDiagError(FirstParam->getLocation(),
11259 FirstParam->getSourceRange(), ParameterType)
11260 << (I + 1) << FirstParamType << false;
11261 }
11262
11263 if (const DecayedType *ParamDecayedType =
11264 SecondParamType->getAs<DecayedType>()) {
11265 ODRDiagNote(SecondParam->getLocation(),
11266 SecondParam->getSourceRange(), ParameterType)
11267 << (I + 1) << SecondParamType << true
11268 << ParamDecayedType->getOriginalType();
11269 } else {
11270 ODRDiagNote(SecondParam->getLocation(),
11271 SecondParam->getSourceRange(), ParameterType)
11272 << (I + 1) << SecondParamType << false;
11273 }
11274 ParameterMismatch = true;
11275 break;
11276 }
11277
11278 const Expr *FirstInit = FirstParam->getInit();
11279 const Expr *SecondInit = SecondParam->getInit();
11280 if ((FirstInit == nullptr) != (SecondInit == nullptr)) {
11281 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(),
11282 ParameterSingleDefaultArgument)
11283 << (I + 1) << (FirstInit == nullptr)
11284 << (FirstInit ? FirstInit->getSourceRange() : SourceRange());
11285 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(),
11286 ParameterSingleDefaultArgument)
11287 << (I + 1) << (SecondInit == nullptr)
11288 << (SecondInit ? SecondInit->getSourceRange() : SourceRange());
11289 ParameterMismatch = true;
11290 break;
11291 }
11292
11293 if (FirstInit && SecondInit &&
11294 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) {
11295 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(),
11296 ParameterDifferentDefaultArgument)
11297 << (I + 1) << FirstInit->getSourceRange();
11298 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(),
11299 ParameterDifferentDefaultArgument)
11300 << (I + 1) << SecondInit->getSourceRange();
11301 ParameterMismatch = true;
11302 break;
11303 }
11304
11305 assert(ComputeSubDeclODRHash(FirstParam) ==(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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 11307, __extension__ __PRETTY_FUNCTION__))
11306 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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 11307, __extension__ __PRETTY_FUNCTION__))
11307 "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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 11307, __extension__ __PRETTY_FUNCTION__))
;
11308 }
11309
11310 if (ParameterMismatch) {
11311 Diagnosed = true;
11312 break;
11313 }
11314
11315 // If no error has been generated before now, assume the problem is in
11316 // the body and generate a message.
11317 ODRDiagError(FirstFunction->getLocation(),
11318 FirstFunction->getSourceRange(), FunctionBody);
11319 ODRDiagNote(SecondFunction->getLocation(),
11320 SecondFunction->getSourceRange(), FunctionBody);
11321 Diagnosed = true;
11322 break;
11323 }
11324 (void)Diagnosed;
11325 assert(Diagnosed && "Unable to emit ODR diagnostic.")(static_cast <bool> (Diagnosed && "Unable to emit ODR diagnostic."
) ? void (0) : __assert_fail ("Diagnosed && \"Unable to emit ODR diagnostic.\""
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 11325, __extension__ __PRETTY_FUNCTION__))
;
11326 }
11327
11328 // Issue ODR failures diagnostics for enums.
11329 for (auto &Merge : EnumOdrMergeFailures) {
11330 enum ODREnumDifference {
11331 SingleScopedEnum,
11332 EnumTagKeywordMismatch,
11333 SingleSpecifiedType,
11334 DifferentSpecifiedTypes,
11335 DifferentNumberEnumConstants,
11336 EnumConstantName,
11337 EnumConstantSingleInitilizer,
11338 EnumConstantDifferentInitilizer,
11339 };
11340
11341 // If we've already pointed out a specific problem with this enum, don't
11342 // bother issuing a general "something's different" diagnostic.
11343 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11344 continue;
11345
11346 EnumDecl *FirstEnum = Merge.first;
11347 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstEnum);
11348
11349 using DeclHashes =
11350 llvm::SmallVector<std::pair<EnumConstantDecl *, unsigned>, 4>;
11351 auto PopulateHashes = [&ComputeSubDeclODRHash, FirstEnum](
11352 DeclHashes &Hashes, EnumDecl *Enum) {
11353 for (auto *D : Enum->decls()) {
11354 // Due to decl merging, the first EnumDecl is the parent of
11355 // Decls in both records.
11356 if (!ODRHash::isDeclToBeProcessed(D, FirstEnum))
11357 continue;
11358 assert(isa<EnumConstantDecl>(D) && "Unexpected Decl kind")(static_cast <bool> (isa<EnumConstantDecl>(D) &&
"Unexpected Decl kind") ? void (0) : __assert_fail ("isa<EnumConstantDecl>(D) && \"Unexpected Decl kind\""
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 11358, __extension__ __PRETTY_FUNCTION__))
;
11359 Hashes.emplace_back(cast<EnumConstantDecl>(D),
11360 ComputeSubDeclODRHash(D));
11361 }
11362 };
11363 DeclHashes FirstHashes;
11364 PopulateHashes(FirstHashes, FirstEnum);
11365 bool Diagnosed = false;
11366 for (auto &SecondEnum : Merge.second) {
11367
11368 if (FirstEnum == SecondEnum)
11369 continue;
11370
11371 std::string SecondModule =
11372 getOwningModuleNameForDiagnostic(SecondEnum);
11373
11374 auto ODRDiagError = [FirstEnum, &FirstModule,
11375 this](SourceLocation Loc, SourceRange Range,
11376 ODREnumDifference DiffType) {
11377 return Diag(Loc, diag::err_module_odr_violation_enum)
11378 << FirstEnum << FirstModule.empty() << FirstModule << Range
11379 << DiffType;
11380 };
11381 auto ODRDiagNote = [&SecondModule, this](SourceLocation Loc,
11382 SourceRange Range,
11383 ODREnumDifference DiffType) {
11384 return Diag(Loc, diag::note_module_odr_violation_enum)
11385 << SecondModule << Range << DiffType;
11386 };
11387
11388 if (FirstEnum->isScoped() != SecondEnum->isScoped()) {
11389 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(),
11390 SingleScopedEnum)
11391 << FirstEnum->isScoped();
11392 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(),
11393 SingleScopedEnum)
11394 << SecondEnum->isScoped();
11395 Diagnosed = true;
11396 continue;
11397 }
11398
11399 if (FirstEnum->isScoped() && SecondEnum->isScoped()) {
11400 if (FirstEnum->isScopedUsingClassTag() !=
11401 SecondEnum->isScopedUsingClassTag()) {
11402 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(),
11403 EnumTagKeywordMismatch)
11404 << FirstEnum->isScopedUsingClassTag();
11405 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(),
11406 EnumTagKeywordMismatch)
11407 << SecondEnum->isScopedUsingClassTag();
11408 Diagnosed = true;
11409 continue;
11410 }
11411 }
11412
11413 QualType FirstUnderlyingType =
11414 FirstEnum->getIntegerTypeSourceInfo()
11415 ? FirstEnum->getIntegerTypeSourceInfo()->getType()
11416 : QualType();
11417 QualType SecondUnderlyingType =
11418 SecondEnum->getIntegerTypeSourceInfo()
11419 ? SecondEnum->getIntegerTypeSourceInfo()->getType()
11420 : QualType();
11421 if (FirstUnderlyingType.isNull() != SecondUnderlyingType.isNull()) {
11422 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(),
11423 SingleSpecifiedType)
11424 << !FirstUnderlyingType.isNull();
11425 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(),
11426 SingleSpecifiedType)
11427 << !SecondUnderlyingType.isNull();
11428 Diagnosed = true;
11429 continue;
11430 }
11431
11432 if (!FirstUnderlyingType.isNull() && !SecondUnderlyingType.isNull()) {
11433 if (ComputeQualTypeODRHash(FirstUnderlyingType) !=
11434 ComputeQualTypeODRHash(SecondUnderlyingType)) {
11435 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(),
11436 DifferentSpecifiedTypes)
11437 << FirstUnderlyingType;
11438 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(),
11439 DifferentSpecifiedTypes)
11440 << SecondUnderlyingType;
11441 Diagnosed = true;
11442 continue;
11443 }
11444 }
11445
11446 DeclHashes SecondHashes;
11447 PopulateHashes(SecondHashes, SecondEnum);
11448
11449 if (FirstHashes.size() != SecondHashes.size()) {
11450 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(),
11451 DifferentNumberEnumConstants)
11452 << (int)FirstHashes.size();
11453 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(),
11454 DifferentNumberEnumConstants)
11455 << (int)SecondHashes.size();
11456 Diagnosed = true;
11457 continue;
11458 }
11459
11460 for (unsigned I = 0; I < FirstHashes.size(); ++I) {
11461 if (FirstHashes[I].second == SecondHashes[I].second)
11462 continue;
11463 const EnumConstantDecl *FirstEnumConstant = FirstHashes[I].first;
11464 const EnumConstantDecl *SecondEnumConstant = SecondHashes[I].first;
11465
11466 if (FirstEnumConstant->getDeclName() !=
11467 SecondEnumConstant->getDeclName()) {
11468
11469 ODRDiagError(FirstEnumConstant->getLocation(),
11470 FirstEnumConstant->getSourceRange(), EnumConstantName)
11471 << I + 1 << FirstEnumConstant;
11472 ODRDiagNote(SecondEnumConstant->getLocation(),
11473 SecondEnumConstant->getSourceRange(), EnumConstantName)
11474 << I + 1 << SecondEnumConstant;
11475 Diagnosed = true;
11476 break;
11477 }
11478
11479 const Expr *FirstInit = FirstEnumConstant->getInitExpr();
11480 const Expr *SecondInit = SecondEnumConstant->getInitExpr();
11481 if (!FirstInit && !SecondInit)
11482 continue;
11483
11484 if (!FirstInit || !SecondInit) {
11485 ODRDiagError(FirstEnumConstant->getLocation(),
11486 FirstEnumConstant->getSourceRange(),
11487 EnumConstantSingleInitilizer)
11488 << I + 1 << FirstEnumConstant << (FirstInit != nullptr);
11489 ODRDiagNote(SecondEnumConstant->getLocation(),
11490 SecondEnumConstant->getSourceRange(),
11491 EnumConstantSingleInitilizer)
11492 << I + 1 << SecondEnumConstant << (SecondInit != nullptr);
11493 Diagnosed = true;
11494 break;
11495 }
11496
11497 if (ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) {
11498 ODRDiagError(FirstEnumConstant->getLocation(),
11499 FirstEnumConstant->getSourceRange(),
11500 EnumConstantDifferentInitilizer)
11501 << I + 1 << FirstEnumConstant;
11502 ODRDiagNote(SecondEnumConstant->getLocation(),
11503 SecondEnumConstant->getSourceRange(),
11504 EnumConstantDifferentInitilizer)
11505 << I + 1 << SecondEnumConstant;
11506 Diagnosed = true;
11507 break;
11508 }
11509 }
11510 }
11511
11512 (void)Diagnosed;
11513 assert(Diagnosed && "Unable to emit ODR diagnostic.")(static_cast <bool> (Diagnosed && "Unable to emit ODR diagnostic."
) ? void (0) : __assert_fail ("Diagnosed && \"Unable to emit ODR diagnostic.\""
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 11513, __extension__ __PRETTY_FUNCTION__))
;
11514 }
11515}
11516
11517void ASTReader::StartedDeserializing() {
11518 if (++NumCurrentElementsDeserializing == 1 && ReadTimer.get())
11519 ReadTimer->startTimer();
11520}
11521
11522void ASTReader::FinishedDeserializing() {
11523 assert(NumCurrentElementsDeserializing &&(static_cast <bool> (NumCurrentElementsDeserializing &&
"FinishedDeserializing not paired with StartedDeserializing"
) ? void (0) : __assert_fail ("NumCurrentElementsDeserializing && \"FinishedDeserializing not paired with StartedDeserializing\""
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 11524, __extension__ __PRETTY_FUNCTION__))
11524 "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-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 11524, __extension__ __PRETTY_FUNCTION__))
;
11525 if (NumCurrentElementsDeserializing == 1) {
11526 // We decrease NumCurrentElementsDeserializing only after pending actions
11527 // are finished, to avoid recursively re-calling finishPendingActions().
11528 finishPendingActions();
11529 }
11530 --NumCurrentElementsDeserializing;
11531
11532 if (NumCurrentElementsDeserializing == 0) {
11533 // Propagate exception specification and deduced type updates along
11534 // redeclaration chains.
11535 //
11536 // We do this now rather than in finishPendingActions because we want to
11537 // be able to walk the complete redeclaration chains of the updated decls.
11538 while (!PendingExceptionSpecUpdates.empty() ||
11539 !PendingDeducedTypeUpdates.empty()) {
11540 auto ESUpdates = std::move(PendingExceptionSpecUpdates);
11541 PendingExceptionSpecUpdates.clear();
11542 for (auto Update : ESUpdates) {
11543 ProcessingUpdatesRAIIObj ProcessingUpdates(*this);
11544 auto *FPT = Update.second->getType()->castAs<FunctionProtoType>();
11545 auto ESI = FPT->getExtProtoInfo().ExceptionSpec;
11546 if (auto *Listener = getContext().getASTMutationListener())
11547 Listener->ResolvedExceptionSpec(cast<FunctionDecl>(Update.second));
11548 for (auto *Redecl : Update.second->redecls())
11549 getContext().adjustExceptionSpec(cast<FunctionDecl>(Redecl), ESI);
11550 }
11551
11552 auto DTUpdates = std::move(PendingDeducedTypeUpdates);
11553 PendingDeducedTypeUpdates.clear();
11554 for (auto Update : DTUpdates) {
11555 ProcessingUpdatesRAIIObj ProcessingUpdates(*this);
11556 // FIXME: If the return type is already deduced, check that it matches.
11557 getContext().adjustDeducedFunctionResultType(Update.first,
11558 Update.second);
11559 }
11560 }
11561
11562 if (ReadTimer)
11563 ReadTimer->stopTimer();
11564
11565 diagnoseOdrViolations();
11566
11567 // We are not in recursive loading, so it's safe to pass the "interesting"
11568 // decls to the consumer.
11569 if (Consumer)
11570 PassInterestingDeclsToConsumer();
11571 }
11572}
11573
11574void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) {
11575 if (IdentifierInfo *II = Name.getAsIdentifierInfo()) {
11576 // Remove any fake results before adding any real ones.
11577 auto It = PendingFakeLookupResults.find(II);
11578 if (It != PendingFakeLookupResults.end()) {
11579 for (auto *ND : It->second)
11580 SemaObj->IdResolver.RemoveDecl(ND);
11581 // FIXME: this works around module+PCH performance issue.
11582 // Rather than erase the result from the map, which is O(n), just clear
11583 // the vector of NamedDecls.
11584 It->second.clear();
11585 }
11586 }
11587
11588 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
11589 SemaObj->TUScope->AddDecl(D);
11590 } else if (SemaObj->TUScope) {
11591 // Adding the decl to IdResolver may have failed because it was already in
11592 // (even though it was not added in scope). If it is already in, make sure
11593 // it gets in the scope as well.
11594 if (std::find(SemaObj->IdResolver.begin(Name),
11595 SemaObj->IdResolver.end(), D) != SemaObj->IdResolver.end())
11596 SemaObj->TUScope->AddDecl(D);
11597 }
11598}
11599
11600ASTReader::ASTReader(Preprocessor &PP, InMemoryModuleCache &ModuleCache,
11601 ASTContext *Context,
11602 const PCHContainerReader &PCHContainerRdr,
11603 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
11604 StringRef isysroot,
11605 DisableValidationForModuleKind DisableValidationKind,
11606 bool AllowASTWithCompilerErrors,
11607 bool AllowConfigurationMismatch, bool ValidateSystemInputs,
11608 bool ValidateASTInputFilesContent, bool UseGlobalIndex,
11609 std::unique_ptr<llvm::Timer> ReadTimer)
11610 : Listener(bool(DisableValidationKind &DisableValidationForModuleKind::PCH)
11611 ? cast<ASTReaderListener>(new SimpleASTReaderListener(PP))
11612 : cast<ASTReaderListener>(new PCHValidator(PP, *this))),
11613 SourceMgr(PP.getSourceManager()), FileMgr(PP.getFileManager()),
11614 PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()), PP(PP),
11615 ContextObj(Context), ModuleMgr(PP.getFileManager(), ModuleCache,
11616 PCHContainerRdr, PP.getHeaderSearchInfo()),
11617 DummyIdResolver(PP), ReadTimer(std::move(ReadTimer)), isysroot(isysroot),
11618 DisableValidationKind(DisableValidationKind),
11619 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
11620 AllowConfigurationMismatch(AllowConfigurationMismatch),
11621 ValidateSystemInputs(ValidateSystemInputs),
11622 ValidateASTInputFilesContent(ValidateASTInputFilesContent),
11623 UseGlobalIndex(UseGlobalIndex), CurrSwitchCaseStmts(&SwitchCaseStmts) {
11624 SourceMgr.setExternalSLocEntrySource(this);
11625
11626 for (const auto &Ext : Extensions) {
11627 auto BlockName = Ext->getExtensionMetadata().BlockName;
11628 auto Known = ModuleFileExtensions.find(BlockName);
11629 if (Known != ModuleFileExtensions.end()) {
11630 Diags.Report(diag::warn_duplicate_module_file_extension)
11631 << BlockName;
11632 continue;
11633 }
11634
11635 ModuleFileExtensions.insert({BlockName, Ext});
11636 }
11637}
11638
11639ASTReader::~ASTReader() {
11640 if (OwnsDeserializationListener)
11641 delete DeserializationListener;
11642}
11643
11644IdentifierResolver &ASTReader::getIdResolver() {
11645 return SemaObj ? SemaObj->IdResolver : DummyIdResolver;
11646}
11647
11648Expected<unsigned> ASTRecordReader::readRecord(llvm::BitstreamCursor &Cursor,
11649 unsigned AbbrevID) {
11650 Idx = 0;
11651 Record.clear();
11652 return Cursor.readRecord(AbbrevID, Record);
11653}
11654//===----------------------------------------------------------------------===//
11655//// OMPClauseReader implementation
11656////===----------------------------------------------------------------------===//
11657
11658// This has to be in namespace clang because it's friended by all
11659// of the OMP clauses.
11660namespace clang {
11661
11662class OMPClauseReader : public OMPClauseVisitor<OMPClauseReader> {
11663 ASTRecordReader &Record;
11664 ASTContext &Context;
11665
11666public:
11667 OMPClauseReader(ASTRecordReader &Record)
11668 : Record(Record), Context(Record.getContext()) {}
11669#define GEN_CLANG_CLAUSE_CLASS
11670#define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *C);
11671#include "llvm/Frontend/OpenMP/OMP.inc"
11672 OMPClause *readClause();
11673 void VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C);
11674 void VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C);
11675};
11676
11677} // end namespace clang
11678
11679OMPClause *ASTRecordReader::readOMPClause() {
11680 return OMPClauseReader(*this).readClause();
11681}
11682
11683OMPClause *OMPClauseReader::readClause() {
11684 OMPClause *C = nullptr;
11685 switch (llvm::omp::Clause(Record.readInt())) {
11686 case llvm::omp::OMPC_if:
11687 C = new (Context) OMPIfClause();
11688 break;
11689 case llvm::omp::OMPC_final:
11690 C = new (Context) OMPFinalClause();
11691 break;
11692 case llvm::omp::OMPC_num_threads:
11693 C = new (Context) OMPNumThreadsClause();
11694 break;
11695 case llvm::omp::OMPC_safelen:
11696 C = new (Context) OMPSafelenClause();
11697 break;
11698 case llvm::omp::OMPC_simdlen:
11699 C = new (Context) OMPSimdlenClause();
11700 break;
11701 case llvm::omp::OMPC_sizes: {
11702 unsigned NumSizes = Record.readInt();
11703 C = OMPSizesClause::CreateEmpty(Context, NumSizes);
11704 break;
11705 }
11706 case llvm::omp::OMPC_full:
11707 C = OMPFullClause::CreateEmpty(Context);
11708 break;
11709 case llvm::omp::OMPC_partial:
11710 C = OMPPartialClause::CreateEmpty(Context);
11711 break;
11712 case llvm::omp::OMPC_allocator:
11713 C = new (Context) OMPAllocatorClause();
11714 break;
11715 case llvm::omp::OMPC_collapse:
11716 C = new (Context) OMPCollapseClause();
11717 break;
11718 case llvm::omp::OMPC_default:
11719 C = new (Context) OMPDefaultClause();
11720 break;
11721 case llvm::omp::OMPC_proc_bind:
11722 C = new (Context) OMPProcBindClause();
11723 break;
11724 case llvm::omp::OMPC_schedule:
11725 C = new (Context) OMPScheduleClause();
11726 break;
11727 case llvm::omp::OMPC_ordered:
11728 C = OMPOrderedClause::CreateEmpty(Context, Record.readInt());
11729 break;
11730 case llvm::omp::OMPC_nowait:
11731 C = new (Context) OMPNowaitClause();
11732 break;
11733 case llvm::omp::OMPC_untied:
11734 C = new (Context) OMPUntiedClause();
11735 break;
11736 case llvm::omp::OMPC_mergeable:
11737 C = new (Context) OMPMergeableClause();
11738 break;
11739 case llvm::omp::OMPC_read:
11740 C = new (Context) OMPReadClause();
11741 break;
11742 case llvm::omp::OMPC_write:
11743 C = new (Context) OMPWriteClause();
11744 break;
11745 case llvm::omp::OMPC_update:
11746 C = OMPUpdateClause::CreateEmpty(Context, Record.readInt());
11747 break;
11748 case llvm::omp::OMPC_capture:
11749 C = new (Context) OMPCaptureClause();
11750 break;
11751 case llvm::omp::OMPC_seq_cst:
11752 C = new (Context) OMPSeqCstClause();
11753 break;
11754 case llvm::omp::OMPC_acq_rel:
11755 C = new (Context) OMPAcqRelClause();
11756 break;
11757 case llvm::omp::OMPC_acquire:
11758 C = new (Context) OMPAcquireClause();
11759 break;
11760 case llvm::omp::OMPC_release:
11761 C = new (Context) OMPReleaseClause();
11762 break;
11763 case llvm::omp::OMPC_relaxed:
11764 C = new (Context) OMPRelaxedClause();
11765 break;
11766 case llvm::omp::OMPC_threads:
11767 C = new (Context) OMPThreadsClause();
11768 break;
11769 case llvm::omp::OMPC_simd:
11770 C = new (Context) OMPSIMDClause();
11771 break;
11772 case llvm::omp::OMPC_nogroup:
11773 C = new (Context) OMPNogroupClause();
11774 break;
11775 case llvm::omp::OMPC_unified_address:
11776 C = new (Context) OMPUnifiedAddressClause();
11777 break;
11778 case llvm::omp::OMPC_unified_shared_memory:
11779 C = new (Context) OMPUnifiedSharedMemoryClause();
11780 break;
11781 case llvm::omp::OMPC_reverse_offload:
11782 C = new (Context) OMPReverseOffloadClause();
11783 break;
11784 case llvm::omp::OMPC_dynamic_allocators:
11785 C = new (Context) OMPDynamicAllocatorsClause();
11786 break;
11787 case llvm::omp::OMPC_atomic_default_mem_order:
11788 C = new (Context) OMPAtomicDefaultMemOrderClause();
11789 break;
11790 case llvm::omp::OMPC_private:
11791 C = OMPPrivateClause::CreateEmpty(Context, Record.readInt());
11792 break;
11793 case llvm::omp::OMPC_firstprivate:
11794 C = OMPFirstprivateClause::CreateEmpty(Context, Record.readInt());
11795 break;
11796 case llvm::omp::OMPC_lastprivate:
11797 C = OMPLastprivateClause::CreateEmpty(Context, Record.readInt());
11798 break;
11799 case llvm::omp::OMPC_shared:
11800 C = OMPSharedClause::CreateEmpty(Context, Record.readInt());
11801 break;
11802 case llvm::omp::OMPC_reduction: {
11803 unsigned N = Record.readInt();
11804 auto Modifier = Record.readEnum<OpenMPReductionClauseModifier>();
11805 C = OMPReductionClause::CreateEmpty(Context, N, Modifier);
11806 break;
11807 }
11808 case llvm::omp::OMPC_task_reduction:
11809 C = OMPTaskReductionClause::CreateEmpty(Context, Record.readInt());
11810 break;
11811 case llvm::omp::OMPC_in_reduction:
11812 C = OMPInReductionClause::CreateEmpty(Context, Record.readInt());
11813 break;
11814 case llvm::omp::OMPC_linear:
11815 C = OMPLinearClause::CreateEmpty(Context, Record.readInt());
11816 break;
11817 case llvm::omp::OMPC_aligned:
11818 C = OMPAlignedClause::CreateEmpty(Context, Record.readInt());
11819 break;
11820 case llvm::omp::OMPC_copyin:
11821 C = OMPCopyinClause::CreateEmpty(Context, Record.readInt());
11822 break;
11823 case llvm::omp::OMPC_copyprivate:
11824 C = OMPCopyprivateClause::CreateEmpty(Context, Record.readInt());
11825 break;
11826 case llvm::omp::OMPC_flush:
11827 C = OMPFlushClause::CreateEmpty(Context, Record.readInt());
11828 break;
11829 case llvm::omp::OMPC_depobj:
11830 C = OMPDepobjClause::CreateEmpty(Context);
11831 break;
11832 case llvm::omp::OMPC_depend: {
11833 unsigned NumVars = Record.readInt();
11834 unsigned NumLoops = Record.readInt();
11835 C = OMPDependClause::CreateEmpty(Context, NumVars, NumLoops);
11836 break;
11837 }
11838 case llvm::omp::OMPC_device:
11839 C = new (Context) OMPDeviceClause();
11840 break;
11841 case llvm::omp::OMPC_map: {
11842 OMPMappableExprListSizeTy Sizes;
11843 Sizes.NumVars = Record.readInt();
11844 Sizes.NumUniqueDeclarations = Record.readInt();
11845 Sizes.NumComponentLists = Record.readInt();
11846 Sizes.NumComponents = Record.readInt();
11847 C = OMPMapClause::CreateEmpty(Context, Sizes);
11848 break;
11849 }
11850 case llvm::omp::OMPC_num_teams:
11851 C = new (Context) OMPNumTeamsClause();
11852 break;
11853 case llvm::omp::OMPC_thread_limit:
11854 C = new (Context) OMPThreadLimitClause();
11855 break;
11856 case llvm::omp::OMPC_priority:
11857 C = new (Context) OMPPriorityClause();
11858 break;
11859 case llvm::omp::OMPC_grainsize:
11860 C = new (Context) OMPGrainsizeClause();
11861 break;
11862 case llvm::omp::OMPC_num_tasks:
11863 C = new (Context) OMPNumTasksClause();
11864 break;
11865 case llvm::omp::OMPC_hint:
11866 C = new (Context) OMPHintClause();
11867 break;
11868 case llvm::omp::OMPC_dist_schedule:
11869 C = new (Context) OMPDistScheduleClause();
11870 break;
11871 case llvm::omp::OMPC_defaultmap:
11872 C = new (Context) OMPDefaultmapClause();
11873 break;
11874 case llvm::omp::OMPC_to: {
11875 OMPMappableExprListSizeTy Sizes;
11876 Sizes.NumVars = Record.readInt();
11877 Sizes.NumUniqueDeclarations = Record.readInt();
11878 Sizes.NumComponentLists = Record.readInt();
11879 Sizes.NumComponents = Record.readInt();
11880 C = OMPToClause::CreateEmpty(Context, Sizes);
11881 break;
11882 }
11883 case llvm::omp::OMPC_from: {
11884 OMPMappableExprListSizeTy Sizes;
11885 Sizes.NumVars = Record.readInt();
11886 Sizes.NumUniqueDeclarations = Record.readInt();
11887 Sizes.NumComponentLists = Record.readInt();
11888 Sizes.NumComponents = Record.readInt();
11889 C = OMPFromClause::CreateEmpty(Context, Sizes);
11890 break;
11891 }
11892 case llvm::omp::OMPC_use_device_ptr: {
11893 OMPMappableExprListSizeTy Sizes;
11894 Sizes.NumVars = Record.readInt();
11895 Sizes.NumUniqueDeclarations = Record.readInt();
11896 Sizes.NumComponentLists = Record.readInt();
11897 Sizes.NumComponents = Record.readInt();
11898 C = OMPUseDevicePtrClause::CreateEmpty(Context, Sizes);
11899 break;
11900 }
11901 case llvm::omp::OMPC_use_device_addr: {
11902 OMPMappableExprListSizeTy Sizes;
11903 Sizes.NumVars = Record.readInt();
11904 Sizes.NumUniqueDeclarations = Record.readInt();
11905 Sizes.NumComponentLists = Record.readInt();
11906 Sizes.NumComponents = Record.readInt();
11907 C = OMPUseDeviceAddrClause::CreateEmpty(Context, Sizes);
11908 break;
11909 }
11910 case llvm::omp::OMPC_is_device_ptr: {
11911 OMPMappableExprListSizeTy Sizes;
11912 Sizes.NumVars = Record.readInt();
11913 Sizes.NumUniqueDeclarations = Record.readInt();
11914 Sizes.NumComponentLists = Record.readInt();
11915 Sizes.NumComponents = Record.readInt();
11916 C = OMPIsDevicePtrClause::CreateEmpty(Context, Sizes);
11917 break;
11918 }
11919 case llvm::omp::OMPC_allocate:
11920 C = OMPAllocateClause::CreateEmpty(Context, Record.readInt());
11921 break;
11922 case llvm::omp::OMPC_nontemporal:
11923 C = OMPNontemporalClause::CreateEmpty(Context, Record.readInt());
11924 break;
11925 case llvm::omp::OMPC_inclusive:
11926 C = OMPInclusiveClause::CreateEmpty(Context, Record.readInt());
11927 break;
11928 case llvm::omp::OMPC_exclusive:
11929 C = OMPExclusiveClause::CreateEmpty(Context, Record.readInt());
11930 break;
11931 case llvm::omp::OMPC_order:
11932 C = new (Context) OMPOrderClause();
11933 break;
11934 case llvm::omp::OMPC_init:
11935 C = OMPInitClause::CreateEmpty(Context, Record.readInt());
11936 break;
11937 case llvm::omp::OMPC_use:
11938 C = new (Context) OMPUseClause();
11939 break;
11940 case llvm::omp::OMPC_destroy:
11941 C = new (Context) OMPDestroyClause();
11942 break;
11943 case llvm::omp::OMPC_novariants:
11944 C = new (Context) OMPNovariantsClause();
11945 break;
11946 case llvm::omp::OMPC_nocontext:
11947 C = new (Context) OMPNocontextClause();
11948 break;
11949 case llvm::omp::OMPC_detach:
11950 C = new (Context) OMPDetachClause();
11951 break;
11952 case llvm::omp::OMPC_uses_allocators:
11953 C = OMPUsesAllocatorsClause::CreateEmpty(Context, Record.readInt());
11954 break;
11955 case llvm::omp::OMPC_affinity:
11956 C = OMPAffinityClause::CreateEmpty(Context, Record.readInt());
11957 break;
11958 case llvm::omp::OMPC_filter:
11959 C = new (Context) OMPFilterClause();
11960 break;
11961#define OMP_CLAUSE_NO_CLASS(Enum, Str)case llvm::omp::Enum: break; \
11962 case llvm::omp::Enum: \
11963 break;
11964#include "llvm/Frontend/OpenMP/OMPKinds.def"
11965 default:
11966 break;
11967 }
11968 assert(C && "Unknown OMPClause type")(static_cast <bool> (C && "Unknown OMPClause type"
) ? void (0) : __assert_fail ("C && \"Unknown OMPClause type\""
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/clang/lib/Serialization/ASTReader.cpp"
, 11968, __extension__ __PRETTY_FUNCTION__))
;
11969
11970 Visit(C);
11971 C->setLocStart(Record.readSourceLocation());
11972 C->setLocEnd(Record.readSourceLocation());
11973
11974 return C;
11975}
11976
11977void OMPClauseReader::VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C) {
11978 C->setPreInitStmt(Record.readSubStmt(),
11979 static_cast<OpenMPDirectiveKind>(Record.readInt()));
11980}
11981
11982void OMPClauseReader::VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C) {
11983 VisitOMPClauseWithPreInit(C);
11984 C->setPostUpdateExpr(Record.readSubExpr());
11985}
11986
11987void OMPClauseReader::VisitOMPIfClause(OMPIfClause *C) {
11988 VisitOMPClauseWithPreInit(C);
11989 C->setNameModifier(static_cast<OpenMPDirectiveKind>(Record.readInt()));
11990 C->setNameModifierLoc(Record.readSourceLocation());
11991 C->setColonLoc(Record.readSourceLocation());
11992 C->setCondition(Record.readSubExpr());
11993 C->setLParenLoc(Record.readSourceLocation());
11994}
11995
11996void OMPClauseReader::VisitOMPFinalClause(OMPFinalClause *C) {
11997 VisitOMPClauseWithPreInit(C);
11998 C->setCondition(Record.readSubExpr());
11999 C->setLParenLoc(Record.readSourceLocation());
12000}
12001
12002void OMPClauseReader::VisitOMPNumThreadsClause(OMPNumThreadsClause *C) {
12003 VisitOMPClauseWithPreInit(C);
12004 C->setNumThreads(Record.readSubExpr());
12005 C->setLParenLoc(Record.readSourceLocation());
12006}
12007
12008void OMPClauseReader::VisitOMPSafelenClause(OMPSafelenClause *C) {
12009 C->setSafelen(Record.readSubExpr());
12010 C->setLParenLoc(Record.readSourceLocation());
12011}
12012
12013void OMPClauseReader::VisitOMPSimdlenClause(OMPSimdlenClause *C) {
12014 C->setSimdlen(Record.readSubExpr());
12015 C->setLParenLoc(Record.readSourceLocation());
12016}
12017
12018void OMPClauseReader::VisitOMPSizesClause(OMPSizesClause *C) {
12019 for (Expr *&E : C->getSizesRefs())
12020 E = Record.readSubExpr();
12021 C->setLParenLoc(Record.readSourceLocation());
12022}
12023
12024void OMPClauseReader::VisitOMPFullClause(OMPFullClause *C) {}
12025
12026void OMPClauseReader::VisitOMPPartialClause(OMPPartialClause *C) {
12027 C->setFactor(Record.readSubExpr());
12028 C->setLParenLoc(Record.readSourceLocation());
12029}
12030
12031void OMPClauseReader::VisitOMPAllocatorClause(OMPAllocatorClause *C) {
12032 C->setAllocator(Record.readExpr());
12033 C->setLParenLoc(Record.readSourceLocation());
12034}
12035
12036void OMPClauseReader::VisitOMPCollapseClause(OMPCollapseClause *C) {
12037 C->setNumForLoops(Record.readSubExpr());
12038 C->setLParenLoc(Record.readSourceLocation());
12039}
12040
12041void OMPClauseReader::VisitOMPDefaultClause(OMPDefaultClause *C) {
12042 C->setDefaultKind(static_cast<llvm::omp::DefaultKind>(Record.readInt()));
12043 C->setLParenLoc(Record.readSourceLocation());
12044 C->setDefaultKindKwLoc(Record.readSourceLocation());
12045}
12046
12047void OMPClauseReader::VisitOMPProcBindClause(OMPProcBindClause *C) {
12048 C->setProcBindKind(static_cast<llvm::omp::ProcBindKind>(Record.readInt()));
12049 C->setLParenLoc(Record.readSourceLocation());
12050 C->setProcBindKindKwLoc(Record.readSourceLocation());
12051}
12052
12053void OMPClauseReader::VisitOMPScheduleClause(OMPScheduleClause *C) {
12054 VisitOMPClauseWithPreInit(C);
12055 C->setScheduleKind(
12056 static_cast<OpenMPScheduleClauseKind>(Record.readInt()));
12057 C->setFirstScheduleModifier(
12058 static_cast<OpenMPScheduleClauseModifier>(Record.readInt()));
12059 C->setSecondScheduleModifier(
12060 static_cast<OpenMPScheduleClauseModifier>(Record.readInt()));
12061 C->setChunkSize(Record.readSubExpr());
12062 C->setLParenLoc(Record.readSourceLocation());
12063 C->setFirstScheduleModifierLoc(Record.readSourceLocation());
12064 C->setSecondScheduleModifierLoc(Record.readSourceLocation());
12065 C->setScheduleKindLoc(Record.readSourceLocation());
12066 C->setCommaLoc(Record.readSourceLocation());
12067}
12068
12069void OMPClauseReader::VisitOMPOrderedClause(OMPOrderedClause *C) {
12070 C->setNumForLoops(Record.readSubExpr());
12071 for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I)
12072 C->setLoopNumIterations(I, Record.readSubExpr());
12073 for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I)
12074 C->setLoopCounter(I, Record.readSubExpr());
12075 C->setLParenLoc(Record.readSourceLocation());
12076}
12077
12078void OMPClauseReader::VisitOMPDetachClause(OMPDetachClause *C) {
12079 C->setEventHandler(Record.readSubExpr());
12080 C->setLParenLoc(Record.readSourceLocation());
12081}
12082
12083void OMPClauseReader::VisitOMPNowaitClause(OMPNowaitClause *) {}
12084
12085void OMPClauseReader::VisitOMPUntiedClause(OMPUntiedClause *) {}
12086
12087void OMPClauseReader::VisitOMPMergeableClause(OMPMergeableClause *) {}
12088
12089void OMPClauseReader::VisitOMPReadClause(OMPReadClause *) {}
12090
12091void OMPClauseReader::VisitOMPWriteClause(OMPWriteClause *) {}
12092
12093void OMPClauseReader::VisitOMPUpdateClause(OMPUpdateClause *C) {
12094 if (C->isExtended()) {
12095 C->setLParenLoc(Record.readSourceLocation());
12096 C->setArgumentLoc(Record.readSourceLocation());
12097 C->setDependencyKind(Record.readEnum<OpenMPDependClauseKind>());
12098 }
12099}
12100
12101void OMPClauseReader::VisitOMPCaptureClause(OMPCaptureClause *) {}
12102
12103void OMPClauseReader::VisitOMPSeqCstClause(OMPSeqCstClause *) {}
12104
12105void OMPClauseReader::VisitOMPAcqRelClause(OMPAcqRelClause *) {}
12106
12107void OMPClauseReader::VisitOMPAcquireClause(OMPAcquireClause *) {}
12108
12109void OMPClauseReader::VisitOMPReleaseClause(OMPReleaseClause *) {}
12110
12111void OMPClauseReader::VisitOMPRelaxedClause(OMPRelaxedClause *) {}
12112
12113void OMPClauseReader::VisitOMPThreadsClause(OMPThreadsClause *) {}
12114
12115void OMPClauseReader::VisitOMPSIMDClause(OMPSIMDClause *) {}
12116
12117void OMPClauseReader::VisitOMPNogroupClause(OMPNogroupClause *) {}
12118
12119void OMPClauseReader::VisitOMPInitClause(OMPInitClause *C) {
12120 unsigned NumVars = C->varlist_size();
12121 SmallVector<Expr *, 16> Vars;
12122 Vars.reserve(NumVars);
12123 for (unsigned I = 0; I != NumVars; ++I)
12124 Vars.push_back(Record.readSubExpr());
12125 C->setVarRefs(Vars);
12126 C->setIsTarget(Record.readBool());
12127 C->setIsTargetSync(Record.readBool());
12128 C->setLParenLoc(Record.readSourceLocation());
12129 C->setVarLoc(Record.readSourceLocation());
12130}
12131
12132void OMPClauseReader::VisitOMPUseClause(OMPUseClause *C) {
12133 C->setInteropVar(Record.readSubExpr());
12134 C->setLParenLoc(Record.readSourceLocation());
12135 C->setVarLoc(Record.readSourceLocation());
12136}
12137
12138void OMPClauseReader::VisitOMPDestroyClause(OMPDestroyClause *C) {
12139 C->setInteropVar(Record.readSubExpr());
12140 C->setLParenLoc(Record.readSourceLocation());
12141 C->setVarLoc(Record.readSourceLocation());
12142}
12143
12144void OMPClauseReader::VisitOMPNovariantsClause(OMPNovariantsClause *C) {
12145 VisitOMPClauseWithPreInit(C);
12146 C->setCondition(Record.readSubExpr());
12147 C->setLParenLoc(Record.readSourceLocation());
12148}
12149
12150void OMPClauseReader::VisitOMPNocontextClause(OMPNocontextClause *C) {
12151 VisitOMPClauseWithPreInit(C);
12152 C->setCondition(Record.readSubExpr());
12153 C->setLParenLoc(Record.readSourceLocation());
12154}
12155
12156void OMPClauseReader::VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *) {}
12157
12158void OMPClauseReader::VisitOMPUnifiedSharedMemoryClause(
12159 OMPUnifiedSharedMemoryClause *) {}
12160
12161void OMPClauseReader::VisitOMPReverseOffloadClause(OMPReverseOffloadClause *) {}
12162
12163void
12164OMPClauseReader::VisitOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause *) {
12165}
12166
12167void OMPClauseReader::VisitOMPAtomicDefaultMemOrderClause(
12168 OMPAtomicDefaultMemOrderClause *C) {
12169 C->setAtomicDefaultMemOrderKind(
12170 static_cast<OpenMPAtomicDefaultMemOrderClauseKind>(Record.readInt()));
12171 C->setLParenLoc(Record.readSourceLocation());
12172 C->setAtomicDefaultMemOrderKindKwLoc(Record.readSourceLocation());
12173}
12174
12175void OMPClauseReader::VisitOMPPrivateClause(OMPPrivateClause *C) {
12176 C->setLParenLoc(Record.readSourceLocation());
12177 unsigned NumVars = C->varlist_size();
12178 SmallVector<Expr *, 16> Vars;
12179 Vars.reserve(NumVars);
12180 for (unsigned i = 0; i != NumVars; ++i)
12181 Vars.push_back(Record.readSubExpr());
12182 C->setVarRefs(Vars);
12183 Vars.clear();
12184 for (unsigned i = 0; i != NumVars; ++i)
12185 Vars.push_back(Record.readSubExpr());
12186 C->setPrivateCopies(Vars);
12187}
12188
12189void OMPClauseReader::VisitOMPFirstprivateClause(OMPFirstprivateClause *C) {
12190 VisitOMPClauseWithPreInit(C);
12191 C->setLParenLoc(Record.readSourceLocation());
12192 unsigned NumVars = C->varlist_size();
12193 SmallVector<Expr *, 16> Vars;
12194 Vars.reserve(NumVars);
12195 for (unsigned i = 0; i != NumVars; ++i)
12196 Vars.push_back(Record.readSubExpr());
12197 C->setVarRefs(Vars);
12198 Vars.clear();
12199 for (unsigned i = 0; i != NumVars; ++i)
12200 Vars.push_back(Record.readSubExpr());
12201 C->setPrivateCopies(Vars);
12202 Vars.clear();
12203 for (unsigned i = 0; i != NumVars; ++i)
12204 Vars.push_back(Record.readSubExpr());
12205 C->setInits(Vars);
12206}
12207
12208void OMPClauseReader::VisitOMPLastprivateClause(OMPLastprivateClause *C) {
12209 VisitOMPClauseWithPostUpdate(C);
12210 C->setLParenLoc(Record.readSourceLocation());
12211 C->setKind(Record.readEnum<OpenMPLastprivateModifier>());
12212 C->setKindLoc(Record.readSourceLocation());
12213 C->setColonLoc(Record.readSourceLocation());
12214 unsigned NumVars = C->varlist_size();
12215 SmallVector<Expr *, 16> Vars;
12216 Vars.reserve(NumVars);
12217 for (unsigned i = 0; i != NumVars; ++i)
12218 Vars.push_back(Record.readSubExpr());
12219 C->setVarRefs(Vars);
12220 Vars.clear();
12221 for (unsigned i = 0; i != NumVars; ++i)
12222 Vars.push_back(Record.readSubExpr());
12223 C->setPrivateCopies(Vars);
12224 Vars.clear();
12225 for (unsigned i = 0; i != NumVars; ++i)
12226 Vars.push_back(Record.readSubExpr());
12227 C->setSourceExprs(Vars);
12228 Vars.clear();
12229 for (unsigned i = 0; i != NumVars; ++i)
12230 Vars.push_back(Record.readSubExpr());
12231 C->setDestinationExprs(Vars);
12232 Vars.clear();
12233 for (unsigned i = 0; i != NumVars; ++i)
12234 Vars.push_back(Record.readSubExpr());
12235 C->setAssignmentOps(Vars);
12236}
12237
12238void OMPClauseReader::VisitOMPSharedClause(OMPSharedClause *C) {
12239 C->setLParenLoc(Record.readSourceLocation());
12240 unsigned NumVars = C->varlist_size();
12241 SmallVector<Expr *, 16> Vars;
12242 Vars.reserve(NumVars);
12243 for (unsigned i = 0; i != NumVars; ++i)
12244 Vars.push_back(Record.readSubExpr());
12245 C->setVarRefs(Vars);
12246}
12247
12248void OMPClauseReader::VisitOMPReductionClause(OMPReductionClause *C) {
12249 VisitOMPClauseWithPostUpdate(C);
12250 C->setLParenLoc(Record.readSourceLocation());
12251 C->setModifierLoc(Record.readSourceLocation());
12252 C->setColonLoc(Record.readSourceLocation());
12253 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12254 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12255 C->setQualifierLoc(NNSL);
12256 C->setNameInfo(DNI);
12257
12258 unsigned NumVars = C->varlist_size();
12259 SmallVector<Expr *, 16> Vars;
12260 Vars.reserve(NumVars);
12261 for (unsigned i = 0; i != NumVars; ++i)
12262 Vars.push_back(Record.readSubExpr());
12263 C->setVarRefs(Vars);
12264 Vars.clear();
12265 for (unsigned i = 0; i != NumVars; ++i)
12266 Vars.push_back(Record.readSubExpr());
12267 C->setPrivates(Vars);
12268 Vars.clear();
12269 for (unsigned i = 0; i != NumVars; ++i)
12270 Vars.push_back(Record.readSubExpr());
12271 C->setLHSExprs(Vars);
12272 Vars.clear();
12273 for (unsigned i = 0; i != NumVars; ++i)
12274 Vars.push_back(Record.readSubExpr());
12275 C->setRHSExprs(Vars);
12276 Vars.clear();
12277 for (unsigned i = 0; i != NumVars; ++i)
12278 Vars.push_back(Record.readSubExpr());
12279 C->setReductionOps(Vars);
12280 if (C->getModifier() == OMPC_REDUCTION_inscan) {
12281 Vars.clear();
12282 for (unsigned i = 0; i != NumVars; ++i)
12283 Vars.push_back(Record.readSubExpr());
12284 C->setInscanCopyOps(Vars);
12285 Vars.clear();
12286 for (unsigned i = 0; i != NumVars; ++i)
12287 Vars.push_back(Record.readSubExpr());
12288 C->setInscanCopyArrayTemps(Vars);
12289 Vars.clear();
12290 for (unsigned i = 0; i != NumVars; ++i)
12291 Vars.push_back(Record.readSubExpr());
12292 C->setInscanCopyArrayElems(Vars);
12293 }
12294}
12295
12296void OMPClauseReader::VisitOMPTaskReductionClause(OMPTaskReductionClause *C) {
12297 VisitOMPClauseWithPostUpdate(C);
12298 C->setLParenLoc(Record.readSourceLocation());
12299 C->setColonLoc(Record.readSourceLocation());
12300 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12301 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12302 C->setQualifierLoc(NNSL);
12303 C->setNameInfo(DNI);
12304
12305 unsigned NumVars = C->varlist_size();
12306 SmallVector<Expr *, 16> Vars;
12307 Vars.reserve(NumVars);
12308 for (unsigned I = 0; I != NumVars; ++I)
12309 Vars.push_back(Record.readSubExpr());
12310 C->setVarRefs(Vars);
12311 Vars.clear();
12312 for (unsigned I = 0; I != NumVars; ++I)
12313 Vars.push_back(Record.readSubExpr());
12314 C->setPrivates(Vars);
12315 Vars.clear();
12316 for (unsigned I = 0; I != NumVars; ++I)
12317 Vars.push_back(Record.readSubExpr());
12318 C->setLHSExprs(Vars);
12319 Vars.clear();
12320 for (unsigned I = 0; I != NumVars; ++I)
12321 Vars.push_back(Record.readSubExpr());
12322 C->setRHSExprs(Vars);
12323 Vars.clear();
12324 for (unsigned I = 0; I != NumVars; ++I)
12325 Vars.push_back(Record.readSubExpr());
12326 C->setReductionOps(Vars);
12327}
12328
12329void OMPClauseReader::VisitOMPInReductionClause(OMPInReductionClause *C) {
12330 VisitOMPClauseWithPostUpdate(C);
12331 C->setLParenLoc(Record.readSourceLocation());
12332 C->setColonLoc(Record.readSourceLocation());
12333 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12334 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12335 C->setQualifierLoc(NNSL);
12336 C->setNameInfo(DNI);
12337
12338 unsigned NumVars = C->varlist_size();
12339 SmallVector<Expr *, 16> Vars;
12340 Vars.reserve(NumVars);
12341 for (unsigned I = 0; I != NumVars; ++I)
12342 Vars.push_back(Record.readSubExpr());
12343 C->setVarRefs(Vars);
12344 Vars.clear();
12345 for (unsigned I = 0; I != NumVars; ++I)
12346 Vars.push_back(Record.readSubExpr());
12347 C->setPrivates(Vars);
12348 Vars.clear();
12349 for (unsigned I = 0; I != NumVars; ++I)
12350 Vars.push_back(Record.readSubExpr());
12351 C->setLHSExprs(Vars);
12352 Vars.clear();
12353 for (unsigned I = 0; I != NumVars; ++I)
12354 Vars.push_back(Record.readSubExpr());
12355 C->setRHSExprs(Vars);
12356 Vars.clear();
12357 for (unsigned I = 0; I != NumVars; ++I)
12358 Vars.push_back(Record.readSubExpr());
12359 C->setReductionOps(Vars);
12360 Vars.clear();
12361 for (unsigned I = 0; I != NumVars; ++I)
12362 Vars.push_back(Record.readSubExpr());
12363 C->setTaskgroupDescriptors(Vars);
12364}
12365
12366void OMPClauseReader::VisitOMPLinearClause(OMPLinearClause *C) {
12367 VisitOMPClauseWithPostUpdate(C);
12368 C->setLParenLoc(Record.readSourceLocation());
12369 C->setColonLoc(Record.readSourceLocation());
12370 C->setModifier(static_cast<OpenMPLinearClauseKind>(Record.readInt()));
12371 C->setModifierLoc(Record.readSourceLocation());
12372 unsigned NumVars = C->varlist_size();
12373 SmallVector<Expr *, 16> Vars;
12374 Vars.reserve(NumVars);
12375 for (unsigned i = 0; i != NumVars; ++i)
12376 Vars.push_back(Record.readSubExpr());
12377 C->setVarRefs(Vars);
12378 Vars.clear();
12379 for (unsigned i = 0; i != NumVars; ++i)
12380 Vars.push_back(Record.readSubExpr());
12381 C->setPrivates(Vars);
12382 Vars.clear();
12383 for (unsigned i = 0; i != NumVars; ++i)
12384 Vars.push_back(Record.readSubExpr());
12385 C->setInits(Vars);
12386 Vars.clear();
12387 for (unsigned i = 0; i != NumVars; ++i)
12388 Vars.push_back(Record.readSubExpr());
12389 C->setUpdates(Vars);
12390 Vars.clear();
12391 for (unsigned i = 0; i != NumVars; ++i)
12392 Vars.push_back(Record.readSubExpr());
12393 C->setFinals(Vars);
12394 C->setStep(Record.readSubExpr());
12395 C->setCalcStep(Record.readSubExpr());
12396 Vars.clear();
12397 for (unsigned I = 0; I != NumVars + 1; ++I)
12398 Vars.push_back(Record.readSubExpr());
12399 C->setUsedExprs(Vars);
12400}
12401
12402void OMPClauseReader::VisitOMPAlignedClause(OMPAlignedClause *C) {
12403 C->setLParenLoc(Record.readSourceLocation());
12404 C->setColonLoc(Record.readSourceLocation());
12405 unsigned NumVars = C->varlist_size();
12406 SmallVector<Expr *, 16> Vars;
12407 Vars.reserve(NumVars);
12408 for (unsigned i = 0; i != NumVars; ++i)
12409 Vars.push_back(Record.readSubExpr());
12410 C->setVarRefs(Vars);
12411 C->setAlignment(Record.readSubExpr());
12412}
12413
12414void OMPClauseReader::VisitOMPCopyinClause(OMPCopyinClause *C) {
12415 C->setLParenLoc(Record.readSourceLocation());
12416 unsigned NumVars = C->varlist_size();
12417 SmallVector<Expr *, 16> Exprs;
12418 Exprs.reserve(NumVars);
12419 for (unsigned i = 0; i != NumVars; ++i)
12420 Exprs.push_back(Record.readSubExpr());
12421 C->setVarRefs(Exprs);
12422 Exprs.clear();
12423 for (unsigned i = 0; i != NumVars; ++i)
12424 Exprs.push_back(Record.readSubExpr());
12425 C->setSourceExprs(Exprs);
12426 Exprs.clear();
12427 for (unsigned i = 0; i != NumVars; ++i)
12428 Exprs.push_back(Record.readSubExpr());
12429 C->setDestinationExprs(Exprs);
12430 Exprs.clear();
12431 for (unsigned i = 0; i != NumVars; ++i)
12432 Exprs.push_back(Record.readSubExpr());
12433 C->setAssignmentOps(Exprs);
12434}
12435
12436void OMPClauseReader::VisitOMPCopyprivateClause(OMPCopyprivateClause *C) {
12437 C->setLParenLoc(Record.readSourceLocation());
12438 unsigned NumVars = C->varlist_size();
12439 SmallVector<Expr *, 16> Exprs;
12440 Exprs.reserve(NumVars);
12441 for (unsigned i = 0; i != NumVars; ++i)
12442 Exprs.push_back(Record.readSubExpr());
12443 C->setVarRefs(Exprs);
12444 Exprs.clear();
12445 for (unsigned i = 0; i != NumVars; ++i)
12446 Exprs.push_back(Record.readSubExpr());
12447 C->setSourceExprs(Exprs);
12448 Exprs.clear();
12449 for (unsigned i = 0; i != NumVars; ++i)
12450 Exprs.push_back(Record.readSubExpr());
12451 C->setDestinationExprs(Exprs);
12452 Exprs.clear();
12453 for (unsigned i = 0; i != NumVars; ++i)
12454 Exprs.push_back(Record.readSubExpr());
12455 C->setAssignmentOps(Exprs);
12456}
12457
12458void OMPClauseReader::VisitOMPFlushClause(OMPFlushClause *C) {
12459 C->setLParenLoc(Record.readSourceLocation());
12460 unsigned NumVars = C->varlist_size();
12461 SmallVector<Expr *, 16> Vars;
12462 Vars.reserve(NumVars);
12463 for (unsigned i = 0; i != NumVars; ++i)
12464 Vars.push_back(Record.readSubExpr());
12465 C->setVarRefs(Vars);
12466}
12467
12468void OMPClauseReader::VisitOMPDepobjClause(OMPDepobjClause *C) {
12469 C->setDepobj(Record.readSubExpr());
12470 C->setLParenLoc(Record.readSourceLocation());
12471}
12472
12473void OMPClauseReader::VisitOMPDependClause(OMPDependClause *C) {
12474 C->setLParenLoc(Record.readSourceLocation());
12475 C->setModifier(Record.readSubExpr());
12476 C->setDependencyKind(
12477 static_cast<OpenMPDependClauseKind>(Record.readInt()));
12478 C->setDependencyLoc(Record.readSourceLocation());
12479 C->setColonLoc(Record.readSourceLocation());
12480 unsigned NumVars = C->varlist_size();
12481 SmallVector<Expr *, 16> Vars;
12482 Vars.reserve(NumVars);
12483 for (unsigned I = 0; I != NumVars; ++I)
12484 Vars.push_back(Record.readSubExpr());
12485 C->setVarRefs(Vars);
12486 for (unsigned I = 0, E = C->getNumLoops(); I < E; ++I)
12487 C->setLoopData(I, Record.readSubExpr());
12488}
12489
12490void OMPClauseReader::VisitOMPDeviceClause(OMPDeviceClause *C) {
12491 VisitOMPClauseWithPreInit(C);
12492 C->setModifier(Record.readEnum<OpenMPDeviceClauseModifier>());
12493 C->setDevice(Record.readSubExpr());
12494 C->setModifierLoc(Record.readSourceLocation());
12495 C->setLParenLoc(Record.readSourceLocation());
12496}
12497
12498void OMPClauseReader::VisitOMPMapClause(OMPMapClause *C) {
12499 C->setLParenLoc(Record.readSourceLocation());
12500 for (unsigned I = 0; I < NumberOfOMPMapClauseModifiers; ++I) {
12501 C->setMapTypeModifier(
12502 I, static_cast<OpenMPMapModifierKind>(Record.readInt()));
12503 C->setMapTypeModifierLoc(I, Record.readSourceLocation());
12504 }
12505 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12506 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12507 C->setMapType(
12508 static_cast<OpenMPMapClauseKind>(Record.readInt()));
12509 C->setMapLoc(Record.readSourceLocation());
12510 C->setColonLoc(Record.readSourceLocation());
12511 auto NumVars = C->varlist_size();
12512 auto UniqueDecls = C->getUniqueDeclarationsNum();
12513 auto TotalLists = C->getTotalComponentListNum();
12514 auto TotalComponents = C->getTotalComponentsNum();
12515
12516 SmallVector<Expr *, 16> Vars;
12517 Vars.reserve(NumVars);
12518 for (unsigned i = 0; i != NumVars; ++i)
12519 Vars.push_back(Record.readExpr());
12520 C->setVarRefs(Vars);
12521
12522 SmallVector<Expr *, 16> UDMappers;
12523 UDMappers.reserve(NumVars);
12524 for (unsigned I = 0; I < NumVars; ++I)
12525 UDMappers.push_back(Record.readExpr());
12526 C->setUDMapperRefs(UDMappers);
12527
12528 SmallVector<ValueDecl *, 16> Decls;
12529 Decls.reserve(UniqueDecls);
12530 for (unsigned i = 0; i < UniqueDecls; ++i)
12531 Decls.push_back(Record.readDeclAs<ValueDecl>());
12532 C->setUniqueDecls(Decls);
12533
12534 SmallVector<unsigned, 16> ListsPerDecl;
12535 ListsPerDecl.reserve(UniqueDecls);
12536 for (unsigned i = 0; i < UniqueDecls; ++i)
12537 ListsPerDecl.push_back(Record.readInt());
12538 C->setDeclNumLists(ListsPerDecl);
12539
12540 SmallVector<unsigned, 32> ListSizes;
12541 ListSizes.reserve(TotalLists);
12542 for (unsigned i = 0; i < TotalLists; ++i)
12543 ListSizes.push_back(Record.readInt());
12544 C->setComponentListSizes(ListSizes);
12545
12546 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12547 Components.reserve(TotalComponents);
12548 for (unsigned i = 0; i < TotalComponents; ++i) {
12549 Expr *AssociatedExprPr = Record.readExpr();
12550 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12551 Components.emplace_back(AssociatedExprPr, AssociatedDecl,
12552 /*IsNonContiguous=*/false);
12553 }
12554 C->setComponents(Components, ListSizes);
12555}
12556
12557void OMPClauseReader::VisitOMPAllocateClause(OMPAllocateClause *C) {
12558 C->setLParenLoc(Record.readSourceLocation());
12559 C->setColonLoc(Record.readSourceLocation());
12560 C->setAllocator(Record.readSubExpr());
12561 unsigned NumVars = C->varlist_size();
12562 SmallVector<Expr *, 16> Vars;
12563 Vars.reserve(NumVars);
12564 for (unsigned i = 0; i != NumVars; ++i)
12565 Vars.push_back(Record.readSubExpr());
12566 C->setVarRefs(Vars);
12567}
12568
12569void OMPClauseReader::VisitOMPNumTeamsClause(OMPNumTeamsClause *C) {
12570 VisitOMPClauseWithPreInit(C);
12571 C->setNumTeams(Record.readSubExpr());
12572 C->setLParenLoc(Record.readSourceLocation());
12573}
12574
12575void OMPClauseReader::VisitOMPThreadLimitClause(OMPThreadLimitClause *C) {
12576 VisitOMPClauseWithPreInit(C);
12577 C->setThreadLimit(Record.readSubExpr());
12578 C->setLParenLoc(Record.readSourceLocation());
12579}
12580
12581void OMPClauseReader::VisitOMPPriorityClause(OMPPriorityClause *C) {
12582 VisitOMPClauseWithPreInit(C);
12583 C->setPriority(Record.readSubExpr());
12584 C->setLParenLoc(Record.readSourceLocation());
12585}
12586
12587void OMPClauseReader::VisitOMPGrainsizeClause(OMPGrainsizeClause *C) {
12588 VisitOMPClauseWithPreInit(C);
12589 C->setGrainsize(Record.readSubExpr());
12590 C->setLParenLoc(Record.readSourceLocation());
12591}
12592
12593void OMPClauseReader::VisitOMPNumTasksClause(OMPNumTasksClause *C) {
12594 VisitOMPClauseWithPreInit(C);
12595 C->setNumTasks(Record.readSubExpr());
12596 C->setLParenLoc(Record.readSourceLocation());
12597}
12598
12599void OMPClauseReader::VisitOMPHintClause(OMPHintClause *C) {
12600 C->setHint(Record.readSubExpr());
12601 C->setLParenLoc(Record.readSourceLocation());
12602}
12603
12604void OMPClauseReader::VisitOMPDistScheduleClause(OMPDistScheduleClause *C) {
12605 VisitOMPClauseWithPreInit(C);
12606 C->setDistScheduleKind(
12607 static_cast<OpenMPDistScheduleClauseKind>(Record.readInt()));
12608 C->setChunkSize(Record.readSubExpr());
12609 C->setLParenLoc(Record.readSourceLocation());
12610 C->setDistScheduleKindLoc(Record.readSourceLocation());
12611 C->setCommaLoc(Record.readSourceLocation());
12612}
12613
12614void OMPClauseReader::VisitOMPDefaultmapClause(OMPDefaultmapClause *C) {
12615 C->setDefaultmapKind(
12616 static_cast<OpenMPDefaultmapClauseKind>(Record.readInt()));
12617 C->setDefaultmapModifier(
12618 static_cast<OpenMPDefaultmapClauseModifier>(Record.readInt()));
12619 C->setLParenLoc(Record.readSourceLocation());
12620 C->setDefaultmapModifierLoc(Record.readSourceLocation());
12621 C->setDefaultmapKindLoc(Record.readSourceLocation());
12622}
12623
12624void OMPClauseReader::VisitOMPToClause(OMPToClause *C) {
12625 C->setLParenLoc(Record.readSourceLocation());
12626 for (unsigned I = 0; I < NumberOfOMPMotionModifiers; ++I) {
12627 C->setMotionModifier(
12628 I, static_cast<OpenMPMotionModifierKind>(Record.readInt()));
12629 C->setMotionModifierLoc(I, Record.readSourceLocation());
12630 }
12631 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12632 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12633 C->setColonLoc(Record.readSourceLocation());
12634 auto NumVars = C->varlist_size();
12635 auto UniqueDecls = C->getUniqueDeclarationsNum();
12636 auto TotalLists = C->getTotalComponentListNum();
12637 auto TotalComponents = C->getTotalComponentsNum();
12638
12639 SmallVector<Expr *, 16> Vars;
12640 Vars.reserve(NumVars);
12641 for (unsigned i = 0; i != NumVars; ++i)
12642 Vars.push_back(Record.readSubExpr());
12643 C->setVarRefs(Vars);
12644
12645 SmallVector<Expr *, 16> UDMappers;
12646 UDMappers.reserve(NumVars);
12647 for (unsigned I = 0; I < NumVars; ++I)
12648 UDMappers.push_back(Record.readSubExpr());
12649 C->setUDMapperRefs(UDMappers);
12650
12651 SmallVector<ValueDecl *, 16> Decls;
12652 Decls.reserve(UniqueDecls);
12653 for (unsigned i = 0; i < UniqueDecls; ++i)
12654 Decls.push_back(Record.readDeclAs<ValueDecl>());
12655 C->setUniqueDecls(Decls);
12656
12657 SmallVector<unsigned, 16> ListsPerDecl;
12658 ListsPerDecl.reserve(UniqueDecls);
12659 for (unsigned i = 0; i < UniqueDecls; ++i)
12660 ListsPerDecl.push_back(Record.readInt());
12661 C->setDeclNumLists(ListsPerDecl);
12662
12663 SmallVector<unsigned, 32> ListSizes;
12664 ListSizes.reserve(TotalLists);
12665 for (unsigned i = 0; i < TotalLists; ++i)
12666 ListSizes.push_back(Record.readInt());
12667 C->setComponentListSizes(ListSizes);
12668
12669 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12670 Components.reserve(TotalComponents);
12671 for (unsigned i = 0; i < TotalComponents; ++i) {
12672 Expr *AssociatedExprPr = Record.readSubExpr();
12673 bool IsNonContiguous = Record.readBool();
12674 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12675 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
12676 }
12677 C->setComponents(Components, ListSizes);
12678}
12679
12680void OMPClauseReader::VisitOMPFromClause(OMPFromClause *C) {
12681 C->setLParenLoc(Record.readSourceLocation());
12682 for (unsigned I = 0; I < NumberOfOMPMotionModifiers; ++I) {
12683 C->setMotionModifier(
12684 I, static_cast<OpenMPMotionModifierKind>(Record.readInt()));
12685 C->setMotionModifierLoc(I, Record.readSourceLocation());
12686 }
12687 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12688 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12689 C->setColonLoc(Record.readSourceLocation());
12690 auto NumVars = C->varlist_size();
12691 auto UniqueDecls = C->getUniqueDeclarationsNum();
12692 auto TotalLists = C->getTotalComponentListNum();
12693 auto TotalComponents = C->getTotalComponentsNum();
12694
12695 SmallVector<Expr *, 16> Vars;
12696 Vars.reserve(NumVars);
12697 for (unsigned i = 0; i != NumVars; ++i)
12698 Vars.push_back(Record.readSubExpr());
12699 C->setVarRefs(Vars);
12700
12701 SmallVector<Expr *, 16> UDMappers;
12702 UDMappers.reserve(NumVars);
12703 for (unsigned I = 0; I < NumVars; ++I)
12704 UDMappers.push_back(Record.readSubExpr());
12705 C->setUDMapperRefs(UDMappers);
12706
12707 SmallVector<ValueDecl *, 16> Decls;
12708 Decls.reserve(UniqueDecls);
12709 for (unsigned i = 0; i < UniqueDecls; ++i)
12710 Decls.push_back(Record.readDeclAs<ValueDecl>());
12711 C->setUniqueDecls(Decls);
12712
12713 SmallVector<unsigned, 16> ListsPerDecl;
12714 ListsPerDecl.reserve(UniqueDecls);
12715 for (unsigned i = 0; i < UniqueDecls; ++i)
12716 ListsPerDecl.push_back(Record.readInt());
12717 C->setDeclNumLists(ListsPerDecl);
12718
12719 SmallVector<unsigned, 32> ListSizes;
12720 ListSizes.reserve(TotalLists);
12721 for (unsigned i = 0; i < TotalLists; ++i)
12722 ListSizes.push_back(Record.readInt());
12723 C->setComponentListSizes(ListSizes);
12724
12725 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12726 Components.reserve(TotalComponents);
12727 for (unsigned i = 0; i < TotalComponents; ++i) {
12728 Expr *AssociatedExprPr = Record.readSubExpr();
12729 bool IsNonContiguous = Record.readBool();
12730 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12731 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
12732 }
12733 C->setComponents(Components, ListSizes);
12734}
12735
12736void OMPClauseReader::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *C) {
12737 C->setLParenLoc(Record.readSourceLocation());
12738 auto NumVars = C->varlist_size();
12739 auto UniqueDecls = C->getUniqueDeclarationsNum();
12740 auto TotalLists = C->getTotalComponentListNum();
12741 auto TotalComponents = C->getTotalComponentsNum();
12742
12743 SmallVector<Expr *, 16> Vars;
12744 Vars.reserve(NumVars);
12745 for (unsigned i = 0; i != NumVars; ++i)
12746 Vars.push_back(Record.readSubExpr());
12747 C->setVarRefs(Vars);
12748 Vars.clear();
12749 for (unsigned i = 0; i != NumVars; ++i)
12750 Vars.push_back(Record.readSubExpr());
12751 C->setPrivateCopies(Vars);
12752 Vars.clear();
12753 for (unsigned i = 0; i != NumVars; ++i)
12754 Vars.push_back(Record.readSubExpr());
12755 C->setInits(Vars);
12756
12757 SmallVector<ValueDecl *, 16> Decls;
12758 Decls.reserve(UniqueDecls);
12759 for (unsigned i = 0; i < UniqueDecls; ++i)
12760 Decls.push_back(Record.readDeclAs<ValueDecl>());
12761 C->setUniqueDecls(Decls);
12762
12763 SmallVector<unsigned, 16> ListsPerDecl;
12764 ListsPerDecl.reserve(UniqueDecls);
12765 for (unsigned i = 0; i < UniqueDecls; ++i)
12766 ListsPerDecl.push_back(Record.readInt());
12767 C->setDeclNumLists(ListsPerDecl);
12768
12769 SmallVector<unsigned, 32> ListSizes;
12770 ListSizes.reserve(TotalLists);
12771 for (unsigned i = 0; i < TotalLists; ++i)
12772 ListSizes.push_back(Record.readInt());
12773 C->setComponentListSizes(ListSizes);
12774
12775 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12776 Components.reserve(TotalComponents);
12777 for (unsigned i = 0; i < TotalComponents; ++i) {
12778 auto *AssociatedExprPr = Record.readSubExpr();
12779 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12780 Components.emplace_back(AssociatedExprPr, AssociatedDecl,
12781 /*IsNonContiguous=*/false);
12782 }
12783 C->setComponents(Components, ListSizes);
12784}
12785
12786void OMPClauseReader::VisitOMPUseDeviceAddrClause(OMPUseDeviceAddrClause *C) {
12787 C->setLParenLoc(Record.readSourceLocation());
12788 auto NumVars = C->varlist_size();
12789 auto UniqueDecls = C->getUniqueDeclarationsNum();
12790 auto TotalLists = C->getTotalComponentListNum();
12791 auto TotalComponents = C->getTotalComponentsNum();
12792
12793 SmallVector<Expr *, 16> Vars;
12794 Vars.reserve(NumVars);
12795 for (unsigned i = 0; i != NumVars; ++i)
12796 Vars.push_back(Record.readSubExpr());
12797 C->setVarRefs(Vars);
12798
12799 SmallVector<ValueDecl *, 16> Decls;
12800 Decls.reserve(UniqueDecls);
12801 for (unsigned i = 0; i < UniqueDecls; ++i)
12802 Decls.push_back(Record.readDeclAs<ValueDecl>());
12803 C->setUniqueDecls(Decls);
12804
12805 SmallVector<unsigned, 16> ListsPerDecl;
12806 ListsPerDecl.reserve(UniqueDecls);
12807 for (unsigned i = 0; i < UniqueDecls; ++i)
12808 ListsPerDecl.push_back(Record.readInt());
12809 C->setDeclNumLists(ListsPerDecl);
12810
12811 SmallVector<unsigned, 32> ListSizes;
12812 ListSizes.reserve(TotalLists);
12813 for (unsigned i = 0; i < TotalLists; ++i)
12814 ListSizes.push_back(Record.readInt());
12815 C->setComponentListSizes(ListSizes);
12816
12817 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12818 Components.reserve(TotalComponents);
12819 for (unsigned i = 0; i < TotalComponents; ++i) {
12820 Expr *AssociatedExpr = Record.readSubExpr();
12821 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12822 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12823 /*IsNonContiguous*/ false);
12824 }
12825 C->setComponents(Components, ListSizes);
12826}
12827
12828void OMPClauseReader::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
12829 C->setLParenLoc(Record.readSourceLocation());
12830 auto NumVars = C->varlist_size();
12831 auto UniqueDecls = C->getUniqueDeclarationsNum();
12832 auto TotalLists = C->getTotalComponentListNum();
12833 auto TotalComponents = C->getTotalComponentsNum();
12834
12835 SmallVector<Expr *, 16> Vars;
12836 Vars.reserve(NumVars);
12837 for (unsigned i = 0; i != NumVars; ++i)
12838 Vars.push_back(Record.readSubExpr());
12839 C->setVarRefs(Vars);
12840 Vars.clear();
12841
12842 SmallVector<ValueDecl *, 16> Decls;
12843 Decls.reserve(UniqueDecls);
12844 for (unsigned i = 0; i < UniqueDecls; ++i)
12845 Decls.push_back(Record.readDeclAs<ValueDecl>());
12846 C->setUniqueDecls(Decls);
12847
12848 SmallVector<unsigned, 16> ListsPerDecl;
12849 ListsPerDecl.reserve(UniqueDecls);
12850 for (unsigned i = 0; i < UniqueDecls; ++i)
12851 ListsPerDecl.push_back(Record.readInt());
12852 C->setDeclNumLists(ListsPerDecl);
12853
12854 SmallVector<unsigned, 32> ListSizes;
12855 ListSizes.reserve(TotalLists);
12856 for (unsigned i = 0; i < TotalLists; ++i)
12857 ListSizes.push_back(Record.readInt());
12858 C->setComponentListSizes(ListSizes);
12859
12860 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12861 Components.reserve(TotalComponents);
12862 for (unsigned i = 0; i < TotalComponents; ++i) {
12863 Expr *AssociatedExpr = Record.readSubExpr();
12864 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12865 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12866 /*IsNonContiguous=*/false);
12867 }
12868 C->setComponents(Components, ListSizes);
12869}
12870
12871void OMPClauseReader::VisitOMPNontemporalClause(OMPNontemporalClause *C) {
12872 C->setLParenLoc(Record.readSourceLocation());
12873 unsigned NumVars = C->varlist_size();
12874 SmallVector<Expr *, 16> Vars;
12875 Vars.reserve(NumVars);
12876 for (unsigned i = 0; i != NumVars; ++i)
12877 Vars.push_back(Record.readSubExpr());
12878 C->setVarRefs(Vars);
12879 Vars.clear();
12880 Vars.reserve(NumVars);
12881 for (unsigned i = 0; i != NumVars; ++i)
12882 Vars.push_back(Record.readSubExpr());
12883 C->setPrivateRefs(Vars);
12884}
12885
12886void OMPClauseReader::VisitOMPInclusiveClause(OMPInclusiveClause *C) {
12887 C->setLParenLoc(Record.readSourceLocation());
12888 unsigned NumVars = C->varlist_size();
12889 SmallVector<Expr *, 16> Vars;
12890 Vars.reserve(NumVars);
12891 for (unsigned i = 0; i != NumVars; ++i)
12892 Vars.push_back(Record.readSubExpr());
12893 C->setVarRefs(Vars);
12894}
12895
12896void OMPClauseReader::VisitOMPExclusiveClause(OMPExclusiveClause *C) {
12897 C->setLParenLoc(Record.readSourceLocation());
12898 unsigned NumVars = C->varlist_size();
12899 SmallVector<Expr *, 16> Vars;
12900 Vars.reserve(NumVars);
12901 for (unsigned i = 0; i != NumVars; ++i)
12902 Vars.push_back(Record.readSubExpr());
12903 C->setVarRefs(Vars);
12904}
12905
12906void OMPClauseReader::VisitOMPUsesAllocatorsClause(OMPUsesAllocatorsClause *C) {
12907 C->setLParenLoc(Record.readSourceLocation());
12908 unsigned NumOfAllocators = C->getNumberOfAllocators();
12909 SmallVector<OMPUsesAllocatorsClause::Data, 4> Data;
12910 Data.reserve(NumOfAllocators);
12911 for (unsigned I = 0; I != NumOfAllocators; ++I) {
12912 OMPUsesAllocatorsClause::Data &D = Data.emplace_back();
12913 D.Allocator = Record.readSubExpr();
12914 D.AllocatorTraits = Record.readSubExpr();
12915 D.LParenLoc = Record.readSourceLocation();
12916 D.RParenLoc = Record.readSourceLocation();
12917 }
12918 C->setAllocatorsData(Data);
12919}
12920
12921void OMPClauseReader::VisitOMPAffinityClause(OMPAffinityClause *C) {
12922 C->setLParenLoc(Record.readSourceLocation());
12923 C->setModifier(Record.readSubExpr());
12924 C->setColonLoc(Record.readSourceLocation());
12925 unsigned NumOfLocators = C->varlist_size();
12926 SmallVector<Expr *, 4> Locators;
12927 Locators.reserve(NumOfLocators);
12928 for (unsigned I = 0; I != NumOfLocators; ++I)
12929 Locators.push_back(Record.readSubExpr());
12930 C->setVarRefs(Locators);
12931}
12932
12933void OMPClauseReader::VisitOMPOrderClause(OMPOrderClause *C) {
12934 C->setKind(Record.readEnum<OpenMPOrderClauseKind>());
12935 C->setLParenLoc(Record.readSourceLocation());
12936 C->setKindKwLoc(Record.readSourceLocation());
12937}
12938
12939void OMPClauseReader::VisitOMPFilterClause(OMPFilterClause *C) {
12940 VisitOMPClauseWithPreInit(C);
12941 C->setThreadID(Record.readSubExpr());
12942 C->setLParenLoc(Record.readSourceLocation());
12943}
12944
12945OMPTraitInfo *ASTRecordReader::readOMPTraitInfo() {
12946 OMPTraitInfo &TI = getContext().getNewOMPTraitInfo();
12947 TI.Sets.resize(readUInt32());
12948 for (auto &Set : TI.Sets) {
12949 Set.Kind = readEnum<llvm::omp::TraitSet>();
12950 Set.Selectors.resize(readUInt32());
12951 for (auto &Selector : Set.Selectors) {
12952 Selector.Kind = readEnum<llvm::omp::TraitSelector>();
12953 Selector.ScoreOrCondition = nullptr;
12954 if (readBool())
12955 Selector.ScoreOrCondition = readExprRef();
12956 Selector.Properties.resize(readUInt32());
12957 for (auto &Property : Selector.Properties)
12958 Property.Kind = readEnum<llvm::omp::TraitProperty>();
12959 }
12960 }
12961 return &TI;
12962}
12963
12964void ASTRecordReader::readOMPChildren(OMPChildren *Data) {
12965 if (!Data)
12966 return;
12967 if (Reader->ReadingKind == ASTReader::Read_Stmt) {
12968 // Skip NumClauses, NumChildren and HasAssociatedStmt fields.
12969 skipInts(3);
12970 }
12971 SmallVector<OMPClause *, 4> Clauses(Data->getNumClauses());
12972 for (unsigned I = 0, E = Data->getNumClauses(); I < E; ++I)
12973 Clauses[I] = readOMPClause();
12974 Data->setClauses(Clauses);
12975 if (Data->hasAssociatedStmt())
12976 Data->setAssociatedStmt(readStmt());
12977 for (unsigned I = 0, E = Data->getNumChildren(); I < E; ++I)
12978 Data->getChildren()[I] = readStmt();
12979}

/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/llvm/include/llvm/Bitstream/BitstreamReader.h

1//===- BitstreamReader.h - Low-level bitstream reader interface -*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This header defines the BitstreamReader class. This class can be used to
10// read an arbitrary bitstream, regardless of its contents.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_BITSTREAM_BITSTREAMREADER_H
15#define LLVM_BITSTREAM_BITSTREAMREADER_H
16
17#include "llvm/ADT/ArrayRef.h"
18#include "llvm/ADT/SmallVector.h"
19#include "llvm/Bitstream/BitCodes.h"
20#include "llvm/Support/Endian.h"
21#include "llvm/Support/Error.h"
22#include "llvm/Support/ErrorHandling.h"
23#include "llvm/Support/MathExtras.h"
24#include "llvm/Support/MemoryBuffer.h"
25#include <algorithm>
26#include <cassert>
27#include <climits>
28#include <cstddef>
29#include <cstdint>
30#include <memory>
31#include <string>
32#include <utility>
33#include <vector>
34
35namespace llvm {
36
37/// This class maintains the abbreviations read from a block info block.
38class BitstreamBlockInfo {
39public:
40 /// This contains information emitted to BLOCKINFO_BLOCK blocks. These
41 /// describe abbreviations that all blocks of the specified ID inherit.
42 struct BlockInfo {
43 unsigned BlockID = 0;
44 std::vector<std::shared_ptr<BitCodeAbbrev>> Abbrevs;
45 std::string Name;
46 std::vector<std::pair<unsigned, std::string>> RecordNames;
47 };
48
49private:
50 std::vector<BlockInfo> BlockInfoRecords;
51
52public:
53 /// If there is block info for the specified ID, return it, otherwise return
54 /// null.
55 const BlockInfo *getBlockInfo(unsigned BlockID) const {
56 // Common case, the most recent entry matches BlockID.
57 if (!BlockInfoRecords.empty() && BlockInfoRecords.back().BlockID == BlockID)
58 return &BlockInfoRecords.back();
59
60 for (unsigned i = 0, e = static_cast<unsigned>(BlockInfoRecords.size());
61 i != e; ++i)
62 if (BlockInfoRecords[i].BlockID == BlockID)
63 return &BlockInfoRecords[i];
64 return nullptr;
65 }
66
67 BlockInfo &getOrCreateBlockInfo(unsigned BlockID) {
68 if (const BlockInfo *BI = getBlockInfo(BlockID))
69 return *const_cast<BlockInfo*>(BI);
70
71 // Otherwise, add a new record.
72 BlockInfoRecords.emplace_back();
73 BlockInfoRecords.back().BlockID = BlockID;
74 return BlockInfoRecords.back();
75 }
76};
77
78/// This represents a position within a bitstream. There may be multiple
79/// independent cursors reading within one bitstream, each maintaining their
80/// own local state.
81class SimpleBitstreamCursor {
82 ArrayRef<uint8_t> BitcodeBytes;
83 size_t NextChar = 0;
84
85public:
86 /// This is the current data we have pulled from the stream but have not
87 /// returned to the client. This is specifically and intentionally defined to
88 /// follow the word size of the host machine for efficiency. We use word_t in
89 /// places that are aware of this to make it perfectly explicit what is going
90 /// on.
91 using word_t = size_t;
92
93private:
94 word_t CurWord = 0;
95
96 /// This is the number of bits in CurWord that are valid. This is always from
97 /// [0...bits_of(size_t)-1] inclusive.
98 unsigned BitsInCurWord = 0;
99
100public:
101 static const constexpr size_t MaxChunkSize = sizeof(word_t) * 8;
102
103 SimpleBitstreamCursor() = default;
104 explicit SimpleBitstreamCursor(ArrayRef<uint8_t> BitcodeBytes)
105 : BitcodeBytes(BitcodeBytes) {}
106 explicit SimpleBitstreamCursor(StringRef BitcodeBytes)
107 : BitcodeBytes(arrayRefFromStringRef(BitcodeBytes)) {}
108 explicit SimpleBitstreamCursor(MemoryBufferRef BitcodeBytes)
109 : SimpleBitstreamCursor(BitcodeBytes.getBuffer()) {}
110
111 bool canSkipToPos(size_t pos) const {
112 // pos can be skipped to if it is a valid address or one byte past the end.
113 return pos <= BitcodeBytes.size();
114 }
115
116 bool AtEndOfStream() {
117 return BitsInCurWord == 0 && BitcodeBytes.size() <= NextChar;
118 }
119
120 /// Return the bit # of the bit we are reading.
121 uint64_t GetCurrentBitNo() const {
122 return NextChar*CHAR_BIT8 - BitsInCurWord;
123 }
124
125 // Return the byte # of the current bit.
126 uint64_t getCurrentByteNo() const { return GetCurrentBitNo() / 8; }
127
128 ArrayRef<uint8_t> getBitcodeBytes() const { return BitcodeBytes; }
129
130 /// Reset the stream to the specified bit number.
131 Error JumpToBit(uint64_t BitNo) {
132 size_t ByteNo = size_t(BitNo/8) & ~(sizeof(word_t)-1);
133 unsigned WordBitNo = unsigned(BitNo & (sizeof(word_t)*8-1));
134 assert(canSkipToPos(ByteNo) && "Invalid location")(static_cast <bool> (canSkipToPos(ByteNo) && "Invalid location"
) ? void (0) : __assert_fail ("canSkipToPos(ByteNo) && \"Invalid location\""
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/llvm/include/llvm/Bitstream/BitstreamReader.h"
, 134, __extension__ __PRETTY_FUNCTION__))
;
135
136 // Move the cursor to the right word.
137 NextChar = ByteNo;
138 BitsInCurWord = 0;
139
140 // Skip over any bits that are already consumed.
141 if (WordBitNo) {
142 if (Expected<word_t> Res = Read(WordBitNo))
143 return Error::success();
144 else
145 return Res.takeError();
146 }
147
148 return Error::success();
149 }
150
151 /// Get a pointer into the bitstream at the specified byte offset.
152 const uint8_t *getPointerToByte(uint64_t ByteNo, uint64_t NumBytes) {
153 return BitcodeBytes.data() + ByteNo;
154 }
155
156 /// Get a pointer into the bitstream at the specified bit offset.
157 ///
158 /// The bit offset must be on a byte boundary.
159 const uint8_t *getPointerToBit(uint64_t BitNo, uint64_t NumBytes) {
160 assert(!(BitNo % 8) && "Expected bit on byte boundary")(static_cast <bool> (!(BitNo % 8) && "Expected bit on byte boundary"
) ? void (0) : __assert_fail ("!(BitNo % 8) && \"Expected bit on byte boundary\""
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/llvm/include/llvm/Bitstream/BitstreamReader.h"
, 160, __extension__ __PRETTY_FUNCTION__))
;
161 return getPointerToByte(BitNo / 8, NumBytes);
162 }
163
164 Error fillCurWord() {
165 if (NextChar >= BitcodeBytes.size())
166 return createStringError(std::errc::io_error,
167 "Unexpected end of file reading %u of %u bytes",
168 NextChar, BitcodeBytes.size());
169
170 // Read the next word from the stream.
171 const uint8_t *NextCharPtr = BitcodeBytes.data() + NextChar;
172 unsigned BytesRead;
173 if (BitcodeBytes.size() >= NextChar + sizeof(word_t)) {
174 BytesRead = sizeof(word_t);
175 CurWord =
176 support::endian::read<word_t, support::little, support::unaligned>(
177 NextCharPtr);
178 } else {
179 // Short read.
180 BytesRead = BitcodeBytes.size() - NextChar;
181 CurWord = 0;
182 for (unsigned B = 0; B != BytesRead; ++B)
183 CurWord |= uint64_t(NextCharPtr[B]) << (B * 8);
184 }
185 NextChar += BytesRead;
186 BitsInCurWord = BytesRead * 8;
187 return Error::success();
188 }
189
190 Expected<word_t> Read(unsigned NumBits) {
191 static const unsigned BitsInWord = MaxChunkSize;
192
193 assert(NumBits && NumBits <= BitsInWord &&(static_cast <bool> (NumBits && NumBits <= BitsInWord
&& "Cannot return zero or more than BitsInWord bits!"
) ? void (0) : __assert_fail ("NumBits && NumBits <= BitsInWord && \"Cannot return zero or more than BitsInWord bits!\""
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/llvm/include/llvm/Bitstream/BitstreamReader.h"
, 194, __extension__ __PRETTY_FUNCTION__))
11
Assuming 'NumBits' is not equal to 0
12
Assuming 'NumBits' is <= 'BitsInWord'
13
'?' condition is true
194 "Cannot return zero or more than BitsInWord bits!")(static_cast <bool> (NumBits && NumBits <= BitsInWord
&& "Cannot return zero or more than BitsInWord bits!"
) ? void (0) : __assert_fail ("NumBits && NumBits <= BitsInWord && \"Cannot return zero or more than BitsInWord bits!\""
, "/build/llvm-toolchain-snapshot-14~++20210828111110+16086d47c0d0/llvm/include/llvm/Bitstream/BitstreamReader.h"
, 194, __extension__ __PRETTY_FUNCTION__))
;
195
196 static const unsigned Mask = sizeof(word_t) > 4 ? 0x3f : 0x1f;
14
'?' condition is true
197
198 // If the field is fully contained by CurWord, return it quickly.
199 if (BitsInCurWord >= NumBits) {
15
Assuming 'NumBits' is > field 'BitsInCurWord'
200 word_t R = CurWord & (~word_t(0) >> (BitsInWord - NumBits));
201
202 // Use a mask to avoid undefined behavior.
203 CurWord >>= (NumBits & Mask);
204
205 BitsInCurWord -= NumBits;
206 return R;
207 }
208
209 word_t R = BitsInCurWord
16.1
Field 'BitsInCurWord' is not equal to 0
16.1
Field 'BitsInCurWord' is not equal to 0
? CurWord : 0;
16
Taking false branch
17
'?' condition is true
210 unsigned BitsLeft = NumBits - BitsInCurWord;
211
212 if (Error fillResult = fillCurWord())
18
Assuming the condition is false
19
Taking false branch
213 return std::move(fillResult);
214
215 // If we run out of data, abort.
216 if (BitsLeft > BitsInCurWord)
20
Assuming 'BitsLeft' is <= field 'BitsInCurWord'
21
Taking false branch
217 return createStringError(std::errc::io_error,
218 "Unexpected end of file reading %u of %u bits",
219 BitsInCurWord, BitsLeft);
220
221 word_t R2 = CurWord & (~word_t(0) >> (BitsInWord - BitsLeft));
22
The result of the right shift is undefined due to shifting by '64', which is greater or equal to the width of type 'llvm::SimpleBitstreamCursor::word_t'
222
223 // Use a mask to avoid undefined behavior.
224 CurWord >>= (BitsLeft & Mask);
225
226 BitsInCurWord -= BitsLeft;
227
228 R |= R2 << (NumBits - BitsLeft);
229
230 return R;
231 }
232
233 Expected<uint32_t> ReadVBR(unsigned NumBits) {
234 Expected<unsigned> MaybeRead = Read(NumBits);
235 if (!MaybeRead)
236 return MaybeRead;
237 uint32_t Piece = MaybeRead.get();
238
239 if ((Piece & (1U << (NumBits-1))) == 0)
240 return Piece;
241
242 uint32_t Result = 0;
243 unsigned NextBit = 0;
244 while (true) {
245 Result |= (Piece & ((1U << (NumBits-1))-1)) << NextBit;
246
247 if ((Piece & (1U << (NumBits-1))) == 0)
248 return Result;
249
250 NextBit += NumBits-1;
251 MaybeRead = Read(NumBits);
252 if (!MaybeRead)
253 return MaybeRead;
254 Piece = MaybeRead.get();
255 }
256 }
257
258 // Read a VBR that may have a value up to 64-bits in size. The chunk size of
259 // the VBR must still be <= 32 bits though.
260 Expected<uint64_t> ReadVBR64(unsigned NumBits) {
261 Expected<uint64_t> MaybeRead = Read(NumBits);
262 if (!MaybeRead)
263 return MaybeRead;
264 uint32_t Piece = MaybeRead.get();
265
266 if ((Piece & (1U << (NumBits-1))) == 0)
267 return uint64_t(Piece);
268
269 uint64_t Result = 0;
270 unsigned NextBit = 0;
271 while (true) {
272 Result |= uint64_t(Piece & ((1U << (NumBits-1))-1)) << NextBit;
273
274 if ((Piece & (1U << (NumBits-1))) == 0)
275 return Result;
276
277 NextBit += NumBits-1;
278 MaybeRead = Read(NumBits);
279 if (!MaybeRead)
280 return MaybeRead;
281 Piece = MaybeRead.get();
282 }
283 }
284
285 void SkipToFourByteBoundary() {
286 // If word_t is 64-bits and if we've read less than 32 bits, just dump
287 // the bits we have up to the next 32-bit boundary.
288 if (sizeof(word_t) > 4 &&
289 BitsInCurWord >= 32) {
290 CurWord >>= BitsInCurWord-32;
291 BitsInCurWord = 32;
292 return;
293 }
294
295 BitsInCurWord = 0;
296 }
297
298 /// Return the size of the stream in bytes.
299 size_t SizeInBytes() const { return BitcodeBytes.size(); }
300
301 /// Skip to the end of the file.
302 void skipToEnd() { NextChar = BitcodeBytes.size(); }
303};
304
305/// When advancing through a bitstream cursor, each advance can discover a few
306/// different kinds of entries:
307struct BitstreamEntry {
308 enum {
309 Error, // Malformed bitcode was found.
310 EndBlock, // We've reached the end of the current block, (or the end of the
311 // file, which is treated like a series of EndBlock records.
312 SubBlock, // This is the start of a new subblock of a specific ID.
313 Record // This is a record with a specific AbbrevID.
314 } Kind;
315
316 unsigned ID;
317
318 static BitstreamEntry getError() {
319 BitstreamEntry E; E.Kind = Error; return E;
320 }
321
322 static BitstreamEntry getEndBlock() {
323 BitstreamEntry E; E.Kind = EndBlock; return E;
324 }
325
326 static BitstreamEntry getSubBlock(unsigned ID) {
327 BitstreamEntry E; E.Kind = SubBlock; E.ID = ID; return E;
328 }
329
330 static BitstreamEntry getRecord(unsigned AbbrevID) {
331 BitstreamEntry E; E.Kind = Record; E.ID = AbbrevID; return E;
332 }
333};
334
335/// This represents a position within a bitcode file, implemented on top of a
336/// SimpleBitstreamCursor.
337///
338/// Unlike iterators, BitstreamCursors are heavy-weight objects that should not
339/// be passed by value.
340class BitstreamCursor : SimpleBitstreamCursor {
341 // This is the declared size of code values used for the current block, in
342 // bits.
343 unsigned CurCodeSize = 2;
344
345 /// Abbrevs installed at in this block.
346 std::vector<std::shared_ptr<BitCodeAbbrev>> CurAbbrevs;
347
348 struct Block {
349 unsigned PrevCodeSize;
350 std::vector<std::shared_ptr<BitCodeAbbrev>> PrevAbbrevs;
351
352 explicit Block(unsigned PCS) : PrevCodeSize(PCS) {}
353 };
354
355 /// This tracks the codesize of parent blocks.
356 SmallVector<Block, 8> BlockScope;
357
358 BitstreamBlockInfo *BlockInfo = nullptr;
359
360public:
361 static const size_t MaxChunkSize = sizeof(word_t) * 8;
362
363 BitstreamCursor() = default;
364 explicit BitstreamCursor(ArrayRef<uint8_t> BitcodeBytes)
365 : SimpleBitstreamCursor(BitcodeBytes) {}
366 explicit BitstreamCursor(StringRef BitcodeBytes)
367 : SimpleBitstreamCursor(BitcodeBytes) {}
368 explicit BitstreamCursor(MemoryBufferRef BitcodeBytes)
369 : SimpleBitstreamCursor(BitcodeBytes) {}
370
371 using SimpleBitstreamCursor::AtEndOfStream;
372 using SimpleBitstreamCursor::canSkipToPos;
373 using SimpleBitstreamCursor::fillCurWord;
374 using SimpleBitstreamCursor::getBitcodeBytes;
375 using SimpleBitstreamCursor::GetCurrentBitNo;
376 using SimpleBitstreamCursor::getCurrentByteNo;
377 using SimpleBitstreamCursor::getPointerToByte;
378 using SimpleBitstreamCursor::JumpToBit;
379 using SimpleBitstreamCursor::Read;
380 using SimpleBitstreamCursor::ReadVBR;
381 using SimpleBitstreamCursor::ReadVBR64;
382 using SimpleBitstreamCursor::SizeInBytes;
383 using SimpleBitstreamCursor::skipToEnd;
384
385 /// Return the number of bits used to encode an abbrev #.
386 unsigned getAbbrevIDWidth() const { return CurCodeSize; }
387
388 /// Flags that modify the behavior of advance().
389 enum {
390 /// If this flag is used, the advance() method does not automatically pop
391 /// the block scope when the end of a block is reached.
392 AF_DontPopBlockAtEnd = 1,
393
394 /// If this flag is used, abbrev entries are returned just like normal
395 /// records.
396 AF_DontAutoprocessAbbrevs = 2
397 };
398
399 /// Advance the current bitstream, returning the next entry in the stream.
400 Expected<BitstreamEntry> advance(unsigned Flags = 0) {
401 while (true) {
7
Loop condition is true. Entering loop body
402 if (AtEndOfStream())
8
Taking false branch
403 return BitstreamEntry::getError();
404
405 Expected<unsigned> MaybeCode = ReadCode();
9
Calling 'BitstreamCursor::ReadCode'
406 if (!MaybeCode)
407 return MaybeCode.takeError();
408 unsigned Code = MaybeCode.get();
409
410 if (Code == bitc::END_BLOCK) {
411 // Pop the end of the block unless Flags tells us not to.
412 if (!(Flags & AF_DontPopBlockAtEnd) && ReadBlockEnd())
413 return BitstreamEntry::getError();
414 return BitstreamEntry::getEndBlock();
415 }
416
417 if (Code == bitc::ENTER_SUBBLOCK) {
418 if (Expected<unsigned> MaybeSubBlock = ReadSubBlockID())
419 return BitstreamEntry::getSubBlock(MaybeSubBlock.get());
420 else
421 return MaybeSubBlock.takeError();
422 }
423
424 if (Code == bitc::DEFINE_ABBREV &&
425 !(Flags & AF_DontAutoprocessAbbrevs)) {
426 // We read and accumulate abbrev's, the client can't do anything with
427 // them anyway.
428 if (Error Err = ReadAbbrevRecord())
429 return std::move(Err);
430 continue;
431 }
432
433 return BitstreamEntry::getRecord(Code);
434 }
435 }
436
437 /// This is a convenience function for clients that don't expect any
438 /// subblocks. This just skips over them automatically.
439 Expected<BitstreamEntry> advanceSkippingSubblocks(unsigned Flags = 0) {
440 while (true) {
5
Loop condition is true. Entering loop body
441 // If we found a normal entry, return it.
442 Expected<BitstreamEntry> MaybeEntry = advance(Flags);
6
Calling 'BitstreamCursor::advance'
443 if (!MaybeEntry)
444 return MaybeEntry;
445 BitstreamEntry Entry = MaybeEntry.get();
446
447 if (Entry.Kind != BitstreamEntry::SubBlock)
448 return Entry;
449
450 // If we found a sub-block, just skip over it and check the next entry.
451 if (Error Err = SkipBlock())
452 return std::move(Err);
453 }
454 }
455
456 Expected<unsigned> ReadCode() { return Read(CurCodeSize); }
10
Calling 'SimpleBitstreamCursor::Read'
457
458 // Block header:
459 // [ENTER_SUBBLOCK, blockid, newcodelen, <align4bytes>, blocklen]
460
461 /// Having read the ENTER_SUBBLOCK code, read the BlockID for the block.
462 Expected<unsigned> ReadSubBlockID() { return ReadVBR(bitc::BlockIDWidth); }
463
464 /// Having read the ENTER_SUBBLOCK abbrevid and a BlockID, skip over the body
465 /// of this block.
466 Error SkipBlock() {
467 // Read and ignore the codelen value.
468 if (Expected<uint32_t> Res = ReadVBR(bitc::CodeLenWidth))
469 ; // Since we are skipping this block, we don't care what code widths are
470 // used inside of it.
471 else
472 return Res.takeError();
473
474 SkipToFourByteBoundary();
475 Expected<unsigned> MaybeNum = Read(bitc::BlockSizeWidth);
476 if (!MaybeNum)
477 return MaybeNum.takeError();
478 size_t NumFourBytes = MaybeNum.get();
479
480 // Check that the block wasn't partially defined, and that the offset isn't
481 // bogus.
482 size_t SkipTo = GetCurrentBitNo() + NumFourBytes * 4 * 8;
483 if (AtEndOfStream())
484 return createStringError(std::errc::illegal_byte_sequence,
485 "can't skip block: already at end of stream");
486 if (!canSkipToPos(SkipTo / 8))
487 return createStringError(std::errc::illegal_byte_sequence,
488 "can't skip to bit %zu from %" PRIu64"l" "u", SkipTo,
489 GetCurrentBitNo());
490
491 if (Error Res = JumpToBit(SkipTo))
492 return Res;
493
494 return Error::success();
495 }
496
497 /// Having read the ENTER_SUBBLOCK abbrevid, and enter the block.
498 Error EnterSubBlock(unsigned BlockID, unsigned *NumWordsP = nullptr);
499
500 bool ReadBlockEnd() {
501 if (BlockScope.empty()) return true;
502
503 // Block tail:
504 // [END_BLOCK, <align4bytes>]
505 SkipToFourByteBoundary();
506
507 popBlockScope();
508 return false;
509 }
510
511private:
512 void popBlockScope() {
513 CurCodeSize = BlockScope.back().PrevCodeSize;
514
515 CurAbbrevs = std::move(BlockScope.back().PrevAbbrevs);
516 BlockScope.pop_back();
517 }
518
519 //===--------------------------------------------------------------------===//
520 // Record Processing
521 //===--------------------------------------------------------------------===//
522
523public:
524 /// Return the abbreviation for the specified AbbrevId.
525 const BitCodeAbbrev *getAbbrev(unsigned AbbrevID) {
526 unsigned AbbrevNo = AbbrevID - bitc::FIRST_APPLICATION_ABBREV;
527 if (AbbrevNo >= CurAbbrevs.size())
528 report_fatal_error("Invalid abbrev number");
529 return CurAbbrevs[AbbrevNo].get();
530 }
531
532 /// Read the current record and discard it, returning the code for the record.
533 Expected<unsigned> skipRecord(unsigned AbbrevID);
534
535 Expected<unsigned> readRecord(unsigned AbbrevID,
536 SmallVectorImpl<uint64_t> &Vals,
537 StringRef *Blob = nullptr);
538
539 //===--------------------------------------------------------------------===//
540 // Abbrev Processing
541 //===--------------------------------------------------------------------===//
542 Error ReadAbbrevRecord();
543
544 /// Read and return a block info block from the bitstream. If an error was
545 /// encountered, return None.
546 ///
547 /// \param ReadBlockInfoNames Whether to read block/record name information in
548 /// the BlockInfo block. Only llvm-bcanalyzer uses this.
549 Expected<Optional<BitstreamBlockInfo>>
550 ReadBlockInfoBlock(bool ReadBlockInfoNames = false);
551
552 /// Set the block info to be used by this BitstreamCursor to interpret
553 /// abbreviated records.
554 void setBlockInfo(BitstreamBlockInfo *BI) { BlockInfo = BI; }
555};
556
557} // end llvm namespace
558
559#endif // LLVM_BITSTREAM_BITSTREAMREADER_H