Bug Summary

File:src/gnu/usr.bin/clang/libclangSerialization/../../../llvm/clang/include/clang/AST/OpenMPClause.h
Warning:line 8423, column 13
Called C++ object pointer is null

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple amd64-unknown-openbsd7.0 -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 -mrelocation-model static -mframe-pointer=all -relaxed-aliasing -fno-rounding-math -mconstructor-aliases -munwind-tables -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fcoverage-compilation-dir=/usr/src/gnu/usr.bin/clang/libclangSerialization/obj -resource-dir /usr/local/lib/clang/13.0.0 -I /usr/src/gnu/usr.bin/clang/libclangSerialization/../../../llvm/clang/include -I /usr/src/gnu/usr.bin/clang/libclangSerialization/../../../llvm/llvm/include -I /usr/src/gnu/usr.bin/clang/libclangSerialization/../include -I /usr/src/gnu/usr.bin/clang/libclangSerialization/obj -I /usr/src/gnu/usr.bin/clang/libclangSerialization/obj/../include -D NDEBUG -D __STDC_LIMIT_MACROS -D __STDC_CONSTANT_MACROS -D __STDC_FORMAT_MACROS -D LLVM_PREFIX="/usr" -internal-isystem /usr/include/c++/v1 -internal-isystem /usr/local/lib/clang/13.0.0/include -internal-externc-isystem /usr/include -O2 -Wno-unused-parameter -Wwrite-strings -Wno-missing-field-initializers -Wno-long-long -Wno-comment -std=c++14 -fdeprecated-macro -fdebug-compilation-dir=/usr/src/gnu/usr.bin/clang/libclangSerialization/obj -ferror-limit 19 -fvisibility-inlines-hidden -fwrapv -stack-protector 2 -fno-rtti -fgnuc-version=4.2.1 -vectorize-loops -vectorize-slp -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-valloc -fno-builtin-free -fno-builtin-strdup -fno-builtin-strndup -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /home/ben/Projects/vmm/scan-build/2022-01-12-194120-40624-1 -x c++ /usr/src/gnu/usr.bin/clang/libclangSerialization/../../../llvm/clang/lib/Serialization/ASTReader.cpp

/usr/src/gnu/usr.bin/clang/libclangSerialization/../../../llvm/clang/lib/Serialization/ASTReader.cpp

1//===- ASTReader.cpp - AST File Reader ------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines the ASTReader class, which reads AST files.
10//
11//===----------------------------------------------------------------------===//
12
13#include "clang/Basic/OpenMPKinds.h"
14#include "clang/Serialization/ASTRecordReader.h"
15#include "ASTCommon.h"
16#include "ASTReaderInternals.h"
17#include "clang/AST/AbstractTypeReader.h"
18#include "clang/AST/ASTConsumer.h"
19#include "clang/AST/ASTContext.h"
20#include "clang/AST/ASTMutationListener.h"
21#include "clang/AST/ASTUnresolvedSet.h"
22#include "clang/AST/Decl.h"
23#include "clang/AST/DeclBase.h"
24#include "clang/AST/DeclCXX.h"
25#include "clang/AST/DeclFriend.h"
26#include "clang/AST/DeclGroup.h"
27#include "clang/AST/DeclObjC.h"
28#include "clang/AST/DeclTemplate.h"
29#include "clang/AST/DeclarationName.h"
30#include "clang/AST/Expr.h"
31#include "clang/AST/ExprCXX.h"
32#include "clang/AST/ExternalASTSource.h"
33#include "clang/AST/NestedNameSpecifier.h"
34#include "clang/AST/OpenMPClause.h"
35#include "clang/AST/ODRHash.h"
36#include "clang/AST/RawCommentList.h"
37#include "clang/AST/TemplateBase.h"
38#include "clang/AST/TemplateName.h"
39#include "clang/AST/Type.h"
40#include "clang/AST/TypeLoc.h"
41#include "clang/AST/TypeLocVisitor.h"
42#include "clang/AST/UnresolvedSet.h"
43#include "clang/Basic/CommentOptions.h"
44#include "clang/Basic/Diagnostic.h"
45#include "clang/Basic/DiagnosticOptions.h"
46#include "clang/Basic/ExceptionSpecificationType.h"
47#include "clang/Basic/FileManager.h"
48#include "clang/Basic/FileSystemOptions.h"
49#include "clang/Basic/IdentifierTable.h"
50#include "clang/Basic/LLVM.h"
51#include "clang/Basic/LangOptions.h"
52#include "clang/Basic/Module.h"
53#include "clang/Basic/ObjCRuntime.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/ContinuousRangeMap.h"
80#include "clang/Serialization/GlobalModuleIndex.h"
81#include "clang/Serialization/InMemoryModuleCache.h"
82#include "clang/Serialization/ModuleFile.h"
83#include "clang/Serialization/ModuleFileExtension.h"
84#include "clang/Serialization/ModuleManager.h"
85#include "clang/Serialization/PCHContainerOperations.h"
86#include "clang/Serialization/SerializationDiagnostic.h"
87#include "llvm/ADT/APFloat.h"
88#include "llvm/ADT/APInt.h"
89#include "llvm/ADT/APSInt.h"
90#include "llvm/ADT/ArrayRef.h"
91#include "llvm/ADT/DenseMap.h"
92#include "llvm/ADT/FloatingPointMode.h"
93#include "llvm/ADT/FoldingSet.h"
94#include "llvm/ADT/Hashing.h"
95#include "llvm/ADT/IntrusiveRefCntPtr.h"
96#include "llvm/ADT/None.h"
97#include "llvm/ADT/Optional.h"
98#include "llvm/ADT/STLExtras.h"
99#include "llvm/ADT/ScopeExit.h"
100#include "llvm/ADT/SmallPtrSet.h"
101#include "llvm/ADT/SmallString.h"
102#include "llvm/ADT/SmallVector.h"
103#include "llvm/ADT/StringExtras.h"
104#include "llvm/ADT/StringMap.h"
105#include "llvm/ADT/StringRef.h"
106#include "llvm/ADT/Triple.h"
107#include "llvm/ADT/iterator_range.h"
108#include "llvm/Bitstream/BitstreamReader.h"
109#include "llvm/Support/Casting.h"
110#include "llvm/Support/Compiler.h"
111#include "llvm/Support/Compression.h"
112#include "llvm/Support/DJB.h"
113#include "llvm/Support/Endian.h"
114#include "llvm/Support/Error.h"
115#include "llvm/Support/ErrorHandling.h"
116#include "llvm/Support/FileSystem.h"
117#include "llvm/Support/LEB128.h"
118#include "llvm/Support/MemoryBuffer.h"
119#include "llvm/Support/Path.h"
120#include "llvm/Support/SaveAndRestore.h"
121#include "llvm/Support/Timer.h"
122#include "llvm/Support/VersionTuple.h"
123#include "llvm/Support/raw_ostream.h"
124#include <algorithm>
125#include <cassert>
126#include <cstddef>
127#include <cstdint>
128#include <cstdio>
129#include <ctime>
130#include <iterator>
131#include <limits>
132#include <map>
133#include <memory>
134#include <string>
135#include <system_error>
136#include <tuple>
137#include <utility>
138#include <vector>
139
140using namespace clang;
141using namespace clang::serialization;
142using namespace clang::serialization::reader;
143using llvm::BitstreamCursor;
144using llvm::RoundingMode;
145
146//===----------------------------------------------------------------------===//
147// ChainedASTReaderListener implementation
148//===----------------------------------------------------------------------===//
149
150bool
151ChainedASTReaderListener::ReadFullVersionInformation(StringRef FullVersion) {
152 return First->ReadFullVersionInformation(FullVersion) ||
153 Second->ReadFullVersionInformation(FullVersion);
154}
155
156void ChainedASTReaderListener::ReadModuleName(StringRef ModuleName) {
157 First->ReadModuleName(ModuleName);
158 Second->ReadModuleName(ModuleName);
159}
160
161void ChainedASTReaderListener::ReadModuleMapFile(StringRef ModuleMapPath) {
162 First->ReadModuleMapFile(ModuleMapPath);
163 Second->ReadModuleMapFile(ModuleMapPath);
164}
165
166bool
167ChainedASTReaderListener::ReadLanguageOptions(const LangOptions &LangOpts,
168 bool Complain,
169 bool AllowCompatibleDifferences) {
170 return First->ReadLanguageOptions(LangOpts, Complain,
171 AllowCompatibleDifferences) ||
172 Second->ReadLanguageOptions(LangOpts, Complain,
173 AllowCompatibleDifferences);
174}
175
176bool ChainedASTReaderListener::ReadTargetOptions(
177 const TargetOptions &TargetOpts, bool Complain,
178 bool AllowCompatibleDifferences) {
179 return First->ReadTargetOptions(TargetOpts, Complain,
180 AllowCompatibleDifferences) ||
181 Second->ReadTargetOptions(TargetOpts, Complain,
182 AllowCompatibleDifferences);
183}
184
185bool ChainedASTReaderListener::ReadDiagnosticOptions(
186 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) {
187 return First->ReadDiagnosticOptions(DiagOpts, Complain) ||
188 Second->ReadDiagnosticOptions(DiagOpts, Complain);
189}
190
191bool
192ChainedASTReaderListener::ReadFileSystemOptions(const FileSystemOptions &FSOpts,
193 bool Complain) {
194 return First->ReadFileSystemOptions(FSOpts, Complain) ||
195 Second->ReadFileSystemOptions(FSOpts, Complain);
196}
197
198bool ChainedASTReaderListener::ReadHeaderSearchOptions(
199 const HeaderSearchOptions &HSOpts, StringRef SpecificModuleCachePath,
200 bool Complain) {
201 return First->ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
202 Complain) ||
203 Second->ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
204 Complain);
205}
206
207bool ChainedASTReaderListener::ReadPreprocessorOptions(
208 const PreprocessorOptions &PPOpts, bool Complain,
209 std::string &SuggestedPredefines) {
210 return First->ReadPreprocessorOptions(PPOpts, Complain,
211 SuggestedPredefines) ||
212 Second->ReadPreprocessorOptions(PPOpts, Complain, SuggestedPredefines);
213}
214
215void ChainedASTReaderListener::ReadCounter(const serialization::ModuleFile &M,
216 unsigned Value) {
217 First->ReadCounter(M, Value);
218 Second->ReadCounter(M, Value);
219}
220
221bool ChainedASTReaderListener::needsInputFileVisitation() {
222 return First->needsInputFileVisitation() ||
223 Second->needsInputFileVisitation();
224}
225
226bool ChainedASTReaderListener::needsSystemInputFileVisitation() {
227 return First->needsSystemInputFileVisitation() ||
228 Second->needsSystemInputFileVisitation();
229}
230
231void ChainedASTReaderListener::visitModuleFile(StringRef Filename,
232 ModuleKind Kind) {
233 First->visitModuleFile(Filename, Kind);
234 Second->visitModuleFile(Filename, Kind);
235}
236
237bool ChainedASTReaderListener::visitInputFile(StringRef Filename,
238 bool isSystem,
239 bool isOverridden,
240 bool isExplicitModule) {
241 bool Continue = false;
242 if (First->needsInputFileVisitation() &&
243 (!isSystem || First->needsSystemInputFileVisitation()))
244 Continue |= First->visitInputFile(Filename, isSystem, isOverridden,
245 isExplicitModule);
246 if (Second->needsInputFileVisitation() &&
247 (!isSystem || Second->needsSystemInputFileVisitation()))
248 Continue |= Second->visitInputFile(Filename, isSystem, isOverridden,
249 isExplicitModule);
250 return Continue;
251}
252
253void ChainedASTReaderListener::readModuleFileExtension(
254 const ModuleFileExtensionMetadata &Metadata) {
255 First->readModuleFileExtension(Metadata);
256 Second->readModuleFileExtension(Metadata);
257}
258
259//===----------------------------------------------------------------------===//
260// PCH validator implementation
261//===----------------------------------------------------------------------===//
262
263ASTReaderListener::~ASTReaderListener() = default;
264
265/// Compare the given set of language options against an existing set of
266/// language options.
267///
268/// \param Diags If non-NULL, diagnostics will be emitted via this engine.
269/// \param AllowCompatibleDifferences If true, differences between compatible
270/// language options will be permitted.
271///
272/// \returns true if the languagae options mis-match, false otherwise.
273static bool checkLanguageOptions(const LangOptions &LangOpts,
274 const LangOptions &ExistingLangOpts,
275 DiagnosticsEngine *Diags,
276 bool AllowCompatibleDifferences = true) {
277#define LANGOPT(Name, Bits, Default, Description) \
278 if (ExistingLangOpts.Name != LangOpts.Name) { \
279 if (Diags) \
280 Diags->Report(diag::err_pch_langopt_mismatch) \
281 << Description << LangOpts.Name << ExistingLangOpts.Name; \
282 return true; \
283 }
284
285#define VALUE_LANGOPT(Name, Bits, Default, Description) \
286 if (ExistingLangOpts.Name != LangOpts.Name) { \
287 if (Diags) \
288 Diags->Report(diag::err_pch_langopt_value_mismatch) \
289 << Description; \
290 return true; \
291 }
292
293#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
294 if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \
295 if (Diags) \
296 Diags->Report(diag::err_pch_langopt_value_mismatch) \
297 << Description; \
298 return true; \
299 }
300
301#define COMPATIBLE_LANGOPT(Name, Bits, Default, Description) \
302 if (!AllowCompatibleDifferences) \
303 LANGOPT(Name, Bits, Default, Description)
304
305#define COMPATIBLE_ENUM_LANGOPT(Name, Bits, Default, Description) \
306 if (!AllowCompatibleDifferences) \
307 ENUM_LANGOPT(Name, Bits, Default, Description)
308
309#define COMPATIBLE_VALUE_LANGOPT(Name, Bits, Default, Description) \
310 if (!AllowCompatibleDifferences) \
311 VALUE_LANGOPT(Name, Bits, Default, Description)
312
313#define BENIGN_LANGOPT(Name, Bits, Default, Description)
314#define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description)
315#define BENIGN_VALUE_LANGOPT(Name, Type, Bits, Default, Description)
316#include "clang/Basic/LangOptions.def"
317
318 if (ExistingLangOpts.ModuleFeatures != LangOpts.ModuleFeatures) {
319 if (Diags)
320 Diags->Report(diag::err_pch_langopt_value_mismatch) << "module features";
321 return true;
322 }
323
324 if (ExistingLangOpts.ObjCRuntime != LangOpts.ObjCRuntime) {
325 if (Diags)
326 Diags->Report(diag::err_pch_langopt_value_mismatch)
327 << "target Objective-C runtime";
328 return true;
329 }
330
331 if (ExistingLangOpts.CommentOpts.BlockCommandNames !=
332 LangOpts.CommentOpts.BlockCommandNames) {
333 if (Diags)
334 Diags->Report(diag::err_pch_langopt_value_mismatch)
335 << "block command names";
336 return true;
337 }
338
339 // Sanitizer feature mismatches are treated as compatible differences. If
340 // compatible differences aren't allowed, we still only want to check for
341 // mismatches of non-modular sanitizers (the only ones which can affect AST
342 // generation).
343 if (!AllowCompatibleDifferences) {
344 SanitizerMask ModularSanitizers = getPPTransparentSanitizers();
345 SanitizerSet ExistingSanitizers = ExistingLangOpts.Sanitize;
346 SanitizerSet ImportedSanitizers = LangOpts.Sanitize;
347 ExistingSanitizers.clear(ModularSanitizers);
348 ImportedSanitizers.clear(ModularSanitizers);
349 if (ExistingSanitizers.Mask != ImportedSanitizers.Mask) {
350 const std::string Flag = "-fsanitize=";
351 if (Diags) {
352#define SANITIZER(NAME, ID) \
353 { \
354 bool InExistingModule = ExistingSanitizers.has(SanitizerKind::ID); \
355 bool InImportedModule = ImportedSanitizers.has(SanitizerKind::ID); \
356 if (InExistingModule != InImportedModule) \
357 Diags->Report(diag::err_pch_targetopt_feature_mismatch) \
358 << InExistingModule << (Flag + NAME); \
359 }
360#include "clang/Basic/Sanitizers.def"
361 }
362 return true;
363 }
364 }
365
366 return false;
367}
368
369/// Compare the given set of target options against an existing set of
370/// target options.
371///
372/// \param Diags If non-NULL, diagnostics will be emitted via this engine.
373///
374/// \returns true if the target options mis-match, false otherwise.
375static bool checkTargetOptions(const TargetOptions &TargetOpts,
376 const TargetOptions &ExistingTargetOpts,
377 DiagnosticsEngine *Diags,
378 bool AllowCompatibleDifferences = true) {
379#define CHECK_TARGET_OPT(Field, Name) \
380 if (TargetOpts.Field != ExistingTargetOpts.Field) { \
381 if (Diags) \
382 Diags->Report(diag::err_pch_targetopt_mismatch) \
383 << Name << TargetOpts.Field << ExistingTargetOpts.Field; \
384 return true; \
385 }
386
387 // The triple and ABI must match exactly.
388 CHECK_TARGET_OPT(Triple, "target");
389 CHECK_TARGET_OPT(ABI, "target ABI");
390
391 // We can tolerate different CPUs in many cases, notably when one CPU
392 // supports a strict superset of another. When allowing compatible
393 // differences skip this check.
394 if (!AllowCompatibleDifferences) {
395 CHECK_TARGET_OPT(CPU, "target CPU");
396 CHECK_TARGET_OPT(TuneCPU, "tune CPU");
397 }
398
399#undef CHECK_TARGET_OPT
400
401 // Compare feature sets.
402 SmallVector<StringRef, 4> ExistingFeatures(
403 ExistingTargetOpts.FeaturesAsWritten.begin(),
404 ExistingTargetOpts.FeaturesAsWritten.end());
405 SmallVector<StringRef, 4> ReadFeatures(TargetOpts.FeaturesAsWritten.begin(),
406 TargetOpts.FeaturesAsWritten.end());
407 llvm::sort(ExistingFeatures);
408 llvm::sort(ReadFeatures);
409
410 // We compute the set difference in both directions explicitly so that we can
411 // diagnose the differences differently.
412 SmallVector<StringRef, 4> UnmatchedExistingFeatures, UnmatchedReadFeatures;
413 std::set_difference(
414 ExistingFeatures.begin(), ExistingFeatures.end(), ReadFeatures.begin(),
415 ReadFeatures.end(), std::back_inserter(UnmatchedExistingFeatures));
416 std::set_difference(ReadFeatures.begin(), ReadFeatures.end(),
417 ExistingFeatures.begin(), ExistingFeatures.end(),
418 std::back_inserter(UnmatchedReadFeatures));
419
420 // If we are allowing compatible differences and the read feature set is
421 // a strict subset of the existing feature set, there is nothing to diagnose.
422 if (AllowCompatibleDifferences && UnmatchedReadFeatures.empty())
423 return false;
424
425 if (Diags) {
426 for (StringRef Feature : UnmatchedReadFeatures)
427 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
428 << /* is-existing-feature */ false << Feature;
429 for (StringRef Feature : UnmatchedExistingFeatures)
430 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
431 << /* is-existing-feature */ true << Feature;
432 }
433
434 return !UnmatchedReadFeatures.empty() || !UnmatchedExistingFeatures.empty();
435}
436
437bool
438PCHValidator::ReadLanguageOptions(const LangOptions &LangOpts,
439 bool Complain,
440 bool AllowCompatibleDifferences) {
441 const LangOptions &ExistingLangOpts = PP.getLangOpts();
442 return checkLanguageOptions(LangOpts, ExistingLangOpts,
443 Complain ? &Reader.Diags : nullptr,
444 AllowCompatibleDifferences);
445}
446
447bool PCHValidator::ReadTargetOptions(const TargetOptions &TargetOpts,
448 bool Complain,
449 bool AllowCompatibleDifferences) {
450 const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts();
451 return checkTargetOptions(TargetOpts, ExistingTargetOpts,
452 Complain ? &Reader.Diags : nullptr,
453 AllowCompatibleDifferences);
454}
455
456namespace {
457
458using MacroDefinitionsMap =
459 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/>>;
460using DeclsMap = llvm::DenseMap<DeclarationName, SmallVector<NamedDecl *, 8>>;
461
462} // namespace
463
464static bool checkDiagnosticGroupMappings(DiagnosticsEngine &StoredDiags,
465 DiagnosticsEngine &Diags,
466 bool Complain) {
467 using Level = DiagnosticsEngine::Level;
468
469 // Check current mappings for new -Werror mappings, and the stored mappings
470 // for cases that were explicitly mapped to *not* be errors that are now
471 // errors because of options like -Werror.
472 DiagnosticsEngine *MappingSources[] = { &Diags, &StoredDiags };
473
474 for (DiagnosticsEngine *MappingSource : MappingSources) {
475 for (auto DiagIDMappingPair : MappingSource->getDiagnosticMappings()) {
476 diag::kind DiagID = DiagIDMappingPair.first;
477 Level CurLevel = Diags.getDiagnosticLevel(DiagID, SourceLocation());
478 if (CurLevel < DiagnosticsEngine::Error)
479 continue; // not significant
480 Level StoredLevel =
481 StoredDiags.getDiagnosticLevel(DiagID, SourceLocation());
482 if (StoredLevel < DiagnosticsEngine::Error) {
483 if (Complain)
484 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror=" +
485 Diags.getDiagnosticIDs()->getWarningOptionForDiag(DiagID).str();
486 return true;
487 }
488 }
489 }
490
491 return false;
492}
493
494static bool isExtHandlingFromDiagsError(DiagnosticsEngine &Diags) {
495 diag::Severity Ext = Diags.getExtensionHandlingBehavior();
496 if (Ext == diag::Severity::Warning && Diags.getWarningsAsErrors())
497 return true;
498 return Ext >= diag::Severity::Error;
499}
500
501static bool checkDiagnosticMappings(DiagnosticsEngine &StoredDiags,
502 DiagnosticsEngine &Diags,
503 bool IsSystem, bool Complain) {
504 // Top-level options
505 if (IsSystem) {
506 if (Diags.getSuppressSystemWarnings())
507 return false;
508 // If -Wsystem-headers was not enabled before, be conservative
509 if (StoredDiags.getSuppressSystemWarnings()) {
510 if (Complain)
511 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Wsystem-headers";
512 return true;
513 }
514 }
515
516 if (Diags.getWarningsAsErrors() && !StoredDiags.getWarningsAsErrors()) {
517 if (Complain)
518 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror";
519 return true;
520 }
521
522 if (Diags.getWarningsAsErrors() && Diags.getEnableAllWarnings() &&
523 !StoredDiags.getEnableAllWarnings()) {
524 if (Complain)
525 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Weverything -Werror";
526 return true;
527 }
528
529 if (isExtHandlingFromDiagsError(Diags) &&
530 !isExtHandlingFromDiagsError(StoredDiags)) {
531 if (Complain)
532 Diags.Report(diag::err_pch_diagopt_mismatch) << "-pedantic-errors";
533 return true;
534 }
535
536 return checkDiagnosticGroupMappings(StoredDiags, Diags, Complain);
537}
538
539/// Return the top import module if it is implicit, nullptr otherwise.
540static Module *getTopImportImplicitModule(ModuleManager &ModuleMgr,
541 Preprocessor &PP) {
542 // If the original import came from a file explicitly generated by the user,
543 // don't check the diagnostic mappings.
544 // FIXME: currently this is approximated by checking whether this is not a
545 // module import of an implicitly-loaded module file.
546 // Note: ModuleMgr.rbegin() may not be the current module, but it must be in
547 // the transitive closure of its imports, since unrelated modules cannot be
548 // imported until after this module finishes validation.
549 ModuleFile *TopImport = &*ModuleMgr.rbegin();
550 while (!TopImport->ImportedBy.empty())
551 TopImport = TopImport->ImportedBy[0];
552 if (TopImport->Kind != MK_ImplicitModule)
553 return nullptr;
554
555 StringRef ModuleName = TopImport->ModuleName;
556 assert(!ModuleName.empty() && "diagnostic options read before module name")((void)0);
557
558 Module *M = PP.getHeaderSearchInfo().lookupModule(ModuleName);
559 assert(M && "missing module")((void)0);
560 return M;
561}
562
563bool PCHValidator::ReadDiagnosticOptions(
564 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) {
565 DiagnosticsEngine &ExistingDiags = PP.getDiagnostics();
566 IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(ExistingDiags.getDiagnosticIDs());
567 IntrusiveRefCntPtr<DiagnosticsEngine> Diags(
568 new DiagnosticsEngine(DiagIDs, DiagOpts.get()));
569 // This should never fail, because we would have processed these options
570 // before writing them to an ASTFile.
571 ProcessWarningOptions(*Diags, *DiagOpts, /*Report*/false);
572
573 ModuleManager &ModuleMgr = Reader.getModuleManager();
574 assert(ModuleMgr.size() >= 1 && "what ASTFile is this then")((void)0);
575
576 Module *TopM = getTopImportImplicitModule(ModuleMgr, PP);
577 if (!TopM)
578 return false;
579
580 // FIXME: if the diagnostics are incompatible, save a DiagnosticOptions that
581 // contains the union of their flags.
582 return checkDiagnosticMappings(*Diags, ExistingDiags, TopM->IsSystem,
583 Complain);
584}
585
586/// Collect the macro definitions provided by the given preprocessor
587/// options.
588static void
589collectMacroDefinitions(const PreprocessorOptions &PPOpts,
590 MacroDefinitionsMap &Macros,
591 SmallVectorImpl<StringRef> *MacroNames = nullptr) {
592 for (unsigned I = 0, N = PPOpts.Macros.size(); I != N; ++I) {
593 StringRef Macro = PPOpts.Macros[I].first;
594 bool IsUndef = PPOpts.Macros[I].second;
595
596 std::pair<StringRef, StringRef> MacroPair = Macro.split('=');
597 StringRef MacroName = MacroPair.first;
598 StringRef MacroBody = MacroPair.second;
599
600 // For an #undef'd macro, we only care about the name.
601 if (IsUndef) {
602 if (MacroNames && !Macros.count(MacroName))
603 MacroNames->push_back(MacroName);
604
605 Macros[MacroName] = std::make_pair("", true);
606 continue;
607 }
608
609 // For a #define'd macro, figure out the actual definition.
610 if (MacroName.size() == Macro.size())
611 MacroBody = "1";
612 else {
613 // Note: GCC drops anything following an end-of-line character.
614 StringRef::size_type End = MacroBody.find_first_of("\n\r");
615 MacroBody = MacroBody.substr(0, End);
616 }
617
618 if (MacroNames && !Macros.count(MacroName))
619 MacroNames->push_back(MacroName);
620 Macros[MacroName] = std::make_pair(MacroBody, false);
621 }
622}
623
624/// Check the preprocessor options deserialized from the control block
625/// against the preprocessor options in an existing preprocessor.
626///
627/// \param Diags If non-null, produce diagnostics for any mismatches incurred.
628/// \param Validate If true, validate preprocessor options. If false, allow
629/// macros defined by \p ExistingPPOpts to override those defined by
630/// \p PPOpts in SuggestedPredefines.
631static bool checkPreprocessorOptions(const PreprocessorOptions &PPOpts,
632 const PreprocessorOptions &ExistingPPOpts,
633 DiagnosticsEngine *Diags,
634 FileManager &FileMgr,
635 std::string &SuggestedPredefines,
636 const LangOptions &LangOpts,
637 bool Validate = true) {
638 // Check macro definitions.
639 MacroDefinitionsMap ASTFileMacros;
640 collectMacroDefinitions(PPOpts, ASTFileMacros);
641 MacroDefinitionsMap ExistingMacros;
642 SmallVector<StringRef, 4> ExistingMacroNames;
643 collectMacroDefinitions(ExistingPPOpts, ExistingMacros, &ExistingMacroNames);
644
645 for (unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) {
646 // Dig out the macro definition in the existing preprocessor options.
647 StringRef MacroName = ExistingMacroNames[I];
648 std::pair<StringRef, bool> Existing = ExistingMacros[MacroName];
649
650 // Check whether we know anything about this macro name or not.
651 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/>>::iterator Known =
652 ASTFileMacros.find(MacroName);
653 if (!Validate || Known == ASTFileMacros.end()) {
654 // FIXME: Check whether this identifier was referenced anywhere in the
655 // AST file. If so, we should reject the AST file. Unfortunately, this
656 // information isn't in the control block. What shall we do about it?
657
658 if (Existing.second) {
659 SuggestedPredefines += "#undef ";
660 SuggestedPredefines += MacroName.str();
661 SuggestedPredefines += '\n';
662 } else {
663 SuggestedPredefines += "#define ";
664 SuggestedPredefines += MacroName.str();
665 SuggestedPredefines += ' ';
666 SuggestedPredefines += Existing.first.str();
667 SuggestedPredefines += '\n';
668 }
669 continue;
670 }
671
672 // If the macro was defined in one but undef'd in the other, we have a
673 // conflict.
674 if (Existing.second != Known->second.second) {
675 if (Diags) {
676 Diags->Report(diag::err_pch_macro_def_undef)
677 << MacroName << Known->second.second;
678 }
679 return true;
680 }
681
682 // If the macro was #undef'd in both, or if the macro bodies are identical,
683 // it's fine.
684 if (Existing.second || Existing.first == Known->second.first)
685 continue;
686
687 // The macro bodies differ; complain.
688 if (Diags) {
689 Diags->Report(diag::err_pch_macro_def_conflict)
690 << MacroName << Known->second.first << Existing.first;
691 }
692 return true;
693 }
694
695 // Check whether we're using predefines.
696 if (PPOpts.UsePredefines != ExistingPPOpts.UsePredefines && Validate) {
697 if (Diags) {
698 Diags->Report(diag::err_pch_undef) << ExistingPPOpts.UsePredefines;
699 }
700 return true;
701 }
702
703 // Detailed record is important since it is used for the module cache hash.
704 if (LangOpts.Modules &&
705 PPOpts.DetailedRecord != ExistingPPOpts.DetailedRecord && Validate) {
706 if (Diags) {
707 Diags->Report(diag::err_pch_pp_detailed_record) << PPOpts.DetailedRecord;
708 }
709 return true;
710 }
711
712 // Compute the #include and #include_macros lines we need.
713 for (unsigned I = 0, N = ExistingPPOpts.Includes.size(); I != N; ++I) {
714 StringRef File = ExistingPPOpts.Includes[I];
715
716 if (!ExistingPPOpts.ImplicitPCHInclude.empty() &&
717 !ExistingPPOpts.PCHThroughHeader.empty()) {
718 // In case the through header is an include, we must add all the includes
719 // to the predefines so the start point can be determined.
720 SuggestedPredefines += "#include \"";
721 SuggestedPredefines += File;
722 SuggestedPredefines += "\"\n";
723 continue;
724 }
725
726 if (File == ExistingPPOpts.ImplicitPCHInclude)
727 continue;
728
729 if (std::find(PPOpts.Includes.begin(), PPOpts.Includes.end(), File)
730 != PPOpts.Includes.end())
731 continue;
732
733 SuggestedPredefines += "#include \"";
734 SuggestedPredefines += File;
735 SuggestedPredefines += "\"\n";
736 }
737
738 for (unsigned I = 0, N = ExistingPPOpts.MacroIncludes.size(); I != N; ++I) {
739 StringRef File = ExistingPPOpts.MacroIncludes[I];
740 if (std::find(PPOpts.MacroIncludes.begin(), PPOpts.MacroIncludes.end(),
741 File)
742 != PPOpts.MacroIncludes.end())
743 continue;
744
745 SuggestedPredefines += "#__include_macros \"";
746 SuggestedPredefines += File;
747 SuggestedPredefines += "\"\n##\n";
748 }
749
750 return false;
751}
752
753bool PCHValidator::ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
754 bool Complain,
755 std::string &SuggestedPredefines) {
756 const PreprocessorOptions &ExistingPPOpts = PP.getPreprocessorOpts();
757
758 return checkPreprocessorOptions(PPOpts, ExistingPPOpts,
759 Complain? &Reader.Diags : nullptr,
760 PP.getFileManager(),
761 SuggestedPredefines,
762 PP.getLangOpts());
763}
764
765bool SimpleASTReaderListener::ReadPreprocessorOptions(
766 const PreprocessorOptions &PPOpts,
767 bool Complain,
768 std::string &SuggestedPredefines) {
769 return checkPreprocessorOptions(PPOpts,
770 PP.getPreprocessorOpts(),
771 nullptr,
772 PP.getFileManager(),
773 SuggestedPredefines,
774 PP.getLangOpts(),
775 false);
776}
777
778/// Check the header search options deserialized from the control block
779/// against the header search options in an existing preprocessor.
780///
781/// \param Diags If non-null, produce diagnostics for any mismatches incurred.
782static bool checkHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
783 StringRef SpecificModuleCachePath,
784 StringRef ExistingModuleCachePath,
785 DiagnosticsEngine *Diags,
786 const LangOptions &LangOpts,
787 const PreprocessorOptions &PPOpts) {
788 if (LangOpts.Modules) {
789 if (SpecificModuleCachePath != ExistingModuleCachePath &&
790 !PPOpts.AllowPCHWithDifferentModulesCachePath) {
791 if (Diags)
792 Diags->Report(diag::err_pch_modulecache_mismatch)
793 << SpecificModuleCachePath << ExistingModuleCachePath;
794 return true;
795 }
796 }
797
798 return false;
799}
800
801bool PCHValidator::ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
802 StringRef SpecificModuleCachePath,
803 bool Complain) {
804 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
805 PP.getHeaderSearchInfo().getModuleCachePath(),
806 Complain ? &Reader.Diags : nullptr,
807 PP.getLangOpts(), PP.getPreprocessorOpts());
808}
809
810void PCHValidator::ReadCounter(const ModuleFile &M, unsigned Value) {
811 PP.setCounterValue(Value);
812}
813
814//===----------------------------------------------------------------------===//
815// AST reader implementation
816//===----------------------------------------------------------------------===//
817
818static uint64_t readULEB(const unsigned char *&P) {
819 unsigned Length = 0;
820 const char *Error = nullptr;
821
822 uint64_t Val = llvm::decodeULEB128(P, &Length, nullptr, &Error);
823 if (Error)
824 llvm::report_fatal_error(Error);
825 P += Length;
826 return Val;
827}
828
829/// Read ULEB-encoded key length and data length.
830static std::pair<unsigned, unsigned>
831readULEBKeyDataLength(const unsigned char *&P) {
832 unsigned KeyLen = readULEB(P);
833 if ((unsigned)KeyLen != KeyLen)
834 llvm::report_fatal_error("key too large");
835
836 unsigned DataLen = readULEB(P);
837 if ((unsigned)DataLen != DataLen)
838 llvm::report_fatal_error("data too large");
839
840 return std::make_pair(KeyLen, DataLen);
841}
842
843void ASTReader::setDeserializationListener(ASTDeserializationListener *Listener,
844 bool TakeOwnership) {
845 DeserializationListener = Listener;
846 OwnsDeserializationListener = TakeOwnership;
847}
848
849unsigned ASTSelectorLookupTrait::ComputeHash(Selector Sel) {
850 return serialization::ComputeHash(Sel);
851}
852
853std::pair<unsigned, unsigned>
854ASTSelectorLookupTrait::ReadKeyDataLength(const unsigned char*& d) {
855 return readULEBKeyDataLength(d);
856}
857
858ASTSelectorLookupTrait::internal_key_type
859ASTSelectorLookupTrait::ReadKey(const unsigned char* d, unsigned) {
860 using namespace llvm::support;
861
862 SelectorTable &SelTable = Reader.getContext().Selectors;
863 unsigned N = endian::readNext<uint16_t, little, unaligned>(d);
864 IdentifierInfo *FirstII = Reader.getLocalIdentifier(
865 F, endian::readNext<uint32_t, little, unaligned>(d));
866 if (N == 0)
867 return SelTable.getNullarySelector(FirstII);
868 else if (N == 1)
869 return SelTable.getUnarySelector(FirstII);
870
871 SmallVector<IdentifierInfo *, 16> Args;
872 Args.push_back(FirstII);
873 for (unsigned I = 1; I != N; ++I)
874 Args.push_back(Reader.getLocalIdentifier(
875 F, endian::readNext<uint32_t, little, unaligned>(d)));
876
877 return SelTable.getSelector(N, Args.data());
878}
879
880ASTSelectorLookupTrait::data_type
881ASTSelectorLookupTrait::ReadData(Selector, const unsigned char* d,
882 unsigned DataLen) {
883 using namespace llvm::support;
884
885 data_type Result;
886
887 Result.ID = Reader.getGlobalSelectorID(
888 F, endian::readNext<uint32_t, little, unaligned>(d));
889 unsigned FullInstanceBits = endian::readNext<uint16_t, little, unaligned>(d);
890 unsigned FullFactoryBits = endian::readNext<uint16_t, little, unaligned>(d);
891 Result.InstanceBits = FullInstanceBits & 0x3;
892 Result.InstanceHasMoreThanOneDecl = (FullInstanceBits >> 2) & 0x1;
893 Result.FactoryBits = FullFactoryBits & 0x3;
894 Result.FactoryHasMoreThanOneDecl = (FullFactoryBits >> 2) & 0x1;
895 unsigned NumInstanceMethods = FullInstanceBits >> 3;
896 unsigned NumFactoryMethods = FullFactoryBits >> 3;
897
898 // Load instance methods
899 for (unsigned I = 0; I != NumInstanceMethods; ++I) {
900 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
901 F, endian::readNext<uint32_t, little, unaligned>(d)))
902 Result.Instance.push_back(Method);
903 }
904
905 // Load factory methods
906 for (unsigned I = 0; I != NumFactoryMethods; ++I) {
907 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
908 F, endian::readNext<uint32_t, little, unaligned>(d)))
909 Result.Factory.push_back(Method);
910 }
911
912 return Result;
913}
914
915unsigned ASTIdentifierLookupTraitBase::ComputeHash(const internal_key_type& a) {
916 return llvm::djbHash(a);
917}
918
919std::pair<unsigned, unsigned>
920ASTIdentifierLookupTraitBase::ReadKeyDataLength(const unsigned char*& d) {
921 return readULEBKeyDataLength(d);
922}
923
924ASTIdentifierLookupTraitBase::internal_key_type
925ASTIdentifierLookupTraitBase::ReadKey(const unsigned char* d, unsigned n) {
926 assert(n >= 2 && d[n-1] == '\0')((void)0);
927 return StringRef((const char*) d, n-1);
928}
929
930/// Whether the given identifier is "interesting".
931static bool isInterestingIdentifier(ASTReader &Reader, IdentifierInfo &II,
932 bool IsModule) {
933 return II.hadMacroDefinition() || II.isPoisoned() ||
934 (!IsModule && II.getObjCOrBuiltinID()) ||
935 II.hasRevertedTokenIDToIdentifier() ||
936 (!(IsModule && Reader.getPreprocessor().getLangOpts().CPlusPlus) &&
937 II.getFETokenInfo());
938}
939
940static bool readBit(unsigned &Bits) {
941 bool Value = Bits & 0x1;
942 Bits >>= 1;
943 return Value;
944}
945
946IdentID ASTIdentifierLookupTrait::ReadIdentifierID(const unsigned char *d) {
947 using namespace llvm::support;
948
949 unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d);
950 return Reader.getGlobalIdentifierID(F, RawID >> 1);
951}
952
953static void markIdentifierFromAST(ASTReader &Reader, IdentifierInfo &II) {
954 if (!II.isFromAST()) {
955 II.setIsFromAST();
956 bool IsModule = Reader.getPreprocessor().getCurrentModule() != nullptr;
957 if (isInterestingIdentifier(Reader, II, IsModule))
958 II.setChangedSinceDeserialization();
959 }
960}
961
962IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k,
963 const unsigned char* d,
964 unsigned DataLen) {
965 using namespace llvm::support;
966
967 unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d);
968 bool IsInteresting = RawID & 0x01;
969
970 // Wipe out the "is interesting" bit.
971 RawID = RawID >> 1;
972
973 // Build the IdentifierInfo and link the identifier ID with it.
974 IdentifierInfo *II = KnownII;
975 if (!II) {
976 II = &Reader.getIdentifierTable().getOwn(k);
977 KnownII = II;
978 }
979 markIdentifierFromAST(Reader, *II);
980 Reader.markIdentifierUpToDate(II);
981
982 IdentID ID = Reader.getGlobalIdentifierID(F, RawID);
983 if (!IsInteresting) {
984 // For uninteresting identifiers, there's nothing else to do. Just notify
985 // the reader that we've finished loading this identifier.
986 Reader.SetIdentifierInfo(ID, II);
987 return II;
988 }
989
990 unsigned ObjCOrBuiltinID = endian::readNext<uint16_t, little, unaligned>(d);
991 unsigned Bits = endian::readNext<uint16_t, little, unaligned>(d);
992 bool CPlusPlusOperatorKeyword = readBit(Bits);
993 bool HasRevertedTokenIDToIdentifier = readBit(Bits);
994 bool Poisoned = readBit(Bits);
995 bool ExtensionToken = readBit(Bits);
996 bool HadMacroDefinition = readBit(Bits);
997
998 assert(Bits == 0 && "Extra bits in the identifier?")((void)0);
999 DataLen -= 8;
1000
1001 // Set or check the various bits in the IdentifierInfo structure.
1002 // Token IDs are read-only.
1003 if (HasRevertedTokenIDToIdentifier && II->getTokenID() != tok::identifier)
1004 II->revertTokenIDToIdentifier();
1005 if (!F.isModule())
1006 II->setObjCOrBuiltinID(ObjCOrBuiltinID);
1007 assert(II->isExtensionToken() == ExtensionToken &&((void)0)
1008 "Incorrect extension token flag")((void)0);
1009 (void)ExtensionToken;
1010 if (Poisoned)
1011 II->setIsPoisoned(true);
1012 assert(II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword &&((void)0)
1013 "Incorrect C++ operator keyword flag")((void)0);
1014 (void)CPlusPlusOperatorKeyword;
1015
1016 // If this identifier is a macro, deserialize the macro
1017 // definition.
1018 if (HadMacroDefinition) {
1019 uint32_t MacroDirectivesOffset =
1020 endian::readNext<uint32_t, little, unaligned>(d);
1021 DataLen -= 4;
1022
1023 Reader.addPendingMacro(II, &F, MacroDirectivesOffset);
1024 }
1025
1026 Reader.SetIdentifierInfo(ID, II);
1027
1028 // Read all of the declarations visible at global scope with this
1029 // name.
1030 if (DataLen > 0) {
1031 SmallVector<uint32_t, 4> DeclIDs;
1032 for (; DataLen > 0; DataLen -= 4)
1033 DeclIDs.push_back(Reader.getGlobalDeclID(
1034 F, endian::readNext<uint32_t, little, unaligned>(d)));
1035 Reader.SetGloballyVisibleDecls(II, DeclIDs);
1036 }
1037
1038 return II;
1039}
1040
1041DeclarationNameKey::DeclarationNameKey(DeclarationName Name)
1042 : Kind(Name.getNameKind()) {
1043 switch (Kind) {
1044 case DeclarationName::Identifier:
1045 Data = (uint64_t)Name.getAsIdentifierInfo();
1046 break;
1047 case DeclarationName::ObjCZeroArgSelector:
1048 case DeclarationName::ObjCOneArgSelector:
1049 case DeclarationName::ObjCMultiArgSelector:
1050 Data = (uint64_t)Name.getObjCSelector().getAsOpaquePtr();
1051 break;
1052 case DeclarationName::CXXOperatorName:
1053 Data = Name.getCXXOverloadedOperator();
1054 break;
1055 case DeclarationName::CXXLiteralOperatorName:
1056 Data = (uint64_t)Name.getCXXLiteralIdentifier();
1057 break;
1058 case DeclarationName::CXXDeductionGuideName:
1059 Data = (uint64_t)Name.getCXXDeductionGuideTemplate()
1060 ->getDeclName().getAsIdentifierInfo();
1061 break;
1062 case DeclarationName::CXXConstructorName:
1063 case DeclarationName::CXXDestructorName:
1064 case DeclarationName::CXXConversionFunctionName:
1065 case DeclarationName::CXXUsingDirective:
1066 Data = 0;
1067 break;
1068 }
1069}
1070
1071unsigned DeclarationNameKey::getHash() const {
1072 llvm::FoldingSetNodeID ID;
1073 ID.AddInteger(Kind);
1074
1075 switch (Kind) {
1076 case DeclarationName::Identifier:
1077 case DeclarationName::CXXLiteralOperatorName:
1078 case DeclarationName::CXXDeductionGuideName:
1079 ID.AddString(((IdentifierInfo*)Data)->getName());
1080 break;
1081 case DeclarationName::ObjCZeroArgSelector:
1082 case DeclarationName::ObjCOneArgSelector:
1083 case DeclarationName::ObjCMultiArgSelector:
1084 ID.AddInteger(serialization::ComputeHash(Selector(Data)));
1085 break;
1086 case DeclarationName::CXXOperatorName:
1087 ID.AddInteger((OverloadedOperatorKind)Data);
1088 break;
1089 case DeclarationName::CXXConstructorName:
1090 case DeclarationName::CXXDestructorName:
1091 case DeclarationName::CXXConversionFunctionName:
1092 case DeclarationName::CXXUsingDirective:
1093 break;
1094 }
1095
1096 return ID.ComputeHash();
1097}
1098
1099ModuleFile *
1100ASTDeclContextNameLookupTrait::ReadFileRef(const unsigned char *&d) {
1101 using namespace llvm::support;
1102
1103 uint32_t ModuleFileID = endian::readNext<uint32_t, little, unaligned>(d);
1104 return Reader.getLocalModuleFile(F, ModuleFileID);
1105}
1106
1107std::pair<unsigned, unsigned>
1108ASTDeclContextNameLookupTrait::ReadKeyDataLength(const unsigned char *&d) {
1109 return readULEBKeyDataLength(d);
1110}
1111
1112ASTDeclContextNameLookupTrait::internal_key_type
1113ASTDeclContextNameLookupTrait::ReadKey(const unsigned char *d, unsigned) {
1114 using namespace llvm::support;
1115
1116 auto Kind = (DeclarationName::NameKind)*d++;
1117 uint64_t Data;
1118 switch (Kind) {
1119 case DeclarationName::Identifier:
1120 case DeclarationName::CXXLiteralOperatorName:
1121 case DeclarationName::CXXDeductionGuideName:
1122 Data = (uint64_t)Reader.getLocalIdentifier(
1123 F, endian::readNext<uint32_t, little, unaligned>(d));
1124 break;
1125 case DeclarationName::ObjCZeroArgSelector:
1126 case DeclarationName::ObjCOneArgSelector:
1127 case DeclarationName::ObjCMultiArgSelector:
1128 Data =
1129 (uint64_t)Reader.getLocalSelector(
1130 F, endian::readNext<uint32_t, little, unaligned>(
1131 d)).getAsOpaquePtr();
1132 break;
1133 case DeclarationName::CXXOperatorName:
1134 Data = *d++; // OverloadedOperatorKind
1135 break;
1136 case DeclarationName::CXXConstructorName:
1137 case DeclarationName::CXXDestructorName:
1138 case DeclarationName::CXXConversionFunctionName:
1139 case DeclarationName::CXXUsingDirective:
1140 Data = 0;
1141 break;
1142 }
1143
1144 return DeclarationNameKey(Kind, Data);
1145}
1146
1147void ASTDeclContextNameLookupTrait::ReadDataInto(internal_key_type,
1148 const unsigned char *d,
1149 unsigned DataLen,
1150 data_type_builder &Val) {
1151 using namespace llvm::support;
1152
1153 for (unsigned NumDecls = DataLen / 4; NumDecls; --NumDecls) {
1154 uint32_t LocalID = endian::readNext<uint32_t, little, unaligned>(d);
1155 Val.insert(Reader.getGlobalDeclID(F, LocalID));
1156 }
1157}
1158
1159bool ASTReader::ReadLexicalDeclContextStorage(ModuleFile &M,
1160 BitstreamCursor &Cursor,
1161 uint64_t Offset,
1162 DeclContext *DC) {
1163 assert(Offset != 0)((void)0);
1164
1165 SavedStreamPosition SavedPosition(Cursor);
1166 if (llvm::Error Err = Cursor.JumpToBit(Offset)) {
1167 Error(std::move(Err));
1168 return true;
1169 }
1170
1171 RecordData Record;
1172 StringRef Blob;
1173 Expected<unsigned> MaybeCode = Cursor.ReadCode();
1174 if (!MaybeCode) {
1175 Error(MaybeCode.takeError());
1176 return true;
1177 }
1178 unsigned Code = MaybeCode.get();
1179
1180 Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record, &Blob);
1181 if (!MaybeRecCode) {
1182 Error(MaybeRecCode.takeError());
1183 return true;
1184 }
1185 unsigned RecCode = MaybeRecCode.get();
1186 if (RecCode != DECL_CONTEXT_LEXICAL) {
1187 Error("Expected lexical block");
1188 return true;
1189 }
1190
1191 assert(!isa<TranslationUnitDecl>(DC) &&((void)0)
1192 "expected a TU_UPDATE_LEXICAL record for TU")((void)0);
1193 // If we are handling a C++ class template instantiation, we can see multiple
1194 // lexical updates for the same record. It's important that we select only one
1195 // of them, so that field numbering works properly. Just pick the first one we
1196 // see.
1197 auto &Lex = LexicalDecls[DC];
1198 if (!Lex.first) {
1199 Lex = std::make_pair(
1200 &M, llvm::makeArrayRef(
1201 reinterpret_cast<const llvm::support::unaligned_uint32_t *>(
1202 Blob.data()),
1203 Blob.size() / 4));
1204 }
1205 DC->setHasExternalLexicalStorage(true);
1206 return false;
1207}
1208
1209bool ASTReader::ReadVisibleDeclContextStorage(ModuleFile &M,
1210 BitstreamCursor &Cursor,
1211 uint64_t Offset,
1212 DeclID ID) {
1213 assert(Offset != 0)((void)0);
1214
1215 SavedStreamPosition SavedPosition(Cursor);
1216 if (llvm::Error Err = Cursor.JumpToBit(Offset)) {
1217 Error(std::move(Err));
1218 return true;
1219 }
1220
1221 RecordData Record;
1222 StringRef Blob;
1223 Expected<unsigned> MaybeCode = Cursor.ReadCode();
1224 if (!MaybeCode) {
1225 Error(MaybeCode.takeError());
1226 return true;
1227 }
1228 unsigned Code = MaybeCode.get();
1229
1230 Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record, &Blob);
1231 if (!MaybeRecCode) {
1232 Error(MaybeRecCode.takeError());
1233 return true;
1234 }
1235 unsigned RecCode = MaybeRecCode.get();
1236 if (RecCode != DECL_CONTEXT_VISIBLE) {
1237 Error("Expected visible lookup table block");
1238 return true;
1239 }
1240
1241 // We can't safely determine the primary context yet, so delay attaching the
1242 // lookup table until we're done with recursive deserialization.
1243 auto *Data = (const unsigned char*)Blob.data();
1244 PendingVisibleUpdates[ID].push_back(PendingVisibleUpdate{&M, Data});
1245 return false;
1246}
1247
1248void ASTReader::Error(StringRef Msg) const {
1249 Error(diag::err_fe_pch_malformed, Msg);
1250 if (PP.getLangOpts().Modules && !Diags.isDiagnosticInFlight() &&
1251 !PP.getHeaderSearchInfo().getModuleCachePath().empty()) {
1252 Diag(diag::note_module_cache_path)
1253 << PP.getHeaderSearchInfo().getModuleCachePath();
1254 }
1255}
1256
1257void ASTReader::Error(unsigned DiagID, StringRef Arg1, StringRef Arg2,
1258 StringRef Arg3) const {
1259 if (Diags.isDiagnosticInFlight())
1260 Diags.SetDelayedDiagnostic(DiagID, Arg1, Arg2, Arg3);
1261 else
1262 Diag(DiagID) << Arg1 << Arg2 << Arg3;
1263}
1264
1265void ASTReader::Error(llvm::Error &&Err) const {
1266 Error(toString(std::move(Err)));
1267}
1268
1269//===----------------------------------------------------------------------===//
1270// Source Manager Deserialization
1271//===----------------------------------------------------------------------===//
1272
1273/// Read the line table in the source manager block.
1274/// \returns true if there was an error.
1275bool ASTReader::ParseLineTable(ModuleFile &F,
1276 const RecordData &Record) {
1277 unsigned Idx = 0;
1278 LineTableInfo &LineTable = SourceMgr.getLineTable();
1279
1280 // Parse the file names
1281 std::map<int, int> FileIDs;
1282 FileIDs[-1] = -1; // For unspecified filenames.
1283 for (unsigned I = 0; Record[Idx]; ++I) {
1284 // Extract the file name
1285 auto Filename = ReadPath(F, Record, Idx);
1286 FileIDs[I] = LineTable.getLineTableFilenameID(Filename);
1287 }
1288 ++Idx;
1289
1290 // Parse the line entries
1291 std::vector<LineEntry> Entries;
1292 while (Idx < Record.size()) {
1293 int FID = Record[Idx++];
1294 assert(FID >= 0 && "Serialized line entries for non-local file.")((void)0);
1295 // Remap FileID from 1-based old view.
1296 FID += F.SLocEntryBaseID - 1;
1297
1298 // Extract the line entries
1299 unsigned NumEntries = Record[Idx++];
1300 assert(NumEntries && "no line entries for file ID")((void)0);
1301 Entries.clear();
1302 Entries.reserve(NumEntries);
1303 for (unsigned I = 0; I != NumEntries; ++I) {
1304 unsigned FileOffset = Record[Idx++];
1305 unsigned LineNo = Record[Idx++];
1306 int FilenameID = FileIDs[Record[Idx++]];
1307 SrcMgr::CharacteristicKind FileKind
1308 = (SrcMgr::CharacteristicKind)Record[Idx++];
1309 unsigned IncludeOffset = Record[Idx++];
1310 Entries.push_back(LineEntry::get(FileOffset, LineNo, FilenameID,
1311 FileKind, IncludeOffset));
1312 }
1313 LineTable.AddEntry(FileID::get(FID), Entries);
1314 }
1315
1316 return false;
1317}
1318
1319/// Read a source manager block
1320bool ASTReader::ReadSourceManagerBlock(ModuleFile &F) {
1321 using namespace SrcMgr;
1322
1323 BitstreamCursor &SLocEntryCursor = F.SLocEntryCursor;
1324
1325 // Set the source-location entry cursor to the current position in
1326 // the stream. This cursor will be used to read the contents of the
1327 // source manager block initially, and then lazily read
1328 // source-location entries as needed.
1329 SLocEntryCursor = F.Stream;
1330
1331 // The stream itself is going to skip over the source manager block.
1332 if (llvm::Error Err = F.Stream.SkipBlock()) {
1333 Error(std::move(Err));
1334 return true;
1335 }
1336
1337 // Enter the source manager block.
1338 if (llvm::Error Err =
1339 SLocEntryCursor.EnterSubBlock(SOURCE_MANAGER_BLOCK_ID)) {
1340 Error(std::move(Err));
1341 return true;
1342 }
1343 F.SourceManagerBlockStartOffset = SLocEntryCursor.GetCurrentBitNo();
1344
1345 RecordData Record;
1346 while (true) {
1347 Expected<llvm::BitstreamEntry> MaybeE =
1348 SLocEntryCursor.advanceSkippingSubblocks();
1349 if (!MaybeE) {
1350 Error(MaybeE.takeError());
1351 return true;
1352 }
1353 llvm::BitstreamEntry E = MaybeE.get();
1354
1355 switch (E.Kind) {
1356 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1357 case llvm::BitstreamEntry::Error:
1358 Error("malformed block record in AST file");
1359 return true;
1360 case llvm::BitstreamEntry::EndBlock:
1361 return false;
1362 case llvm::BitstreamEntry::Record:
1363 // The interesting case.
1364 break;
1365 }
1366
1367 // Read a record.
1368 Record.clear();
1369 StringRef Blob;
1370 Expected<unsigned> MaybeRecord =
1371 SLocEntryCursor.readRecord(E.ID, Record, &Blob);
1372 if (!MaybeRecord) {
1373 Error(MaybeRecord.takeError());
1374 return true;
1375 }
1376 switch (MaybeRecord.get()) {
1377 default: // Default behavior: ignore.
1378 break;
1379
1380 case SM_SLOC_FILE_ENTRY:
1381 case SM_SLOC_BUFFER_ENTRY:
1382 case SM_SLOC_EXPANSION_ENTRY:
1383 // Once we hit one of the source location entries, we're done.
1384 return false;
1385 }
1386 }
1387}
1388
1389/// If a header file is not found at the path that we expect it to be
1390/// and the PCH file was moved from its original location, try to resolve the
1391/// file by assuming that header+PCH were moved together and the header is in
1392/// the same place relative to the PCH.
1393static std::string
1394resolveFileRelativeToOriginalDir(const std::string &Filename,
1395 const std::string &OriginalDir,
1396 const std::string &CurrDir) {
1397 assert(OriginalDir != CurrDir &&((void)0)
1398 "No point trying to resolve the file if the PCH dir didn't change")((void)0);
1399
1400 using namespace llvm::sys;
1401
1402 SmallString<128> filePath(Filename);
1403 fs::make_absolute(filePath);
1404 assert(path::is_absolute(OriginalDir))((void)0);
1405 SmallString<128> currPCHPath(CurrDir);
1406
1407 path::const_iterator fileDirI = path::begin(path::parent_path(filePath)),
1408 fileDirE = path::end(path::parent_path(filePath));
1409 path::const_iterator origDirI = path::begin(OriginalDir),
1410 origDirE = path::end(OriginalDir);
1411 // Skip the common path components from filePath and OriginalDir.
1412 while (fileDirI != fileDirE && origDirI != origDirE &&
1413 *fileDirI == *origDirI) {
1414 ++fileDirI;
1415 ++origDirI;
1416 }
1417 for (; origDirI != origDirE; ++origDirI)
1418 path::append(currPCHPath, "..");
1419 path::append(currPCHPath, fileDirI, fileDirE);
1420 path::append(currPCHPath, path::filename(Filename));
1421 return std::string(currPCHPath.str());
1422}
1423
1424bool ASTReader::ReadSLocEntry(int ID) {
1425 if (ID == 0)
1426 return false;
1427
1428 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1429 Error("source location entry ID out-of-range for AST file");
1430 return true;
1431 }
1432
1433 // Local helper to read the (possibly-compressed) buffer data following the
1434 // entry record.
1435 auto ReadBuffer = [this](
1436 BitstreamCursor &SLocEntryCursor,
1437 StringRef Name) -> std::unique_ptr<llvm::MemoryBuffer> {
1438 RecordData Record;
1439 StringRef Blob;
1440 Expected<unsigned> MaybeCode = SLocEntryCursor.ReadCode();
1441 if (!MaybeCode) {
1442 Error(MaybeCode.takeError());
1443 return nullptr;
1444 }
1445 unsigned Code = MaybeCode.get();
1446
1447 Expected<unsigned> MaybeRecCode =
1448 SLocEntryCursor.readRecord(Code, Record, &Blob);
1449 if (!MaybeRecCode) {
1450 Error(MaybeRecCode.takeError());
1451 return nullptr;
1452 }
1453 unsigned RecCode = MaybeRecCode.get();
1454
1455 if (RecCode == SM_SLOC_BUFFER_BLOB_COMPRESSED) {
1456 if (!llvm::zlib::isAvailable()) {
1457 Error("zlib is not available");
1458 return nullptr;
1459 }
1460 SmallString<0> Uncompressed;
1461 if (llvm::Error E =
1462 llvm::zlib::uncompress(Blob, Uncompressed, Record[0])) {
1463 Error("could not decompress embedded file contents: " +
1464 llvm::toString(std::move(E)));
1465 return nullptr;
1466 }
1467 return llvm::MemoryBuffer::getMemBufferCopy(Uncompressed, Name);
1468 } else if (RecCode == SM_SLOC_BUFFER_BLOB) {
1469 return llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name, true);
1470 } else {
1471 Error("AST record has invalid code");
1472 return nullptr;
1473 }
1474 };
1475
1476 ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second;
1477 if (llvm::Error Err = F->SLocEntryCursor.JumpToBit(
1478 F->SLocEntryOffsetsBase +
1479 F->SLocEntryOffsets[ID - F->SLocEntryBaseID])) {
1480 Error(std::move(Err));
1481 return true;
1482 }
1483
1484 BitstreamCursor &SLocEntryCursor = F->SLocEntryCursor;
1485 SourceLocation::UIntTy BaseOffset = F->SLocEntryBaseOffset;
1486
1487 ++NumSLocEntriesRead;
1488 Expected<llvm::BitstreamEntry> MaybeEntry = SLocEntryCursor.advance();
1489 if (!MaybeEntry) {
1490 Error(MaybeEntry.takeError());
1491 return true;
1492 }
1493 llvm::BitstreamEntry Entry = MaybeEntry.get();
1494
1495 if (Entry.Kind != llvm::BitstreamEntry::Record) {
1496 Error("incorrectly-formatted source location entry in AST file");
1497 return true;
1498 }
1499
1500 RecordData Record;
1501 StringRef Blob;
1502 Expected<unsigned> MaybeSLOC =
1503 SLocEntryCursor.readRecord(Entry.ID, Record, &Blob);
1504 if (!MaybeSLOC) {
1505 Error(MaybeSLOC.takeError());
1506 return true;
1507 }
1508 switch (MaybeSLOC.get()) {
1509 default:
1510 Error("incorrectly-formatted source location entry in AST file");
1511 return true;
1512
1513 case SM_SLOC_FILE_ENTRY: {
1514 // We will detect whether a file changed and return 'Failure' for it, but
1515 // we will also try to fail gracefully by setting up the SLocEntry.
1516 unsigned InputID = Record[4];
1517 InputFile IF = getInputFile(*F, InputID);
1518 Optional<FileEntryRef> File = IF.getFile();
1519 bool OverriddenBuffer = IF.isOverridden();
1520
1521 // Note that we only check if a File was returned. If it was out-of-date
1522 // we have complained but we will continue creating a FileID to recover
1523 // gracefully.
1524 if (!File)
1525 return true;
1526
1527 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
1528 if (IncludeLoc.isInvalid() && F->Kind != MK_MainFile) {
1529 // This is the module's main file.
1530 IncludeLoc = getImportLocation(F);
1531 }
1532 SrcMgr::CharacteristicKind
1533 FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
1534 FileID FID = SourceMgr.createFileID(*File, IncludeLoc, FileCharacter, ID,
1535 BaseOffset + Record[0]);
1536 SrcMgr::FileInfo &FileInfo =
1537 const_cast<SrcMgr::FileInfo&>(SourceMgr.getSLocEntry(FID).getFile());
1538 FileInfo.NumCreatedFIDs = Record[5];
1539 if (Record[3])
1540 FileInfo.setHasLineDirectives();
1541
1542 unsigned NumFileDecls = Record[7];
1543 if (NumFileDecls && ContextObj) {
1544 const DeclID *FirstDecl = F->FileSortedDecls + Record[6];
1545 assert(F->FileSortedDecls && "FILE_SORTED_DECLS not encountered yet ?")((void)0);
1546 FileDeclIDs[FID] = FileDeclsInfo(F, llvm::makeArrayRef(FirstDecl,
1547 NumFileDecls));
1548 }
1549
1550 const SrcMgr::ContentCache &ContentCache =
1551 SourceMgr.getOrCreateContentCache(*File, isSystem(FileCharacter));
1552 if (OverriddenBuffer && !ContentCache.BufferOverridden &&
1553 ContentCache.ContentsEntry == ContentCache.OrigEntry &&
1554 !ContentCache.getBufferIfLoaded()) {
1555 auto Buffer = ReadBuffer(SLocEntryCursor, File->getName());
1556 if (!Buffer)
1557 return true;
1558 SourceMgr.overrideFileContents(*File, std::move(Buffer));
1559 }
1560
1561 break;
1562 }
1563
1564 case SM_SLOC_BUFFER_ENTRY: {
1565 const char *Name = Blob.data();
1566 unsigned Offset = Record[0];
1567 SrcMgr::CharacteristicKind
1568 FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
1569 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
1570 if (IncludeLoc.isInvalid() && F->isModule()) {
1571 IncludeLoc = getImportLocation(F);
1572 }
1573
1574 auto Buffer = ReadBuffer(SLocEntryCursor, Name);
1575 if (!Buffer)
1576 return true;
1577 SourceMgr.createFileID(std::move(Buffer), FileCharacter, ID,
1578 BaseOffset + Offset, IncludeLoc);
1579 break;
1580 }
1581
1582 case SM_SLOC_EXPANSION_ENTRY: {
1583 SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1]);
1584 SourceMgr.createExpansionLoc(SpellingLoc,
1585 ReadSourceLocation(*F, Record[2]),
1586 ReadSourceLocation(*F, Record[3]),
1587 Record[5],
1588 Record[4],
1589 ID,
1590 BaseOffset + Record[0]);
1591 break;
1592 }
1593 }
1594
1595 return false;
1596}
1597
1598std::pair<SourceLocation, StringRef> ASTReader::getModuleImportLoc(int ID) {
1599 if (ID == 0)
1600 return std::make_pair(SourceLocation(), "");
1601
1602 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1603 Error("source location entry ID out-of-range for AST file");
1604 return std::make_pair(SourceLocation(), "");
1605 }
1606
1607 // Find which module file this entry lands in.
1608 ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second;
1609 if (!M->isModule())
1610 return std::make_pair(SourceLocation(), "");
1611
1612 // FIXME: Can we map this down to a particular submodule? That would be
1613 // ideal.
1614 return std::make_pair(M->ImportLoc, StringRef(M->ModuleName));
1615}
1616
1617/// Find the location where the module F is imported.
1618SourceLocation ASTReader::getImportLocation(ModuleFile *F) {
1619 if (F->ImportLoc.isValid())
1620 return F->ImportLoc;
1621
1622 // Otherwise we have a PCH. It's considered to be "imported" at the first
1623 // location of its includer.
1624 if (F->ImportedBy.empty() || !F->ImportedBy[0]) {
1625 // Main file is the importer.
1626 assert(SourceMgr.getMainFileID().isValid() && "missing main file")((void)0);
1627 return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID());
1628 }
1629 return F->ImportedBy[0]->FirstLoc;
1630}
1631
1632/// Enter a subblock of the specified BlockID with the specified cursor. Read
1633/// the abbreviations that are at the top of the block and then leave the cursor
1634/// pointing into the block.
1635bool ASTReader::ReadBlockAbbrevs(BitstreamCursor &Cursor, unsigned BlockID,
1636 uint64_t *StartOfBlockOffset) {
1637 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) {
1638 // FIXME this drops errors on the floor.
1639 consumeError(std::move(Err));
1640 return true;
1641 }
1642
1643 if (StartOfBlockOffset)
1644 *StartOfBlockOffset = Cursor.GetCurrentBitNo();
1645
1646 while (true) {
1647 uint64_t Offset = Cursor.GetCurrentBitNo();
1648 Expected<unsigned> MaybeCode = Cursor.ReadCode();
1649 if (!MaybeCode) {
1650 // FIXME this drops errors on the floor.
1651 consumeError(MaybeCode.takeError());
1652 return true;
1653 }
1654 unsigned Code = MaybeCode.get();
1655
1656 // We expect all abbrevs to be at the start of the block.
1657 if (Code != llvm::bitc::DEFINE_ABBREV) {
1658 if (llvm::Error Err = Cursor.JumpToBit(Offset)) {
1659 // FIXME this drops errors on the floor.
1660 consumeError(std::move(Err));
1661 return true;
1662 }
1663 return false;
1664 }
1665 if (llvm::Error Err = Cursor.ReadAbbrevRecord()) {
1666 // FIXME this drops errors on the floor.
1667 consumeError(std::move(Err));
1668 return true;
1669 }
1670 }
1671}
1672
1673Token ASTReader::ReadToken(ModuleFile &F, const RecordDataImpl &Record,
1674 unsigned &Idx) {
1675 Token Tok;
1676 Tok.startToken();
1677 Tok.setLocation(ReadSourceLocation(F, Record, Idx));
1678 Tok.setLength(Record[Idx++]);
1679 if (IdentifierInfo *II = getLocalIdentifier(F, Record[Idx++]))
1680 Tok.setIdentifierInfo(II);
1681 Tok.setKind((tok::TokenKind)Record[Idx++]);
1682 Tok.setFlag((Token::TokenFlags)Record[Idx++]);
1683 return Tok;
1684}
1685
1686MacroInfo *ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) {
1687 BitstreamCursor &Stream = F.MacroCursor;
1688
1689 // Keep track of where we are in the stream, then jump back there
1690 // after reading this macro.
1691 SavedStreamPosition SavedPosition(Stream);
1692
1693 if (llvm::Error Err = Stream.JumpToBit(Offset)) {
1694 // FIXME this drops errors on the floor.
1695 consumeError(std::move(Err));
1696 return nullptr;
1697 }
1698 RecordData Record;
1699 SmallVector<IdentifierInfo*, 16> MacroParams;
1700 MacroInfo *Macro = nullptr;
1701
1702 while (true) {
1703 // Advance to the next record, but if we get to the end of the block, don't
1704 // pop it (removing all the abbreviations from the cursor) since we want to
1705 // be able to reseek within the block and read entries.
1706 unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd;
1707 Expected<llvm::BitstreamEntry> MaybeEntry =
1708 Stream.advanceSkippingSubblocks(Flags);
1709 if (!MaybeEntry) {
1710 Error(MaybeEntry.takeError());
1711 return Macro;
1712 }
1713 llvm::BitstreamEntry Entry = MaybeEntry.get();
1714
1715 switch (Entry.Kind) {
1716 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1717 case llvm::BitstreamEntry::Error:
1718 Error("malformed block record in AST file");
1719 return Macro;
1720 case llvm::BitstreamEntry::EndBlock:
1721 return Macro;
1722 case llvm::BitstreamEntry::Record:
1723 // The interesting case.
1724 break;
1725 }
1726
1727 // Read a record.
1728 Record.clear();
1729 PreprocessorRecordTypes RecType;
1730 if (Expected<unsigned> MaybeRecType = Stream.readRecord(Entry.ID, Record))
1731 RecType = (PreprocessorRecordTypes)MaybeRecType.get();
1732 else {
1733 Error(MaybeRecType.takeError());
1734 return Macro;
1735 }
1736 switch (RecType) {
1737 case PP_MODULE_MACRO:
1738 case PP_MACRO_DIRECTIVE_HISTORY:
1739 return Macro;
1740
1741 case PP_MACRO_OBJECT_LIKE:
1742 case PP_MACRO_FUNCTION_LIKE: {
1743 // If we already have a macro, that means that we've hit the end
1744 // of the definition of the macro we were looking for. We're
1745 // done.
1746 if (Macro)
1747 return Macro;
1748
1749 unsigned NextIndex = 1; // Skip identifier ID.
1750 SourceLocation Loc = ReadSourceLocation(F, Record, NextIndex);
1751 MacroInfo *MI = PP.AllocateMacroInfo(Loc);
1752 MI->setDefinitionEndLoc(ReadSourceLocation(F, Record, NextIndex));
1753 MI->setIsUsed(Record[NextIndex++]);
1754 MI->setUsedForHeaderGuard(Record[NextIndex++]);
1755
1756 if (RecType == PP_MACRO_FUNCTION_LIKE) {
1757 // Decode function-like macro info.
1758 bool isC99VarArgs = Record[NextIndex++];
1759 bool isGNUVarArgs = Record[NextIndex++];
1760 bool hasCommaPasting = Record[NextIndex++];
1761 MacroParams.clear();
1762 unsigned NumArgs = Record[NextIndex++];
1763 for (unsigned i = 0; i != NumArgs; ++i)
1764 MacroParams.push_back(getLocalIdentifier(F, Record[NextIndex++]));
1765
1766 // Install function-like macro info.
1767 MI->setIsFunctionLike();
1768 if (isC99VarArgs) MI->setIsC99Varargs();
1769 if (isGNUVarArgs) MI->setIsGNUVarargs();
1770 if (hasCommaPasting) MI->setHasCommaPasting();
1771 MI->setParameterList(MacroParams, PP.getPreprocessorAllocator());
1772 }
1773
1774 // Remember that we saw this macro last so that we add the tokens that
1775 // form its body to it.
1776 Macro = MI;
1777
1778 if (NextIndex + 1 == Record.size() && PP.getPreprocessingRecord() &&
1779 Record[NextIndex]) {
1780 // We have a macro definition. Register the association
1781 PreprocessedEntityID
1782 GlobalID = getGlobalPreprocessedEntityID(F, Record[NextIndex]);
1783 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
1784 PreprocessingRecord::PPEntityID PPID =
1785 PPRec.getPPEntityID(GlobalID - 1, /*isLoaded=*/true);
1786 MacroDefinitionRecord *PPDef = cast_or_null<MacroDefinitionRecord>(
1787 PPRec.getPreprocessedEntity(PPID));
1788 if (PPDef)
1789 PPRec.RegisterMacroDefinition(Macro, PPDef);
1790 }
1791
1792 ++NumMacrosRead;
1793 break;
1794 }
1795
1796 case PP_TOKEN: {
1797 // If we see a TOKEN before a PP_MACRO_*, then the file is
1798 // erroneous, just pretend we didn't see this.
1799 if (!Macro) break;
1800
1801 unsigned Idx = 0;
1802 Token Tok = ReadToken(F, Record, Idx);
1803 Macro->AddTokenToBody(Tok);
1804 break;
1805 }
1806 }
1807 }
1808}
1809
1810PreprocessedEntityID
1811ASTReader::getGlobalPreprocessedEntityID(ModuleFile &M,
1812 unsigned LocalID) const {
1813 if (!M.ModuleOffsetMap.empty())
1814 ReadModuleOffsetMap(M);
1815
1816 ContinuousRangeMap<uint32_t, int, 2>::const_iterator
1817 I = M.PreprocessedEntityRemap.find(LocalID - NUM_PREDEF_PP_ENTITY_IDS);
1818 assert(I != M.PreprocessedEntityRemap.end()((void)0)
1819 && "Invalid index into preprocessed entity index remap")((void)0);
1820
1821 return LocalID + I->second;
1822}
1823
1824unsigned HeaderFileInfoTrait::ComputeHash(internal_key_ref ikey) {
1825 return llvm::hash_combine(ikey.Size, ikey.ModTime);
1826}
1827
1828HeaderFileInfoTrait::internal_key_type
1829HeaderFileInfoTrait::GetInternalKey(const FileEntry *FE) {
1830 internal_key_type ikey = {FE->getSize(),
1831 M.HasTimestamps ? FE->getModificationTime() : 0,
1832 FE->getName(), /*Imported*/ false};
1833 return ikey;
1834}
1835
1836bool HeaderFileInfoTrait::EqualKey(internal_key_ref a, internal_key_ref b) {
1837 if (a.Size != b.Size || (a.ModTime && b.ModTime && a.ModTime != b.ModTime))
1838 return false;
1839
1840 if (llvm::sys::path::is_absolute(a.Filename) && a.Filename == b.Filename)
1841 return true;
1842
1843 // Determine whether the actual files are equivalent.
1844 FileManager &FileMgr = Reader.getFileManager();
1845 auto GetFile = [&](const internal_key_type &Key) -> const FileEntry* {
1846 if (!Key.Imported) {
1847 if (auto File = FileMgr.getFile(Key.Filename))
1848 return *File;
1849 return nullptr;
1850 }
1851
1852 std::string Resolved = std::string(Key.Filename);
1853 Reader.ResolveImportedPath(M, Resolved);
1854 if (auto File = FileMgr.getFile(Resolved))
1855 return *File;
1856 return nullptr;
1857 };
1858
1859 const FileEntry *FEA = GetFile(a);
1860 const FileEntry *FEB = GetFile(b);
1861 return FEA && FEA == FEB;
1862}
1863
1864std::pair<unsigned, unsigned>
1865HeaderFileInfoTrait::ReadKeyDataLength(const unsigned char*& d) {
1866 return readULEBKeyDataLength(d);
1867}
1868
1869HeaderFileInfoTrait::internal_key_type
1870HeaderFileInfoTrait::ReadKey(const unsigned char *d, unsigned) {
1871 using namespace llvm::support;
1872
1873 internal_key_type ikey;
1874 ikey.Size = off_t(endian::readNext<uint64_t, little, unaligned>(d));
1875 ikey.ModTime = time_t(endian::readNext<uint64_t, little, unaligned>(d));
1876 ikey.Filename = (const char *)d;
1877 ikey.Imported = true;
1878 return ikey;
1879}
1880
1881HeaderFileInfoTrait::data_type
1882HeaderFileInfoTrait::ReadData(internal_key_ref key, const unsigned char *d,
1883 unsigned DataLen) {
1884 using namespace llvm::support;
1885
1886 const unsigned char *End = d + DataLen;
1887 HeaderFileInfo HFI;
1888 unsigned Flags = *d++;
1889 // FIXME: Refactor with mergeHeaderFileInfo in HeaderSearch.cpp.
1890 HFI.isImport |= (Flags >> 5) & 0x01;
1891 HFI.isPragmaOnce |= (Flags >> 4) & 0x01;
1892 HFI.DirInfo = (Flags >> 1) & 0x07;
1893 HFI.IndexHeaderMapHeader = Flags & 0x01;
1894 // FIXME: Find a better way to handle this. Maybe just store a
1895 // "has been included" flag?
1896 HFI.NumIncludes = std::max(endian::readNext<uint16_t, little, unaligned>(d),
1897 HFI.NumIncludes);
1898 HFI.ControllingMacroID = Reader.getGlobalIdentifierID(
1899 M, endian::readNext<uint32_t, little, unaligned>(d));
1900 if (unsigned FrameworkOffset =
1901 endian::readNext<uint32_t, little, unaligned>(d)) {
1902 // The framework offset is 1 greater than the actual offset,
1903 // since 0 is used as an indicator for "no framework name".
1904 StringRef FrameworkName(FrameworkStrings + FrameworkOffset - 1);
1905 HFI.Framework = HS->getUniqueFrameworkName(FrameworkName);
1906 }
1907
1908 assert((End - d) % 4 == 0 &&((void)0)
1909 "Wrong data length in HeaderFileInfo deserialization")((void)0);
1910 while (d != End) {
1911 uint32_t LocalSMID = endian::readNext<uint32_t, little, unaligned>(d);
1912 auto HeaderRole = static_cast<ModuleMap::ModuleHeaderRole>(LocalSMID & 3);
1913 LocalSMID >>= 2;
1914
1915 // This header is part of a module. Associate it with the module to enable
1916 // implicit module import.
1917 SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID);
1918 Module *Mod = Reader.getSubmodule(GlobalSMID);
1919 FileManager &FileMgr = Reader.getFileManager();
1920 ModuleMap &ModMap =
1921 Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap();
1922
1923 std::string Filename = std::string(key.Filename);
1924 if (key.Imported)
1925 Reader.ResolveImportedPath(M, Filename);
1926 // FIXME: NameAsWritten
1927 Module::Header H = {std::string(key.Filename), "",
1928 *FileMgr.getFile(Filename)};
1929 ModMap.addHeader(Mod, H, HeaderRole, /*Imported*/true);
1930 HFI.isModuleHeader |= !(HeaderRole & ModuleMap::TextualHeader);
1931 }
1932
1933 // This HeaderFileInfo was externally loaded.
1934 HFI.External = true;
1935 HFI.IsValid = true;
1936 return HFI;
1937}
1938
1939void ASTReader::addPendingMacro(IdentifierInfo *II, ModuleFile *M,
1940 uint32_t MacroDirectivesOffset) {
1941 assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard")((void)0);
1942 PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset));
1943}
1944
1945void ASTReader::ReadDefinedMacros() {
1946 // Note that we are loading defined macros.
1947 Deserializing Macros(this);
1948
1949 for (ModuleFile &I : llvm::reverse(ModuleMgr)) {
1950 BitstreamCursor &MacroCursor = I.MacroCursor;
1951
1952 // If there was no preprocessor block, skip this file.
1953 if (MacroCursor.getBitcodeBytes().empty())
1954 continue;
1955
1956 BitstreamCursor Cursor = MacroCursor;
1957 if (llvm::Error Err = Cursor.JumpToBit(I.MacroStartOffset)) {
1958 Error(std::move(Err));
1959 return;
1960 }
1961
1962 RecordData Record;
1963 while (true) {
1964 Expected<llvm::BitstreamEntry> MaybeE = Cursor.advanceSkippingSubblocks();
1965 if (!MaybeE) {
1966 Error(MaybeE.takeError());
1967 return;
1968 }
1969 llvm::BitstreamEntry E = MaybeE.get();
1970
1971 switch (E.Kind) {
1972 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1973 case llvm::BitstreamEntry::Error:
1974 Error("malformed block record in AST file");
1975 return;
1976 case llvm::BitstreamEntry::EndBlock:
1977 goto NextCursor;
1978
1979 case llvm::BitstreamEntry::Record: {
1980 Record.clear();
1981 Expected<unsigned> MaybeRecord = Cursor.readRecord(E.ID, Record);
1982 if (!MaybeRecord) {
1983 Error(MaybeRecord.takeError());
1984 return;
1985 }
1986 switch (MaybeRecord.get()) {
1987 default: // Default behavior: ignore.
1988 break;
1989
1990 case PP_MACRO_OBJECT_LIKE:
1991 case PP_MACRO_FUNCTION_LIKE: {
1992 IdentifierInfo *II = getLocalIdentifier(I, Record[0]);
1993 if (II->isOutOfDate())
1994 updateOutOfDateIdentifier(*II);
1995 break;
1996 }
1997
1998 case PP_TOKEN:
1999 // Ignore tokens.
2000 break;
2001 }
2002 break;
2003 }
2004 }
2005 }
2006 NextCursor: ;
2007 }
2008}
2009
2010namespace {
2011
2012 /// Visitor class used to look up identifirs in an AST file.
2013 class IdentifierLookupVisitor {
2014 StringRef Name;
2015 unsigned NameHash;
2016 unsigned PriorGeneration;
2017 unsigned &NumIdentifierLookups;
2018 unsigned &NumIdentifierLookupHits;
2019 IdentifierInfo *Found = nullptr;
2020
2021 public:
2022 IdentifierLookupVisitor(StringRef Name, unsigned PriorGeneration,
2023 unsigned &NumIdentifierLookups,
2024 unsigned &NumIdentifierLookupHits)
2025 : Name(Name), NameHash(ASTIdentifierLookupTrait::ComputeHash(Name)),
2026 PriorGeneration(PriorGeneration),
2027 NumIdentifierLookups(NumIdentifierLookups),
2028 NumIdentifierLookupHits(NumIdentifierLookupHits) {}
2029
2030 bool operator()(ModuleFile &M) {
2031 // If we've already searched this module file, skip it now.
2032 if (M.Generation <= PriorGeneration)
2033 return true;
2034
2035 ASTIdentifierLookupTable *IdTable
2036 = (ASTIdentifierLookupTable *)M.IdentifierLookupTable;
2037 if (!IdTable)
2038 return false;
2039
2040 ASTIdentifierLookupTrait Trait(IdTable->getInfoObj().getReader(), M,
2041 Found);
2042 ++NumIdentifierLookups;
2043 ASTIdentifierLookupTable::iterator Pos =
2044 IdTable->find_hashed(Name, NameHash, &Trait);
2045 if (Pos == IdTable->end())
2046 return false;
2047
2048 // Dereferencing the iterator has the effect of building the
2049 // IdentifierInfo node and populating it with the various
2050 // declarations it needs.
2051 ++NumIdentifierLookupHits;
2052 Found = *Pos;
2053 return true;
2054 }
2055
2056 // Retrieve the identifier info found within the module
2057 // files.
2058 IdentifierInfo *getIdentifierInfo() const { return Found; }
2059 };
2060
2061} // namespace
2062
2063void ASTReader::updateOutOfDateIdentifier(IdentifierInfo &II) {
2064 // Note that we are loading an identifier.
2065 Deserializing AnIdentifier(this);
2066
2067 unsigned PriorGeneration = 0;
2068 if (getContext().getLangOpts().Modules)
2069 PriorGeneration = IdentifierGeneration[&II];
2070
2071 // If there is a global index, look there first to determine which modules
2072 // provably do not have any results for this identifier.
2073 GlobalModuleIndex::HitSet Hits;
2074 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
2075 if (!loadGlobalIndex()) {
2076 if (GlobalIndex->lookupIdentifier(II.getName(), Hits)) {
2077 HitsPtr = &Hits;
2078 }
2079 }
2080
2081 IdentifierLookupVisitor Visitor(II.getName(), PriorGeneration,
2082 NumIdentifierLookups,
2083 NumIdentifierLookupHits);
2084 ModuleMgr.visit(Visitor, HitsPtr);
2085 markIdentifierUpToDate(&II);
2086}
2087
2088void ASTReader::markIdentifierUpToDate(IdentifierInfo *II) {
2089 if (!II)
2090 return;
2091
2092 II->setOutOfDate(false);
2093
2094 // Update the generation for this identifier.
2095 if (getContext().getLangOpts().Modules)
2096 IdentifierGeneration[II] = getGeneration();
2097}
2098
2099void ASTReader::resolvePendingMacro(IdentifierInfo *II,
2100 const PendingMacroInfo &PMInfo) {
2101 ModuleFile &M = *PMInfo.M;
2102
2103 BitstreamCursor &Cursor = M.MacroCursor;
2104 SavedStreamPosition SavedPosition(Cursor);
2105 if (llvm::Error Err =
2106 Cursor.JumpToBit(M.MacroOffsetsBase + PMInfo.MacroDirectivesOffset)) {
2107 Error(std::move(Err));
2108 return;
2109 }
2110
2111 struct ModuleMacroRecord {
2112 SubmoduleID SubModID;
2113 MacroInfo *MI;
2114 SmallVector<SubmoduleID, 8> Overrides;
2115 };
2116 llvm::SmallVector<ModuleMacroRecord, 8> ModuleMacros;
2117
2118 // We expect to see a sequence of PP_MODULE_MACRO records listing exported
2119 // macros, followed by a PP_MACRO_DIRECTIVE_HISTORY record with the complete
2120 // macro histroy.
2121 RecordData Record;
2122 while (true) {
2123 Expected<llvm::BitstreamEntry> MaybeEntry =
2124 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
2125 if (!MaybeEntry) {
2126 Error(MaybeEntry.takeError());
2127 return;
2128 }
2129 llvm::BitstreamEntry Entry = MaybeEntry.get();
2130
2131 if (Entry.Kind != llvm::BitstreamEntry::Record) {
2132 Error("malformed block record in AST file");
2133 return;
2134 }
2135
2136 Record.clear();
2137 Expected<unsigned> MaybePP = Cursor.readRecord(Entry.ID, Record);
2138 if (!MaybePP) {
2139 Error(MaybePP.takeError());
2140 return;
2141 }
2142 switch ((PreprocessorRecordTypes)MaybePP.get()) {
2143 case PP_MACRO_DIRECTIVE_HISTORY:
2144 break;
2145
2146 case PP_MODULE_MACRO: {
2147 ModuleMacros.push_back(ModuleMacroRecord());
2148 auto &Info = ModuleMacros.back();
2149 Info.SubModID = getGlobalSubmoduleID(M, Record[0]);
2150 Info.MI = getMacro(getGlobalMacroID(M, Record[1]));
2151 for (int I = 2, N = Record.size(); I != N; ++I)
2152 Info.Overrides.push_back(getGlobalSubmoduleID(M, Record[I]));
2153 continue;
2154 }
2155
2156 default:
2157 Error("malformed block record in AST file");
2158 return;
2159 }
2160
2161 // We found the macro directive history; that's the last record
2162 // for this macro.
2163 break;
2164 }
2165
2166 // Module macros are listed in reverse dependency order.
2167 {
2168 std::reverse(ModuleMacros.begin(), ModuleMacros.end());
2169 llvm::SmallVector<ModuleMacro*, 8> Overrides;
2170 for (auto &MMR : ModuleMacros) {
2171 Overrides.clear();
2172 for (unsigned ModID : MMR.Overrides) {
2173 Module *Mod = getSubmodule(ModID);
2174 auto *Macro = PP.getModuleMacro(Mod, II);
2175 assert(Macro && "missing definition for overridden macro")((void)0);
2176 Overrides.push_back(Macro);
2177 }
2178
2179 bool Inserted = false;
2180 Module *Owner = getSubmodule(MMR.SubModID);
2181 PP.addModuleMacro(Owner, II, MMR.MI, Overrides, Inserted);
2182 }
2183 }
2184
2185 // Don't read the directive history for a module; we don't have anywhere
2186 // to put it.
2187 if (M.isModule())
2188 return;
2189
2190 // Deserialize the macro directives history in reverse source-order.
2191 MacroDirective *Latest = nullptr, *Earliest = nullptr;
2192 unsigned Idx = 0, N = Record.size();
2193 while (Idx < N) {
2194 MacroDirective *MD = nullptr;
2195 SourceLocation Loc = ReadSourceLocation(M, Record, Idx);
2196 MacroDirective::Kind K = (MacroDirective::Kind)Record[Idx++];
2197 switch (K) {
2198 case MacroDirective::MD_Define: {
2199 MacroInfo *MI = getMacro(getGlobalMacroID(M, Record[Idx++]));
2200 MD = PP.AllocateDefMacroDirective(MI, Loc);
2201 break;
2202 }
2203 case MacroDirective::MD_Undefine:
2204 MD = PP.AllocateUndefMacroDirective(Loc);
2205 break;
2206 case MacroDirective::MD_Visibility:
2207 bool isPublic = Record[Idx++];
2208 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic);
2209 break;
2210 }
2211
2212 if (!Latest)
2213 Latest = MD;
2214 if (Earliest)
2215 Earliest->setPrevious(MD);
2216 Earliest = MD;
2217 }
2218
2219 if (Latest)
2220 PP.setLoadedMacroDirective(II, Earliest, Latest);
2221}
2222
2223bool ASTReader::shouldDisableValidationForFile(
2224 const serialization::ModuleFile &M) const {
2225 if (DisableValidationKind == DisableValidationForModuleKind::None)
2226 return false;
2227
2228 // If a PCH is loaded and validation is disabled for PCH then disable
2229 // validation for the PCH and the modules it loads.
2230 ModuleKind K = CurrentDeserializingModuleKind.getValueOr(M.Kind);
2231
2232 switch (K) {
2233 case MK_MainFile:
2234 case MK_Preamble:
2235 case MK_PCH:
2236 return bool(DisableValidationKind & DisableValidationForModuleKind::PCH);
2237 case MK_ImplicitModule:
2238 case MK_ExplicitModule:
2239 case MK_PrebuiltModule:
2240 return bool(DisableValidationKind & DisableValidationForModuleKind::Module);
2241 }
2242
2243 return false;
2244}
2245
2246ASTReader::InputFileInfo
2247ASTReader::readInputFileInfo(ModuleFile &F, unsigned ID) {
2248 // Go find this input file.
2249 BitstreamCursor &Cursor = F.InputFilesCursor;
2250 SavedStreamPosition SavedPosition(Cursor);
2251 if (llvm::Error Err = Cursor.JumpToBit(F.InputFileOffsets[ID - 1])) {
2252 // FIXME this drops errors on the floor.
2253 consumeError(std::move(Err));
2254 }
2255
2256 Expected<unsigned> MaybeCode = Cursor.ReadCode();
2257 if (!MaybeCode) {
2258 // FIXME this drops errors on the floor.
2259 consumeError(MaybeCode.takeError());
2260 }
2261 unsigned Code = MaybeCode.get();
2262 RecordData Record;
2263 StringRef Blob;
2264
2265 if (Expected<unsigned> Maybe = Cursor.readRecord(Code, Record, &Blob))
2266 assert(static_cast<InputFileRecordTypes>(Maybe.get()) == INPUT_FILE &&((void)0)
2267 "invalid record type for input file")((void)0);
2268 else {
2269 // FIXME this drops errors on the floor.
2270 consumeError(Maybe.takeError());
2271 }
2272
2273 assert(Record[0] == ID && "Bogus stored ID or offset")((void)0);
2274 InputFileInfo R;
2275 R.StoredSize = static_cast<off_t>(Record[1]);
2276 R.StoredTime = static_cast<time_t>(Record[2]);
2277 R.Overridden = static_cast<bool>(Record[3]);
2278 R.Transient = static_cast<bool>(Record[4]);
2279 R.TopLevelModuleMap = static_cast<bool>(Record[5]);
2280 R.Filename = std::string(Blob);
2281 ResolveImportedPath(F, R.Filename);
2282
2283 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance();
2284 if (!MaybeEntry) // FIXME this drops errors on the floor.
2285 consumeError(MaybeEntry.takeError());
2286 llvm::BitstreamEntry Entry = MaybeEntry.get();
2287 assert(Entry.Kind == llvm::BitstreamEntry::Record &&((void)0)
2288 "expected record type for input file hash")((void)0);
2289
2290 Record.clear();
2291 if (Expected<unsigned> Maybe = Cursor.readRecord(Entry.ID, Record))
2292 assert(static_cast<InputFileRecordTypes>(Maybe.get()) == INPUT_FILE_HASH &&((void)0)
2293 "invalid record type for input file hash")((void)0);
2294 else {
2295 // FIXME this drops errors on the floor.
2296 consumeError(Maybe.takeError());
2297 }
2298 R.ContentHash = (static_cast<uint64_t>(Record[1]) << 32) |
2299 static_cast<uint64_t>(Record[0]);
2300 return R;
2301}
2302
2303static unsigned moduleKindForDiagnostic(ModuleKind Kind);
2304InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) {
2305 // If this ID is bogus, just return an empty input file.
2306 if (ID == 0 || ID > F.InputFilesLoaded.size())
2307 return InputFile();
2308
2309 // If we've already loaded this input file, return it.
2310 if (F.InputFilesLoaded[ID-1].getFile())
2311 return F.InputFilesLoaded[ID-1];
2312
2313 if (F.InputFilesLoaded[ID-1].isNotFound())
2314 return InputFile();
2315
2316 // Go find this input file.
2317 BitstreamCursor &Cursor = F.InputFilesCursor;
2318 SavedStreamPosition SavedPosition(Cursor);
2319 if (llvm::Error Err = Cursor.JumpToBit(F.InputFileOffsets[ID - 1])) {
2320 // FIXME this drops errors on the floor.
2321 consumeError(std::move(Err));
2322 }
2323
2324 InputFileInfo FI = readInputFileInfo(F, ID);
2325 off_t StoredSize = FI.StoredSize;
2326 time_t StoredTime = FI.StoredTime;
2327 bool Overridden = FI.Overridden;
2328 bool Transient = FI.Transient;
2329 StringRef Filename = FI.Filename;
2330 uint64_t StoredContentHash = FI.ContentHash;
2331
2332 OptionalFileEntryRefDegradesToFileEntryPtr File =
2333 expectedToOptional(FileMgr.getFileRef(Filename, /*OpenFile=*/false));
2334
2335 // If we didn't find the file, resolve it relative to the
2336 // original directory from which this AST file was created.
2337 if (!File && !F.OriginalDir.empty() && !F.BaseDirectory.empty() &&
2338 F.OriginalDir != F.BaseDirectory) {
2339 std::string Resolved = resolveFileRelativeToOriginalDir(
2340 std::string(Filename), F.OriginalDir, F.BaseDirectory);
2341 if (!Resolved.empty())
2342 File = expectedToOptional(FileMgr.getFileRef(Resolved));
2343 }
2344
2345 // For an overridden file, create a virtual file with the stored
2346 // size/timestamp.
2347 if ((Overridden || Transient) && !File)
2348 File = FileMgr.getVirtualFileRef(Filename, StoredSize, StoredTime);
2349
2350 if (!File) {
2351 if (Complain) {
2352 std::string ErrorStr = "could not find file '";
2353 ErrorStr += Filename;
2354 ErrorStr += "' referenced by AST file '";
2355 ErrorStr += F.FileName;
2356 ErrorStr += "'";
2357 Error(ErrorStr);
2358 }
2359 // Record that we didn't find the file.
2360 F.InputFilesLoaded[ID-1] = InputFile::getNotFound();
2361 return InputFile();
2362 }
2363
2364 // Check if there was a request to override the contents of the file
2365 // that was part of the precompiled header. Overriding such a file
2366 // can lead to problems when lexing using the source locations from the
2367 // PCH.
2368 SourceManager &SM = getSourceManager();
2369 // FIXME: Reject if the overrides are different.
2370 if ((!Overridden && !Transient) && SM.isFileOverridden(File)) {
2371 if (Complain)
2372 Error(diag::err_fe_pch_file_overridden, Filename);
2373
2374 // After emitting the diagnostic, bypass the overriding file to recover
2375 // (this creates a separate FileEntry).
2376 File = SM.bypassFileContentsOverride(*File);
2377 if (!File) {
2378 F.InputFilesLoaded[ID - 1] = InputFile::getNotFound();
2379 return InputFile();
2380 }
2381 }
2382
2383 enum ModificationType {
2384 Size,
2385 ModTime,
2386 Content,
2387 None,
2388 };
2389 auto HasInputFileChanged = [&]() {
2390 if (StoredSize != File->getSize())
2391 return ModificationType::Size;
2392 if (!shouldDisableValidationForFile(F) && StoredTime &&
2393 StoredTime != File->getModificationTime()) {
2394 // In case the modification time changes but not the content,
2395 // accept the cached file as legit.
2396 if (ValidateASTInputFilesContent &&
2397 StoredContentHash != static_cast<uint64_t>(llvm::hash_code(-1))) {
2398 auto MemBuffOrError = FileMgr.getBufferForFile(File);
2399 if (!MemBuffOrError) {
2400 if (!Complain)
2401 return ModificationType::ModTime;
2402 std::string ErrorStr = "could not get buffer for file '";
2403 ErrorStr += File->getName();
2404 ErrorStr += "'";
2405 Error(ErrorStr);
2406 return ModificationType::ModTime;
2407 }
2408
2409 auto ContentHash = hash_value(MemBuffOrError.get()->getBuffer());
2410 if (StoredContentHash == static_cast<uint64_t>(ContentHash))
2411 return ModificationType::None;
2412 return ModificationType::Content;
2413 }
2414 return ModificationType::ModTime;
2415 }
2416 return ModificationType::None;
2417 };
2418
2419 bool IsOutOfDate = false;
2420 auto FileChange = HasInputFileChanged();
2421 // For an overridden file, there is nothing to validate.
2422 if (!Overridden && FileChange != ModificationType::None) {
2423 if (Complain && !Diags.isDiagnosticInFlight()) {
2424 // Build a list of the PCH imports that got us here (in reverse).
2425 SmallVector<ModuleFile *, 4> ImportStack(1, &F);
2426 while (!ImportStack.back()->ImportedBy.empty())
2427 ImportStack.push_back(ImportStack.back()->ImportedBy[0]);
2428
2429 // The top-level PCH is stale.
2430 StringRef TopLevelPCHName(ImportStack.back()->FileName);
2431 Diag(diag::err_fe_ast_file_modified)
2432 << Filename << moduleKindForDiagnostic(ImportStack.back()->Kind)
2433 << TopLevelPCHName << FileChange;
2434
2435 // Print the import stack.
2436 if (ImportStack.size() > 1) {
2437 Diag(diag::note_pch_required_by)
2438 << Filename << ImportStack[0]->FileName;
2439 for (unsigned I = 1; I < ImportStack.size(); ++I)
2440 Diag(diag::note_pch_required_by)
2441 << ImportStack[I-1]->FileName << ImportStack[I]->FileName;
2442 }
2443
2444 Diag(diag::note_pch_rebuild_required) << TopLevelPCHName;
2445 }
2446
2447 IsOutOfDate = true;
2448 }
2449 // FIXME: If the file is overridden and we've already opened it,
2450 // issue an error (or split it into a separate FileEntry).
2451
2452 InputFile IF = InputFile(*File, Overridden || Transient, IsOutOfDate);
2453
2454 // Note that we've loaded this input file.
2455 F.InputFilesLoaded[ID-1] = IF;
2456 return IF;
2457}
2458
2459/// If we are loading a relocatable PCH or module file, and the filename
2460/// is not an absolute path, add the system or module root to the beginning of
2461/// the file name.
2462void ASTReader::ResolveImportedPath(ModuleFile &M, std::string &Filename) {
2463 // Resolve relative to the base directory, if we have one.
2464 if (!M.BaseDirectory.empty())
2465 return ResolveImportedPath(Filename, M.BaseDirectory);
2466}
2467
2468void ASTReader::ResolveImportedPath(std::string &Filename, StringRef Prefix) {
2469 if (Filename.empty() || llvm::sys::path::is_absolute(Filename))
2470 return;
2471
2472 SmallString<128> Buffer;
2473 llvm::sys::path::append(Buffer, Prefix, Filename);
2474 Filename.assign(Buffer.begin(), Buffer.end());
2475}
2476
2477static bool isDiagnosedResult(ASTReader::ASTReadResult ARR, unsigned Caps) {
2478 switch (ARR) {
2479 case ASTReader::Failure: return true;
2480 case ASTReader::Missing: return !(Caps & ASTReader::ARR_Missing);
2481 case ASTReader::OutOfDate: return !(Caps & ASTReader::ARR_OutOfDate);
2482 case ASTReader::VersionMismatch: return !(Caps & ASTReader::ARR_VersionMismatch);
2483 case ASTReader::ConfigurationMismatch:
2484 return !(Caps & ASTReader::ARR_ConfigurationMismatch);
2485 case ASTReader::HadErrors: return true;
2486 case ASTReader::Success: return false;
2487 }
2488
2489 llvm_unreachable("unknown ASTReadResult")__builtin_unreachable();
2490}
2491
2492ASTReader::ASTReadResult ASTReader::ReadOptionsBlock(
2493 BitstreamCursor &Stream, unsigned ClientLoadCapabilities,
2494 bool AllowCompatibleConfigurationMismatch, ASTReaderListener &Listener,
2495 std::string &SuggestedPredefines) {
2496 if (llvm::Error Err = Stream.EnterSubBlock(OPTIONS_BLOCK_ID)) {
2497 // FIXME this drops errors on the floor.
2498 consumeError(std::move(Err));
2499 return Failure;
2500 }
2501
2502 // Read all of the records in the options block.
2503 RecordData Record;
2504 ASTReadResult Result = Success;
2505 while (true) {
2506 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
2507 if (!MaybeEntry) {
2508 // FIXME this drops errors on the floor.
2509 consumeError(MaybeEntry.takeError());
2510 return Failure;
2511 }
2512 llvm::BitstreamEntry Entry = MaybeEntry.get();
2513
2514 switch (Entry.Kind) {
2515 case llvm::BitstreamEntry::Error:
2516 case llvm::BitstreamEntry::SubBlock:
2517 return Failure;
2518
2519 case llvm::BitstreamEntry::EndBlock:
2520 return Result;
2521
2522 case llvm::BitstreamEntry::Record:
2523 // The interesting case.
2524 break;
2525 }
2526
2527 // Read and process a record.
2528 Record.clear();
2529 Expected<unsigned> MaybeRecordType = Stream.readRecord(Entry.ID, Record);
2530 if (!MaybeRecordType) {
2531 // FIXME this drops errors on the floor.
2532 consumeError(MaybeRecordType.takeError());
2533 return Failure;
2534 }
2535 switch ((OptionsRecordTypes)MaybeRecordType.get()) {
2536 case LANGUAGE_OPTIONS: {
2537 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2538 if (ParseLanguageOptions(Record, Complain, Listener,
2539 AllowCompatibleConfigurationMismatch))
2540 Result = ConfigurationMismatch;
2541 break;
2542 }
2543
2544 case TARGET_OPTIONS: {
2545 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2546 if (ParseTargetOptions(Record, Complain, Listener,
2547 AllowCompatibleConfigurationMismatch))
2548 Result = ConfigurationMismatch;
2549 break;
2550 }
2551
2552 case FILE_SYSTEM_OPTIONS: {
2553 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2554 if (!AllowCompatibleConfigurationMismatch &&
2555 ParseFileSystemOptions(Record, Complain, Listener))
2556 Result = ConfigurationMismatch;
2557 break;
2558 }
2559
2560 case HEADER_SEARCH_OPTIONS: {
2561 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2562 if (!AllowCompatibleConfigurationMismatch &&
2563 ParseHeaderSearchOptions(Record, Complain, Listener))
2564 Result = ConfigurationMismatch;
2565 break;
2566 }
2567
2568 case PREPROCESSOR_OPTIONS:
2569 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2570 if (!AllowCompatibleConfigurationMismatch &&
2571 ParsePreprocessorOptions(Record, Complain, Listener,
2572 SuggestedPredefines))
2573 Result = ConfigurationMismatch;
2574 break;
2575 }
2576 }
2577}
2578
2579ASTReader::ASTReadResult
2580ASTReader::ReadControlBlock(ModuleFile &F,
2581 SmallVectorImpl<ImportedModule> &Loaded,
2582 const ModuleFile *ImportedBy,
2583 unsigned ClientLoadCapabilities) {
2584 BitstreamCursor &Stream = F.Stream;
2585
2586 if (llvm::Error Err = Stream.EnterSubBlock(CONTROL_BLOCK_ID)) {
2587 Error(std::move(Err));
2588 return Failure;
2589 }
2590
2591 // Lambda to read the unhashed control block the first time it's called.
2592 //
2593 // For PCM files, the unhashed control block cannot be read until after the
2594 // MODULE_NAME record. However, PCH files have no MODULE_NAME, and yet still
2595 // need to look ahead before reading the IMPORTS record. For consistency,
2596 // this block is always read somehow (see BitstreamEntry::EndBlock).
2597 bool HasReadUnhashedControlBlock = false;
2598 auto readUnhashedControlBlockOnce = [&]() {
2599 if (!HasReadUnhashedControlBlock) {
2600 HasReadUnhashedControlBlock = true;
2601 if (ASTReadResult Result =
2602 readUnhashedControlBlock(F, ImportedBy, ClientLoadCapabilities))
2603 return Result;
2604 }
2605 return Success;
2606 };
2607
2608 bool DisableValidation = shouldDisableValidationForFile(F);
2609
2610 // Read all of the records and blocks in the control block.
2611 RecordData Record;
2612 unsigned NumInputs = 0;
2613 unsigned NumUserInputs = 0;
2614 StringRef BaseDirectoryAsWritten;
2615 while (true) {
2616 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
2617 if (!MaybeEntry) {
2618 Error(MaybeEntry.takeError());
2619 return Failure;
2620 }
2621 llvm::BitstreamEntry Entry = MaybeEntry.get();
2622
2623 switch (Entry.Kind) {
2624 case llvm::BitstreamEntry::Error:
2625 Error("malformed block record in AST file");
2626 return Failure;
2627 case llvm::BitstreamEntry::EndBlock: {
2628 // Validate the module before returning. This call catches an AST with
2629 // no module name and no imports.
2630 if (ASTReadResult Result = readUnhashedControlBlockOnce())
2631 return Result;
2632
2633 // Validate input files.
2634 const HeaderSearchOptions &HSOpts =
2635 PP.getHeaderSearchInfo().getHeaderSearchOpts();
2636
2637 // All user input files reside at the index range [0, NumUserInputs), and
2638 // system input files reside at [NumUserInputs, NumInputs). For explicitly
2639 // loaded module files, ignore missing inputs.
2640 if (!DisableValidation && F.Kind != MK_ExplicitModule &&
2641 F.Kind != MK_PrebuiltModule) {
2642 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
2643
2644 // If we are reading a module, we will create a verification timestamp,
2645 // so we verify all input files. Otherwise, verify only user input
2646 // files.
2647
2648 unsigned N = NumUserInputs;
2649 if (ValidateSystemInputs ||
2650 (HSOpts.ModulesValidateOncePerBuildSession &&
2651 F.InputFilesValidationTimestamp <= HSOpts.BuildSessionTimestamp &&
2652 F.Kind == MK_ImplicitModule))
2653 N = NumInputs;
2654
2655 for (unsigned I = 0; I < N; ++I) {
2656 InputFile IF = getInputFile(F, I+1, Complain);
2657 if (!IF.getFile() || IF.isOutOfDate())
2658 return OutOfDate;
2659 }
2660 }
2661
2662 if (Listener)
2663 Listener->visitModuleFile(F.FileName, F.Kind);
2664
2665 if (Listener && Listener->needsInputFileVisitation()) {
2666 unsigned N = Listener->needsSystemInputFileVisitation() ? NumInputs
2667 : NumUserInputs;
2668 for (unsigned I = 0; I < N; ++I) {
2669 bool IsSystem = I >= NumUserInputs;
2670 InputFileInfo FI = readInputFileInfo(F, I+1);
2671 Listener->visitInputFile(FI.Filename, IsSystem, FI.Overridden,
2672 F.Kind == MK_ExplicitModule ||
2673 F.Kind == MK_PrebuiltModule);
2674 }
2675 }
2676
2677 return Success;
2678 }
2679
2680 case llvm::BitstreamEntry::SubBlock:
2681 switch (Entry.ID) {
2682 case INPUT_FILES_BLOCK_ID:
2683 F.InputFilesCursor = Stream;
2684 if (llvm::Error Err = Stream.SkipBlock()) {
2685 Error(std::move(Err));
2686 return Failure;
2687 }
2688 if (ReadBlockAbbrevs(F.InputFilesCursor, INPUT_FILES_BLOCK_ID)) {
2689 Error("malformed block record in AST file");
2690 return Failure;
2691 }
2692 continue;
2693
2694 case OPTIONS_BLOCK_ID:
2695 // If we're reading the first module for this group, check its options
2696 // are compatible with ours. For modules it imports, no further checking
2697 // is required, because we checked them when we built it.
2698 if (Listener && !ImportedBy) {
2699 // Should we allow the configuration of the module file to differ from
2700 // the configuration of the current translation unit in a compatible
2701 // way?
2702 //
2703 // FIXME: Allow this for files explicitly specified with -include-pch.
2704 bool AllowCompatibleConfigurationMismatch =
2705 F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule;
2706
2707 ASTReadResult Result =
2708 ReadOptionsBlock(Stream, ClientLoadCapabilities,
2709 AllowCompatibleConfigurationMismatch, *Listener,
2710 SuggestedPredefines);
2711 if (Result == Failure) {
2712 Error("malformed block record in AST file");
2713 return Result;
2714 }
2715
2716 if (DisableValidation ||
2717 (AllowConfigurationMismatch && Result == ConfigurationMismatch))
2718 Result = Success;
2719
2720 // If we can't load the module, exit early since we likely
2721 // will rebuild the module anyway. The stream may be in the
2722 // middle of a block.
2723 if (Result != Success)
2724 return Result;
2725 } else if (llvm::Error Err = Stream.SkipBlock()) {
2726 Error(std::move(Err));
2727 return Failure;
2728 }
2729 continue;
2730
2731 default:
2732 if (llvm::Error Err = Stream.SkipBlock()) {
2733 Error(std::move(Err));
2734 return Failure;
2735 }
2736 continue;
2737 }
2738
2739 case llvm::BitstreamEntry::Record:
2740 // The interesting case.
2741 break;
2742 }
2743
2744 // Read and process a record.
2745 Record.clear();
2746 StringRef Blob;
2747 Expected<unsigned> MaybeRecordType =
2748 Stream.readRecord(Entry.ID, Record, &Blob);
2749 if (!MaybeRecordType) {
2750 Error(MaybeRecordType.takeError());
2751 return Failure;
2752 }
2753 switch ((ControlRecordTypes)MaybeRecordType.get()) {
2754 case METADATA: {
2755 if (Record[0] != VERSION_MAJOR && !DisableValidation) {
2756 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
2757 Diag(Record[0] < VERSION_MAJOR? diag::err_pch_version_too_old
2758 : diag::err_pch_version_too_new);
2759 return VersionMismatch;
2760 }
2761
2762 bool hasErrors = Record[6];
2763 if (hasErrors && !DisableValidation) {
2764 // If requested by the caller and the module hasn't already been read
2765 // or compiled, mark modules on error as out-of-date.
2766 if ((ClientLoadCapabilities & ARR_TreatModuleWithErrorsAsOutOfDate) &&
2767 canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
2768 return OutOfDate;
2769
2770 if (!AllowASTWithCompilerErrors) {
2771 Diag(diag::err_pch_with_compiler_errors);
2772 return HadErrors;
2773 }
2774 }
2775 if (hasErrors) {
2776 Diags.ErrorOccurred = true;
2777 Diags.UncompilableErrorOccurred = true;
2778 Diags.UnrecoverableErrorOccurred = true;
2779 }
2780
2781 F.RelocatablePCH = Record[4];
2782 // Relative paths in a relocatable PCH are relative to our sysroot.
2783 if (F.RelocatablePCH)
2784 F.BaseDirectory = isysroot.empty() ? "/" : isysroot;
2785
2786 F.HasTimestamps = Record[5];
2787
2788 const std::string &CurBranch = getClangFullRepositoryVersion();
2789 StringRef ASTBranch = Blob;
2790 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) {
2791 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
2792 Diag(diag::err_pch_different_branch) << ASTBranch << CurBranch;
2793 return VersionMismatch;
2794 }
2795 break;
2796 }
2797
2798 case IMPORTS: {
2799 // Validate the AST before processing any imports (otherwise, untangling
2800 // them can be error-prone and expensive). A module will have a name and
2801 // will already have been validated, but this catches the PCH case.
2802 if (ASTReadResult Result = readUnhashedControlBlockOnce())
2803 return Result;
2804
2805 // Load each of the imported PCH files.
2806 unsigned Idx = 0, N = Record.size();
2807 while (Idx < N) {
2808 // Read information about the AST file.
2809 ModuleKind ImportedKind = (ModuleKind)Record[Idx++];
2810 // The import location will be the local one for now; we will adjust
2811 // all import locations of module imports after the global source
2812 // location info are setup, in ReadAST.
2813 SourceLocation ImportLoc =
2814 ReadUntranslatedSourceLocation(Record[Idx++]);
2815 off_t StoredSize = (off_t)Record[Idx++];
2816 time_t StoredModTime = (time_t)Record[Idx++];
2817 auto FirstSignatureByte = Record.begin() + Idx;
2818 ASTFileSignature StoredSignature = ASTFileSignature::create(
2819 FirstSignatureByte, FirstSignatureByte + ASTFileSignature::size);
2820 Idx += ASTFileSignature::size;
2821
2822 std::string ImportedName = ReadString(Record, Idx);
2823 std::string ImportedFile;
2824
2825 // For prebuilt and explicit modules first consult the file map for
2826 // an override. Note that here we don't search prebuilt module
2827 // directories, only the explicit name to file mappings. Also, we will
2828 // still verify the size/signature making sure it is essentially the
2829 // same file but perhaps in a different location.
2830 if (ImportedKind == MK_PrebuiltModule || ImportedKind == MK_ExplicitModule)
2831 ImportedFile = PP.getHeaderSearchInfo().getPrebuiltModuleFileName(
2832 ImportedName, /*FileMapOnly*/ true);
2833
2834 if (ImportedFile.empty())
2835 // Use BaseDirectoryAsWritten to ensure we use the same path in the
2836 // ModuleCache as when writing.
2837 ImportedFile = ReadPath(BaseDirectoryAsWritten, Record, Idx);
2838 else
2839 SkipPath(Record, Idx);
2840
2841 // If our client can't cope with us being out of date, we can't cope with
2842 // our dependency being missing.
2843 unsigned Capabilities = ClientLoadCapabilities;
2844 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
2845 Capabilities &= ~ARR_Missing;
2846
2847 // Load the AST file.
2848 auto Result = ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F,
2849 Loaded, StoredSize, StoredModTime,
2850 StoredSignature, Capabilities);
2851
2852 // If we diagnosed a problem, produce a backtrace.
2853 bool recompilingFinalized =
2854 Result == OutOfDate && (Capabilities & ARR_OutOfDate) &&
2855 getModuleManager().getModuleCache().isPCMFinal(F.FileName);
2856 if (isDiagnosedResult(Result, Capabilities) || recompilingFinalized)
2857 Diag(diag::note_module_file_imported_by)
2858 << F.FileName << !F.ModuleName.empty() << F.ModuleName;
2859 if (recompilingFinalized)
2860 Diag(diag::note_module_file_conflict);
2861
2862 switch (Result) {
2863 case Failure: return Failure;
2864 // If we have to ignore the dependency, we'll have to ignore this too.
2865 case Missing:
2866 case OutOfDate: return OutOfDate;
2867 case VersionMismatch: return VersionMismatch;
2868 case ConfigurationMismatch: return ConfigurationMismatch;
2869 case HadErrors: return HadErrors;
2870 case Success: break;
2871 }
2872 }
2873 break;
2874 }
2875
2876 case ORIGINAL_FILE:
2877 F.OriginalSourceFileID = FileID::get(Record[0]);
2878 F.ActualOriginalSourceFileName = std::string(Blob);
2879 F.OriginalSourceFileName = F.ActualOriginalSourceFileName;
2880 ResolveImportedPath(F, F.OriginalSourceFileName);
2881 break;
2882
2883 case ORIGINAL_FILE_ID:
2884 F.OriginalSourceFileID = FileID::get(Record[0]);
2885 break;
2886
2887 case ORIGINAL_PCH_DIR:
2888 F.OriginalDir = std::string(Blob);
2889 break;
2890
2891 case MODULE_NAME:
2892 F.ModuleName = std::string(Blob);
2893 Diag(diag::remark_module_import)
2894 << F.ModuleName << F.FileName << (ImportedBy ? true : false)
2895 << (ImportedBy ? StringRef(ImportedBy->ModuleName) : StringRef());
2896 if (Listener)
2897 Listener->ReadModuleName(F.ModuleName);
2898
2899 // Validate the AST as soon as we have a name so we can exit early on
2900 // failure.
2901 if (ASTReadResult Result = readUnhashedControlBlockOnce())
2902 return Result;
2903
2904 break;
2905
2906 case MODULE_DIRECTORY: {
2907 // Save the BaseDirectory as written in the PCM for computing the module
2908 // filename for the ModuleCache.
2909 BaseDirectoryAsWritten = Blob;
2910 assert(!F.ModuleName.empty() &&((void)0)
2911 "MODULE_DIRECTORY found before MODULE_NAME")((void)0);
2912 // If we've already loaded a module map file covering this module, we may
2913 // have a better path for it (relative to the current build).
2914 Module *M = PP.getHeaderSearchInfo().lookupModule(
2915 F.ModuleName, /*AllowSearch*/ true,
2916 /*AllowExtraModuleMapSearch*/ true);
2917 if (M && M->Directory) {
2918 // If we're implicitly loading a module, the base directory can't
2919 // change between the build and use.
2920 // Don't emit module relocation error if we have -fno-validate-pch
2921 if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
2922 DisableValidationForModuleKind::Module) &&
2923 F.Kind != MK_ExplicitModule && F.Kind != MK_PrebuiltModule) {
2924 auto BuildDir = PP.getFileManager().getDirectory(Blob);
2925 if (!BuildDir || *BuildDir != M->Directory) {
2926 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
2927 Diag(diag::err_imported_module_relocated)
2928 << F.ModuleName << Blob << M->Directory->getName();
2929 return OutOfDate;
2930 }
2931 }
2932 F.BaseDirectory = std::string(M->Directory->getName());
2933 } else {
2934 F.BaseDirectory = std::string(Blob);
2935 }
2936 break;
2937 }
2938
2939 case MODULE_MAP_FILE:
2940 if (ASTReadResult Result =
2941 ReadModuleMapFileBlock(Record, F, ImportedBy, ClientLoadCapabilities))
2942 return Result;
2943 break;
2944
2945 case INPUT_FILE_OFFSETS:
2946 NumInputs = Record[0];
2947 NumUserInputs = Record[1];
2948 F.InputFileOffsets =
2949 (const llvm::support::unaligned_uint64_t *)Blob.data();
2950 F.InputFilesLoaded.resize(NumInputs);
2951 F.NumUserInputFiles = NumUserInputs;
2952 break;
2953 }
2954 }
2955}
2956
2957ASTReader::ASTReadResult
2958ASTReader::ReadASTBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
2959 BitstreamCursor &Stream = F.Stream;
2960
2961 if (llvm::Error Err = Stream.EnterSubBlock(AST_BLOCK_ID)) {
2962 Error(std::move(Err));
2963 return Failure;
2964 }
2965 F.ASTBlockStartOffset = Stream.GetCurrentBitNo();
2966
2967 // Read all of the records and blocks for the AST file.
2968 RecordData Record;
2969 while (true) {
2970 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
2971 if (!MaybeEntry) {
2972 Error(MaybeEntry.takeError());
2973 return Failure;
2974 }
2975 llvm::BitstreamEntry Entry = MaybeEntry.get();
2976
2977 switch (Entry.Kind) {
2978 case llvm::BitstreamEntry::Error:
2979 Error("error at end of module block in AST file");
2980 return Failure;
2981 case llvm::BitstreamEntry::EndBlock:
2982 // Outside of C++, we do not store a lookup map for the translation unit.
2983 // Instead, mark it as needing a lookup map to be built if this module
2984 // contains any declarations lexically within it (which it always does!).
2985 // This usually has no cost, since we very rarely need the lookup map for
2986 // the translation unit outside C++.
2987 if (ASTContext *Ctx = ContextObj) {
2988 DeclContext *DC = Ctx->getTranslationUnitDecl();
2989 if (DC->hasExternalLexicalStorage() && !Ctx->getLangOpts().CPlusPlus)
2990 DC->setMustBuildLookupTable();
2991 }
2992
2993 return Success;
2994 case llvm::BitstreamEntry::SubBlock:
2995 switch (Entry.ID) {
2996 case DECLTYPES_BLOCK_ID:
2997 // We lazily load the decls block, but we want to set up the
2998 // DeclsCursor cursor to point into it. Clone our current bitcode
2999 // cursor to it, enter the block and read the abbrevs in that block.
3000 // With the main cursor, we just skip over it.
3001 F.DeclsCursor = Stream;
3002 if (llvm::Error Err = Stream.SkipBlock()) {
3003 Error(std::move(Err));
3004 return Failure;
3005 }
3006 if (ReadBlockAbbrevs(F.DeclsCursor, DECLTYPES_BLOCK_ID,
3007 &F.DeclsBlockStartOffset)) {
3008 Error("malformed block record in AST file");
3009 return Failure;
3010 }
3011 break;
3012
3013 case PREPROCESSOR_BLOCK_ID:
3014 F.MacroCursor = Stream;
3015 if (!PP.getExternalSource())
3016 PP.setExternalSource(this);
3017
3018 if (llvm::Error Err = Stream.SkipBlock()) {
3019 Error(std::move(Err));
3020 return Failure;
3021 }
3022 if (ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID)) {
3023 Error("malformed block record in AST file");
3024 return Failure;
3025 }
3026 F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo();
3027 break;
3028
3029 case PREPROCESSOR_DETAIL_BLOCK_ID:
3030 F.PreprocessorDetailCursor = Stream;
3031
3032 if (llvm::Error Err = Stream.SkipBlock()) {
3033 Error(std::move(Err));
3034 return Failure;
3035 }
3036 if (ReadBlockAbbrevs(F.PreprocessorDetailCursor,
3037 PREPROCESSOR_DETAIL_BLOCK_ID)) {
3038 Error("malformed preprocessor detail record in AST file");
3039 return Failure;
3040 }
3041 F.PreprocessorDetailStartOffset
3042 = F.PreprocessorDetailCursor.GetCurrentBitNo();
3043
3044 if (!PP.getPreprocessingRecord())
3045 PP.createPreprocessingRecord();
3046 if (!PP.getPreprocessingRecord()->getExternalSource())
3047 PP.getPreprocessingRecord()->SetExternalSource(*this);
3048 break;
3049
3050 case SOURCE_MANAGER_BLOCK_ID:
3051 if (ReadSourceManagerBlock(F))
3052 return Failure;
3053 break;
3054
3055 case SUBMODULE_BLOCK_ID:
3056 if (ASTReadResult Result =
3057 ReadSubmoduleBlock(F, ClientLoadCapabilities))
3058 return Result;
3059 break;
3060
3061 case COMMENTS_BLOCK_ID: {
3062 BitstreamCursor C = Stream;
3063
3064 if (llvm::Error Err = Stream.SkipBlock()) {
3065 Error(std::move(Err));
3066 return Failure;
3067 }
3068 if (ReadBlockAbbrevs(C, COMMENTS_BLOCK_ID)) {
3069 Error("malformed comments block in AST file");
3070 return Failure;
3071 }
3072 CommentsCursors.push_back(std::make_pair(C, &F));
3073 break;
3074 }
3075
3076 default:
3077 if (llvm::Error Err = Stream.SkipBlock()) {
3078 Error(std::move(Err));
3079 return Failure;
3080 }
3081 break;
3082 }
3083 continue;
3084
3085 case llvm::BitstreamEntry::Record:
3086 // The interesting case.
3087 break;
3088 }
3089
3090 // Read and process a record.
3091 Record.clear();
3092 StringRef Blob;
3093 Expected<unsigned> MaybeRecordType =
3094 Stream.readRecord(Entry.ID, Record, &Blob);
3095 if (!MaybeRecordType) {
3096 Error(MaybeRecordType.takeError());
3097 return Failure;
3098 }
3099 ASTRecordTypes RecordType = (ASTRecordTypes)MaybeRecordType.get();
3100
3101 // If we're not loading an AST context, we don't care about most records.
3102 if (!ContextObj) {
3103 switch (RecordType) {
3104 case IDENTIFIER_TABLE:
3105 case IDENTIFIER_OFFSET:
3106 case INTERESTING_IDENTIFIERS:
3107 case STATISTICS:
3108 case PP_CONDITIONAL_STACK:
3109 case PP_COUNTER_VALUE:
3110 case SOURCE_LOCATION_OFFSETS:
3111 case MODULE_OFFSET_MAP:
3112 case SOURCE_MANAGER_LINE_TABLE:
3113 case SOURCE_LOCATION_PRELOADS:
3114 case PPD_ENTITIES_OFFSETS:
3115 case HEADER_SEARCH_TABLE:
3116 case IMPORTED_MODULES:
3117 case MACRO_OFFSET:
3118 break;
3119 default:
3120 continue;
3121 }
3122 }
3123
3124 switch (RecordType) {
3125 default: // Default behavior: ignore.
3126 break;
3127
3128 case TYPE_OFFSET: {
3129 if (F.LocalNumTypes != 0) {
3130 Error("duplicate TYPE_OFFSET record in AST file");
3131 return Failure;
3132 }
3133 F.TypeOffsets = reinterpret_cast<const UnderalignedInt64 *>(Blob.data());
3134 F.LocalNumTypes = Record[0];
3135 unsigned LocalBaseTypeIndex = Record[1];
3136 F.BaseTypeIndex = getTotalNumTypes();
3137
3138 if (F.LocalNumTypes > 0) {
3139 // Introduce the global -> local mapping for types within this module.
3140 GlobalTypeMap.insert(std::make_pair(getTotalNumTypes(), &F));
3141
3142 // Introduce the local -> global mapping for types within this module.
3143 F.TypeRemap.insertOrReplace(
3144 std::make_pair(LocalBaseTypeIndex,
3145 F.BaseTypeIndex - LocalBaseTypeIndex));
3146
3147 TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes);
3148 }
3149 break;
3150 }
3151
3152 case DECL_OFFSET: {
3153 if (F.LocalNumDecls != 0) {
3154 Error("duplicate DECL_OFFSET record in AST file");
3155 return Failure;
3156 }
3157 F.DeclOffsets = (const DeclOffset *)Blob.data();
3158 F.LocalNumDecls = Record[0];
3159 unsigned LocalBaseDeclID = Record[1];
3160 F.BaseDeclID = getTotalNumDecls();
3161
3162 if (F.LocalNumDecls > 0) {
3163 // Introduce the global -> local mapping for declarations within this
3164 // module.
3165 GlobalDeclMap.insert(
3166 std::make_pair(getTotalNumDecls() + NUM_PREDEF_DECL_IDS, &F));
3167
3168 // Introduce the local -> global mapping for declarations within this
3169 // module.
3170 F.DeclRemap.insertOrReplace(
3171 std::make_pair(LocalBaseDeclID, F.BaseDeclID - LocalBaseDeclID));
3172
3173 // Introduce the global -> local mapping for declarations within this
3174 // module.
3175 F.GlobalToLocalDeclIDs[&F] = LocalBaseDeclID;
3176
3177 DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls);
3178 }
3179 break;
3180 }
3181
3182 case TU_UPDATE_LEXICAL: {
3183 DeclContext *TU = ContextObj->getTranslationUnitDecl();
3184 LexicalContents Contents(
3185 reinterpret_cast<const llvm::support::unaligned_uint32_t *>(
3186 Blob.data()),
3187 static_cast<unsigned int>(Blob.size() / 4));
3188 TULexicalDecls.push_back(std::make_pair(&F, Contents));
3189 TU->setHasExternalLexicalStorage(true);
3190 break;
3191 }
3192
3193 case UPDATE_VISIBLE: {
3194 unsigned Idx = 0;
3195 serialization::DeclID ID = ReadDeclID(F, Record, Idx);
3196 auto *Data = (const unsigned char*)Blob.data();
3197 PendingVisibleUpdates[ID].push_back(PendingVisibleUpdate{&F, Data});
3198 // If we've already loaded the decl, perform the updates when we finish
3199 // loading this block.
3200 if (Decl *D = GetExistingDecl(ID))
3201 PendingUpdateRecords.push_back(
3202 PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
3203 break;
3204 }
3205
3206 case IDENTIFIER_TABLE:
3207 F.IdentifierTableData =
3208 reinterpret_cast<const unsigned char *>(Blob.data());
3209 if (Record[0]) {
3210 F.IdentifierLookupTable = ASTIdentifierLookupTable::Create(
3211 F.IdentifierTableData + Record[0],
3212 F.IdentifierTableData + sizeof(uint32_t),
3213 F.IdentifierTableData,
3214 ASTIdentifierLookupTrait(*this, F));
3215
3216 PP.getIdentifierTable().setExternalIdentifierLookup(this);
3217 }
3218 break;
3219
3220 case IDENTIFIER_OFFSET: {
3221 if (F.LocalNumIdentifiers != 0) {
3222 Error("duplicate IDENTIFIER_OFFSET record in AST file");
3223 return Failure;
3224 }
3225 F.IdentifierOffsets = (const uint32_t *)Blob.data();
3226 F.LocalNumIdentifiers = Record[0];
3227 unsigned LocalBaseIdentifierID = Record[1];
3228 F.BaseIdentifierID = getTotalNumIdentifiers();
3229
3230 if (F.LocalNumIdentifiers > 0) {
3231 // Introduce the global -> local mapping for identifiers within this
3232 // module.
3233 GlobalIdentifierMap.insert(std::make_pair(getTotalNumIdentifiers() + 1,
3234 &F));
3235
3236 // Introduce the local -> global mapping for identifiers within this
3237 // module.
3238 F.IdentifierRemap.insertOrReplace(
3239 std::make_pair(LocalBaseIdentifierID,
3240 F.BaseIdentifierID - LocalBaseIdentifierID));
3241
3242 IdentifiersLoaded.resize(IdentifiersLoaded.size()
3243 + F.LocalNumIdentifiers);
3244 }
3245 break;
3246 }
3247
3248 case INTERESTING_IDENTIFIERS:
3249 F.PreloadIdentifierOffsets.assign(Record.begin(), Record.end());
3250 break;
3251
3252 case EAGERLY_DESERIALIZED_DECLS:
3253 // FIXME: Skip reading this record if our ASTConsumer doesn't care
3254 // about "interesting" decls (for instance, if we're building a module).
3255 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3256 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I]));
3257 break;
3258
3259 case MODULAR_CODEGEN_DECLS:
3260 // FIXME: Skip reading this record if our ASTConsumer doesn't care about
3261 // them (ie: if we're not codegenerating this module).
3262 if (F.Kind == MK_MainFile ||
3263 getContext().getLangOpts().BuildingPCHWithObjectFile)
3264 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3265 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I]));
3266 break;
3267
3268 case SPECIAL_TYPES:
3269 if (SpecialTypes.empty()) {
3270 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3271 SpecialTypes.push_back(getGlobalTypeID(F, Record[I]));
3272 break;
3273 }
3274
3275 if (SpecialTypes.size() != Record.size()) {
3276 Error("invalid special-types record");
3277 return Failure;
3278 }
3279
3280 for (unsigned I = 0, N = Record.size(); I != N; ++I) {
3281 serialization::TypeID ID = getGlobalTypeID(F, Record[I]);
3282 if (!SpecialTypes[I])
3283 SpecialTypes[I] = ID;
3284 // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate
3285 // merge step?
3286 }
3287 break;
3288
3289 case STATISTICS:
3290 TotalNumStatements += Record[0];
3291 TotalNumMacros += Record[1];
3292 TotalLexicalDeclContexts += Record[2];
3293 TotalVisibleDeclContexts += Record[3];
3294 break;
3295
3296 case UNUSED_FILESCOPED_DECLS:
3297 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3298 UnusedFileScopedDecls.push_back(getGlobalDeclID(F, Record[I]));
3299 break;
3300
3301 case DELEGATING_CTORS:
3302 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3303 DelegatingCtorDecls.push_back(getGlobalDeclID(F, Record[I]));
3304 break;
3305
3306 case WEAK_UNDECLARED_IDENTIFIERS:
3307 if (Record.size() % 4 != 0) {
3308 Error("invalid weak identifiers record");
3309 return Failure;
3310 }
3311
3312 // FIXME: Ignore weak undeclared identifiers from non-original PCH
3313 // files. This isn't the way to do it :)
3314 WeakUndeclaredIdentifiers.clear();
3315
3316 // Translate the weak, undeclared identifiers into global IDs.
3317 for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) {
3318 WeakUndeclaredIdentifiers.push_back(
3319 getGlobalIdentifierID(F, Record[I++]));
3320 WeakUndeclaredIdentifiers.push_back(
3321 getGlobalIdentifierID(F, Record[I++]));
3322 WeakUndeclaredIdentifiers.push_back(
3323 ReadSourceLocation(F, Record, I).getRawEncoding());
3324 WeakUndeclaredIdentifiers.push_back(Record[I++]);
3325 }
3326 break;
3327
3328 case SELECTOR_OFFSETS: {
3329 F.SelectorOffsets = (const uint32_t *)Blob.data();
3330 F.LocalNumSelectors = Record[0];
3331 unsigned LocalBaseSelectorID = Record[1];
3332 F.BaseSelectorID = getTotalNumSelectors();
3333
3334 if (F.LocalNumSelectors > 0) {
3335 // Introduce the global -> local mapping for selectors within this
3336 // module.
3337 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F));
3338
3339 // Introduce the local -> global mapping for selectors within this
3340 // module.
3341 F.SelectorRemap.insertOrReplace(
3342 std::make_pair(LocalBaseSelectorID,
3343 F.BaseSelectorID - LocalBaseSelectorID));
3344
3345 SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors);
3346 }
3347 break;
3348 }
3349
3350 case METHOD_POOL:
3351 F.SelectorLookupTableData = (const unsigned char *)Blob.data();
3352 if (Record[0])
3353 F.SelectorLookupTable
3354 = ASTSelectorLookupTable::Create(
3355 F.SelectorLookupTableData + Record[0],
3356 F.SelectorLookupTableData,
3357 ASTSelectorLookupTrait(*this, F));
3358 TotalNumMethodPoolEntries += Record[1];
3359 break;
3360
3361 case REFERENCED_SELECTOR_POOL:
3362 if (!Record.empty()) {
3363 for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) {
3364 ReferencedSelectorsData.push_back(getGlobalSelectorID(F,
3365 Record[Idx++]));
3366 ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx).
3367 getRawEncoding());
3368 }
3369 }
3370 break;
3371
3372 case PP_CONDITIONAL_STACK:
3373 if (!Record.empty()) {
3374 unsigned Idx = 0, End = Record.size() - 1;
3375 bool ReachedEOFWhileSkipping = Record[Idx++];
3376 llvm::Optional<Preprocessor::PreambleSkipInfo> SkipInfo;
3377 if (ReachedEOFWhileSkipping) {
3378 SourceLocation HashToken = ReadSourceLocation(F, Record, Idx);
3379 SourceLocation IfTokenLoc = ReadSourceLocation(F, Record, Idx);
3380 bool FoundNonSkipPortion = Record[Idx++];
3381 bool FoundElse = Record[Idx++];
3382 SourceLocation ElseLoc = ReadSourceLocation(F, Record, Idx);
3383 SkipInfo.emplace(HashToken, IfTokenLoc, FoundNonSkipPortion,
3384 FoundElse, ElseLoc);
3385 }
3386 SmallVector<PPConditionalInfo, 4> ConditionalStack;
3387 while (Idx < End) {
3388 auto Loc = ReadSourceLocation(F, Record, Idx);
3389 bool WasSkipping = Record[Idx++];
3390 bool FoundNonSkip = Record[Idx++];
3391 bool FoundElse = Record[Idx++];
3392 ConditionalStack.push_back(
3393 {Loc, WasSkipping, FoundNonSkip, FoundElse});
3394 }
3395 PP.setReplayablePreambleConditionalStack(ConditionalStack, SkipInfo);
3396 }
3397 break;
3398
3399 case PP_COUNTER_VALUE:
3400 if (!Record.empty() && Listener)
3401 Listener->ReadCounter(F, Record[0]);
3402 break;
3403
3404 case FILE_SORTED_DECLS:
3405 F.FileSortedDecls = (const DeclID *)Blob.data();
3406 F.NumFileSortedDecls = Record[0];
3407 break;
3408
3409 case SOURCE_LOCATION_OFFSETS: {
3410 F.SLocEntryOffsets = (const uint32_t *)Blob.data();
3411 F.LocalNumSLocEntries = Record[0];
3412 SourceLocation::UIntTy SLocSpaceSize = Record[1];
3413 F.SLocEntryOffsetsBase = Record[2] + F.SourceManagerBlockStartOffset;
3414 std::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) =
3415 SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries,
3416 SLocSpaceSize);
3417 if (!F.SLocEntryBaseID) {
3418 Error("ran out of source locations");
3419 break;
3420 }
3421 // Make our entry in the range map. BaseID is negative and growing, so
3422 // we invert it. Because we invert it, though, we need the other end of
3423 // the range.
3424 unsigned RangeStart =
3425 unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1;
3426 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F));
3427 F.FirstLoc = SourceLocation::getFromRawEncoding(F.SLocEntryBaseOffset);
3428
3429 // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing.
3430 assert((F.SLocEntryBaseOffset & SourceLocation::MacroIDBit) == 0)((void)0);
3431 GlobalSLocOffsetMap.insert(
3432 std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset
3433 - SLocSpaceSize,&F));
3434
3435 // Initialize the remapping table.
3436 // Invalid stays invalid.
3437 F.SLocRemap.insertOrReplace(std::make_pair(0U, 0));
3438 // This module. Base was 2 when being compiled.
3439 F.SLocRemap.insertOrReplace(std::make_pair(
3440 2U, static_cast<SourceLocation::IntTy>(F.SLocEntryBaseOffset - 2)));
3441
3442 TotalNumSLocEntries += F.LocalNumSLocEntries;
3443 break;
3444 }
3445
3446 case MODULE_OFFSET_MAP:
3447 F.ModuleOffsetMap = Blob;
3448 break;
3449
3450 case SOURCE_MANAGER_LINE_TABLE:
3451 if (ParseLineTable(F, Record)) {
3452 Error("malformed SOURCE_MANAGER_LINE_TABLE in AST file");
3453 return Failure;
3454 }
3455 break;
3456
3457 case SOURCE_LOCATION_PRELOADS: {
3458 // Need to transform from the local view (1-based IDs) to the global view,
3459 // which is based off F.SLocEntryBaseID.
3460 if (!F.PreloadSLocEntries.empty()) {
3461 Error("Multiple SOURCE_LOCATION_PRELOADS records in AST file");
3462 return Failure;
3463 }
3464
3465 F.PreloadSLocEntries.swap(Record);
3466 break;
3467 }
3468
3469 case EXT_VECTOR_DECLS:
3470 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3471 ExtVectorDecls.push_back(getGlobalDeclID(F, Record[I]));
3472 break;
3473
3474 case VTABLE_USES:
3475 if (Record.size() % 3 != 0) {
3476 Error("Invalid VTABLE_USES record");
3477 return Failure;
3478 }
3479
3480 // Later tables overwrite earlier ones.
3481 // FIXME: Modules will have some trouble with this. This is clearly not
3482 // the right way to do this.
3483 VTableUses.clear();
3484
3485 for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) {
3486 VTableUses.push_back(getGlobalDeclID(F, Record[Idx++]));
3487 VTableUses.push_back(
3488 ReadSourceLocation(F, Record, Idx).getRawEncoding());
3489 VTableUses.push_back(Record[Idx++]);
3490 }
3491 break;
3492
3493 case PENDING_IMPLICIT_INSTANTIATIONS:
3494 if (PendingInstantiations.size() % 2 != 0) {
3495 Error("Invalid existing PendingInstantiations");
3496 return Failure;
3497 }
3498
3499 if (Record.size() % 2 != 0) {
3500 Error("Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
3501 return Failure;
3502 }
3503
3504 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
3505 PendingInstantiations.push_back(getGlobalDeclID(F, Record[I++]));
3506 PendingInstantiations.push_back(
3507 ReadSourceLocation(F, Record, I).getRawEncoding());
3508 }
3509 break;
3510
3511 case SEMA_DECL_REFS:
3512 if (Record.size() != 3) {
3513 Error("Invalid SEMA_DECL_REFS block");
3514 return Failure;
3515 }
3516 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3517 SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
3518 break;
3519
3520 case PPD_ENTITIES_OFFSETS: {
3521 F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data();
3522 assert(Blob.size() % sizeof(PPEntityOffset) == 0)((void)0);
3523 F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset);
3524
3525 unsigned LocalBasePreprocessedEntityID = Record[0];
3526
3527 unsigned StartingID;
3528 if (!PP.getPreprocessingRecord())
3529 PP.createPreprocessingRecord();
3530 if (!PP.getPreprocessingRecord()->getExternalSource())
3531 PP.getPreprocessingRecord()->SetExternalSource(*this);
3532 StartingID
3533 = PP.getPreprocessingRecord()
3534 ->allocateLoadedEntities(F.NumPreprocessedEntities);
3535 F.BasePreprocessedEntityID = StartingID;
3536
3537 if (F.NumPreprocessedEntities > 0) {
3538 // Introduce the global -> local mapping for preprocessed entities in
3539 // this module.
3540 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
3541
3542 // Introduce the local -> global mapping for preprocessed entities in
3543 // this module.
3544 F.PreprocessedEntityRemap.insertOrReplace(
3545 std::make_pair(LocalBasePreprocessedEntityID,
3546 F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID));
3547 }
3548
3549 break;
3550 }
3551
3552 case PPD_SKIPPED_RANGES: {
3553 F.PreprocessedSkippedRangeOffsets = (const PPSkippedRange*)Blob.data();
3554 assert(Blob.size() % sizeof(PPSkippedRange) == 0)((void)0);
3555 F.NumPreprocessedSkippedRanges = Blob.size() / sizeof(PPSkippedRange);
3556
3557 if (!PP.getPreprocessingRecord())
3558 PP.createPreprocessingRecord();
3559 if (!PP.getPreprocessingRecord()->getExternalSource())
3560 PP.getPreprocessingRecord()->SetExternalSource(*this);
3561 F.BasePreprocessedSkippedRangeID = PP.getPreprocessingRecord()
3562 ->allocateSkippedRanges(F.NumPreprocessedSkippedRanges);
3563
3564 if (F.NumPreprocessedSkippedRanges > 0)
3565 GlobalSkippedRangeMap.insert(
3566 std::make_pair(F.BasePreprocessedSkippedRangeID, &F));
3567 break;
3568 }
3569
3570 case DECL_UPDATE_OFFSETS:
3571 if (Record.size() % 2 != 0) {
3572 Error("invalid DECL_UPDATE_OFFSETS block in AST file");
3573 return Failure;
3574 }
3575 for (unsigned I = 0, N = Record.size(); I != N; I += 2) {
3576 GlobalDeclID ID = getGlobalDeclID(F, Record[I]);
3577 DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I + 1]));
3578
3579 // If we've already loaded the decl, perform the updates when we finish
3580 // loading this block.
3581 if (Decl *D = GetExistingDecl(ID))
3582 PendingUpdateRecords.push_back(
3583 PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
3584 }
3585 break;
3586
3587 case OBJC_CATEGORIES_MAP:
3588 if (F.LocalNumObjCCategoriesInMap != 0) {
3589 Error("duplicate OBJC_CATEGORIES_MAP record in AST file");
3590 return Failure;
3591 }
3592
3593 F.LocalNumObjCCategoriesInMap = Record[0];
3594 F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data();
3595 break;
3596
3597 case OBJC_CATEGORIES:
3598 F.ObjCCategories.swap(Record);
3599 break;
3600
3601 case CUDA_SPECIAL_DECL_REFS:
3602 // Later tables overwrite earlier ones.
3603 // FIXME: Modules will have trouble with this.
3604 CUDASpecialDeclRefs.clear();
3605 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3606 CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
3607 break;
3608
3609 case HEADER_SEARCH_TABLE:
3610 F.HeaderFileInfoTableData = Blob.data();
3611 F.LocalNumHeaderFileInfos = Record[1];
3612 if (Record[0]) {
3613 F.HeaderFileInfoTable
3614 = HeaderFileInfoLookupTable::Create(
3615 (const unsigned char *)F.HeaderFileInfoTableData + Record[0],
3616 (const unsigned char *)F.HeaderFileInfoTableData,
3617 HeaderFileInfoTrait(*this, F,
3618 &PP.getHeaderSearchInfo(),
3619 Blob.data() + Record[2]));
3620
3621 PP.getHeaderSearchInfo().SetExternalSource(this);
3622 if (!PP.getHeaderSearchInfo().getExternalLookup())
3623 PP.getHeaderSearchInfo().SetExternalLookup(this);
3624 }
3625 break;
3626
3627 case FP_PRAGMA_OPTIONS:
3628 // Later tables overwrite earlier ones.
3629 FPPragmaOptions.swap(Record);
3630 break;
3631
3632 case OPENCL_EXTENSIONS:
3633 for (unsigned I = 0, E = Record.size(); I != E; ) {
3634 auto Name = ReadString(Record, I);
3635 auto &OptInfo = OpenCLExtensions.OptMap[Name];
3636 OptInfo.Supported = Record[I++] != 0;
3637 OptInfo.Enabled = Record[I++] != 0;
3638 OptInfo.WithPragma = Record[I++] != 0;
3639 OptInfo.Avail = Record[I++];
3640 OptInfo.Core = Record[I++];
3641 OptInfo.Opt = Record[I++];
3642 }
3643 break;
3644
3645 case TENTATIVE_DEFINITIONS:
3646 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3647 TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I]));
3648 break;
3649
3650 case KNOWN_NAMESPACES:
3651 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3652 KnownNamespaces.push_back(getGlobalDeclID(F, Record[I]));
3653 break;
3654
3655 case UNDEFINED_BUT_USED:
3656 if (UndefinedButUsed.size() % 2 != 0) {
3657 Error("Invalid existing UndefinedButUsed");
3658 return Failure;
3659 }
3660
3661 if (Record.size() % 2 != 0) {
3662 Error("invalid undefined-but-used record");
3663 return Failure;
3664 }
3665 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
3666 UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++]));
3667 UndefinedButUsed.push_back(
3668 ReadSourceLocation(F, Record, I).getRawEncoding());
3669 }
3670 break;
3671
3672 case DELETE_EXPRS_TO_ANALYZE:
3673 for (unsigned I = 0, N = Record.size(); I != N;) {
3674 DelayedDeleteExprs.push_back(getGlobalDeclID(F, Record[I++]));
3675 const uint64_t Count = Record[I++];
3676 DelayedDeleteExprs.push_back(Count);
3677 for (uint64_t C = 0; C < Count; ++C) {
3678 DelayedDeleteExprs.push_back(ReadSourceLocation(F, Record, I).getRawEncoding());
3679 bool IsArrayForm = Record[I++] == 1;
3680 DelayedDeleteExprs.push_back(IsArrayForm);
3681 }
3682 }
3683 break;
3684
3685 case IMPORTED_MODULES:
3686 if (!F.isModule()) {
3687 // If we aren't loading a module (which has its own exports), make
3688 // all of the imported modules visible.
3689 // FIXME: Deal with macros-only imports.
3690 for (unsigned I = 0, N = Record.size(); I != N; /**/) {
3691 unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]);
3692 SourceLocation Loc = ReadSourceLocation(F, Record, I);
3693 if (GlobalID) {
3694 ImportedModules.push_back(ImportedSubmodule(GlobalID, Loc));
3695 if (DeserializationListener)
3696 DeserializationListener->ModuleImportRead(GlobalID, Loc);
3697 }
3698 }
3699 }
3700 break;
3701
3702 case MACRO_OFFSET: {
3703 if (F.LocalNumMacros != 0) {
3704 Error("duplicate MACRO_OFFSET record in AST file");
3705 return Failure;
3706 }
3707 F.MacroOffsets = (const uint32_t *)Blob.data();
3708 F.LocalNumMacros = Record[0];
3709 unsigned LocalBaseMacroID = Record[1];
3710 F.MacroOffsetsBase = Record[2] + F.ASTBlockStartOffset;
3711 F.BaseMacroID = getTotalNumMacros();
3712
3713 if (F.LocalNumMacros > 0) {
3714 // Introduce the global -> local mapping for macros within this module.
3715 GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F));
3716
3717 // Introduce the local -> global mapping for macros within this module.
3718 F.MacroRemap.insertOrReplace(
3719 std::make_pair(LocalBaseMacroID,
3720 F.BaseMacroID - LocalBaseMacroID));
3721
3722 MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros);
3723 }
3724 break;
3725 }
3726
3727 case LATE_PARSED_TEMPLATE:
3728 LateParsedTemplates.emplace_back(
3729 std::piecewise_construct, std::forward_as_tuple(&F),
3730 std::forward_as_tuple(Record.begin(), Record.end()));
3731 break;
3732
3733 case OPTIMIZE_PRAGMA_OPTIONS:
3734 if (Record.size() != 1) {
3735 Error("invalid pragma optimize record");
3736 return Failure;
3737 }
3738 OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]);
3739 break;
3740
3741 case MSSTRUCT_PRAGMA_OPTIONS:
3742 if (Record.size() != 1) {
3743 Error("invalid pragma ms_struct record");
3744 return Failure;
3745 }
3746 PragmaMSStructState = Record[0];
3747 break;
3748
3749 case POINTERS_TO_MEMBERS_PRAGMA_OPTIONS:
3750 if (Record.size() != 2) {
3751 Error("invalid pragma ms_struct record");
3752 return Failure;
3753 }
3754 PragmaMSPointersToMembersState = Record[0];
3755 PointersToMembersPragmaLocation = ReadSourceLocation(F, Record[1]);
3756 break;
3757
3758 case UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES:
3759 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3760 UnusedLocalTypedefNameCandidates.push_back(
3761 getGlobalDeclID(F, Record[I]));
3762 break;
3763
3764 case CUDA_PRAGMA_FORCE_HOST_DEVICE_DEPTH:
3765 if (Record.size() != 1) {
3766 Error("invalid cuda pragma options record");
3767 return Failure;
3768 }
3769 ForceCUDAHostDeviceDepth = Record[0];
3770 break;
3771
3772 case ALIGN_PACK_PRAGMA_OPTIONS: {
3773 if (Record.size() < 3) {
3774 Error("invalid pragma pack record");
3775 return Failure;
3776 }
3777 PragmaAlignPackCurrentValue = ReadAlignPackInfo(Record[0]);
3778 PragmaAlignPackCurrentLocation = ReadSourceLocation(F, Record[1]);
3779 unsigned NumStackEntries = Record[2];
3780 unsigned Idx = 3;
3781 // Reset the stack when importing a new module.
3782 PragmaAlignPackStack.clear();
3783 for (unsigned I = 0; I < NumStackEntries; ++I) {
3784 PragmaAlignPackStackEntry Entry;
3785 Entry.Value = ReadAlignPackInfo(Record[Idx++]);
3786 Entry.Location = ReadSourceLocation(F, Record[Idx++]);
3787 Entry.PushLocation = ReadSourceLocation(F, Record[Idx++]);
3788 PragmaAlignPackStrings.push_back(ReadString(Record, Idx));
3789 Entry.SlotLabel = PragmaAlignPackStrings.back();
3790 PragmaAlignPackStack.push_back(Entry);
3791 }
3792 break;
3793 }
3794
3795 case FLOAT_CONTROL_PRAGMA_OPTIONS: {
3796 if (Record.size() < 3) {
3797 Error("invalid pragma pack record");
3798 return Failure;
3799 }
3800 FpPragmaCurrentValue = FPOptionsOverride::getFromOpaqueInt(Record[0]);
3801 FpPragmaCurrentLocation = ReadSourceLocation(F, Record[1]);
3802 unsigned NumStackEntries = Record[2];
3803 unsigned Idx = 3;
3804 // Reset the stack when importing a new module.
3805 FpPragmaStack.clear();
3806 for (unsigned I = 0; I < NumStackEntries; ++I) {
3807 FpPragmaStackEntry Entry;
3808 Entry.Value = FPOptionsOverride::getFromOpaqueInt(Record[Idx++]);
3809 Entry.Location = ReadSourceLocation(F, Record[Idx++]);
3810 Entry.PushLocation = ReadSourceLocation(F, Record[Idx++]);
3811 FpPragmaStrings.push_back(ReadString(Record, Idx));
3812 Entry.SlotLabel = FpPragmaStrings.back();
3813 FpPragmaStack.push_back(Entry);
3814 }
3815 break;
3816 }
3817
3818 case DECLS_TO_CHECK_FOR_DEFERRED_DIAGS:
3819 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3820 DeclsToCheckForDeferredDiags.insert(getGlobalDeclID(F, Record[I]));
3821 break;
3822 }
3823 }
3824}
3825
3826void ASTReader::ReadModuleOffsetMap(ModuleFile &F) const {
3827 assert(!F.ModuleOffsetMap.empty() && "no module offset map to read")((void)0);
3828
3829 // Additional remapping information.
3830 const unsigned char *Data = (const unsigned char*)F.ModuleOffsetMap.data();
3831 const unsigned char *DataEnd = Data + F.ModuleOffsetMap.size();
3832 F.ModuleOffsetMap = StringRef();
3833
3834 // If we see this entry before SOURCE_LOCATION_OFFSETS, add placeholders.
3835 if (F.SLocRemap.find(0) == F.SLocRemap.end()) {
3836 F.SLocRemap.insert(std::make_pair(0U, 0));
3837 F.SLocRemap.insert(std::make_pair(2U, 1));
3838 }
3839
3840 // Continuous range maps we may be updating in our module.
3841 using SLocRemapBuilder =
3842 ContinuousRangeMap<SourceLocation::UIntTy, SourceLocation::IntTy,
3843 2>::Builder;
3844 using RemapBuilder = ContinuousRangeMap<uint32_t, int, 2>::Builder;
3845 SLocRemapBuilder SLocRemap(F.SLocRemap);
3846 RemapBuilder IdentifierRemap(F.IdentifierRemap);
3847 RemapBuilder MacroRemap(F.MacroRemap);
3848 RemapBuilder PreprocessedEntityRemap(F.PreprocessedEntityRemap);
3849 RemapBuilder SubmoduleRemap(F.SubmoduleRemap);
3850 RemapBuilder SelectorRemap(F.SelectorRemap);
3851 RemapBuilder DeclRemap(F.DeclRemap);
3852 RemapBuilder TypeRemap(F.TypeRemap);
3853
3854 while (Data < DataEnd) {
3855 // FIXME: Looking up dependency modules by filename is horrible. Let's
3856 // start fixing this with prebuilt, explicit and implicit modules and see
3857 // how it goes...
3858 using namespace llvm::support;
3859 ModuleKind Kind = static_cast<ModuleKind>(
3860 endian::readNext<uint8_t, little, unaligned>(Data));
3861 uint16_t Len = endian::readNext<uint16_t, little, unaligned>(Data);
3862 StringRef Name = StringRef((const char*)Data, Len);
3863 Data += Len;
3864 ModuleFile *OM = (Kind == MK_PrebuiltModule || Kind == MK_ExplicitModule ||
3865 Kind == MK_ImplicitModule
3866 ? ModuleMgr.lookupByModuleName(Name)
3867 : ModuleMgr.lookupByFileName(Name));
3868 if (!OM) {
3869 std::string Msg =
3870 "SourceLocation remap refers to unknown module, cannot find ";
3871 Msg.append(std::string(Name));
3872 Error(Msg);
3873 return;
3874 }
3875
3876 SourceLocation::UIntTy SLocOffset =
3877 endian::readNext<uint32_t, little, unaligned>(Data);
3878 uint32_t IdentifierIDOffset =
3879 endian::readNext<uint32_t, little, unaligned>(Data);
3880 uint32_t MacroIDOffset =
3881 endian::readNext<uint32_t, little, unaligned>(Data);
3882 uint32_t PreprocessedEntityIDOffset =
3883 endian::readNext<uint32_t, little, unaligned>(Data);
3884 uint32_t SubmoduleIDOffset =
3885 endian::readNext<uint32_t, little, unaligned>(Data);
3886 uint32_t SelectorIDOffset =
3887 endian::readNext<uint32_t, little, unaligned>(Data);
3888 uint32_t DeclIDOffset =
3889 endian::readNext<uint32_t, little, unaligned>(Data);
3890 uint32_t TypeIndexOffset =
3891 endian::readNext<uint32_t, little, unaligned>(Data);
3892
3893 auto mapOffset = [&](uint32_t Offset, uint32_t BaseOffset,
3894 RemapBuilder &Remap) {
3895 constexpr uint32_t None = std::numeric_limits<uint32_t>::max();
3896 if (Offset != None)
3897 Remap.insert(std::make_pair(Offset,
3898 static_cast<int>(BaseOffset - Offset)));
3899 };
3900
3901 constexpr SourceLocation::UIntTy SLocNone =
3902 std::numeric_limits<SourceLocation::UIntTy>::max();
3903 if (SLocOffset != SLocNone)
3904 SLocRemap.insert(std::make_pair(
3905 SLocOffset, static_cast<SourceLocation::IntTy>(
3906 OM->SLocEntryBaseOffset - SLocOffset)));
3907
3908 mapOffset(IdentifierIDOffset, OM->BaseIdentifierID, IdentifierRemap);
3909 mapOffset(MacroIDOffset, OM->BaseMacroID, MacroRemap);
3910 mapOffset(PreprocessedEntityIDOffset, OM->BasePreprocessedEntityID,
3911 PreprocessedEntityRemap);
3912 mapOffset(SubmoduleIDOffset, OM->BaseSubmoduleID, SubmoduleRemap);
3913 mapOffset(SelectorIDOffset, OM->BaseSelectorID, SelectorRemap);
3914 mapOffset(DeclIDOffset, OM->BaseDeclID, DeclRemap);
3915 mapOffset(TypeIndexOffset, OM->BaseTypeIndex, TypeRemap);
3916
3917 // Global -> local mappings.
3918 F.GlobalToLocalDeclIDs[OM] = DeclIDOffset;
3919 }
3920}
3921
3922ASTReader::ASTReadResult
3923ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F,
3924 const ModuleFile *ImportedBy,
3925 unsigned ClientLoadCapabilities) {
3926 unsigned Idx = 0;
3927 F.ModuleMapPath = ReadPath(F, Record, Idx);
3928
3929 // Try to resolve ModuleName in the current header search context and
3930 // verify that it is found in the same module map file as we saved. If the
3931 // top-level AST file is a main file, skip this check because there is no
3932 // usable header search context.
3933 assert(!F.ModuleName.empty() &&((void)0)
3934 "MODULE_NAME should come before MODULE_MAP_FILE")((void)0);
3935 if (F.Kind == MK_ImplicitModule && ModuleMgr.begin()->Kind != MK_MainFile) {
3936 // An implicitly-loaded module file should have its module listed in some
3937 // module map file that we've already loaded.
3938 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName);
3939 auto &Map = PP.getHeaderSearchInfo().getModuleMap();
3940 const FileEntry *ModMap = M ? Map.getModuleMapFileForUniquing(M) : nullptr;
3941 // Don't emit module relocation error if we have -fno-validate-pch
3942 if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
3943 DisableValidationForModuleKind::Module) &&
3944 !ModMap) {
3945 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities)) {
3946 if (auto ASTFE = M ? M->getASTFile() : None) {
3947 // This module was defined by an imported (explicit) module.
3948 Diag(diag::err_module_file_conflict) << F.ModuleName << F.FileName
3949 << ASTFE->getName();
3950 } else {
3951 // This module was built with a different module map.
3952 Diag(diag::err_imported_module_not_found)
3953 << F.ModuleName << F.FileName
3954 << (ImportedBy ? ImportedBy->FileName : "") << F.ModuleMapPath
3955 << !ImportedBy;
3956 // In case it was imported by a PCH, there's a chance the user is
3957 // just missing to include the search path to the directory containing
3958 // the modulemap.
3959 if (ImportedBy && ImportedBy->Kind == MK_PCH)
3960 Diag(diag::note_imported_by_pch_module_not_found)
3961 << llvm::sys::path::parent_path(F.ModuleMapPath);
3962 }
3963 }
3964 return OutOfDate;
3965 }
3966
3967 assert(M && M->Name == F.ModuleName && "found module with different name")((void)0);
3968
3969 // Check the primary module map file.
3970 auto StoredModMap = FileMgr.getFile(F.ModuleMapPath);
3971 if (!StoredModMap || *StoredModMap != ModMap) {
3972 assert(ModMap && "found module is missing module map file")((void)0);
3973 assert((ImportedBy || F.Kind == MK_ImplicitModule) &&((void)0)
3974 "top-level import should be verified")((void)0);
3975 bool NotImported = F.Kind == MK_ImplicitModule && !ImportedBy;
3976 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
3977 Diag(diag::err_imported_module_modmap_changed)
3978 << F.ModuleName << (NotImported ? F.FileName : ImportedBy->FileName)
3979 << ModMap->getName() << F.ModuleMapPath << NotImported;
3980 return OutOfDate;
3981 }
3982
3983 llvm::SmallPtrSet<const FileEntry *, 1> AdditionalStoredMaps;
3984 for (unsigned I = 0, N = Record[Idx++]; I < N; ++I) {
3985 // FIXME: we should use input files rather than storing names.
3986 std::string Filename = ReadPath(F, Record, Idx);
3987 auto SF = FileMgr.getFile(Filename, false, false);
3988 if (!SF) {
3989 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
3990 Error("could not find file '" + Filename +"' referenced by AST file");
3991 return OutOfDate;
3992 }
3993 AdditionalStoredMaps.insert(*SF);
3994 }
3995
3996 // Check any additional module map files (e.g. module.private.modulemap)
3997 // that are not in the pcm.
3998 if (auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) {
3999 for (const FileEntry *ModMap : *AdditionalModuleMaps) {
4000 // Remove files that match
4001 // Note: SmallPtrSet::erase is really remove
4002 if (!AdditionalStoredMaps.erase(ModMap)) {
4003 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
4004 Diag(diag::err_module_different_modmap)
4005 << F.ModuleName << /*new*/0 << ModMap->getName();
4006 return OutOfDate;
4007 }
4008 }
4009 }
4010
4011 // Check any additional module map files that are in the pcm, but not
4012 // found in header search. Cases that match are already removed.
4013 for (const FileEntry *ModMap : AdditionalStoredMaps) {
4014 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
4015 Diag(diag::err_module_different_modmap)
4016 << F.ModuleName << /*not new*/1 << ModMap->getName();
4017 return OutOfDate;
4018 }
4019 }
4020
4021 if (Listener)
4022 Listener->ReadModuleMapFile(F.ModuleMapPath);
4023 return Success;
4024}
4025
4026/// Move the given method to the back of the global list of methods.
4027static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) {
4028 // Find the entry for this selector in the method pool.
4029 Sema::GlobalMethodPool::iterator Known
4030 = S.MethodPool.find(Method->getSelector());
4031 if (Known == S.MethodPool.end())
4032 return;
4033
4034 // Retrieve the appropriate method list.
4035 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
4036 : Known->second.second;
4037 bool Found = false;
4038 for (ObjCMethodList *List = &Start; List; List = List->getNext()) {
4039 if (!Found) {
4040 if (List->getMethod() == Method) {
4041 Found = true;
4042 } else {
4043 // Keep searching.
4044 continue;
4045 }
4046 }
4047
4048 if (List->getNext())
4049 List->setMethod(List->getNext()->getMethod());
4050 else
4051 List->setMethod(Method);
4052 }
4053}
4054
4055void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner) {
4056 assert(Owner->NameVisibility != Module::Hidden && "nothing to make visible?")((void)0);
4057 for (Decl *D : Names) {
4058 bool wasHidden = !D->isUnconditionallyVisible();
4059 D->setVisibleDespiteOwningModule();
4060
4061 if (wasHidden && SemaObj) {
4062 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) {
4063 moveMethodToBackOfGlobalList(*SemaObj, Method);
4064 }
4065 }
4066 }
4067}
4068
4069void ASTReader::makeModuleVisible(Module *Mod,
4070 Module::NameVisibilityKind NameVisibility,
4071 SourceLocation ImportLoc) {
4072 llvm::SmallPtrSet<Module *, 4> Visited;
4073 SmallVector<Module *, 4> Stack;
4074 Stack.push_back(Mod);
4075 while (!Stack.empty()) {
4076 Mod = Stack.pop_back_val();
4077
4078 if (NameVisibility <= Mod->NameVisibility) {
4079 // This module already has this level of visibility (or greater), so
4080 // there is nothing more to do.
4081 continue;
4082 }
4083
4084 if (Mod->isUnimportable()) {
4085 // Modules that aren't importable cannot be made visible.
4086 continue;
4087 }
4088
4089 // Update the module's name visibility.
4090 Mod->NameVisibility = NameVisibility;
4091
4092 // If we've already deserialized any names from this module,
4093 // mark them as visible.
4094 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
4095 if (Hidden != HiddenNamesMap.end()) {
4096 auto HiddenNames = std::move(*Hidden);
4097 HiddenNamesMap.erase(Hidden);
4098 makeNamesVisible(HiddenNames.second, HiddenNames.first);
4099 assert(HiddenNamesMap.find(Mod) == HiddenNamesMap.end() &&((void)0)
4100 "making names visible added hidden names")((void)0);
4101 }
4102
4103 // Push any exported modules onto the stack to be marked as visible.
4104 SmallVector<Module *, 16> Exports;
4105 Mod->getExportedModules(Exports);
4106 for (SmallVectorImpl<Module *>::iterator
4107 I = Exports.begin(), E = Exports.end(); I != E; ++I) {
4108 Module *Exported = *I;
4109 if (Visited.insert(Exported).second)
4110 Stack.push_back(Exported);
4111 }
4112 }
4113}
4114
4115/// We've merged the definition \p MergedDef into the existing definition
4116/// \p Def. Ensure that \p Def is made visible whenever \p MergedDef is made
4117/// visible.
4118void ASTReader::mergeDefinitionVisibility(NamedDecl *Def,
4119 NamedDecl *MergedDef) {
4120 if (!Def->isUnconditionallyVisible()) {
4121 // If MergedDef is visible or becomes visible, make the definition visible.
4122 if (MergedDef->isUnconditionallyVisible())
4123 Def->setVisibleDespiteOwningModule();
4124 else {
4125 getContext().mergeDefinitionIntoModule(
4126 Def, MergedDef->getImportedOwningModule(),
4127 /*NotifyListeners*/ false);
4128 PendingMergedDefinitionsToDeduplicate.insert(Def);
4129 }
4130 }
4131}
4132
4133bool ASTReader::loadGlobalIndex() {
4134 if (GlobalIndex)
4135 return false;
4136
4137 if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
4138 !PP.getLangOpts().Modules)
4139 return true;
4140
4141 // Try to load the global index.
4142 TriedLoadingGlobalIndex = true;
4143 StringRef ModuleCachePath
4144 = getPreprocessor().getHeaderSearchInfo().getModuleCachePath();
4145 std::pair<GlobalModuleIndex *, llvm::Error> Result =
4146 GlobalModuleIndex::readIndex(ModuleCachePath);
4147 if (llvm::Error Err = std::move(Result.second)) {
4148 assert(!Result.first)((void)0);
4149 consumeError(std::move(Err)); // FIXME this drops errors on the floor.
4150 return true;
4151 }
4152
4153 GlobalIndex.reset(Result.first);
4154 ModuleMgr.setGlobalIndex(GlobalIndex.get());
4155 return false;
4156}
4157
4158bool ASTReader::isGlobalIndexUnavailable() const {
4159 return PP.getLangOpts().Modules && UseGlobalIndex &&
4160 !hasGlobalIndex() && TriedLoadingGlobalIndex;
4161}
4162
4163static void updateModuleTimestamp(ModuleFile &MF) {
4164 // Overwrite the timestamp file contents so that file's mtime changes.
4165 std::string TimestampFilename = MF.getTimestampFilename();
4166 std::error_code EC;
4167 llvm::raw_fd_ostream OS(TimestampFilename, EC,
4168 llvm::sys::fs::OF_TextWithCRLF);
4169 if (EC)
4170 return;
4171 OS << "Timestamp file\n";
4172 OS.close();
4173 OS.clear_error(); // Avoid triggering a fatal error.
4174}
4175
4176/// Given a cursor at the start of an AST file, scan ahead and drop the
4177/// cursor into the start of the given block ID, returning false on success and
4178/// true on failure.
4179static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) {
4180 while (true) {
4181 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance();
4182 if (!MaybeEntry) {
4183 // FIXME this drops errors on the floor.
4184 consumeError(MaybeEntry.takeError());
4185 return true;
4186 }
4187 llvm::BitstreamEntry Entry = MaybeEntry.get();
4188
4189 switch (Entry.Kind) {
4190 case llvm::BitstreamEntry::Error:
4191 case llvm::BitstreamEntry::EndBlock:
4192 return true;
4193
4194 case llvm::BitstreamEntry::Record:
4195 // Ignore top-level records.
4196 if (Expected<unsigned> Skipped = Cursor.skipRecord(Entry.ID))
4197 break;
4198 else {
4199 // FIXME this drops errors on the floor.
4200 consumeError(Skipped.takeError());
4201 return true;
4202 }
4203
4204 case llvm::BitstreamEntry::SubBlock:
4205 if (Entry.ID == BlockID) {
4206 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) {
4207 // FIXME this drops the error on the floor.
4208 consumeError(std::move(Err));
4209 return true;
4210 }
4211 // Found it!
4212 return false;
4213 }
4214
4215 if (llvm::Error Err = Cursor.SkipBlock()) {
4216 // FIXME this drops the error on the floor.
4217 consumeError(std::move(Err));
4218 return true;
4219 }
4220 }
4221 }
4222}
4223
4224ASTReader::ASTReadResult ASTReader::ReadAST(StringRef FileName,
4225 ModuleKind Type,
4226 SourceLocation ImportLoc,
4227 unsigned ClientLoadCapabilities,
4228 SmallVectorImpl<ImportedSubmodule> *Imported) {
4229 llvm::SaveAndRestore<SourceLocation>
4230 SetCurImportLocRAII(CurrentImportLoc, ImportLoc);
4231 llvm::SaveAndRestore<Optional<ModuleKind>> SetCurModuleKindRAII(
4232 CurrentDeserializingModuleKind, Type);
4233
4234 // Defer any pending actions until we get to the end of reading the AST file.
4235 Deserializing AnASTFile(this);
4236
4237 // Bump the generation number.
4238 unsigned PreviousGeneration = 0;
4239 if (ContextObj)
4240 PreviousGeneration = incrementGeneration(*ContextObj);
4241
4242 unsigned NumModules = ModuleMgr.size();
4243 auto removeModulesAndReturn = [&](ASTReadResult ReadResult) {
4244 assert(ReadResult && "expected to return error")((void)0);
4245 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules,
4246 PP.getLangOpts().Modules
4247 ? &PP.getHeaderSearchInfo().getModuleMap()
4248 : nullptr);
4249
4250 // If we find that any modules are unusable, the global index is going
4251 // to be out-of-date. Just remove it.
4252 GlobalIndex.reset();
4253 ModuleMgr.setGlobalIndex(nullptr);
4254 return ReadResult;
4255 };
4256
4257 SmallVector<ImportedModule, 4> Loaded;
4258 switch (ASTReadResult ReadResult =
4259 ReadASTCore(FileName, Type, ImportLoc,
4260 /*ImportedBy=*/nullptr, Loaded, 0, 0,
4261 ASTFileSignature(), ClientLoadCapabilities)) {
4262 case Failure:
4263 case Missing:
4264 case OutOfDate:
4265 case VersionMismatch:
4266 case ConfigurationMismatch:
4267 case HadErrors:
4268 return removeModulesAndReturn(ReadResult);
4269 case Success:
4270 break;
4271 }
4272
4273 // Here comes stuff that we only do once the entire chain is loaded.
4274
4275 // Load the AST blocks of all of the modules that we loaded. We can still
4276 // hit errors parsing the ASTs at this point.
4277 for (ImportedModule &M : Loaded) {
4278 ModuleFile &F = *M.Mod;
4279
4280 // Read the AST block.
4281 if (ASTReadResult Result = ReadASTBlock(F, ClientLoadCapabilities))
4282 return removeModulesAndReturn(Result);
4283
4284 // The AST block should always have a definition for the main module.
4285 if (F.isModule() && !F.DidReadTopLevelSubmodule) {
4286 Error(diag::err_module_file_missing_top_level_submodule, F.FileName);
4287 return removeModulesAndReturn(Failure);
4288 }
4289
4290 // Read the extension blocks.
4291 while (!SkipCursorToBlock(F.Stream, EXTENSION_BLOCK_ID)) {
4292 if (ASTReadResult Result = ReadExtensionBlock(F))
4293 return removeModulesAndReturn(Result);
4294 }
4295
4296 // Once read, set the ModuleFile bit base offset and update the size in
4297 // bits of all files we've seen.
4298 F.GlobalBitOffset = TotalModulesSizeInBits;
4299 TotalModulesSizeInBits += F.SizeInBits;
4300 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F));
4301 }
4302
4303 // Preload source locations and interesting indentifiers.
4304 for (ImportedModule &M : Loaded) {
4305 ModuleFile &F = *M.Mod;
4306
4307 // Preload SLocEntries.
4308 for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) {
4309 int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID;
4310 // Load it through the SourceManager and don't call ReadSLocEntry()
4311 // directly because the entry may have already been loaded in which case
4312 // calling ReadSLocEntry() directly would trigger an assertion in
4313 // SourceManager.
4314 SourceMgr.getLoadedSLocEntryByID(Index);
4315 }
4316
4317 // Map the original source file ID into the ID space of the current
4318 // compilation.
4319 if (F.OriginalSourceFileID.isValid()) {
4320 F.OriginalSourceFileID = FileID::get(
4321 F.SLocEntryBaseID + F.OriginalSourceFileID.getOpaqueValue() - 1);
4322 }
4323
4324 // Preload all the pending interesting identifiers by marking them out of
4325 // date.
4326 for (auto Offset : F.PreloadIdentifierOffsets) {
4327 const unsigned char *Data = F.IdentifierTableData + Offset;
4328
4329 ASTIdentifierLookupTrait Trait(*this, F);
4330 auto KeyDataLen = Trait.ReadKeyDataLength(Data);
4331 auto Key = Trait.ReadKey(Data, KeyDataLen.first);
4332 auto &II = PP.getIdentifierTable().getOwn(Key);
4333 II.setOutOfDate(true);
4334
4335 // Mark this identifier as being from an AST file so that we can track
4336 // whether we need to serialize it.
4337 markIdentifierFromAST(*this, II);
4338
4339 // Associate the ID with the identifier so that the writer can reuse it.
4340 auto ID = Trait.ReadIdentifierID(Data + KeyDataLen.first);
4341 SetIdentifierInfo(ID, &II);
4342 }
4343 }
4344
4345 // Setup the import locations and notify the module manager that we've
4346 // committed to these module files.
4347 for (ImportedModule &M : Loaded) {
4348 ModuleFile &F = *M.Mod;
4349
4350 ModuleMgr.moduleFileAccepted(&F);
4351
4352 // Set the import location.
4353 F.DirectImportLoc = ImportLoc;
4354 // FIXME: We assume that locations from PCH / preamble do not need
4355 // any translation.
4356 if (!M.ImportedBy)
4357 F.ImportLoc = M.ImportLoc;
4358 else
4359 F.ImportLoc = TranslateSourceLocation(*M.ImportedBy, M.ImportLoc);
4360 }
4361
4362 if (!PP.getLangOpts().CPlusPlus ||
4363 (Type != MK_ImplicitModule && Type != MK_ExplicitModule &&
4364 Type != MK_PrebuiltModule)) {
4365 // Mark all of the identifiers in the identifier table as being out of date,
4366 // so that various accessors know to check the loaded modules when the
4367 // identifier is used.
4368 //
4369 // For C++ modules, we don't need information on many identifiers (just
4370 // those that provide macros or are poisoned), so we mark all of
4371 // the interesting ones via PreloadIdentifierOffsets.
4372 for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(),
4373 IdEnd = PP.getIdentifierTable().end();
4374 Id != IdEnd; ++Id)
4375 Id->second->setOutOfDate(true);
4376 }
4377 // Mark selectors as out of date.
4378 for (auto Sel : SelectorGeneration)
4379 SelectorOutOfDate[Sel.first] = true;
4380
4381 // Resolve any unresolved module exports.
4382 for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) {
4383 UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I];
4384 SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID);
4385 Module *ResolvedMod = getSubmodule(GlobalID);
4386
4387 switch (Unresolved.Kind) {
4388 case UnresolvedModuleRef::Conflict:
4389 if (ResolvedMod) {
4390 Module::Conflict Conflict;
4391 Conflict.Other = ResolvedMod;
4392 Conflict.Message = Unresolved.String.str();
4393 Unresolved.Mod->Conflicts.push_back(Conflict);
4394 }
4395 continue;
4396
4397 case UnresolvedModuleRef::Import:
4398 if (ResolvedMod)
4399 Unresolved.Mod->Imports.insert(ResolvedMod);
4400 continue;
4401
4402 case UnresolvedModuleRef::Export:
4403 if (ResolvedMod || Unresolved.IsWildcard)
4404 Unresolved.Mod->Exports.push_back(
4405 Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard));
4406 continue;
4407 }
4408 }
4409 UnresolvedModuleRefs.clear();
4410
4411 if (Imported)
4412 Imported->append(ImportedModules.begin(),
4413 ImportedModules.end());
4414
4415 // FIXME: How do we load the 'use'd modules? They may not be submodules.
4416 // Might be unnecessary as use declarations are only used to build the
4417 // module itself.
4418
4419 if (ContextObj)
4420 InitializeContext();
4421
4422 if (SemaObj)
4423 UpdateSema();
4424
4425 if (DeserializationListener)
4426 DeserializationListener->ReaderInitialized(this);
4427
4428 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
4429 if (PrimaryModule.OriginalSourceFileID.isValid()) {
4430 // If this AST file is a precompiled preamble, then set the
4431 // preamble file ID of the source manager to the file source file
4432 // from which the preamble was built.
4433 if (Type == MK_Preamble) {
4434 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID);
4435 } else if (Type == MK_MainFile) {
4436 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID);
4437 }
4438 }
4439
4440 // For any Objective-C class definitions we have already loaded, make sure
4441 // that we load any additional categories.
4442 if (ContextObj) {
4443 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
4444 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
4445 ObjCClassesLoaded[I],
4446 PreviousGeneration);
4447 }
4448 }
4449
4450 if (PP.getHeaderSearchInfo()
4451 .getHeaderSearchOpts()
4452 .ModulesValidateOncePerBuildSession) {
4453 // Now we are certain that the module and all modules it depends on are
4454 // up to date. Create or update timestamp files for modules that are
4455 // located in the module cache (not for PCH files that could be anywhere
4456 // in the filesystem).
4457 for (unsigned I = 0, N = Loaded.size(); I != N; ++I) {
4458 ImportedModule &M = Loaded[I];
4459 if (M.Mod->Kind == MK_ImplicitModule) {
4460 updateModuleTimestamp(*M.Mod);
4461 }
4462 }
4463 }
4464
4465 return Success;
4466}
4467
4468static ASTFileSignature readASTFileSignature(StringRef PCH);
4469
4470/// Whether \p Stream doesn't start with the AST/PCH file magic number 'CPCH'.
4471static llvm::Error doesntStartWithASTFileMagic(BitstreamCursor &Stream) {
4472 // FIXME checking magic headers is done in other places such as
4473 // SerializedDiagnosticReader and GlobalModuleIndex, but error handling isn't
4474 // always done the same. Unify it all with a helper.
4475 if (!Stream.canSkipToPos(4))
4476 return llvm::createStringError(std::errc::illegal_byte_sequence,
4477 "file too small to contain AST file magic");
4478 for (unsigned C : {'C', 'P', 'C', 'H'})
4479 if (Expected<llvm::SimpleBitstreamCursor::word_t> Res = Stream.Read(8)) {
4480 if (Res.get() != C)
4481 return llvm::createStringError(
4482 std::errc::illegal_byte_sequence,
4483 "file doesn't start with AST file magic");
4484 } else
4485 return Res.takeError();
4486 return llvm::Error::success();
4487}
4488
4489static unsigned moduleKindForDiagnostic(ModuleKind Kind) {
4490 switch (Kind) {
4491 case MK_PCH:
4492 return 0; // PCH
4493 case MK_ImplicitModule:
4494 case MK_ExplicitModule:
4495 case MK_PrebuiltModule:
4496 return 1; // module
4497 case MK_MainFile:
4498 case MK_Preamble:
4499 return 2; // main source file
4500 }
4501 llvm_unreachable("unknown module kind")__builtin_unreachable();
4502}
4503
4504ASTReader::ASTReadResult
4505ASTReader::ReadASTCore(StringRef FileName,
4506 ModuleKind Type,
4507 SourceLocation ImportLoc,
4508 ModuleFile *ImportedBy,
4509 SmallVectorImpl<ImportedModule> &Loaded,
4510 off_t ExpectedSize, time_t ExpectedModTime,
4511 ASTFileSignature ExpectedSignature,
4512 unsigned ClientLoadCapabilities) {
4513 ModuleFile *M;
4514 std::string ErrorStr;
4515 ModuleManager::AddModuleResult AddResult
4516 = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy,
4517 getGeneration(), ExpectedSize, ExpectedModTime,
4518 ExpectedSignature, readASTFileSignature,
4519 M, ErrorStr);
4520
4521 switch (AddResult) {
4522 case ModuleManager::AlreadyLoaded:
4523 Diag(diag::remark_module_import)
4524 << M->ModuleName << M->FileName << (ImportedBy ? true : false)
4525 << (ImportedBy ? StringRef(ImportedBy->ModuleName) : StringRef());
4526 return Success;
4527
4528 case ModuleManager::NewlyLoaded:
4529 // Load module file below.
4530 break;
4531
4532 case ModuleManager::Missing:
4533 // The module file was missing; if the client can handle that, return
4534 // it.
4535 if (ClientLoadCapabilities & ARR_Missing)
4536 return Missing;
4537
4538 // Otherwise, return an error.
4539 Diag(diag::err_ast_file_not_found)
4540 << moduleKindForDiagnostic(Type) << FileName << !ErrorStr.empty()
4541 << ErrorStr;
4542 return Failure;
4543
4544 case ModuleManager::OutOfDate:
4545 // We couldn't load the module file because it is out-of-date. If the
4546 // client can handle out-of-date, return it.
4547 if (ClientLoadCapabilities & ARR_OutOfDate)
4548 return OutOfDate;
4549
4550 // Otherwise, return an error.
4551 Diag(diag::err_ast_file_out_of_date)
4552 << moduleKindForDiagnostic(Type) << FileName << !ErrorStr.empty()
4553 << ErrorStr;
4554 return Failure;
4555 }
4556
4557 assert(M && "Missing module file")((void)0);
4558
4559 bool ShouldFinalizePCM = false;
4560 auto FinalizeOrDropPCM = llvm::make_scope_exit([&]() {
4561 auto &MC = getModuleManager().getModuleCache();
4562 if (ShouldFinalizePCM)
4563 MC.finalizePCM(FileName);
4564 else
4565 MC.tryToDropPCM(FileName);
4566 });
4567 ModuleFile &F = *M;
4568 BitstreamCursor &Stream = F.Stream;
4569 Stream = BitstreamCursor(PCHContainerRdr.ExtractPCH(*F.Buffer));
4570 F.SizeInBits = F.Buffer->getBufferSize() * 8;
4571
4572 // Sniff for the signature.
4573 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
4574 Diag(diag::err_ast_file_invalid)
4575 << moduleKindForDiagnostic(Type) << FileName << std::move(Err);
4576 return Failure;
4577 }
4578
4579 // This is used for compatibility with older PCH formats.
4580 bool HaveReadControlBlock = false;
4581 while (true) {
4582 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
4583 if (!MaybeEntry) {
4584 Error(MaybeEntry.takeError());
4585 return Failure;
4586 }
4587 llvm::BitstreamEntry Entry = MaybeEntry.get();
4588
4589 switch (Entry.Kind) {
4590 case llvm::BitstreamEntry::Error:
4591 case llvm::BitstreamEntry::Record:
4592 case llvm::BitstreamEntry::EndBlock:
4593 Error("invalid record at top-level of AST file");
4594 return Failure;
4595
4596 case llvm::BitstreamEntry::SubBlock:
4597 break;
4598 }
4599
4600 switch (Entry.ID) {
4601 case CONTROL_BLOCK_ID:
4602 HaveReadControlBlock = true;
4603 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
4604 case Success:
4605 // Check that we didn't try to load a non-module AST file as a module.
4606 //
4607 // FIXME: Should we also perform the converse check? Loading a module as
4608 // a PCH file sort of works, but it's a bit wonky.
4609 if ((Type == MK_ImplicitModule || Type == MK_ExplicitModule ||
4610 Type == MK_PrebuiltModule) &&
4611 F.ModuleName.empty()) {
4612 auto Result = (Type == MK_ImplicitModule) ? OutOfDate : Failure;
4613 if (Result != OutOfDate ||
4614 (ClientLoadCapabilities & ARR_OutOfDate) == 0)
4615 Diag(diag::err_module_file_not_module) << FileName;
4616 return Result;
4617 }
4618 break;
4619
4620 case Failure: return Failure;
4621 case Missing: return Missing;
4622 case OutOfDate: return OutOfDate;
4623 case VersionMismatch: return VersionMismatch;
4624 case ConfigurationMismatch: return ConfigurationMismatch;
4625 case HadErrors: return HadErrors;
4626 }
4627 break;
4628
4629 case AST_BLOCK_ID:
4630 if (!HaveReadControlBlock) {
4631 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
4632 Diag(diag::err_pch_version_too_old);
4633 return VersionMismatch;
4634 }
4635
4636 // Record that we've loaded this module.
4637 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc));
4638 ShouldFinalizePCM = true;
4639 return Success;
4640
4641 case UNHASHED_CONTROL_BLOCK_ID:
4642 // This block is handled using look-ahead during ReadControlBlock. We
4643 // shouldn't get here!
4644 Error("malformed block record in AST file");
4645 return Failure;
4646
4647 default:
4648 if (llvm::Error Err = Stream.SkipBlock()) {
4649 Error(std::move(Err));
4650 return Failure;
4651 }
4652 break;
4653 }
4654 }
4655
4656 llvm_unreachable("unexpected break; expected return")__builtin_unreachable();
4657}
4658
4659ASTReader::ASTReadResult
4660ASTReader::readUnhashedControlBlock(ModuleFile &F, bool WasImportedBy,
4661 unsigned ClientLoadCapabilities) {
4662 const HeaderSearchOptions &HSOpts =
4663 PP.getHeaderSearchInfo().getHeaderSearchOpts();
4664 bool AllowCompatibleConfigurationMismatch =
4665 F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule;
4666 bool DisableValidation = shouldDisableValidationForFile(F);
4667
4668 ASTReadResult Result = readUnhashedControlBlockImpl(
4669 &F, F.Data, ClientLoadCapabilities, AllowCompatibleConfigurationMismatch,
4670 Listener.get(),
4671 WasImportedBy ? false : HSOpts.ModulesValidateDiagnosticOptions);
4672
4673 // If F was directly imported by another module, it's implicitly validated by
4674 // the importing module.
4675 if (DisableValidation || WasImportedBy ||
4676 (AllowConfigurationMismatch && Result == ConfigurationMismatch))
4677 return Success;
4678
4679 if (Result == Failure) {
4680 Error("malformed block record in AST file");
4681 return Failure;
4682 }
4683
4684 if (Result == OutOfDate && F.Kind == MK_ImplicitModule) {
4685 // If this module has already been finalized in the ModuleCache, we're stuck
4686 // with it; we can only load a single version of each module.
4687 //
4688 // This can happen when a module is imported in two contexts: in one, as a
4689 // user module; in another, as a system module (due to an import from
4690 // another module marked with the [system] flag). It usually indicates a
4691 // bug in the module map: this module should also be marked with [system].
4692 //
4693 // If -Wno-system-headers (the default), and the first import is as a
4694 // system module, then validation will fail during the as-user import,
4695 // since -Werror flags won't have been validated. However, it's reasonable
4696 // to treat this consistently as a system module.
4697 //
4698 // If -Wsystem-headers, the PCM on disk was built with
4699 // -Wno-system-headers, and the first import is as a user module, then
4700 // validation will fail during the as-system import since the PCM on disk
4701 // doesn't guarantee that -Werror was respected. However, the -Werror
4702 // flags were checked during the initial as-user import.
4703 if (getModuleManager().getModuleCache().isPCMFinal(F.FileName)) {
4704 Diag(diag::warn_module_system_bit_conflict) << F.FileName;
4705 return Success;
4706 }
4707 }
4708
4709 return Result;
4710}
4711
4712ASTReader::ASTReadResult ASTReader::readUnhashedControlBlockImpl(
4713 ModuleFile *F, llvm::StringRef StreamData, unsigned ClientLoadCapabilities,
4714 bool AllowCompatibleConfigurationMismatch, ASTReaderListener *Listener,
4715 bool ValidateDiagnosticOptions) {
4716 // Initialize a stream.
4717 BitstreamCursor Stream(StreamData);
4718
4719 // Sniff for the signature.
4720 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
4721 // FIXME this drops the error on the floor.
4722 consumeError(std::move(Err));
4723 return Failure;
4724 }
4725
4726 // Scan for the UNHASHED_CONTROL_BLOCK_ID block.
4727 if (SkipCursorToBlock(Stream, UNHASHED_CONTROL_BLOCK_ID))
4728 return Failure;
4729
4730 // Read all of the records in the options block.
4731 RecordData Record;
4732 ASTReadResult Result = Success;
4733 while (true) {
4734 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
4735 if (!MaybeEntry) {
4736 // FIXME this drops the error on the floor.
4737 consumeError(MaybeEntry.takeError());
4738 return Failure;
4739 }
4740 llvm::BitstreamEntry Entry = MaybeEntry.get();
4741
4742 switch (Entry.Kind) {
4743 case llvm::BitstreamEntry::Error:
4744 case llvm::BitstreamEntry::SubBlock:
4745 return Failure;
4746
4747 case llvm::BitstreamEntry::EndBlock:
4748 return Result;
4749
4750 case llvm::BitstreamEntry::Record:
4751 // The interesting case.
4752 break;
4753 }
4754
4755 // Read and process a record.
4756 Record.clear();
4757 Expected<unsigned> MaybeRecordType = Stream.readRecord(Entry.ID, Record);
4758 if (!MaybeRecordType) {
4759 // FIXME this drops the error.
4760 return Failure;
4761 }
4762 switch ((UnhashedControlBlockRecordTypes)MaybeRecordType.get()) {
4763 case SIGNATURE:
4764 if (F)
4765 F->Signature = ASTFileSignature::create(Record.begin(), Record.end());
4766 break;
4767 case AST_BLOCK_HASH:
4768 if (F)
4769 F->ASTBlockHash =
4770 ASTFileSignature::create(Record.begin(), Record.end());
4771 break;
4772 case DIAGNOSTIC_OPTIONS: {
4773 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
4774 if (Listener && ValidateDiagnosticOptions &&
4775 !AllowCompatibleConfigurationMismatch &&
4776 ParseDiagnosticOptions(Record, Complain, *Listener))
4777 Result = OutOfDate; // Don't return early. Read the signature.
4778 break;
4779 }
4780 case DIAG_PRAGMA_MAPPINGS:
4781 if (!F)
4782 break;
4783 if (F->PragmaDiagMappings.empty())
4784 F->PragmaDiagMappings.swap(Record);
4785 else
4786 F->PragmaDiagMappings.insert(F->PragmaDiagMappings.end(),
4787 Record.begin(), Record.end());
4788 break;
4789 }
4790 }
4791}
4792
4793/// Parse a record and blob containing module file extension metadata.
4794static bool parseModuleFileExtensionMetadata(
4795 const SmallVectorImpl<uint64_t> &Record,
4796 StringRef Blob,
4797 ModuleFileExtensionMetadata &Metadata) {
4798 if (Record.size() < 4) return true;
4799
4800 Metadata.MajorVersion = Record[0];
4801 Metadata.MinorVersion = Record[1];
4802
4803 unsigned BlockNameLen = Record[2];
4804 unsigned UserInfoLen = Record[3];
4805
4806 if (BlockNameLen + UserInfoLen > Blob.size()) return true;
4807
4808 Metadata.BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen);
4809 Metadata.UserInfo = std::string(Blob.data() + BlockNameLen,
4810 Blob.data() + BlockNameLen + UserInfoLen);
4811 return false;
4812}
4813
4814ASTReader::ASTReadResult ASTReader::ReadExtensionBlock(ModuleFile &F) {
4815 BitstreamCursor &Stream = F.Stream;
4816
4817 RecordData Record;
4818 while (true) {
4819 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
4820 if (!MaybeEntry) {
4821 Error(MaybeEntry.takeError());
4822 return Failure;
4823 }
4824 llvm::BitstreamEntry Entry = MaybeEntry.get();
4825
4826 switch (Entry.Kind) {
4827 case llvm::BitstreamEntry::SubBlock:
4828 if (llvm::Error Err = Stream.SkipBlock()) {
4829 Error(std::move(Err));
4830 return Failure;
4831 }
4832 continue;
4833
4834 case llvm::BitstreamEntry::EndBlock:
4835 return Success;
4836
4837 case llvm::BitstreamEntry::Error:
4838 return HadErrors;
4839
4840 case llvm::BitstreamEntry::Record:
4841 break;
4842 }
4843
4844 Record.clear();
4845 StringRef Blob;
4846 Expected<unsigned> MaybeRecCode =
4847 Stream.readRecord(Entry.ID, Record, &Blob);
4848 if (!MaybeRecCode) {
4849 Error(MaybeRecCode.takeError());
4850 return Failure;
4851 }
4852 switch (MaybeRecCode.get()) {
4853 case EXTENSION_METADATA: {
4854 ModuleFileExtensionMetadata Metadata;
4855 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata)) {
4856 Error("malformed EXTENSION_METADATA in AST file");
4857 return Failure;
4858 }
4859
4860 // Find a module file extension with this block name.
4861 auto Known = ModuleFileExtensions.find(Metadata.BlockName);
4862 if (Known == ModuleFileExtensions.end()) break;
4863
4864 // Form a reader.
4865 if (auto Reader = Known->second->createExtensionReader(Metadata, *this,
4866 F, Stream)) {
4867 F.ExtensionReaders.push_back(std::move(Reader));
4868 }
4869
4870 break;
4871 }
4872 }
4873 }
4874
4875 return Success;
4876}
4877
4878void ASTReader::InitializeContext() {
4879 assert(ContextObj && "no context to initialize")((void)0);
4880 ASTContext &Context = *ContextObj;
4881
4882 // If there's a listener, notify them that we "read" the translation unit.
4883 if (DeserializationListener)
4884 DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID,
4885 Context.getTranslationUnitDecl());
4886
4887 // FIXME: Find a better way to deal with collisions between these
4888 // built-in types. Right now, we just ignore the problem.
4889
4890 // Load the special types.
4891 if (SpecialTypes.size() >= NumSpecialTypeIDs) {
4892 if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) {
4893 if (!Context.CFConstantStringTypeDecl)
4894 Context.setCFConstantStringType(GetType(String));
4895 }
4896
4897 if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) {
4898 QualType FileType = GetType(File);
4899 if (FileType.isNull()) {
4900 Error("FILE type is NULL");
4901 return;
4902 }
4903
4904 if (!Context.FILEDecl) {
4905 if (const TypedefType *Typedef = FileType->getAs<TypedefType>())
4906 Context.setFILEDecl(Typedef->getDecl());
4907 else {
4908 const TagType *Tag = FileType->getAs<TagType>();
4909 if (!Tag) {
4910 Error("Invalid FILE type in AST file");
4911 return;
4912 }
4913 Context.setFILEDecl(Tag->getDecl());
4914 }
4915 }
4916 }
4917
4918 if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) {
4919 QualType Jmp_bufType = GetType(Jmp_buf);
4920 if (Jmp_bufType.isNull()) {
4921 Error("jmp_buf type is NULL");
4922 return;
4923 }
4924
4925 if (!Context.jmp_bufDecl) {
4926 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>())
4927 Context.setjmp_bufDecl(Typedef->getDecl());
4928 else {
4929 const TagType *Tag = Jmp_bufType->getAs<TagType>();
4930 if (!Tag) {
4931 Error("Invalid jmp_buf type in AST file");
4932 return;
4933 }
4934 Context.setjmp_bufDecl(Tag->getDecl());
4935 }
4936 }
4937 }
4938
4939 if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) {
4940 QualType Sigjmp_bufType = GetType(Sigjmp_buf);
4941 if (Sigjmp_bufType.isNull()) {
4942 Error("sigjmp_buf type is NULL");
4943 return;
4944 }
4945
4946 if (!Context.sigjmp_bufDecl) {
4947 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>())
4948 Context.setsigjmp_bufDecl(Typedef->getDecl());
4949 else {
4950 const TagType *Tag = Sigjmp_bufType->getAs<TagType>();
4951 assert(Tag && "Invalid sigjmp_buf type in AST file")((void)0);
4952 Context.setsigjmp_bufDecl(Tag->getDecl());
4953 }
4954 }
4955 }
4956
4957 if (unsigned ObjCIdRedef
4958 = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) {
4959 if (Context.ObjCIdRedefinitionType.isNull())
4960 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef);
4961 }
4962
4963 if (unsigned ObjCClassRedef
4964 = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) {
4965 if (Context.ObjCClassRedefinitionType.isNull())
4966 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef);
4967 }
4968
4969 if (unsigned ObjCSelRedef
4970 = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) {
4971 if (Context.ObjCSelRedefinitionType.isNull())
4972 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef);
4973 }
4974
4975 if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) {
4976 QualType Ucontext_tType = GetType(Ucontext_t);
4977 if (Ucontext_tType.isNull()) {
4978 Error("ucontext_t type is NULL");
4979 return;
4980 }
4981
4982 if (!Context.ucontext_tDecl) {
4983 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>())
4984 Context.setucontext_tDecl(Typedef->getDecl());
4985 else {
4986 const TagType *Tag = Ucontext_tType->getAs<TagType>();
4987 assert(Tag && "Invalid ucontext_t type in AST file")((void)0);
4988 Context.setucontext_tDecl(Tag->getDecl());
4989 }
4990 }
4991 }
4992 }
4993
4994 ReadPragmaDiagnosticMappings(Context.getDiagnostics());
4995
4996 // If there were any CUDA special declarations, deserialize them.
4997 if (!CUDASpecialDeclRefs.empty()) {
4998 assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!")((void)0);
4999 Context.setcudaConfigureCallDecl(
5000 cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0])));
5001 }
5002
5003 // Re-export any modules that were imported by a non-module AST file.
5004 // FIXME: This does not make macro-only imports visible again.
5005 for (auto &Import : ImportedModules) {
5006 if (Module *Imported = getSubmodule(Import.ID)) {
5007 makeModuleVisible(Imported, Module::AllVisible,
5008 /*ImportLoc=*/Import.ImportLoc);
5009 if (Import.ImportLoc.isValid())
5010 PP.makeModuleVisible(Imported, Import.ImportLoc);
5011 // This updates visibility for Preprocessor only. For Sema, which can be
5012 // nullptr here, we do the same later, in UpdateSema().
5013 }
5014 }
5015}
5016
5017void ASTReader::finalizeForWriting() {
5018 // Nothing to do for now.
5019}
5020
5021/// Reads and return the signature record from \p PCH's control block, or
5022/// else returns 0.
5023static ASTFileSignature readASTFileSignature(StringRef PCH) {
5024 BitstreamCursor Stream(PCH);
5025 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
5026 // FIXME this drops the error on the floor.
5027 consumeError(std::move(Err));
5028 return ASTFileSignature();
5029 }
5030
5031 // Scan for the UNHASHED_CONTROL_BLOCK_ID block.
5032 if (SkipCursorToBlock(Stream, UNHASHED_CONTROL_BLOCK_ID))
5033 return ASTFileSignature();
5034
5035 // Scan for SIGNATURE inside the diagnostic options block.
5036 ASTReader::RecordData Record;
5037 while (true) {
5038 Expected<llvm::BitstreamEntry> MaybeEntry =
5039 Stream.advanceSkippingSubblocks();
5040 if (!MaybeEntry) {
5041 // FIXME this drops the error on the floor.
5042 consumeError(MaybeEntry.takeError());
5043 return ASTFileSignature();
5044 }
5045 llvm::BitstreamEntry Entry = MaybeEntry.get();
5046
5047 if (Entry.Kind != llvm::BitstreamEntry::Record)
5048 return ASTFileSignature();
5049
5050 Record.clear();
5051 StringRef Blob;
5052 Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record, &Blob);
5053 if (!MaybeRecord) {
5054 // FIXME this drops the error on the floor.
5055 consumeError(MaybeRecord.takeError());
5056 return ASTFileSignature();
5057 }
5058 if (SIGNATURE == MaybeRecord.get())
5059 return ASTFileSignature::create(Record.begin(),
5060 Record.begin() + ASTFileSignature::size);
5061 }
5062}
5063
5064/// Retrieve the name of the original source file name
5065/// directly from the AST file, without actually loading the AST
5066/// file.
5067std::string ASTReader::getOriginalSourceFile(
5068 const std::string &ASTFileName, FileManager &FileMgr,
5069 const PCHContainerReader &PCHContainerRdr, DiagnosticsEngine &Diags) {
5070 // Open the AST file.
5071 auto Buffer = FileMgr.getBufferForFile(ASTFileName);
5072 if (!Buffer) {
5073 Diags.Report(diag::err_fe_unable_to_read_pch_file)
5074 << ASTFileName << Buffer.getError().message();
5075 return std::string();
5076 }
5077
5078 // Initialize the stream
5079 BitstreamCursor Stream(PCHContainerRdr.ExtractPCH(**Buffer));
5080
5081 // Sniff for the signature.
5082 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
5083 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName << std::move(Err);
5084 return std::string();
5085 }
5086
5087 // Scan for the CONTROL_BLOCK_ID block.
5088 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) {
5089 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
5090 return std::string();
5091 }
5092
5093 // Scan for ORIGINAL_FILE inside the control block.
5094 RecordData Record;
5095 while (true) {
5096 Expected<llvm::BitstreamEntry> MaybeEntry =
5097 Stream.advanceSkippingSubblocks();
5098 if (!MaybeEntry) {
5099 // FIXME this drops errors on the floor.
5100 consumeError(MaybeEntry.takeError());
5101 return std::string();
5102 }
5103 llvm::BitstreamEntry Entry = MaybeEntry.get();
5104
5105 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
5106 return std::string();
5107
5108 if (Entry.Kind != llvm::BitstreamEntry::Record) {
5109 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
5110 return std::string();
5111 }
5112
5113 Record.clear();
5114 StringRef Blob;
5115 Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record, &Blob);
5116 if (!MaybeRecord) {
5117 // FIXME this drops the errors on the floor.
5118 consumeError(MaybeRecord.takeError());
5119 return std::string();
5120 }
5121 if (ORIGINAL_FILE == MaybeRecord.get())
5122 return Blob.str();
5123 }
5124}
5125
5126namespace {
5127
5128 class SimplePCHValidator : public ASTReaderListener {
5129 const LangOptions &ExistingLangOpts;
5130 const TargetOptions &ExistingTargetOpts;
5131 const PreprocessorOptions &ExistingPPOpts;
5132 std::string ExistingModuleCachePath;
5133 FileManager &FileMgr;
5134
5135 public:
5136 SimplePCHValidator(const LangOptions &ExistingLangOpts,
5137 const TargetOptions &ExistingTargetOpts,
5138 const PreprocessorOptions &ExistingPPOpts,
5139 StringRef ExistingModuleCachePath, FileManager &FileMgr)
5140 : ExistingLangOpts(ExistingLangOpts),
5141 ExistingTargetOpts(ExistingTargetOpts),
5142 ExistingPPOpts(ExistingPPOpts),
5143 ExistingModuleCachePath(ExistingModuleCachePath), FileMgr(FileMgr) {}
5144
5145 bool ReadLanguageOptions(const LangOptions &LangOpts, bool Complain,
5146 bool AllowCompatibleDifferences) override {
5147 return checkLanguageOptions(ExistingLangOpts, LangOpts, nullptr,
5148 AllowCompatibleDifferences);
5149 }
5150
5151 bool ReadTargetOptions(const TargetOptions &TargetOpts, bool Complain,
5152 bool AllowCompatibleDifferences) override {
5153 return checkTargetOptions(ExistingTargetOpts, TargetOpts, nullptr,
5154 AllowCompatibleDifferences);
5155 }
5156
5157 bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
5158 StringRef SpecificModuleCachePath,
5159 bool Complain) override {
5160 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
5161 ExistingModuleCachePath, nullptr,
5162 ExistingLangOpts, ExistingPPOpts);
5163 }
5164
5165 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
5166 bool Complain,
5167 std::string &SuggestedPredefines) override {
5168 return checkPreprocessorOptions(ExistingPPOpts, PPOpts, nullptr, FileMgr,
5169 SuggestedPredefines, ExistingLangOpts);
5170 }
5171 };
5172
5173} // namespace
5174
5175bool ASTReader::readASTFileControlBlock(
5176 StringRef Filename, FileManager &FileMgr,
5177 const PCHContainerReader &PCHContainerRdr,
5178 bool FindModuleFileExtensions,
5179 ASTReaderListener &Listener, bool ValidateDiagnosticOptions) {
5180 // Open the AST file.
5181 // FIXME: This allows use of the VFS; we do not allow use of the
5182 // VFS when actually loading a module.
5183 auto Buffer = FileMgr.getBufferForFile(Filename);
5184 if (!Buffer) {
5185 return true;
5186 }
5187
5188 // Initialize the stream
5189 StringRef Bytes = PCHContainerRdr.ExtractPCH(**Buffer);
5190 BitstreamCursor Stream(Bytes);
5191
5192 // Sniff for the signature.
5193 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
5194 consumeError(std::move(Err)); // FIXME this drops errors on the floor.
5195 return true;
5196 }
5197
5198 // Scan for the CONTROL_BLOCK_ID block.
5199 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID))
5200 return true;
5201
5202 bool NeedsInputFiles = Listener.needsInputFileVisitation();
5203 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
5204 bool NeedsImports = Listener.needsImportVisitation();
5205 BitstreamCursor InputFilesCursor;
5206
5207 RecordData Record;
5208 std::string ModuleDir;
5209 bool DoneWithControlBlock = false;
5210 while (!DoneWithControlBlock) {
5211 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5212 if (!MaybeEntry) {
5213 // FIXME this drops the error on the floor.
5214 consumeError(MaybeEntry.takeError());
5215 return true;
5216 }
5217 llvm::BitstreamEntry Entry = MaybeEntry.get();
5218
5219 switch (Entry.Kind) {
5220 case llvm::BitstreamEntry::SubBlock: {
5221 switch (Entry.ID) {
5222 case OPTIONS_BLOCK_ID: {
5223 std::string IgnoredSuggestedPredefines;
5224 if (ReadOptionsBlock(Stream, ARR_ConfigurationMismatch | ARR_OutOfDate,
5225 /*AllowCompatibleConfigurationMismatch*/ false,
5226 Listener, IgnoredSuggestedPredefines) != Success)
5227 return true;
5228 break;
5229 }
5230
5231 case INPUT_FILES_BLOCK_ID:
5232 InputFilesCursor = Stream;
5233 if (llvm::Error Err = Stream.SkipBlock()) {
5234 // FIXME this drops the error on the floor.
5235 consumeError(std::move(Err));
5236 return true;
5237 }
5238 if (NeedsInputFiles &&
5239 ReadBlockAbbrevs(InputFilesCursor, INPUT_FILES_BLOCK_ID))
5240 return true;
5241 break;
5242
5243 default:
5244 if (llvm::Error Err = Stream.SkipBlock()) {
5245 // FIXME this drops the error on the floor.
5246 consumeError(std::move(Err));
5247 return true;
5248 }
5249 break;
5250 }
5251
5252 continue;
5253 }
5254
5255 case llvm::BitstreamEntry::EndBlock:
5256 DoneWithControlBlock = true;
5257 break;
5258
5259 case llvm::BitstreamEntry::Error:
5260 return true;
5261
5262 case llvm::BitstreamEntry::Record:
5263 break;
5264 }
5265
5266 if (DoneWithControlBlock) break;
5267
5268 Record.clear();
5269 StringRef Blob;
5270 Expected<unsigned> MaybeRecCode =
5271 Stream.readRecord(Entry.ID, Record, &Blob);
5272 if (!MaybeRecCode) {
5273 // FIXME this drops the error.
5274 return Failure;
5275 }
5276 switch ((ControlRecordTypes)MaybeRecCode.get()) {
5277 case METADATA:
5278 if (Record[0] != VERSION_MAJOR)
5279 return true;
5280 if (Listener.ReadFullVersionInformation(Blob))
5281 return true;
5282 break;
5283 case MODULE_NAME:
5284 Listener.ReadModuleName(Blob);
5285 break;
5286 case MODULE_DIRECTORY:
5287 ModuleDir = std::string(Blob);
5288 break;
5289 case MODULE_MAP_FILE: {
5290 unsigned Idx = 0;
5291 auto Path = ReadString(Record, Idx);
5292 ResolveImportedPath(Path, ModuleDir);
5293 Listener.ReadModuleMapFile(Path);
5294 break;
5295 }
5296 case INPUT_FILE_OFFSETS: {
5297 if (!NeedsInputFiles)
5298 break;
5299
5300 unsigned NumInputFiles = Record[0];
5301 unsigned NumUserFiles = Record[1];
5302 const llvm::support::unaligned_uint64_t *InputFileOffs =
5303 (const llvm::support::unaligned_uint64_t *)Blob.data();
5304 for (unsigned I = 0; I != NumInputFiles; ++I) {
5305 // Go find this input file.
5306 bool isSystemFile = I >= NumUserFiles;
5307
5308 if (isSystemFile && !NeedsSystemInputFiles)
5309 break; // the rest are system input files
5310
5311 BitstreamCursor &Cursor = InputFilesCursor;
5312 SavedStreamPosition SavedPosition(Cursor);
5313 if (llvm::Error Err = Cursor.JumpToBit(InputFileOffs[I])) {
5314 // FIXME this drops errors on the floor.
5315 consumeError(std::move(Err));
5316 }
5317
5318 Expected<unsigned> MaybeCode = Cursor.ReadCode();
5319 if (!MaybeCode) {
5320 // FIXME this drops errors on the floor.
5321 consumeError(MaybeCode.takeError());
5322 }
5323 unsigned Code = MaybeCode.get();
5324
5325 RecordData Record;
5326 StringRef Blob;
5327 bool shouldContinue = false;
5328 Expected<unsigned> MaybeRecordType =
5329 Cursor.readRecord(Code, Record, &Blob);
5330 if (!MaybeRecordType) {
5331 // FIXME this drops errors on the floor.
5332 consumeError(MaybeRecordType.takeError());
5333 }
5334 switch ((InputFileRecordTypes)MaybeRecordType.get()) {
5335 case INPUT_FILE_HASH:
5336 break;
5337 case INPUT_FILE:
5338 bool Overridden = static_cast<bool>(Record[3]);
5339 std::string Filename = std::string(Blob);
5340 ResolveImportedPath(Filename, ModuleDir);
5341 shouldContinue = Listener.visitInputFile(
5342 Filename, isSystemFile, Overridden, /*IsExplicitModule*/false);
5343 break;
5344 }
5345 if (!shouldContinue)
5346 break;
5347 }
5348 break;
5349 }
5350
5351 case IMPORTS: {
5352 if (!NeedsImports)
5353 break;
5354
5355 unsigned Idx = 0, N = Record.size();
5356 while (Idx < N) {
5357 // Read information about the AST file.
5358 Idx +=
5359 1 + 1 + 1 + 1 +
5360 ASTFileSignature::size; // Kind, ImportLoc, Size, ModTime, Signature
5361 std::string ModuleName = ReadString(Record, Idx);
5362 std::string Filename = ReadString(Record, Idx);
5363 ResolveImportedPath(Filename, ModuleDir);
5364 Listener.visitImport(ModuleName, Filename);
5365 }
5366 break;
5367 }
5368
5369 default:
5370 // No other validation to perform.
5371 break;
5372 }
5373 }
5374
5375 // Look for module file extension blocks, if requested.
5376 if (FindModuleFileExtensions) {
5377 BitstreamCursor SavedStream = Stream;
5378 while (!SkipCursorToBlock(Stream, EXTENSION_BLOCK_ID)) {
5379 bool DoneWithExtensionBlock = false;
5380 while (!DoneWithExtensionBlock) {
5381 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5382 if (!MaybeEntry) {
5383 // FIXME this drops the error.
5384 return true;
5385 }
5386 llvm::BitstreamEntry Entry = MaybeEntry.get();
5387
5388 switch (Entry.Kind) {
5389 case llvm::BitstreamEntry::SubBlock:
5390 if (llvm::Error Err = Stream.SkipBlock()) {
5391 // FIXME this drops the error on the floor.
5392 consumeError(std::move(Err));
5393 return true;
5394 }
5395 continue;
5396
5397 case llvm::BitstreamEntry::EndBlock:
5398 DoneWithExtensionBlock = true;
5399 continue;
5400
5401 case llvm::BitstreamEntry::Error:
5402 return true;
5403
5404 case llvm::BitstreamEntry::Record:
5405 break;
5406 }
5407
5408 Record.clear();
5409 StringRef Blob;
5410 Expected<unsigned> MaybeRecCode =
5411 Stream.readRecord(Entry.ID, Record, &Blob);
5412 if (!MaybeRecCode) {
5413 // FIXME this drops the error.
5414 return true;
5415 }
5416 switch (MaybeRecCode.get()) {
5417 case EXTENSION_METADATA: {
5418 ModuleFileExtensionMetadata Metadata;
5419 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata))
5420 return true;
5421
5422 Listener.readModuleFileExtension(Metadata);
5423 break;
5424 }
5425 }
5426 }
5427 }
5428 Stream = SavedStream;
5429 }
5430
5431 // Scan for the UNHASHED_CONTROL_BLOCK_ID block.
5432 if (readUnhashedControlBlockImpl(
5433 nullptr, Bytes, ARR_ConfigurationMismatch | ARR_OutOfDate,
5434 /*AllowCompatibleConfigurationMismatch*/ false, &Listener,
5435 ValidateDiagnosticOptions) != Success)
5436 return true;
5437
5438 return false;
5439}
5440
5441bool ASTReader::isAcceptableASTFile(StringRef Filename, FileManager &FileMgr,
5442 const PCHContainerReader &PCHContainerRdr,
5443 const LangOptions &LangOpts,
5444 const TargetOptions &TargetOpts,
5445 const PreprocessorOptions &PPOpts,
5446 StringRef ExistingModuleCachePath) {
5447 SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts,
5448 ExistingModuleCachePath, FileMgr);
5449 return !readASTFileControlBlock(Filename, FileMgr, PCHContainerRdr,
5450 /*FindModuleFileExtensions=*/false,
5451 validator,
5452 /*ValidateDiagnosticOptions=*/true);
5453}
5454
5455ASTReader::ASTReadResult
5456ASTReader::ReadSubmoduleBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
5457 // Enter the submodule block.
5458 if (llvm::Error Err = F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) {
5459 Error(std::move(Err));
5460 return Failure;
5461 }
5462
5463 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
5464 bool First = true;
5465 Module *CurrentModule = nullptr;
5466 RecordData Record;
5467 while (true) {
5468 Expected<llvm::BitstreamEntry> MaybeEntry =
5469 F.Stream.advanceSkippingSubblocks();
5470 if (!MaybeEntry) {
5471 Error(MaybeEntry.takeError());
5472 return Failure;
5473 }
5474 llvm::BitstreamEntry Entry = MaybeEntry.get();
5475
5476 switch (Entry.Kind) {
5477 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
5478 case llvm::BitstreamEntry::Error:
5479 Error("malformed block record in AST file");
5480 return Failure;
5481 case llvm::BitstreamEntry::EndBlock:
5482 return Success;
5483 case llvm::BitstreamEntry::Record:
5484 // The interesting case.
5485 break;
5486 }
5487
5488 // Read a record.
5489 StringRef Blob;
5490 Record.clear();
5491 Expected<unsigned> MaybeKind = F.Stream.readRecord(Entry.ID, Record, &Blob);
5492 if (!MaybeKind) {
5493 Error(MaybeKind.takeError());
5494 return Failure;
5495 }
5496 unsigned Kind = MaybeKind.get();
5497
5498 if ((Kind == SUBMODULE_METADATA) != First) {
5499 Error("submodule metadata record should be at beginning of block");
5500 return Failure;
5501 }
5502 First = false;
5503
5504 // Submodule information is only valid if we have a current module.
5505 // FIXME: Should we error on these cases?
5506 if (!CurrentModule && Kind != SUBMODULE_METADATA &&
5507 Kind != SUBMODULE_DEFINITION)
5508 continue;
5509
5510 switch (Kind) {
5511 default: // Default behavior: ignore.
5512 break;
5513
5514 case SUBMODULE_DEFINITION: {
5515 if (Record.size() < 12) {
5516 Error("malformed module definition");
5517 return Failure;
5518 }
5519
5520 StringRef Name = Blob;
5521 unsigned Idx = 0;
5522 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]);
5523 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]);
5524 Module::ModuleKind Kind = (Module::ModuleKind)Record[Idx++];
5525 bool IsFramework = Record[Idx++];
5526 bool IsExplicit = Record[Idx++];
5527 bool IsSystem = Record[Idx++];
5528 bool IsExternC = Record[Idx++];
5529 bool InferSubmodules = Record[Idx++];
5530 bool InferExplicitSubmodules = Record[Idx++];
5531 bool InferExportWildcard = Record[Idx++];
5532 bool ConfigMacrosExhaustive = Record[Idx++];
5533 bool ModuleMapIsPrivate = Record[Idx++];
5534
5535 Module *ParentModule = nullptr;
5536 if (Parent)
5537 ParentModule = getSubmodule(Parent);
5538
5539 // Retrieve this (sub)module from the module map, creating it if
5540 // necessary.
5541 CurrentModule =
5542 ModMap.findOrCreateModule(Name, ParentModule, IsFramework, IsExplicit)
5543 .first;
5544
5545 // FIXME: set the definition loc for CurrentModule, or call
5546 // ModMap.setInferredModuleAllowedBy()
5547
5548 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS;
5549 if (GlobalIndex >= SubmodulesLoaded.size() ||
5550 SubmodulesLoaded[GlobalIndex]) {
5551 Error("too many submodules");
5552 return Failure;
5553 }
5554
5555 if (!ParentModule) {
5556 if (const FileEntry *CurFile = CurrentModule->getASTFile()) {
5557 // Don't emit module relocation error if we have -fno-validate-pch
5558 if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
5559 DisableValidationForModuleKind::Module) &&
5560 CurFile != F.File) {
5561 Error(diag::err_module_file_conflict,
5562 CurrentModule->getTopLevelModuleName(), CurFile->getName(),
5563 F.File->getName());
5564 return Failure;
5565 }
5566 }
5567
5568 F.DidReadTopLevelSubmodule = true;
5569 CurrentModule->setASTFile(F.File);
5570 CurrentModule->PresumedModuleMapFile = F.ModuleMapPath;
5571 }
5572
5573 CurrentModule->Kind = Kind;
5574 CurrentModule->Signature = F.Signature;
5575 CurrentModule->IsFromModuleFile = true;
5576 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem;
5577 CurrentModule->IsExternC = IsExternC;
5578 CurrentModule->InferSubmodules = InferSubmodules;
5579 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules;
5580 CurrentModule->InferExportWildcard = InferExportWildcard;
5581 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive;
5582 CurrentModule->ModuleMapIsPrivate = ModuleMapIsPrivate;
5583 if (DeserializationListener)
5584 DeserializationListener->ModuleRead(GlobalID, CurrentModule);
5585
5586 SubmodulesLoaded[GlobalIndex] = CurrentModule;
5587
5588 // Clear out data that will be replaced by what is in the module file.
5589 CurrentModule->LinkLibraries.clear();
5590 CurrentModule->ConfigMacros.clear();
5591 CurrentModule->UnresolvedConflicts.clear();
5592 CurrentModule->Conflicts.clear();
5593
5594 // The module is available unless it's missing a requirement; relevant
5595 // requirements will be (re-)added by SUBMODULE_REQUIRES records.
5596 // Missing headers that were present when the module was built do not
5597 // make it unavailable -- if we got this far, this must be an explicitly
5598 // imported module file.
5599 CurrentModule->Requirements.clear();
5600 CurrentModule->MissingHeaders.clear();
5601 CurrentModule->IsUnimportable =
5602 ParentModule && ParentModule->IsUnimportable;
5603 CurrentModule->IsAvailable = !CurrentModule->IsUnimportable;
5604 break;
5605 }
5606
5607 case SUBMODULE_UMBRELLA_HEADER: {
5608 std::string Filename = std::string(Blob);
5609 ResolveImportedPath(F, Filename);
5610 if (auto Umbrella = PP.getFileManager().getFile(Filename)) {
5611 if (!CurrentModule->getUmbrellaHeader())
5612 // FIXME: NameAsWritten
5613 ModMap.setUmbrellaHeader(CurrentModule, *Umbrella, Blob, "");
5614 else if (CurrentModule->getUmbrellaHeader().Entry != *Umbrella) {
5615 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
5616 Error("mismatched umbrella headers in submodule");
5617 return OutOfDate;
5618 }
5619 }
5620 break;
5621 }
5622
5623 case SUBMODULE_HEADER:
5624 case SUBMODULE_EXCLUDED_HEADER:
5625 case SUBMODULE_PRIVATE_HEADER:
5626 // We lazily associate headers with their modules via the HeaderInfo table.
5627 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
5628 // of complete filenames or remove it entirely.
5629 break;
5630
5631 case SUBMODULE_TEXTUAL_HEADER:
5632 case SUBMODULE_PRIVATE_TEXTUAL_HEADER:
5633 // FIXME: Textual headers are not marked in the HeaderInfo table. Load
5634 // them here.
5635 break;
5636
5637 case SUBMODULE_TOPHEADER:
5638 CurrentModule->addTopHeaderFilename(Blob);
5639 break;
5640
5641 case SUBMODULE_UMBRELLA_DIR: {
5642 std::string Dirname = std::string(Blob);
5643 ResolveImportedPath(F, Dirname);
5644 if (auto Umbrella = PP.getFileManager().getDirectory(Dirname)) {
5645 if (!CurrentModule->getUmbrellaDir())
5646 // FIXME: NameAsWritten
5647 ModMap.setUmbrellaDir(CurrentModule, *Umbrella, Blob, "");
5648 else if (CurrentModule->getUmbrellaDir().Entry != *Umbrella) {
5649 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
5650 Error("mismatched umbrella directories in submodule");
5651 return OutOfDate;
5652 }
5653 }
5654 break;
5655 }
5656
5657 case SUBMODULE_METADATA: {
5658 F.BaseSubmoduleID = getTotalNumSubmodules();
5659 F.LocalNumSubmodules = Record[0];
5660 unsigned LocalBaseSubmoduleID = Record[1];
5661 if (F.LocalNumSubmodules > 0) {
5662 // Introduce the global -> local mapping for submodules within this
5663 // module.
5664 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F));
5665
5666 // Introduce the local -> global mapping for submodules within this
5667 // module.
5668 F.SubmoduleRemap.insertOrReplace(
5669 std::make_pair(LocalBaseSubmoduleID,
5670 F.BaseSubmoduleID - LocalBaseSubmoduleID));
5671
5672 SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules);
5673 }
5674 break;
5675 }
5676
5677 case SUBMODULE_IMPORTS:
5678 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) {
5679 UnresolvedModuleRef Unresolved;
5680 Unresolved.File = &F;
5681 Unresolved.Mod = CurrentModule;
5682 Unresolved.ID = Record[Idx];
5683 Unresolved.Kind = UnresolvedModuleRef::Import;
5684 Unresolved.IsWildcard = false;
5685 UnresolvedModuleRefs.push_back(Unresolved);
5686 }
5687 break;
5688
5689 case SUBMODULE_EXPORTS:
5690 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) {
5691 UnresolvedModuleRef Unresolved;
5692 Unresolved.File = &F;
5693 Unresolved.Mod = CurrentModule;
5694 Unresolved.ID = Record[Idx];
5695 Unresolved.Kind = UnresolvedModuleRef::Export;
5696 Unresolved.IsWildcard = Record[Idx + 1];
5697 UnresolvedModuleRefs.push_back(Unresolved);
5698 }
5699
5700 // Once we've loaded the set of exports, there's no reason to keep
5701 // the parsed, unresolved exports around.
5702 CurrentModule->UnresolvedExports.clear();
5703 break;
5704
5705 case SUBMODULE_REQUIRES:
5706 CurrentModule->addRequirement(Blob, Record[0], PP.getLangOpts(),
5707 PP.getTargetInfo());
5708 break;
5709
5710 case SUBMODULE_LINK_LIBRARY:
5711 ModMap.resolveLinkAsDependencies(CurrentModule);
5712 CurrentModule->LinkLibraries.push_back(
5713 Module::LinkLibrary(std::string(Blob), Record[0]));
5714 break;
5715
5716 case SUBMODULE_CONFIG_MACRO:
5717 CurrentModule->ConfigMacros.push_back(Blob.str());
5718 break;
5719
5720 case SUBMODULE_CONFLICT: {
5721 UnresolvedModuleRef Unresolved;
5722 Unresolved.File = &F;
5723 Unresolved.Mod = CurrentModule;
5724 Unresolved.ID = Record[0];
5725 Unresolved.Kind = UnresolvedModuleRef::Conflict;
5726 Unresolved.IsWildcard = false;
5727 Unresolved.String = Blob;
5728 UnresolvedModuleRefs.push_back(Unresolved);
5729 break;
5730 }
5731
5732 case SUBMODULE_INITIALIZERS: {
5733 if (!ContextObj)
5734 break;
5735 SmallVector<uint32_t, 16> Inits;
5736 for (auto &ID : Record)
5737 Inits.push_back(getGlobalDeclID(F, ID));
5738 ContextObj->addLazyModuleInitializers(CurrentModule, Inits);
5739 break;
5740 }
5741
5742 case SUBMODULE_EXPORT_AS:
5743 CurrentModule->ExportAsModule = Blob.str();
5744 ModMap.addLinkAsDependency(CurrentModule);
5745 break;
5746 }
5747 }
5748}
5749
5750/// Parse the record that corresponds to a LangOptions data
5751/// structure.
5752///
5753/// This routine parses the language options from the AST file and then gives
5754/// them to the AST listener if one is set.
5755///
5756/// \returns true if the listener deems the file unacceptable, false otherwise.
5757bool ASTReader::ParseLanguageOptions(const RecordData &Record,
5758 bool Complain,
5759 ASTReaderListener &Listener,
5760 bool AllowCompatibleDifferences) {
5761 LangOptions LangOpts;
5762 unsigned Idx = 0;
5763#define LANGOPT(Name, Bits, Default, Description) \
5764 LangOpts.Name = Record[Idx++];
5765#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
5766 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
5767#include "clang/Basic/LangOptions.def"
5768#define SANITIZER(NAME, ID) \
5769 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]);
5770#include "clang/Basic/Sanitizers.def"
5771
5772 for (unsigned N = Record[Idx++]; N; --N)
5773 LangOpts.ModuleFeatures.push_back(ReadString(Record, Idx));
5774
5775 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++];
5776 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx);
5777 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion);
5778
5779 LangOpts.CurrentModule = ReadString(Record, Idx);
5780
5781 // Comment options.
5782 for (unsigned N = Record[Idx++]; N; --N) {
5783 LangOpts.CommentOpts.BlockCommandNames.push_back(
5784 ReadString(Record, Idx));
5785 }
5786 LangOpts.CommentOpts.ParseAllComments = Record[Idx++];
5787
5788 // OpenMP offloading options.
5789 for (unsigned N = Record[Idx++]; N; --N) {
5790 LangOpts.OMPTargetTriples.push_back(llvm::Triple(ReadString(Record, Idx)));
5791 }
5792
5793 LangOpts.OMPHostIRFile = ReadString(Record, Idx);
5794
5795 return Listener.ReadLanguageOptions(LangOpts, Complain,
5796 AllowCompatibleDifferences);
5797}
5798
5799bool ASTReader::ParseTargetOptions(const RecordData &Record, bool Complain,
5800 ASTReaderListener &Listener,
5801 bool AllowCompatibleDifferences) {
5802 unsigned Idx = 0;
5803 TargetOptions TargetOpts;
5804 TargetOpts.Triple = ReadString(Record, Idx);
5805 TargetOpts.CPU = ReadString(Record, Idx);
5806 TargetOpts.TuneCPU = ReadString(Record, Idx);
5807 TargetOpts.ABI = ReadString(Record, Idx);
5808 for (unsigned N = Record[Idx++]; N; --N) {
5809 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx));
5810 }
5811 for (unsigned N = Record[Idx++]; N; --N) {
5812 TargetOpts.Features.push_back(ReadString(Record, Idx));
5813 }
5814
5815 return Listener.ReadTargetOptions(TargetOpts, Complain,
5816 AllowCompatibleDifferences);
5817}
5818
5819bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain,
5820 ASTReaderListener &Listener) {
5821 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions);
5822 unsigned Idx = 0;
5823#define DIAGOPT(Name, Bits, Default) DiagOpts->Name = Record[Idx++];
5824#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
5825 DiagOpts->set##Name(static_cast<Type>(Record[Idx++]));
5826#include "clang/Basic/DiagnosticOptions.def"
5827
5828 for (unsigned N = Record[Idx++]; N; --N)
5829 DiagOpts->Warnings.push_back(ReadString(Record, Idx));
5830 for (unsigned N = Record[Idx++]; N; --N)
5831 DiagOpts->Remarks.push_back(ReadString(Record, Idx));
5832
5833 return Listener.ReadDiagnosticOptions(DiagOpts, Complain);
5834}
5835
5836bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain,
5837 ASTReaderListener &Listener) {
5838 FileSystemOptions FSOpts;
5839 unsigned Idx = 0;
5840 FSOpts.WorkingDir = ReadString(Record, Idx);
5841 return Listener.ReadFileSystemOptions(FSOpts, Complain);
5842}
5843
5844bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record,
5845 bool Complain,
5846 ASTReaderListener &Listener) {
5847 HeaderSearchOptions HSOpts;
5848 unsigned Idx = 0;
5849 HSOpts.Sysroot = ReadString(Record, Idx);
5850
5851 // Include entries.
5852 for (unsigned N = Record[Idx++]; N; --N) {
5853 std::string Path = ReadString(Record, Idx);
5854 frontend::IncludeDirGroup Group
5855 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]);
5856 bool IsFramework = Record[Idx++];
5857 bool IgnoreSysRoot = Record[Idx++];
5858 HSOpts.UserEntries.emplace_back(std::move(Path), Group, IsFramework,
5859 IgnoreSysRoot);
5860 }
5861
5862 // System header prefixes.
5863 for (unsigned N = Record[Idx++]; N; --N) {
5864 std::string Prefix = ReadString(Record, Idx);
5865 bool IsSystemHeader = Record[Idx++];
5866 HSOpts.SystemHeaderPrefixes.emplace_back(std::move(Prefix), IsSystemHeader);
5867 }
5868
5869 HSOpts.ResourceDir = ReadString(Record, Idx);
5870 HSOpts.ModuleCachePath = ReadString(Record, Idx);
5871 HSOpts.ModuleUserBuildPath = ReadString(Record, Idx);
5872 HSOpts.DisableModuleHash = Record[Idx++];
5873 HSOpts.ImplicitModuleMaps = Record[Idx++];
5874 HSOpts.ModuleMapFileHomeIsCwd = Record[Idx++];
5875 HSOpts.EnablePrebuiltImplicitModules = Record[Idx++];
5876 HSOpts.UseBuiltinIncludes = Record[Idx++];
5877 HSOpts.UseStandardSystemIncludes = Record[Idx++];
5878 HSOpts.UseStandardCXXIncludes = Record[Idx++];
5879 HSOpts.UseLibcxx = Record[Idx++];
5880 std::string SpecificModuleCachePath = ReadString(Record, Idx);
5881
5882 return Listener.ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
5883 Complain);
5884}
5885
5886bool ASTReader::ParsePreprocessorOptions(const RecordData &Record,
5887 bool Complain,
5888 ASTReaderListener &Listener,
5889 std::string &SuggestedPredefines) {
5890 PreprocessorOptions PPOpts;
5891 unsigned Idx = 0;
5892
5893 // Macro definitions/undefs
5894 for (unsigned N = Record[Idx++]; N; --N) {
5895 std::string Macro = ReadString(Record, Idx);
5896 bool IsUndef = Record[Idx++];
5897 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef));
5898 }
5899
5900 // Includes
5901 for (unsigned N = Record[Idx++]; N; --N) {
5902 PPOpts.Includes.push_back(ReadString(Record, Idx));
5903 }
5904
5905 // Macro Includes
5906 for (unsigned N = Record[Idx++]; N; --N) {
5907 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx));
5908 }
5909
5910 PPOpts.UsePredefines = Record[Idx++];
5911 PPOpts.DetailedRecord = Record[Idx++];
5912 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx);
5913 PPOpts.ObjCXXARCStandardLibrary =
5914 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]);
5915 SuggestedPredefines.clear();
5916 return Listener.ReadPreprocessorOptions(PPOpts, Complain,
5917 SuggestedPredefines);
5918}
5919
5920std::pair<ModuleFile *, unsigned>
5921ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) {
5922 GlobalPreprocessedEntityMapType::iterator
5923 I = GlobalPreprocessedEntityMap.find(GlobalIndex);
5924 assert(I != GlobalPreprocessedEntityMap.end() &&((void)0)
5925 "Corrupted global preprocessed entity map")((void)0);
5926 ModuleFile *M = I->second;
5927 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID;
5928 return std::make_pair(M, LocalIndex);
5929}
5930
5931llvm::iterator_range<PreprocessingRecord::iterator>
5932ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const {
5933 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
5934 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID,
5935 Mod.NumPreprocessedEntities);
5936
5937 return llvm::make_range(PreprocessingRecord::iterator(),
5938 PreprocessingRecord::iterator());
5939}
5940
5941bool ASTReader::canRecoverFromOutOfDate(StringRef ModuleFileName,
5942 unsigned int ClientLoadCapabilities) {
5943 return ClientLoadCapabilities & ARR_OutOfDate &&
5944 !getModuleManager().getModuleCache().isPCMFinal(ModuleFileName);
5945}
5946
5947llvm::iterator_range<ASTReader::ModuleDeclIterator>
5948ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) {
5949 return llvm::make_range(
5950 ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls),
5951 ModuleDeclIterator(this, &Mod,
5952 Mod.FileSortedDecls + Mod.NumFileSortedDecls));
5953}
5954
5955SourceRange ASTReader::ReadSkippedRange(unsigned GlobalIndex) {
5956 auto I = GlobalSkippedRangeMap.find(GlobalIndex);
5957 assert(I != GlobalSkippedRangeMap.end() &&((void)0)
5958 "Corrupted global skipped range map")((void)0);
5959 ModuleFile *M = I->second;
5960 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedSkippedRangeID;
5961 assert(LocalIndex < M->NumPreprocessedSkippedRanges)((void)0);
5962 PPSkippedRange RawRange = M->PreprocessedSkippedRangeOffsets[LocalIndex];
5963 SourceRange Range(TranslateSourceLocation(*M, RawRange.getBegin()),
5964 TranslateSourceLocation(*M, RawRange.getEnd()));
5965 assert(Range.isValid())((void)0);
5966 return Range;
5967}
5968
5969PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) {
5970 PreprocessedEntityID PPID = Index+1;
5971 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
5972 ModuleFile &M = *PPInfo.first;
5973 unsigned LocalIndex = PPInfo.second;
5974 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
5975
5976 if (!PP.getPreprocessingRecord()) {
5977 Error("no preprocessing record");
5978 return nullptr;
5979 }
5980
5981 SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor);
5982 if (llvm::Error Err = M.PreprocessorDetailCursor.JumpToBit(
5983 M.MacroOffsetsBase + PPOffs.BitOffset)) {
5984 Error(std::move(Err));
5985 return nullptr;
5986 }
5987
5988 Expected<llvm::BitstreamEntry> MaybeEntry =
5989 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
5990 if (!MaybeEntry) {
5991 Error(MaybeEntry.takeError());
5992 return nullptr;
5993 }
5994 llvm::BitstreamEntry Entry = MaybeEntry.get();
5995
5996 if (Entry.Kind != llvm::BitstreamEntry::Record)
5997 return nullptr;
5998
5999 // Read the record.
6000 SourceRange Range(TranslateSourceLocation(M, PPOffs.getBegin()),
6001 TranslateSourceLocation(M, PPOffs.getEnd()));
6002 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
6003 StringRef Blob;
6004 RecordData Record;
6005 Expected<unsigned> MaybeRecType =
6006 M.PreprocessorDetailCursor.readRecord(Entry.ID, Record, &Blob);
6007 if (!MaybeRecType) {
6008 Error(MaybeRecType.takeError());
6009 return nullptr;
6010 }
6011 switch ((PreprocessorDetailRecordTypes)MaybeRecType.get()) {
6012 case PPD_MACRO_EXPANSION: {
6013 bool isBuiltin = Record[0];
6014 IdentifierInfo *Name = nullptr;
6015 MacroDefinitionRecord *Def = nullptr;
6016 if (isBuiltin)
6017 Name = getLocalIdentifier(M, Record[1]);
6018 else {
6019 PreprocessedEntityID GlobalID =
6020 getGlobalPreprocessedEntityID(M, Record[1]);
6021 Def = cast<MacroDefinitionRecord>(
6022 PPRec.getLoadedPreprocessedEntity(GlobalID - 1));
6023 }
6024
6025 MacroExpansion *ME;
6026 if (isBuiltin)
6027 ME = new (PPRec) MacroExpansion(Name, Range);
6028 else
6029 ME = new (PPRec) MacroExpansion(Def, Range);
6030
6031 return ME;
6032 }
6033
6034 case PPD_MACRO_DEFINITION: {
6035 // Decode the identifier info and then check again; if the macro is
6036 // still defined and associated with the identifier,
6037 IdentifierInfo *II = getLocalIdentifier(M, Record[0]);
6038 MacroDefinitionRecord *MD = new (PPRec) MacroDefinitionRecord(II, Range);
6039
6040 if (DeserializationListener)
6041 DeserializationListener->MacroDefinitionRead(PPID, MD);
6042
6043 return MD;
6044 }
6045
6046 case PPD_INCLUSION_DIRECTIVE: {
6047 const char *FullFileNameStart = Blob.data() + Record[0];
6048 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]);
6049 const FileEntry *File = nullptr;
6050 if (!FullFileName.empty())
6051 if (auto FE = PP.getFileManager().getFile(FullFileName))
6052 File = *FE;
6053
6054 // FIXME: Stable encoding
6055 InclusionDirective::InclusionKind Kind
6056 = static_cast<InclusionDirective::InclusionKind>(Record[2]);
6057 InclusionDirective *ID
6058 = new (PPRec) InclusionDirective(PPRec, Kind,
6059 StringRef(Blob.data(), Record[0]),
6060 Record[1], Record[3],
6061 File,
6062 Range);
6063 return ID;
6064 }
6065 }
6066
6067 llvm_unreachable("Invalid PreprocessorDetailRecordTypes")__builtin_unreachable();
6068}
6069
6070/// Find the next module that contains entities and return the ID
6071/// of the first entry.
6072///
6073/// \param SLocMapI points at a chunk of a module that contains no
6074/// preprocessed entities or the entities it contains are not the ones we are
6075/// looking for.
6076PreprocessedEntityID ASTReader::findNextPreprocessedEntity(
6077 GlobalSLocOffsetMapType::const_iterator SLocMapI) const {
6078 ++SLocMapI;
6079 for (GlobalSLocOffsetMapType::const_iterator
6080 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
6081 ModuleFile &M = *SLocMapI->second;
6082 if (M.NumPreprocessedEntities)
6083 return M.BasePreprocessedEntityID;
6084 }
6085
6086 return getTotalNumPreprocessedEntities();
6087}
6088
6089namespace {
6090
6091struct PPEntityComp {
6092 const ASTReader &Reader;
6093 ModuleFile &M;
6094
6095 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) {}
6096
6097 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const {
6098 SourceLocation LHS = getLoc(L);
6099 SourceLocation RHS = getLoc(R);
6100 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6101 }
6102
6103 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const {
6104 SourceLocation LHS = getLoc(L);
6105 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6106 }
6107
6108 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const {
6109 SourceLocation RHS = getLoc(R);
6110 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6111 }
6112
6113 SourceLocation getLoc(const PPEntityOffset &PPE) const {
6114 return Reader.TranslateSourceLocation(M, PPE.getBegin());
6115 }
6116};
6117
6118} // namespace
6119
6120PreprocessedEntityID ASTReader::findPreprocessedEntity(SourceLocation Loc,
6121 bool EndsAfter) const {
6122 if (SourceMgr.isLocalSourceLocation(Loc))
6123 return getTotalNumPreprocessedEntities();
6124
6125 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
6126 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
6127 assert(SLocMapI != GlobalSLocOffsetMap.end() &&((void)0)
6128 "Corrupted global sloc offset map")((void)0);
6129
6130 if (SLocMapI->second->NumPreprocessedEntities == 0)
6131 return findNextPreprocessedEntity(SLocMapI);
6132
6133 ModuleFile &M = *SLocMapI->second;
6134
6135 using pp_iterator = const PPEntityOffset *;
6136
6137 pp_iterator pp_begin = M.PreprocessedEntityOffsets;
6138 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities;
6139
6140 size_t Count = M.NumPreprocessedEntities;
6141 size_t Half;
6142 pp_iterator First = pp_begin;
6143 pp_iterator PPI;
6144
6145 if (EndsAfter) {
6146 PPI = std::upper_bound(pp_begin, pp_end, Loc,
6147 PPEntityComp(*this, M));
6148 } else {
6149 // Do a binary search manually instead of using std::lower_bound because
6150 // The end locations of entities may be unordered (when a macro expansion
6151 // is inside another macro argument), but for this case it is not important
6152 // whether we get the first macro expansion or its containing macro.
6153 while (Count > 0) {
6154 Half = Count / 2;
6155 PPI = First;
6156 std::advance(PPI, Half);
6157 if (SourceMgr.isBeforeInTranslationUnit(
6158 TranslateSourceLocation(M, PPI->getEnd()), Loc)) {
6159 First = PPI;
6160 ++First;
6161 Count = Count - Half - 1;
6162 } else
6163 Count = Half;
6164 }
6165 }
6166
6167 if (PPI == pp_end)
6168 return findNextPreprocessedEntity(SLocMapI);
6169
6170 return M.BasePreprocessedEntityID + (PPI - pp_begin);
6171}
6172
6173/// Returns a pair of [Begin, End) indices of preallocated
6174/// preprocessed entities that \arg Range encompasses.
6175std::pair<unsigned, unsigned>
6176 ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) {
6177 if (Range.isInvalid())
6178 return std::make_pair(0,0);
6179 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()))((void)0);
6180
6181 PreprocessedEntityID BeginID =
6182 findPreprocessedEntity(Range.getBegin(), false);
6183 PreprocessedEntityID EndID = findPreprocessedEntity(Range.getEnd(), true);
6184 return std::make_pair(BeginID, EndID);
6185}
6186
6187/// Optionally returns true or false if the preallocated preprocessed
6188/// entity with index \arg Index came from file \arg FID.
6189Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index,
6190 FileID FID) {
6191 if (FID.isInvalid())
6192 return false;
6193
6194 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
6195 ModuleFile &M = *PPInfo.first;
6196 unsigned LocalIndex = PPInfo.second;
6197 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
6198
6199 SourceLocation Loc = TranslateSourceLocation(M, PPOffs.getBegin());
6200 if (Loc.isInvalid())
6201 return false;
6202
6203 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
6204 return true;
6205 else
6206 return false;
6207}
6208
6209namespace {
6210
6211 /// Visitor used to search for information about a header file.
6212 class HeaderFileInfoVisitor {
6213 const FileEntry *FE;
6214 Optional<HeaderFileInfo> HFI;
6215
6216 public:
6217 explicit HeaderFileInfoVisitor(const FileEntry *FE) : FE(FE) {}
6218
6219 bool operator()(ModuleFile &M) {
6220 HeaderFileInfoLookupTable *Table
6221 = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable);
6222 if (!Table)
6223 return false;
6224
6225 // Look in the on-disk hash table for an entry for this file name.
6226 HeaderFileInfoLookupTable::iterator Pos = Table->find(FE);
6227 if (Pos == Table->end())
6228 return false;
6229
6230 HFI = *Pos;
6231 return true;
6232 }
6233
6234 Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; }
6235 };
6236
6237} // namespace
6238
6239HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) {
6240 HeaderFileInfoVisitor Visitor(FE);
6241 ModuleMgr.visit(Visitor);
6242 if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
6243 return *HFI;
6244
6245 return HeaderFileInfo();
6246}
6247
6248void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) {
6249 using DiagState = DiagnosticsEngine::DiagState;
6250 SmallVector<DiagState *, 32> DiagStates;
6251
6252 for (ModuleFile &F : ModuleMgr) {
6253 unsigned Idx = 0;
6254 auto &Record = F.PragmaDiagMappings;
6255 if (Record.empty())
6256 continue;
6257
6258 DiagStates.clear();
6259
6260 auto ReadDiagState =
6261 [&](const DiagState &BasedOn, SourceLocation Loc,
6262 bool IncludeNonPragmaStates) -> DiagnosticsEngine::DiagState * {
6263 unsigned BackrefID = Record[Idx++];
6264 if (BackrefID != 0)
6265 return DiagStates[BackrefID - 1];
6266
6267 // A new DiagState was created here.
6268 Diag.DiagStates.push_back(BasedOn);
6269 DiagState *NewState = &Diag.DiagStates.back();
6270 DiagStates.push_back(NewState);
6271 unsigned Size = Record[Idx++];
6272 assert(Idx + Size * 2 <= Record.size() &&((void)0)
6273 "Invalid data, not enough diag/map pairs")((void)0);
6274 while (Size--) {
6275 unsigned DiagID = Record[Idx++];
6276 DiagnosticMapping NewMapping =
6277 DiagnosticMapping::deserialize(Record[Idx++]);
6278 if (!NewMapping.isPragma() && !IncludeNonPragmaStates)
6279 continue;
6280
6281 DiagnosticMapping &Mapping = NewState->getOrAddMapping(DiagID);
6282
6283 // If this mapping was specified as a warning but the severity was
6284 // upgraded due to diagnostic settings, simulate the current diagnostic
6285 // settings (and use a warning).
6286 if (NewMapping.wasUpgradedFromWarning() && !Mapping.isErrorOrFatal()) {
6287 NewMapping.setSeverity(diag::Severity::Warning);
6288 NewMapping.setUpgradedFromWarning(false);
6289 }
6290
6291 Mapping = NewMapping;
6292 }
6293 return NewState;
6294 };
6295
6296 // Read the first state.
6297 DiagState *FirstState;
6298 if (F.Kind == MK_ImplicitModule) {
6299 // Implicitly-built modules are reused with different diagnostic
6300 // settings. Use the initial diagnostic state from Diag to simulate this
6301 // compilation's diagnostic settings.
6302 FirstState = Diag.DiagStatesByLoc.FirstDiagState;
6303 DiagStates.push_back(FirstState);
6304
6305 // Skip the initial diagnostic state from the serialized module.
6306 assert(Record[1] == 0 &&((void)0)
6307 "Invalid data, unexpected backref in initial state")((void)0);
6308 Idx = 3 + Record[2] * 2;
6309 assert(Idx < Record.size() &&((void)0)
6310 "Invalid data, not enough state change pairs in initial state")((void)0);
6311 } else if (F.isModule()) {
6312 // For an explicit module, preserve the flags from the module build
6313 // command line (-w, -Weverything, -Werror, ...) along with any explicit
6314 // -Wblah flags.
6315 unsigned Flags = Record[Idx++];
6316 DiagState Initial;
6317 Initial.SuppressSystemWarnings = Flags & 1; Flags >>= 1;
6318 Initial.ErrorsAsFatal = Flags & 1; Flags >>= 1;
6319 Initial.WarningsAsErrors = Flags & 1; Flags >>= 1;
6320 Initial.EnableAllWarnings = Flags & 1; Flags >>= 1;
6321 Initial.IgnoreAllWarnings = Flags & 1; Flags >>= 1;
6322 Initial.ExtBehavior = (diag::Severity)Flags;
6323 FirstState = ReadDiagState(Initial, SourceLocation(), true);
6324
6325 assert(F.OriginalSourceFileID.isValid())((void)0);
6326
6327 // Set up the root buffer of the module to start with the initial
6328 // diagnostic state of the module itself, to cover files that contain no
6329 // explicit transitions (for which we did not serialize anything).
6330 Diag.DiagStatesByLoc.Files[F.OriginalSourceFileID]
6331 .StateTransitions.push_back({FirstState, 0});
6332 } else {
6333 // For prefix ASTs, start with whatever the user configured on the
6334 // command line.
6335 Idx++; // Skip flags.
6336 FirstState = ReadDiagState(*Diag.DiagStatesByLoc.CurDiagState,
6337 SourceLocation(), false);
6338 }
6339
6340 // Read the state transitions.
6341 unsigned NumLocations = Record[Idx++];
6342 while (NumLocations--) {
6343 assert(Idx < Record.size() &&((void)0)
6344 "Invalid data, missing pragma diagnostic states")((void)0);
6345 SourceLocation Loc = ReadSourceLocation(F, Record[Idx++]);
6346 auto IDAndOffset = SourceMgr.getDecomposedLoc(Loc);
6347 assert(IDAndOffset.first.isValid() && "invalid FileID for transition")((void)0);
6348 assert(IDAndOffset.second == 0 && "not a start location for a FileID")((void)0);
6349 unsigned Transitions = Record[Idx++];
6350
6351 // Note that we don't need to set up Parent/ParentOffset here, because
6352 // we won't be changing the diagnostic state within imported FileIDs
6353 // (other than perhaps appending to the main source file, which has no
6354 // parent).
6355 auto &F = Diag.DiagStatesByLoc.Files[IDAndOffset.first];
6356 F.StateTransitions.reserve(F.StateTransitions.size() + Transitions);
6357 for (unsigned I = 0; I != Transitions; ++I) {
6358 unsigned Offset = Record[Idx++];
6359 auto *State =
6360 ReadDiagState(*FirstState, Loc.getLocWithOffset(Offset), false);
6361 F.StateTransitions.push_back({State, Offset});
6362 }
6363 }
6364
6365 // Read the final state.
6366 assert(Idx < Record.size() &&((void)0)
6367 "Invalid data, missing final pragma diagnostic state")((void)0);
6368 SourceLocation CurStateLoc =
6369 ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]);
6370 auto *CurState = ReadDiagState(*FirstState, CurStateLoc, false);
6371
6372 if (!F.isModule()) {
6373 Diag.DiagStatesByLoc.CurDiagState = CurState;
6374 Diag.DiagStatesByLoc.CurDiagStateLoc = CurStateLoc;
6375
6376 // Preserve the property that the imaginary root file describes the
6377 // current state.
6378 FileID NullFile;
6379 auto &T = Diag.DiagStatesByLoc.Files[NullFile].StateTransitions;
6380 if (T.empty())
6381 T.push_back({CurState, 0});
6382 else
6383 T[0].State = CurState;
6384 }
6385
6386 // Don't try to read these mappings again.
6387 Record.clear();
6388 }
6389}
6390
6391/// Get the correct cursor and offset for loading a type.
6392ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) {
6393 GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index);
6394 assert(I != GlobalTypeMap.end() && "Corrupted global type map")((void)0);
6395 ModuleFile *M = I->second;
6396 return RecordLocation(
6397 M, M->TypeOffsets[Index - M->BaseTypeIndex].getBitOffset() +
6398 M->DeclsBlockStartOffset);
6399}
6400
6401static llvm::Optional<Type::TypeClass> getTypeClassForCode(TypeCode code) {
6402 switch (code) {
6403#define TYPE_BIT_CODE(CLASS_ID, CODE_ID, CODE_VALUE) \
6404 case TYPE_##CODE_ID: return Type::CLASS_ID;
6405#include "clang/Serialization/TypeBitCodes.def"
6406 default: return llvm::None;
6407 }
6408}
6409
6410/// Read and return the type with the given index..
6411///
6412/// The index is the type ID, shifted and minus the number of predefs. This
6413/// routine actually reads the record corresponding to the type at the given
6414/// location. It is a helper routine for GetType, which deals with reading type
6415/// IDs.
6416QualType ASTReader::readTypeRecord(unsigned Index) {
6417 assert(ContextObj && "reading type with no AST context")((void)0);
6418 ASTContext &Context = *ContextObj;
6419 RecordLocation Loc = TypeCursorForIndex(Index);
6420 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
6421
6422 // Keep track of where we are in the stream, then jump back there
6423 // after reading this type.
6424 SavedStreamPosition SavedPosition(DeclsCursor);
6425
6426 ReadingKindTracker ReadingKind(Read_Type, *this);
6427
6428 // Note that we are loading a type record.
6429 Deserializing AType(this);
6430
6431 if (llvm::Error Err = DeclsCursor.JumpToBit(Loc.Offset)) {
6432 Error(std::move(Err));
6433 return QualType();
6434 }
6435 Expected<unsigned> RawCode = DeclsCursor.ReadCode();
6436 if (!RawCode) {
6437 Error(RawCode.takeError());
6438 return QualType();
6439 }
6440
6441 ASTRecordReader Record(*this, *Loc.F);
6442 Expected<unsigned> Code = Record.readRecord(DeclsCursor, RawCode.get());
6443 if (!Code) {
6444 Error(Code.takeError());
6445 return QualType();
6446 }
6447 if (Code.get() == TYPE_EXT_QUAL) {
6448 QualType baseType = Record.readQualType();
6449 Qualifiers quals = Record.readQualifiers();
6450 return Context.getQualifiedType(baseType, quals);
6451 }
6452
6453 auto maybeClass = getTypeClassForCode((TypeCode) Code.get());
6454 if (!maybeClass) {
6455 Error("Unexpected code for type");
6456 return QualType();
6457 }
6458
6459 serialization::AbstractTypeReader<ASTRecordReader> TypeReader(Record);
6460 return TypeReader.read(*maybeClass);
6461}
6462
6463namespace clang {
6464
6465class TypeLocReader : public TypeLocVisitor<TypeLocReader> {
6466 ASTRecordReader &Reader;
6467
6468 SourceLocation readSourceLocation() {
6469 return Reader.readSourceLocation();
6470 }
6471
6472 TypeSourceInfo *GetTypeSourceInfo() {
6473 return Reader.readTypeSourceInfo();
6474 }
6475
6476 NestedNameSpecifierLoc ReadNestedNameSpecifierLoc() {
6477 return Reader.readNestedNameSpecifierLoc();
6478 }
6479
6480 Attr *ReadAttr() {
6481 return Reader.readAttr();
6482 }
6483
6484public:
6485 TypeLocReader(ASTRecordReader &Reader) : Reader(Reader) {}
6486
6487 // We want compile-time assurance that we've enumerated all of
6488 // these, so unfortunately we have to declare them first, then
6489 // define them out-of-line.
6490#define ABSTRACT_TYPELOC(CLASS, PARENT)
6491#define TYPELOC(CLASS, PARENT) \
6492 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
6493#include "clang/AST/TypeLocNodes.def"
6494
6495 void VisitFunctionTypeLoc(FunctionTypeLoc);
6496 void VisitArrayTypeLoc(ArrayTypeLoc);
6497};
6498
6499} // namespace clang
6500
6501void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
6502 // nothing to do
6503}
6504
6505void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
6506 TL.setBuiltinLoc(readSourceLocation());
6507 if (TL.needsExtraLocalData()) {
6508 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Reader.readInt()));
6509 TL.setWrittenSignSpec(static_cast<TypeSpecifierSign>(Reader.readInt()));
6510 TL.setWrittenWidthSpec(static_cast<TypeSpecifierWidth>(Reader.readInt()));
6511 TL.setModeAttr(Reader.readInt());
6512 }
6513}
6514
6515void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
6516 TL.setNameLoc(readSourceLocation());
6517}
6518
6519void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
6520 TL.setStarLoc(readSourceLocation());
6521}
6522
6523void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
6524 // nothing to do
6525}
6526
6527void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
6528 // nothing to do
6529}
6530
6531void TypeLocReader::VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) {
6532 TL.setExpansionLoc(readSourceLocation());
6533}
6534
6535void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
6536 TL.setCaretLoc(readSourceLocation());
6537}
6538
6539void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
6540 TL.setAmpLoc(readSourceLocation());
6541}
6542
6543void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
6544 TL.setAmpAmpLoc(readSourceLocation());
6545}
6546
6547void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
6548 TL.setStarLoc(readSourceLocation());
6549 TL.setClassTInfo(GetTypeSourceInfo());
6550}
6551
6552void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) {
6553 TL.setLBracketLoc(readSourceLocation());
6554 TL.setRBracketLoc(readSourceLocation());
6555 if (Reader.readBool())
6556 TL.setSizeExpr(Reader.readExpr());
6557 else
6558 TL.setSizeExpr(nullptr);
6559}
6560
6561void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) {
6562 VisitArrayTypeLoc(TL);
6563}
6564
6565void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) {
6566 VisitArrayTypeLoc(TL);
6567}
6568
6569void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
6570 VisitArrayTypeLoc(TL);
6571}
6572
6573void TypeLocReader::VisitDependentSizedArrayTypeLoc(
6574 DependentSizedArrayTypeLoc TL) {
6575 VisitArrayTypeLoc(TL);
6576}
6577
6578void TypeLocReader::VisitDependentAddressSpaceTypeLoc(
6579 DependentAddressSpaceTypeLoc TL) {
6580
6581 TL.setAttrNameLoc(readSourceLocation());
6582 TL.setAttrOperandParensRange(Reader.readSourceRange());
6583 TL.setAttrExprOperand(Reader.readExpr());
6584}
6585
6586void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
6587 DependentSizedExtVectorTypeLoc TL) {
6588 TL.setNameLoc(readSourceLocation());
6589}
6590
6591void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
6592 TL.setNameLoc(readSourceLocation());
6593}
6594
6595void TypeLocReader::VisitDependentVectorTypeLoc(
6596 DependentVectorTypeLoc TL) {
6597 TL.setNameLoc(readSourceLocation());
6598}
6599
6600void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
6601 TL.setNameLoc(readSourceLocation());
6602}
6603
6604void TypeLocReader::VisitConstantMatrixTypeLoc(ConstantMatrixTypeLoc TL) {
6605 TL.setAttrNameLoc(readSourceLocation());
6606 TL.setAttrOperandParensRange(Reader.readSourceRange());
6607 TL.setAttrRowOperand(Reader.readExpr());
6608 TL.setAttrColumnOperand(Reader.readExpr());
6609}
6610
6611void TypeLocReader::VisitDependentSizedMatrixTypeLoc(
6612 DependentSizedMatrixTypeLoc TL) {
6613 TL.setAttrNameLoc(readSourceLocation());
6614 TL.setAttrOperandParensRange(Reader.readSourceRange());
6615 TL.setAttrRowOperand(Reader.readExpr());
6616 TL.setAttrColumnOperand(Reader.readExpr());
6617}
6618
6619void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) {
6620 TL.setLocalRangeBegin(readSourceLocation());
6621 TL.setLParenLoc(readSourceLocation());
6622 TL.setRParenLoc(readSourceLocation());
6623 TL.setExceptionSpecRange(Reader.readSourceRange());
6624 TL.setLocalRangeEnd(readSourceLocation());
6625 for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) {
6626 TL.setParam(i, Reader.readDeclAs<ParmVarDecl>());
6627 }
6628}
6629
6630void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) {
6631 VisitFunctionTypeLoc(TL);
6632}
6633
6634void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) {
6635 VisitFunctionTypeLoc(TL);
6636}
6637
6638void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
6639 TL.setNameLoc(readSourceLocation());
6640}
6641
6642void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
6643 TL.setNameLoc(readSourceLocation());
6644}
6645
6646void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
6647 TL.setTypeofLoc(readSourceLocation());
6648 TL.setLParenLoc(readSourceLocation());
6649 TL.setRParenLoc(readSourceLocation());
6650}
6651
6652void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
6653 TL.setTypeofLoc(readSourceLocation());
6654 TL.setLParenLoc(readSourceLocation());
6655 TL.setRParenLoc(readSourceLocation());
6656 TL.setUnderlyingTInfo(GetTypeSourceInfo());
6657}
6658
6659void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
6660 TL.setNameLoc(readSourceLocation());
6661}
6662
6663void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
6664 TL.setKWLoc(readSourceLocation());
6665 TL.setLParenLoc(readSourceLocation());
6666 TL.setRParenLoc(readSourceLocation());
6667 TL.setUnderlyingTInfo(GetTypeSourceInfo());
6668}
6669
6670void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) {
6671 TL.setNameLoc(readSourceLocation());
6672 if (Reader.readBool()) {
6673 TL.setNestedNameSpecifierLoc(ReadNestedNameSpecifierLoc());
6674 TL.setTemplateKWLoc(readSourceLocation());
6675 TL.setConceptNameLoc(readSourceLocation());
6676 TL.setFoundDecl(Reader.readDeclAs<NamedDecl>());
6677 TL.setLAngleLoc(readSourceLocation());
6678 TL.setRAngleLoc(readSourceLocation());
6679 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i)
6680 TL.setArgLocInfo(i, Reader.readTemplateArgumentLocInfo(
6681 TL.getTypePtr()->getArg(i).getKind()));
6682 }
6683}
6684
6685void TypeLocReader::VisitDeducedTemplateSpecializationTypeLoc(
6686 DeducedTemplateSpecializationTypeLoc TL) {
6687 TL.setTemplateNameLoc(readSourceLocation());
6688}
6689
6690void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) {
6691 TL.setNameLoc(readSourceLocation());
6692}
6693
6694void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) {
6695 TL.setNameLoc(readSourceLocation());
6696}
6697
6698void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
6699 TL.setAttr(ReadAttr());
6700}
6701
6702void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
6703 TL.setNameLoc(readSourceLocation());
6704}
6705
6706void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
6707 SubstTemplateTypeParmTypeLoc TL) {
6708 TL.setNameLoc(readSourceLocation());
6709}
6710
6711void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
6712 SubstTemplateTypeParmPackTypeLoc TL) {
6713 TL.setNameLoc(readSourceLocation());
6714}
6715
6716void TypeLocReader::VisitTemplateSpecializationTypeLoc(
6717 TemplateSpecializationTypeLoc TL) {
6718 TL.setTemplateKeywordLoc(readSourceLocation());
6719 TL.setTemplateNameLoc(readSourceLocation());
6720 TL.setLAngleLoc(readSourceLocation());
6721 TL.setRAngleLoc(readSourceLocation());
6722 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i)
6723 TL.setArgLocInfo(
6724 i,
6725 Reader.readTemplateArgumentLocInfo(
6726 TL.getTypePtr()->getArg(i).getKind()));
6727}
6728
6729void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
6730 TL.setLParenLoc(readSourceLocation());
6731 TL.setRParenLoc(readSourceLocation());
6732}
6733
6734void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
6735 TL.setElaboratedKeywordLoc(readSourceLocation());
6736 TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
6737}
6738
6739void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
6740 TL.setNameLoc(readSourceLocation());
6741}
6742
6743void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
6744 TL.setElaboratedKeywordLoc(readSourceLocation());
6745 TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
6746 TL.setNameLoc(readSourceLocation());
6747}
6748
6749void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc(
6750 DependentTemplateSpecializationTypeLoc TL) {
6751 TL.setElaboratedKeywordLoc(readSourceLocation());
6752 TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
6753 TL.setTemplateKeywordLoc(readSourceLocation());
6754 TL.setTemplateNameLoc(readSourceLocation());
6755 TL.setLAngleLoc(readSourceLocation());
6756 TL.setRAngleLoc(readSourceLocation());
6757 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
6758 TL.setArgLocInfo(
6759 I,
6760 Reader.readTemplateArgumentLocInfo(
6761 TL.getTypePtr()->getArg(I).getKind()));
6762}
6763
6764void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
6765 TL.setEllipsisLoc(readSourceLocation());
6766}
6767
6768void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
6769 TL.setNameLoc(readSourceLocation());
6770}
6771
6772void TypeLocReader::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) {
6773 if (TL.getNumProtocols()) {
6774 TL.setProtocolLAngleLoc(readSourceLocation());
6775 TL.setProtocolRAngleLoc(readSourceLocation());
6776 }
6777 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
6778 TL.setProtocolLoc(i, readSourceLocation());
6779}
6780
6781void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
6782 TL.setHasBaseTypeAsWritten(Reader.readBool());
6783 TL.setTypeArgsLAngleLoc(readSourceLocation());
6784 TL.setTypeArgsRAngleLoc(readSourceLocation());
6785 for (unsigned i = 0, e = TL.getNumTypeArgs(); i != e; ++i)
6786 TL.setTypeArgTInfo(i, GetTypeSourceInfo());
6787 TL.setProtocolLAngleLoc(readSourceLocation());
6788 TL.setProtocolRAngleLoc(readSourceLocation());
6789 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
6790 TL.setProtocolLoc(i, readSourceLocation());
6791}
6792
6793void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
6794 TL.setStarLoc(readSourceLocation());
6795}
6796
6797void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
6798 TL.setKWLoc(readSourceLocation());
6799 TL.setLParenLoc(readSourceLocation());
6800 TL.setRParenLoc(readSourceLocation());
6801}
6802
6803void TypeLocReader::VisitPipeTypeLoc(PipeTypeLoc TL) {
6804 TL.setKWLoc(readSourceLocation());
6805}
6806
6807void TypeLocReader::VisitExtIntTypeLoc(clang::ExtIntTypeLoc TL) {
6808 TL.setNameLoc(readSourceLocation());
6809}
6810void TypeLocReader::VisitDependentExtIntTypeLoc(
6811 clang::DependentExtIntTypeLoc TL) {
6812 TL.setNameLoc(readSourceLocation());
6813}
6814
6815
6816void ASTRecordReader::readTypeLoc(TypeLoc TL) {
6817 TypeLocReader TLR(*this);
6818 for (; !TL.isNull(); TL = TL.getNextTypeLoc())
6819 TLR.Visit(TL);
6820}
6821
6822TypeSourceInfo *ASTRecordReader::readTypeSourceInfo() {
6823 QualType InfoTy = readType();
6824 if (InfoTy.isNull())
6825 return nullptr;
6826
6827 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy);
6828 readTypeLoc(TInfo->getTypeLoc());
6829 return TInfo;
6830}
6831
6832QualType ASTReader::GetType(TypeID ID) {
6833 assert(ContextObj && "reading type with no AST context")((void)0);
6834 ASTContext &Context = *ContextObj;
6835
6836 unsigned FastQuals = ID & Qualifiers::FastMask;
6837 unsigned Index = ID >> Qualifiers::FastWidth;
6838
6839 if (Index < NUM_PREDEF_TYPE_IDS) {
6840 QualType T;
6841 switch ((PredefinedTypeIDs)Index) {
6842 case PREDEF_TYPE_NULL_ID:
6843 return QualType();
6844 case PREDEF_TYPE_VOID_ID:
6845 T = Context.VoidTy;
6846 break;
6847 case PREDEF_TYPE_BOOL_ID:
6848 T = Context.BoolTy;
6849 break;
6850 case PREDEF_TYPE_CHAR_U_ID:
6851 case PREDEF_TYPE_CHAR_S_ID:
6852 // FIXME: Check that the signedness of CharTy is correct!
6853 T = Context.CharTy;
6854 break;
6855 case PREDEF_TYPE_UCHAR_ID:
6856 T = Context.UnsignedCharTy;
6857 break;
6858 case PREDEF_TYPE_USHORT_ID:
6859 T = Context.UnsignedShortTy;
6860 break;
6861 case PREDEF_TYPE_UINT_ID:
6862 T = Context.UnsignedIntTy;
6863 break;
6864 case PREDEF_TYPE_ULONG_ID:
6865 T = Context.UnsignedLongTy;
6866 break;
6867 case PREDEF_TYPE_ULONGLONG_ID:
6868 T = Context.UnsignedLongLongTy;
6869 break;
6870 case PREDEF_TYPE_UINT128_ID:
6871 T = Context.UnsignedInt128Ty;
6872 break;
6873 case PREDEF_TYPE_SCHAR_ID:
6874 T = Context.SignedCharTy;
6875 break;
6876 case PREDEF_TYPE_WCHAR_ID:
6877 T = Context.WCharTy;
6878 break;
6879 case PREDEF_TYPE_SHORT_ID:
6880 T = Context.ShortTy;
6881 break;
6882 case PREDEF_TYPE_INT_ID:
6883 T = Context.IntTy;
6884 break;
6885 case PREDEF_TYPE_LONG_ID:
6886 T = Context.LongTy;
6887 break;
6888 case PREDEF_TYPE_LONGLONG_ID:
6889 T = Context.LongLongTy;
6890 break;
6891 case PREDEF_TYPE_INT128_ID:
6892 T = Context.Int128Ty;
6893 break;
6894 case PREDEF_TYPE_BFLOAT16_ID:
6895 T = Context.BFloat16Ty;
6896 break;
6897 case PREDEF_TYPE_HALF_ID:
6898 T = Context.HalfTy;
6899 break;
6900 case PREDEF_TYPE_FLOAT_ID:
6901 T = Context.FloatTy;
6902 break;
6903 case PREDEF_TYPE_DOUBLE_ID:
6904 T = Context.DoubleTy;
6905 break;
6906 case PREDEF_TYPE_LONGDOUBLE_ID:
6907 T = Context.LongDoubleTy;
6908 break;
6909 case PREDEF_TYPE_SHORT_ACCUM_ID:
6910 T = Context.ShortAccumTy;
6911 break;
6912 case PREDEF_TYPE_ACCUM_ID:
6913 T = Context.AccumTy;
6914 break;
6915 case PREDEF_TYPE_LONG_ACCUM_ID:
6916 T = Context.LongAccumTy;
6917 break;
6918 case PREDEF_TYPE_USHORT_ACCUM_ID:
6919 T = Context.UnsignedShortAccumTy;
6920 break;
6921 case PREDEF_TYPE_UACCUM_ID:
6922 T = Context.UnsignedAccumTy;
6923 break;
6924 case PREDEF_TYPE_ULONG_ACCUM_ID:
6925 T = Context.UnsignedLongAccumTy;
6926 break;
6927 case PREDEF_TYPE_SHORT_FRACT_ID:
6928 T = Context.ShortFractTy;
6929 break;
6930 case PREDEF_TYPE_FRACT_ID:
6931 T = Context.FractTy;
6932 break;
6933 case PREDEF_TYPE_LONG_FRACT_ID:
6934 T = Context.LongFractTy;
6935 break;
6936 case PREDEF_TYPE_USHORT_FRACT_ID:
6937 T = Context.UnsignedShortFractTy;
6938 break;
6939 case PREDEF_TYPE_UFRACT_ID:
6940 T = Context.UnsignedFractTy;
6941 break;
6942 case PREDEF_TYPE_ULONG_FRACT_ID:
6943 T = Context.UnsignedLongFractTy;
6944 break;
6945 case PREDEF_TYPE_SAT_SHORT_ACCUM_ID:
6946 T = Context.SatShortAccumTy;
6947 break;
6948 case PREDEF_TYPE_SAT_ACCUM_ID:
6949 T = Context.SatAccumTy;
6950 break;
6951 case PREDEF_TYPE_SAT_LONG_ACCUM_ID:
6952 T = Context.SatLongAccumTy;
6953 break;
6954 case PREDEF_TYPE_SAT_USHORT_ACCUM_ID:
6955 T = Context.SatUnsignedShortAccumTy;
6956 break;
6957 case PREDEF_TYPE_SAT_UACCUM_ID:
6958 T = Context.SatUnsignedAccumTy;
6959 break;
6960 case PREDEF_TYPE_SAT_ULONG_ACCUM_ID:
6961 T = Context.SatUnsignedLongAccumTy;
6962 break;
6963 case PREDEF_TYPE_SAT_SHORT_FRACT_ID:
6964 T = Context.SatShortFractTy;
6965 break;
6966 case PREDEF_TYPE_SAT_FRACT_ID:
6967 T = Context.SatFractTy;
6968 break;
6969 case PREDEF_TYPE_SAT_LONG_FRACT_ID:
6970 T = Context.SatLongFractTy;
6971 break;
6972 case PREDEF_TYPE_SAT_USHORT_FRACT_ID:
6973 T = Context.SatUnsignedShortFractTy;
6974 break;
6975 case PREDEF_TYPE_SAT_UFRACT_ID:
6976 T = Context.SatUnsignedFractTy;
6977 break;
6978 case PREDEF_TYPE_SAT_ULONG_FRACT_ID:
6979 T = Context.SatUnsignedLongFractTy;
6980 break;
6981 case PREDEF_TYPE_FLOAT16_ID:
6982 T = Context.Float16Ty;
6983 break;
6984 case PREDEF_TYPE_FLOAT128_ID:
6985 T = Context.Float128Ty;
6986 break;
6987 case PREDEF_TYPE_OVERLOAD_ID:
6988 T = Context.OverloadTy;
6989 break;
6990 case PREDEF_TYPE_BOUND_MEMBER:
6991 T = Context.BoundMemberTy;
6992 break;
6993 case PREDEF_TYPE_PSEUDO_OBJECT:
6994 T = Context.PseudoObjectTy;
6995 break;
6996 case PREDEF_TYPE_DEPENDENT_ID:
6997 T = Context.DependentTy;
6998 break;
6999 case PREDEF_TYPE_UNKNOWN_ANY:
7000 T = Context.UnknownAnyTy;
7001 break;
7002 case PREDEF_TYPE_NULLPTR_ID:
7003 T = Context.NullPtrTy;
7004 break;
7005 case PREDEF_TYPE_CHAR8_ID:
7006 T = Context.Char8Ty;
7007 break;
7008 case PREDEF_TYPE_CHAR16_ID:
7009 T = Context.Char16Ty;
7010 break;
7011 case PREDEF_TYPE_CHAR32_ID:
7012 T = Context.Char32Ty;
7013 break;
7014 case PREDEF_TYPE_OBJC_ID:
7015 T = Context.ObjCBuiltinIdTy;
7016 break;
7017 case PREDEF_TYPE_OBJC_CLASS:
7018 T = Context.ObjCBuiltinClassTy;
7019 break;
7020 case PREDEF_TYPE_OBJC_SEL:
7021 T = Context.ObjCBuiltinSelTy;
7022 break;
7023#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
7024 case PREDEF_TYPE_##Id##_ID: \
7025 T = Context.SingletonId; \
7026 break;
7027#include "clang/Basic/OpenCLImageTypes.def"
7028#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
7029 case PREDEF_TYPE_##Id##_ID: \
7030 T = Context.Id##Ty; \
7031 break;
7032#include "clang/Basic/OpenCLExtensionTypes.def"
7033 case PREDEF_TYPE_SAMPLER_ID:
7034 T = Context.OCLSamplerTy;
7035 break;
7036 case PREDEF_TYPE_EVENT_ID:
7037 T = Context.OCLEventTy;
7038 break;
7039 case PREDEF_TYPE_CLK_EVENT_ID:
7040 T = Context.OCLClkEventTy;
7041 break;
7042 case PREDEF_TYPE_QUEUE_ID:
7043 T = Context.OCLQueueTy;
7044 break;
7045 case PREDEF_TYPE_RESERVE_ID_ID:
7046 T = Context.OCLReserveIDTy;
7047 break;
7048 case PREDEF_TYPE_AUTO_DEDUCT:
7049 T = Context.getAutoDeductType();
7050 break;
7051 case PREDEF_TYPE_AUTO_RREF_DEDUCT:
7052 T = Context.getAutoRRefDeductType();
7053 break;
7054 case PREDEF_TYPE_ARC_UNBRIDGED_CAST:
7055 T = Context.ARCUnbridgedCastTy;
7056 break;
7057 case PREDEF_TYPE_BUILTIN_FN:
7058 T = Context.BuiltinFnTy;
7059 break;
7060 case PREDEF_TYPE_INCOMPLETE_MATRIX_IDX:
7061 T = Context.IncompleteMatrixIdxTy;
7062 break;
7063 case PREDEF_TYPE_OMP_ARRAY_SECTION:
7064 T = Context.OMPArraySectionTy;
7065 break;
7066 case PREDEF_TYPE_OMP_ARRAY_SHAPING:
7067 T = Context.OMPArraySectionTy;
7068 break;
7069 case PREDEF_TYPE_OMP_ITERATOR:
7070 T = Context.OMPIteratorTy;
7071 break;
7072#define SVE_TYPE(Name, Id, SingletonId) \
7073 case PREDEF_TYPE_##Id##_ID: \
7074 T = Context.SingletonId; \
7075 break;
7076#include "clang/Basic/AArch64SVEACLETypes.def"
7077#define PPC_VECTOR_TYPE(Name, Id, Size) \
7078 case PREDEF_TYPE_##Id##_ID: \
7079 T = Context.Id##Ty; \
7080 break;
7081#include "clang/Basic/PPCTypes.def"
7082#define RVV_TYPE(Name, Id, SingletonId) \
7083 case PREDEF_TYPE_##Id##_ID: \
7084 T = Context.SingletonId; \
7085 break;
7086#include "clang/Basic/RISCVVTypes.def"
7087 }
7088
7089 assert(!T.isNull() && "Unknown predefined type")((void)0);
7090 return T.withFastQualifiers(FastQuals);
7091 }
7092
7093 Index -= NUM_PREDEF_TYPE_IDS;
7094 assert(Index < TypesLoaded.size() && "Type index out-of-range")((void)0);
7095 if (TypesLoaded[Index].isNull()) {
7096 TypesLoaded[Index] = readTypeRecord(Index);
7097 if (TypesLoaded[Index].isNull())
7098 return QualType();
7099
7100 TypesLoaded[Index]->setFromAST();
7101 if (DeserializationListener)
7102 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID),
7103 TypesLoaded[Index]);
7104 }
7105
7106 return TypesLoaded[Index].withFastQualifiers(FastQuals);
7107}
7108
7109QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) {
7110 return GetType(getGlobalTypeID(F, LocalID));
7111}
7112
7113serialization::TypeID
7114ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const {
7115 unsigned FastQuals = LocalID & Qualifiers::FastMask;
7116 unsigned LocalIndex = LocalID >> Qualifiers::FastWidth;
7117
7118 if (LocalIndex < NUM_PREDEF_TYPE_IDS)
7119 return LocalID;
7120
7121 if (!F.ModuleOffsetMap.empty())
7122 ReadModuleOffsetMap(F);
7123
7124 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7125 = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS);
7126 assert(I != F.TypeRemap.end() && "Invalid index into type index remap")((void)0);
7127
7128 unsigned GlobalIndex = LocalIndex + I->second;
7129 return (GlobalIndex << Qualifiers::FastWidth) | FastQuals;
7130}
7131
7132TemplateArgumentLocInfo
7133ASTRecordReader::readTemplateArgumentLocInfo(TemplateArgument::ArgKind Kind) {
7134 switch (Kind) {
7135 case TemplateArgument::Expression:
7136 return readExpr();
7137 case TemplateArgument::Type:
7138 return readTypeSourceInfo();
7139 case TemplateArgument::Template: {
7140 NestedNameSpecifierLoc QualifierLoc =
7141 readNestedNameSpecifierLoc();
7142 SourceLocation TemplateNameLoc = readSourceLocation();
7143 return TemplateArgumentLocInfo(getASTContext(), QualifierLoc,
7144 TemplateNameLoc, SourceLocation());
7145 }
7146 case TemplateArgument::TemplateExpansion: {
7147 NestedNameSpecifierLoc QualifierLoc = readNestedNameSpecifierLoc();
7148 SourceLocation TemplateNameLoc = readSourceLocation();
7149 SourceLocation EllipsisLoc = readSourceLocation();
7150 return TemplateArgumentLocInfo(getASTContext(), QualifierLoc,
7151 TemplateNameLoc, EllipsisLoc);
7152 }
7153 case TemplateArgument::Null:
7154 case TemplateArgument::Integral:
7155 case TemplateArgument::Declaration:
7156 case TemplateArgument::NullPtr:
7157 case TemplateArgument::Pack:
7158 // FIXME: Is this right?
7159 return TemplateArgumentLocInfo();
7160 }
7161 llvm_unreachable("unexpected template argument loc")__builtin_unreachable();
7162}
7163
7164TemplateArgumentLoc ASTRecordReader::readTemplateArgumentLoc() {
7165 TemplateArgument Arg = readTemplateArgument();
7166
7167 if (Arg.getKind() == TemplateArgument::Expression) {
7168 if (readBool()) // bool InfoHasSameExpr.
7169 return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr()));
7170 }
7171 return TemplateArgumentLoc(Arg, readTemplateArgumentLocInfo(Arg.getKind()));
7172}
7173
7174const ASTTemplateArgumentListInfo *
7175ASTRecordReader::readASTTemplateArgumentListInfo() {
7176 SourceLocation LAngleLoc = readSourceLocation();
7177 SourceLocation RAngleLoc = readSourceLocation();
7178 unsigned NumArgsAsWritten = readInt();
7179 TemplateArgumentListInfo TemplArgsInfo(LAngleLoc, RAngleLoc);
7180 for (unsigned i = 0; i != NumArgsAsWritten; ++i)
7181 TemplArgsInfo.addArgument(readTemplateArgumentLoc());
7182 return ASTTemplateArgumentListInfo::Create(getContext(), TemplArgsInfo);
7183}
7184
7185Decl *ASTReader::GetExternalDecl(uint32_t ID) {
7186 return GetDecl(ID);
7187}
7188
7189void ASTReader::CompleteRedeclChain(const Decl *D) {
7190 if (NumCurrentElementsDeserializing) {
7191 // We arrange to not care about the complete redeclaration chain while we're
7192 // deserializing. Just remember that the AST has marked this one as complete
7193 // but that it's not actually complete yet, so we know we still need to
7194 // complete it later.
7195 PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D));
7196 return;
7197 }
7198
7199 if (!D->getDeclContext()) {
7200 assert(isa<TranslationUnitDecl>(D) && "Not a TU?")((void)0);
7201 return;
7202 }
7203
7204 const DeclContext *DC = D->getDeclContext()->getRedeclContext();
7205
7206 // If this is a named declaration, complete it by looking it up
7207 // within its context.
7208 //
7209 // FIXME: Merging a function definition should merge
7210 // all mergeable entities within it.
7211 if (isa<TranslationUnitDecl>(DC) || isa<NamespaceDecl>(DC) ||
7212 isa<CXXRecordDecl>(DC) || isa<EnumDecl>(DC)) {
7213 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) {
7214 if (!getContext().getLangOpts().CPlusPlus &&
7215 isa<TranslationUnitDecl>(DC)) {
7216 // Outside of C++, we don't have a lookup table for the TU, so update
7217 // the identifier instead. (For C++ modules, we don't store decls
7218 // in the serialized identifier table, so we do the lookup in the TU.)
7219 auto *II = Name.getAsIdentifierInfo();
7220 assert(II && "non-identifier name in C?")((void)0);
7221 if (II->isOutOfDate())
7222 updateOutOfDateIdentifier(*II);
7223 } else
7224 DC->lookup(Name);
7225 } else if (needsAnonymousDeclarationNumber(cast<NamedDecl>(D))) {
7226 // Find all declarations of this kind from the relevant context.
7227 for (auto *DCDecl : cast<Decl>(D->getLexicalDeclContext())->redecls()) {
7228 auto *DC = cast<DeclContext>(DCDecl);
7229 SmallVector<Decl*, 8> Decls;
7230 FindExternalLexicalDecls(
7231 DC, [&](Decl::Kind K) { return K == D->getKind(); }, Decls);
7232 }
7233 }
7234 }
7235
7236 if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D))
7237 CTSD->getSpecializedTemplate()->LoadLazySpecializations();
7238 if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D))
7239 VTSD->getSpecializedTemplate()->LoadLazySpecializations();
7240 if (auto *FD = dyn_cast<FunctionDecl>(D)) {
7241 if (auto *Template = FD->getPrimaryTemplate())
7242 Template->LoadLazySpecializations();
7243 }
7244}
7245
7246CXXCtorInitializer **
7247ASTReader::GetExternalCXXCtorInitializers(uint64_t Offset) {
7248 RecordLocation Loc = getLocalBitOffset(Offset);
7249 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
7250 SavedStreamPosition SavedPosition(Cursor);
7251 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
7252 Error(std::move(Err));
7253 return nullptr;
7254 }
7255 ReadingKindTracker ReadingKind(Read_Decl, *this);
7256
7257 Expected<unsigned> MaybeCode = Cursor.ReadCode();
7258 if (!MaybeCode) {
7259 Error(MaybeCode.takeError());
7260 return nullptr;
7261 }
7262 unsigned Code = MaybeCode.get();
7263
7264 ASTRecordReader Record(*this, *Loc.F);
7265 Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code);
7266 if (!MaybeRecCode) {
7267 Error(MaybeRecCode.takeError());
7268 return nullptr;
7269 }
7270 if (MaybeRecCode.get() != DECL_CXX_CTOR_INITIALIZERS) {
7271 Error("malformed AST file: missing C++ ctor initializers");
7272 return nullptr;
7273 }
7274
7275 return Record.readCXXCtorInitializers();
7276}
7277
7278CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) {
7279 assert(ContextObj && "reading base specifiers with no AST context")((void)0);
7280 ASTContext &Context = *ContextObj;
7281
7282 RecordLocation Loc = getLocalBitOffset(Offset);
7283 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
7284 SavedStreamPosition SavedPosition(Cursor);
7285 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
7286 Error(std::move(Err));
7287 return nullptr;
7288 }
7289 ReadingKindTracker ReadingKind(Read_Decl, *this);
7290
7291 Expected<unsigned> MaybeCode = Cursor.ReadCode();
7292 if (!MaybeCode) {
7293 Error(MaybeCode.takeError());
7294 return nullptr;
7295 }
7296 unsigned Code = MaybeCode.get();
7297
7298 ASTRecordReader Record(*this, *Loc.F);
7299 Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code);
7300 if (!MaybeRecCode) {
7301 Error(MaybeCode.takeError());
7302 return nullptr;
7303 }
7304 unsigned RecCode = MaybeRecCode.get();
7305
7306 if (RecCode != DECL_CXX_BASE_SPECIFIERS) {
7307 Error("malformed AST file: missing C++ base specifiers");
7308 return nullptr;
7309 }
7310
7311 unsigned NumBases = Record.readInt();
7312 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases);
7313 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases];
7314 for (unsigned I = 0; I != NumBases; ++I)
7315 Bases[I] = Record.readCXXBaseSpecifier();
7316 return Bases;
7317}
7318
7319serialization::DeclID
7320ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const {
7321 if (LocalID < NUM_PREDEF_DECL_IDS)
7322 return LocalID;
7323
7324 if (!F.ModuleOffsetMap.empty())
7325 ReadModuleOffsetMap(F);
7326
7327 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7328 = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS);
7329 assert(I != F.DeclRemap.end() && "Invalid index into decl index remap")((void)0);
7330
7331 return LocalID + I->second;
7332}
7333
7334bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID,
7335 ModuleFile &M) const {
7336 // Predefined decls aren't from any module.
7337 if (ID < NUM_PREDEF_DECL_IDS)
7338 return false;
7339
7340 return ID - NUM_PREDEF_DECL_IDS >= M.BaseDeclID &&
7341 ID - NUM_PREDEF_DECL_IDS < M.BaseDeclID + M.LocalNumDecls;
7342}
7343
7344ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) {
7345 if (!D->isFromASTFile())
7346 return nullptr;
7347 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID());
7348 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map")((void)0);
7349 return I->second;
7350}
7351
7352SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) {
7353 if (ID < NUM_PREDEF_DECL_IDS)
7354 return SourceLocation();
7355
7356 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
7357
7358 if (Index > DeclsLoaded.size()) {
7359 Error("declaration ID out-of-range for AST file");
7360 return SourceLocation();
7361 }
7362
7363 if (Decl *D = DeclsLoaded[Index])
7364 return D->getLocation();
7365
7366 SourceLocation Loc;
7367 DeclCursorForID(ID, Loc);
7368 return Loc;
7369}
7370
7371static Decl *getPredefinedDecl(ASTContext &Context, PredefinedDeclIDs ID) {
7372 switch (ID) {
7373 case PREDEF_DECL_NULL_ID:
7374 return nullptr;
7375
7376 case PREDEF_DECL_TRANSLATION_UNIT_ID:
7377 return Context.getTranslationUnitDecl();
7378
7379 case PREDEF_DECL_OBJC_ID_ID:
7380 return Context.getObjCIdDecl();
7381
7382 case PREDEF_DECL_OBJC_SEL_ID:
7383 return Context.getObjCSelDecl();
7384
7385 case PREDEF_DECL_OBJC_CLASS_ID:
7386 return Context.getObjCClassDecl();
7387
7388 case PREDEF_DECL_OBJC_PROTOCOL_ID:
7389 return Context.getObjCProtocolDecl();
7390
7391 case PREDEF_DECL_INT_128_ID:
7392 return Context.getInt128Decl();
7393
7394 case PREDEF_DECL_UNSIGNED_INT_128_ID:
7395 return Context.getUInt128Decl();
7396
7397 case PREDEF_DECL_OBJC_INSTANCETYPE_ID:
7398 return Context.getObjCInstanceTypeDecl();
7399
7400 case PREDEF_DECL_BUILTIN_VA_LIST_ID:
7401 return Context.getBuiltinVaListDecl();
7402
7403 case PREDEF_DECL_VA_LIST_TAG:
7404 return Context.getVaListTagDecl();
7405
7406 case PREDEF_DECL_BUILTIN_MS_VA_LIST_ID:
7407 return Context.getBuiltinMSVaListDecl();
7408
7409 case PREDEF_DECL_BUILTIN_MS_GUID_ID:
7410 return Context.getMSGuidTagDecl();
7411
7412 case PREDEF_DECL_EXTERN_C_CONTEXT_ID:
7413 return Context.getExternCContextDecl();
7414
7415 case PREDEF_DECL_MAKE_INTEGER_SEQ_ID:
7416 return Context.getMakeIntegerSeqDecl();
7417
7418 case PREDEF_DECL_CF_CONSTANT_STRING_ID:
7419 return Context.getCFConstantStringDecl();
7420
7421 case PREDEF_DECL_CF_CONSTANT_STRING_TAG_ID:
7422 return Context.getCFConstantStringTagDecl();
7423
7424 case PREDEF_DECL_TYPE_PACK_ELEMENT_ID:
7425 return Context.getTypePackElementDecl();
7426 }
7427 llvm_unreachable("PredefinedDeclIDs unknown enum value")__builtin_unreachable();
7428}
7429
7430Decl *ASTReader::GetExistingDecl(DeclID ID) {
7431 assert(ContextObj && "reading decl with no AST context")((void)0);
7432 if (ID < NUM_PREDEF_DECL_IDS) {
7433 Decl *D = getPredefinedDecl(*ContextObj, (PredefinedDeclIDs)ID);
7434 if (D) {
7435 // Track that we have merged the declaration with ID \p ID into the
7436 // pre-existing predefined declaration \p D.
7437 auto &Merged = KeyDecls[D->getCanonicalDecl()];
7438 if (Merged.empty())
7439 Merged.push_back(ID);
7440 }
7441 return D;
7442 }
7443
7444 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
7445
7446 if (Index >= DeclsLoaded.size()) {
7447 assert(0 && "declaration ID out-of-range for AST file")((void)0);
7448 Error("declaration ID out-of-range for AST file");
7449 return nullptr;
7450 }
7451
7452 return DeclsLoaded[Index];
7453}
7454
7455Decl *ASTReader::GetDecl(DeclID ID) {
7456 if (ID < NUM_PREDEF_DECL_IDS)
7457 return GetExistingDecl(ID);
7458
7459 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
7460
7461 if (Index >= DeclsLoaded.size()) {
7462 assert(0 && "declaration ID out-of-range for AST file")((void)0);
7463 Error("declaration ID out-of-range for AST file");
7464 return nullptr;
7465 }
7466
7467 if (!DeclsLoaded[Index]) {
7468 ReadDeclRecord(ID);
7469 if (DeserializationListener)
7470 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
7471 }
7472
7473 return DeclsLoaded[Index];
7474}
7475
7476DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M,
7477 DeclID GlobalID) {
7478 if (GlobalID < NUM_PREDEF_DECL_IDS)
7479 return GlobalID;
7480
7481 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID);
7482 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map")((void)0);
7483 ModuleFile *Owner = I->second;
7484
7485 llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos
7486 = M.GlobalToLocalDeclIDs.find(Owner);
7487 if (Pos == M.GlobalToLocalDeclIDs.end())
7488 return 0;
7489
7490 return GlobalID - Owner->BaseDeclID + Pos->second;
7491}
7492
7493serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F,
7494 const RecordData &Record,
7495 unsigned &Idx) {
7496 if (Idx >= Record.size()) {
7497 Error("Corrupted AST file");
7498 return 0;
7499 }
7500
7501 return getGlobalDeclID(F, Record[Idx++]);
7502}
7503
7504/// Resolve the offset of a statement into a statement.
7505///
7506/// This operation will read a new statement from the external
7507/// source each time it is called, and is meant to be used via a
7508/// LazyOffsetPtr (which is used by Decls for the body of functions, etc).
7509Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) {
7510 // Switch case IDs are per Decl.
7511 ClearSwitchCaseIDs();
7512
7513 // Offset here is a global offset across the entire chain.
7514 RecordLocation Loc = getLocalBitOffset(Offset);
7515 if (llvm::Error Err = Loc.F->DeclsCursor.JumpToBit(Loc.Offset)) {
7516 Error(std::move(Err));
7517 return nullptr;
7518 }
7519 assert(NumCurrentElementsDeserializing == 0 &&((void)0)
7520 "should not be called while already deserializing")((void)0);
7521 Deserializing D(this);
7522 return ReadStmtFromStream(*Loc.F);
7523}
7524
7525void ASTReader::FindExternalLexicalDecls(
7526 const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant,
7527 SmallVectorImpl<Decl *> &Decls) {
7528 bool PredefsVisited[NUM_PREDEF_DECL_IDS] = {};
7529
7530 auto Visit = [&] (ModuleFile *M, LexicalContents LexicalDecls) {
7531 assert(LexicalDecls.size() % 2 == 0 && "expected an even number of entries")((void)0);
7532 for (int I = 0, N = LexicalDecls.size(); I != N; I += 2) {
7533 auto K = (Decl::Kind)+LexicalDecls[I];
7534 if (!IsKindWeWant(K))
7535 continue;
7536
7537 auto ID = (serialization::DeclID)+LexicalDecls[I + 1];
7538
7539 // Don't add predefined declarations to the lexical context more
7540 // than once.
7541 if (ID < NUM_PREDEF_DECL_IDS) {
7542 if (PredefsVisited[ID])
7543 continue;
7544
7545 PredefsVisited[ID] = true;
7546 }
7547
7548 if (Decl *D = GetLocalDecl(*M, ID)) {
7549 assert(D->getKind() == K && "wrong kind for lexical decl")((void)0);
7550 if (!DC->isDeclInLexicalTraversal(D))
7551 Decls.push_back(D);
7552 }
7553 }
7554 };
7555
7556 if (isa<TranslationUnitDecl>(DC)) {
7557 for (auto Lexical : TULexicalDecls)
7558 Visit(Lexical.first, Lexical.second);
7559 } else {
7560 auto I = LexicalDecls.find(DC);
7561 if (I != LexicalDecls.end())
7562 Visit(I->second.first, I->second.second);
7563 }
7564
7565 ++NumLexicalDeclContextsRead;
7566}
7567
7568namespace {
7569
7570class DeclIDComp {
7571 ASTReader &Reader;
7572 ModuleFile &Mod;
7573
7574public:
7575 DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {}
7576
7577 bool operator()(LocalDeclID L, LocalDeclID R) const {
7578 SourceLocation LHS = getLocation(L);
7579 SourceLocation RHS = getLocation(R);
7580 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
7581 }
7582
7583 bool operator()(SourceLocation LHS, LocalDeclID R) const {
7584 SourceLocation RHS = getLocation(R);
7585 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
7586 }
7587
7588 bool operator()(LocalDeclID L, SourceLocation RHS) const {
7589 SourceLocation LHS = getLocation(L);
7590 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
7591 }
7592
7593 SourceLocation getLocation(LocalDeclID ID) const {
7594 return Reader.getSourceManager().getFileLoc(
7595 Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID)));
7596 }
7597};
7598
7599} // namespace
7600
7601void ASTReader::FindFileRegionDecls(FileID File,
7602 unsigned Offset, unsigned Length,
7603 SmallVectorImpl<Decl *> &Decls) {
7604 SourceManager &SM = getSourceManager();
7605
7606 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File);
7607 if (I == FileDeclIDs.end())
7608 return;
7609
7610 FileDeclsInfo &DInfo = I->second;
7611 if (DInfo.Decls.empty())
7612 return;
7613
7614 SourceLocation
7615 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset);
7616 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length);
7617
7618 DeclIDComp DIDComp(*this, *DInfo.Mod);
7619 ArrayRef<serialization::LocalDeclID>::iterator BeginIt =
7620 llvm::lower_bound(DInfo.Decls, BeginLoc, DIDComp);
7621 if (BeginIt != DInfo.Decls.begin())
7622 --BeginIt;
7623
7624 // If we are pointing at a top-level decl inside an objc container, we need
7625 // to backtrack until we find it otherwise we will fail to report that the
7626 // region overlaps with an objc container.
7627 while (BeginIt != DInfo.Decls.begin() &&
7628 GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt))
7629 ->isTopLevelDeclInObjCContainer())
7630 --BeginIt;
7631
7632 ArrayRef<serialization::LocalDeclID>::iterator EndIt =
7633 llvm::upper_bound(DInfo.Decls, EndLoc, DIDComp);
7634 if (EndIt != DInfo.Decls.end())
7635 ++EndIt;
7636
7637 for (ArrayRef<serialization::LocalDeclID>::iterator
7638 DIt = BeginIt; DIt != EndIt; ++DIt)
7639 Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt)));
7640}
7641
7642bool
7643ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC,
7644 DeclarationName Name) {
7645 assert(DC->hasExternalVisibleStorage() && DC == DC->getPrimaryContext() &&((void)0)
7646 "DeclContext has no visible decls in storage")((void)0);
7647 if (!Name)
7648 return false;
7649
7650 auto It = Lookups.find(DC);
7651 if (It == Lookups.end())
7652 return false;
7653
7654 Deserializing LookupResults(this);
7655
7656 // Load the list of declarations.
7657 SmallVector<NamedDecl *, 64> Decls;
7658 llvm::SmallPtrSet<NamedDecl *, 8> Found;
7659 for (DeclID ID : It->second.Table.find(Name)) {
7660 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID));
7661 if (ND->getDeclName() == Name && Found.insert(ND).second)
7662 Decls.push_back(ND);
7663 }
7664
7665 ++NumVisibleDeclContextsRead;
7666 SetExternalVisibleDeclsForName(DC, Name, Decls);
7667 return !Decls.empty();
7668}
7669
7670void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) {
7671 if (!DC->hasExternalVisibleStorage())
7672 return;
7673
7674 auto It = Lookups.find(DC);
7675 assert(It != Lookups.end() &&((void)0)
7676 "have external visible storage but no lookup tables")((void)0);
7677
7678 DeclsMap Decls;
7679
7680 for (DeclID ID : It->second.Table.findAll()) {
7681 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID));
7682 Decls[ND->getDeclName()].push_back(ND);
7683 }
7684
7685 ++NumVisibleDeclContextsRead;
7686
7687 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) {
7688 SetExternalVisibleDeclsForName(DC, I->first, I->second);
7689 }
7690 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false);
7691}
7692
7693const serialization::reader::DeclContextLookupTable *
7694ASTReader::getLoadedLookupTables(DeclContext *Primary) const {
7695 auto I = Lookups.find(Primary);
7696 return I == Lookups.end() ? nullptr : &I->second;
7697}
7698
7699/// Under non-PCH compilation the consumer receives the objc methods
7700/// before receiving the implementation, and codegen depends on this.
7701/// We simulate this by deserializing and passing to consumer the methods of the
7702/// implementation before passing the deserialized implementation decl.
7703static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD,
7704 ASTConsumer *Consumer) {
7705 assert(ImplD && Consumer)((void)0);
7706
7707 for (auto *I : ImplD->methods())
7708 Consumer->HandleInterestingDecl(DeclGroupRef(I));
7709
7710 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD));
7711}
7712
7713void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
7714 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
7715 PassObjCImplDeclToConsumer(ImplD, Consumer);
7716 else
7717 Consumer->HandleInterestingDecl(DeclGroupRef(D));
7718}
7719
7720void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) {
7721 this->Consumer = Consumer;
7722
7723 if (Consumer)
7724 PassInterestingDeclsToConsumer();
7725
7726 if (DeserializationListener)
7727 DeserializationListener->ReaderInitialized(this);
7728}
7729
7730void ASTReader::PrintStats() {
7731 std::fprintf(stderr(&__sF[2]), "*** AST File Statistics:\n");
7732
7733 unsigned NumTypesLoaded
7734 = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(),
7735 QualType());
7736 unsigned NumDeclsLoaded
7737 = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(),
7738 (Decl *)nullptr);
7739 unsigned NumIdentifiersLoaded
7740 = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(),
7741 IdentifiersLoaded.end(),
7742 (IdentifierInfo *)nullptr);
7743 unsigned NumMacrosLoaded
7744 = MacrosLoaded.size() - std::count(MacrosLoaded.begin(),
7745 MacrosLoaded.end(),
7746 (MacroInfo *)nullptr);
7747 unsigned NumSelectorsLoaded
7748 = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(),
7749 SelectorsLoaded.end(),
7750 Selector());
7751
7752 if (unsigned TotalNumSLocEntries = getTotalNumSLocs())
7753 std::fprintf(stderr(&__sF[2]), " %u/%u source location entries read (%f%%)\n",
7754 NumSLocEntriesRead, TotalNumSLocEntries,
7755 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
7756 if (!TypesLoaded.empty())
7757 std::fprintf(stderr(&__sF[2]), " %u/%u types read (%f%%)\n",
7758 NumTypesLoaded, (unsigned)TypesLoaded.size(),
7759 ((float)NumTypesLoaded/TypesLoaded.size() * 100));
7760 if (!DeclsLoaded.empty())
7761 std::fprintf(stderr(&__sF[2]), " %u/%u declarations read (%f%%)\n",
7762 NumDeclsLoaded, (unsigned)DeclsLoaded.size(),
7763 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100));
7764 if (!IdentifiersLoaded.empty())
7765 std::fprintf(stderr(&__sF[2]), " %u/%u identifiers read (%f%%)\n",
7766 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(),
7767 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
7768 if (!MacrosLoaded.empty())
7769 std::fprintf(stderr(&__sF[2]), " %u/%u macros read (%f%%)\n",
7770 NumMacrosLoaded, (unsigned)MacrosLoaded.size(),
7771 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100));
7772 if (!SelectorsLoaded.empty())
7773 std::fprintf(stderr(&__sF[2]), " %u/%u selectors read (%f%%)\n",
7774 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(),
7775 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
7776 if (TotalNumStatements)
7777 std::fprintf(stderr(&__sF[2]), " %u/%u statements read (%f%%)\n",
7778 NumStatementsRead, TotalNumStatements,
7779 ((float)NumStatementsRead/TotalNumStatements * 100));
7780 if (TotalNumMacros)
7781 std::fprintf(stderr(&__sF[2]), " %u/%u macros read (%f%%)\n",
7782 NumMacrosRead, TotalNumMacros,
7783 ((float)NumMacrosRead/TotalNumMacros * 100));
7784 if (TotalLexicalDeclContexts)
7785 std::fprintf(stderr(&__sF[2]), " %u/%u lexical declcontexts read (%f%%)\n",
7786 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
7787 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
7788 * 100));
7789 if (TotalVisibleDeclContexts)
7790 std::fprintf(stderr(&__sF[2]), " %u/%u visible declcontexts read (%f%%)\n",
7791 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
7792 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
7793 * 100));
7794 if (TotalNumMethodPoolEntries)
7795 std::fprintf(stderr(&__sF[2]), " %u/%u method pool entries read (%f%%)\n",
7796 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
7797 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
7798 * 100));
7799 if (NumMethodPoolLookups)
7800 std::fprintf(stderr(&__sF[2]), " %u/%u method pool lookups succeeded (%f%%)\n",
7801 NumMethodPoolHits, NumMethodPoolLookups,
7802 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
7803 if (NumMethodPoolTableLookups)
7804 std::fprintf(stderr(&__sF[2]), " %u/%u method pool table lookups succeeded (%f%%)\n",
7805 NumMethodPoolTableHits, NumMethodPoolTableLookups,
7806 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups
7807 * 100.0));
7808 if (NumIdentifierLookupHits)
7809 std::fprintf(stderr(&__sF[2]),
7810 " %u / %u identifier table lookups succeeded (%f%%)\n",
7811 NumIdentifierLookupHits, NumIdentifierLookups,
7812 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
7813
7814 if (GlobalIndex) {
7815 std::fprintf(stderr(&__sF[2]), "\n");
7816 GlobalIndex->printStats();
7817 }
7818
7819 std::fprintf(stderr(&__sF[2]), "\n");
7820 dump();
7821 std::fprintf(stderr(&__sF[2]), "\n");
7822}
7823
7824template<typename Key, typename ModuleFile, unsigned InitialCapacity>
7825LLVM_DUMP_METHOD__attribute__((noinline)) static void
7826dumpModuleIDMap(StringRef Name,
7827 const ContinuousRangeMap<Key, ModuleFile *,
7828 InitialCapacity> &Map) {
7829 if (Map.begin() == Map.end())
7830 return;
7831
7832 using MapType = ContinuousRangeMap<Key, ModuleFile *, InitialCapacity>;
7833
7834 llvm::errs() << Name << ":\n";
7835 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
7836 I != IEnd; ++I) {
7837 llvm::errs() << " " << I->first << " -> " << I->second->FileName
7838 << "\n";
7839 }
7840}
7841
7842LLVM_DUMP_METHOD__attribute__((noinline)) void ASTReader::dump() {
7843 llvm::errs() << "*** PCH/ModuleFile Remappings:\n";
7844 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap);
7845 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap);
7846 dumpModuleIDMap("Global type map", GlobalTypeMap);
7847 dumpModuleIDMap("Global declaration map", GlobalDeclMap);
7848 dumpModuleIDMap("Global identifier map", GlobalIdentifierMap);
7849 dumpModuleIDMap("Global macro map", GlobalMacroMap);
7850 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap);
7851 dumpModuleIDMap("Global selector map", GlobalSelectorMap);
7852 dumpModuleIDMap("Global preprocessed entity map",
7853 GlobalPreprocessedEntityMap);
7854
7855 llvm::errs() << "\n*** PCH/Modules Loaded:";
7856 for (ModuleFile &M : ModuleMgr)
7857 M.dump();
7858}
7859
7860/// Return the amount of memory used by memory buffers, breaking down
7861/// by heap-backed versus mmap'ed memory.
7862void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const {
7863 for (ModuleFile &I : ModuleMgr) {
7864 if (llvm::MemoryBuffer *buf = I.Buffer) {
7865 size_t bytes = buf->getBufferSize();
7866 switch (buf->getBufferKind()) {
7867 case llvm::MemoryBuffer::MemoryBuffer_Malloc:
7868 sizes.malloc_bytes += bytes;
7869 break;
7870 case llvm::MemoryBuffer::MemoryBuffer_MMap:
7871 sizes.mmap_bytes += bytes;
7872 break;
7873 }
7874 }
7875 }
7876}
7877
7878void ASTReader::InitializeSema(Sema &S) {
7879 SemaObj = &S;
7880 S.addExternalSource(this);
7881
7882 // Makes sure any declarations that were deserialized "too early"
7883 // still get added to the identifier's declaration chains.
7884 for (uint64_t ID : PreloadedDeclIDs) {
7885 NamedDecl *D = cast<NamedDecl>(GetDecl(ID));
7886 pushExternalDeclIntoScope(D, D->getDeclName());
7887 }
7888 PreloadedDeclIDs.clear();
7889
7890 // FIXME: What happens if these are changed by a module import?
7891 if (!FPPragmaOptions.empty()) {
7892 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS")((void)0);
7893 FPOptionsOverride NewOverrides =
7894 FPOptionsOverride::getFromOpaqueInt(FPPragmaOptions[0]);
7895 SemaObj->CurFPFeatures =
7896 NewOverrides.applyOverrides(SemaObj->getLangOpts());
7897 }
7898
7899 SemaObj->OpenCLFeatures = OpenCLExtensions;
7900
7901 UpdateSema();
7902}
7903
7904void ASTReader::UpdateSema() {
7905 assert(SemaObj && "no Sema to update")((void)0);
7906
7907 // Load the offsets of the declarations that Sema references.
7908 // They will be lazily deserialized when needed.
7909 if (!SemaDeclRefs.empty()) {
7910 assert(SemaDeclRefs.size() % 3 == 0)((void)0);
7911 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 3) {
7912 if (!SemaObj->StdNamespace)
7913 SemaObj->StdNamespace = SemaDeclRefs[I];
7914 if (!SemaObj->StdBadAlloc)
7915 SemaObj->StdBadAlloc = SemaDeclRefs[I+1];
7916 if (!SemaObj->StdAlignValT)
7917 SemaObj->StdAlignValT = SemaDeclRefs[I+2];
7918 }
7919 SemaDeclRefs.clear();
7920 }
7921
7922 // Update the state of pragmas. Use the same API as if we had encountered the
7923 // pragma in the source.
7924 if(OptimizeOffPragmaLocation.isValid())
7925 SemaObj->ActOnPragmaOptimize(/* On = */ false, OptimizeOffPragmaLocation);
7926 if (PragmaMSStructState != -1)
7927 SemaObj->ActOnPragmaMSStruct((PragmaMSStructKind)PragmaMSStructState);
7928 if (PointersToMembersPragmaLocation.isValid()) {
7929 SemaObj->ActOnPragmaMSPointersToMembers(
7930 (LangOptions::PragmaMSPointersToMembersKind)
7931 PragmaMSPointersToMembersState,
7932 PointersToMembersPragmaLocation);
7933 }
7934 SemaObj->ForceCUDAHostDeviceDepth = ForceCUDAHostDeviceDepth;
7935
7936 if (PragmaAlignPackCurrentValue) {
7937 // The bottom of the stack might have a default value. It must be adjusted
7938 // to the current value to ensure that the packing state is preserved after
7939 // popping entries that were included/imported from a PCH/module.
7940 bool DropFirst = false;
7941 if (!PragmaAlignPackStack.empty() &&
7942 PragmaAlignPackStack.front().Location.isInvalid()) {
7943 assert(PragmaAlignPackStack.front().Value ==((void)0)
7944 SemaObj->AlignPackStack.DefaultValue &&((void)0)
7945 "Expected a default alignment value")((void)0);
7946 SemaObj->AlignPackStack.Stack.emplace_back(
7947 PragmaAlignPackStack.front().SlotLabel,
7948 SemaObj->AlignPackStack.CurrentValue,
7949 SemaObj->AlignPackStack.CurrentPragmaLocation,
7950 PragmaAlignPackStack.front().PushLocation);
7951 DropFirst = true;
7952 }
7953 for (const auto &Entry : llvm::makeArrayRef(PragmaAlignPackStack)
7954 .drop_front(DropFirst ? 1 : 0)) {
7955 SemaObj->AlignPackStack.Stack.emplace_back(
7956 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
7957 }
7958 if (PragmaAlignPackCurrentLocation.isInvalid()) {
7959 assert(*PragmaAlignPackCurrentValue ==((void)0)
7960 SemaObj->AlignPackStack.DefaultValue &&((void)0)
7961 "Expected a default align and pack value")((void)0);
7962 // Keep the current values.
7963 } else {
7964 SemaObj->AlignPackStack.CurrentValue = *PragmaAlignPackCurrentValue;
7965 SemaObj->AlignPackStack.CurrentPragmaLocation =
7966 PragmaAlignPackCurrentLocation;
7967 }
7968 }
7969 if (FpPragmaCurrentValue) {
7970 // The bottom of the stack might have a default value. It must be adjusted
7971 // to the current value to ensure that fp-pragma state is preserved after
7972 // popping entries that were included/imported from a PCH/module.
7973 bool DropFirst = false;
7974 if (!FpPragmaStack.empty() && FpPragmaStack.front().Location.isInvalid()) {
7975 assert(FpPragmaStack.front().Value ==((void)0)
7976 SemaObj->FpPragmaStack.DefaultValue &&((void)0)
7977 "Expected a default pragma float_control value")((void)0);
7978 SemaObj->FpPragmaStack.Stack.emplace_back(
7979 FpPragmaStack.front().SlotLabel, SemaObj->FpPragmaStack.CurrentValue,
7980 SemaObj->FpPragmaStack.CurrentPragmaLocation,
7981 FpPragmaStack.front().PushLocation);
7982 DropFirst = true;
7983 }
7984 for (const auto &Entry :
7985 llvm::makeArrayRef(FpPragmaStack).drop_front(DropFirst ? 1 : 0))
7986 SemaObj->FpPragmaStack.Stack.emplace_back(
7987 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
7988 if (FpPragmaCurrentLocation.isInvalid()) {
7989 assert(*FpPragmaCurrentValue == SemaObj->FpPragmaStack.DefaultValue &&((void)0)
7990 "Expected a default pragma float_control value")((void)0);
7991 // Keep the current values.
7992 } else {
7993 SemaObj->FpPragmaStack.CurrentValue = *FpPragmaCurrentValue;
7994 SemaObj->FpPragmaStack.CurrentPragmaLocation = FpPragmaCurrentLocation;
7995 }
7996 }
7997
7998 // For non-modular AST files, restore visiblity of modules.
7999 for (auto &Import : ImportedModules) {
8000 if (Import.ImportLoc.isInvalid())
8001 continue;
8002 if (Module *Imported = getSubmodule(Import.ID)) {
8003 SemaObj->makeModuleVisible(Imported, Import.ImportLoc);
8004 }
8005 }
8006}
8007
8008IdentifierInfo *ASTReader::get(StringRef Name) {
8009 // Note that we are loading an identifier.
8010 Deserializing AnIdentifier(this);
8011
8012 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0,
8013 NumIdentifierLookups,
8014 NumIdentifierLookupHits);
8015
8016 // We don't need to do identifier table lookups in C++ modules (we preload
8017 // all interesting declarations, and don't need to use the scope for name
8018 // lookups). Perform the lookup in PCH files, though, since we don't build
8019 // a complete initial identifier table if we're carrying on from a PCH.
8020 if (PP.getLangOpts().CPlusPlus) {
8021 for (auto F : ModuleMgr.pch_modules())
8022 if (Visitor(*F))
8023 break;
8024 } else {
8025 // If there is a global index, look there first to determine which modules
8026 // provably do not have any results for this identifier.
8027 GlobalModuleIndex::HitSet Hits;
8028 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
8029 if (!loadGlobalIndex()) {
8030 if (GlobalIndex->lookupIdentifier(Name, Hits)) {
8031 HitsPtr = &Hits;
8032 }
8033 }
8034
8035 ModuleMgr.visit(Visitor, HitsPtr);
8036 }
8037
8038 IdentifierInfo *II = Visitor.getIdentifierInfo();
8039 markIdentifierUpToDate(II);
8040 return II;
8041}
8042
8043namespace clang {
8044
8045 /// An identifier-lookup iterator that enumerates all of the
8046 /// identifiers stored within a set of AST files.
8047 class ASTIdentifierIterator : public IdentifierIterator {
8048 /// The AST reader whose identifiers are being enumerated.
8049 const ASTReader &Reader;
8050
8051 /// The current index into the chain of AST files stored in
8052 /// the AST reader.
8053 unsigned Index;
8054
8055 /// The current position within the identifier lookup table
8056 /// of the current AST file.
8057 ASTIdentifierLookupTable::key_iterator Current;
8058
8059 /// The end position within the identifier lookup table of
8060 /// the current AST file.
8061 ASTIdentifierLookupTable::key_iterator End;
8062
8063 /// Whether to skip any modules in the ASTReader.
8064 bool SkipModules;
8065
8066 public:
8067 explicit ASTIdentifierIterator(const ASTReader &Reader,
8068 bool SkipModules = false);
8069
8070 StringRef Next() override;
8071 };
8072
8073} // namespace clang
8074
8075ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader,
8076 bool SkipModules)
8077 : Reader(Reader), Index(Reader.ModuleMgr.size()), SkipModules(SkipModules) {
8078}
8079
8080StringRef ASTIdentifierIterator::Next() {
8081 while (Current == End) {
8082 // If we have exhausted all of our AST files, we're done.
8083 if (Index == 0)
8084 return StringRef();
8085
8086 --Index;
8087 ModuleFile &F = Reader.ModuleMgr[Index];
8088 if (SkipModules && F.isModule())
8089 continue;
8090
8091 ASTIdentifierLookupTable *IdTable =
8092 (ASTIdentifierLookupTable *)F.IdentifierLookupTable;
8093 Current = IdTable->key_begin();
8094 End = IdTable->key_end();
8095 }
8096
8097 // We have any identifiers remaining in the current AST file; return
8098 // the next one.
8099 StringRef Result = *Current;
8100 ++Current;
8101 return Result;
8102}
8103
8104namespace {
8105
8106/// A utility for appending two IdentifierIterators.
8107class ChainedIdentifierIterator : public IdentifierIterator {
8108 std::unique_ptr<IdentifierIterator> Current;
8109 std::unique_ptr<IdentifierIterator> Queued;
8110
8111public:
8112 ChainedIdentifierIterator(std::unique_ptr<IdentifierIterator> First,
8113 std::unique_ptr<IdentifierIterator> Second)
8114 : Current(std::move(First)), Queued(std::move(Second)) {}
8115
8116 StringRef Next() override {
8117 if (!Current)
8118 return StringRef();
8119
8120 StringRef result = Current->Next();
8121 if (!result.empty())
8122 return result;
8123
8124 // Try the queued iterator, which may itself be empty.
8125 Current.reset();
8126 std::swap(Current, Queued);
8127 return Next();
8128 }
8129};
8130
8131} // namespace
8132
8133IdentifierIterator *ASTReader::getIdentifiers() {
8134 if (!loadGlobalIndex()) {
8135 std::unique_ptr<IdentifierIterator> ReaderIter(
8136 new ASTIdentifierIterator(*this, /*SkipModules=*/true));
8137 std::unique_ptr<IdentifierIterator> ModulesIter(
8138 GlobalIndex->createIdentifierIterator());
8139 return new ChainedIdentifierIterator(std::move(ReaderIter),
8140 std::move(ModulesIter));
8141 }
8142
8143 return new ASTIdentifierIterator(*this);
8144}
8145
8146namespace clang {
8147namespace serialization {
8148
8149 class ReadMethodPoolVisitor {
8150 ASTReader &Reader;
8151 Selector Sel;
8152 unsigned PriorGeneration;
8153 unsigned InstanceBits = 0;
8154 unsigned FactoryBits = 0;
8155 bool InstanceHasMoreThanOneDecl = false;
8156 bool FactoryHasMoreThanOneDecl = false;
8157 SmallVector<ObjCMethodDecl *, 4> InstanceMethods;
8158 SmallVector<ObjCMethodDecl *, 4> FactoryMethods;
8159
8160 public:
8161 ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel,
8162 unsigned PriorGeneration)
8163 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) {}
8164
8165 bool operator()(ModuleFile &M) {
8166 if (!M.SelectorLookupTable)
8167 return false;
8168
8169 // If we've already searched this module file, skip it now.
8170 if (M.Generation <= PriorGeneration)
8171 return true;
8172
8173 ++Reader.NumMethodPoolTableLookups;
8174 ASTSelectorLookupTable *PoolTable
8175 = (ASTSelectorLookupTable*)M.SelectorLookupTable;
8176 ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel);
8177 if (Pos == PoolTable->end())
8178 return false;
8179
8180 ++Reader.NumMethodPoolTableHits;
8181 ++Reader.NumSelectorsRead;
8182 // FIXME: Not quite happy with the statistics here. We probably should
8183 // disable this tracking when called via LoadSelector.
8184 // Also, should entries without methods count as misses?
8185 ++Reader.NumMethodPoolEntriesRead;
8186 ASTSelectorLookupTrait::data_type Data = *Pos;
8187 if (Reader.DeserializationListener)
8188 Reader.DeserializationListener->SelectorRead(Data.ID, Sel);
8189
8190 InstanceMethods.append(Data.Instance.begin(), Data.Instance.end());
8191 FactoryMethods.append(Data.Factory.begin(), Data.Factory.end());
8192 InstanceBits = Data.InstanceBits;
8193 FactoryBits = Data.FactoryBits;
8194 InstanceHasMoreThanOneDecl = Data.InstanceHasMoreThanOneDecl;
8195 FactoryHasMoreThanOneDecl = Data.FactoryHasMoreThanOneDecl;
8196 return true;
8197 }
8198
8199 /// Retrieve the instance methods found by this visitor.
8200 ArrayRef<ObjCMethodDecl *> getInstanceMethods() const {
8201 return InstanceMethods;
8202 }
8203
8204 /// Retrieve the instance methods found by this visitor.
8205 ArrayRef<ObjCMethodDecl *> getFactoryMethods() const {
8206 return FactoryMethods;
8207 }
8208
8209 unsigned getInstanceBits() const { return InstanceBits; }
8210 unsigned getFactoryBits() const { return FactoryBits; }
8211
8212 bool instanceHasMoreThanOneDecl() const {
8213 return InstanceHasMoreThanOneDecl;
8214 }
8215
8216 bool factoryHasMoreThanOneDecl() const { return FactoryHasMoreThanOneDecl; }
8217 };
8218
8219} // namespace serialization
8220} // namespace clang
8221
8222/// Add the given set of methods to the method list.
8223static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods,
8224 ObjCMethodList &List) {
8225 for (unsigned I = 0, N = Methods.size(); I != N; ++I) {
8226 S.addMethodToGlobalList(&List, Methods[I]);
8227 }
8228}
8229
8230void ASTReader::ReadMethodPool(Selector Sel) {
8231 // Get the selector generation and update it to the current generation.
8232 unsigned &Generation = SelectorGeneration[Sel];
8233 unsigned PriorGeneration = Generation;
8234 Generation = getGeneration();
8235 SelectorOutOfDate[Sel] = false;
8236
8237 // Search for methods defined with this selector.
8238 ++NumMethodPoolLookups;
8239 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration);
8240 ModuleMgr.visit(Visitor);
8241
8242 if (Visitor.getInstanceMethods().empty() &&
8243 Visitor.getFactoryMethods().empty())
8244 return;
8245
8246 ++NumMethodPoolHits;
8247
8248 if (!getSema())
8249 return;
8250
8251 Sema &S = *getSema();
8252 Sema::GlobalMethodPool::iterator Pos
8253 = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first;
8254
8255 Pos->second.first.setBits(Visitor.getInstanceBits());
8256 Pos->second.first.setHasMoreThanOneDecl(Visitor.instanceHasMoreThanOneDecl());
8257 Pos->second.second.setBits(Visitor.getFactoryBits());
8258 Pos->second.second.setHasMoreThanOneDecl(Visitor.factoryHasMoreThanOneDecl());
8259
8260 // Add methods to the global pool *after* setting hasMoreThanOneDecl, since
8261 // when building a module we keep every method individually and may need to
8262 // update hasMoreThanOneDecl as we add the methods.
8263 addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first);
8264 addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second);
8265}
8266
8267void ASTReader::updateOutOfDateSelector(Selector Sel) {
8268 if (SelectorOutOfDate[Sel])
8269 ReadMethodPool(Sel);
8270}
8271
8272void ASTReader::ReadKnownNamespaces(
8273 SmallVectorImpl<NamespaceDecl *> &Namespaces) {
8274 Namespaces.clear();
8275
8276 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
8277 if (NamespaceDecl *Namespace
8278 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I])))
8279 Namespaces.push_back(Namespace);
8280 }
8281}
8282
8283void ASTReader::ReadUndefinedButUsed(
8284 llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) {
8285 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
8286 NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++]));
8287 SourceLocation Loc =
8288 SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]);
8289 Undefined.insert(std::make_pair(D, Loc));
8290 }
8291}
8292
8293void ASTReader::ReadMismatchingDeleteExpressions(llvm::MapVector<
8294 FieldDecl *, llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> &
8295 Exprs) {
8296 for (unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) {
8297 FieldDecl *FD = cast<FieldDecl>(GetDecl(DelayedDeleteExprs[Idx++]));
8298 uint64_t Count = DelayedDeleteExprs[Idx++];
8299 for (uint64_t C = 0; C < Count; ++C) {
8300 SourceLocation DeleteLoc =
8301 SourceLocation::getFromRawEncoding(DelayedDeleteExprs[Idx++]);
8302 const bool IsArrayForm = DelayedDeleteExprs[Idx++];
8303 Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm));
8304 }
8305 }
8306}
8307
8308void ASTReader::ReadTentativeDefinitions(
8309 SmallVectorImpl<VarDecl *> &TentativeDefs) {
8310 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
8311 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I]));
8312 if (Var)
8313 TentativeDefs.push_back(Var);
8314 }
8315 TentativeDefinitions.clear();
8316}
8317
8318void ASTReader::ReadUnusedFileScopedDecls(
8319 SmallVectorImpl<const DeclaratorDecl *> &Decls) {
8320 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
8321 DeclaratorDecl *D
8322 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I]));
8323 if (D)
8324 Decls.push_back(D);
8325 }
8326 UnusedFileScopedDecls.clear();
8327}
8328
8329void ASTReader::ReadDelegatingConstructors(
8330 SmallVectorImpl<CXXConstructorDecl *> &Decls) {
8331 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
8332 CXXConstructorDecl *D
8333 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I]));
8334 if (D)
8335 Decls.push_back(D);
8336 }
8337 DelegatingCtorDecls.clear();
8338}
8339
8340void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) {
8341 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
8342 TypedefNameDecl *D
8343 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I]));
8344 if (D)
8345 Decls.push_back(D);
8346 }
8347 ExtVectorDecls.clear();
8348}
8349
8350void ASTReader::ReadUnusedLocalTypedefNameCandidates(
8351 llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) {
8352 for (unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N;
8353 ++I) {
8354 TypedefNameDecl *D = dyn_cast_or_null<TypedefNameDecl>(
8355 GetDecl(UnusedLocalTypedefNameCandidates[I]));
8356 if (D)
8357 Decls.insert(D);
8358 }
8359 UnusedLocalTypedefNameCandidates.clear();
8360}
8361
8362void ASTReader::ReadDeclsToCheckForDeferredDiags(
8363 llvm::SmallSetVector<Decl *, 4> &Decls) {
8364 for (auto I : DeclsToCheckForDeferredDiags) {
8365 auto *D = dyn_cast_or_null<Decl>(GetDecl(I));
8366 if (D)
8367 Decls.insert(D);
8368 }
8369 DeclsToCheckForDeferredDiags.clear();
8370}
8371
8372void ASTReader::ReadReferencedSelectors(
8373 SmallVectorImpl<std::pair<Selector, SourceLocation>> &Sels) {
8374 if (ReferencedSelectorsData.empty())
8375 return;
8376
8377 // If there are @selector references added them to its pool. This is for
8378 // implementation of -Wselector.
8379 unsigned int DataSize = ReferencedSelectorsData.size()-1;
8380 unsigned I = 0;
8381 while (I < DataSize) {
8382 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]);
8383 SourceLocation SelLoc
8384 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]);
8385 Sels.push_back(std::make_pair(Sel, SelLoc));
8386 }
8387 ReferencedSelectorsData.clear();
8388}
8389
8390void ASTReader::ReadWeakUndeclaredIdentifiers(
8391 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo>> &WeakIDs) {
8392 if (WeakUndeclaredIdentifiers.empty())
8393 return;
8394
8395 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) {
8396 IdentifierInfo *WeakId
8397 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
8398 IdentifierInfo *AliasId
8399 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
8400 SourceLocation Loc
8401 = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]);
8402 bool Used = WeakUndeclaredIdentifiers[I++];
8403 WeakInfo WI(AliasId, Loc);
8404 WI.setUsed(Used);
8405 WeakIDs.push_back(std::make_pair(WeakId, WI));
8406 }
8407 WeakUndeclaredIdentifiers.clear();
8408}
8409
8410void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) {
8411 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) {
8412 ExternalVTableUse VT;
8413 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++]));
8414 VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]);
8415 VT.DefinitionRequired = VTableUses[Idx++];
8416 VTables.push_back(VT);
8417 }
8418
8419 VTableUses.clear();
8420}
8421
8422void ASTReader::ReadPendingInstantiations(
8423 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation>> &Pending) {
8424 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
8425 ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++]));
8426 SourceLocation Loc
8427 = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]);
8428
8429 Pending.push_back(std::make_pair(D, Loc));
8430 }
8431 PendingInstantiations.clear();
8432}
8433
8434void ASTReader::ReadLateParsedTemplates(
8435 llvm::MapVector<const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>
8436 &LPTMap) {
8437 for (auto &LPT : LateParsedTemplates) {
8438 ModuleFile *FMod = LPT.first;
8439 RecordDataImpl &LateParsed = LPT.second;
8440 for (unsigned Idx = 0, N = LateParsed.size(); Idx < N;
8441 /* In loop */) {
8442 FunctionDecl *FD =
8443 cast<FunctionDecl>(GetLocalDecl(*FMod, LateParsed[Idx++]));
8444
8445 auto LT = std::make_unique<LateParsedTemplate>();
8446 LT->D = GetLocalDecl(*FMod, LateParsed[Idx++]);
8447
8448 ModuleFile *F = getOwningModuleFile(LT->D);
8449 assert(F && "No module")((void)0);
8450
8451 unsigned TokN = LateParsed[Idx++];
8452 LT->Toks.reserve(TokN);
8453 for (unsigned T = 0; T < TokN; ++T)
8454 LT->Toks.push_back(ReadToken(*F, LateParsed, Idx));
8455
8456 LPTMap.insert(std::make_pair(FD, std::move(LT)));
8457 }
8458 }
8459
8460 LateParsedTemplates.clear();
8461}
8462
8463void ASTReader::LoadSelector(Selector Sel) {
8464 // It would be complicated to avoid reading the methods anyway. So don't.
8465 ReadMethodPool(Sel);
8466}
8467
8468void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) {
8469 assert(ID && "Non-zero identifier ID required")((void)0);
8470 assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range")((void)0);
8471 IdentifiersLoaded[ID - 1] = II;
8472 if (DeserializationListener)
8473 DeserializationListener->IdentifierRead(ID, II);
8474}
8475
8476/// Set the globally-visible declarations associated with the given
8477/// identifier.
8478///
8479/// If the AST reader is currently in a state where the given declaration IDs
8480/// cannot safely be resolved, they are queued until it is safe to resolve
8481/// them.
8482///
8483/// \param II an IdentifierInfo that refers to one or more globally-visible
8484/// declarations.
8485///
8486/// \param DeclIDs the set of declaration IDs with the name @p II that are
8487/// visible at global scope.
8488///
8489/// \param Decls if non-null, this vector will be populated with the set of
8490/// deserialized declarations. These declarations will not be pushed into
8491/// scope.
8492void
8493ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II,
8494 const SmallVectorImpl<uint32_t> &DeclIDs,
8495 SmallVectorImpl<Decl *> *Decls) {
8496 if (NumCurrentElementsDeserializing && !Decls) {
8497 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
8498 return;
8499 }
8500
8501 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
8502 if (!SemaObj) {
8503 // Queue this declaration so that it will be added to the
8504 // translation unit scope and identifier's declaration chain
8505 // once a Sema object is known.
8506 PreloadedDeclIDs.push_back(DeclIDs[I]);
8507 continue;
8508 }
8509
8510 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I]));
8511
8512 // If we're simply supposed to record the declarations, do so now.
8513 if (Decls) {
8514 Decls->push_back(D);
8515 continue;
8516 }
8517
8518 // Introduce this declaration into the translation-unit scope
8519 // and add it to the declaration chain for this identifier, so
8520 // that (unqualified) name lookup will find it.
8521 pushExternalDeclIntoScope(D, II);
8522 }
8523}
8524
8525IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) {
8526 if (ID == 0)
8527 return nullptr;
8528
8529 if (IdentifiersLoaded.empty()) {
8530 Error("no identifier table in AST file");
8531 return nullptr;
8532 }
8533
8534 ID -= 1;
8535 if (!IdentifiersLoaded[ID]) {
8536 GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1);
8537 assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map")((void)0);
8538 ModuleFile *M = I->second;
8539 unsigned Index = ID - M->BaseIdentifierID;
8540 const unsigned char *Data =
8541 M->IdentifierTableData + M->IdentifierOffsets[Index];
8542
8543 ASTIdentifierLookupTrait Trait(*this, *M);
8544 auto KeyDataLen = Trait.ReadKeyDataLength(Data);
8545 auto Key = Trait.ReadKey(Data, KeyDataLen.first);
8546 auto &II = PP.getIdentifierTable().get(Key);
8547 IdentifiersLoaded[ID] = &II;
8548 markIdentifierFromAST(*this, II);
8549 if (DeserializationListener)
8550 DeserializationListener->IdentifierRead(ID + 1, &II);
8551 }
8552
8553 return IdentifiersLoaded[ID];
8554}
8555
8556IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) {
8557 return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID));
8558}
8559
8560IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) {
8561 if (LocalID < NUM_PREDEF_IDENT_IDS)
8562 return LocalID;
8563
8564 if (!M.ModuleOffsetMap.empty())
8565 ReadModuleOffsetMap(M);
8566
8567 ContinuousRangeMap<uint32_t, int, 2>::iterator I
8568 = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS);
8569 assert(I != M.IdentifierRemap.end()((void)0)
8570 && "Invalid index into identifier index remap")((void)0);
8571
8572 return LocalID + I->second;
8573}
8574
8575MacroInfo *ASTReader::getMacro(MacroID ID) {
8576 if (ID == 0)
8577 return nullptr;
8578
8579 if (MacrosLoaded.empty()) {
8580 Error("no macro table in AST file");
8581 return nullptr;
8582 }
8583
8584 ID -= NUM_PREDEF_MACRO_IDS;
8585 if (!MacrosLoaded[ID]) {
8586 GlobalMacroMapType::iterator I
8587 = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS);
8588 assert(I != GlobalMacroMap.end() && "Corrupted global macro map")((void)0);
8589 ModuleFile *M = I->second;
8590 unsigned Index = ID - M->BaseMacroID;
8591 MacrosLoaded[ID] =
8592 ReadMacroRecord(*M, M->MacroOffsetsBase + M->MacroOffsets[Index]);
8593
8594 if (DeserializationListener)
8595 DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS,
8596 MacrosLoaded[ID]);
8597 }
8598
8599 return MacrosLoaded[ID];
8600}
8601
8602MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) {
8603 if (LocalID < NUM_PREDEF_MACRO_IDS)
8604 return LocalID;
8605
8606 if (!M.ModuleOffsetMap.empty())
8607 ReadModuleOffsetMap(M);
8608
8609 ContinuousRangeMap<uint32_t, int, 2>::iterator I
8610 = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS);
8611 assert(I != M.MacroRemap.end() && "Invalid index into macro index remap")((void)0);
8612
8613 return LocalID + I->second;
8614}
8615
8616serialization::SubmoduleID
8617ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) {
8618 if (LocalID < NUM_PREDEF_SUBMODULE_IDS)
8619 return LocalID;
8620
8621 if (!M.ModuleOffsetMap.empty())
8622 ReadModuleOffsetMap(M);
8623
8624 ContinuousRangeMap<uint32_t, int, 2>::iterator I
8625 = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS);
8626 assert(I != M.SubmoduleRemap.end()((void)0)
8627 && "Invalid index into submodule index remap")((void)0);
8628
8629 return LocalID + I->second;
8630}
8631
8632Module *ASTReader::getSubmodule(SubmoduleID GlobalID) {
8633 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) {
8634 assert(GlobalID == 0 && "Unhandled global submodule ID")((void)0);
8635 return nullptr;
8636 }
8637
8638 if (GlobalID > SubmodulesLoaded.size()) {
8639 Error("submodule ID out of range in AST file");
8640 return nullptr;
8641 }
8642
8643 return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS];
8644}
8645
8646Module *ASTReader::getModule(unsigned ID) {
8647 return getSubmodule(ID);
8648}
8649
8650ModuleFile *ASTReader::getLocalModuleFile(ModuleFile &F, unsigned ID) {
8651 if (ID & 1) {
8652 // It's a module, look it up by submodule ID.
8653 auto I = GlobalSubmoduleMap.find(getGlobalSubmoduleID(F, ID >> 1));
8654 return I == GlobalSubmoduleMap.end() ? nullptr : I->second;
8655 } else {
8656 // It's a prefix (preamble, PCH, ...). Look it up by index.
8657 unsigned IndexFromEnd = ID >> 1;
8658 assert(IndexFromEnd && "got reference to unknown module file")((void)0);
8659 return getModuleManager().pch_modules().end()[-IndexFromEnd];
8660 }
8661}
8662
8663unsigned ASTReader::getModuleFileID(ModuleFile *F) {
8664 if (!F)
8665 return 1;
8666
8667 // For a file representing a module, use the submodule ID of the top-level
8668 // module as the file ID. For any other kind of file, the number of such
8669 // files loaded beforehand will be the same on reload.
8670 // FIXME: Is this true even if we have an explicit module file and a PCH?
8671 if (F->isModule())
8672 return ((F->BaseSubmoduleID + NUM_PREDEF_SUBMODULE_IDS) << 1) | 1;
8673
8674 auto PCHModules = getModuleManager().pch_modules();
8675 auto I = llvm::find(PCHModules, F);
8676 assert(I != PCHModules.end() && "emitting reference to unknown file")((void)0);
8677 return (I - PCHModules.end()) << 1;
8678}
8679
8680llvm::Optional<ASTSourceDescriptor>
8681ASTReader::getSourceDescriptor(unsigned ID) {
8682 if (Module *M = getSubmodule(ID))
8683 return ASTSourceDescriptor(*M);
8684
8685 // If there is only a single PCH, return it instead.
8686 // Chained PCH are not supported.
8687 const auto &PCHChain = ModuleMgr.pch_modules();
8688 if (std::distance(std::begin(PCHChain), std::end(PCHChain))) {
8689 ModuleFile &MF = ModuleMgr.getPrimaryModule();
8690 StringRef ModuleName = llvm::sys::path::filename(MF.OriginalSourceFileName);
8691 StringRef FileName = llvm::sys::path::filename(MF.FileName);
8692 return ASTSourceDescriptor(ModuleName, MF.OriginalDir, FileName,
8693 MF.Signature);
8694 }
8695 return None;
8696}
8697
8698ExternalASTSource::ExtKind ASTReader::hasExternalDefinitions(const Decl *FD) {
8699 auto I = DefinitionSource.find(FD);
8700 if (I == DefinitionSource.end())
8701 return EK_ReplyHazy;
8702 return I->second ? EK_Never : EK_Always;
8703}
8704
8705Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) {
8706 return DecodeSelector(getGlobalSelectorID(M, LocalID));
8707}
8708
8709Selector ASTReader::DecodeSelector(serialization::SelectorID ID) {
8710 if (ID == 0)
8711 return Selector();
8712
8713 if (ID > SelectorsLoaded.size()) {
8714 Error("selector ID out of range in AST file");
8715 return Selector();
8716 }
8717
8718 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) {
8719 // Load this selector from the selector table.
8720 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID);
8721 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map")((void)0);
8722 ModuleFile &M = *I->second;
8723 ASTSelectorLookupTrait Trait(*this, M);
8724 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS;
8725 SelectorsLoaded[ID - 1] =
8726 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0);
8727 if (DeserializationListener)
8728 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
8729 }
8730
8731 return SelectorsLoaded[ID - 1];
8732}
8733
8734Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) {
8735 return DecodeSelector(ID);
8736}
8737
8738uint32_t ASTReader::GetNumExternalSelectors() {
8739 // ID 0 (the null selector) is considered an external selector.
8740 return getTotalNumSelectors() + 1;
8741}
8742
8743serialization::SelectorID
8744ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const {
8745 if (LocalID < NUM_PREDEF_SELECTOR_IDS)
8746 return LocalID;
8747
8748 if (!M.ModuleOffsetMap.empty())
8749 ReadModuleOffsetMap(M);
8750
8751 ContinuousRangeMap<uint32_t, int, 2>::iterator I
8752 = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS);
8753 assert(I != M.SelectorRemap.end()((void)0)
8754 && "Invalid index into selector index remap")((void)0);
8755
8756 return LocalID + I->second;
8757}
8758
8759DeclarationNameLoc
8760ASTRecordReader::readDeclarationNameLoc(DeclarationName Name) {
8761 switch (Name.getNameKind()) {
8762 case DeclarationName::CXXConstructorName:
8763 case DeclarationName::CXXDestructorName:
8764 case DeclarationName::CXXConversionFunctionName:
8765 return DeclarationNameLoc::makeNamedTypeLoc(readTypeSourceInfo());
8766
8767 case DeclarationName::CXXOperatorName:
8768 return DeclarationNameLoc::makeCXXOperatorNameLoc(readSourceRange());
8769
8770 case DeclarationName::CXXLiteralOperatorName:
8771 return DeclarationNameLoc::makeCXXLiteralOperatorNameLoc(
8772 readSourceLocation());
8773
8774 case DeclarationName::Identifier:
8775 case DeclarationName::ObjCZeroArgSelector:
8776 case DeclarationName::ObjCOneArgSelector:
8777 case DeclarationName::ObjCMultiArgSelector:
8778 case DeclarationName::CXXUsingDirective:
8779 case DeclarationName::CXXDeductionGuideName:
8780 break;
8781 }
8782 return DeclarationNameLoc();
8783}
8784
8785DeclarationNameInfo ASTRecordReader::readDeclarationNameInfo() {
8786 DeclarationNameInfo NameInfo;
8787 NameInfo.setName(readDeclarationName());
8788 NameInfo.setLoc(readSourceLocation());
8789 NameInfo.setInfo(readDeclarationNameLoc(NameInfo.getName()));
8790 return NameInfo;
8791}
8792
8793void ASTRecordReader::readQualifierInfo(QualifierInfo &Info) {
8794 Info.QualifierLoc = readNestedNameSpecifierLoc();
8795 unsigned NumTPLists = readInt();
8796 Info.NumTemplParamLists = NumTPLists;
8797 if (NumTPLists) {
8798 Info.TemplParamLists =
8799 new (getContext()) TemplateParameterList *[NumTPLists];
8800 for (unsigned i = 0; i != NumTPLists; ++i)
8801 Info.TemplParamLists[i] = readTemplateParameterList();
8802 }
8803}
8804
8805TemplateParameterList *
8806ASTRecordReader::readTemplateParameterList() {
8807 SourceLocation TemplateLoc = readSourceLocation();
8808 SourceLocation LAngleLoc = readSourceLocation();
8809 SourceLocation RAngleLoc = readSourceLocation();
8810
8811 unsigned NumParams = readInt();
8812 SmallVector<NamedDecl *, 16> Params;
8813 Params.reserve(NumParams);
8814 while (NumParams--)
8815 Params.push_back(readDeclAs<NamedDecl>());
8816
8817 bool HasRequiresClause = readBool();
8818 Expr *RequiresClause = HasRequiresClause ? readExpr() : nullptr;
8819
8820 TemplateParameterList *TemplateParams = TemplateParameterList::Create(
8821 getContext(), TemplateLoc, LAngleLoc, Params, RAngleLoc, RequiresClause);
8822 return TemplateParams;
8823}
8824
8825void ASTRecordReader::readTemplateArgumentList(
8826 SmallVectorImpl<TemplateArgument> &TemplArgs,
8827 bool Canonicalize) {
8828 unsigned NumTemplateArgs = readInt();
8829 TemplArgs.reserve(NumTemplateArgs);
8830 while (NumTemplateArgs--)
8831 TemplArgs.push_back(readTemplateArgument(Canonicalize));
8832}
8833
8834/// Read a UnresolvedSet structure.
8835void ASTRecordReader::readUnresolvedSet(LazyASTUnresolvedSet &Set) {
8836 unsigned NumDecls = readInt();
8837 Set.reserve(getContext(), NumDecls);
8838 while (NumDecls--) {
8839 DeclID ID = readDeclID();
8840 AccessSpecifier AS = (AccessSpecifier) readInt();
8841 Set.addLazyDecl(getContext(), ID, AS);
8842 }
8843}
8844
8845CXXBaseSpecifier
8846ASTRecordReader::readCXXBaseSpecifier() {
8847 bool isVirtual = readBool();
8848 bool isBaseOfClass = readBool();
8849 AccessSpecifier AS = static_cast<AccessSpecifier>(readInt());
8850 bool inheritConstructors = readBool();
8851 TypeSourceInfo *TInfo = readTypeSourceInfo();
8852 SourceRange Range = readSourceRange();
8853 SourceLocation EllipsisLoc = readSourceLocation();
8854 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo,
8855 EllipsisLoc);
8856 Result.setInheritConstructors(inheritConstructors);
8857 return Result;
8858}
8859
8860CXXCtorInitializer **
8861ASTRecordReader::readCXXCtorInitializers() {
8862 ASTContext &Context = getContext();
8863 unsigned NumInitializers = readInt();
8864 assert(NumInitializers && "wrote ctor initializers but have no inits")((void)0);
8865 auto **CtorInitializers = new (Context) CXXCtorInitializer*[NumInitializers];
8866 for (unsigned i = 0; i != NumInitializers; ++i) {
8867 TypeSourceInfo *TInfo = nullptr;
8868 bool IsBaseVirtual = false;
8869 FieldDecl *Member = nullptr;
8870 IndirectFieldDecl *IndirectMember = nullptr;
8871
8872 CtorInitializerType Type = (CtorInitializerType) readInt();
8873 switch (Type) {
8874 case CTOR_INITIALIZER_BASE:
8875 TInfo = readTypeSourceInfo();
8876 IsBaseVirtual = readBool();
8877 break;
8878
8879 case CTOR_INITIALIZER_DELEGATING:
8880 TInfo = readTypeSourceInfo();
8881 break;
8882
8883 case CTOR_INITIALIZER_MEMBER:
8884 Member = readDeclAs<FieldDecl>();
8885 break;
8886
8887 case CTOR_INITIALIZER_INDIRECT_MEMBER:
8888 IndirectMember = readDeclAs<IndirectFieldDecl>();
8889 break;
8890 }
8891
8892 SourceLocation MemberOrEllipsisLoc = readSourceLocation();
8893 Expr *Init = readExpr();
8894 SourceLocation LParenLoc = readSourceLocation();
8895 SourceLocation RParenLoc = readSourceLocation();
8896
8897 CXXCtorInitializer *BOMInit;
8898 if (Type == CTOR_INITIALIZER_BASE)
8899 BOMInit = new (Context)
8900 CXXCtorInitializer(Context, TInfo, IsBaseVirtual, LParenLoc, Init,
8901 RParenLoc, MemberOrEllipsisLoc);
8902 else if (Type == CTOR_INITIALIZER_DELEGATING)
8903 BOMInit = new (Context)
8904 CXXCtorInitializer(Context, TInfo, LParenLoc, Init, RParenLoc);
8905 else if (Member)
8906 BOMInit = new (Context)
8907 CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc, LParenLoc,
8908 Init, RParenLoc);
8909 else
8910 BOMInit = new (Context)
8911 CXXCtorInitializer(Context, IndirectMember, MemberOrEllipsisLoc,
8912 LParenLoc, Init, RParenLoc);
8913
8914 if (/*IsWritten*/readBool()) {
8915 unsigned SourceOrder = readInt();
8916 BOMInit->setSourceOrder(SourceOrder);
8917 }
8918
8919 CtorInitializers[i] = BOMInit;
8920 }
8921
8922 return CtorInitializers;
8923}
8924
8925NestedNameSpecifierLoc
8926ASTRecordReader::readNestedNameSpecifierLoc() {
8927 ASTContext &Context = getContext();
8928 unsigned N = readInt();
8929 NestedNameSpecifierLocBuilder Builder;
8930 for (unsigned I = 0; I != N; ++I) {
8931 auto Kind = readNestedNameSpecifierKind();
8932 switch (Kind) {
8933 case NestedNameSpecifier::Identifier: {
8934 IdentifierInfo *II = readIdentifier();
8935 SourceRange Range = readSourceRange();
8936 Builder.Extend(Context, II, Range.getBegin(), Range.getEnd());
8937 break;
8938 }
8939
8940 case NestedNameSpecifier::Namespace: {
8941 NamespaceDecl *NS = readDeclAs<NamespaceDecl>();
8942 SourceRange Range = readSourceRange();
8943 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
8944 break;
8945 }
8946
8947 case NestedNameSpecifier::NamespaceAlias: {
8948 NamespaceAliasDecl *Alias = readDeclAs<NamespaceAliasDecl>();
8949 SourceRange Range = readSourceRange();
8950 Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd());
8951 break;
8952 }
8953
8954 case NestedNameSpecifier::TypeSpec:
8955 case NestedNameSpecifier::TypeSpecWithTemplate: {
8956 bool Template = readBool();
8957 TypeSourceInfo *T = readTypeSourceInfo();
8958 if (!T)
8959 return NestedNameSpecifierLoc();
8960 SourceLocation ColonColonLoc = readSourceLocation();
8961
8962 // FIXME: 'template' keyword location not saved anywhere, so we fake it.
8963 Builder.Extend(Context,
8964 Template? T->getTypeLoc().getBeginLoc() : SourceLocation(),
8965 T->getTypeLoc(), ColonColonLoc);
8966 break;
8967 }
8968
8969 case NestedNameSpecifier::Global: {
8970 SourceLocation ColonColonLoc = readSourceLocation();
8971 Builder.MakeGlobal(Context, ColonColonLoc);
8972 break;
8973 }
8974
8975 case NestedNameSpecifier::Super: {
8976 CXXRecordDecl *RD = readDeclAs<CXXRecordDecl>();
8977 SourceRange Range = readSourceRange();
8978 Builder.MakeSuper(Context, RD, Range.getBegin(), Range.getEnd());
8979 break;
8980 }
8981 }
8982 }
8983
8984 return Builder.getWithLocInContext(Context);
8985}
8986
8987SourceRange
8988ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record,
8989 unsigned &Idx) {
8990 SourceLocation beg = ReadSourceLocation(F, Record, Idx);
8991 SourceLocation end = ReadSourceLocation(F, Record, Idx);
8992 return SourceRange(beg, end);
8993}
8994
8995/// Read a floating-point value
8996llvm::APFloat ASTRecordReader::readAPFloat(const llvm::fltSemantics &Sem) {
8997 return llvm::APFloat(Sem, readAPInt());
8998}
8999
9000// Read a string
9001std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) {
9002 unsigned Len = Record[Idx++];
9003 std::string Result(Record.data() + Idx, Record.data() + Idx + Len);
9004 Idx += Len;
9005 return Result;
9006}
9007
9008std::string ASTReader::ReadPath(ModuleFile &F, const RecordData &Record,
9009 unsigned &Idx) {
9010 std::string Filename = ReadString(Record, Idx);
9011 ResolveImportedPath(F, Filename);
9012 return Filename;
9013}
9014
9015std::string ASTReader::ReadPath(StringRef BaseDirectory,
9016 const RecordData &Record, unsigned &Idx) {
9017 std::string Filename = ReadString(Record, Idx);
9018 if (!BaseDirectory.empty())
9019 ResolveImportedPath(Filename, BaseDirectory);
9020 return Filename;
9021}
9022
9023VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record,
9024 unsigned &Idx) {
9025 unsigned Major = Record[Idx++];
9026 unsigned Minor = Record[Idx++];
9027 unsigned Subminor = Record[Idx++];
9028 if (Minor == 0)
9029 return VersionTuple(Major);
9030 if (Subminor == 0)
9031 return VersionTuple(Major, Minor - 1);
9032 return VersionTuple(Major, Minor - 1, Subminor - 1);
9033}
9034
9035CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F,
9036 const RecordData &Record,
9037 unsigned &Idx) {
9038 CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx);
9039 return CXXTemporary::Create(getContext(), Decl);
9040}
9041
9042DiagnosticBuilder ASTReader::Diag(unsigned DiagID) const {
9043 return Diag(CurrentImportLoc, DiagID);
9044}
9045
9046DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) const {
9047 return Diags.Report(Loc, DiagID);
9048}
9049
9050/// Retrieve the identifier table associated with the
9051/// preprocessor.
9052IdentifierTable &ASTReader::getIdentifierTable() {
9053 return PP.getIdentifierTable();
9054}
9055
9056/// Record that the given ID maps to the given switch-case
9057/// statement.
9058void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) {
9059 assert((*CurrSwitchCaseStmts)[ID] == nullptr &&((void)0)
9060 "Already have a SwitchCase with this ID")((void)0);
9061 (*CurrSwitchCaseStmts)[ID] = SC;
9062}
9063
9064/// Retrieve the switch-case statement with the given ID.
9065SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) {
9066 assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID")((void)0);
9067 return (*CurrSwitchCaseStmts)[ID];
9068}
9069
9070void ASTReader::ClearSwitchCaseIDs() {
9071 CurrSwitchCaseStmts->clear();
9072}
9073
9074void ASTReader::ReadComments() {
9075 ASTContext &Context = getContext();
9076 std::vector<RawComment *> Comments;
9077 for (SmallVectorImpl<std::pair<BitstreamCursor,
9078 serialization::ModuleFile *>>::iterator
9079 I = CommentsCursors.begin(),
9080 E = CommentsCursors.end();
9081 I != E; ++I) {
9082 Comments.clear();
9083 BitstreamCursor &Cursor = I->first;
9084 serialization::ModuleFile &F = *I->second;
9085 SavedStreamPosition SavedPosition(Cursor);
9086
9087 RecordData Record;
9088 while (true) {
9089 Expected<llvm::BitstreamEntry> MaybeEntry =
9090 Cursor.advanceSkippingSubblocks(
9091 BitstreamCursor::AF_DontPopBlockAtEnd);
9092 if (!MaybeEntry) {
9093 Error(MaybeEntry.takeError());
9094 return;
9095 }
9096 llvm::BitstreamEntry Entry = MaybeEntry.get();
9097
9098 switch (Entry.Kind) {
9099 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
9100 case llvm::BitstreamEntry::Error:
9101 Error("malformed block record in AST file");
9102 return;
9103 case llvm::BitstreamEntry::EndBlock:
9104 goto NextCursor;
9105 case llvm::BitstreamEntry::Record:
9106 // The interesting case.
9107 break;
9108 }
9109
9110 // Read a record.
9111 Record.clear();
9112 Expected<unsigned> MaybeComment = Cursor.readRecord(Entry.ID, Record);
9113 if (!MaybeComment) {
9114 Error(MaybeComment.takeError());
9115 return;
9116 }
9117 switch ((CommentRecordTypes)MaybeComment.get()) {
9118 case COMMENTS_RAW_COMMENT: {
9119 unsigned Idx = 0;
9120 SourceRange SR = ReadSourceRange(F, Record, Idx);
9121 RawComment::CommentKind Kind =
9122 (RawComment::CommentKind) Record[Idx++];
9123 bool IsTrailingComment = Record[Idx++];
9124 bool IsAlmostTrailingComment = Record[Idx++];
9125 Comments.push_back(new (Context) RawComment(
9126 SR, Kind, IsTrailingComment, IsAlmostTrailingComment));
9127 break;
9128 }
9129 }
9130 }
9131 NextCursor:
9132 llvm::DenseMap<FileID, std::map<unsigned, RawComment *>>
9133 FileToOffsetToComment;
9134 for (RawComment *C : Comments) {
9135 SourceLocation CommentLoc = C->getBeginLoc();
9136 if (CommentLoc.isValid()) {
9137 std::pair<FileID, unsigned> Loc =
9138 SourceMgr.getDecomposedLoc(CommentLoc);
9139 if (Loc.first.isValid())
9140 Context.Comments.OrderedComments[Loc.first].emplace(Loc.second, C);
9141 }
9142 }
9143 }
9144}
9145
9146void ASTReader::visitInputFiles(serialization::ModuleFile &MF,
9147 bool IncludeSystem, bool Complain,
9148 llvm::function_ref<void(const serialization::InputFile &IF,
9149 bool isSystem)> Visitor) {
9150 unsigned NumUserInputs = MF.NumUserInputFiles;
9151 unsigned NumInputs = MF.InputFilesLoaded.size();
9152 assert(NumUserInputs <= NumInputs)((void)0);
9153 unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
9154 for (unsigned I = 0; I < N; ++I) {
9155 bool IsSystem = I >= NumUserInputs;
9156 InputFile IF = getInputFile(MF, I+1, Complain);
9157 Visitor(IF, IsSystem);
9158 }
9159}
9160
9161void ASTReader::visitTopLevelModuleMaps(
9162 serialization::ModuleFile &MF,
9163 llvm::function_ref<void(const FileEntry *FE)> Visitor) {
9164 unsigned NumInputs = MF.InputFilesLoaded.size();
9165 for (unsigned I = 0; I < NumInputs; ++I) {
9166 InputFileInfo IFI = readInputFileInfo(MF, I + 1);
9167 if (IFI.TopLevelModuleMap)
9168 // FIXME: This unnecessarily re-reads the InputFileInfo.
9169 if (auto FE = getInputFile(MF, I + 1).getFile())
9170 Visitor(FE);
9171 }
9172}
9173
9174std::string ASTReader::getOwningModuleNameForDiagnostic(const Decl *D) {
9175 // If we know the owning module, use it.
9176 if (Module *M = D->getImportedOwningModule())
9177 return M->getFullModuleName();
9178
9179 // Otherwise, use the name of the top-level module the decl is within.
9180 if (ModuleFile *M = getOwningModuleFile(D))
9181 return M->ModuleName;
9182
9183 // Not from a module.
9184 return {};
9185}
9186
9187void ASTReader::finishPendingActions() {
9188 while (!PendingIdentifierInfos.empty() || !PendingFunctionTypes.empty() ||
9189 !PendingIncompleteDeclChains.empty() || !PendingDeclChains.empty() ||
9190 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() ||
9191 !PendingUpdateRecords.empty()) {
9192 // If any identifiers with corresponding top-level declarations have
9193 // been loaded, load those declarations now.
9194 using TopLevelDeclsMap =
9195 llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2>>;
9196 TopLevelDeclsMap TopLevelDecls;
9197
9198 while (!PendingIdentifierInfos.empty()) {
9199 IdentifierInfo *II = PendingIdentifierInfos.back().first;
9200 SmallVector<uint32_t, 4> DeclIDs =
9201 std::move(PendingIdentifierInfos.back().second);
9202 PendingIdentifierInfos.pop_back();
9203
9204 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]);
9205 }
9206
9207 // Load each function type that we deferred loading because it was a
9208 // deduced type that might refer to a local type declared within itself.
9209 for (unsigned I = 0; I != PendingFunctionTypes.size(); ++I) {
9210 auto *FD = PendingFunctionTypes[I].first;
9211 FD->setType(GetType(PendingFunctionTypes[I].second));
9212
9213 // If we gave a function a deduced return type, remember that we need to
9214 // propagate that along the redeclaration chain.
9215 auto *DT = FD->getReturnType()->getContainedDeducedType();
9216 if (DT && DT->isDeduced())
9217 PendingDeducedTypeUpdates.insert(
9218 {FD->getCanonicalDecl(), FD->getReturnType()});
9219 }
9220 PendingFunctionTypes.clear();
9221
9222 // For each decl chain that we wanted to complete while deserializing, mark
9223 // it as "still needs to be completed".
9224 for (unsigned I = 0; I != PendingIncompleteDeclChains.size(); ++I) {
9225 markIncompleteDeclChain(PendingIncompleteDeclChains[I]);
9226 }
9227 PendingIncompleteDeclChains.clear();
9228
9229 // Load pending declaration chains.
9230 for (unsigned I = 0; I != PendingDeclChains.size(); ++I)
9231 loadPendingDeclChain(PendingDeclChains[I].first,
9232 PendingDeclChains[I].second);
9233 PendingDeclChains.clear();
9234
9235 // Make the most recent of the top-level declarations visible.
9236 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
9237 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
9238 IdentifierInfo *II = TLD->first;
9239 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
9240 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II);
9241 }
9242 }
9243
9244 // Load any pending macro definitions.
9245 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
9246 IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
9247 SmallVector<PendingMacroInfo, 2> GlobalIDs;
9248 GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
9249 // Initialize the macro history from chained-PCHs ahead of module imports.
9250 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
9251 ++IDIdx) {
9252 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
9253 if (!Info.M->isModule())
9254 resolvePendingMacro(II, Info);
9255 }
9256 // Handle module imports.
9257 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
9258 ++IDIdx) {
9259 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
9260 if (Info.M->isModule())
9261 resolvePendingMacro(II, Info);
9262 }
9263 }
9264 PendingMacroIDs.clear();
9265
9266 // Wire up the DeclContexts for Decls that we delayed setting until
9267 // recursive loading is completed.
9268 while (!PendingDeclContextInfos.empty()) {
9269 PendingDeclContextInfo Info = PendingDeclContextInfos.front();
9270 PendingDeclContextInfos.pop_front();
9271 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC));
9272 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC));
9273 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext());
9274 }
9275
9276 // Perform any pending declaration updates.
9277 while (!PendingUpdateRecords.empty()) {
9278 auto Update = PendingUpdateRecords.pop_back_val();
9279 ReadingKindTracker ReadingKind(Read_Decl, *this);
9280 loadDeclUpdateRecords(Update);
9281 }
9282 }
9283
9284 // At this point, all update records for loaded decls are in place, so any
9285 // fake class definitions should have become real.
9286 assert(PendingFakeDefinitionData.empty() &&((void)0)
9287 "faked up a class definition but never saw the real one")((void)0);
9288
9289 // If we deserialized any C++ or Objective-C class definitions, any
9290 // Objective-C protocol definitions, or any redeclarable templates, make sure
9291 // that all redeclarations point to the definitions. Note that this can only
9292 // happen now, after the redeclaration chains have been fully wired.
9293 for (Decl *D : PendingDefinitions) {
9294 if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
9295 if (const TagType *TagT = dyn_cast<TagType>(TD->getTypeForDecl())) {
9296 // Make sure that the TagType points at the definition.
9297 const_cast<TagType*>(TagT)->decl = TD;
9298 }
9299
9300 if (auto RD = dyn_cast<CXXRecordDecl>(D)) {
9301 for (auto *R = getMostRecentExistingDecl(RD); R;
9302 R = R->getPreviousDecl()) {
9303 assert((R == D) ==((void)0)
9304 cast<CXXRecordDecl>(R)->isThisDeclarationADefinition() &&((void)0)
9305 "declaration thinks it's the definition but it isn't")((void)0);
9306 cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData;
9307 }
9308 }
9309
9310 continue;
9311 }
9312
9313 if (auto ID = dyn_cast<ObjCInterfaceDecl>(D)) {
9314 // Make sure that the ObjCInterfaceType points at the definition.
9315 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl))
9316 ->Decl = ID;
9317
9318 for (auto *R = getMostRecentExistingDecl(ID); R; R = R->getPreviousDecl())
9319 cast<ObjCInterfaceDecl>(R)->Data = ID->Data;
9320
9321 continue;
9322 }
9323
9324 if (auto PD = dyn_cast<ObjCProtocolDecl>(D)) {
9325 for (auto *R = getMostRecentExistingDecl(PD); R; R = R->getPreviousDecl())
9326 cast<ObjCProtocolDecl>(R)->Data = PD->Data;
9327
9328 continue;
9329 }
9330
9331 auto RTD = cast<RedeclarableTemplateDecl>(D)->getCanonicalDecl();
9332 for (auto *R = getMostRecentExistingDecl(RTD); R; R = R->getPreviousDecl())
9333 cast<RedeclarableTemplateDecl>(R)->Common = RTD->Common;
9334 }
9335 PendingDefinitions.clear();
9336
9337 // Load the bodies of any functions or methods we've encountered. We do
9338 // this now (delayed) so that we can be sure that the declaration chains
9339 // have been fully wired up (hasBody relies on this).
9340 // FIXME: We shouldn't require complete redeclaration chains here.
9341 for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
9342 PBEnd = PendingBodies.end();
9343 PB != PBEnd; ++PB) {
9344 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
9345 // For a function defined inline within a class template, force the
9346 // canonical definition to be the one inside the canonical definition of
9347 // the template. This ensures that we instantiate from a correct view
9348 // of the template.
9349 //
9350 // Sadly we can't do this more generally: we can't be sure that all
9351 // copies of an arbitrary class definition will have the same members
9352 // defined (eg, some member functions may not be instantiated, and some
9353 // special members may or may not have been implicitly defined).
9354 if (auto *RD = dyn_cast<CXXRecordDecl>(FD->getLexicalParent()))
9355 if (RD->isDependentContext() && !RD->isThisDeclarationADefinition())
9356 continue;
9357
9358 // FIXME: Check for =delete/=default?
9359 // FIXME: Complain about ODR violations here?
9360 const FunctionDecl *Defn = nullptr;
9361 if (!getContext().getLangOpts().Modules || !FD->hasBody(Defn)) {
9362 FD->setLazyBody(PB->second);
9363 } else {
9364 auto *NonConstDefn = const_cast<FunctionDecl*>(Defn);
9365 mergeDefinitionVisibility(NonConstDefn, FD);
9366
9367 if (!FD->isLateTemplateParsed() &&
9368 !NonConstDefn->isLateTemplateParsed() &&
9369 FD->getODRHash() != NonConstDefn->getODRHash()) {
9370 if (!isa<CXXMethodDecl>(FD)) {
9371 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
9372 } else if (FD->getLexicalParent()->isFileContext() &&
9373 NonConstDefn->getLexicalParent()->isFileContext()) {
9374 // Only diagnose out-of-line method definitions. If they are
9375 // in class definitions, then an error will be generated when
9376 // processing the class bodies.
9377 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
9378 }
9379 }
9380 }
9381 continue;
9382 }
9383
9384 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first);
9385 if (!getContext().getLangOpts().Modules || !MD->hasBody())
9386 MD->setLazyBody(PB->second);
9387 }
9388 PendingBodies.clear();
9389
9390 // Do some cleanup.
9391 for (auto *ND : PendingMergedDefinitionsToDeduplicate)
9392 getContext().deduplicateMergedDefinitonsFor(ND);
9393 PendingMergedDefinitionsToDeduplicate.clear();
9394}
9395
9396void ASTReader::diagnoseOdrViolations() {
9397 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty() &&
9398 PendingFunctionOdrMergeFailures.empty() &&
9399 PendingEnumOdrMergeFailures.empty())
9400 return;
9401
9402 // Trigger the import of the full definition of each class that had any
9403 // odr-merging problems, so we can produce better diagnostics for them.
9404 // These updates may in turn find and diagnose some ODR failures, so take
9405 // ownership of the set first.
9406 auto OdrMergeFailures = std::move(PendingOdrMergeFailures);
9407 PendingOdrMergeFailures.clear();
9408 for (auto &Merge : OdrMergeFailures) {
9409 Merge.first->buildLookup();
9410 Merge.first->decls_begin();
9411 Merge.first->bases_begin();
9412 Merge.first->vbases_begin();
9413 for (auto &RecordPair : Merge.second) {
9414 auto *RD = RecordPair.first;
9415 RD->decls_begin();
9416 RD->bases_begin();
9417 RD->vbases_begin();
9418 }
9419 }
9420
9421 // Trigger the import of functions.
9422 auto FunctionOdrMergeFailures = std::move(PendingFunctionOdrMergeFailures);
9423 PendingFunctionOdrMergeFailures.clear();
9424 for (auto &Merge : FunctionOdrMergeFailures) {
9425 Merge.first->buildLookup();
9426 Merge.first->decls_begin();
9427 Merge.first->getBody();
9428 for (auto &FD : Merge.second) {
9429 FD->buildLookup();
9430 FD->decls_begin();
9431 FD->getBody();
9432 }
9433 }
9434
9435 // Trigger the import of enums.
9436 auto EnumOdrMergeFailures = std::move(PendingEnumOdrMergeFailures);
9437 PendingEnumOdrMergeFailures.clear();
9438 for (auto &Merge : EnumOdrMergeFailures) {
9439 Merge.first->decls_begin();
9440 for (auto &Enum : Merge.second) {
9441 Enum->decls_begin();
9442 }
9443 }
9444
9445 // For each declaration from a merged context, check that the canonical
9446 // definition of that context also contains a declaration of the same
9447 // entity.
9448 //
9449 // Caution: this loop does things that might invalidate iterators into
9450 // PendingOdrMergeChecks. Don't turn this into a range-based for loop!
9451 while (!PendingOdrMergeChecks.empty()) {
9452 NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
9453
9454 // FIXME: Skip over implicit declarations for now. This matters for things
9455 // like implicitly-declared special member functions. This isn't entirely
9456 // correct; we can end up with multiple unmerged declarations of the same
9457 // implicit entity.
9458 if (D->isImplicit())
9459 continue;
9460
9461 DeclContext *CanonDef = D->getDeclContext();
9462
9463 bool Found = false;
9464 const Decl *DCanon = D->getCanonicalDecl();
9465
9466 for (auto RI : D->redecls()) {
9467 if (RI->getLexicalDeclContext() == CanonDef) {
9468 Found = true;
9469 break;
9470 }
9471 }
9472 if (Found)
9473 continue;
9474
9475 // Quick check failed, time to do the slow thing. Note, we can't just
9476 // look up the name of D in CanonDef here, because the member that is
9477 // in CanonDef might not be found by name lookup (it might have been
9478 // replaced by a more recent declaration in the lookup table), and we
9479 // can't necessarily find it in the redeclaration chain because it might
9480 // be merely mergeable, not redeclarable.
9481 llvm::SmallVector<const NamedDecl*, 4> Candidates;
9482 for (auto *CanonMember : CanonDef->decls()) {
9483 if (CanonMember->getCanonicalDecl() == DCanon) {
9484 // This can happen if the declaration is merely mergeable and not
9485 // actually redeclarable (we looked for redeclarations earlier).
9486 //
9487 // FIXME: We should be able to detect this more efficiently, without
9488 // pulling in all of the members of CanonDef.
9489 Found = true;
9490 break;
9491 }
9492 if (auto *ND = dyn_cast<NamedDecl>(CanonMember))
9493 if (ND->getDeclName() == D->getDeclName())
9494 Candidates.push_back(ND);
9495 }
9496
9497 if (!Found) {
9498 // The AST doesn't like TagDecls becoming invalid after they've been
9499 // completed. We only really need to mark FieldDecls as invalid here.
9500 if (!isa<TagDecl>(D))
9501 D->setInvalidDecl();
9502
9503 // Ensure we don't accidentally recursively enter deserialization while
9504 // we're producing our diagnostic.
9505 Deserializing RecursionGuard(this);
9506
9507 std::string CanonDefModule =
9508 getOwningModuleNameForDiagnostic(cast<Decl>(CanonDef));
9509 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl)
9510 << D << getOwningModuleNameForDiagnostic(D)
9511 << CanonDef << CanonDefModule.empty() << CanonDefModule;
9512
9513 if (Candidates.empty())
9514 Diag(cast<Decl>(CanonDef)->getLocation(),
9515 diag::note_module_odr_violation_no_possible_decls) << D;
9516 else {
9517 for (unsigned I = 0, N = Candidates.size(); I != N; ++I)
9518 Diag(Candidates[I]->getLocation(),
9519 diag::note_module_odr_violation_possible_decl)
9520 << Candidates[I];
9521 }
9522
9523 DiagnosedOdrMergeFailures.insert(CanonDef);
9524 }
9525 }
9526
9527 if (OdrMergeFailures.empty() && FunctionOdrMergeFailures.empty() &&
9528 EnumOdrMergeFailures.empty())
9529 return;
9530
9531 // Ensure we don't accidentally recursively enter deserialization while
9532 // we're producing our diagnostics.
9533 Deserializing RecursionGuard(this);
9534
9535 // Common code for hashing helpers.
9536 ODRHash Hash;
9537 auto ComputeQualTypeODRHash = [&Hash](QualType Ty) {
9538 Hash.clear();
9539 Hash.AddQualType(Ty);
9540 return Hash.CalculateHash();
9541 };
9542
9543 auto ComputeODRHash = [&Hash](const Stmt *S) {
9544 assert(S)((void)0);
9545 Hash.clear();
9546 Hash.AddStmt(S);
9547 return Hash.CalculateHash();
9548 };
9549
9550 auto ComputeSubDeclODRHash = [&Hash](const Decl *D) {
9551 assert(D)((void)0);
9552 Hash.clear();
9553 Hash.AddSubDecl(D);
9554 return Hash.CalculateHash();
9555 };
9556
9557 auto ComputeTemplateArgumentODRHash = [&Hash](const TemplateArgument &TA) {
9558 Hash.clear();
9559 Hash.AddTemplateArgument(TA);
9560 return Hash.CalculateHash();
9561 };
9562
9563 auto ComputeTemplateParameterListODRHash =
9564 [&Hash](const TemplateParameterList *TPL) {
9565 assert(TPL)((void)0);
9566 Hash.clear();
9567 Hash.AddTemplateParameterList(TPL);
9568 return Hash.CalculateHash();
9569 };
9570
9571 // Used with err_module_odr_violation_mismatch_decl and
9572 // note_module_odr_violation_mismatch_decl
9573 // This list should be the same Decl's as in ODRHash::isDeclToBeProcessed
9574 enum ODRMismatchDecl {
9575 EndOfClass,
9576 PublicSpecifer,
9577 PrivateSpecifer,
9578 ProtectedSpecifer,
9579 StaticAssert,
9580 Field,
9581 CXXMethod,
9582 TypeAlias,
9583 TypeDef,
9584 Var,
9585 Friend,
9586 FunctionTemplate,
9587 Other
9588 };
9589
9590 // Used with err_module_odr_violation_mismatch_decl_diff and
9591 // note_module_odr_violation_mismatch_decl_diff
9592 enum ODRMismatchDeclDifference {
9593 StaticAssertCondition,
9594 StaticAssertMessage,
9595 StaticAssertOnlyMessage,
9596 FieldName,
9597 FieldTypeName,
9598 FieldSingleBitField,
9599 FieldDifferentWidthBitField,
9600 FieldSingleMutable,
9601 FieldSingleInitializer,
9602 FieldDifferentInitializers,
9603 MethodName,
9604 MethodDeleted,
9605 MethodDefaulted,
9606 MethodVirtual,
9607 MethodStatic,
9608 MethodVolatile,
9609 MethodConst,
9610 MethodInline,
9611 MethodNumberParameters,
9612 MethodParameterType,
9613 MethodParameterName,
9614 MethodParameterSingleDefaultArgument,
9615 MethodParameterDifferentDefaultArgument,
9616 MethodNoTemplateArguments,
9617 MethodDifferentNumberTemplateArguments,
9618 MethodDifferentTemplateArgument,
9619 MethodSingleBody,
9620 MethodDifferentBody,
9621 TypedefName,
9622 TypedefType,
9623 VarName,
9624 VarType,
9625 VarSingleInitializer,
9626 VarDifferentInitializer,
9627 VarConstexpr,
9628 FriendTypeFunction,
9629 FriendType,
9630 FriendFunction,
9631 FunctionTemplateDifferentNumberParameters,
9632 FunctionTemplateParameterDifferentKind,
9633 FunctionTemplateParameterName,
9634 FunctionTemplateParameterSingleDefaultArgument,
9635 FunctionTemplateParameterDifferentDefaultArgument,
9636 FunctionTemplateParameterDifferentType,
9637 FunctionTemplatePackParameter,
9638 };
9639
9640 // These lambdas have the common portions of the ODR diagnostics. This
9641 // has the same return as Diag(), so addition parameters can be passed
9642 // in with operator<<
9643 auto ODRDiagDeclError = [this](NamedDecl *FirstRecord, StringRef FirstModule,
9644 SourceLocation Loc, SourceRange Range,
9645 ODRMismatchDeclDifference DiffType) {
9646 return Diag(Loc, diag::err_module_odr_violation_mismatch_decl_diff)
9647 << FirstRecord << FirstModule.empty() << FirstModule << Range
9648 << DiffType;
9649 };
9650 auto ODRDiagDeclNote = [this](StringRef SecondModule, SourceLocation Loc,
9651 SourceRange Range, ODRMismatchDeclDifference DiffType) {
9652 return Diag(Loc, diag::note_module_odr_violation_mismatch_decl_diff)
9653 << SecondModule << Range << DiffType;
9654 };
9655
9656 auto ODRDiagField = [this, &ODRDiagDeclError, &ODRDiagDeclNote,
9657 &ComputeQualTypeODRHash, &ComputeODRHash](
9658 NamedDecl *FirstRecord, StringRef FirstModule,
9659 StringRef SecondModule, FieldDecl *FirstField,
9660 FieldDecl *SecondField) {
9661 IdentifierInfo *FirstII = FirstField->getIdentifier();
9662 IdentifierInfo *SecondII = SecondField->getIdentifier();
9663 if (FirstII->getName() != SecondII->getName()) {
9664 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(),
9665 FirstField->getSourceRange(), FieldName)
9666 << FirstII;
9667 ODRDiagDeclNote(SecondModule, SecondField->getLocation(),
9668 SecondField->getSourceRange(), FieldName)
9669 << SecondII;
9670
9671 return true;
9672 }
9673
9674 assert(getContext().hasSameType(FirstField->getType(),((void)0)
9675 SecondField->getType()))((void)0);
9676
9677 QualType FirstType = FirstField->getType();
9678 QualType SecondType = SecondField->getType();
9679 if (ComputeQualTypeODRHash(FirstType) !=
9680 ComputeQualTypeODRHash(SecondType)) {
9681 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(),
9682 FirstField->getSourceRange(), FieldTypeName)
9683 << FirstII << FirstType;
9684 ODRDiagDeclNote(SecondModule, SecondField->getLocation(),
9685 SecondField->getSourceRange(), FieldTypeName)
9686 << SecondII << SecondType;
9687
9688 return true;
9689 }
9690
9691 const bool IsFirstBitField = FirstField->isBitField();
9692 const bool IsSecondBitField = SecondField->isBitField();
9693 if (IsFirstBitField != IsSecondBitField) {
9694 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(),
9695 FirstField->getSourceRange(), FieldSingleBitField)
9696 << FirstII << IsFirstBitField;
9697 ODRDiagDeclNote(SecondModule, SecondField->getLocation(),
9698 SecondField->getSourceRange(), FieldSingleBitField)
9699 << SecondII << IsSecondBitField;
9700 return true;
9701 }
9702
9703 if (IsFirstBitField && IsSecondBitField) {
9704 unsigned FirstBitWidthHash =
9705 ComputeODRHash(FirstField->getBitWidth());
9706 unsigned SecondBitWidthHash =
9707 ComputeODRHash(SecondField->getBitWidth());
9708 if (FirstBitWidthHash != SecondBitWidthHash) {
9709 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(),
9710 FirstField->getSourceRange(),
9711 FieldDifferentWidthBitField)
9712 << FirstII << FirstField->getBitWidth()->getSourceRange();
9713 ODRDiagDeclNote(SecondModule, SecondField->getLocation(),
9714 SecondField->getSourceRange(),
9715 FieldDifferentWidthBitField)
9716 << SecondII << SecondField->getBitWidth()->getSourceRange();
9717 return true;
9718 }
9719 }
9720
9721 if (!PP.getLangOpts().CPlusPlus)
9722 return false;
9723
9724 const bool IsFirstMutable = FirstField->isMutable();
9725 const bool IsSecondMutable = SecondField->isMutable();
9726 if (IsFirstMutable != IsSecondMutable) {
9727 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(),
9728 FirstField->getSourceRange(), FieldSingleMutable)
9729 << FirstII << IsFirstMutable;
9730 ODRDiagDeclNote(SecondModule, SecondField->getLocation(),
9731 SecondField->getSourceRange(), FieldSingleMutable)
9732 << SecondII << IsSecondMutable;
9733 return true;
9734 }
9735
9736 const Expr *FirstInitializer = FirstField->getInClassInitializer();
9737 const Expr *SecondInitializer = SecondField->getInClassInitializer();
9738 if ((!FirstInitializer && SecondInitializer) ||
9739 (FirstInitializer && !SecondInitializer)) {
9740 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(),
9741 FirstField->getSourceRange(), FieldSingleInitializer)
9742 << FirstII << (FirstInitializer != nullptr);
9743 ODRDiagDeclNote(SecondModule, SecondField->getLocation(),
9744 SecondField->getSourceRange(), FieldSingleInitializer)
9745 << SecondII << (SecondInitializer != nullptr);
9746 return true;
9747 }
9748
9749 if (FirstInitializer && SecondInitializer) {
9750 unsigned FirstInitHash = ComputeODRHash(FirstInitializer);
9751 unsigned SecondInitHash = ComputeODRHash(SecondInitializer);
9752 if (FirstInitHash != SecondInitHash) {
9753 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(),
9754 FirstField->getSourceRange(),
9755 FieldDifferentInitializers)
9756 << FirstII << FirstInitializer->getSourceRange();
9757 ODRDiagDeclNote(SecondModule, SecondField->getLocation(),
9758 SecondField->getSourceRange(),
9759 FieldDifferentInitializers)
9760 << SecondII << SecondInitializer->getSourceRange();
9761 return true;
9762 }
9763 }
9764
9765 return false;
9766 };
9767
9768 auto ODRDiagTypeDefOrAlias =
9769 [&ODRDiagDeclError, &ODRDiagDeclNote, &ComputeQualTypeODRHash](
9770 NamedDecl *FirstRecord, StringRef FirstModule, StringRef SecondModule,
9771 TypedefNameDecl *FirstTD, TypedefNameDecl *SecondTD,
9772 bool IsTypeAlias) {
9773 auto FirstName = FirstTD->getDeclName();
9774 auto SecondName = SecondTD->getDeclName();
9775 if (FirstName != SecondName) {
9776 ODRDiagDeclError(FirstRecord, FirstModule, FirstTD->getLocation(),
9777 FirstTD->getSourceRange(), TypedefName)
9778 << IsTypeAlias << FirstName;
9779 ODRDiagDeclNote(SecondModule, SecondTD->getLocation(),
9780 SecondTD->getSourceRange(), TypedefName)
9781 << IsTypeAlias << SecondName;
9782 return true;
9783 }
9784
9785 QualType FirstType = FirstTD->getUnderlyingType();
9786 QualType SecondType = SecondTD->getUnderlyingType();
9787 if (ComputeQualTypeODRHash(FirstType) !=
9788 ComputeQualTypeODRHash(SecondType)) {
9789 ODRDiagDeclError(FirstRecord, FirstModule, FirstTD->getLocation(),
9790 FirstTD->getSourceRange(), TypedefType)
9791 << IsTypeAlias << FirstName << FirstType;
9792 ODRDiagDeclNote(SecondModule, SecondTD->getLocation(),
9793 SecondTD->getSourceRange(), TypedefType)
9794 << IsTypeAlias << SecondName << SecondType;
9795 return true;
9796 }
9797
9798 return false;
9799 };
9800
9801 auto ODRDiagVar = [&ODRDiagDeclError, &ODRDiagDeclNote,
9802 &ComputeQualTypeODRHash, &ComputeODRHash,
9803 this](NamedDecl *FirstRecord, StringRef FirstModule,
9804 StringRef SecondModule, VarDecl *FirstVD,
9805 VarDecl *SecondVD) {
9806 auto FirstName = FirstVD->getDeclName();
9807 auto SecondName = SecondVD->getDeclName();
9808 if (FirstName != SecondName) {
9809 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(),
9810 FirstVD->getSourceRange(), VarName)
9811 << FirstName;
9812 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(),
9813 SecondVD->getSourceRange(), VarName)
9814 << SecondName;
9815 return true;
9816 }
9817
9818 QualType FirstType = FirstVD->getType();
9819 QualType SecondType = SecondVD->getType();
9820 if (ComputeQualTypeODRHash(FirstType) !=
9821 ComputeQualTypeODRHash(SecondType)) {
9822 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(),
9823 FirstVD->getSourceRange(), VarType)
9824 << FirstName << FirstType;
9825 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(),
9826 SecondVD->getSourceRange(), VarType)
9827 << SecondName << SecondType;
9828 return true;
9829 }
9830
9831 if (!PP.getLangOpts().CPlusPlus)
9832 return false;
9833
9834 const Expr *FirstInit = FirstVD->getInit();
9835 const Expr *SecondInit = SecondVD->getInit();
9836 if ((FirstInit == nullptr) != (SecondInit == nullptr)) {
9837 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(),
9838 FirstVD->getSourceRange(), VarSingleInitializer)
9839 << FirstName << (FirstInit == nullptr)
9840 << (FirstInit ? FirstInit->getSourceRange() : SourceRange());
9841 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(),
9842 SecondVD->getSourceRange(), VarSingleInitializer)
9843 << SecondName << (SecondInit == nullptr)
9844 << (SecondInit ? SecondInit->getSourceRange() : SourceRange());
9845 return true;
9846 }
9847
9848 if (FirstInit && SecondInit &&
9849 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) {
9850 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(),
9851 FirstVD->getSourceRange(), VarDifferentInitializer)
9852 << FirstName << FirstInit->getSourceRange();
9853 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(),
9854 SecondVD->getSourceRange(), VarDifferentInitializer)
9855 << SecondName << SecondInit->getSourceRange();
9856 return true;
9857 }
9858
9859 const bool FirstIsConstexpr = FirstVD->isConstexpr();
9860 const bool SecondIsConstexpr = SecondVD->isConstexpr();
9861 if (FirstIsConstexpr != SecondIsConstexpr) {
9862 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(),
9863 FirstVD->getSourceRange(), VarConstexpr)
9864 << FirstName << FirstIsConstexpr;
9865 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(),
9866 SecondVD->getSourceRange(), VarConstexpr)
9867 << SecondName << SecondIsConstexpr;
9868 return true;
9869 }
9870 return false;
9871 };
9872
9873 auto DifferenceSelector = [](Decl *D) {
9874 assert(D && "valid Decl required")((void)0);
9875 switch (D->getKind()) {
9876 default:
9877 return Other;
9878 case Decl::AccessSpec:
9879 switch (D->getAccess()) {
9880 case AS_public:
9881 return PublicSpecifer;
9882 case AS_private:
9883 return PrivateSpecifer;
9884 case AS_protected:
9885 return ProtectedSpecifer;
9886 case AS_none:
9887 break;
9888 }
9889 llvm_unreachable("Invalid access specifier")__builtin_unreachable();
9890 case Decl::StaticAssert:
9891 return StaticAssert;
9892 case Decl::Field:
9893 return Field;
9894 case Decl::CXXMethod:
9895 case Decl::CXXConstructor:
9896 case Decl::CXXDestructor:
9897 return CXXMethod;
9898 case Decl::TypeAlias:
9899 return TypeAlias;
9900 case Decl::Typedef:
9901 return TypeDef;
9902 case Decl::Var:
9903 return Var;
9904 case Decl::Friend:
9905 return Friend;
9906 case Decl::FunctionTemplate:
9907 return FunctionTemplate;
9908 }
9909 };
9910
9911 using DeclHashes = llvm::SmallVector<std::pair<Decl *, unsigned>, 4>;
9912 auto PopulateHashes = [&ComputeSubDeclODRHash](DeclHashes &Hashes,
9913 RecordDecl *Record,
9914 const DeclContext *DC) {
9915 for (auto *D : Record->decls()) {
9916 if (!ODRHash::isDeclToBeProcessed(D, DC))
9917 continue;
9918 Hashes.emplace_back(D, ComputeSubDeclODRHash(D));
9919 }
9920 };
9921
9922 struct DiffResult {
9923 Decl *FirstDecl = nullptr, *SecondDecl = nullptr;
9924 ODRMismatchDecl FirstDiffType = Other, SecondDiffType = Other;
9925 };
9926
9927 // If there is a diagnoseable difference, FirstDiffType and
9928 // SecondDiffType will not be Other and FirstDecl and SecondDecl will be
9929 // filled in if not EndOfClass.
9930 auto FindTypeDiffs = [&DifferenceSelector](DeclHashes &FirstHashes,
9931 DeclHashes &SecondHashes) {
9932 DiffResult DR;
9933 auto FirstIt = FirstHashes.begin();
9934 auto SecondIt = SecondHashes.begin();
9935 while (FirstIt != FirstHashes.end() || SecondIt != SecondHashes.end()) {
9936 if (FirstIt != FirstHashes.end() && SecondIt != SecondHashes.end() &&
9937 FirstIt->second == SecondIt->second) {
9938 ++FirstIt;
9939 ++SecondIt;
9940 continue;
9941 }
9942
9943 DR.FirstDecl = FirstIt == FirstHashes.end() ? nullptr : FirstIt->first;
9944 DR.SecondDecl =
9945 SecondIt == SecondHashes.end() ? nullptr : SecondIt->first;
9946
9947 DR.FirstDiffType =
9948 DR.FirstDecl ? DifferenceSelector(DR.FirstDecl) : EndOfClass;
9949 DR.SecondDiffType =
9950 DR.SecondDecl ? DifferenceSelector(DR.SecondDecl) : EndOfClass;
9951 return DR;
9952 }
9953 return DR;
9954 };
9955
9956 // Use this to diagnose that an unexpected Decl was encountered
9957 // or no difference was detected. This causes a generic error
9958 // message to be emitted.
9959 auto DiagnoseODRUnexpected = [this](DiffResult &DR, NamedDecl *FirstRecord,
9960 StringRef FirstModule,
9961 NamedDecl *SecondRecord,
9962 StringRef SecondModule) {
9963 Diag(FirstRecord->getLocation(),
9964 diag::err_module_odr_violation_different_definitions)
9965 << FirstRecord << FirstModule.empty() << FirstModule;
9966
9967 if (DR.FirstDecl) {
9968 Diag(DR.FirstDecl->getLocation(), diag::note_first_module_difference)
9969 << FirstRecord << DR.FirstDecl->getSourceRange();
9970 }
9971
9972 Diag(SecondRecord->getLocation(),
9973 diag::note_module_odr_violation_different_definitions)
9974 << SecondModule;
9975
9976 if (DR.SecondDecl) {
9977 Diag(DR.SecondDecl->getLocation(), diag::note_second_module_difference)
9978 << DR.SecondDecl->getSourceRange();
9979 }
9980 };
9981
9982 auto DiagnoseODRMismatch =
9983 [this](DiffResult &DR, NamedDecl *FirstRecord, StringRef FirstModule,
9984 NamedDecl *SecondRecord, StringRef SecondModule) {
9985 SourceLocation FirstLoc;
9986 SourceRange FirstRange;
9987 auto *FirstTag = dyn_cast<TagDecl>(FirstRecord);
9988 if (DR.FirstDiffType == EndOfClass && FirstTag) {
9989 FirstLoc = FirstTag->getBraceRange().getEnd();
9990 } else {
9991 FirstLoc = DR.FirstDecl->getLocation();
9992 FirstRange = DR.FirstDecl->getSourceRange();
9993 }
9994 Diag(FirstLoc, diag::err_module_odr_violation_mismatch_decl)
9995 << FirstRecord << FirstModule.empty() << FirstModule << FirstRange
9996 << DR.FirstDiffType;
9997
9998 SourceLocation SecondLoc;
9999 SourceRange SecondRange;
10000 auto *SecondTag = dyn_cast<TagDecl>(SecondRecord);
10001 if (DR.SecondDiffType == EndOfClass && SecondTag) {
10002 SecondLoc = SecondTag->getBraceRange().getEnd();
10003 } else {
10004 SecondLoc = DR.SecondDecl->getLocation();
10005 SecondRange = DR.SecondDecl->getSourceRange();
10006 }
10007 Diag(SecondLoc, diag::note_module_odr_violation_mismatch_decl)
10008 << SecondModule << SecondRange << DR.SecondDiffType;
10009 };
10010
10011 // Issue any pending ODR-failure diagnostics.
10012 for (auto &Merge : OdrMergeFailures) {
10013 // If we've already pointed out a specific problem with this class, don't
10014 // bother issuing a general "something's different" diagnostic.
10015 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
10016 continue;
10017
10018 bool Diagnosed = false;
10019 CXXRecordDecl *FirstRecord = Merge.first;
10020 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstRecord);
10021 for (auto &RecordPair : Merge.second) {
10022 CXXRecordDecl *SecondRecord = RecordPair.first;
10023 // Multiple different declarations got merged together; tell the user
10024 // where they came from.
10025 if (FirstRecord == SecondRecord)
10026 continue;
10027
10028 std::string SecondModule = getOwningModuleNameForDiagnostic(SecondRecord);
10029
10030 auto *FirstDD = FirstRecord->DefinitionData;
10031 auto *SecondDD = RecordPair.second;
10032
10033 assert(FirstDD && SecondDD && "Definitions without DefinitionData")((void)0);
10034
10035 // Diagnostics from DefinitionData are emitted here.
10036 if (FirstDD != SecondDD) {
10037 enum ODRDefinitionDataDifference {
10038 NumBases,
10039 NumVBases,
10040 BaseType,
10041 BaseVirtual,
10042 BaseAccess,
10043 };
10044 auto ODRDiagBaseError = [FirstRecord, &FirstModule,
10045 this](SourceLocation Loc, SourceRange Range,
10046 ODRDefinitionDataDifference DiffType) {
10047 return Diag(Loc, diag::err_module_odr_violation_definition_data)
10048 << FirstRecord << FirstModule.empty() << FirstModule << Range
10049 << DiffType;
10050 };
10051 auto ODRDiagBaseNote = [&SecondModule,
10052 this](SourceLocation Loc, SourceRange Range,
10053 ODRDefinitionDataDifference DiffType) {
10054 return Diag(Loc, diag::note_module_odr_violation_definition_data)
10055 << SecondModule << Range << DiffType;
10056 };
10057
10058 unsigned FirstNumBases = FirstDD->NumBases;
10059 unsigned FirstNumVBases = FirstDD->NumVBases;
10060 unsigned SecondNumBases = SecondDD->NumBases;
10061 unsigned SecondNumVBases = SecondDD->NumVBases;
10062
10063 auto GetSourceRange = [](struct CXXRecordDecl::DefinitionData *DD) {
10064 unsigned NumBases = DD->NumBases;
10065 if (NumBases == 0) return SourceRange();
10066 auto bases = DD->bases();
10067 return SourceRange(bases[0].getBeginLoc(),
10068 bases[NumBases - 1].getEndLoc());
10069 };
10070
10071 if (FirstNumBases != SecondNumBases) {
10072 ODRDiagBaseError(FirstRecord->getLocation(), GetSourceRange(FirstDD),
10073 NumBases)
10074 << FirstNumBases;
10075 ODRDiagBaseNote(SecondRecord->getLocation(), GetSourceRange(SecondDD),
10076 NumBases)
10077 << SecondNumBases;
10078 Diagnosed = true;
10079 break;
10080 }
10081
10082 if (FirstNumVBases != SecondNumVBases) {
10083 ODRDiagBaseError(FirstRecord->getLocation(), GetSourceRange(FirstDD),
10084 NumVBases)
10085 << FirstNumVBases;
10086 ODRDiagBaseNote(SecondRecord->getLocation(), GetSourceRange(SecondDD),
10087 NumVBases)
10088 << SecondNumVBases;
10089 Diagnosed = true;
10090 break;
10091 }
10092
10093 auto FirstBases = FirstDD->bases();
10094 auto SecondBases = SecondDD->bases();
10095 unsigned i = 0;
10096 for (i = 0; i < FirstNumBases; ++i) {
10097 auto FirstBase = FirstBases[i];
10098 auto SecondBase = SecondBases[i];
10099 if (ComputeQualTypeODRHash(FirstBase.getType()) !=
10100 ComputeQualTypeODRHash(SecondBase.getType())) {
10101 ODRDiagBaseError(FirstRecord->getLocation(),
10102 FirstBase.getSourceRange(), BaseType)
10103 << (i + 1) << FirstBase.getType();
10104 ODRDiagBaseNote(SecondRecord->getLocation(),
10105 SecondBase.getSourceRange(), BaseType)
10106 << (i + 1) << SecondBase.getType();
10107 break;
10108 }
10109
10110 if (FirstBase.isVirtual() != SecondBase.isVirtual()) {
10111 ODRDiagBaseError(FirstRecord->getLocation(),
10112 FirstBase.getSourceRange(), BaseVirtual)
10113 << (i + 1) << FirstBase.isVirtual() << FirstBase.getType();
10114 ODRDiagBaseNote(SecondRecord->getLocation(),
10115 SecondBase.getSourceRange(), BaseVirtual)
10116 << (i + 1) << SecondBase.isVirtual() << SecondBase.getType();
10117 break;
10118 }
10119
10120 if (FirstBase.getAccessSpecifierAsWritten() !=
10121 SecondBase.getAccessSpecifierAsWritten()) {
10122 ODRDiagBaseError(FirstRecord->getLocation(),
10123 FirstBase.getSourceRange(), BaseAccess)
10124 << (i + 1) << FirstBase.getType()
10125 << (int)FirstBase.getAccessSpecifierAsWritten();
10126 ODRDiagBaseNote(SecondRecord->getLocation(),
10127 SecondBase.getSourceRange(), BaseAccess)
10128 << (i + 1) << SecondBase.getType()
10129 << (int)SecondBase.getAccessSpecifierAsWritten();
10130 break;
10131 }
10132 }
10133
10134 if (i != FirstNumBases) {
10135 Diagnosed = true;
10136 break;
10137 }
10138 }
10139
10140 const ClassTemplateDecl *FirstTemplate =
10141 FirstRecord->getDescribedClassTemplate();
10142 const ClassTemplateDecl *SecondTemplate =
10143 SecondRecord->getDescribedClassTemplate();
10144
10145 assert(!FirstTemplate == !SecondTemplate &&((void)0)
10146 "Both pointers should be null or non-null")((void)0);
10147
10148 enum ODRTemplateDifference {
10149 ParamEmptyName,
10150 ParamName,
10151 ParamSingleDefaultArgument,
10152 ParamDifferentDefaultArgument,
10153 };
10154
10155 if (FirstTemplate && SecondTemplate) {
10156 DeclHashes FirstTemplateHashes;
10157 DeclHashes SecondTemplateHashes;
10158
10159 auto PopulateTemplateParameterHashs =
10160 [&ComputeSubDeclODRHash](DeclHashes &Hashes,
10161 const ClassTemplateDecl *TD) {
10162 for (auto *D : TD->getTemplateParameters()->asArray()) {
10163 Hashes.emplace_back(D, ComputeSubDeclODRHash(D));
10164 }
10165 };
10166
10167 PopulateTemplateParameterHashs(FirstTemplateHashes, FirstTemplate);
10168 PopulateTemplateParameterHashs(SecondTemplateHashes, SecondTemplate);
10169
10170 assert(FirstTemplateHashes.size() == SecondTemplateHashes.size() &&((void)0)
10171 "Number of template parameters should be equal.")((void)0);
10172
10173 auto FirstIt = FirstTemplateHashes.begin();
10174 auto FirstEnd = FirstTemplateHashes.end();
10175 auto SecondIt = SecondTemplateHashes.begin();
10176 for (; FirstIt != FirstEnd; ++FirstIt, ++SecondIt) {
10177 if (FirstIt->second == SecondIt->second)
10178 continue;
10179
10180 auto ODRDiagTemplateError = [FirstRecord, &FirstModule, this](
10181 SourceLocation Loc, SourceRange Range,
10182 ODRTemplateDifference DiffType) {
10183 return Diag(Loc, diag::err_module_odr_violation_template_parameter)
10184 << FirstRecord << FirstModule.empty() << FirstModule << Range
10185 << DiffType;
10186 };
10187 auto ODRDiagTemplateNote = [&SecondModule, this](
10188 SourceLocation Loc, SourceRange Range,
10189 ODRTemplateDifference DiffType) {
10190 return Diag(Loc, diag::note_module_odr_violation_template_parameter)
10191 << SecondModule << Range << DiffType;
10192 };
10193
10194 const NamedDecl* FirstDecl = cast<NamedDecl>(FirstIt->first);
10195 const NamedDecl* SecondDecl = cast<NamedDecl>(SecondIt->first);
10196
10197 assert(FirstDecl->getKind() == SecondDecl->getKind() &&((void)0)
10198 "Parameter Decl's should be the same kind.")((void)0);
10199
10200 DeclarationName FirstName = FirstDecl->getDeclName();
10201 DeclarationName SecondName = SecondDecl->getDeclName();
10202
10203 if (FirstName != SecondName) {
10204 const bool FirstNameEmpty =
10205 FirstName.isIdentifier() && !FirstName.getAsIdentifierInfo();
10206 const bool SecondNameEmpty =
10207 SecondName.isIdentifier() && !SecondName.getAsIdentifierInfo();
10208 assert((!FirstNameEmpty || !SecondNameEmpty) &&((void)0)
10209 "Both template parameters cannot be unnamed.")((void)0);
10210 ODRDiagTemplateError(FirstDecl->getLocation(),
10211 FirstDecl->getSourceRange(),
10212 FirstNameEmpty ? ParamEmptyName : ParamName)
10213 << FirstName;
10214 ODRDiagTemplateNote(SecondDecl->getLocation(),
10215 SecondDecl->getSourceRange(),
10216 SecondNameEmpty ? ParamEmptyName : ParamName)
10217 << SecondName;
10218 break;
10219 }
10220
10221 switch (FirstDecl->getKind()) {
10222 default:
10223 llvm_unreachable("Invalid template parameter type.")__builtin_unreachable();
10224 case Decl::TemplateTypeParm: {
10225 const auto *FirstParam = cast<TemplateTypeParmDecl>(FirstDecl);
10226 const auto *SecondParam = cast<TemplateTypeParmDecl>(SecondDecl);
10227 const bool HasFirstDefaultArgument =
10228 FirstParam->hasDefaultArgument() &&
10229 !FirstParam->defaultArgumentWasInherited();
10230 const bool HasSecondDefaultArgument =
10231 SecondParam->hasDefaultArgument() &&
10232 !SecondParam->defaultArgumentWasInherited();
10233
10234 if (HasFirstDefaultArgument != HasSecondDefaultArgument) {
10235 ODRDiagTemplateError(FirstDecl->getLocation(),
10236 FirstDecl->getSourceRange(),
10237 ParamSingleDefaultArgument)
10238 << HasFirstDefaultArgument;
10239 ODRDiagTemplateNote(SecondDecl->getLocation(),
10240 SecondDecl->getSourceRange(),
10241 ParamSingleDefaultArgument)
10242 << HasSecondDefaultArgument;
10243 break;
10244 }
10245
10246 assert(HasFirstDefaultArgument && HasSecondDefaultArgument &&((void)0)
10247 "Expecting default arguments.")((void)0);
10248
10249 ODRDiagTemplateError(FirstDecl->getLocation(),
10250 FirstDecl->getSourceRange(),
10251 ParamDifferentDefaultArgument);
10252 ODRDiagTemplateNote(SecondDecl->getLocation(),
10253 SecondDecl->getSourceRange(),
10254 ParamDifferentDefaultArgument);
10255
10256 break;
10257 }
10258 case Decl::NonTypeTemplateParm: {
10259 const auto *FirstParam = cast<NonTypeTemplateParmDecl>(FirstDecl);
10260 const auto *SecondParam = cast<NonTypeTemplateParmDecl>(SecondDecl);
10261 const bool HasFirstDefaultArgument =
10262 FirstParam->hasDefaultArgument() &&
10263 !FirstParam->defaultArgumentWasInherited();
10264 const bool HasSecondDefaultArgument =
10265 SecondParam->hasDefaultArgument() &&
10266 !SecondParam->defaultArgumentWasInherited();
10267
10268 if (HasFirstDefaultArgument != HasSecondDefaultArgument) {
10269 ODRDiagTemplateError(FirstDecl->getLocation(),
10270 FirstDecl->getSourceRange(),
10271 ParamSingleDefaultArgument)
10272 << HasFirstDefaultArgument;
10273 ODRDiagTemplateNote(SecondDecl->getLocation(),
10274 SecondDecl->getSourceRange(),
10275 ParamSingleDefaultArgument)
10276 << HasSecondDefaultArgument;
10277 break;
10278 }
10279
10280 assert(HasFirstDefaultArgument && HasSecondDefaultArgument &&((void)0)
10281 "Expecting default arguments.")((void)0);
10282
10283 ODRDiagTemplateError(FirstDecl->getLocation(),
10284 FirstDecl->getSourceRange(),
10285 ParamDifferentDefaultArgument);
10286 ODRDiagTemplateNote(SecondDecl->getLocation(),
10287 SecondDecl->getSourceRange(),
10288 ParamDifferentDefaultArgument);
10289
10290 break;
10291 }
10292 case Decl::TemplateTemplateParm: {
10293 const auto *FirstParam = cast<TemplateTemplateParmDecl>(FirstDecl);
10294 const auto *SecondParam =
10295 cast<TemplateTemplateParmDecl>(SecondDecl);
10296 const bool HasFirstDefaultArgument =
10297 FirstParam->hasDefaultArgument() &&
10298 !FirstParam->defaultArgumentWasInherited();
10299 const bool HasSecondDefaultArgument =
10300 SecondParam->hasDefaultArgument() &&
10301 !SecondParam->defaultArgumentWasInherited();
10302
10303 if (HasFirstDefaultArgument != HasSecondDefaultArgument) {
10304 ODRDiagTemplateError(FirstDecl->getLocation(),
10305 FirstDecl->getSourceRange(),
10306 ParamSingleDefaultArgument)
10307 << HasFirstDefaultArgument;
10308 ODRDiagTemplateNote(SecondDecl->getLocation(),
10309 SecondDecl->getSourceRange(),
10310 ParamSingleDefaultArgument)
10311 << HasSecondDefaultArgument;
10312 break;
10313 }
10314
10315 assert(HasFirstDefaultArgument && HasSecondDefaultArgument &&((void)0)
10316 "Expecting default arguments.")((void)0);
10317
10318 ODRDiagTemplateError(FirstDecl->getLocation(),
10319 FirstDecl->getSourceRange(),
10320 ParamDifferentDefaultArgument);
10321 ODRDiagTemplateNote(SecondDecl->getLocation(),
10322 SecondDecl->getSourceRange(),
10323 ParamDifferentDefaultArgument);
10324
10325 break;
10326 }
10327 }
10328
10329 break;
10330 }
10331
10332 if (FirstIt != FirstEnd) {
10333 Diagnosed = true;
10334 break;
10335 }
10336 }
10337
10338 DeclHashes FirstHashes;
10339 DeclHashes SecondHashes;
10340 const DeclContext *DC = FirstRecord;
10341 PopulateHashes(FirstHashes, FirstRecord, DC);
10342 PopulateHashes(SecondHashes, SecondRecord, DC);
10343
10344 auto DR = FindTypeDiffs(FirstHashes, SecondHashes);
10345 ODRMismatchDecl FirstDiffType = DR.FirstDiffType;
10346 ODRMismatchDecl SecondDiffType = DR.SecondDiffType;
10347 Decl *FirstDecl = DR.FirstDecl;
10348 Decl *SecondDecl = DR.SecondDecl;
10349
10350 if (FirstDiffType == Other || SecondDiffType == Other) {
10351 DiagnoseODRUnexpected(DR, FirstRecord, FirstModule, SecondRecord,
10352 SecondModule);
10353 Diagnosed = true;
10354 break;
10355 }
10356
10357 if (FirstDiffType != SecondDiffType) {
10358 DiagnoseODRMismatch(DR, FirstRecord, FirstModule, SecondRecord,
10359 SecondModule);
10360 Diagnosed = true;
10361 break;
10362 }
10363
10364 assert(FirstDiffType == SecondDiffType)((void)0);
10365
10366 switch (FirstDiffType) {
10367 case Other:
10368 case EndOfClass:
10369 case PublicSpecifer:
10370 case PrivateSpecifer:
10371 case ProtectedSpecifer:
10372 llvm_unreachable("Invalid diff type")__builtin_unreachable();
10373
10374 case StaticAssert: {
10375 StaticAssertDecl *FirstSA = cast<StaticAssertDecl>(FirstDecl);
10376 StaticAssertDecl *SecondSA = cast<StaticAssertDecl>(SecondDecl);
10377
10378 Expr *FirstExpr = FirstSA->getAssertExpr();
10379 Expr *SecondExpr = SecondSA->getAssertExpr();
10380 unsigned FirstODRHash = ComputeODRHash(FirstExpr);
10381 unsigned SecondODRHash = ComputeODRHash(SecondExpr);
10382 if (FirstODRHash != SecondODRHash) {
10383 ODRDiagDeclError(FirstRecord, FirstModule, FirstExpr->getBeginLoc(),
10384 FirstExpr->getSourceRange(), StaticAssertCondition);
10385 ODRDiagDeclNote(SecondModule, SecondExpr->getBeginLoc(),
10386 SecondExpr->getSourceRange(), StaticAssertCondition);
10387 Diagnosed = true;
10388 break;
10389 }
10390
10391 StringLiteral *FirstStr = FirstSA->getMessage();
10392 StringLiteral *SecondStr = SecondSA->getMessage();
10393 assert((FirstStr || SecondStr) && "Both messages cannot be empty")((void)0);
10394 if ((FirstStr && !SecondStr) || (!FirstStr && SecondStr)) {
10395 SourceLocation FirstLoc, SecondLoc;
10396 SourceRange FirstRange, SecondRange;
10397 if (FirstStr) {
10398 FirstLoc = FirstStr->getBeginLoc();
10399 FirstRange = FirstStr->getSourceRange();
10400 } else {
10401 FirstLoc = FirstSA->getBeginLoc();
10402 FirstRange = FirstSA->getSourceRange();
10403 }
10404 if (SecondStr) {
10405 SecondLoc = SecondStr->getBeginLoc();
10406 SecondRange = SecondStr->getSourceRange();
10407 } else {
10408 SecondLoc = SecondSA->getBeginLoc();
10409 SecondRange = SecondSA->getSourceRange();
10410 }
10411 ODRDiagDeclError(FirstRecord, FirstModule, FirstLoc, FirstRange,
10412 StaticAssertOnlyMessage)
10413 << (FirstStr == nullptr);
10414 ODRDiagDeclNote(SecondModule, SecondLoc, SecondRange,
10415 StaticAssertOnlyMessage)
10416 << (SecondStr == nullptr);
10417 Diagnosed = true;
10418 break;
10419 }
10420
10421 if (FirstStr && SecondStr &&
10422 FirstStr->getString() != SecondStr->getString()) {
10423 ODRDiagDeclError(FirstRecord, FirstModule, FirstStr->getBeginLoc(),
10424 FirstStr->getSourceRange(), StaticAssertMessage);
10425 ODRDiagDeclNote(SecondModule, SecondStr->getBeginLoc(),
10426 SecondStr->getSourceRange(), StaticAssertMessage);
10427 Diagnosed = true;
10428 break;
10429 }
10430 break;
10431 }
10432 case Field: {
10433 Diagnosed = ODRDiagField(FirstRecord, FirstModule, SecondModule,
10434 cast<FieldDecl>(FirstDecl),
10435 cast<FieldDecl>(SecondDecl));
10436 break;
10437 }
10438 case CXXMethod: {
10439 enum {
10440 DiagMethod,
10441 DiagConstructor,
10442 DiagDestructor,
10443 } FirstMethodType,
10444 SecondMethodType;
10445 auto GetMethodTypeForDiagnostics = [](const CXXMethodDecl* D) {
10446 if (isa<CXXConstructorDecl>(D)) return DiagConstructor;
10447 if (isa<CXXDestructorDecl>(D)) return DiagDestructor;
10448 return DiagMethod;
10449 };
10450 const CXXMethodDecl *FirstMethod = cast<CXXMethodDecl>(FirstDecl);
10451 const CXXMethodDecl *SecondMethod = cast<CXXMethodDecl>(SecondDecl);
10452 FirstMethodType = GetMethodTypeForDiagnostics(FirstMethod);
10453 SecondMethodType = GetMethodTypeForDiagnostics(SecondMethod);
10454 auto FirstName = FirstMethod->getDeclName();
10455 auto SecondName = SecondMethod->getDeclName();
10456 if (FirstMethodType != SecondMethodType || FirstName != SecondName) {
10457 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(),
10458 FirstMethod->getSourceRange(), MethodName)
10459 << FirstMethodType << FirstName;
10460 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10461 SecondMethod->getSourceRange(), MethodName)
10462 << SecondMethodType << SecondName;
10463
10464 Diagnosed = true;
10465 break;
10466 }
10467
10468 const bool FirstDeleted = FirstMethod->isDeletedAsWritten();
10469 const bool SecondDeleted = SecondMethod->isDeletedAsWritten();
10470 if (FirstDeleted != SecondDeleted) {
10471 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(),
10472 FirstMethod->getSourceRange(), MethodDeleted)
10473 << FirstMethodType << FirstName << FirstDeleted;
10474
10475 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10476 SecondMethod->getSourceRange(), MethodDeleted)
10477 << SecondMethodType << SecondName << SecondDeleted;
10478 Diagnosed = true;
10479 break;
10480 }
10481
10482 const bool FirstDefaulted = FirstMethod->isExplicitlyDefaulted();
10483 const bool SecondDefaulted = SecondMethod->isExplicitlyDefaulted();
10484 if (FirstDefaulted != SecondDefaulted) {
10485 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(),
10486 FirstMethod->getSourceRange(), MethodDefaulted)
10487 << FirstMethodType << FirstName << FirstDefaulted;
10488
10489 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10490 SecondMethod->getSourceRange(), MethodDefaulted)
10491 << SecondMethodType << SecondName << SecondDefaulted;
10492 Diagnosed = true;
10493 break;
10494 }
10495
10496 const bool FirstVirtual = FirstMethod->isVirtualAsWritten();
10497 const bool SecondVirtual = SecondMethod->isVirtualAsWritten();
10498 const bool FirstPure = FirstMethod->isPure();
10499 const bool SecondPure = SecondMethod->isPure();
10500 if ((FirstVirtual || SecondVirtual) &&
10501 (FirstVirtual != SecondVirtual || FirstPure != SecondPure)) {
10502 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(),
10503 FirstMethod->getSourceRange(), MethodVirtual)
10504 << FirstMethodType << FirstName << FirstPure << FirstVirtual;
10505 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10506 SecondMethod->getSourceRange(), MethodVirtual)
10507 << SecondMethodType << SecondName << SecondPure << SecondVirtual;
10508 Diagnosed = true;
10509 break;
10510 }
10511
10512 // CXXMethodDecl::isStatic uses the canonical Decl. With Decl merging,
10513 // FirstDecl is the canonical Decl of SecondDecl, so the storage
10514 // class needs to be checked instead.
10515 const auto FirstStorage = FirstMethod->getStorageClass();
10516 const auto SecondStorage = SecondMethod->getStorageClass();
10517 const bool FirstStatic = FirstStorage == SC_Static;
10518 const bool SecondStatic = SecondStorage == SC_Static;
10519 if (FirstStatic != SecondStatic) {
10520 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(),
10521 FirstMethod->getSourceRange(), MethodStatic)
10522 << FirstMethodType << FirstName << FirstStatic;
10523 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10524 SecondMethod->getSourceRange(), MethodStatic)
10525 << SecondMethodType << SecondName << SecondStatic;
10526 Diagnosed = true;
10527 break;
10528 }
10529
10530 const bool FirstVolatile = FirstMethod->isVolatile();
10531 const bool SecondVolatile = SecondMethod->isVolatile();
10532 if (FirstVolatile != SecondVolatile) {
10533 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(),
10534 FirstMethod->getSourceRange(), MethodVolatile)
10535 << FirstMethodType << FirstName << FirstVolatile;
10536 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10537 SecondMethod->getSourceRange(), MethodVolatile)
10538 << SecondMethodType << SecondName << SecondVolatile;
10539 Diagnosed = true;
10540 break;
10541 }
10542
10543 const bool FirstConst = FirstMethod->isConst();
10544 const bool SecondConst = SecondMethod->isConst();
10545 if (FirstConst != SecondConst) {
10546 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(),
10547 FirstMethod->getSourceRange(), MethodConst)
10548 << FirstMethodType << FirstName << FirstConst;
10549 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10550 SecondMethod->getSourceRange(), MethodConst)
10551 << SecondMethodType << SecondName << SecondConst;
10552 Diagnosed = true;
10553 break;
10554 }
10555
10556 const bool FirstInline = FirstMethod->isInlineSpecified();
10557 const bool SecondInline = SecondMethod->isInlineSpecified();
10558 if (FirstInline != SecondInline) {
10559 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(),
10560 FirstMethod->getSourceRange(), MethodInline)
10561 << FirstMethodType << FirstName << FirstInline;
10562 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10563 SecondMethod->getSourceRange(), MethodInline)
10564 << SecondMethodType << SecondName << SecondInline;
10565 Diagnosed = true;
10566 break;
10567 }
10568
10569 const unsigned FirstNumParameters = FirstMethod->param_size();
10570 const unsigned SecondNumParameters = SecondMethod->param_size();
10571 if (FirstNumParameters != SecondNumParameters) {
10572 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(),
10573 FirstMethod->getSourceRange(),
10574 MethodNumberParameters)
10575 << FirstMethodType << FirstName << FirstNumParameters;
10576 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10577 SecondMethod->getSourceRange(),
10578 MethodNumberParameters)
10579 << SecondMethodType << SecondName << SecondNumParameters;
10580 Diagnosed = true;
10581 break;
10582 }
10583
10584 // Need this status boolean to know when break out of the switch.
10585 bool ParameterMismatch = false;
10586 for (unsigned I = 0; I < FirstNumParameters; ++I) {
10587 const ParmVarDecl *FirstParam = FirstMethod->getParamDecl(I);
10588 const ParmVarDecl *SecondParam = SecondMethod->getParamDecl(I);
10589
10590 QualType FirstParamType = FirstParam->getType();
10591 QualType SecondParamType = SecondParam->getType();
10592 if (FirstParamType != SecondParamType &&
10593 ComputeQualTypeODRHash(FirstParamType) !=
10594 ComputeQualTypeODRHash(SecondParamType)) {
10595 if (const DecayedType *ParamDecayedType =
10596 FirstParamType->getAs<DecayedType>()) {
10597 ODRDiagDeclError(
10598 FirstRecord, FirstModule, FirstMethod->getLocation(),
10599 FirstMethod->getSourceRange(), MethodParameterType)
10600 << FirstMethodType << FirstName << (I + 1) << FirstParamType
10601 << true << ParamDecayedType->getOriginalType();
10602 } else {
10603 ODRDiagDeclError(
10604 FirstRecord, FirstModule, FirstMethod->getLocation(),
10605 FirstMethod->getSourceRange(), MethodParameterType)
10606 << FirstMethodType << FirstName << (I + 1) << FirstParamType
10607 << false;
10608 }
10609
10610 if (const DecayedType *ParamDecayedType =
10611 SecondParamType->getAs<DecayedType>()) {
10612 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10613 SecondMethod->getSourceRange(),
10614 MethodParameterType)
10615 << SecondMethodType << SecondName << (I + 1)
10616 << SecondParamType << true
10617 << ParamDecayedType->getOriginalType();
10618 } else {
10619 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10620 SecondMethod->getSourceRange(),
10621 MethodParameterType)
10622 << SecondMethodType << SecondName << (I + 1)
10623 << SecondParamType << false;
10624 }
10625 ParameterMismatch = true;
10626 break;
10627 }
10628
10629 DeclarationName FirstParamName = FirstParam->getDeclName();
10630 DeclarationName SecondParamName = SecondParam->getDeclName();
10631 if (FirstParamName != SecondParamName) {
10632 ODRDiagDeclError(FirstRecord, FirstModule,
10633 FirstMethod->getLocation(),
10634 FirstMethod->getSourceRange(), MethodParameterName)
10635 << FirstMethodType << FirstName << (I + 1) << FirstParamName;
10636 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10637 SecondMethod->getSourceRange(), MethodParameterName)
10638 << SecondMethodType << SecondName << (I + 1) << SecondParamName;
10639 ParameterMismatch = true;
10640 break;
10641 }
10642
10643 const Expr *FirstInit = FirstParam->getInit();
10644 const Expr *SecondInit = SecondParam->getInit();
10645 if ((FirstInit == nullptr) != (SecondInit == nullptr)) {
10646 ODRDiagDeclError(FirstRecord, FirstModule,
10647 FirstMethod->getLocation(),
10648 FirstMethod->getSourceRange(),
10649 MethodParameterSingleDefaultArgument)
10650 << FirstMethodType << FirstName << (I + 1)
10651 << (FirstInit == nullptr)
10652 << (FirstInit ? FirstInit->getSourceRange() : SourceRange());
10653 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10654 SecondMethod->getSourceRange(),
10655 MethodParameterSingleDefaultArgument)
10656 << SecondMethodType << SecondName << (I + 1)
10657 << (SecondInit == nullptr)
10658 << (SecondInit ? SecondInit->getSourceRange() : SourceRange());
10659 ParameterMismatch = true;
10660 break;
10661 }
10662
10663 if (FirstInit && SecondInit &&
10664 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) {
10665 ODRDiagDeclError(FirstRecord, FirstModule,
10666 FirstMethod->getLocation(),
10667 FirstMethod->getSourceRange(),
10668 MethodParameterDifferentDefaultArgument)
10669 << FirstMethodType << FirstName << (I + 1)
10670 << FirstInit->getSourceRange();
10671 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10672 SecondMethod->getSourceRange(),
10673 MethodParameterDifferentDefaultArgument)
10674 << SecondMethodType << SecondName << (I + 1)
10675 << SecondInit->getSourceRange();
10676 ParameterMismatch = true;
10677 break;
10678
10679 }
10680 }
10681
10682 if (ParameterMismatch) {
10683 Diagnosed = true;
10684 break;
10685 }
10686
10687 const auto *FirstTemplateArgs =
10688 FirstMethod->getTemplateSpecializationArgs();
10689 const auto *SecondTemplateArgs =
10690 SecondMethod->getTemplateSpecializationArgs();
10691
10692 if ((FirstTemplateArgs && !SecondTemplateArgs) ||
10693 (!FirstTemplateArgs && SecondTemplateArgs)) {
10694 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(),
10695 FirstMethod->getSourceRange(),
10696 MethodNoTemplateArguments)
10697 << FirstMethodType << FirstName << (FirstTemplateArgs != nullptr);
10698 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10699 SecondMethod->getSourceRange(),
10700 MethodNoTemplateArguments)
10701 << SecondMethodType << SecondName
10702 << (SecondTemplateArgs != nullptr);
10703
10704 Diagnosed = true;
10705 break;
10706 }
10707
10708 if (FirstTemplateArgs && SecondTemplateArgs) {
10709 // Remove pack expansions from argument list.
10710 auto ExpandTemplateArgumentList =
10711 [](const TemplateArgumentList *TAL) {
10712 llvm::SmallVector<const TemplateArgument *, 8> ExpandedList;
10713 for (const TemplateArgument &TA : TAL->asArray()) {
10714 if (TA.getKind() != TemplateArgument::Pack) {
10715 ExpandedList.push_back(&TA);
10716 continue;
10717 }
10718 for (const TemplateArgument &PackTA : TA.getPackAsArray()) {
10719 ExpandedList.push_back(&PackTA);
10720 }
10721 }
10722 return ExpandedList;
10723 };
10724 llvm::SmallVector<const TemplateArgument *, 8> FirstExpandedList =
10725 ExpandTemplateArgumentList(FirstTemplateArgs);
10726 llvm::SmallVector<const TemplateArgument *, 8> SecondExpandedList =
10727 ExpandTemplateArgumentList(SecondTemplateArgs);
10728
10729 if (FirstExpandedList.size() != SecondExpandedList.size()) {
10730 ODRDiagDeclError(FirstRecord, FirstModule,
10731 FirstMethod->getLocation(),
10732 FirstMethod->getSourceRange(),
10733 MethodDifferentNumberTemplateArguments)
10734 << FirstMethodType << FirstName
10735 << (unsigned)FirstExpandedList.size();
10736 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10737 SecondMethod->getSourceRange(),
10738 MethodDifferentNumberTemplateArguments)
10739 << SecondMethodType << SecondName
10740 << (unsigned)SecondExpandedList.size();
10741
10742 Diagnosed = true;
10743 break;
10744 }
10745
10746 bool TemplateArgumentMismatch = false;
10747 for (unsigned i = 0, e = FirstExpandedList.size(); i != e; ++i) {
10748 const TemplateArgument &FirstTA = *FirstExpandedList[i],
10749 &SecondTA = *SecondExpandedList[i];
10750 if (ComputeTemplateArgumentODRHash(FirstTA) ==
10751 ComputeTemplateArgumentODRHash(SecondTA)) {
10752 continue;
10753 }
10754
10755 ODRDiagDeclError(
10756 FirstRecord, FirstModule, FirstMethod->getLocation(),
10757 FirstMethod->getSourceRange(), MethodDifferentTemplateArgument)
10758 << FirstMethodType << FirstName << FirstTA << i + 1;
10759 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10760 SecondMethod->getSourceRange(),
10761 MethodDifferentTemplateArgument)
10762 << SecondMethodType << SecondName << SecondTA << i + 1;
10763
10764 TemplateArgumentMismatch = true;
10765 break;
10766 }
10767
10768 if (TemplateArgumentMismatch) {
10769 Diagnosed = true;
10770 break;
10771 }
10772 }
10773
10774 // Compute the hash of the method as if it has no body.
10775 auto ComputeCXXMethodODRHash = [&Hash](const CXXMethodDecl *D) {
10776 Hash.clear();
10777 Hash.AddFunctionDecl(D, true /*SkipBody*/);
10778 return Hash.CalculateHash();
10779 };
10780
10781 // Compare the hash generated to the hash stored. A difference means
10782 // that a body was present in the original source. Due to merging,
10783 // the stardard way of detecting a body will not work.
10784 const bool HasFirstBody =
10785 ComputeCXXMethodODRHash(FirstMethod) != FirstMethod->getODRHash();
10786 const bool HasSecondBody =
10787 ComputeCXXMethodODRHash(SecondMethod) != SecondMethod->getODRHash();
10788
10789 if (HasFirstBody != HasSecondBody) {
10790 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(),
10791 FirstMethod->getSourceRange(), MethodSingleBody)
10792 << FirstMethodType << FirstName << HasFirstBody;
10793 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10794 SecondMethod->getSourceRange(), MethodSingleBody)
10795 << SecondMethodType << SecondName << HasSecondBody;
10796 Diagnosed = true;
10797 break;
10798 }
10799
10800 if (HasFirstBody && HasSecondBody) {
10801 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(),
10802 FirstMethod->getSourceRange(), MethodDifferentBody)
10803 << FirstMethodType << FirstName;
10804 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(),
10805 SecondMethod->getSourceRange(), MethodDifferentBody)
10806 << SecondMethodType << SecondName;
10807 Diagnosed = true;
10808 break;
10809 }
10810
10811 break;
10812 }
10813 case TypeAlias:
10814 case TypeDef: {
10815 Diagnosed = ODRDiagTypeDefOrAlias(
10816 FirstRecord, FirstModule, SecondModule,
10817 cast<TypedefNameDecl>(FirstDecl), cast<TypedefNameDecl>(SecondDecl),
10818 FirstDiffType == TypeAlias);
10819 break;
10820 }
10821 case Var: {
10822 Diagnosed =
10823 ODRDiagVar(FirstRecord, FirstModule, SecondModule,
10824 cast<VarDecl>(FirstDecl), cast<VarDecl>(SecondDecl));
10825 break;
10826 }
10827 case Friend: {
10828 FriendDecl *FirstFriend = cast<FriendDecl>(FirstDecl);
10829 FriendDecl *SecondFriend = cast<FriendDecl>(SecondDecl);
10830
10831 NamedDecl *FirstND = FirstFriend->getFriendDecl();
10832 NamedDecl *SecondND = SecondFriend->getFriendDecl();
10833
10834 TypeSourceInfo *FirstTSI = FirstFriend->getFriendType();
10835 TypeSourceInfo *SecondTSI = SecondFriend->getFriendType();
10836
10837 if (FirstND && SecondND) {
10838 ODRDiagDeclError(FirstRecord, FirstModule,
10839 FirstFriend->getFriendLoc(),
10840 FirstFriend->getSourceRange(), FriendFunction)
10841 << FirstND;
10842 ODRDiagDeclNote(SecondModule, SecondFriend->getFriendLoc(),
10843 SecondFriend->getSourceRange(), FriendFunction)
10844 << SecondND;
10845
10846 Diagnosed = true;
10847 break;
10848 }
10849
10850 if (FirstTSI && SecondTSI) {
10851 QualType FirstFriendType = FirstTSI->getType();
10852 QualType SecondFriendType = SecondTSI->getType();
10853 assert(ComputeQualTypeODRHash(FirstFriendType) !=((void)0)
10854 ComputeQualTypeODRHash(SecondFriendType))((void)0);
10855 ODRDiagDeclError(FirstRecord, FirstModule,
10856 FirstFriend->getFriendLoc(),
10857 FirstFriend->getSourceRange(), FriendType)
10858 << FirstFriendType;
10859 ODRDiagDeclNote(SecondModule, SecondFriend->getFriendLoc(),
10860 SecondFriend->getSourceRange(), FriendType)
10861 << SecondFriendType;
10862 Diagnosed = true;
10863 break;
10864 }
10865
10866 ODRDiagDeclError(FirstRecord, FirstModule, FirstFriend->getFriendLoc(),
10867 FirstFriend->getSourceRange(), FriendTypeFunction)
10868 << (FirstTSI == nullptr);
10869 ODRDiagDeclNote(SecondModule, SecondFriend->getFriendLoc(),
10870 SecondFriend->getSourceRange(), FriendTypeFunction)
10871 << (SecondTSI == nullptr);
10872
10873 Diagnosed = true;
10874 break;
10875 }
10876 case FunctionTemplate: {
10877 FunctionTemplateDecl *FirstTemplate =
10878 cast<FunctionTemplateDecl>(FirstDecl);
10879 FunctionTemplateDecl *SecondTemplate =
10880 cast<FunctionTemplateDecl>(SecondDecl);
10881
10882 TemplateParameterList *FirstTPL =
10883 FirstTemplate->getTemplateParameters();
10884 TemplateParameterList *SecondTPL =
10885 SecondTemplate->getTemplateParameters();
10886
10887 if (FirstTPL->size() != SecondTPL->size()) {
10888 ODRDiagDeclError(FirstRecord, FirstModule,
10889 FirstTemplate->getLocation(),
10890 FirstTemplate->getSourceRange(),
10891 FunctionTemplateDifferentNumberParameters)
10892 << FirstTemplate << FirstTPL->size();
10893 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(),
10894 SecondTemplate->getSourceRange(),
10895 FunctionTemplateDifferentNumberParameters)
10896 << SecondTemplate << SecondTPL->size();
10897
10898 Diagnosed = true;
10899 break;
10900 }
10901
10902 bool ParameterMismatch = false;
10903 for (unsigned i = 0, e = FirstTPL->size(); i != e; ++i) {
10904 NamedDecl *FirstParam = FirstTPL->getParam(i);
10905 NamedDecl *SecondParam = SecondTPL->getParam(i);
10906
10907 if (FirstParam->getKind() != SecondParam->getKind()) {
10908 enum {
10909 TemplateTypeParameter,
10910 NonTypeTemplateParameter,
10911 TemplateTemplateParameter,
10912 };
10913 auto GetParamType = [](NamedDecl *D) {
10914 switch (D->getKind()) {
10915 default:
10916 llvm_unreachable("Unexpected template parameter type")__builtin_unreachable();
10917 case Decl::TemplateTypeParm:
10918 return TemplateTypeParameter;
10919 case Decl::NonTypeTemplateParm:
10920 return NonTypeTemplateParameter;
10921 case Decl::TemplateTemplateParm:
10922 return TemplateTemplateParameter;
10923 }
10924 };
10925
10926 ODRDiagDeclError(FirstRecord, FirstModule,
10927 FirstTemplate->getLocation(),
10928 FirstTemplate->getSourceRange(),
10929 FunctionTemplateParameterDifferentKind)
10930 << FirstTemplate << (i + 1) << GetParamType(FirstParam);
10931 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(),
10932 SecondTemplate->getSourceRange(),
10933 FunctionTemplateParameterDifferentKind)
10934 << SecondTemplate << (i + 1) << GetParamType(SecondParam);
10935
10936 ParameterMismatch = true;
10937 break;
10938 }
10939
10940 if (FirstParam->getName() != SecondParam->getName()) {
10941 ODRDiagDeclError(
10942 FirstRecord, FirstModule, FirstTemplate->getLocation(),
10943 FirstTemplate->getSourceRange(), FunctionTemplateParameterName)
10944 << FirstTemplate << (i + 1) << (bool)FirstParam->getIdentifier()
10945 << FirstParam;
10946 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(),
10947 SecondTemplate->getSourceRange(),
10948 FunctionTemplateParameterName)
10949 << SecondTemplate << (i + 1)
10950 << (bool)SecondParam->getIdentifier() << SecondParam;
10951 ParameterMismatch = true;
10952 break;
10953 }
10954
10955 if (isa<TemplateTypeParmDecl>(FirstParam) &&
10956 isa<TemplateTypeParmDecl>(SecondParam)) {
10957 TemplateTypeParmDecl *FirstTTPD =
10958 cast<TemplateTypeParmDecl>(FirstParam);
10959 TemplateTypeParmDecl *SecondTTPD =
10960 cast<TemplateTypeParmDecl>(SecondParam);
10961 bool HasFirstDefaultArgument =
10962 FirstTTPD->hasDefaultArgument() &&
10963 !FirstTTPD->defaultArgumentWasInherited();
10964 bool HasSecondDefaultArgument =
10965 SecondTTPD->hasDefaultArgument() &&
10966 !SecondTTPD->defaultArgumentWasInherited();
10967 if (HasFirstDefaultArgument != HasSecondDefaultArgument) {
10968 ODRDiagDeclError(FirstRecord, FirstModule,
10969 FirstTemplate->getLocation(),
10970 FirstTemplate->getSourceRange(),
10971 FunctionTemplateParameterSingleDefaultArgument)
10972 << FirstTemplate << (i + 1) << HasFirstDefaultArgument;
10973 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(),
10974 SecondTemplate->getSourceRange(),
10975 FunctionTemplateParameterSingleDefaultArgument)
10976 << SecondTemplate << (i + 1) << HasSecondDefaultArgument;
10977 ParameterMismatch = true;
10978 break;
10979 }
10980
10981 if (HasFirstDefaultArgument && HasSecondDefaultArgument) {
10982 QualType FirstType = FirstTTPD->getDefaultArgument();
10983 QualType SecondType = SecondTTPD->getDefaultArgument();
10984 if (ComputeQualTypeODRHash(FirstType) !=
10985 ComputeQualTypeODRHash(SecondType)) {
10986 ODRDiagDeclError(
10987 FirstRecord, FirstModule, FirstTemplate->getLocation(),
10988 FirstTemplate->getSourceRange(),
10989 FunctionTemplateParameterDifferentDefaultArgument)
10990 << FirstTemplate << (i + 1) << FirstType;
10991 ODRDiagDeclNote(
10992 SecondModule, SecondTemplate->getLocation(),
10993 SecondTemplate->getSourceRange(),
10994 FunctionTemplateParameterDifferentDefaultArgument)
10995 << SecondTemplate << (i + 1) << SecondType;
10996 ParameterMismatch = true;
10997 break;
10998 }
10999 }
11000
11001 if (FirstTTPD->isParameterPack() !=
11002 SecondTTPD->isParameterPack()) {
11003 ODRDiagDeclError(FirstRecord, FirstModule,
11004 FirstTemplate->getLocation(),
11005 FirstTemplate->getSourceRange(),
11006 FunctionTemplatePackParameter)
11007 << FirstTemplate << (i + 1) << FirstTTPD->isParameterPack();
11008 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(),
11009 SecondTemplate->getSourceRange(),
11010 FunctionTemplatePackParameter)
11011 << SecondTemplate << (i + 1) << SecondTTPD->isParameterPack();
11012 ParameterMismatch = true;
11013 break;
11014 }
11015 }
11016
11017 if (isa<TemplateTemplateParmDecl>(FirstParam) &&
11018 isa<TemplateTemplateParmDecl>(SecondParam)) {
11019 TemplateTemplateParmDecl *FirstTTPD =
11020 cast<TemplateTemplateParmDecl>(FirstParam);
11021 TemplateTemplateParmDecl *SecondTTPD =
11022 cast<TemplateTemplateParmDecl>(SecondParam);
11023
11024 TemplateParameterList *FirstTPL =
11025 FirstTTPD->getTemplateParameters();
11026 TemplateParameterList *SecondTPL =
11027 SecondTTPD->getTemplateParameters();
11028
11029 if (ComputeTemplateParameterListODRHash(FirstTPL) !=
11030 ComputeTemplateParameterListODRHash(SecondTPL)) {
11031 ODRDiagDeclError(FirstRecord, FirstModule,
11032 FirstTemplate->getLocation(),
11033 FirstTemplate->getSourceRange(),
11034 FunctionTemplateParameterDifferentType)
11035 << FirstTemplate << (i + 1);
11036 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(),
11037 SecondTemplate->getSourceRange(),
11038 FunctionTemplateParameterDifferentType)
11039 << SecondTemplate << (i + 1);
11040 ParameterMismatch = true;
11041 break;
11042 }
11043
11044 bool HasFirstDefaultArgument =
11045 FirstTTPD->hasDefaultArgument() &&
11046 !FirstTTPD->defaultArgumentWasInherited();
11047 bool HasSecondDefaultArgument =
11048 SecondTTPD->hasDefaultArgument() &&
11049 !SecondTTPD->defaultArgumentWasInherited();
11050 if (HasFirstDefaultArgument != HasSecondDefaultArgument) {
11051 ODRDiagDeclError(FirstRecord, FirstModule,
11052 FirstTemplate->getLocation(),
11053 FirstTemplate->getSourceRange(),
11054 FunctionTemplateParameterSingleDefaultArgument)
11055 << FirstTemplate << (i + 1) << HasFirstDefaultArgument;
11056 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(),
11057 SecondTemplate->getSourceRange(),
11058 FunctionTemplateParameterSingleDefaultArgument)
11059 << SecondTemplate << (i + 1) << HasSecondDefaultArgument;
11060 ParameterMismatch = true;
11061 break;
11062 }
11063
11064 if (HasFirstDefaultArgument && HasSecondDefaultArgument) {
11065 TemplateArgument FirstTA =
11066 FirstTTPD->getDefaultArgument().getArgument();
11067 TemplateArgument SecondTA =
11068 SecondTTPD->getDefaultArgument().getArgument();
11069 if (ComputeTemplateArgumentODRHash(FirstTA) !=
11070 ComputeTemplateArgumentODRHash(SecondTA)) {
11071 ODRDiagDeclError(
11072 FirstRecord, FirstModule, FirstTemplate->getLocation(),
11073 FirstTemplate->getSourceRange(),
11074 FunctionTemplateParameterDifferentDefaultArgument)
11075 << FirstTemplate << (i + 1) << FirstTA;
11076 ODRDiagDeclNote(
11077 SecondModule, SecondTemplate->getLocation(),
11078 SecondTemplate->getSourceRange(),
11079 FunctionTemplateParameterDifferentDefaultArgument)
11080 << SecondTemplate << (i + 1) << SecondTA;
11081 ParameterMismatch = true;
11082 break;
11083 }
11084 }
11085
11086 if (FirstTTPD->isParameterPack() !=
11087 SecondTTPD->isParameterPack()) {
11088 ODRDiagDeclError(FirstRecord, FirstModule,
11089 FirstTemplate->getLocation(),
11090 FirstTemplate->getSourceRange(),
11091 FunctionTemplatePackParameter)
11092 << FirstTemplate << (i + 1) << FirstTTPD->isParameterPack();
11093 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(),
11094 SecondTemplate->getSourceRange(),
11095 FunctionTemplatePackParameter)
11096 << SecondTemplate << (i + 1) << SecondTTPD->isParameterPack();
11097 ParameterMismatch = true;
11098 break;
11099 }
11100 }
11101
11102 if (isa<NonTypeTemplateParmDecl>(FirstParam) &&
11103 isa<NonTypeTemplateParmDecl>(SecondParam)) {
11104 NonTypeTemplateParmDecl *FirstNTTPD =
11105 cast<NonTypeTemplateParmDecl>(FirstParam);
11106 NonTypeTemplateParmDecl *SecondNTTPD =
11107 cast<NonTypeTemplateParmDecl>(SecondParam);
11108
11109 QualType FirstType = FirstNTTPD->getType();
11110 QualType SecondType = SecondNTTPD->getType();
11111 if (ComputeQualTypeODRHash(FirstType) !=
11112 ComputeQualTypeODRHash(SecondType)) {
11113 ODRDiagDeclError(FirstRecord, FirstModule,
11114 FirstTemplate->getLocation(),
11115 FirstTemplate->getSourceRange(),
11116 FunctionTemplateParameterDifferentType)
11117 << FirstTemplate << (i + 1);
11118 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(),
11119 SecondTemplate->getSourceRange(),
11120 FunctionTemplateParameterDifferentType)
11121 << SecondTemplate << (i + 1);
11122 ParameterMismatch = true;
11123 break;
11124 }
11125
11126 bool HasFirstDefaultArgument =
11127 FirstNTTPD->hasDefaultArgument() &&
11128 !FirstNTTPD->defaultArgumentWasInherited();
11129 bool HasSecondDefaultArgument =
11130 SecondNTTPD->hasDefaultArgument() &&
11131 !SecondNTTPD->defaultArgumentWasInherited();
11132 if (HasFirstDefaultArgument != HasSecondDefaultArgument) {
11133 ODRDiagDeclError(FirstRecord, FirstModule,
11134 FirstTemplate->getLocation(),
11135 FirstTemplate->getSourceRange(),
11136 FunctionTemplateParameterSingleDefaultArgument)
11137 << FirstTemplate << (i + 1) << HasFirstDefaultArgument;
11138 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(),
11139 SecondTemplate->getSourceRange(),
11140 FunctionTemplateParameterSingleDefaultArgument)
11141 << SecondTemplate << (i + 1) << HasSecondDefaultArgument;
11142 ParameterMismatch = true;
11143 break;
11144 }
11145
11146 if (HasFirstDefaultArgument && HasSecondDefaultArgument) {
11147 Expr *FirstDefaultArgument = FirstNTTPD->getDefaultArgument();
11148 Expr *SecondDefaultArgument = SecondNTTPD->getDefaultArgument();
11149 if (ComputeODRHash(FirstDefaultArgument) !=
11150 ComputeODRHash(SecondDefaultArgument)) {
11151 ODRDiagDeclError(
11152 FirstRecord, FirstModule, FirstTemplate->getLocation(),
11153 FirstTemplate->getSourceRange(),
11154 FunctionTemplateParameterDifferentDefaultArgument)
11155 << FirstTemplate << (i + 1) << FirstDefaultArgument;
11156 ODRDiagDeclNote(
11157 SecondModule, SecondTemplate->getLocation(),
11158 SecondTemplate->getSourceRange(),
11159 FunctionTemplateParameterDifferentDefaultArgument)
11160 << SecondTemplate << (i + 1) << SecondDefaultArgument;
11161 ParameterMismatch = true;
11162 break;
11163 }
11164 }
11165
11166 if (FirstNTTPD->isParameterPack() !=
11167 SecondNTTPD->isParameterPack()) {
11168 ODRDiagDeclError(FirstRecord, FirstModule,
11169 FirstTemplate->getLocation(),
11170 FirstTemplate->getSourceRange(),
11171 FunctionTemplatePackParameter)
11172 << FirstTemplate << (i + 1) << FirstNTTPD->isParameterPack();
11173 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(),
11174 SecondTemplate->getSourceRange(),
11175 FunctionTemplatePackParameter)
11176 << SecondTemplate << (i + 1)
11177 << SecondNTTPD->isParameterPack();
11178 ParameterMismatch = true;
11179 break;
11180 }
11181 }
11182 }
11183
11184 if (ParameterMismatch) {
11185 Diagnosed = true;
11186 break;
11187 }
11188
11189 break;
11190 }
11191 }
11192
11193 if (Diagnosed)
11194 continue;
11195
11196 Diag(FirstDecl->getLocation(),
11197 diag::err_module_odr_violation_mismatch_decl_unknown)
11198 << FirstRecord << FirstModule.empty() << FirstModule << FirstDiffType
11199 << FirstDecl->getSourceRange();
11200 Diag(SecondDecl->getLocation(),
11201 diag::note_module_odr_violation_mismatch_decl_unknown)
11202 << SecondModule << FirstDiffType << SecondDecl->getSourceRange();
11203 Diagnosed = true;
11204 }
11205
11206 if (!Diagnosed) {
11207 // All definitions are updates to the same declaration. This happens if a
11208 // module instantiates the declaration of a class template specialization
11209 // and two or more other modules instantiate its definition.
11210 //
11211 // FIXME: Indicate which modules had instantiations of this definition.
11212 // FIXME: How can this even happen?
11213 Diag(Merge.first->getLocation(),
11214 diag::err_module_odr_violation_different_instantiations)
11215 << Merge.first;
11216 }
11217 }
11218
11219 // Issue ODR failures diagnostics for functions.
11220 for (auto &Merge : FunctionOdrMergeFailures) {
11221 enum ODRFunctionDifference {
11222 ReturnType,
11223 ParameterName,
11224 ParameterType,
11225 ParameterSingleDefaultArgument,
11226 ParameterDifferentDefaultArgument,
11227 FunctionBody,
11228 };
11229
11230 FunctionDecl *FirstFunction = Merge.first;
11231 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstFunction);
11232
11233 bool Diagnosed = false;
11234 for (auto &SecondFunction : Merge.second) {
11235
11236 if (FirstFunction == SecondFunction)
11237 continue;
11238
11239 std::string SecondModule =
11240 getOwningModuleNameForDiagnostic(SecondFunction);
11241
11242 auto ODRDiagError = [FirstFunction, &FirstModule,
11243 this](SourceLocation Loc, SourceRange Range,
11244 ODRFunctionDifference DiffType) {
11245 return Diag(Loc, diag::err_module_odr_violation_function)
11246 << FirstFunction << FirstModule.empty() << FirstModule << Range
11247 << DiffType;
11248 };
11249 auto ODRDiagNote = [&SecondModule, this](SourceLocation Loc,
11250 SourceRange Range,
11251 ODRFunctionDifference DiffType) {
11252 return Diag(Loc, diag::note_module_odr_violation_function)
11253 << SecondModule << Range << DiffType;
11254 };
11255
11256 if (ComputeQualTypeODRHash(FirstFunction->getReturnType()) !=
11257 ComputeQualTypeODRHash(SecondFunction->getReturnType())) {
11258 ODRDiagError(FirstFunction->getReturnTypeSourceRange().getBegin(),
11259 FirstFunction->getReturnTypeSourceRange(), ReturnType)
11260 << FirstFunction->getReturnType();
11261 ODRDiagNote(SecondFunction->getReturnTypeSourceRange().getBegin(),
11262 SecondFunction->getReturnTypeSourceRange(), ReturnType)
11263 << SecondFunction->getReturnType();
11264 Diagnosed = true;
11265 break;
11266 }
11267
11268 assert(FirstFunction->param_size() == SecondFunction->param_size() &&((void)0)
11269 "Merged functions with different number of parameters")((void)0);
11270
11271 auto ParamSize = FirstFunction->param_size();
11272 bool ParameterMismatch = false;
11273 for (unsigned I = 0; I < ParamSize; ++I) {
11274 auto *FirstParam = FirstFunction->getParamDecl(I);
11275 auto *SecondParam = SecondFunction->getParamDecl(I);
11276
11277 assert(getContext().hasSameType(FirstParam->getType(),((void)0)
11278 SecondParam->getType()) &&((void)0)
11279 "Merged function has different parameter types.")((void)0);
11280
11281 if (FirstParam->getDeclName() != SecondParam->getDeclName()) {
11282 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(),
11283 ParameterName)
11284 << I + 1 << FirstParam->getDeclName();
11285 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(),
11286 ParameterName)
11287 << I + 1 << SecondParam->getDeclName();
11288 ParameterMismatch = true;
11289 break;
11290 };
11291
11292 QualType FirstParamType = FirstParam->getType();
11293 QualType SecondParamType = SecondParam->getType();
11294 if (FirstParamType != SecondParamType &&
11295 ComputeQualTypeODRHash(FirstParamType) !=
11296 ComputeQualTypeODRHash(SecondParamType)) {
11297 if (const DecayedType *ParamDecayedType =
11298 FirstParamType->getAs<DecayedType>()) {
11299 ODRDiagError(FirstParam->getLocation(),
11300 FirstParam->getSourceRange(), ParameterType)
11301 << (I + 1) << FirstParamType << true
11302 << ParamDecayedType->getOriginalType();
11303 } else {
11304 ODRDiagError(FirstParam->getLocation(),
11305 FirstParam->getSourceRange(), ParameterType)
11306 << (I + 1) << FirstParamType << false;
11307 }
11308
11309 if (const DecayedType *ParamDecayedType =
11310 SecondParamType->getAs<DecayedType>()) {
11311 ODRDiagNote(SecondParam->getLocation(),
11312 SecondParam->getSourceRange(), ParameterType)
11313 << (I + 1) << SecondParamType << true
11314 << ParamDecayedType->getOriginalType();
11315 } else {
11316 ODRDiagNote(SecondParam->getLocation(),
11317 SecondParam->getSourceRange(), ParameterType)
11318 << (I + 1) << SecondParamType << false;
11319 }
11320 ParameterMismatch = true;
11321 break;
11322 }
11323
11324 const Expr *FirstInit = FirstParam->getInit();
11325 const Expr *SecondInit = SecondParam->getInit();
11326 if ((FirstInit == nullptr) != (SecondInit == nullptr)) {
11327 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(),
11328 ParameterSingleDefaultArgument)
11329 << (I + 1) << (FirstInit == nullptr)
11330 << (FirstInit ? FirstInit->getSourceRange() : SourceRange());
11331 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(),
11332 ParameterSingleDefaultArgument)
11333 << (I + 1) << (SecondInit == nullptr)
11334 << (SecondInit ? SecondInit->getSourceRange() : SourceRange());
11335 ParameterMismatch = true;
11336 break;
11337 }
11338
11339 if (FirstInit && SecondInit &&
11340 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) {
11341 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(),
11342 ParameterDifferentDefaultArgument)
11343 << (I + 1) << FirstInit->getSourceRange();
11344 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(),
11345 ParameterDifferentDefaultArgument)
11346 << (I + 1) << SecondInit->getSourceRange();
11347 ParameterMismatch = true;
11348 break;
11349 }
11350
11351 assert(ComputeSubDeclODRHash(FirstParam) ==((void)0)
11352 ComputeSubDeclODRHash(SecondParam) &&((void)0)
11353 "Undiagnosed parameter difference.")((void)0);
11354 }
11355
11356 if (ParameterMismatch) {
11357 Diagnosed = true;
11358 break;
11359 }
11360
11361 // If no error has been generated before now, assume the problem is in
11362 // the body and generate a message.
11363 ODRDiagError(FirstFunction->getLocation(),
11364 FirstFunction->getSourceRange(), FunctionBody);
11365 ODRDiagNote(SecondFunction->getLocation(),
11366 SecondFunction->getSourceRange(), FunctionBody);
11367 Diagnosed = true;
11368 break;
11369 }
11370 (void)Diagnosed;
11371 assert(Diagnosed && "Unable to emit ODR diagnostic.")((void)0);
11372 }
11373
11374 // Issue ODR failures diagnostics for enums.
11375 for (auto &Merge : EnumOdrMergeFailures) {
11376 enum ODREnumDifference {
11377 SingleScopedEnum,
11378 EnumTagKeywordMismatch,
11379 SingleSpecifiedType,
11380 DifferentSpecifiedTypes,
11381 DifferentNumberEnumConstants,
11382 EnumConstantName,
11383 EnumConstantSingleInitilizer,
11384 EnumConstantDifferentInitilizer,
11385 };
11386
11387 // If we've already pointed out a specific problem with this enum, don't
11388 // bother issuing a general "something's different" diagnostic.
11389 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11390 continue;
11391
11392 EnumDecl *FirstEnum = Merge.first;
11393 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstEnum);
11394
11395 using DeclHashes =
11396 llvm::SmallVector<std::pair<EnumConstantDecl *, unsigned>, 4>;
11397 auto PopulateHashes = [&ComputeSubDeclODRHash, FirstEnum](
11398 DeclHashes &Hashes, EnumDecl *Enum) {
11399 for (auto *D : Enum->decls()) {
11400 // Due to decl merging, the first EnumDecl is the parent of
11401 // Decls in both records.
11402 if (!ODRHash::isDeclToBeProcessed(D, FirstEnum))
11403 continue;
11404 assert(isa<EnumConstantDecl>(D) && "Unexpected Decl kind")((void)0);
11405 Hashes.emplace_back(cast<EnumConstantDecl>(D),
11406 ComputeSubDeclODRHash(D));
11407 }
11408 };
11409 DeclHashes FirstHashes;
11410 PopulateHashes(FirstHashes, FirstEnum);
11411 bool Diagnosed = false;
11412 for (auto &SecondEnum : Merge.second) {
11413
11414 if (FirstEnum == SecondEnum)
11415 continue;
11416
11417 std::string SecondModule =
11418 getOwningModuleNameForDiagnostic(SecondEnum);
11419
11420 auto ODRDiagError = [FirstEnum, &FirstModule,
11421 this](SourceLocation Loc, SourceRange Range,
11422 ODREnumDifference DiffType) {
11423 return Diag(Loc, diag::err_module_odr_violation_enum)
11424 << FirstEnum << FirstModule.empty() << FirstModule << Range
11425 << DiffType;
11426 };
11427 auto ODRDiagNote = [&SecondModule, this](SourceLocation Loc,
11428 SourceRange Range,
11429 ODREnumDifference DiffType) {
11430 return Diag(Loc, diag::note_module_odr_violation_enum)
11431 << SecondModule << Range << DiffType;
11432 };
11433
11434 if (FirstEnum->isScoped() != SecondEnum->isScoped()) {
11435 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(),
11436 SingleScopedEnum)
11437 << FirstEnum->isScoped();
11438 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(),
11439 SingleScopedEnum)
11440 << SecondEnum->isScoped();
11441 Diagnosed = true;
11442 continue;
11443 }
11444
11445 if (FirstEnum->isScoped() && SecondEnum->isScoped()) {
11446 if (FirstEnum->isScopedUsingClassTag() !=
11447 SecondEnum->isScopedUsingClassTag()) {
11448 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(),
11449 EnumTagKeywordMismatch)
11450 << FirstEnum->isScopedUsingClassTag();
11451 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(),
11452 EnumTagKeywordMismatch)
11453 << SecondEnum->isScopedUsingClassTag();
11454 Diagnosed = true;
11455 continue;
11456 }
11457 }
11458
11459 QualType FirstUnderlyingType =
11460 FirstEnum->getIntegerTypeSourceInfo()
11461 ? FirstEnum->getIntegerTypeSourceInfo()->getType()
11462 : QualType();
11463 QualType SecondUnderlyingType =
11464 SecondEnum->getIntegerTypeSourceInfo()
11465 ? SecondEnum->getIntegerTypeSourceInfo()->getType()
11466 : QualType();
11467 if (FirstUnderlyingType.isNull() != SecondUnderlyingType.isNull()) {
11468 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(),
11469 SingleSpecifiedType)
11470 << !FirstUnderlyingType.isNull();
11471 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(),
11472 SingleSpecifiedType)
11473 << !SecondUnderlyingType.isNull();
11474 Diagnosed = true;
11475 continue;
11476 }
11477
11478 if (!FirstUnderlyingType.isNull() && !SecondUnderlyingType.isNull()) {
11479 if (ComputeQualTypeODRHash(FirstUnderlyingType) !=
11480 ComputeQualTypeODRHash(SecondUnderlyingType)) {
11481 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(),
11482 DifferentSpecifiedTypes)
11483 << FirstUnderlyingType;
11484 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(),
11485 DifferentSpecifiedTypes)
11486 << SecondUnderlyingType;
11487 Diagnosed = true;
11488 continue;
11489 }
11490 }
11491
11492 DeclHashes SecondHashes;
11493 PopulateHashes(SecondHashes, SecondEnum);
11494
11495 if (FirstHashes.size() != SecondHashes.size()) {
11496 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(),
11497 DifferentNumberEnumConstants)
11498 << (int)FirstHashes.size();
11499 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(),
11500 DifferentNumberEnumConstants)
11501 << (int)SecondHashes.size();
11502 Diagnosed = true;
11503 continue;
11504 }
11505
11506 for (unsigned I = 0; I < FirstHashes.size(); ++I) {
11507 if (FirstHashes[I].second == SecondHashes[I].second)
11508 continue;
11509 const EnumConstantDecl *FirstEnumConstant = FirstHashes[I].first;
11510 const EnumConstantDecl *SecondEnumConstant = SecondHashes[I].first;
11511
11512 if (FirstEnumConstant->getDeclName() !=
11513 SecondEnumConstant->getDeclName()) {
11514
11515 ODRDiagError(FirstEnumConstant->getLocation(),
11516 FirstEnumConstant->getSourceRange(), EnumConstantName)
11517 << I + 1 << FirstEnumConstant;
11518 ODRDiagNote(SecondEnumConstant->getLocation(),
11519 SecondEnumConstant->getSourceRange(), EnumConstantName)
11520 << I + 1 << SecondEnumConstant;
11521 Diagnosed = true;
11522 break;
11523 }
11524
11525 const Expr *FirstInit = FirstEnumConstant->getInitExpr();
11526 const Expr *SecondInit = SecondEnumConstant->getInitExpr();
11527 if (!FirstInit && !SecondInit)
11528 continue;
11529
11530 if (!FirstInit || !SecondInit) {
11531 ODRDiagError(FirstEnumConstant->getLocation(),
11532 FirstEnumConstant->getSourceRange(),
11533 EnumConstantSingleInitilizer)
11534 << I + 1 << FirstEnumConstant << (FirstInit != nullptr);
11535 ODRDiagNote(SecondEnumConstant->getLocation(),
11536 SecondEnumConstant->getSourceRange(),
11537 EnumConstantSingleInitilizer)
11538 << I + 1 << SecondEnumConstant << (SecondInit != nullptr);
11539 Diagnosed = true;
11540 break;
11541 }
11542
11543 if (ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) {
11544 ODRDiagError(FirstEnumConstant->getLocation(),
11545 FirstEnumConstant->getSourceRange(),
11546 EnumConstantDifferentInitilizer)
11547 << I + 1 << FirstEnumConstant;
11548 ODRDiagNote(SecondEnumConstant->getLocation(),
11549 SecondEnumConstant->getSourceRange(),
11550 EnumConstantDifferentInitilizer)
11551 << I + 1 << SecondEnumConstant;
11552 Diagnosed = true;
11553 break;
11554 }
11555 }
11556 }
11557
11558 (void)Diagnosed;
11559 assert(Diagnosed && "Unable to emit ODR diagnostic.")((void)0);
11560 }
11561}
11562
11563void ASTReader::StartedDeserializing() {
11564 if (++NumCurrentElementsDeserializing == 1 && ReadTimer.get())
11565 ReadTimer->startTimer();
11566}
11567
11568void ASTReader::FinishedDeserializing() {
11569 assert(NumCurrentElementsDeserializing &&((void)0)
11570 "FinishedDeserializing not paired with StartedDeserializing")((void)0);
11571 if (NumCurrentElementsDeserializing == 1) {
11572 // We decrease NumCurrentElementsDeserializing only after pending actions
11573 // are finished, to avoid recursively re-calling finishPendingActions().
11574 finishPendingActions();
11575 }
11576 --NumCurrentElementsDeserializing;
11577
11578 if (NumCurrentElementsDeserializing == 0) {
11579 // Propagate exception specification and deduced type updates along
11580 // redeclaration chains.
11581 //
11582 // We do this now rather than in finishPendingActions because we want to
11583 // be able to walk the complete redeclaration chains of the updated decls.
11584 while (!PendingExceptionSpecUpdates.empty() ||
11585 !PendingDeducedTypeUpdates.empty()) {
11586 auto ESUpdates = std::move(PendingExceptionSpecUpdates);
11587 PendingExceptionSpecUpdates.clear();
11588 for (auto Update : ESUpdates) {
11589 ProcessingUpdatesRAIIObj ProcessingUpdates(*this);
11590 auto *FPT = Update.second->getType()->castAs<FunctionProtoType>();
11591 auto ESI = FPT->getExtProtoInfo().ExceptionSpec;
11592 if (auto *Listener = getContext().getASTMutationListener())
11593 Listener->ResolvedExceptionSpec(cast<FunctionDecl>(Update.second));
11594 for (auto *Redecl : Update.second->redecls())
11595 getContext().adjustExceptionSpec(cast<FunctionDecl>(Redecl), ESI);
11596 }
11597
11598 auto DTUpdates = std::move(PendingDeducedTypeUpdates);
11599 PendingDeducedTypeUpdates.clear();
11600 for (auto Update : DTUpdates) {
11601 ProcessingUpdatesRAIIObj ProcessingUpdates(*this);
11602 // FIXME: If the return type is already deduced, check that it matches.
11603 getContext().adjustDeducedFunctionResultType(Update.first,
11604 Update.second);
11605 }
11606 }
11607
11608 if (ReadTimer)
11609 ReadTimer->stopTimer();
11610
11611 diagnoseOdrViolations();
11612
11613 // We are not in recursive loading, so it's safe to pass the "interesting"
11614 // decls to the consumer.
11615 if (Consumer)
11616 PassInterestingDeclsToConsumer();
11617 }
11618}
11619
11620void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) {
11621 if (IdentifierInfo *II = Name.getAsIdentifierInfo()) {
11622 // Remove any fake results before adding any real ones.
11623 auto It = PendingFakeLookupResults.find(II);
11624 if (It != PendingFakeLookupResults.end()) {
11625 for (auto *ND : It->second)
11626 SemaObj->IdResolver.RemoveDecl(ND);
11627 // FIXME: this works around module+PCH performance issue.
11628 // Rather than erase the result from the map, which is O(n), just clear
11629 // the vector of NamedDecls.
11630 It->second.clear();
11631 }
11632 }
11633
11634 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
11635 SemaObj->TUScope->AddDecl(D);
11636 } else if (SemaObj->TUScope) {
11637 // Adding the decl to IdResolver may have failed because it was already in
11638 // (even though it was not added in scope). If it is already in, make sure
11639 // it gets in the scope as well.
11640 if (std::find(SemaObj->IdResolver.begin(Name),
11641 SemaObj->IdResolver.end(), D) != SemaObj->IdResolver.end())
11642 SemaObj->TUScope->AddDecl(D);
11643 }
11644}
11645
11646ASTReader::ASTReader(Preprocessor &PP, InMemoryModuleCache &ModuleCache,
11647 ASTContext *Context,
11648 const PCHContainerReader &PCHContainerRdr,
11649 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
11650 StringRef isysroot,
11651 DisableValidationForModuleKind DisableValidationKind,
11652 bool AllowASTWithCompilerErrors,
11653 bool AllowConfigurationMismatch, bool ValidateSystemInputs,
11654 bool ValidateASTInputFilesContent, bool UseGlobalIndex,
11655 std::unique_ptr<llvm::Timer> ReadTimer)
11656 : Listener(bool(DisableValidationKind &DisableValidationForModuleKind::PCH)
11657 ? cast<ASTReaderListener>(new SimpleASTReaderListener(PP))
11658 : cast<ASTReaderListener>(new PCHValidator(PP, *this))),
11659 SourceMgr(PP.getSourceManager()), FileMgr(PP.getFileManager()),
11660 PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()), PP(PP),
11661 ContextObj(Context), ModuleMgr(PP.getFileManager(), ModuleCache,
11662 PCHContainerRdr, PP.getHeaderSearchInfo()),
11663 DummyIdResolver(PP), ReadTimer(std::move(ReadTimer)), isysroot(isysroot),
11664 DisableValidationKind(DisableValidationKind),
11665 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
11666 AllowConfigurationMismatch(AllowConfigurationMismatch),
11667 ValidateSystemInputs(ValidateSystemInputs),
11668 ValidateASTInputFilesContent(ValidateASTInputFilesContent),
11669 UseGlobalIndex(UseGlobalIndex), CurrSwitchCaseStmts(&SwitchCaseStmts) {
11670 SourceMgr.setExternalSLocEntrySource(this);
11671
11672 for (const auto &Ext : Extensions) {
11673 auto BlockName = Ext->getExtensionMetadata().BlockName;
11674 auto Known = ModuleFileExtensions.find(BlockName);
11675 if (Known != ModuleFileExtensions.end()) {
11676 Diags.Report(diag::warn_duplicate_module_file_extension)
11677 << BlockName;
11678 continue;
11679 }
11680
11681 ModuleFileExtensions.insert({BlockName, Ext});
11682 }
11683}
11684
11685ASTReader::~ASTReader() {
11686 if (OwnsDeserializationListener)
11687 delete DeserializationListener;
11688}
11689
11690IdentifierResolver &ASTReader::getIdResolver() {
11691 return SemaObj ? SemaObj->IdResolver : DummyIdResolver;
11692}
11693
11694Expected<unsigned> ASTRecordReader::readRecord(llvm::BitstreamCursor &Cursor,
11695 unsigned AbbrevID) {
11696 Idx = 0;
11697 Record.clear();
11698 return Cursor.readRecord(AbbrevID, Record);
11699}
11700//===----------------------------------------------------------------------===//
11701//// OMPClauseReader implementation
11702////===----------------------------------------------------------------------===//
11703
11704// This has to be in namespace clang because it's friended by all
11705// of the OMP clauses.
11706namespace clang {
11707
11708class OMPClauseReader : public OMPClauseVisitor<OMPClauseReader> {
11709 ASTRecordReader &Record;
11710 ASTContext &Context;
11711
11712public:
11713 OMPClauseReader(ASTRecordReader &Record)
11714 : Record(Record), Context(Record.getContext()) {}
11715#define GEN_CLANG_CLAUSE_CLASS
11716#define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *C);
11717#include "llvm/Frontend/OpenMP/OMP.inc"
11718 OMPClause *readClause();
11719 void VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C);
11720 void VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C);
11721};
11722
11723} // end namespace clang
11724
11725OMPClause *ASTRecordReader::readOMPClause() {
11726 return OMPClauseReader(*this).readClause();
8
Calling 'OMPClauseReader::readClause'
11727}
11728
11729OMPClause *OMPClauseReader::readClause() {
11730 OMPClause *C = nullptr;
9
'C' initialized to a null pointer value
11731 switch (llvm::omp::Clause(Record.readInt())) {
10
Control jumps to the 'default' case at line 12011
11732 case llvm::omp::OMPC_if:
11733 C = new (Context) OMPIfClause();
11734 break;
11735 case llvm::omp::OMPC_final:
11736 C = new (Context) OMPFinalClause();
11737 break;
11738 case llvm::omp::OMPC_num_threads:
11739 C = new (Context) OMPNumThreadsClause();
11740 break;
11741 case llvm::omp::OMPC_safelen:
11742 C = new (Context) OMPSafelenClause();
11743 break;
11744 case llvm::omp::OMPC_simdlen:
11745 C = new (Context) OMPSimdlenClause();
11746 break;
11747 case llvm::omp::OMPC_sizes: {
11748 unsigned NumSizes = Record.readInt();
11749 C = OMPSizesClause::CreateEmpty(Context, NumSizes);
11750 break;
11751 }
11752 case llvm::omp::OMPC_full:
11753 C = OMPFullClause::CreateEmpty(Context);
11754 break;
11755 case llvm::omp::OMPC_partial:
11756 C = OMPPartialClause::CreateEmpty(Context);
11757 break;
11758 case llvm::omp::OMPC_allocator:
11759 C = new (Context) OMPAllocatorClause();
11760 break;
11761 case llvm::omp::OMPC_collapse:
11762 C = new (Context) OMPCollapseClause();
11763 break;
11764 case llvm::omp::OMPC_default:
11765 C = new (Context) OMPDefaultClause();
11766 break;
11767 case llvm::omp::OMPC_proc_bind:
11768 C = new (Context) OMPProcBindClause();
11769 break;
11770 case llvm::omp::OMPC_schedule:
11771 C = new (Context) OMPScheduleClause();
11772 break;
11773 case llvm::omp::OMPC_ordered:
11774 C = OMPOrderedClause::CreateEmpty(Context, Record.readInt());
11775 break;
11776 case llvm::omp::OMPC_nowait:
11777 C = new (Context) OMPNowaitClause();
11778 break;
11779 case llvm::omp::OMPC_untied:
11780 C = new (Context) OMPUntiedClause();
11781 break;
11782 case llvm::omp::OMPC_mergeable:
11783 C = new (Context) OMPMergeableClause();
11784 break;
11785 case llvm::omp::OMPC_read:
11786 C = new (Context) OMPReadClause();
11787 break;
11788 case llvm::omp::OMPC_write:
11789 C = new (Context) OMPWriteClause();
11790 break;
11791 case llvm::omp::OMPC_update:
11792 C = OMPUpdateClause::CreateEmpty(Context, Record.readInt());
11793 break;
11794 case llvm::omp::OMPC_capture:
11795 C = new (Context) OMPCaptureClause();
11796 break;
11797 case llvm::omp::OMPC_seq_cst:
11798 C = new (Context) OMPSeqCstClause();
11799 break;
11800 case llvm::omp::OMPC_acq_rel:
11801 C = new (Context) OMPAcqRelClause();
11802 break;
11803 case llvm::omp::OMPC_acquire:
11804 C = new (Context) OMPAcquireClause();
11805 break;
11806 case llvm::omp::OMPC_release:
11807 C = new (Context) OMPReleaseClause();
11808 break;
11809 case llvm::omp::OMPC_relaxed:
11810 C = new (Context) OMPRelaxedClause();
11811 break;
11812 case llvm::omp::OMPC_threads:
11813 C = new (Context) OMPThreadsClause();
11814 break;
11815 case llvm::omp::OMPC_simd:
11816 C = new (Context) OMPSIMDClause();
11817 break;
11818 case llvm::omp::OMPC_nogroup:
11819 C = new (Context) OMPNogroupClause();
11820 break;
11821 case llvm::omp::OMPC_unified_address:
11822 C = new (Context) OMPUnifiedAddressClause();
11823 break;
11824 case llvm::omp::OMPC_unified_shared_memory:
11825 C = new (Context) OMPUnifiedSharedMemoryClause();
11826 break;
11827 case llvm::omp::OMPC_reverse_offload:
11828 C = new (Context) OMPReverseOffloadClause();
11829 break;
11830 case llvm::omp::OMPC_dynamic_allocators:
11831 C = new (Context) OMPDynamicAllocatorsClause();
11832 break;
11833 case llvm::omp::OMPC_atomic_default_mem_order:
11834 C = new (Context) OMPAtomicDefaultMemOrderClause();
11835 break;
11836 case llvm::omp::OMPC_private:
11837 C = OMPPrivateClause::CreateEmpty(Context, Record.readInt());
11838 break;
11839 case llvm::omp::OMPC_firstprivate:
11840 C = OMPFirstprivateClause::CreateEmpty(Context, Record.readInt());
11841 break;
11842 case llvm::omp::OMPC_lastprivate:
11843 C = OMPLastprivateClause::CreateEmpty(Context, Record.readInt());
11844 break;
11845 case llvm::omp::OMPC_shared:
11846 C = OMPSharedClause::CreateEmpty(Context, Record.readInt());
11847 break;
11848 case llvm::omp::OMPC_reduction: {
11849 unsigned N = Record.readInt();
11850 auto Modifier = Record.readEnum<OpenMPReductionClauseModifier>();
11851 C = OMPReductionClause::CreateEmpty(Context, N, Modifier);
11852 break;
11853 }
11854 case llvm::omp::OMPC_task_reduction:
11855 C = OMPTaskReductionClause::CreateEmpty(Context, Record.readInt());
11856 break;
11857 case llvm::omp::OMPC_in_reduction:
11858 C = OMPInReductionClause::CreateEmpty(Context, Record.readInt());
11859 break;
11860 case llvm::omp::OMPC_linear:
11861 C = OMPLinearClause::CreateEmpty(Context, Record.readInt());
11862 break;
11863 case llvm::omp::OMPC_aligned:
11864 C = OMPAlignedClause::CreateEmpty(Context, Record.readInt());
11865 break;
11866 case llvm::omp::OMPC_copyin:
11867 C = OMPCopyinClause::CreateEmpty(Context, Record.readInt());
11868 break;
11869 case llvm::omp::OMPC_copyprivate:
11870 C = OMPCopyprivateClause::CreateEmpty(Context, Record.readInt());
11871 break;
11872 case llvm::omp::OMPC_flush:
11873 C = OMPFlushClause::CreateEmpty(Context, Record.readInt());
11874 break;
11875 case llvm::omp::OMPC_depobj:
11876 C = OMPDepobjClause::CreateEmpty(Context);
11877 break;
11878 case llvm::omp::OMPC_depend: {
11879 unsigned NumVars = Record.readInt();
11880 unsigned NumLoops = Record.readInt();
11881 C = OMPDependClause::CreateEmpty(Context, NumVars, NumLoops);
11882 break;
11883 }
11884 case llvm::omp::OMPC_device:
11885 C = new (Context) OMPDeviceClause();
11886 break;
11887 case llvm::omp::OMPC_map: {
11888 OMPMappableExprListSizeTy Sizes;
11889 Sizes.NumVars = Record.readInt();
11890 Sizes.NumUniqueDeclarations = Record.readInt();
11891 Sizes.NumComponentLists = Record.readInt();
11892 Sizes.NumComponents = Record.readInt();
11893 C = OMPMapClause::CreateEmpty(Context, Sizes);
11894 break;
11895 }
11896 case llvm::omp::OMPC_num_teams:
11897 C = new (Context) OMPNumTeamsClause();
11898 break;
11899 case llvm::omp::OMPC_thread_limit:
11900 C = new (Context) OMPThreadLimitClause();
11901 break;
11902 case llvm::omp::OMPC_priority:
11903 C = new (Context) OMPPriorityClause();
11904 break;
11905 case llvm::omp::OMPC_grainsize:
11906 C = new (Context) OMPGrainsizeClause();
11907 break;
11908 case llvm::omp::OMPC_num_tasks:
11909 C = new (Context) OMPNumTasksClause();
11910 break;
11911 case llvm::omp::OMPC_hint:
11912 C = new (Context) OMPHintClause();
11913 break;
11914 case llvm::omp::OMPC_dist_schedule:
11915 C = new (Context) OMPDistScheduleClause();
11916 break;
11917 case llvm::omp::OMPC_defaultmap:
11918 C = new (Context) OMPDefaultmapClause();
11919 break;
11920 case llvm::omp::OMPC_to: {
11921 OMPMappableExprListSizeTy Sizes;
11922 Sizes.NumVars = Record.readInt();
11923 Sizes.NumUniqueDeclarations = Record.readInt();
11924 Sizes.NumComponentLists = Record.readInt();
11925 Sizes.NumComponents = Record.readInt();
11926 C = OMPToClause::CreateEmpty(Context, Sizes);
11927 break;
11928 }
11929 case llvm::omp::OMPC_from: {
11930 OMPMappableExprListSizeTy Sizes;
11931 Sizes.NumVars = Record.readInt();
11932 Sizes.NumUniqueDeclarations = Record.readInt();
11933 Sizes.NumComponentLists = Record.readInt();
11934 Sizes.NumComponents = Record.readInt();
11935 C = OMPFromClause::CreateEmpty(Context, Sizes);
11936 break;
11937 }
11938 case llvm::omp::OMPC_use_device_ptr: {
11939 OMPMappableExprListSizeTy Sizes;
11940 Sizes.NumVars = Record.readInt();
11941 Sizes.NumUniqueDeclarations = Record.readInt();
11942 Sizes.NumComponentLists = Record.readInt();
11943 Sizes.NumComponents = Record.readInt();
11944 C = OMPUseDevicePtrClause::CreateEmpty(Context, Sizes);
11945 break;
11946 }
11947 case llvm::omp::OMPC_use_device_addr: {
11948 OMPMappableExprListSizeTy Sizes;
11949 Sizes.NumVars = Record.readInt();
11950 Sizes.NumUniqueDeclarations = Record.readInt();
11951 Sizes.NumComponentLists = Record.readInt();
11952 Sizes.NumComponents = Record.readInt();
11953 C = OMPUseDeviceAddrClause::CreateEmpty(Context, Sizes);
11954 break;
11955 }
11956 case llvm::omp::OMPC_is_device_ptr: {
11957 OMPMappableExprListSizeTy Sizes;
11958 Sizes.NumVars = Record.readInt();
11959 Sizes.NumUniqueDeclarations = Record.readInt();
11960 Sizes.NumComponentLists = Record.readInt();
11961 Sizes.NumComponents = Record.readInt();
11962 C = OMPIsDevicePtrClause::CreateEmpty(Context, Sizes);
11963 break;
11964 }
11965 case llvm::omp::OMPC_allocate:
11966 C = OMPAllocateClause::CreateEmpty(Context, Record.readInt());
11967 break;
11968 case llvm::omp::OMPC_nontemporal:
11969 C = OMPNontemporalClause::CreateEmpty(Context, Record.readInt());
11970 break;
11971 case llvm::omp::OMPC_inclusive:
11972 C = OMPInclusiveClause::CreateEmpty(Context, Record.readInt());
11973 break;
11974 case llvm::omp::OMPC_exclusive:
11975 C = OMPExclusiveClause::CreateEmpty(Context, Record.readInt());
11976 break;
11977 case llvm::omp::OMPC_order:
11978 C = new (Context) OMPOrderClause();
11979 break;
11980 case llvm::omp::OMPC_init:
11981 C = OMPInitClause::CreateEmpty(Context, Record.readInt());
11982 break;
11983 case llvm::omp::OMPC_use:
11984 C = new (Context) OMPUseClause();
11985 break;
11986 case llvm::omp::OMPC_destroy:
11987 C = new (Context) OMPDestroyClause();
11988 break;
11989 case llvm::omp::OMPC_novariants:
11990 C = new (Context) OMPNovariantsClause();
11991 break;
11992 case llvm::omp::OMPC_nocontext:
11993 C = new (Context) OMPNocontextClause();
11994 break;
11995 case llvm::omp::OMPC_detach:
11996 C = new (Context) OMPDetachClause();
11997 break;
11998 case llvm::omp::OMPC_uses_allocators:
11999 C = OMPUsesAllocatorsClause::CreateEmpty(Context, Record.readInt());
12000 break;
12001 case llvm::omp::OMPC_affinity:
12002 C = OMPAffinityClause::CreateEmpty(Context, Record.readInt());
12003 break;
12004 case llvm::omp::OMPC_filter:
12005 C = new (Context) OMPFilterClause();
12006 break;
12007#define OMP_CLAUSE_NO_CLASS(Enum, Str)case llvm::omp::Enum: break; \
12008 case llvm::omp::Enum: \
12009 break;
12010#include "llvm/Frontend/OpenMP/OMPKinds.def"
12011 default:
12012 break;
11
Execution continues on line 12014
12013 }
12014 assert(C && "Unknown OMPClause type")((void)0);
12015
12016 Visit(C);
12
Passing null pointer value via 1st parameter 'S'
13
Calling 'OMPClauseVisitorBase::Visit'
12017 C->setLocStart(Record.readSourceLocation());
12018 C->setLocEnd(Record.readSourceLocation());
12019
12020 return C;
12021}
12022
12023void OMPClauseReader::VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C) {
12024 C->setPreInitStmt(Record.readSubStmt(),
12025 static_cast<OpenMPDirectiveKind>(Record.readInt()));
12026}
12027
12028void OMPClauseReader::VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C) {
12029 VisitOMPClauseWithPreInit(C);
12030 C->setPostUpdateExpr(Record.readSubExpr());
12031}
12032
12033void OMPClauseReader::VisitOMPIfClause(OMPIfClause *C) {
12034 VisitOMPClauseWithPreInit(C);
12035 C->setNameModifier(static_cast<OpenMPDirectiveKind>(Record.readInt()));
12036 C->setNameModifierLoc(Record.readSourceLocation());
12037 C->setColonLoc(Record.readSourceLocation());
12038 C->setCondition(Record.readSubExpr());
12039 C->setLParenLoc(Record.readSourceLocation());
12040}
12041
12042void OMPClauseReader::VisitOMPFinalClause(OMPFinalClause *C) {
12043 VisitOMPClauseWithPreInit(C);
12044 C->setCondition(Record.readSubExpr());
12045 C->setLParenLoc(Record.readSourceLocation());
12046}
12047
12048void OMPClauseReader::VisitOMPNumThreadsClause(OMPNumThreadsClause *C) {
12049 VisitOMPClauseWithPreInit(C);
12050 C->setNumThreads(Record.readSubExpr());
12051 C->setLParenLoc(Record.readSourceLocation());
12052}
12053
12054void OMPClauseReader::VisitOMPSafelenClause(OMPSafelenClause *C) {
12055 C->setSafelen(Record.readSubExpr());
12056 C->setLParenLoc(Record.readSourceLocation());
12057}
12058
12059void OMPClauseReader::VisitOMPSimdlenClause(OMPSimdlenClause *C) {
12060 C->setSimdlen(Record.readSubExpr());
12061 C->setLParenLoc(Record.readSourceLocation());
12062}
12063
12064void OMPClauseReader::VisitOMPSizesClause(OMPSizesClause *C) {
12065 for (Expr *&E : C->getSizesRefs())
12066 E = Record.readSubExpr();
12067 C->setLParenLoc(Record.readSourceLocation());
12068}
12069
12070void OMPClauseReader::VisitOMPFullClause(OMPFullClause *C) {}
12071
12072void OMPClauseReader::VisitOMPPartialClause(OMPPartialClause *C) {
12073 C->setFactor(Record.readSubExpr());
12074 C->setLParenLoc(Record.readSourceLocation());
12075}
12076
12077void OMPClauseReader::VisitOMPAllocatorClause(OMPAllocatorClause *C) {
12078 C->setAllocator(Record.readExpr());
12079 C->setLParenLoc(Record.readSourceLocation());
12080}
12081
12082void OMPClauseReader::VisitOMPCollapseClause(OMPCollapseClause *C) {
12083 C->setNumForLoops(Record.readSubExpr());
12084 C->setLParenLoc(Record.readSourceLocation());
12085}
12086
12087void OMPClauseReader::VisitOMPDefaultClause(OMPDefaultClause *C) {
12088 C->setDefaultKind(static_cast<llvm::omp::DefaultKind>(Record.readInt()));
12089 C->setLParenLoc(Record.readSourceLocation());
12090 C->setDefaultKindKwLoc(Record.readSourceLocation());
12091}
12092
12093void OMPClauseReader::VisitOMPProcBindClause(OMPProcBindClause *C) {
12094 C->setProcBindKind(static_cast<llvm::omp::ProcBindKind>(Record.readInt()));
12095 C->setLParenLoc(Record.readSourceLocation());
12096 C->setProcBindKindKwLoc(Record.readSourceLocation());
12097}
12098
12099void OMPClauseReader::VisitOMPScheduleClause(OMPScheduleClause *C) {
12100 VisitOMPClauseWithPreInit(C);
12101 C->setScheduleKind(
12102 static_cast<OpenMPScheduleClauseKind>(Record.readInt()));
12103 C->setFirstScheduleModifier(
12104 static_cast<OpenMPScheduleClauseModifier>(Record.readInt()));
12105 C->setSecondScheduleModifier(
12106 static_cast<OpenMPScheduleClauseModifier>(Record.readInt()));
12107 C->setChunkSize(Record.readSubExpr());
12108 C->setLParenLoc(Record.readSourceLocation());
12109 C->setFirstScheduleModifierLoc(Record.readSourceLocation());
12110 C->setSecondScheduleModifierLoc(Record.readSourceLocation());
12111 C->setScheduleKindLoc(Record.readSourceLocation());
12112 C->setCommaLoc(Record.readSourceLocation());
12113}
12114
12115void OMPClauseReader::VisitOMPOrderedClause(OMPOrderedClause *C) {
12116 C->setNumForLoops(Record.readSubExpr());
12117 for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I)
12118 C->setLoopNumIterations(I, Record.readSubExpr());
12119 for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I)
12120 C->setLoopCounter(I, Record.readSubExpr());
12121 C->setLParenLoc(Record.readSourceLocation());
12122}
12123
12124void OMPClauseReader::VisitOMPDetachClause(OMPDetachClause *C) {
12125 C->setEventHandler(Record.readSubExpr());
12126 C->setLParenLoc(Record.readSourceLocation());
12127}
12128
12129void OMPClauseReader::VisitOMPNowaitClause(OMPNowaitClause *) {}
12130
12131void OMPClauseReader::VisitOMPUntiedClause(OMPUntiedClause *) {}
12132
12133void OMPClauseReader::VisitOMPMergeableClause(OMPMergeableClause *) {}
12134
12135void OMPClauseReader::VisitOMPReadClause(OMPReadClause *) {}
12136
12137void OMPClauseReader::VisitOMPWriteClause(OMPWriteClause *) {}
12138
12139void OMPClauseReader::VisitOMPUpdateClause(OMPUpdateClause *C) {
12140 if (C->isExtended()) {
12141 C->setLParenLoc(Record.readSourceLocation());
12142 C->setArgumentLoc(Record.readSourceLocation());
12143 C->setDependencyKind(Record.readEnum<OpenMPDependClauseKind>());
12144 }
12145}
12146
12147void OMPClauseReader::VisitOMPCaptureClause(OMPCaptureClause *) {}
12148
12149void OMPClauseReader::VisitOMPSeqCstClause(OMPSeqCstClause *) {}
12150
12151void OMPClauseReader::VisitOMPAcqRelClause(OMPAcqRelClause *) {}
12152
12153void OMPClauseReader::VisitOMPAcquireClause(OMPAcquireClause *) {}
12154
12155void OMPClauseReader::VisitOMPReleaseClause(OMPReleaseClause *) {}
12156
12157void OMPClauseReader::VisitOMPRelaxedClause(OMPRelaxedClause *) {}
12158
12159void OMPClauseReader::VisitOMPThreadsClause(OMPThreadsClause *) {}
12160
12161void OMPClauseReader::VisitOMPSIMDClause(OMPSIMDClause *) {}
12162
12163void OMPClauseReader::VisitOMPNogroupClause(OMPNogroupClause *) {}
12164
12165void OMPClauseReader::VisitOMPInitClause(OMPInitClause *C) {
12166 unsigned NumVars = C->varlist_size();
12167 SmallVector<Expr *, 16> Vars;
12168 Vars.reserve(NumVars);
12169 for (unsigned I = 0; I != NumVars; ++I)
12170 Vars.push_back(Record.readSubExpr());
12171 C->setVarRefs(Vars);
12172 C->setIsTarget(Record.readBool());
12173 C->setIsTargetSync(Record.readBool());
12174 C->setLParenLoc(Record.readSourceLocation());
12175 C->setVarLoc(Record.readSourceLocation());
12176}
12177
12178void OMPClauseReader::VisitOMPUseClause(OMPUseClause *C) {
12179 C->setInteropVar(Record.readSubExpr());
12180 C->setLParenLoc(Record.readSourceLocation());
12181 C->setVarLoc(Record.readSourceLocation());
12182}
12183
12184void OMPClauseReader::VisitOMPDestroyClause(OMPDestroyClause *C) {
12185 C->setInteropVar(Record.readSubExpr());
12186 C->setLParenLoc(Record.readSourceLocation());
12187 C->setVarLoc(Record.readSourceLocation());
12188}
12189
12190void OMPClauseReader::VisitOMPNovariantsClause(OMPNovariantsClause *C) {
12191 VisitOMPClauseWithPreInit(C);
12192 C->setCondition(Record.readSubExpr());
12193 C->setLParenLoc(Record.readSourceLocation());
12194}
12195
12196void OMPClauseReader::VisitOMPNocontextClause(OMPNocontextClause *C) {
12197 VisitOMPClauseWithPreInit(C);
12198 C->setCondition(Record.readSubExpr());
12199 C->setLParenLoc(Record.readSourceLocation());
12200}
12201
12202void OMPClauseReader::VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *) {}
12203
12204void OMPClauseReader::VisitOMPUnifiedSharedMemoryClause(
12205 OMPUnifiedSharedMemoryClause *) {}
12206
12207void OMPClauseReader::VisitOMPReverseOffloadClause(OMPReverseOffloadClause *) {}
12208
12209void
12210OMPClauseReader::VisitOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause *) {
12211}
12212
12213void OMPClauseReader::VisitOMPAtomicDefaultMemOrderClause(
12214 OMPAtomicDefaultMemOrderClause *C) {
12215 C->setAtomicDefaultMemOrderKind(
12216 static_cast<OpenMPAtomicDefaultMemOrderClauseKind>(Record.readInt()));
12217 C->setLParenLoc(Record.readSourceLocation());
12218 C->setAtomicDefaultMemOrderKindKwLoc(Record.readSourceLocation());
12219}
12220
12221void OMPClauseReader::VisitOMPPrivateClause(OMPPrivateClause *C) {
12222 C->setLParenLoc(Record.readSourceLocation());
12223 unsigned NumVars = C->varlist_size();
12224 SmallVector<Expr *, 16> Vars;
12225 Vars.reserve(NumVars);
12226 for (unsigned i = 0; i != NumVars; ++i)
12227 Vars.push_back(Record.readSubExpr());
12228 C->setVarRefs(Vars);
12229 Vars.clear();
12230 for (unsigned i = 0; i != NumVars; ++i)
12231 Vars.push_back(Record.readSubExpr());
12232 C->setPrivateCopies(Vars);
12233}
12234
12235void OMPClauseReader::VisitOMPFirstprivateClause(OMPFirstprivateClause *C) {
12236 VisitOMPClauseWithPreInit(C);
12237 C->setLParenLoc(Record.readSourceLocation());
12238 unsigned NumVars = C->varlist_size();
12239 SmallVector<Expr *, 16> Vars;
12240 Vars.reserve(NumVars);
12241 for (unsigned i = 0; i != NumVars; ++i)
12242 Vars.push_back(Record.readSubExpr());
12243 C->setVarRefs(Vars);
12244 Vars.clear();
12245 for (unsigned i = 0; i != NumVars; ++i)
12246 Vars.push_back(Record.readSubExpr());
12247 C->setPrivateCopies(Vars);
12248 Vars.clear();
12249 for (unsigned i = 0; i != NumVars; ++i)
12250 Vars.push_back(Record.readSubExpr());
12251 C->setInits(Vars);
12252}
12253
12254void OMPClauseReader::VisitOMPLastprivateClause(OMPLastprivateClause *C) {
12255 VisitOMPClauseWithPostUpdate(C);
12256 C->setLParenLoc(Record.readSourceLocation());
12257 C->setKind(Record.readEnum<OpenMPLastprivateModifier>());
12258 C->setKindLoc(Record.readSourceLocation());
12259 C->setColonLoc(Record.readSourceLocation());
12260 unsigned NumVars = C->varlist_size();
12261 SmallVector<Expr *, 16> Vars;
12262 Vars.reserve(NumVars);
12263 for (unsigned i = 0; i != NumVars; ++i)
12264 Vars.push_back(Record.readSubExpr());
12265 C->setVarRefs(Vars);
12266 Vars.clear();
12267 for (unsigned i = 0; i != NumVars; ++i)
12268 Vars.push_back(Record.readSubExpr());
12269 C->setPrivateCopies(Vars);
12270 Vars.clear();
12271 for (unsigned i = 0; i != NumVars; ++i)
12272 Vars.push_back(Record.readSubExpr());
12273 C->setSourceExprs(Vars);
12274 Vars.clear();
12275 for (unsigned i = 0; i != NumVars; ++i)
12276 Vars.push_back(Record.readSubExpr());
12277 C->setDestinationExprs(Vars);
12278 Vars.clear();
12279 for (unsigned i = 0; i != NumVars; ++i)
12280 Vars.push_back(Record.readSubExpr());
12281 C->setAssignmentOps(Vars);
12282}
12283
12284void OMPClauseReader::VisitOMPSharedClause(OMPSharedClause *C) {
12285 C->setLParenLoc(Record.readSourceLocation());
12286 unsigned NumVars = C->varlist_size();
12287 SmallVector<Expr *, 16> Vars;
12288 Vars.reserve(NumVars);
12289 for (unsigned i = 0; i != NumVars; ++i)
12290 Vars.push_back(Record.readSubExpr());
12291 C->setVarRefs(Vars);
12292}
12293
12294void OMPClauseReader::VisitOMPReductionClause(OMPReductionClause *C) {
12295 VisitOMPClauseWithPostUpdate(C);
12296 C->setLParenLoc(Record.readSourceLocation());
12297 C->setModifierLoc(Record.readSourceLocation());
12298 C->setColonLoc(Record.readSourceLocation());
12299 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12300 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12301 C->setQualifierLoc(NNSL);
12302 C->setNameInfo(DNI);
12303
12304 unsigned NumVars = C->varlist_size();
12305 SmallVector<Expr *, 16> Vars;
12306 Vars.reserve(NumVars);
12307 for (unsigned i = 0; i != NumVars; ++i)
12308 Vars.push_back(Record.readSubExpr());
12309 C->setVarRefs(Vars);
12310 Vars.clear();
12311 for (unsigned i = 0; i != NumVars; ++i)
12312 Vars.push_back(Record.readSubExpr());
12313 C->setPrivates(Vars);
12314 Vars.clear();
12315 for (unsigned i = 0; i != NumVars; ++i)
12316 Vars.push_back(Record.readSubExpr());
12317 C->setLHSExprs(Vars);
12318 Vars.clear();
12319 for (unsigned i = 0; i != NumVars; ++i)
12320 Vars.push_back(Record.readSubExpr());
12321 C->setRHSExprs(Vars);
12322 Vars.clear();
12323 for (unsigned i = 0; i != NumVars; ++i)
12324 Vars.push_back(Record.readSubExpr());
12325 C->setReductionOps(Vars);
12326 if (C->getModifier() == OMPC_REDUCTION_inscan) {
12327 Vars.clear();
12328 for (unsigned i = 0; i != NumVars; ++i)
12329 Vars.push_back(Record.readSubExpr());
12330 C->setInscanCopyOps(Vars);
12331 Vars.clear();
12332 for (unsigned i = 0; i != NumVars; ++i)
12333 Vars.push_back(Record.readSubExpr());
12334 C->setInscanCopyArrayTemps(Vars);
12335 Vars.clear();
12336 for (unsigned i = 0; i != NumVars; ++i)
12337 Vars.push_back(Record.readSubExpr());
12338 C->setInscanCopyArrayElems(Vars);
12339 }
12340}
12341
12342void OMPClauseReader::VisitOMPTaskReductionClause(OMPTaskReductionClause *C) {
12343 VisitOMPClauseWithPostUpdate(C);
12344 C->setLParenLoc(Record.readSourceLocation());
12345 C->setColonLoc(Record.readSourceLocation());
12346 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12347 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12348 C->setQualifierLoc(NNSL);
12349 C->setNameInfo(DNI);
12350
12351 unsigned NumVars = C->varlist_size();
12352 SmallVector<Expr *, 16> Vars;
12353 Vars.reserve(NumVars);
12354 for (unsigned I = 0; I != NumVars; ++I)
12355 Vars.push_back(Record.readSubExpr());
12356 C->setVarRefs(Vars);
12357 Vars.clear();
12358 for (unsigned I = 0; I != NumVars; ++I)
12359 Vars.push_back(Record.readSubExpr());
12360 C->setPrivates(Vars);
12361 Vars.clear();
12362 for (unsigned I = 0; I != NumVars; ++I)
12363 Vars.push_back(Record.readSubExpr());
12364 C->setLHSExprs(Vars);
12365 Vars.clear();
12366 for (unsigned I = 0; I != NumVars; ++I)
12367 Vars.push_back(Record.readSubExpr());
12368 C->setRHSExprs(Vars);
12369 Vars.clear();
12370 for (unsigned I = 0; I != NumVars; ++I)
12371 Vars.push_back(Record.readSubExpr());
12372 C->setReductionOps(Vars);
12373}
12374
12375void OMPClauseReader::VisitOMPInReductionClause(OMPInReductionClause *C) {
12376 VisitOMPClauseWithPostUpdate(C);
12377 C->setLParenLoc(Record.readSourceLocation());
12378 C->setColonLoc(Record.readSourceLocation());
12379 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12380 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12381 C->setQualifierLoc(NNSL);
12382 C->setNameInfo(DNI);
12383
12384 unsigned NumVars = C->varlist_size();
12385 SmallVector<Expr *, 16> Vars;
12386 Vars.reserve(NumVars);
12387 for (unsigned I = 0; I != NumVars; ++I)
12388 Vars.push_back(Record.readSubExpr());
12389 C->setVarRefs(Vars);
12390 Vars.clear();
12391 for (unsigned I = 0; I != NumVars; ++I)
12392 Vars.push_back(Record.readSubExpr());
12393 C->setPrivates(Vars);
12394 Vars.clear();
12395 for (unsigned I = 0; I != NumVars; ++I)
12396 Vars.push_back(Record.readSubExpr());
12397 C->setLHSExprs(Vars);
12398 Vars.clear();
12399 for (unsigned I = 0; I != NumVars; ++I)
12400 Vars.push_back(Record.readSubExpr());
12401 C->setRHSExprs(Vars);
12402 Vars.clear();
12403 for (unsigned I = 0; I != NumVars; ++I)
12404 Vars.push_back(Record.readSubExpr());
12405 C->setReductionOps(Vars);
12406 Vars.clear();
12407 for (unsigned I = 0; I != NumVars; ++I)
12408 Vars.push_back(Record.readSubExpr());
12409 C->setTaskgroupDescriptors(Vars);
12410}
12411
12412void OMPClauseReader::VisitOMPLinearClause(OMPLinearClause *C) {
12413 VisitOMPClauseWithPostUpdate(C);
12414 C->setLParenLoc(Record.readSourceLocation());
12415 C->setColonLoc(Record.readSourceLocation());
12416 C->setModifier(static_cast<OpenMPLinearClauseKind>(Record.readInt()));
12417 C->setModifierLoc(Record.readSourceLocation());
12418 unsigned NumVars = C->varlist_size();
12419 SmallVector<Expr *, 16> Vars;
12420 Vars.reserve(NumVars);
12421 for (unsigned i = 0; i != NumVars; ++i)
12422 Vars.push_back(Record.readSubExpr());
12423 C->setVarRefs(Vars);
12424 Vars.clear();
12425 for (unsigned i = 0; i != NumVars; ++i)
12426 Vars.push_back(Record.readSubExpr());
12427 C->setPrivates(Vars);
12428 Vars.clear();
12429 for (unsigned i = 0; i != NumVars; ++i)
12430 Vars.push_back(Record.readSubExpr());
12431 C->setInits(Vars);
12432 Vars.clear();
12433 for (unsigned i = 0; i != NumVars; ++i)
12434 Vars.push_back(Record.readSubExpr());
12435 C->setUpdates(Vars);
12436 Vars.clear();
12437 for (unsigned i = 0; i != NumVars; ++i)
12438 Vars.push_back(Record.readSubExpr());
12439 C->setFinals(Vars);
12440 C->setStep(Record.readSubExpr());
12441 C->setCalcStep(Record.readSubExpr());
12442 Vars.clear();
12443 for (unsigned I = 0; I != NumVars + 1; ++I)
12444 Vars.push_back(Record.readSubExpr());
12445 C->setUsedExprs(Vars);
12446}
12447
12448void OMPClauseReader::VisitOMPAlignedClause(OMPAlignedClause *C) {
12449 C->setLParenLoc(Record.readSourceLocation());
12450 C->setColonLoc(Record.readSourceLocation());
12451 unsigned NumVars = C->varlist_size();
12452 SmallVector<Expr *, 16> Vars;
12453 Vars.reserve(NumVars);
12454 for (unsigned i = 0; i != NumVars; ++i)
12455 Vars.push_back(Record.readSubExpr());
12456 C->setVarRefs(Vars);
12457 C->setAlignment(Record.readSubExpr());
12458}
12459
12460void OMPClauseReader::VisitOMPCopyinClause(OMPCopyinClause *C) {
12461 C->setLParenLoc(Record.readSourceLocation());
12462 unsigned NumVars = C->varlist_size();
12463 SmallVector<Expr *, 16> Exprs;
12464 Exprs.reserve(NumVars);
12465 for (unsigned i = 0; i != NumVars; ++i)
12466 Exprs.push_back(Record.readSubExpr());
12467 C->setVarRefs(Exprs);
12468 Exprs.clear();
12469 for (unsigned i = 0; i != NumVars; ++i)
12470 Exprs.push_back(Record.readSubExpr());
12471 C->setSourceExprs(Exprs);
12472 Exprs.clear();
12473 for (unsigned i = 0; i != NumVars; ++i)
12474 Exprs.push_back(Record.readSubExpr());
12475 C->setDestinationExprs(Exprs);
12476 Exprs.clear();
12477 for (unsigned i = 0; i != NumVars; ++i)
12478 Exprs.push_back(Record.readSubExpr());
12479 C->setAssignmentOps(Exprs);
12480}
12481
12482void OMPClauseReader::VisitOMPCopyprivateClause(OMPCopyprivateClause *C) {
12483 C->setLParenLoc(Record.readSourceLocation());
12484 unsigned NumVars = C->varlist_size();
12485 SmallVector<Expr *, 16> Exprs;
12486 Exprs.reserve(NumVars);
12487 for (unsigned i = 0; i != NumVars; ++i)
12488 Exprs.push_back(Record.readSubExpr());
12489 C->setVarRefs(Exprs);
12490 Exprs.clear();
12491 for (unsigned i = 0; i != NumVars; ++i)
12492 Exprs.push_back(Record.readSubExpr());
12493 C->setSourceExprs(Exprs);
12494 Exprs.clear();
12495 for (unsigned i = 0; i != NumVars; ++i)
12496 Exprs.push_back(Record.readSubExpr());
12497 C->setDestinationExprs(Exprs);
12498 Exprs.clear();
12499 for (unsigned i = 0; i != NumVars; ++i)
12500 Exprs.push_back(Record.readSubExpr());
12501 C->setAssignmentOps(Exprs);
12502}
12503
12504void OMPClauseReader::VisitOMPFlushClause(OMPFlushClause *C) {
12505 C->setLParenLoc(Record.readSourceLocation());
12506 unsigned NumVars = C->varlist_size();
12507 SmallVector<Expr *, 16> Vars;
12508 Vars.reserve(NumVars);
12509 for (unsigned i = 0; i != NumVars; ++i)
12510 Vars.push_back(Record.readSubExpr());
12511 C->setVarRefs(Vars);
12512}
12513
12514void OMPClauseReader::VisitOMPDepobjClause(OMPDepobjClause *C) {
12515 C->setDepobj(Record.readSubExpr());
12516 C->setLParenLoc(Record.readSourceLocation());
12517}
12518
12519void OMPClauseReader::VisitOMPDependClause(OMPDependClause *C) {
12520 C->setLParenLoc(Record.readSourceLocation());
12521 C->setModifier(Record.readSubExpr());
12522 C->setDependencyKind(
12523 static_cast<OpenMPDependClauseKind>(Record.readInt()));
12524 C->setDependencyLoc(Record.readSourceLocation());
12525 C->setColonLoc(Record.readSourceLocation());
12526 unsigned NumVars = C->varlist_size();
12527 SmallVector<Expr *, 16> Vars;
12528 Vars.reserve(NumVars);
12529 for (unsigned I = 0; I != NumVars; ++I)
12530 Vars.push_back(Record.readSubExpr());
12531 C->setVarRefs(Vars);
12532 for (unsigned I = 0, E = C->getNumLoops(); I < E; ++I)
12533 C->setLoopData(I, Record.readSubExpr());
12534}
12535
12536void OMPClauseReader::VisitOMPDeviceClause(OMPDeviceClause *C) {
12537 VisitOMPClauseWithPreInit(C);
12538 C->setModifier(Record.readEnum<OpenMPDeviceClauseModifier>());
12539 C->setDevice(Record.readSubExpr());
12540 C->setModifierLoc(Record.readSourceLocation());
12541 C->setLParenLoc(Record.readSourceLocation());
12542}
12543
12544void OMPClauseReader::VisitOMPMapClause(OMPMapClause *C) {
12545 C->setLParenLoc(Record.readSourceLocation());
12546 for (unsigned I = 0; I < NumberOfOMPMapClauseModifiers; ++I) {
12547 C->setMapTypeModifier(
12548 I, static_cast<OpenMPMapModifierKind>(Record.readInt()));
12549 C->setMapTypeModifierLoc(I, Record.readSourceLocation());
12550 }
12551 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12552 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12553 C->setMapType(
12554 static_cast<OpenMPMapClauseKind>(Record.readInt()));
12555 C->setMapLoc(Record.readSourceLocation());
12556 C->setColonLoc(Record.readSourceLocation());
12557 auto NumVars = C->varlist_size();
12558 auto UniqueDecls = C->getUniqueDeclarationsNum();
12559 auto TotalLists = C->getTotalComponentListNum();
12560 auto TotalComponents = C->getTotalComponentsNum();
12561
12562 SmallVector<Expr *, 16> Vars;
12563 Vars.reserve(NumVars);
12564 for (unsigned i = 0; i != NumVars; ++i)
12565 Vars.push_back(Record.readExpr());
12566 C->setVarRefs(Vars);
12567
12568 SmallVector<Expr *, 16> UDMappers;
12569 UDMappers.reserve(NumVars);
12570 for (unsigned I = 0; I < NumVars; ++I)
12571 UDMappers.push_back(Record.readExpr());
12572 C->setUDMapperRefs(UDMappers);
12573
12574 SmallVector<ValueDecl *, 16> Decls;
12575 Decls.reserve(UniqueDecls);
12576 for (unsigned i = 0; i < UniqueDecls; ++i)
12577 Decls.push_back(Record.readDeclAs<ValueDecl>());
12578 C->setUniqueDecls(Decls);
12579
12580 SmallVector<unsigned, 16> ListsPerDecl;
12581 ListsPerDecl.reserve(UniqueDecls);
12582 for (unsigned i = 0; i < UniqueDecls; ++i)
12583 ListsPerDecl.push_back(Record.readInt());
12584 C->setDeclNumLists(ListsPerDecl);
12585
12586 SmallVector<unsigned, 32> ListSizes;
12587 ListSizes.reserve(TotalLists);
12588 for (unsigned i = 0; i < TotalLists; ++i)
12589 ListSizes.push_back(Record.readInt());
12590 C->setComponentListSizes(ListSizes);
12591
12592 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12593 Components.reserve(TotalComponents);
12594 for (unsigned i = 0; i < TotalComponents; ++i) {
12595 Expr *AssociatedExprPr = Record.readExpr();
12596 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12597 Components.emplace_back(AssociatedExprPr, AssociatedDecl,
12598 /*IsNonContiguous=*/false);
12599 }
12600 C->setComponents(Components, ListSizes);
12601}
12602
12603void OMPClauseReader::VisitOMPAllocateClause(OMPAllocateClause *C) {
12604 C->setLParenLoc(Record.readSourceLocation());
12605 C->setColonLoc(Record.readSourceLocation());
12606 C->setAllocator(Record.readSubExpr());
12607 unsigned NumVars = C->varlist_size();
12608 SmallVector<Expr *, 16> Vars;
12609 Vars.reserve(NumVars);
12610 for (unsigned i = 0; i != NumVars; ++i)
12611 Vars.push_back(Record.readSubExpr());
12612 C->setVarRefs(Vars);
12613}
12614
12615void OMPClauseReader::VisitOMPNumTeamsClause(OMPNumTeamsClause *C) {
12616 VisitOMPClauseWithPreInit(C);
12617 C->setNumTeams(Record.readSubExpr());
12618 C->setLParenLoc(Record.readSourceLocation());
12619}
12620
12621void OMPClauseReader::VisitOMPThreadLimitClause(OMPThreadLimitClause *C) {
12622 VisitOMPClauseWithPreInit(C);
12623 C->setThreadLimit(Record.readSubExpr());
12624 C->setLParenLoc(Record.readSourceLocation());
12625}
12626
12627void OMPClauseReader::VisitOMPPriorityClause(OMPPriorityClause *C) {
12628 VisitOMPClauseWithPreInit(C);
12629 C->setPriority(Record.readSubExpr());
12630 C->setLParenLoc(Record.readSourceLocation());
12631}
12632
12633void OMPClauseReader::VisitOMPGrainsizeClause(OMPGrainsizeClause *C) {
12634 VisitOMPClauseWithPreInit(C);
12635 C->setGrainsize(Record.readSubExpr());
12636 C->setLParenLoc(Record.readSourceLocation());
12637}
12638
12639void OMPClauseReader::VisitOMPNumTasksClause(OMPNumTasksClause *C) {
12640 VisitOMPClauseWithPreInit(C);
12641 C->setNumTasks(Record.readSubExpr());
12642 C->setLParenLoc(Record.readSourceLocation());
12643}
12644
12645void OMPClauseReader::VisitOMPHintClause(OMPHintClause *C) {
12646 C->setHint(Record.readSubExpr());
12647 C->setLParenLoc(Record.readSourceLocation());
12648}
12649
12650void OMPClauseReader::VisitOMPDistScheduleClause(OMPDistScheduleClause *C) {
12651 VisitOMPClauseWithPreInit(C);
12652 C->setDistScheduleKind(
12653 static_cast<OpenMPDistScheduleClauseKind>(Record.readInt()));
12654 C->setChunkSize(Record.readSubExpr());
12655 C->setLParenLoc(Record.readSourceLocation());
12656 C->setDistScheduleKindLoc(Record.readSourceLocation());
12657 C->setCommaLoc(Record.readSourceLocation());
12658}
12659
12660void OMPClauseReader::VisitOMPDefaultmapClause(OMPDefaultmapClause *C) {
12661 C->setDefaultmapKind(
12662 static_cast<OpenMPDefaultmapClauseKind>(Record.readInt()));
12663 C->setDefaultmapModifier(
12664 static_cast<OpenMPDefaultmapClauseModifier>(Record.readInt()));
12665 C->setLParenLoc(Record.readSourceLocation());
12666 C->setDefaultmapModifierLoc(Record.readSourceLocation());
12667 C->setDefaultmapKindLoc(Record.readSourceLocation());
12668}
12669
12670void OMPClauseReader::VisitOMPToClause(OMPToClause *C) {
12671 C->setLParenLoc(Record.readSourceLocation());
12672 for (unsigned I = 0; I < NumberOfOMPMotionModifiers; ++I) {
12673 C->setMotionModifier(
12674 I, static_cast<OpenMPMotionModifierKind>(Record.readInt()));
12675 C->setMotionModifierLoc(I, Record.readSourceLocation());
12676 }
12677 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12678 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12679 C->setColonLoc(Record.readSourceLocation());
12680 auto NumVars = C->varlist_size();
12681 auto UniqueDecls = C->getUniqueDeclarationsNum();
12682 auto TotalLists = C->getTotalComponentListNum();
12683 auto TotalComponents = C->getTotalComponentsNum();
12684
12685 SmallVector<Expr *, 16> Vars;
12686 Vars.reserve(NumVars);
12687 for (unsigned i = 0; i != NumVars; ++i)
12688 Vars.push_back(Record.readSubExpr());
12689 C->setVarRefs(Vars);
12690
12691 SmallVector<Expr *, 16> UDMappers;
12692 UDMappers.reserve(NumVars);
12693 for (unsigned I = 0; I < NumVars; ++I)
12694 UDMappers.push_back(Record.readSubExpr());
12695 C->setUDMapperRefs(UDMappers);
12696
12697 SmallVector<ValueDecl *, 16> Decls;
12698 Decls.reserve(UniqueDecls);
12699 for (unsigned i = 0; i < UniqueDecls; ++i)
12700 Decls.push_back(Record.readDeclAs<ValueDecl>());
12701 C->setUniqueDecls(Decls);
12702
12703 SmallVector<unsigned, 16> ListsPerDecl;
12704 ListsPerDecl.reserve(UniqueDecls);
12705 for (unsigned i = 0; i < UniqueDecls; ++i)
12706 ListsPerDecl.push_back(Record.readInt());
12707 C->setDeclNumLists(ListsPerDecl);
12708
12709 SmallVector<unsigned, 32> ListSizes;
12710 ListSizes.reserve(TotalLists);
12711 for (unsigned i = 0; i < TotalLists; ++i)
12712 ListSizes.push_back(Record.readInt());
12713 C->setComponentListSizes(ListSizes);
12714
12715 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12716 Components.reserve(TotalComponents);
12717 for (unsigned i = 0; i < TotalComponents; ++i) {
12718 Expr *AssociatedExprPr = Record.readSubExpr();
12719 bool IsNonContiguous = Record.readBool();
12720 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12721 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
12722 }
12723 C->setComponents(Components, ListSizes);
12724}
12725
12726void OMPClauseReader::VisitOMPFromClause(OMPFromClause *C) {
12727 C->setLParenLoc(Record.readSourceLocation());
12728 for (unsigned I = 0; I < NumberOfOMPMotionModifiers; ++I) {
12729 C->setMotionModifier(
12730 I, static_cast<OpenMPMotionModifierKind>(Record.readInt()));
12731 C->setMotionModifierLoc(I, Record.readSourceLocation());
12732 }
12733 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12734 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12735 C->setColonLoc(Record.readSourceLocation());
12736 auto NumVars = C->varlist_size();
12737 auto UniqueDecls = C->getUniqueDeclarationsNum();
12738 auto TotalLists = C->getTotalComponentListNum();
12739 auto TotalComponents = C->getTotalComponentsNum();
12740
12741 SmallVector<Expr *, 16> Vars;
12742 Vars.reserve(NumVars);
12743 for (unsigned i = 0; i != NumVars; ++i)
12744 Vars.push_back(Record.readSubExpr());
12745 C->setVarRefs(Vars);
12746
12747 SmallVector<Expr *, 16> UDMappers;
12748 UDMappers.reserve(NumVars);
12749 for (unsigned I = 0; I < NumVars; ++I)
12750 UDMappers.push_back(Record.readSubExpr());
12751 C->setUDMapperRefs(UDMappers);
12752
12753 SmallVector<ValueDecl *, 16> Decls;
12754 Decls.reserve(UniqueDecls);
12755 for (unsigned i = 0; i < UniqueDecls; ++i)
12756 Decls.push_back(Record.readDeclAs<ValueDecl>());
12757 C->setUniqueDecls(Decls);
12758
12759 SmallVector<unsigned, 16> ListsPerDecl;
12760 ListsPerDecl.reserve(UniqueDecls);
12761 for (unsigned i = 0; i < UniqueDecls; ++i)
12762 ListsPerDecl.push_back(Record.readInt());
12763 C->setDeclNumLists(ListsPerDecl);
12764
12765 SmallVector<unsigned, 32> ListSizes;
12766 ListSizes.reserve(TotalLists);
12767 for (unsigned i = 0; i < TotalLists; ++i)
12768 ListSizes.push_back(Record.readInt());
12769 C->setComponentListSizes(ListSizes);
12770
12771 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12772 Components.reserve(TotalComponents);
12773 for (unsigned i = 0; i < TotalComponents; ++i) {
12774 Expr *AssociatedExprPr = Record.readSubExpr();
12775 bool IsNonContiguous = Record.readBool();
12776 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12777 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
12778 }
12779 C->setComponents(Components, ListSizes);
12780}
12781
12782void OMPClauseReader::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *C) {
12783 C->setLParenLoc(Record.readSourceLocation());
12784 auto NumVars = C->varlist_size();
12785 auto UniqueDecls = C->getUniqueDeclarationsNum();
12786 auto TotalLists = C->getTotalComponentListNum();
12787 auto TotalComponents = C->getTotalComponentsNum();
12788
12789 SmallVector<Expr *, 16> Vars;
12790 Vars.reserve(NumVars);
12791 for (unsigned i = 0; i != NumVars; ++i)
12792 Vars.push_back(Record.readSubExpr());
12793 C->setVarRefs(Vars);
12794 Vars.clear();
12795 for (unsigned i = 0; i != NumVars; ++i)
12796 Vars.push_back(Record.readSubExpr());
12797 C->setPrivateCopies(Vars);
12798 Vars.clear();
12799 for (unsigned i = 0; i != NumVars; ++i)
12800 Vars.push_back(Record.readSubExpr());
12801 C->setInits(Vars);
12802
12803 SmallVector<ValueDecl *, 16> Decls;
12804 Decls.reserve(UniqueDecls);
12805 for (unsigned i = 0; i < UniqueDecls; ++i)
12806 Decls.push_back(Record.readDeclAs<ValueDecl>());
12807 C->setUniqueDecls(Decls);
12808
12809 SmallVector<unsigned, 16> ListsPerDecl;
12810 ListsPerDecl.reserve(UniqueDecls);
12811 for (unsigned i = 0; i < UniqueDecls; ++i)
12812 ListsPerDecl.push_back(Record.readInt());
12813 C->setDeclNumLists(ListsPerDecl);
12814
12815 SmallVector<unsigned, 32> ListSizes;
12816 ListSizes.reserve(TotalLists);
12817 for (unsigned i = 0; i < TotalLists; ++i)
12818 ListSizes.push_back(Record.readInt());
12819 C->setComponentListSizes(ListSizes);
12820
12821 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12822 Components.reserve(TotalComponents);
12823 for (unsigned i = 0; i < TotalComponents; ++i) {
12824 auto *AssociatedExprPr = Record.readSubExpr();
12825 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12826 Components.emplace_back(AssociatedExprPr, AssociatedDecl,
12827 /*IsNonContiguous=*/false);
12828 }
12829 C->setComponents(Components, ListSizes);
12830}
12831
12832void OMPClauseReader::VisitOMPUseDeviceAddrClause(OMPUseDeviceAddrClause *C) {
12833 C->setLParenLoc(Record.readSourceLocation());
12834 auto NumVars = C->varlist_size();
12835 auto UniqueDecls = C->getUniqueDeclarationsNum();
12836 auto TotalLists = C->getTotalComponentListNum();
12837 auto TotalComponents = C->getTotalComponentsNum();
12838
12839 SmallVector<Expr *, 16> Vars;
12840 Vars.reserve(NumVars);
12841 for (unsigned i = 0; i != NumVars; ++i)
12842 Vars.push_back(Record.readSubExpr());
12843 C->setVarRefs(Vars);
12844
12845 SmallVector<ValueDecl *, 16> Decls;
12846 Decls.reserve(UniqueDecls);
12847 for (unsigned i = 0; i < UniqueDecls; ++i)
12848 Decls.push_back(Record.readDeclAs<ValueDecl>());
12849 C->setUniqueDecls(Decls);
12850
12851 SmallVector<unsigned, 16> ListsPerDecl;
12852 ListsPerDecl.reserve(UniqueDecls);
12853 for (unsigned i = 0; i < UniqueDecls; ++i)
12854 ListsPerDecl.push_back(Record.readInt());
12855 C->setDeclNumLists(ListsPerDecl);
12856
12857 SmallVector<unsigned, 32> ListSizes;
12858 ListSizes.reserve(TotalLists);
12859 for (unsigned i = 0; i < TotalLists; ++i)
12860 ListSizes.push_back(Record.readInt());
12861 C->setComponentListSizes(ListSizes);
12862
12863 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12864 Components.reserve(TotalComponents);
12865 for (unsigned i = 0; i < TotalComponents; ++i) {
12866 Expr *AssociatedExpr = Record.readSubExpr();
12867 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12868 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12869 /*IsNonContiguous*/ false);
12870 }
12871 C->setComponents(Components, ListSizes);
12872}
12873
12874void OMPClauseReader::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
12875 C->setLParenLoc(Record.readSourceLocation());
12876 auto NumVars = C->varlist_size();
12877 auto UniqueDecls = C->getUniqueDeclarationsNum();
12878 auto TotalLists = C->getTotalComponentListNum();
12879 auto TotalComponents = C->getTotalComponentsNum();
12880
12881 SmallVector<Expr *, 16> Vars;
12882 Vars.reserve(NumVars);
12883 for (unsigned i = 0; i != NumVars; ++i)
12884 Vars.push_back(Record.readSubExpr());
12885 C->setVarRefs(Vars);
12886 Vars.clear();
12887
12888 SmallVector<ValueDecl *, 16> Decls;
12889 Decls.reserve(UniqueDecls);
12890 for (unsigned i = 0; i < UniqueDecls; ++i)
12891 Decls.push_back(Record.readDeclAs<ValueDecl>());
12892 C->setUniqueDecls(Decls);
12893
12894 SmallVector<unsigned, 16> ListsPerDecl;
12895 ListsPerDecl.reserve(UniqueDecls);
12896 for (unsigned i = 0; i < UniqueDecls; ++i)
12897 ListsPerDecl.push_back(Record.readInt());
12898 C->setDeclNumLists(ListsPerDecl);
12899
12900 SmallVector<unsigned, 32> ListSizes;
12901 ListSizes.reserve(TotalLists);
12902 for (unsigned i = 0; i < TotalLists; ++i)
12903 ListSizes.push_back(Record.readInt());
12904 C->setComponentListSizes(ListSizes);
12905
12906 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12907 Components.reserve(TotalComponents);
12908 for (unsigned i = 0; i < TotalComponents; ++i) {
12909 Expr *AssociatedExpr = Record.readSubExpr();
12910 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12911 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12912 /*IsNonContiguous=*/false);
12913 }
12914 C->setComponents(Components, ListSizes);
12915}
12916
12917void OMPClauseReader::VisitOMPNontemporalClause(OMPNontemporalClause *C) {
12918 C->setLParenLoc(Record.readSourceLocation());
12919 unsigned NumVars = C->varlist_size();
12920 SmallVector<Expr *, 16> Vars;
12921 Vars.reserve(NumVars);
12922 for (unsigned i = 0; i != NumVars; ++i)
12923 Vars.push_back(Record.readSubExpr());
12924 C->setVarRefs(Vars);
12925 Vars.clear();
12926 Vars.reserve(NumVars);
12927 for (unsigned i = 0; i != NumVars; ++i)
12928 Vars.push_back(Record.readSubExpr());
12929 C->setPrivateRefs(Vars);
12930}
12931
12932void OMPClauseReader::VisitOMPInclusiveClause(OMPInclusiveClause *C) {
12933 C->setLParenLoc(Record.readSourceLocation());
12934 unsigned NumVars = C->varlist_size();
12935 SmallVector<Expr *, 16> Vars;
12936 Vars.reserve(NumVars);
12937 for (unsigned i = 0; i != NumVars; ++i)
12938 Vars.push_back(Record.readSubExpr());
12939 C->setVarRefs(Vars);
12940}
12941
12942void OMPClauseReader::VisitOMPExclusiveClause(OMPExclusiveClause *C) {
12943 C->setLParenLoc(Record.readSourceLocation());
12944 unsigned NumVars = C->varlist_size();
12945 SmallVector<Expr *, 16> Vars;
12946 Vars.reserve(NumVars);
12947 for (unsigned i = 0; i != NumVars; ++i)
12948 Vars.push_back(Record.readSubExpr());
12949 C->setVarRefs(Vars);
12950}
12951
12952void OMPClauseReader::VisitOMPUsesAllocatorsClause(OMPUsesAllocatorsClause *C) {
12953 C->setLParenLoc(Record.readSourceLocation());
12954 unsigned NumOfAllocators = C->getNumberOfAllocators();
12955 SmallVector<OMPUsesAllocatorsClause::Data, 4> Data;
12956 Data.reserve(NumOfAllocators);
12957 for (unsigned I = 0; I != NumOfAllocators; ++I) {
12958 OMPUsesAllocatorsClause::Data &D = Data.emplace_back();
12959 D.Allocator = Record.readSubExpr();
12960 D.AllocatorTraits = Record.readSubExpr();
12961 D.LParenLoc = Record.readSourceLocation();
12962 D.RParenLoc = Record.readSourceLocation();
12963 }
12964 C->setAllocatorsData(Data);
12965}
12966
12967void OMPClauseReader::VisitOMPAffinityClause(OMPAffinityClause *C) {
12968 C->setLParenLoc(Record.readSourceLocation());
12969 C->setModifier(Record.readSubExpr());
12970 C->setColonLoc(Record.readSourceLocation());
12971 unsigned NumOfLocators = C->varlist_size();
12972 SmallVector<Expr *, 4> Locators;
12973 Locators.reserve(NumOfLocators);
12974 for (unsigned I = 0; I != NumOfLocators; ++I)
12975 Locators.push_back(Record.readSubExpr());
12976 C->setVarRefs(Locators);
12977}
12978
12979void OMPClauseReader::VisitOMPOrderClause(OMPOrderClause *C) {
12980 C->setKind(Record.readEnum<OpenMPOrderClauseKind>());
12981 C->setLParenLoc(Record.readSourceLocation());
12982 C->setKindKwLoc(Record.readSourceLocation());
12983}
12984
12985void OMPClauseReader::VisitOMPFilterClause(OMPFilterClause *C) {
12986 VisitOMPClauseWithPreInit(C);
12987 C->setThreadID(Record.readSubExpr());
12988 C->setLParenLoc(Record.readSourceLocation());
12989}
12990
12991OMPTraitInfo *ASTRecordReader::readOMPTraitInfo() {
12992 OMPTraitInfo &TI = getContext().getNewOMPTraitInfo();
12993 TI.Sets.resize(readUInt32());
12994 for (auto &Set : TI.Sets) {
12995 Set.Kind = readEnum<llvm::omp::TraitSet>();
12996 Set.Selectors.resize(readUInt32());
12997 for (auto &Selector : Set.Selectors) {
12998 Selector.Kind = readEnum<llvm::omp::TraitSelector>();
12999 Selector.ScoreOrCondition = nullptr;
13000 if (readBool())
13001 Selector.ScoreOrCondition = readExprRef();
13002 Selector.Properties.resize(readUInt32());
13003 for (auto &Property : Selector.Properties)
13004 Property.Kind = readEnum<llvm::omp::TraitProperty>();
13005 }
13006 }
13007 return &TI;
13008}
13009
13010void ASTRecordReader::readOMPChildren(OMPChildren *Data) {
13011 if (!Data)
1
Assuming 'Data' is non-null
2
Taking false branch
13012 return;
13013 if (Reader->ReadingKind == ASTReader::Read_Stmt) {
3
Assuming field 'ReadingKind' is not equal to Read_Stmt
4
Taking false branch
13014 // Skip NumClauses, NumChildren and HasAssociatedStmt fields.
13015 skipInts(3);
13016 }
13017 SmallVector<OMPClause *, 4> Clauses(Data->getNumClauses());
13018 for (unsigned I = 0, E = Data->getNumClauses(); I < E; ++I)
5
Assuming 'I' is < 'E'
6
Loop condition is true. Entering loop body
13019 Clauses[I] = readOMPClause();
7
Calling 'ASTRecordReader::readOMPClause'
13020 Data->setClauses(Clauses);
13021 if (Data->hasAssociatedStmt())
13022 Data->setAssociatedStmt(readStmt());
13023 for (unsigned I = 0, E = Data->getNumChildren(); I < E; ++I)
13024 Data->getChildren()[I] = readStmt();
13025}

/usr/src/gnu/usr.bin/clang/libclangSerialization/../../../llvm/clang/include/clang/AST/OpenMPClause.h

1//===- OpenMPClause.h - Classes for OpenMP clauses --------------*- 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/// \file
10/// This file defines OpenMP AST classes for clauses.
11/// There are clauses for executable directives, clauses for declarative
12/// directives and clauses which can be used in both kinds of directives.
13//
14//===----------------------------------------------------------------------===//
15
16#ifndef LLVM_CLANG_AST_OPENMPCLAUSE_H
17#define LLVM_CLANG_AST_OPENMPCLAUSE_H
18
19#include "clang/AST/ASTFwd.h"
20#include "clang/AST/Decl.h"
21#include "clang/AST/DeclarationName.h"
22#include "clang/AST/Expr.h"
23#include "clang/AST/NestedNameSpecifier.h"
24#include "clang/AST/Stmt.h"
25#include "clang/AST/StmtIterator.h"
26#include "clang/Basic/LLVM.h"
27#include "clang/Basic/OpenMPKinds.h"
28#include "clang/Basic/SourceLocation.h"
29#include "llvm/ADT/ArrayRef.h"
30#include "llvm/ADT/MapVector.h"
31#include "llvm/ADT/PointerIntPair.h"
32#include "llvm/ADT/SmallVector.h"
33#include "llvm/ADT/iterator.h"
34#include "llvm/ADT/iterator_range.h"
35#include "llvm/Frontend/OpenMP/OMPConstants.h"
36#include "llvm/Frontend/OpenMP/OMPContext.h"
37#include "llvm/Support/Casting.h"
38#include "llvm/Support/Compiler.h"
39#include "llvm/Support/TrailingObjects.h"
40#include <cassert>
41#include <cstddef>
42#include <iterator>
43#include <utility>
44
45namespace clang {
46
47class ASTContext;
48
49//===----------------------------------------------------------------------===//
50// AST classes for clauses.
51//===----------------------------------------------------------------------===//
52
53/// This is a basic class for representing single OpenMP clause.
54class OMPClause {
55 /// Starting location of the clause (the clause keyword).
56 SourceLocation StartLoc;
57
58 /// Ending location of the clause.
59 SourceLocation EndLoc;
60
61 /// Kind of the clause.
62 OpenMPClauseKind Kind;
63
64protected:
65 OMPClause(OpenMPClauseKind K, SourceLocation StartLoc, SourceLocation EndLoc)
66 : StartLoc(StartLoc), EndLoc(EndLoc), Kind(K) {}
67
68public:
69 /// Returns the starting location of the clause.
70 SourceLocation getBeginLoc() const { return StartLoc; }
71
72 /// Returns the ending location of the clause.
73 SourceLocation getEndLoc() const { return EndLoc; }
74
75 /// Sets the starting location of the clause.
76 void setLocStart(SourceLocation Loc) { StartLoc = Loc; }
77
78 /// Sets the ending location of the clause.
79 void setLocEnd(SourceLocation Loc) { EndLoc = Loc; }
80
81 /// Returns kind of OpenMP clause (private, shared, reduction, etc.).
82 OpenMPClauseKind getClauseKind() const { return Kind; }
83
84 bool isImplicit() const { return StartLoc.isInvalid(); }
85
86 using child_iterator = StmtIterator;
87 using const_child_iterator = ConstStmtIterator;
88 using child_range = llvm::iterator_range<child_iterator>;
89 using const_child_range = llvm::iterator_range<const_child_iterator>;
90
91 child_range children();
92 const_child_range children() const {
93 auto Children = const_cast<OMPClause *>(this)->children();
94 return const_child_range(Children.begin(), Children.end());
95 }
96
97 /// Get the iterator range for the expressions used in the clauses. Used
98 /// expressions include only the children that must be evaluated at the
99 /// runtime before entering the construct.
100 child_range used_children();
101 const_child_range used_children() const {
102 auto Children = const_cast<OMPClause *>(this)->children();
103 return const_child_range(Children.begin(), Children.end());
104 }
105
106 static bool classof(const OMPClause *) { return true; }
107};
108
109/// Class that handles pre-initialization statement for some clauses, like
110/// 'shedule', 'firstprivate' etc.
111class OMPClauseWithPreInit {
112 friend class OMPClauseReader;
113
114 /// Pre-initialization statement for the clause.
115 Stmt *PreInit = nullptr;
116
117 /// Region that captures the associated stmt.
118 OpenMPDirectiveKind CaptureRegion = llvm::omp::OMPD_unknown;
119
120protected:
121 OMPClauseWithPreInit(const OMPClause *This) {
122 assert(get(This) && "get is not tuned for pre-init.")((void)0);
123 }
124
125 /// Set pre-initialization statement for the clause.
126 void
127 setPreInitStmt(Stmt *S,
128 OpenMPDirectiveKind ThisRegion = llvm::omp::OMPD_unknown) {
129 PreInit = S;
130 CaptureRegion = ThisRegion;
131 }
132
133public:
134 /// Get pre-initialization statement for the clause.
135 const Stmt *getPreInitStmt() const { return PreInit; }
136
137 /// Get pre-initialization statement for the clause.
138 Stmt *getPreInitStmt() { return PreInit; }
139
140 /// Get capture region for the stmt in the clause.
141 OpenMPDirectiveKind getCaptureRegion() const { return CaptureRegion; }
142
143 static OMPClauseWithPreInit *get(OMPClause *C);
144 static const OMPClauseWithPreInit *get(const OMPClause *C);
145};
146
147/// Class that handles post-update expression for some clauses, like
148/// 'lastprivate', 'reduction' etc.
149class OMPClauseWithPostUpdate : public OMPClauseWithPreInit {
150 friend class OMPClauseReader;
151
152 /// Post-update expression for the clause.
153 Expr *PostUpdate = nullptr;
154
155protected:
156 OMPClauseWithPostUpdate(const OMPClause *This) : OMPClauseWithPreInit(This) {
157 assert(get(This) && "get is not tuned for post-update.")((void)0);
158 }
159
160 /// Set pre-initialization statement for the clause.
161 void setPostUpdateExpr(Expr *S) { PostUpdate = S; }
162
163public:
164 /// Get post-update expression for the clause.
165 const Expr *getPostUpdateExpr() const { return PostUpdate; }
166
167 /// Get post-update expression for the clause.
168 Expr *getPostUpdateExpr() { return PostUpdate; }
169
170 static OMPClauseWithPostUpdate *get(OMPClause *C);
171 static const OMPClauseWithPostUpdate *get(const OMPClause *C);
172};
173
174/// This structure contains most locations needed for by an OMPVarListClause.
175struct OMPVarListLocTy {
176 /// Starting location of the clause (the clause keyword).
177 SourceLocation StartLoc;
178 /// Location of '('.
179 SourceLocation LParenLoc;
180 /// Ending location of the clause.
181 SourceLocation EndLoc;
182 OMPVarListLocTy() = default;
183 OMPVarListLocTy(SourceLocation StartLoc, SourceLocation LParenLoc,
184 SourceLocation EndLoc)
185 : StartLoc(StartLoc), LParenLoc(LParenLoc), EndLoc(EndLoc) {}
186};
187
188/// This represents clauses with the list of variables like 'private',
189/// 'firstprivate', 'copyin', 'shared', or 'reduction' clauses in the
190/// '#pragma omp ...' directives.
191template <class T> class OMPVarListClause : public OMPClause {
192 friend class OMPClauseReader;
193
194 /// Location of '('.
195 SourceLocation LParenLoc;
196
197 /// Number of variables in the list.
198 unsigned NumVars;
199
200protected:
201 /// Build a clause with \a N variables
202 ///
203 /// \param K Kind of the clause.
204 /// \param StartLoc Starting location of the clause (the clause keyword).
205 /// \param LParenLoc Location of '('.
206 /// \param EndLoc Ending location of the clause.
207 /// \param N Number of the variables in the clause.
208 OMPVarListClause(OpenMPClauseKind K, SourceLocation StartLoc,
209 SourceLocation LParenLoc, SourceLocation EndLoc, unsigned N)
210 : OMPClause(K, StartLoc, EndLoc), LParenLoc(LParenLoc), NumVars(N) {}
211
212 /// Fetches list of variables associated with this clause.
213 MutableArrayRef<Expr *> getVarRefs() {
214 return MutableArrayRef<Expr *>(
215 static_cast<T *>(this)->template getTrailingObjects<Expr *>(), NumVars);
216 }
217
218 /// Sets the list of variables for this clause.
219 void setVarRefs(ArrayRef<Expr *> VL) {
220 assert(VL.size() == NumVars &&((void)0)
221 "Number of variables is not the same as the preallocated buffer")((void)0);
222 std::copy(VL.begin(), VL.end(),
223 static_cast<T *>(this)->template getTrailingObjects<Expr *>());
224 }
225
226public:
227 using varlist_iterator = MutableArrayRef<Expr *>::iterator;
228 using varlist_const_iterator = ArrayRef<const Expr *>::iterator;
229 using varlist_range = llvm::iterator_range<varlist_iterator>;
230 using varlist_const_range = llvm::iterator_range<varlist_const_iterator>;
231
232 unsigned varlist_size() const { return NumVars; }
233 bool varlist_empty() const { return NumVars == 0; }
234
235 varlist_range varlists() {
236 return varlist_range(varlist_begin(), varlist_end());
237 }
238 varlist_const_range varlists() const {
239 return varlist_const_range(varlist_begin(), varlist_end());
240 }
241
242 varlist_iterator varlist_begin() { return getVarRefs().begin(); }
243 varlist_iterator varlist_end() { return getVarRefs().end(); }
244 varlist_const_iterator varlist_begin() const { return getVarRefs().begin(); }
245 varlist_const_iterator varlist_end() const { return getVarRefs().end(); }
246
247 /// Sets the location of '('.
248 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
249
250 /// Returns the location of '('.
251 SourceLocation getLParenLoc() const { return LParenLoc; }
252
253 /// Fetches list of all variables in the clause.
254 ArrayRef<const Expr *> getVarRefs() const {
255 return llvm::makeArrayRef(
256 static_cast<const T *>(this)->template getTrailingObjects<Expr *>(),
257 NumVars);
258 }
259};
260
261/// This represents 'allocator' clause in the '#pragma omp ...'
262/// directive.
263///
264/// \code
265/// #pragma omp allocate(a) allocator(omp_default_mem_alloc)
266/// \endcode
267/// In this example directive '#pragma omp allocate' has simple 'allocator'
268/// clause with the allocator 'omp_default_mem_alloc'.
269class OMPAllocatorClause : public OMPClause {
270 friend class OMPClauseReader;
271
272 /// Location of '('.
273 SourceLocation LParenLoc;
274
275 /// Expression with the allocator.
276 Stmt *Allocator = nullptr;
277
278 /// Set allocator.
279 void setAllocator(Expr *A) { Allocator = A; }
280
281public:
282 /// Build 'allocator' clause with the given allocator.
283 ///
284 /// \param A Allocator.
285 /// \param StartLoc Starting location of the clause.
286 /// \param LParenLoc Location of '('.
287 /// \param EndLoc Ending location of the clause.
288 OMPAllocatorClause(Expr *A, SourceLocation StartLoc, SourceLocation LParenLoc,
289 SourceLocation EndLoc)
290 : OMPClause(llvm::omp::OMPC_allocator, StartLoc, EndLoc),
291 LParenLoc(LParenLoc), Allocator(A) {}
292
293 /// Build an empty clause.
294 OMPAllocatorClause()
295 : OMPClause(llvm::omp::OMPC_allocator, SourceLocation(),
296 SourceLocation()) {}
297
298 /// Sets the location of '('.
299 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
300
301 /// Returns the location of '('.
302 SourceLocation getLParenLoc() const { return LParenLoc; }
303
304 /// Returns allocator.
305 Expr *getAllocator() const { return cast_or_null<Expr>(Allocator); }
306
307 child_range children() { return child_range(&Allocator, &Allocator + 1); }
308
309 const_child_range children() const {
310 return const_child_range(&Allocator, &Allocator + 1);
311 }
312
313 child_range used_children() {
314 return child_range(child_iterator(), child_iterator());
315 }
316 const_child_range used_children() const {
317 return const_child_range(const_child_iterator(), const_child_iterator());
318 }
319
320 static bool classof(const OMPClause *T) {
321 return T->getClauseKind() == llvm::omp::OMPC_allocator;
322 }
323};
324
325/// This represents clause 'allocate' in the '#pragma omp ...' directives.
326///
327/// \code
328/// #pragma omp parallel private(a) allocate(omp_default_mem_alloc :a)
329/// \endcode
330/// In this example directive '#pragma omp parallel' has clause 'private'
331/// and clause 'allocate' for the variable 'a'.
332class OMPAllocateClause final
333 : public OMPVarListClause<OMPAllocateClause>,
334 private llvm::TrailingObjects<OMPAllocateClause, Expr *> {
335 friend class OMPClauseReader;
336 friend OMPVarListClause;
337 friend TrailingObjects;
338
339 /// Allocator specified in the clause, or 'nullptr' if the default one is
340 /// used.
341 Expr *Allocator = nullptr;
342 /// Position of the ':' delimiter in the clause;
343 SourceLocation ColonLoc;
344
345 /// Build clause with number of variables \a N.
346 ///
347 /// \param StartLoc Starting location of the clause.
348 /// \param LParenLoc Location of '('.
349 /// \param Allocator Allocator expression.
350 /// \param ColonLoc Location of ':' delimiter.
351 /// \param EndLoc Ending location of the clause.
352 /// \param N Number of the variables in the clause.
353 OMPAllocateClause(SourceLocation StartLoc, SourceLocation LParenLoc,
354 Expr *Allocator, SourceLocation ColonLoc,
355 SourceLocation EndLoc, unsigned N)
356 : OMPVarListClause<OMPAllocateClause>(llvm::omp::OMPC_allocate, StartLoc,
357 LParenLoc, EndLoc, N),
358 Allocator(Allocator), ColonLoc(ColonLoc) {}
359
360 /// Build an empty clause.
361 ///
362 /// \param N Number of variables.
363 explicit OMPAllocateClause(unsigned N)
364 : OMPVarListClause<OMPAllocateClause>(llvm::omp::OMPC_allocate,
365 SourceLocation(), SourceLocation(),
366 SourceLocation(), N) {}
367
368 /// Sets location of ':' symbol in clause.
369 void setColonLoc(SourceLocation CL) { ColonLoc = CL; }
370
371 void setAllocator(Expr *A) { Allocator = A; }
372
373public:
374 /// Creates clause with a list of variables \a VL.
375 ///
376 /// \param C AST context.
377 /// \param StartLoc Starting location of the clause.
378 /// \param LParenLoc Location of '('.
379 /// \param Allocator Allocator expression.
380 /// \param ColonLoc Location of ':' delimiter.
381 /// \param EndLoc Ending location of the clause.
382 /// \param VL List of references to the variables.
383 static OMPAllocateClause *Create(const ASTContext &C, SourceLocation StartLoc,
384 SourceLocation LParenLoc, Expr *Allocator,
385 SourceLocation ColonLoc,
386 SourceLocation EndLoc, ArrayRef<Expr *> VL);
387
388 /// Returns the allocator expression or nullptr, if no allocator is specified.
389 Expr *getAllocator() const { return Allocator; }
390
391 /// Returns the location of the ':' delimiter.
392 SourceLocation getColonLoc() const { return ColonLoc; }
393
394 /// Creates an empty clause with the place for \a N variables.
395 ///
396 /// \param C AST context.
397 /// \param N The number of variables.
398 static OMPAllocateClause *CreateEmpty(const ASTContext &C, unsigned N);
399
400 child_range children() {
401 return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
402 reinterpret_cast<Stmt **>(varlist_end()));
403 }
404
405 const_child_range children() const {
406 auto Children = const_cast<OMPAllocateClause *>(this)->children();
407 return const_child_range(Children.begin(), Children.end());
408 }
409
410 child_range used_children() {
411 return child_range(child_iterator(), child_iterator());
412 }
413 const_child_range used_children() const {
414 return const_child_range(const_child_iterator(), const_child_iterator());
415 }
416
417 static bool classof(const OMPClause *T) {
418 return T->getClauseKind() == llvm::omp::OMPC_allocate;
419 }
420};
421
422/// This represents 'if' clause in the '#pragma omp ...' directive.
423///
424/// \code
425/// #pragma omp parallel if(parallel:a > 5)
426/// \endcode
427/// In this example directive '#pragma omp parallel' has simple 'if' clause with
428/// condition 'a > 5' and directive name modifier 'parallel'.
429class OMPIfClause : public OMPClause, public OMPClauseWithPreInit {
430 friend class OMPClauseReader;
431
432 /// Location of '('.
433 SourceLocation LParenLoc;
434
435 /// Condition of the 'if' clause.
436 Stmt *Condition = nullptr;
437
438 /// Location of ':' (if any).
439 SourceLocation ColonLoc;
440
441 /// Directive name modifier for the clause.
442 OpenMPDirectiveKind NameModifier = llvm::omp::OMPD_unknown;
443
444 /// Name modifier location.
445 SourceLocation NameModifierLoc;
446
447 /// Set condition.
448 void setCondition(Expr *Cond) { Condition = Cond; }
449
450 /// Set directive name modifier for the clause.
451 void setNameModifier(OpenMPDirectiveKind NM) { NameModifier = NM; }
452
453 /// Set location of directive name modifier for the clause.
454 void setNameModifierLoc(SourceLocation Loc) { NameModifierLoc = Loc; }
455
456 /// Set location of ':'.
457 void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
458
459public:
460 /// Build 'if' clause with condition \a Cond.
461 ///
462 /// \param NameModifier [OpenMP 4.1] Directive name modifier of clause.
463 /// \param Cond Condition of the clause.
464 /// \param HelperCond Helper condition for the clause.
465 /// \param CaptureRegion Innermost OpenMP region where expressions in this
466 /// clause must be captured.
467 /// \param StartLoc Starting location of the clause.
468 /// \param LParenLoc Location of '('.
469 /// \param NameModifierLoc Location of directive name modifier.
470 /// \param ColonLoc [OpenMP 4.1] Location of ':'.
471 /// \param EndLoc Ending location of the clause.
472 OMPIfClause(OpenMPDirectiveKind NameModifier, Expr *Cond, Stmt *HelperCond,
473 OpenMPDirectiveKind CaptureRegion, SourceLocation StartLoc,
474 SourceLocation LParenLoc, SourceLocation NameModifierLoc,
475 SourceLocation ColonLoc, SourceLocation EndLoc)
476 : OMPClause(llvm::omp::OMPC_if, StartLoc, EndLoc),
477 OMPClauseWithPreInit(this), LParenLoc(LParenLoc), Condition(Cond),
478 ColonLoc(ColonLoc), NameModifier(NameModifier),
479 NameModifierLoc(NameModifierLoc) {
480 setPreInitStmt(HelperCond, CaptureRegion);
481 }
482
483 /// Build an empty clause.
484 OMPIfClause()
485 : OMPClause(llvm::omp::OMPC_if, SourceLocation(), SourceLocation()),
486 OMPClauseWithPreInit(this) {}
487
488 /// Sets the location of '('.
489 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
490
491 /// Returns the location of '('.
492 SourceLocation getLParenLoc() const { return LParenLoc; }
493
494 /// Return the location of ':'.
495 SourceLocation getColonLoc() const { return ColonLoc; }
496
497 /// Returns condition.
498 Expr *getCondition() const { return cast_or_null<Expr>(Condition); }
499
500 /// Return directive name modifier associated with the clause.
501 OpenMPDirectiveKind getNameModifier() const { return NameModifier; }
502
503 /// Return the location of directive name modifier.
504 SourceLocation getNameModifierLoc() const { return NameModifierLoc; }
505
506 child_range children() { return child_range(&Condition, &Condition + 1); }
507
508 const_child_range children() const {
509 return const_child_range(&Condition, &Condition + 1);
510 }
511
512 child_range used_children();
513 const_child_range used_children() const {
514 auto Children = const_cast<OMPIfClause *>(this)->used_children();
515 return const_child_range(Children.begin(), Children.end());
516 }
517
518 static bool classof(const OMPClause *T) {
519 return T->getClauseKind() == llvm::omp::OMPC_if;
520 }
521};
522
523/// This represents 'final' clause in the '#pragma omp ...' directive.
524///
525/// \code
526/// #pragma omp task final(a > 5)
527/// \endcode
528/// In this example directive '#pragma omp task' has simple 'final'
529/// clause with condition 'a > 5'.
530class OMPFinalClause : public OMPClause, public OMPClauseWithPreInit {
531 friend class OMPClauseReader;
532
533 /// Location of '('.
534 SourceLocation LParenLoc;
535
536 /// Condition of the 'if' clause.
537 Stmt *Condition = nullptr;
538
539 /// Set condition.
540 void setCondition(Expr *Cond) { Condition = Cond; }
541
542public:
543 /// Build 'final' clause with condition \a Cond.
544 ///
545 /// \param Cond Condition of the clause.
546 /// \param HelperCond Helper condition for the construct.
547 /// \param CaptureRegion Innermost OpenMP region where expressions in this
548 /// clause must be captured.
549 /// \param StartLoc Starting location of the clause.
550 /// \param LParenLoc Location of '('.
551 /// \param EndLoc Ending location of the clause.
552 OMPFinalClause(Expr *Cond, Stmt *HelperCond,
553 OpenMPDirectiveKind CaptureRegion, SourceLocation StartLoc,
554 SourceLocation LParenLoc, SourceLocation EndLoc)
555 : OMPClause(llvm::omp::OMPC_final, StartLoc, EndLoc),
556 OMPClauseWithPreInit(this), LParenLoc(LParenLoc), Condition(Cond) {
557 setPreInitStmt(HelperCond, CaptureRegion);
558 }
559
560 /// Build an empty clause.
561 OMPFinalClause()
562 : OMPClause(llvm::omp::OMPC_final, SourceLocation(), SourceLocation()),
563 OMPClauseWithPreInit(this) {}
564
565 /// Sets the location of '('.
566 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
567
568 /// Returns the location of '('.
569 SourceLocation getLParenLoc() const { return LParenLoc; }
570
571 /// Returns condition.
572 Expr *getCondition() const { return cast_or_null<Expr>(Condition); }
573
574 child_range children() { return child_range(&Condition, &Condition + 1); }
575
576 const_child_range children() const {
577 return const_child_range(&Condition, &Condition + 1);
578 }
579
580 child_range used_children();
581 const_child_range used_children() const {
582 auto Children = const_cast<OMPFinalClause *>(this)->used_children();
583 return const_child_range(Children.begin(), Children.end());
584 }
585
586 static bool classof(const OMPClause *T) {
587 return T->getClauseKind() == llvm::omp::OMPC_final;
588 }
589};
590
591/// This represents 'num_threads' clause in the '#pragma omp ...'
592/// directive.
593///
594/// \code
595/// #pragma omp parallel num_threads(6)
596/// \endcode
597/// In this example directive '#pragma omp parallel' has simple 'num_threads'
598/// clause with number of threads '6'.
599class OMPNumThreadsClause : public OMPClause, public OMPClauseWithPreInit {
600 friend class OMPClauseReader;
601
602 /// Location of '('.
603 SourceLocation LParenLoc;
604
605 /// Condition of the 'num_threads' clause.
606 Stmt *NumThreads = nullptr;
607
608 /// Set condition.
609 void setNumThreads(Expr *NThreads) { NumThreads = NThreads; }
610
611public:
612 /// Build 'num_threads' clause with condition \a NumThreads.
613 ///
614 /// \param NumThreads Number of threads for the construct.
615 /// \param HelperNumThreads Helper Number of threads for the construct.
616 /// \param CaptureRegion Innermost OpenMP region where expressions in this
617 /// clause must be captured.
618 /// \param StartLoc Starting location of the clause.
619 /// \param LParenLoc Location of '('.
620 /// \param EndLoc Ending location of the clause.
621 OMPNumThreadsClause(Expr *NumThreads, Stmt *HelperNumThreads,
622 OpenMPDirectiveKind CaptureRegion,
623 SourceLocation StartLoc, SourceLocation LParenLoc,
624 SourceLocation EndLoc)
625 : OMPClause(llvm::omp::OMPC_num_threads, StartLoc, EndLoc),
626 OMPClauseWithPreInit(this), LParenLoc(LParenLoc),
627 NumThreads(NumThreads) {
628 setPreInitStmt(HelperNumThreads, CaptureRegion);
629 }
630
631 /// Build an empty clause.
632 OMPNumThreadsClause()
633 : OMPClause(llvm::omp::OMPC_num_threads, SourceLocation(),
634 SourceLocation()),
635 OMPClauseWithPreInit(this) {}
636
637 /// Sets the location of '('.
638 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
639
640 /// Returns the location of '('.
641 SourceLocation getLParenLoc() const { return LParenLoc; }
642
643 /// Returns number of threads.
644 Expr *getNumThreads() const { return cast_or_null<Expr>(NumThreads); }
645
646 child_range children() { return child_range(&NumThreads, &NumThreads + 1); }
647
648 const_child_range children() const {
649 return const_child_range(&NumThreads, &NumThreads + 1);
650 }
651
652 child_range used_children() {
653 return child_range(child_iterator(), child_iterator());
654 }
655 const_child_range used_children() const {
656 return const_child_range(const_child_iterator(), const_child_iterator());
657 }
658
659 static bool classof(const OMPClause *T) {
660 return T->getClauseKind() == llvm::omp::OMPC_num_threads;
661 }
662};
663
664/// This represents 'safelen' clause in the '#pragma omp ...'
665/// directive.
666///
667/// \code
668/// #pragma omp simd safelen(4)
669/// \endcode
670/// In this example directive '#pragma omp simd' has clause 'safelen'
671/// with single expression '4'.
672/// If the safelen clause is used then no two iterations executed
673/// concurrently with SIMD instructions can have a greater distance
674/// in the logical iteration space than its value. The parameter of
675/// the safelen clause must be a constant positive integer expression.
676class OMPSafelenClause : public OMPClause {
677 friend class OMPClauseReader;
678
679 /// Location of '('.
680 SourceLocation LParenLoc;
681
682 /// Safe iteration space distance.
683 Stmt *Safelen = nullptr;
684
685 /// Set safelen.
686 void setSafelen(Expr *Len) { Safelen = Len; }
687
688public:
689 /// Build 'safelen' clause.
690 ///
691 /// \param Len Expression associated with this clause.
692 /// \param StartLoc Starting location of the clause.
693 /// \param EndLoc Ending location of the clause.
694 OMPSafelenClause(Expr *Len, SourceLocation StartLoc, SourceLocation LParenLoc,
695 SourceLocation EndLoc)
696 : OMPClause(llvm::omp::OMPC_safelen, StartLoc, EndLoc),
697 LParenLoc(LParenLoc), Safelen(Len) {}
698
699 /// Build an empty clause.
700 explicit OMPSafelenClause()
701 : OMPClause(llvm::omp::OMPC_safelen, SourceLocation(), SourceLocation()) {
702 }
703
704 /// Sets the location of '('.
705 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
706
707 /// Returns the location of '('.
708 SourceLocation getLParenLoc() const { return LParenLoc; }
709
710 /// Return safe iteration space distance.
711 Expr *getSafelen() const { return cast_or_null<Expr>(Safelen); }
712
713 child_range children() { return child_range(&Safelen, &Safelen + 1); }
714
715 const_child_range children() const {
716 return const_child_range(&Safelen, &Safelen + 1);
717 }
718
719 child_range used_children() {
720 return child_range(child_iterator(), child_iterator());
721 }
722 const_child_range used_children() const {
723 return const_child_range(const_child_iterator(), const_child_iterator());
724 }
725
726 static bool classof(const OMPClause *T) {
727 return T->getClauseKind() == llvm::omp::OMPC_safelen;
728 }
729};
730
731/// This represents 'simdlen' clause in the '#pragma omp ...'
732/// directive.
733///
734/// \code
735/// #pragma omp simd simdlen(4)
736/// \endcode
737/// In this example directive '#pragma omp simd' has clause 'simdlen'
738/// with single expression '4'.
739/// If the 'simdlen' clause is used then it specifies the preferred number of
740/// iterations to be executed concurrently. The parameter of the 'simdlen'
741/// clause must be a constant positive integer expression.
742class OMPSimdlenClause : public OMPClause {
743 friend class OMPClauseReader;
744
745 /// Location of '('.
746 SourceLocation LParenLoc;
747
748 /// Safe iteration space distance.
749 Stmt *Simdlen = nullptr;
750
751 /// Set simdlen.
752 void setSimdlen(Expr *Len) { Simdlen = Len; }
753
754public:
755 /// Build 'simdlen' clause.
756 ///
757 /// \param Len Expression associated with this clause.
758 /// \param StartLoc Starting location of the clause.
759 /// \param EndLoc Ending location of the clause.
760 OMPSimdlenClause(Expr *Len, SourceLocation StartLoc, SourceLocation LParenLoc,
761 SourceLocation EndLoc)
762 : OMPClause(llvm::omp::OMPC_simdlen, StartLoc, EndLoc),
763 LParenLoc(LParenLoc), Simdlen(Len) {}
764
765 /// Build an empty clause.
766 explicit OMPSimdlenClause()
767 : OMPClause(llvm::omp::OMPC_simdlen, SourceLocation(), SourceLocation()) {
768 }
769
770 /// Sets the location of '('.
771 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
772
773 /// Returns the location of '('.
774 SourceLocation getLParenLoc() const { return LParenLoc; }
775
776 /// Return safe iteration space distance.
777 Expr *getSimdlen() const { return cast_or_null<Expr>(Simdlen); }
778
779 child_range children() { return child_range(&Simdlen, &Simdlen + 1); }
780
781 const_child_range children() const {
782 return const_child_range(&Simdlen, &Simdlen + 1);
783 }
784
785 child_range used_children() {
786 return child_range(child_iterator(), child_iterator());
787 }
788 const_child_range used_children() const {
789 return const_child_range(const_child_iterator(), const_child_iterator());
790 }
791
792 static bool classof(const OMPClause *T) {
793 return T->getClauseKind() == llvm::omp::OMPC_simdlen;
794 }
795};
796
797/// This represents the 'sizes' clause in the '#pragma omp tile' directive.
798///
799/// \code
800/// #pragma omp tile sizes(5,5)
801/// for (int i = 0; i < 64; ++i)
802/// for (int j = 0; j < 64; ++j)
803/// \endcode
804class OMPSizesClause final
805 : public OMPClause,
806 private llvm::TrailingObjects<OMPSizesClause, Expr *> {
807 friend class OMPClauseReader;
808 friend class llvm::TrailingObjects<OMPSizesClause, Expr *>;
809
810 /// Location of '('.
811 SourceLocation LParenLoc;
812
813 /// Number of tile sizes in the clause.
814 unsigned NumSizes;
815
816 /// Build an empty clause.
817 explicit OMPSizesClause(int NumSizes)
818 : OMPClause(llvm::omp::OMPC_sizes, SourceLocation(), SourceLocation()),
819 NumSizes(NumSizes) {}
820
821public:
822 /// Build a 'sizes' AST node.
823 ///
824 /// \param C Context of the AST.
825 /// \param StartLoc Location of the 'sizes' identifier.
826 /// \param LParenLoc Location of '('.
827 /// \param EndLoc Location of ')'.
828 /// \param Sizes Content of the clause.
829 static OMPSizesClause *Create(const ASTContext &C, SourceLocation StartLoc,
830 SourceLocation LParenLoc, SourceLocation EndLoc,
831 ArrayRef<Expr *> Sizes);
832
833 /// Build an empty 'sizes' AST node for deserialization.
834 ///
835 /// \param C Context of the AST.
836 /// \param NumSizes Number of items in the clause.
837 static OMPSizesClause *CreateEmpty(const ASTContext &C, unsigned NumSizes);
838
839 /// Sets the location of '('.
840 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
841
842 /// Returns the location of '('.
843 SourceLocation getLParenLoc() const { return LParenLoc; }
844
845 /// Returns the number of list items.
846 unsigned getNumSizes() const { return NumSizes; }
847
848 /// Returns the tile size expressions.
849 MutableArrayRef<Expr *> getSizesRefs() {
850 return MutableArrayRef<Expr *>(static_cast<OMPSizesClause *>(this)
851 ->template getTrailingObjects<Expr *>(),
852 NumSizes);
853 }
854 ArrayRef<Expr *> getSizesRefs() const {
855 return ArrayRef<Expr *>(static_cast<const OMPSizesClause *>(this)
856 ->template getTrailingObjects<Expr *>(),
857 NumSizes);
858 }
859
860 /// Sets the tile size expressions.
861 void setSizesRefs(ArrayRef<Expr *> VL) {
862 assert(VL.size() == NumSizes)((void)0);
863 std::copy(VL.begin(), VL.end(),
864 static_cast<OMPSizesClause *>(this)
865 ->template getTrailingObjects<Expr *>());
866 }
867
868 child_range children() {
869 MutableArrayRef<Expr *> Sizes = getSizesRefs();
870 return child_range(reinterpret_cast<Stmt **>(Sizes.begin()),
871 reinterpret_cast<Stmt **>(Sizes.end()));
872 }
873 const_child_range children() const {
874 ArrayRef<Expr *> Sizes = getSizesRefs();
875 return const_child_range(reinterpret_cast<Stmt *const *>(Sizes.begin()),
876 reinterpret_cast<Stmt *const *>(Sizes.end()));
877 }
878
879 child_range used_children() {
880 return child_range(child_iterator(), child_iterator());
881 }
882 const_child_range used_children() const {
883 return const_child_range(const_child_iterator(), const_child_iterator());
884 }
885
886 static bool classof(const OMPClause *T) {
887 return T->getClauseKind() == llvm::omp::OMPC_sizes;
888 }
889};
890
891/// Representation of the 'full' clause of the '#pragma omp unroll' directive.
892///
893/// \code
894/// #pragma omp unroll full
895/// for (int i = 0; i < 64; ++i)
896/// \endcode
897class OMPFullClause final : public OMPClause {
898 friend class OMPClauseReader;
899
900 /// Build an empty clause.
901 explicit OMPFullClause() : OMPClause(llvm::omp::OMPC_full, {}, {}) {}
902
903public:
904 /// Build an AST node for a 'full' clause.
905 ///
906 /// \param C Context of the AST.
907 /// \param StartLoc Starting location of the clause.
908 /// \param EndLoc Ending location of the clause.
909 static OMPFullClause *Create(const ASTContext &C, SourceLocation StartLoc,
910 SourceLocation EndLoc);
911
912 /// Build an empty 'full' AST node for deserialization.
913 ///
914 /// \param C Context of the AST.
915 static OMPFullClause *CreateEmpty(const ASTContext &C);
916
917 child_range children() { return {child_iterator(), child_iterator()}; }
918 const_child_range children() const {
919 return {const_child_iterator(), const_child_iterator()};
920 }
921
922 child_range used_children() {
923 return child_range(child_iterator(), child_iterator());
924 }
925 const_child_range used_children() const {
926 return const_child_range(const_child_iterator(), const_child_iterator());
927 }
928
929 static bool classof(const OMPClause *T) {
930 return T->getClauseKind() == llvm::omp::OMPC_full;
931 }
932};
933
934/// Representation of the 'partial' clause of the '#pragma omp unroll'
935/// directive.
936///
937/// \code
938/// #pragma omp unroll partial(4)
939/// for (int i = start; i < end; ++i)
940/// \endcode
941class OMPPartialClause final : public OMPClause {
942 friend class OMPClauseReader;
943
944 /// Location of '('.
945 SourceLocation LParenLoc;
946
947 /// Optional argument to the clause (unroll factor).
948 Stmt *Factor;
949
950 /// Build an empty clause.
951 explicit OMPPartialClause() : OMPClause(llvm::omp::OMPC_partial, {}, {}) {}
952
953 /// Set the unroll factor.
954 void setFactor(Expr *E) { Factor = E; }
955
956 /// Sets the location of '('.
957 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
958
959public:
960 /// Build an AST node for a 'partial' clause.
961 ///
962 /// \param C Context of the AST.
963 /// \param StartLoc Location of the 'partial' identifier.
964 /// \param LParenLoc Location of '('.
965 /// \param EndLoc Location of ')'.
966 /// \param Factor Clause argument.
967 static OMPPartialClause *Create(const ASTContext &C, SourceLocation StartLoc,
968 SourceLocation LParenLoc,
969 SourceLocation EndLoc, Expr *Factor);
970
971 /// Build an empty 'partial' AST node for deserialization.
972 ///
973 /// \param C Context of the AST.
974 static OMPPartialClause *CreateEmpty(const ASTContext &C);
975
976 /// Returns the location of '('.
977 SourceLocation getLParenLoc() const { return LParenLoc; }
978
979 /// Returns the argument of the clause or nullptr if not set.
980 Expr *getFactor() const { return cast_or_null<Expr>(Factor); }
981
982 child_range children() { return child_range(&Factor, &Factor + 1); }
983 const_child_range children() const {
984 return const_child_range(&Factor, &Factor + 1);
985 }
986
987 child_range used_children() {
988 return child_range(child_iterator(), child_iterator());
989 }
990 const_child_range used_children() const {
991 return const_child_range(const_child_iterator(), const_child_iterator());
992 }
993
994 static bool classof(const OMPClause *T) {
995 return T->getClauseKind() == llvm::omp::OMPC_partial;
996 }
997};
998
999/// This represents 'collapse' clause in the '#pragma omp ...'
1000/// directive.
1001///
1002/// \code
1003/// #pragma omp simd collapse(3)
1004/// \endcode
1005/// In this example directive '#pragma omp simd' has clause 'collapse'
1006/// with single expression '3'.
1007/// The parameter must be a constant positive integer expression, it specifies
1008/// the number of nested loops that should be collapsed into a single iteration
1009/// space.
1010class OMPCollapseClause : public OMPClause {
1011 friend class OMPClauseReader;
1012
1013 /// Location of '('.
1014 SourceLocation LParenLoc;
1015
1016 /// Number of for-loops.
1017 Stmt *NumForLoops = nullptr;
1018
1019 /// Set the number of associated for-loops.
1020 void setNumForLoops(Expr *Num) { NumForLoops = Num; }
1021
1022public:
1023 /// Build 'collapse' clause.
1024 ///
1025 /// \param Num Expression associated with this clause.
1026 /// \param StartLoc Starting location of the clause.
1027 /// \param LParenLoc Location of '('.
1028 /// \param EndLoc Ending location of the clause.
1029 OMPCollapseClause(Expr *Num, SourceLocation StartLoc,
1030 SourceLocation LParenLoc, SourceLocation EndLoc)
1031 : OMPClause(llvm::omp::OMPC_collapse, StartLoc, EndLoc),
1032 LParenLoc(LParenLoc), NumForLoops(Num) {}
1033
1034 /// Build an empty clause.
1035 explicit OMPCollapseClause()
1036 : OMPClause(llvm::omp::OMPC_collapse, SourceLocation(),
1037 SourceLocation()) {}
1038
1039 /// Sets the location of '('.
1040 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
1041
1042 /// Returns the location of '('.
1043 SourceLocation getLParenLoc() const { return LParenLoc; }
1044
1045 /// Return the number of associated for-loops.
1046 Expr *getNumForLoops() const { return cast_or_null<Expr>(NumForLoops); }
1047
1048 child_range children() { return child_range(&NumForLoops, &NumForLoops + 1); }
1049
1050 const_child_range children() const {
1051 return const_child_range(&NumForLoops, &NumForLoops + 1);
1052 }
1053
1054 child_range used_children() {
1055 return child_range(child_iterator(), child_iterator());
1056 }
1057 const_child_range used_children() const {
1058 return const_child_range(const_child_iterator(), const_child_iterator());
1059 }
1060
1061 static bool classof(const OMPClause *T) {
1062 return T->getClauseKind() == llvm::omp::OMPC_collapse;
1063 }
1064};
1065
1066/// This represents 'default' clause in the '#pragma omp ...' directive.
1067///
1068/// \code
1069/// #pragma omp parallel default(shared)
1070/// \endcode
1071/// In this example directive '#pragma omp parallel' has simple 'default'
1072/// clause with kind 'shared'.
1073class OMPDefaultClause : public OMPClause {
1074 friend class OMPClauseReader;
1075
1076 /// Location of '('.
1077 SourceLocation LParenLoc;
1078
1079 /// A kind of the 'default' clause.
1080 llvm::omp::DefaultKind Kind = llvm::omp::OMP_DEFAULT_unknown;
1081
1082 /// Start location of the kind in source code.
1083 SourceLocation KindKwLoc;
1084
1085 /// Set kind of the clauses.
1086 ///
1087 /// \param K Argument of clause.
1088 void setDefaultKind(llvm::omp::DefaultKind K) { Kind = K; }
1089
1090 /// Set argument location.
1091 ///
1092 /// \param KLoc Argument location.
1093 void setDefaultKindKwLoc(SourceLocation KLoc) { KindKwLoc = KLoc; }
1094
1095public:
1096 /// Build 'default' clause with argument \a A ('none' or 'shared').
1097 ///
1098 /// \param A Argument of the clause ('none' or 'shared').
1099 /// \param ALoc Starting location of the argument.
1100 /// \param StartLoc Starting location of the clause.
1101 /// \param LParenLoc Location of '('.
1102 /// \param EndLoc Ending location of the clause.
1103 OMPDefaultClause(llvm::omp::DefaultKind A, SourceLocation ALoc,
1104 SourceLocation StartLoc, SourceLocation LParenLoc,
1105 SourceLocation EndLoc)
1106 : OMPClause(llvm::omp::OMPC_default, StartLoc, EndLoc),
1107 LParenLoc(LParenLoc), Kind(A), KindKwLoc(ALoc) {}
1108
1109 /// Build an empty clause.
1110 OMPDefaultClause()
1111 : OMPClause(llvm::omp::OMPC_default, SourceLocation(), SourceLocation()) {
1112 }
1113
1114 /// Sets the location of '('.
1115 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
1116
1117 /// Returns the location of '('.
1118 SourceLocation getLParenLoc() const { return LParenLoc; }
1119
1120 /// Returns kind of the clause.
1121 llvm::omp::DefaultKind getDefaultKind() const { return Kind; }
1122
1123 /// Returns location of clause kind.
1124 SourceLocation getDefaultKindKwLoc() const { return KindKwLoc; }
1125
1126 child_range children() {
1127 return child_range(child_iterator(), child_iterator());
1128 }
1129
1130 const_child_range children() const {
1131 return const_child_range(const_child_iterator(), const_child_iterator());
1132 }
1133
1134 child_range used_children() {
1135 return child_range(child_iterator(), child_iterator());
1136 }
1137 const_child_range used_children() const {
1138 return const_child_range(const_child_iterator(), const_child_iterator());
1139 }
1140
1141 static bool classof(const OMPClause *T) {
1142 return T->getClauseKind() == llvm::omp::OMPC_default;
1143 }
1144};
1145
1146/// This represents 'proc_bind' clause in the '#pragma omp ...'
1147/// directive.
1148///
1149/// \code
1150/// #pragma omp parallel proc_bind(master)
1151/// \endcode
1152/// In this example directive '#pragma omp parallel' has simple 'proc_bind'
1153/// clause with kind 'master'.
1154class OMPProcBindClause : public OMPClause {
1155 friend class OMPClauseReader;
1156
1157 /// Location of '('.
1158 SourceLocation LParenLoc;
1159
1160 /// A kind of the 'proc_bind' clause.
1161 llvm::omp::ProcBindKind Kind = llvm::omp::OMP_PROC_BIND_unknown;
1162
1163 /// Start location of the kind in source code.
1164 SourceLocation KindKwLoc;
1165
1166 /// Set kind of the clause.
1167 ///
1168 /// \param K Kind of clause.
1169 void setProcBindKind(llvm::omp::ProcBindKind K) { Kind = K; }
1170
1171 /// Set clause kind location.
1172 ///
1173 /// \param KLoc Kind location.
1174 void setProcBindKindKwLoc(SourceLocation KLoc) { KindKwLoc = KLoc; }
1175
1176public:
1177 /// Build 'proc_bind' clause with argument \a A ('master', 'close' or
1178 /// 'spread').
1179 ///
1180 /// \param A Argument of the clause ('master', 'close' or 'spread').
1181 /// \param ALoc Starting location of the argument.
1182 /// \param StartLoc Starting location of the clause.
1183 /// \param LParenLoc Location of '('.
1184 /// \param EndLoc Ending location of the clause.
1185 OMPProcBindClause(llvm::omp::ProcBindKind A, SourceLocation ALoc,
1186 SourceLocation StartLoc, SourceLocation LParenLoc,
1187 SourceLocation EndLoc)
1188 : OMPClause(llvm::omp::OMPC_proc_bind, StartLoc, EndLoc),
1189 LParenLoc(LParenLoc), Kind(A), KindKwLoc(ALoc) {}
1190
1191 /// Build an empty clause.
1192 OMPProcBindClause()
1193 : OMPClause(llvm::omp::OMPC_proc_bind, SourceLocation(),
1194 SourceLocation()) {}
1195
1196 /// Sets the location of '('.
1197 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
1198
1199 /// Returns the location of '('.
1200 SourceLocation getLParenLoc() const { return LParenLoc; }
1201
1202 /// Returns kind of the clause.
1203 llvm::omp::ProcBindKind getProcBindKind() const { return Kind; }
1204
1205 /// Returns location of clause kind.
1206 SourceLocation getProcBindKindKwLoc() const { return KindKwLoc; }
1207
1208 child_range children() {
1209 return child_range(child_iterator(), child_iterator());
1210 }
1211
1212 const_child_range children() const {
1213 return const_child_range(const_child_iterator(), const_child_iterator());
1214 }
1215
1216 child_range used_children() {
1217 return child_range(child_iterator(), child_iterator());
1218 }
1219 const_child_range used_children() const {
1220 return const_child_range(const_child_iterator(), const_child_iterator());
1221 }
1222
1223 static bool classof(const OMPClause *T) {
1224 return T->getClauseKind() == llvm::omp::OMPC_proc_bind;
1225 }
1226};
1227
1228/// This represents 'unified_address' clause in the '#pragma omp requires'
1229/// directive.
1230///
1231/// \code
1232/// #pragma omp requires unified_address
1233/// \endcode
1234/// In this example directive '#pragma omp requires' has 'unified_address'
1235/// clause.
1236class OMPUnifiedAddressClause final : public OMPClause {
1237public:
1238 friend class OMPClauseReader;
1239 /// Build 'unified_address' clause.
1240 ///
1241 /// \param StartLoc Starting location of the clause.
1242 /// \param EndLoc Ending location of the clause.
1243 OMPUnifiedAddressClause(SourceLocation StartLoc, SourceLocation EndLoc)
1244 : OMPClause(llvm::omp::OMPC_unified_address, StartLoc, EndLoc) {}
1245
1246 /// Build an empty clause.
1247 OMPUnifiedAddressClause()
1248 : OMPClause(llvm::omp::OMPC_unified_address, SourceLocation(),
1249 SourceLocation()) {}
1250
1251 child_range children() {
1252 return child_range(child_iterator(), child_iterator());
1253 }
1254
1255 const_child_range children() const {
1256 return const_child_range(const_child_iterator(), const_child_iterator());
1257 }
1258
1259 child_range used_children() {
1260 return child_range(child_iterator(), child_iterator());
1261 }
1262 const_child_range used_children() const {
1263 return const_child_range(const_child_iterator(), const_child_iterator());
1264 }
1265
1266 static bool classof(const OMPClause *T) {
1267 return T->getClauseKind() == llvm::omp::OMPC_unified_address;
1268 }
1269};
1270
1271/// This represents 'unified_shared_memory' clause in the '#pragma omp requires'
1272/// directive.
1273///
1274/// \code
1275/// #pragma omp requires unified_shared_memory
1276/// \endcode
1277/// In this example directive '#pragma omp requires' has 'unified_shared_memory'
1278/// clause.
1279class OMPUnifiedSharedMemoryClause final : public OMPClause {
1280public:
1281 friend class OMPClauseReader;
1282 /// Build 'unified_shared_memory' clause.
1283 ///
1284 /// \param StartLoc Starting location of the clause.
1285 /// \param EndLoc Ending location of the clause.
1286 OMPUnifiedSharedMemoryClause(SourceLocation StartLoc, SourceLocation EndLoc)
1287 : OMPClause(llvm::omp::OMPC_unified_shared_memory, StartLoc, EndLoc) {}
1288
1289 /// Build an empty clause.
1290 OMPUnifiedSharedMemoryClause()
1291 : OMPClause(llvm::omp::OMPC_unified_shared_memory, SourceLocation(),
1292 SourceLocation()) {}
1293
1294 child_range children() {
1295 return child_range(child_iterator(), child_iterator());
1296 }
1297
1298 const_child_range children() const {
1299 return const_child_range(const_child_iterator(), const_child_iterator());
1300 }
1301
1302 child_range used_children() {
1303 return child_range(child_iterator(), child_iterator());
1304 }
1305 const_child_range used_children() const {
1306 return const_child_range(const_child_iterator(), const_child_iterator());
1307 }
1308
1309 static bool classof(const OMPClause *T) {
1310 return T->getClauseKind() == llvm::omp::OMPC_unified_shared_memory;
1311 }
1312};
1313
1314/// This represents 'reverse_offload' clause in the '#pragma omp requires'
1315/// directive.
1316///
1317/// \code
1318/// #pragma omp requires reverse_offload
1319/// \endcode
1320/// In this example directive '#pragma omp requires' has 'reverse_offload'
1321/// clause.
1322class OMPReverseOffloadClause final : public OMPClause {
1323public:
1324 friend class OMPClauseReader;
1325 /// Build 'reverse_offload' clause.
1326 ///
1327 /// \param StartLoc Starting location of the clause.
1328 /// \param EndLoc Ending location of the clause.
1329 OMPReverseOffloadClause(SourceLocation StartLoc, SourceLocation EndLoc)
1330 : OMPClause(llvm::omp::OMPC_reverse_offload, StartLoc, EndLoc) {}
1331
1332 /// Build an empty clause.
1333 OMPReverseOffloadClause()
1334 : OMPClause(llvm::omp::OMPC_reverse_offload, SourceLocation(),
1335 SourceLocation()) {}
1336
1337 child_range children() {
1338 return child_range(child_iterator(), child_iterator());
1339 }
1340
1341 const_child_range children() const {
1342 return const_child_range(const_child_iterator(), const_child_iterator());
1343 }
1344
1345 child_range used_children() {
1346 return child_range(child_iterator(), child_iterator());
1347 }
1348 const_child_range used_children() const {
1349 return const_child_range(const_child_iterator(), const_child_iterator());
1350 }
1351
1352 static bool classof(const OMPClause *T) {
1353 return T->getClauseKind() == llvm::omp::OMPC_reverse_offload;
1354 }
1355};
1356
1357/// This represents 'dynamic_allocators' clause in the '#pragma omp requires'
1358/// directive.
1359///
1360/// \code
1361/// #pragma omp requires dynamic_allocators
1362/// \endcode
1363/// In this example directive '#pragma omp requires' has 'dynamic_allocators'
1364/// clause.
1365class OMPDynamicAllocatorsClause final : public OMPClause {
1366public:
1367 friend class OMPClauseReader;
1368 /// Build 'dynamic_allocators' clause.
1369 ///
1370 /// \param StartLoc Starting location of the clause.
1371 /// \param EndLoc Ending location of the clause.
1372 OMPDynamicAllocatorsClause(SourceLocation StartLoc, SourceLocation EndLoc)
1373 : OMPClause(llvm::omp::OMPC_dynamic_allocators, StartLoc, EndLoc) {}
1374
1375 /// Build an empty clause.
1376 OMPDynamicAllocatorsClause()
1377 : OMPClause(llvm::omp::OMPC_dynamic_allocators, SourceLocation(),
1378 SourceLocation()) {}
1379
1380 child_range children() {
1381 return child_range(child_iterator(), child_iterator());
1382 }
1383
1384 const_child_range children() const {
1385 return const_child_range(const_child_iterator(), const_child_iterator());
1386 }
1387
1388 child_range used_children() {
1389 return child_range(child_iterator(), child_iterator());
1390 }
1391 const_child_range used_children() const {
1392 return const_child_range(const_child_iterator(), const_child_iterator());
1393 }
1394
1395 static bool classof(const OMPClause *T) {
1396 return T->getClauseKind() == llvm::omp::OMPC_dynamic_allocators;
1397 }
1398};
1399
1400/// This represents 'atomic_default_mem_order' clause in the '#pragma omp
1401/// requires' directive.
1402///
1403/// \code
1404/// #pragma omp requires atomic_default_mem_order(seq_cst)
1405/// \endcode
1406/// In this example directive '#pragma omp requires' has simple
1407/// atomic_default_mem_order' clause with kind 'seq_cst'.
1408class OMPAtomicDefaultMemOrderClause final : public OMPClause {
1409 friend class OMPClauseReader;
1410
1411 /// Location of '('
1412 SourceLocation LParenLoc;
1413
1414 /// A kind of the 'atomic_default_mem_order' clause.
1415 OpenMPAtomicDefaultMemOrderClauseKind Kind =
1416 OMPC_ATOMIC_DEFAULT_MEM_ORDER_unknown;
1417
1418 /// Start location of the kind in source code.
1419 SourceLocation KindKwLoc;
1420
1421 /// Set kind of the clause.
1422 ///
1423 /// \param K Kind of clause.
1424 void setAtomicDefaultMemOrderKind(OpenMPAtomicDefaultMemOrderClauseKind K) {
1425 Kind = K;
1426 }
1427
1428 /// Set clause kind location.
1429 ///
1430 /// \param KLoc Kind location.
1431 void setAtomicDefaultMemOrderKindKwLoc(SourceLocation KLoc) {
1432 KindKwLoc = KLoc;
1433 }
1434
1435public:
1436 /// Build 'atomic_default_mem_order' clause with argument \a A ('seq_cst',
1437 /// 'acq_rel' or 'relaxed').
1438 ///
1439 /// \param A Argument of the clause ('seq_cst', 'acq_rel' or 'relaxed').
1440 /// \param ALoc Starting location of the argument.
1441 /// \param StartLoc Starting location of the clause.
1442 /// \param LParenLoc Location of '('.
1443 /// \param EndLoc Ending location of the clause.
1444 OMPAtomicDefaultMemOrderClause(OpenMPAtomicDefaultMemOrderClauseKind A,
1445 SourceLocation ALoc, SourceLocation StartLoc,
1446 SourceLocation LParenLoc,
1447 SourceLocation EndLoc)
1448 : OMPClause(llvm::omp::OMPC_atomic_default_mem_order, StartLoc, EndLoc),
1449 LParenLoc(LParenLoc), Kind(A), KindKwLoc(ALoc) {}
1450
1451 /// Build an empty clause.
1452 OMPAtomicDefaultMemOrderClause()
1453 : OMPClause(llvm::omp::OMPC_atomic_default_mem_order, SourceLocation(),
1454 SourceLocation()) {}
1455
1456 /// Sets the location of '('.
1457 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
1458
1459 /// Returns the locaiton of '('.
1460 SourceLocation getLParenLoc() const { return LParenLoc; }
1461
1462 /// Returns kind of the clause.
1463 OpenMPAtomicDefaultMemOrderClauseKind getAtomicDefaultMemOrderKind() const {
1464 return Kind;
1465 }
1466
1467 /// Returns location of clause kind.
1468 SourceLocation getAtomicDefaultMemOrderKindKwLoc() const { return KindKwLoc; }
1469
1470 child_range children() {
1471 return child_range(child_iterator(), child_iterator());
1472 }
1473
1474 const_child_range children() const {
1475 return const_child_range(const_child_iterator(), const_child_iterator());
1476 }
1477
1478 child_range used_children() {
1479 return child_range(child_iterator(), child_iterator());
1480 }
1481 const_child_range used_children() const {
1482 return const_child_range(const_child_iterator(), const_child_iterator());
1483 }
1484
1485 static bool classof(const OMPClause *T) {
1486 return T->getClauseKind() == llvm::omp::OMPC_atomic_default_mem_order;
1487 }
1488};
1489
1490/// This represents 'schedule' clause in the '#pragma omp ...' directive.
1491///
1492/// \code
1493/// #pragma omp for schedule(static, 3)
1494/// \endcode
1495/// In this example directive '#pragma omp for' has 'schedule' clause with
1496/// arguments 'static' and '3'.
1497class OMPScheduleClause : public OMPClause, public OMPClauseWithPreInit {
1498 friend class OMPClauseReader;
1499
1500 /// Location of '('.
1501 SourceLocation LParenLoc;
1502
1503 /// A kind of the 'schedule' clause.
1504 OpenMPScheduleClauseKind Kind = OMPC_SCHEDULE_unknown;
1505
1506 /// Modifiers for 'schedule' clause.
1507 enum {FIRST, SECOND, NUM_MODIFIERS};
1508 OpenMPScheduleClauseModifier Modifiers[NUM_MODIFIERS];
1509
1510 /// Locations of modifiers.
1511 SourceLocation ModifiersLoc[NUM_MODIFIERS];
1512
1513 /// Start location of the schedule ind in source code.
1514 SourceLocation KindLoc;
1515
1516 /// Location of ',' (if any).
1517 SourceLocation CommaLoc;
1518
1519 /// Chunk size.
1520 Expr *ChunkSize = nullptr;
1521
1522 /// Set schedule kind.
1523 ///
1524 /// \param K Schedule kind.
1525 void setScheduleKind(OpenMPScheduleClauseKind K) { Kind = K; }
1526
1527 /// Set the first schedule modifier.
1528 ///
1529 /// \param M Schedule modifier.
1530 void setFirstScheduleModifier(OpenMPScheduleClauseModifier M) {
1531 Modifiers[FIRST] = M;
1532 }
1533
1534 /// Set the second schedule modifier.
1535 ///
1536 /// \param M Schedule modifier.
1537 void setSecondScheduleModifier(OpenMPScheduleClauseModifier M) {
1538 Modifiers[SECOND] = M;
1539 }
1540
1541 /// Set location of the first schedule modifier.
1542 void setFirstScheduleModifierLoc(SourceLocation Loc) {
1543 ModifiersLoc[FIRST] = Loc;
1544 }
1545
1546 /// Set location of the second schedule modifier.
1547 void setSecondScheduleModifierLoc(SourceLocation Loc) {
1548 ModifiersLoc[SECOND] = Loc;
1549 }
1550
1551 /// Set schedule modifier location.
1552 ///
1553 /// \param M Schedule modifier location.
1554 void setScheduleModifer(OpenMPScheduleClauseModifier M) {
1555 if (Modifiers[FIRST] == OMPC_SCHEDULE_MODIFIER_unknown)
1556 Modifiers[FIRST] = M;
1557 else {
1558 assert(Modifiers[SECOND] == OMPC_SCHEDULE_MODIFIER_unknown)((void)0);
1559 Modifiers[SECOND] = M;
1560 }
1561 }
1562
1563 /// Sets the location of '('.
1564 ///
1565 /// \param Loc Location of '('.
1566 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
1567
1568 /// Set schedule kind start location.
1569 ///
1570 /// \param KLoc Schedule kind location.
1571 void setScheduleKindLoc(SourceLocation KLoc) { KindLoc = KLoc; }
1572
1573 /// Set location of ','.
1574 ///
1575 /// \param Loc Location of ','.
1576 void setCommaLoc(SourceLocation Loc) { CommaLoc = Loc; }
1577
1578 /// Set chunk size.
1579 ///
1580 /// \param E Chunk size.
1581 void setChunkSize(Expr *E) { ChunkSize = E; }
1582
1583public:
1584 /// Build 'schedule' clause with schedule kind \a Kind and chunk size
1585 /// expression \a ChunkSize.
1586 ///
1587 /// \param StartLoc Starting location of the clause.
1588 /// \param LParenLoc Location of '('.
1589 /// \param KLoc Starting location of the argument.
1590 /// \param CommaLoc Location of ','.
1591 /// \param EndLoc Ending location of the clause.
1592 /// \param Kind Schedule kind.
1593 /// \param ChunkSize Chunk size.
1594 /// \param HelperChunkSize Helper chunk size for combined directives.
1595 /// \param M1 The first modifier applied to 'schedule' clause.
1596 /// \param M1Loc Location of the first modifier
1597 /// \param M2 The second modifier applied to 'schedule' clause.
1598 /// \param M2Loc Location of the second modifier
1599 OMPScheduleClause(SourceLocation StartLoc, SourceLocation LParenLoc,
1600 SourceLocation KLoc, SourceLocation CommaLoc,
1601 SourceLocation EndLoc, OpenMPScheduleClauseKind Kind,
1602 Expr *ChunkSize, Stmt *HelperChunkSize,
1603 OpenMPScheduleClauseModifier M1, SourceLocation M1Loc,
1604 OpenMPScheduleClauseModifier M2, SourceLocation M2Loc)
1605 : OMPClause(llvm::omp::OMPC_schedule, StartLoc, EndLoc),
1606 OMPClauseWithPreInit(this), LParenLoc(LParenLoc), Kind(Kind),
1607 KindLoc(KLoc), CommaLoc(CommaLoc), ChunkSize(ChunkSize) {
1608 setPreInitStmt(HelperChunkSize);
1609 Modifiers[FIRST] = M1;
1610 Modifiers[SECOND] = M2;
1611 ModifiersLoc[FIRST] = M1Loc;
1612 ModifiersLoc[SECOND] = M2Loc;
1613 }
1614
1615 /// Build an empty clause.
1616 explicit OMPScheduleClause()
1617 : OMPClause(llvm::omp::OMPC_schedule, SourceLocation(), SourceLocation()),
1618 OMPClauseWithPreInit(this) {
1619 Modifiers[FIRST] = OMPC_SCHEDULE_MODIFIER_unknown;
1620 Modifiers[SECOND] = OMPC_SCHEDULE_MODIFIER_unknown;
1621 }
1622
1623 /// Get kind of the clause.
1624 OpenMPScheduleClauseKind getScheduleKind() const { return Kind; }
1625
1626 /// Get the first modifier of the clause.
1627 OpenMPScheduleClauseModifier getFirstScheduleModifier() const {
1628 return Modifiers[FIRST];
1629 }
1630
1631 /// Get the second modifier of the clause.
1632 OpenMPScheduleClauseModifier getSecondScheduleModifier() const {
1633 return Modifiers[SECOND];
1634 }
1635
1636 /// Get location of '('.
1637 SourceLocation getLParenLoc() { return LParenLoc; }
1638
1639 /// Get kind location.
1640 SourceLocation getScheduleKindLoc() { return KindLoc; }
1641
1642 /// Get the first modifier location.
1643 SourceLocation getFirstScheduleModifierLoc() const {
1644 return ModifiersLoc[FIRST];
1645 }
1646
1647 /// Get the second modifier location.
1648 SourceLocation getSecondScheduleModifierLoc() const {
1649 return ModifiersLoc[SECOND];
1650 }
1651
1652 /// Get location of ','.
1653 SourceLocation getCommaLoc() { return CommaLoc; }
1654
1655 /// Get chunk size.
1656 Expr *getChunkSize() { return ChunkSize; }
1657
1658 /// Get chunk size.
1659 const Expr *getChunkSize() const { return ChunkSize; }
1660
1661 child_range children() {
1662 return child_range(reinterpret_cast<Stmt **>(&ChunkSize),
1663 reinterpret_cast<Stmt **>(&ChunkSize) + 1);
1664 }
1665
1666 const_child_range children() const {
1667 auto Children = const_cast<OMPScheduleClause *>(this)->children();
1668 return const_child_range(Children.begin(), Children.end());
1669 }
1670
1671 child_range used_children() {
1672 return child_range(child_iterator(), child_iterator());
1673 }
1674 const_child_range used_children() const {
1675 return const_child_range(const_child_iterator(), const_child_iterator());
1676 }
1677
1678 static bool classof(const OMPClause *T) {
1679 return T->getClauseKind() == llvm::omp::OMPC_schedule;
1680 }
1681};
1682
1683/// This represents 'ordered' clause in the '#pragma omp ...' directive.
1684///
1685/// \code
1686/// #pragma omp for ordered (2)
1687/// \endcode
1688/// In this example directive '#pragma omp for' has 'ordered' clause with
1689/// parameter 2.
1690class OMPOrderedClause final
1691 : public OMPClause,
1692 private llvm::TrailingObjects<OMPOrderedClause, Expr *> {
1693 friend class OMPClauseReader;
1694 friend TrailingObjects;
1695
1696 /// Location of '('.
1697 SourceLocation LParenLoc;
1698
1699 /// Number of for-loops.
1700 Stmt *NumForLoops = nullptr;
1701
1702 /// Real number of loops.
1703 unsigned NumberOfLoops = 0;
1704
1705 /// Build 'ordered' clause.
1706 ///
1707 /// \param Num Expression, possibly associated with this clause.
1708 /// \param NumLoops Number of loops, associated with this clause.
1709 /// \param StartLoc Starting location of the clause.
1710 /// \param LParenLoc Location of '('.
1711 /// \param EndLoc Ending location of the clause.
1712 OMPOrderedClause(Expr *Num, unsigned NumLoops, SourceLocation StartLoc,
1713 SourceLocation LParenLoc, SourceLocation EndLoc)
1714 : OMPClause(llvm::omp::OMPC_ordered, StartLoc, EndLoc),
1715 LParenLoc(LParenLoc), NumForLoops(Num), NumberOfLoops(NumLoops) {}
1716
1717 /// Build an empty clause.
1718 explicit OMPOrderedClause(unsigned NumLoops)
1719 : OMPClause(llvm::omp::OMPC_ordered, SourceLocation(), SourceLocation()),
1720 NumberOfLoops(NumLoops) {}
1721
1722 /// Set the number of associated for-loops.
1723 void setNumForLoops(Expr *Num) { NumForLoops = Num; }
1724
1725public:
1726 /// Build 'ordered' clause.
1727 ///
1728 /// \param Num Expression, possibly associated with this clause.
1729 /// \param NumLoops Number of loops, associated with this clause.
1730 /// \param StartLoc Starting location of the clause.
1731 /// \param LParenLoc Location of '('.
1732 /// \param EndLoc Ending location of the clause.
1733 static OMPOrderedClause *Create(const ASTContext &C, Expr *Num,
1734 unsigned NumLoops, SourceLocation StartLoc,
1735 SourceLocation LParenLoc,
1736 SourceLocation EndLoc);
1737
1738 /// Build an empty clause.
1739 static OMPOrderedClause* CreateEmpty(const ASTContext &C, unsigned NumLoops);
1740
1741 /// Sets the location of '('.
1742 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
1743
1744 /// Returns the location of '('.
1745 SourceLocation getLParenLoc() const { return LParenLoc; }
1746
1747 /// Return the number of associated for-loops.
1748 Expr *getNumForLoops() const { return cast_or_null<Expr>(NumForLoops); }
1749
1750 /// Set number of iterations for the specified loop.
1751 void setLoopNumIterations(unsigned NumLoop, Expr *NumIterations);
1752 /// Get number of iterations for all the loops.
1753 ArrayRef<Expr *> getLoopNumIterations() const;
1754
1755 /// Set loop counter for the specified loop.
1756 void setLoopCounter(unsigned NumLoop, Expr *Counter);
1757 /// Get loops counter for the specified loop.
1758 Expr *getLoopCounter(unsigned NumLoop);
1759 const Expr *getLoopCounter(unsigned NumLoop) const;
1760
1761 child_range children() { return child_range(&NumForLoops, &NumForLoops + 1); }
1762
1763 const_child_range children() const {
1764 return const_child_range(&NumForLoops, &NumForLoops + 1);
1765 }
1766
1767 child_range used_children() {
1768 return child_range(child_iterator(), child_iterator());
1769 }
1770 const_child_range used_children() const {
1771 return const_child_range(const_child_iterator(), const_child_iterator());
1772 }
1773
1774 static bool classof(const OMPClause *T) {
1775 return T->getClauseKind() == llvm::omp::OMPC_ordered;
1776 }
1777};
1778
1779/// This represents 'nowait' clause in the '#pragma omp ...' directive.
1780///
1781/// \code
1782/// #pragma omp for nowait
1783/// \endcode
1784/// In this example directive '#pragma omp for' has 'nowait' clause.
1785class OMPNowaitClause : public OMPClause {
1786public:
1787 /// Build 'nowait' clause.
1788 ///
1789 /// \param StartLoc Starting location of the clause.
1790 /// \param EndLoc Ending location of the clause.
1791 OMPNowaitClause(SourceLocation StartLoc, SourceLocation EndLoc)
1792 : OMPClause(llvm::omp::OMPC_nowait, StartLoc, EndLoc) {}
1793
1794 /// Build an empty clause.
1795 OMPNowaitClause()
1796 : OMPClause(llvm::omp::OMPC_nowait, SourceLocation(), SourceLocation()) {}
1797
1798 child_range children() {
1799 return child_range(child_iterator(), child_iterator());
1800 }
1801
1802 const_child_range children() const {
1803 return const_child_range(const_child_iterator(), const_child_iterator());
1804 }
1805
1806 child_range used_children() {
1807 return child_range(child_iterator(), child_iterator());
1808 }
1809 const_child_range used_children() const {
1810 return const_child_range(const_child_iterator(), const_child_iterator());
1811 }
1812
1813 static bool classof(const OMPClause *T) {
1814 return T->getClauseKind() == llvm::omp::OMPC_nowait;
1815 }
1816};
1817
1818/// This represents 'untied' clause in the '#pragma omp ...' directive.
1819///
1820/// \code
1821/// #pragma omp task untied
1822/// \endcode
1823/// In this example directive '#pragma omp task' has 'untied' clause.
1824class OMPUntiedClause : public OMPClause {
1825public:
1826 /// Build 'untied' clause.
1827 ///
1828 /// \param StartLoc Starting location of the clause.
1829 /// \param EndLoc Ending location of the clause.
1830 OMPUntiedClause(SourceLocation StartLoc, SourceLocation EndLoc)
1831 : OMPClause(llvm::omp::OMPC_untied, StartLoc, EndLoc) {}
1832
1833 /// Build an empty clause.
1834 OMPUntiedClause()
1835 : OMPClause(llvm::omp::OMPC_untied, SourceLocation(), SourceLocation()) {}
1836
1837 child_range children() {
1838 return child_range(child_iterator(), child_iterator());
1839 }
1840
1841 const_child_range children() const {
1842 return const_child_range(const_child_iterator(), const_child_iterator());
1843 }
1844
1845 child_range used_children() {
1846 return child_range(child_iterator(), child_iterator());
1847 }
1848 const_child_range used_children() const {
1849 return const_child_range(const_child_iterator(), const_child_iterator());
1850 }
1851
1852 static bool classof(const OMPClause *T) {
1853 return T->getClauseKind() == llvm::omp::OMPC_untied;
1854 }
1855};
1856
1857/// This represents 'mergeable' clause in the '#pragma omp ...'
1858/// directive.
1859///
1860/// \code
1861/// #pragma omp task mergeable
1862/// \endcode
1863/// In this example directive '#pragma omp task' has 'mergeable' clause.
1864class OMPMergeableClause : public OMPClause {
1865public:
1866 /// Build 'mergeable' clause.
1867 ///
1868 /// \param StartLoc Starting location of the clause.
1869 /// \param EndLoc Ending location of the clause.
1870 OMPMergeableClause(SourceLocation StartLoc, SourceLocation EndLoc)
1871 : OMPClause(llvm::omp::OMPC_mergeable, StartLoc, EndLoc) {}
1872
1873 /// Build an empty clause.
1874 OMPMergeableClause()
1875 : OMPClause(llvm::omp::OMPC_mergeable, SourceLocation(),
1876 SourceLocation()) {}
1877
1878 child_range children() {
1879 return child_range(child_iterator(), child_iterator());
1880 }
1881
1882 const_child_range children() const {
1883 return const_child_range(const_child_iterator(), const_child_iterator());
1884 }
1885
1886 child_range used_children() {
1887 return child_range(child_iterator(), child_iterator());
1888 }
1889 const_child_range used_children() const {
1890 return const_child_range(const_child_iterator(), const_child_iterator());
1891 }
1892
1893 static bool classof(const OMPClause *T) {
1894 return T->getClauseKind() == llvm::omp::OMPC_mergeable;
1895 }
1896};
1897
1898/// This represents 'read' clause in the '#pragma omp atomic' directive.
1899///
1900/// \code
1901/// #pragma omp atomic read
1902/// \endcode
1903/// In this example directive '#pragma omp atomic' has 'read' clause.
1904class OMPReadClause : public OMPClause {
1905public:
1906 /// Build 'read' clause.
1907 ///
1908 /// \param StartLoc Starting location of the clause.
1909 /// \param EndLoc Ending location of the clause.
1910 OMPReadClause(SourceLocation StartLoc, SourceLocation EndLoc)
1911 : OMPClause(llvm::omp::OMPC_read, StartLoc, EndLoc) {}
1912
1913 /// Build an empty clause.
1914 OMPReadClause()
1915 : OMPClause(llvm::omp::OMPC_read, SourceLocation(), SourceLocation()) {}
1916
1917 child_range children() {
1918 return child_range(child_iterator(), child_iterator());
1919 }
1920
1921 const_child_range children() const {
1922 return const_child_range(const_child_iterator(), const_child_iterator());
1923 }
1924
1925 child_range used_children() {
1926 return child_range(child_iterator(), child_iterator());
1927 }
1928 const_child_range used_children() const {
1929 return const_child_range(const_child_iterator(), const_child_iterator());
1930 }
1931
1932 static bool classof(const OMPClause *T) {
1933 return T->getClauseKind() == llvm::omp::OMPC_read;
1934 }
1935};
1936
1937/// This represents 'write' clause in the '#pragma omp atomic' directive.
1938///
1939/// \code
1940/// #pragma omp atomic write
1941/// \endcode
1942/// In this example directive '#pragma omp atomic' has 'write' clause.
1943class OMPWriteClause : public OMPClause {
1944public:
1945 /// Build 'write' clause.
1946 ///
1947 /// \param StartLoc Starting location of the clause.
1948 /// \param EndLoc Ending location of the clause.
1949 OMPWriteClause(SourceLocation StartLoc, SourceLocation EndLoc)
1950 : OMPClause(llvm::omp::OMPC_write, StartLoc, EndLoc) {}
1951
1952 /// Build an empty clause.
1953 OMPWriteClause()
1954 : OMPClause(llvm::omp::OMPC_write, SourceLocation(), SourceLocation()) {}
1955
1956 child_range children() {
1957 return child_range(child_iterator(), child_iterator());
1958 }
1959
1960 const_child_range children() const {
1961 return const_child_range(const_child_iterator(), const_child_iterator());
1962 }
1963
1964 child_range used_children() {
1965 return child_range(child_iterator(), child_iterator());
1966 }
1967 const_child_range used_children() const {
1968 return const_child_range(const_child_iterator(), const_child_iterator());
1969 }
1970
1971 static bool classof(const OMPClause *T) {
1972 return T->getClauseKind() == llvm::omp::OMPC_write;
1973 }
1974};
1975
1976/// This represents 'update' clause in the '#pragma omp atomic'
1977/// directive.
1978///
1979/// \code
1980/// #pragma omp atomic update
1981/// \endcode
1982/// In this example directive '#pragma omp atomic' has 'update' clause.
1983/// Also, this class represents 'update' clause in '#pragma omp depobj'
1984/// directive.
1985///
1986/// \code
1987/// #pragma omp depobj(a) update(in)
1988/// \endcode
1989/// In this example directive '#pragma omp depobj' has 'update' clause with 'in'
1990/// dependence kind.
1991class OMPUpdateClause final
1992 : public OMPClause,
1993 private llvm::TrailingObjects<OMPUpdateClause, SourceLocation,
1994 OpenMPDependClauseKind> {
1995 friend class OMPClauseReader;
1996 friend TrailingObjects;
1997
1998 /// true if extended version of the clause for 'depobj' directive.
1999 bool IsExtended = false;
2000
2001 /// Define the sizes of each trailing object array except the last one. This
2002 /// is required for TrailingObjects to work properly.
2003 size_t numTrailingObjects(OverloadToken<SourceLocation>) const {
2004 // 2 locations: for '(' and argument location.
2005 return IsExtended ? 2 : 0;
2006 }
2007
2008 /// Sets the the location of '(' in clause for 'depobj' directive.
2009 void setLParenLoc(SourceLocation Loc) {
2010 assert(IsExtended && "Expected extended clause.")((void)0);
2011 *getTrailingObjects<SourceLocation>() = Loc;
2012 }
2013
2014 /// Sets the the location of '(' in clause for 'depobj' directive.
2015 void setArgumentLoc(SourceLocation Loc) {
2016 assert(IsExtended && "Expected extended clause.")((void)0);
2017 *std::next(getTrailingObjects<SourceLocation>(), 1) = Loc;
2018 }
2019
2020 /// Sets the dependence kind for the clause for 'depobj' directive.
2021 void setDependencyKind(OpenMPDependClauseKind DK) {
2022 assert(IsExtended && "Expected extended clause.")((void)0);
2023 *getTrailingObjects<OpenMPDependClauseKind>() = DK;
2024 }
2025
2026 /// Build 'update' clause.
2027 ///
2028 /// \param StartLoc Starting location of the clause.
2029 /// \param EndLoc Ending location of the clause.
2030 OMPUpdateClause(SourceLocation StartLoc, SourceLocation EndLoc,
2031 bool IsExtended)
2032 : OMPClause(llvm::omp::OMPC_update, StartLoc, EndLoc),
2033 IsExtended(IsExtended) {}
2034
2035 /// Build an empty clause.
2036 OMPUpdateClause(bool IsExtended)
2037 : OMPClause(llvm::omp::OMPC_update, SourceLocation(), SourceLocation()),
2038 IsExtended(IsExtended) {}
2039
2040public:
2041 /// Creates clause for 'atomic' directive.
2042 ///
2043 /// \param C AST context.
2044 /// \param StartLoc Starting location of the clause.
2045 /// \param EndLoc Ending location of the clause.
2046 static OMPUpdateClause *Create(const ASTContext &C, SourceLocation StartLoc,
2047 SourceLocation EndLoc);
2048
2049 /// Creates clause for 'depobj' directive.
2050 ///
2051 /// \param C AST context.
2052 /// \param StartLoc Starting location of the clause.
2053 /// \param LParenLoc Location of '('.
2054 /// \param ArgumentLoc Location of the argument.
2055 /// \param DK Dependence kind.
2056 /// \param EndLoc Ending location of the clause.
2057 static OMPUpdateClause *Create(const ASTContext &C, SourceLocation StartLoc,
2058 SourceLocation LParenLoc,
2059 SourceLocation ArgumentLoc,
2060 OpenMPDependClauseKind DK,
2061 SourceLocation EndLoc);
2062
2063 /// Creates an empty clause with the place for \a N variables.
2064 ///
2065 /// \param C AST context.
2066 /// \param IsExtended true if extended clause for 'depobj' directive must be
2067 /// created.
2068 static OMPUpdateClause *CreateEmpty(const ASTContext &C, bool IsExtended);
2069
2070 /// Checks if the clause is the extended clauses for 'depobj' directive.
2071 bool isExtended() const { return IsExtended; }
2072
2073 child_range children() {
2074 return child_range(child_iterator(), child_iterator());
2075 }
2076
2077 const_child_range children() const {
2078 return const_child_range(const_child_iterator(), const_child_iterator());
2079 }
2080
2081 child_range used_children() {
2082 return child_range(child_iterator(), child_iterator());
2083 }
2084 const_child_range used_children() const {
2085 return const_child_range(const_child_iterator(), const_child_iterator());
2086 }
2087
2088 /// Gets the the location of '(' in clause for 'depobj' directive.
2089 SourceLocation getLParenLoc() const {
2090 assert(IsExtended && "Expected extended clause.")((void)0);
2091 return *getTrailingObjects<SourceLocation>();
2092 }
2093
2094 /// Gets the the location of argument in clause for 'depobj' directive.
2095 SourceLocation getArgumentLoc() const {
2096 assert(IsExtended && "Expected extended clause.")((void)0);
2097 return *std::next(getTrailingObjects<SourceLocation>(), 1);
2098 }
2099
2100 /// Gets the dependence kind in clause for 'depobj' directive.
2101 OpenMPDependClauseKind getDependencyKind() const {
2102 assert(IsExtended && "Expected extended clause.")((void)0);
2103 return *getTrailingObjects<OpenMPDependClauseKind>();
2104 }
2105
2106 static bool classof(const OMPClause *T) {
2107 return T->getClauseKind() == llvm::omp::OMPC_update;
2108 }
2109};
2110
2111/// This represents 'capture' clause in the '#pragma omp atomic'
2112/// directive.
2113///
2114/// \code
2115/// #pragma omp atomic capture
2116/// \endcode
2117/// In this example directive '#pragma omp atomic' has 'capture' clause.
2118class OMPCaptureClause : public OMPClause {
2119public:
2120 /// Build 'capture' clause.
2121 ///
2122 /// \param StartLoc Starting location of the clause.
2123 /// \param EndLoc Ending location of the clause.
2124 OMPCaptureClause(SourceLocation StartLoc, SourceLocation EndLoc)
2125 : OMPClause(llvm::omp::OMPC_capture, StartLoc, EndLoc) {}
2126
2127 /// Build an empty clause.
2128 OMPCaptureClause()
2129 : OMPClause(llvm::omp::OMPC_capture, SourceLocation(), SourceLocation()) {
2130 }
2131
2132 child_range children() {
2133 return child_range(child_iterator(), child_iterator());
2134 }
2135
2136 const_child_range children() const {
2137 return const_child_range(const_child_iterator(), const_child_iterator());
2138 }
2139
2140 child_range used_children() {
2141 return child_range(child_iterator(), child_iterator());
2142 }
2143 const_child_range used_children() const {
2144 return const_child_range(const_child_iterator(), const_child_iterator());
2145 }
2146
2147 static bool classof(const OMPClause *T) {
2148 return T->getClauseKind() == llvm::omp::OMPC_capture;
2149 }
2150};
2151
2152/// This represents 'seq_cst' clause in the '#pragma omp atomic'
2153/// directive.
2154///
2155/// \code
2156/// #pragma omp atomic seq_cst
2157/// \endcode
2158/// In this example directive '#pragma omp atomic' has 'seq_cst' clause.
2159class OMPSeqCstClause : public OMPClause {
2160public:
2161 /// Build 'seq_cst' clause.
2162 ///
2163 /// \param StartLoc Starting location of the clause.
2164 /// \param EndLoc Ending location of the clause.
2165 OMPSeqCstClause(SourceLocation StartLoc, SourceLocation EndLoc)
2166 : OMPClause(llvm::omp::OMPC_seq_cst, StartLoc, EndLoc) {}
2167
2168 /// Build an empty clause.
2169 OMPSeqCstClause()
2170 : OMPClause(llvm::omp::OMPC_seq_cst, SourceLocation(), SourceLocation()) {
2171 }
2172
2173 child_range children() {
2174 return child_range(child_iterator(), child_iterator());
2175 }
2176
2177 const_child_range children() const {
2178 return const_child_range(const_child_iterator(), const_child_iterator());
2179 }
2180
2181 child_range used_children() {
2182 return child_range(child_iterator(), child_iterator());
2183 }
2184 const_child_range used_children() const {
2185 return const_child_range(const_child_iterator(), const_child_iterator());
2186 }
2187
2188 static bool classof(const OMPClause *T) {
2189 return T->getClauseKind() == llvm::omp::OMPC_seq_cst;
2190 }
2191};
2192
2193/// This represents 'acq_rel' clause in the '#pragma omp atomic|flush'
2194/// directives.
2195///
2196/// \code
2197/// #pragma omp flush acq_rel
2198/// \endcode
2199/// In this example directive '#pragma omp flush' has 'acq_rel' clause.
2200class OMPAcqRelClause final : public OMPClause {
2201public:
2202 /// Build 'ack_rel' clause.
2203 ///
2204 /// \param StartLoc Starting location of the clause.
2205 /// \param EndLoc Ending location of the clause.
2206 OMPAcqRelClause(SourceLocation StartLoc, SourceLocation EndLoc)
2207 : OMPClause(llvm::omp::OMPC_acq_rel, StartLoc, EndLoc) {}
2208
2209 /// Build an empty clause.
2210 OMPAcqRelClause()
2211 : OMPClause(llvm::omp::OMPC_acq_rel, SourceLocation(), SourceLocation()) {
2212 }
2213
2214 child_range children() {
2215 return child_range(child_iterator(), child_iterator());
2216 }
2217
2218 const_child_range children() const {
2219 return const_child_range(const_child_iterator(), const_child_iterator());
2220 }
2221
2222 child_range used_children() {
2223 return child_range(child_iterator(), child_iterator());
2224 }
2225 const_child_range used_children() const {
2226 return const_child_range(const_child_iterator(), const_child_iterator());
2227 }
2228
2229 static bool classof(const OMPClause *T) {
2230 return T->getClauseKind() == llvm::omp::OMPC_acq_rel;
2231 }
2232};
2233
2234/// This represents 'acquire' clause in the '#pragma omp atomic|flush'
2235/// directives.
2236///
2237/// \code
2238/// #pragma omp flush acquire
2239/// \endcode
2240/// In this example directive '#pragma omp flush' has 'acquire' clause.
2241class OMPAcquireClause final : public OMPClause {
2242public:
2243 /// Build 'acquire' clause.
2244 ///
2245 /// \param StartLoc Starting location of the clause.
2246 /// \param EndLoc Ending location of the clause.
2247 OMPAcquireClause(SourceLocation StartLoc, SourceLocation EndLoc)
2248 : OMPClause(llvm::omp::OMPC_acquire, StartLoc, EndLoc) {}
2249
2250 /// Build an empty clause.
2251 OMPAcquireClause()
2252 : OMPClause(llvm::omp::OMPC_acquire, SourceLocation(), SourceLocation()) {
2253 }
2254
2255 child_range children() {
2256 return child_range(child_iterator(), child_iterator());
2257 }
2258
2259 const_child_range children() const {
2260 return const_child_range(const_child_iterator(), const_child_iterator());
2261 }
2262
2263 child_range used_children() {
2264 return child_range(child_iterator(), child_iterator());
2265 }
2266 const_child_range used_children() const {
2267 return const_child_range(const_child_iterator(), const_child_iterator());
2268 }
2269
2270 static bool classof(const OMPClause *T) {
2271 return T->getClauseKind() == llvm::omp::OMPC_acquire;
2272 }
2273};
2274
2275/// This represents 'release' clause in the '#pragma omp atomic|flush'
2276/// directives.
2277///
2278/// \code
2279/// #pragma omp flush release
2280/// \endcode
2281/// In this example directive '#pragma omp flush' has 'release' clause.
2282class OMPReleaseClause final : public OMPClause {
2283public:
2284 /// Build 'release' clause.
2285 ///
2286 /// \param StartLoc Starting location of the clause.
2287 /// \param EndLoc Ending location of the clause.
2288 OMPReleaseClause(SourceLocation StartLoc, SourceLocation EndLoc)
2289 : OMPClause(llvm::omp::OMPC_release, StartLoc, EndLoc) {}
2290
2291 /// Build an empty clause.
2292 OMPReleaseClause()
2293 : OMPClause(llvm::omp::OMPC_release, SourceLocation(), SourceLocation()) {
2294 }
2295
2296 child_range children() {
2297 return child_range(child_iterator(), child_iterator());
2298 }
2299
2300 const_child_range children() const {
2301 return const_child_range(const_child_iterator(), const_child_iterator());
2302 }
2303
2304 child_range used_children() {
2305 return child_range(child_iterator(), child_iterator());
2306 }
2307 const_child_range used_children() const {
2308 return const_child_range(const_child_iterator(), const_child_iterator());
2309 }
2310
2311 static bool classof(const OMPClause *T) {
2312 return T->getClauseKind() == llvm::omp::OMPC_release;
2313 }
2314};
2315
2316/// This represents 'relaxed' clause in the '#pragma omp atomic'
2317/// directives.
2318///
2319/// \code
2320/// #pragma omp atomic relaxed
2321/// \endcode
2322/// In this example directive '#pragma omp atomic' has 'relaxed' clause.
2323class OMPRelaxedClause final : public OMPClause {
2324public:
2325 /// Build 'relaxed' clause.
2326 ///
2327 /// \param StartLoc Starting location of the clause.
2328 /// \param EndLoc Ending location of the clause.
2329 OMPRelaxedClause(SourceLocation StartLoc, SourceLocation EndLoc)
2330 : OMPClause(llvm::omp::OMPC_relaxed, StartLoc, EndLoc) {}
2331
2332 /// Build an empty clause.
2333 OMPRelaxedClause()
2334 : OMPClause(llvm::omp::OMPC_relaxed, SourceLocation(), SourceLocation()) {
2335 }
2336
2337 child_range children() {
2338 return child_range(child_iterator(), child_iterator());
2339 }
2340
2341 const_child_range children() const {
2342 return const_child_range(const_child_iterator(), const_child_iterator());
2343 }
2344
2345 child_range used_children() {
2346 return child_range(child_iterator(), child_iterator());
2347 }
2348 const_child_range used_children() const {
2349 return const_child_range(const_child_iterator(), const_child_iterator());
2350 }
2351
2352 static bool classof(const OMPClause *T) {
2353 return T->getClauseKind() == llvm::omp::OMPC_relaxed;
2354 }
2355};
2356
2357/// This represents clause 'private' in the '#pragma omp ...' directives.
2358///
2359/// \code
2360/// #pragma omp parallel private(a,b)
2361/// \endcode
2362/// In this example directive '#pragma omp parallel' has clause 'private'
2363/// with the variables 'a' and 'b'.
2364class OMPPrivateClause final
2365 : public OMPVarListClause<OMPPrivateClause>,
2366 private llvm::TrailingObjects<OMPPrivateClause, Expr *> {
2367 friend class OMPClauseReader;
2368 friend OMPVarListClause;
2369 friend TrailingObjects;
2370
2371 /// Build clause with number of variables \a N.
2372 ///
2373 /// \param StartLoc Starting location of the clause.
2374 /// \param LParenLoc Location of '('.
2375 /// \param EndLoc Ending location of the clause.
2376 /// \param N Number of the variables in the clause.
2377 OMPPrivateClause(SourceLocation StartLoc, SourceLocation LParenLoc,
2378 SourceLocation EndLoc, unsigned N)
2379 : OMPVarListClause<OMPPrivateClause>(llvm::omp::OMPC_private, StartLoc,
2380 LParenLoc, EndLoc, N) {}
2381
2382 /// Build an empty clause.
2383 ///
2384 /// \param N Number of variables.
2385 explicit OMPPrivateClause(unsigned N)
2386 : OMPVarListClause<OMPPrivateClause>(llvm::omp::OMPC_private,
2387 SourceLocation(), SourceLocation(),
2388 SourceLocation(), N) {}
2389
2390 /// Sets the list of references to private copies with initializers for
2391 /// new private variables.
2392 /// \param VL List of references.
2393 void setPrivateCopies(ArrayRef<Expr *> VL);
2394
2395 /// Gets the list of references to private copies with initializers for
2396 /// new private variables.
2397 MutableArrayRef<Expr *> getPrivateCopies() {
2398 return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
2399 }
2400 ArrayRef<const Expr *> getPrivateCopies() const {
2401 return llvm::makeArrayRef(varlist_end(), varlist_size());
2402 }
2403
2404public:
2405 /// Creates clause with a list of variables \a VL.
2406 ///
2407 /// \param C AST context.
2408 /// \param StartLoc Starting location of the clause.
2409 /// \param LParenLoc Location of '('.
2410 /// \param EndLoc Ending location of the clause.
2411 /// \param VL List of references to the variables.
2412 /// \param PrivateVL List of references to private copies with initializers.
2413 static OMPPrivateClause *Create(const ASTContext &C, SourceLocation StartLoc,
2414 SourceLocation LParenLoc,
2415 SourceLocation EndLoc, ArrayRef<Expr *> VL,
2416 ArrayRef<Expr *> PrivateVL);
2417
2418 /// Creates an empty clause with the place for \a N variables.
2419 ///
2420 /// \param C AST context.
2421 /// \param N The number of variables.
2422 static OMPPrivateClause *CreateEmpty(const ASTContext &C, unsigned N);
2423
2424 using private_copies_iterator = MutableArrayRef<Expr *>::iterator;
2425 using private_copies_const_iterator = ArrayRef<const Expr *>::iterator;
2426 using private_copies_range = llvm::iterator_range<private_copies_iterator>;
2427 using private_copies_const_range =
2428 llvm::iterator_range<private_copies_const_iterator>;
2429
2430 private_copies_range private_copies() {
2431 return private_copies_range(getPrivateCopies().begin(),
2432 getPrivateCopies().end());
2433 }
2434
2435 private_copies_const_range private_copies() const {
2436 return private_copies_const_range(getPrivateCopies().begin(),
2437 getPrivateCopies().end());
2438 }
2439
2440 child_range children() {
2441 return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
2442 reinterpret_cast<Stmt **>(varlist_end()));
2443 }
2444
2445 const_child_range children() const {
2446 auto Children = const_cast<OMPPrivateClause *>(this)->children();
2447 return const_child_range(Children.begin(), Children.end());
2448 }
2449
2450 child_range used_children() {
2451 return child_range(child_iterator(), child_iterator());
2452 }
2453 const_child_range used_children() const {
2454 return const_child_range(const_child_iterator(), const_child_iterator());
2455 }
2456
2457 static bool classof(const OMPClause *T) {
2458 return T->getClauseKind() == llvm::omp::OMPC_private;
2459 }
2460};
2461
2462/// This represents clause 'firstprivate' in the '#pragma omp ...'
2463/// directives.
2464///
2465/// \code
2466/// #pragma omp parallel firstprivate(a,b)
2467/// \endcode
2468/// In this example directive '#pragma omp parallel' has clause 'firstprivate'
2469/// with the variables 'a' and 'b'.
2470class OMPFirstprivateClause final
2471 : public OMPVarListClause<OMPFirstprivateClause>,
2472 public OMPClauseWithPreInit,
2473 private llvm::TrailingObjects<OMPFirstprivateClause, Expr *> {
2474 friend class OMPClauseReader;
2475 friend OMPVarListClause;
2476 friend TrailingObjects;
2477
2478 /// Build clause with number of variables \a N.
2479 ///
2480 /// \param StartLoc Starting location of the clause.
2481 /// \param LParenLoc Location of '('.
2482 /// \param EndLoc Ending location of the clause.
2483 /// \param N Number of the variables in the clause.
2484 OMPFirstprivateClause(SourceLocation StartLoc, SourceLocation LParenLoc,
2485 SourceLocation EndLoc, unsigned N)
2486 : OMPVarListClause<OMPFirstprivateClause>(llvm::omp::OMPC_firstprivate,
2487 StartLoc, LParenLoc, EndLoc, N),
2488 OMPClauseWithPreInit(this) {}
2489
2490 /// Build an empty clause.
2491 ///
2492 /// \param N Number of variables.
2493 explicit OMPFirstprivateClause(unsigned N)
2494 : OMPVarListClause<OMPFirstprivateClause>(
2495 llvm::omp::OMPC_firstprivate, SourceLocation(), SourceLocation(),
2496 SourceLocation(), N),
2497 OMPClauseWithPreInit(this) {}
2498
2499 /// Sets the list of references to private copies with initializers for
2500 /// new private variables.
2501 /// \param VL List of references.
2502 void setPrivateCopies(ArrayRef<Expr *> VL);
2503
2504 /// Gets the list of references to private copies with initializers for
2505 /// new private variables.
2506 MutableArrayRef<Expr *> getPrivateCopies() {
2507 return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
2508 }
2509 ArrayRef<const Expr *> getPrivateCopies() const {
2510 return llvm::makeArrayRef(varlist_end(), varlist_size());
2511 }
2512
2513 /// Sets the list of references to initializer variables for new
2514 /// private variables.
2515 /// \param VL List of references.
2516 void setInits(ArrayRef<Expr *> VL);
2517
2518 /// Gets the list of references to initializer variables for new
2519 /// private variables.
2520 MutableArrayRef<Expr *> getInits() {
2521 return MutableArrayRef<Expr *>(getPrivateCopies().end(), varlist_size());
2522 }
2523 ArrayRef<const Expr *> getInits() const {
2524 return llvm::makeArrayRef(getPrivateCopies().end(), varlist_size());
2525 }
2526
2527public:
2528 /// Creates clause with a list of variables \a VL.
2529 ///
2530 /// \param C AST context.
2531 /// \param StartLoc Starting location of the clause.
2532 /// \param LParenLoc Location of '('.
2533 /// \param EndLoc Ending location of the clause.
2534 /// \param VL List of references to the original variables.
2535 /// \param PrivateVL List of references to private copies with initializers.
2536 /// \param InitVL List of references to auto generated variables used for
2537 /// initialization of a single array element. Used if firstprivate variable is
2538 /// of array type.
2539 /// \param PreInit Statement that must be executed before entering the OpenMP
2540 /// region with this clause.
2541 static OMPFirstprivateClause *
2542 Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
2543 SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> PrivateVL,
2544 ArrayRef<Expr *> InitVL, Stmt *PreInit);
2545
2546 /// Creates an empty clause with the place for \a N variables.
2547 ///
2548 /// \param C AST context.
2549 /// \param N The number of variables.
2550 static OMPFirstprivateClause *CreateEmpty(const ASTContext &C, unsigned N);
2551
2552 using private_copies_iterator = MutableArrayRef<Expr *>::iterator;
2553 using private_copies_const_iterator = ArrayRef<const Expr *>::iterator;
2554 using private_copies_range = llvm::iterator_range<private_copies_iterator>;
2555 using private_copies_const_range =
2556 llvm::iterator_range<private_copies_const_iterator>;
2557
2558 private_copies_range private_copies() {
2559 return private_copies_range(getPrivateCopies().begin(),
2560 getPrivateCopies().end());
2561 }
2562 private_copies_const_range private_copies() const {
2563 return private_copies_const_range(getPrivateCopies().begin(),
2564 getPrivateCopies().end());
2565 }
2566
2567 using inits_iterator = MutableArrayRef<Expr *>::iterator;
2568 using inits_const_iterator = ArrayRef<const Expr *>::iterator;
2569 using inits_range = llvm::iterator_range<inits_iterator>;
2570 using inits_const_range = llvm::iterator_range<inits_const_iterator>;
2571
2572 inits_range inits() {
2573 return inits_range(getInits().begin(), getInits().end());
2574 }
2575 inits_const_range inits() const {
2576 return inits_const_range(getInits().begin(), getInits().end());
2577 }
2578
2579 child_range children() {
2580 return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
2581 reinterpret_cast<Stmt **>(varlist_end()));
2582 }
2583
2584 const_child_range children() const {
2585 auto Children = const_cast<OMPFirstprivateClause *>(this)->children();
2586 return const_child_range(Children.begin(), Children.end());
2587 }
2588
2589 child_range used_children() {
2590 return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
2591 reinterpret_cast<Stmt **>(varlist_end()));
2592 }
2593 const_child_range used_children() const {
2594 auto Children = const_cast<OMPFirstprivateClause *>(this)->used_children();
2595 return const_child_range(Children.begin(), Children.end());
2596 }
2597
2598 static bool classof(const OMPClause *T) {
2599 return T->getClauseKind() == llvm::omp::OMPC_firstprivate;
2600 }
2601};
2602
2603/// This represents clause 'lastprivate' in the '#pragma omp ...'
2604/// directives.
2605///
2606/// \code
2607/// #pragma omp simd lastprivate(a,b)
2608/// \endcode
2609/// In this example directive '#pragma omp simd' has clause 'lastprivate'
2610/// with the variables 'a' and 'b'.
2611class OMPLastprivateClause final
2612 : public OMPVarListClause<OMPLastprivateClause>,
2613 public OMPClauseWithPostUpdate,
2614 private llvm::TrailingObjects<OMPLastprivateClause, Expr *> {
2615 // There are 4 additional tail-allocated arrays at the end of the class:
2616 // 1. Contains list of pseudo variables with the default initialization for
2617 // each non-firstprivate variables. Used in codegen for initialization of
2618 // lastprivate copies.
2619 // 2. List of helper expressions for proper generation of assignment operation
2620 // required for lastprivate clause. This list represents private variables
2621 // (for arrays, single array element).
2622 // 3. List of helper expressions for proper generation of assignment operation
2623 // required for lastprivate clause. This list represents original variables
2624 // (for arrays, single array element).
2625 // 4. List of helper expressions that represents assignment operation:
2626 // \code
2627 // DstExprs = SrcExprs;
2628 // \endcode
2629 // Required for proper codegen of final assignment performed by the
2630 // lastprivate clause.
2631 friend class OMPClauseReader;
2632 friend OMPVarListClause;
2633 friend TrailingObjects;
2634
2635 /// Optional lastprivate kind, e.g. 'conditional', if specified by user.
2636 OpenMPLastprivateModifier LPKind;
2637 /// Optional location of the lasptrivate kind, if specified by user.
2638 SourceLocation LPKindLoc;
2639 /// Optional colon location, if specified by user.
2640 SourceLocation ColonLoc;
2641
2642 /// Build clause with number of variables \a N.
2643 ///
2644 /// \param StartLoc Starting location of the clause.
2645 /// \param LParenLoc Location of '('.
2646 /// \param EndLoc Ending location of the clause.
2647 /// \param N Number of the variables in the clause.
2648 OMPLastprivateClause(SourceLocation StartLoc, SourceLocation LParenLoc,
2649 SourceLocation EndLoc, OpenMPLastprivateModifier LPKind,
2650 SourceLocation LPKindLoc, SourceLocation ColonLoc,
2651 unsigned N)
2652 : OMPVarListClause<OMPLastprivateClause>(llvm::omp::OMPC_lastprivate,
2653 StartLoc, LParenLoc, EndLoc, N),
2654 OMPClauseWithPostUpdate(this), LPKind(LPKind), LPKindLoc(LPKindLoc),
2655 ColonLoc(ColonLoc) {}
2656
2657 /// Build an empty clause.
2658 ///
2659 /// \param N Number of variables.
2660 explicit OMPLastprivateClause(unsigned N)
2661 : OMPVarListClause<OMPLastprivateClause>(
2662 llvm::omp::OMPC_lastprivate, SourceLocation(), SourceLocation(),
2663 SourceLocation(), N),
2664 OMPClauseWithPostUpdate(this) {}
2665
2666 /// Get the list of helper expressions for initialization of private
2667 /// copies for lastprivate variables.
2668 MutableArrayRef<Expr *> getPrivateCopies() {
2669 return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
2670 }
2671 ArrayRef<const Expr *> getPrivateCopies() const {
2672 return llvm::makeArrayRef(varlist_end(), varlist_size());
2673 }
2674
2675 /// Set list of helper expressions, required for proper codegen of the
2676 /// clause. These expressions represent private variables (for arrays, single
2677 /// array element) in the final assignment statement performed by the
2678 /// lastprivate clause.
2679 void setSourceExprs(ArrayRef<Expr *> SrcExprs);
2680
2681 /// Get the list of helper source expressions.
2682 MutableArrayRef<Expr *> getSourceExprs() {
2683 return MutableArrayRef<Expr *>(getPrivateCopies().end(), varlist_size());
2684 }
2685 ArrayRef<const Expr *> getSourceExprs() const {
2686 return llvm::makeArrayRef(getPrivateCopies().end(), varlist_size());
2687 }
2688
2689 /// Set list of helper expressions, required for proper codegen of the
2690 /// clause. These expressions represent original variables (for arrays, single
2691 /// array element) in the final assignment statement performed by the
2692 /// lastprivate clause.
2693 void setDestinationExprs(ArrayRef<Expr *> DstExprs);
2694
2695 /// Get the list of helper destination expressions.
2696 MutableArrayRef<Expr *> getDestinationExprs() {
2697 return MutableArrayRef<Expr *>(getSourceExprs().end(), varlist_size());
2698 }
2699 ArrayRef<const Expr *> getDestinationExprs() const {
2700 return llvm::makeArrayRef(getSourceExprs().end(), varlist_size());
2701 }
2702
2703 /// Set list of helper assignment expressions, required for proper
2704 /// codegen of the clause. These expressions are assignment expressions that
2705 /// assign private copy of the variable to original variable.
2706 void setAssignmentOps(ArrayRef<Expr *> AssignmentOps);
2707
2708 /// Get the list of helper assignment expressions.
2709 MutableArrayRef<Expr *> getAssignmentOps() {
2710 return MutableArrayRef<Expr *>(getDestinationExprs().end(), varlist_size());
2711 }
2712 ArrayRef<const Expr *> getAssignmentOps() const {
2713 return llvm::makeArrayRef(getDestinationExprs().end(), varlist_size());
2714 }
2715
2716 /// Sets lastprivate kind.
2717 void setKind(OpenMPLastprivateModifier Kind) { LPKind = Kind; }
2718 /// Sets location of the lastprivate kind.
2719 void setKindLoc(SourceLocation Loc) { LPKindLoc = Loc; }
2720 /// Sets colon symbol location.
2721 void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
2722
2723public:
2724 /// Creates clause with a list of variables \a VL.
2725 ///
2726 /// \param C AST context.
2727 /// \param StartLoc Starting location of the clause.
2728 /// \param LParenLoc Location of '('.
2729 /// \param EndLoc Ending location of the clause.
2730 /// \param VL List of references to the variables.
2731 /// \param SrcExprs List of helper expressions for proper generation of
2732 /// assignment operation required for lastprivate clause. This list represents
2733 /// private variables (for arrays, single array element).
2734 /// \param DstExprs List of helper expressions for proper generation of
2735 /// assignment operation required for lastprivate clause. This list represents
2736 /// original variables (for arrays, single array element).
2737 /// \param AssignmentOps List of helper expressions that represents assignment
2738 /// operation:
2739 /// \code
2740 /// DstExprs = SrcExprs;
2741 /// \endcode
2742 /// Required for proper codegen of final assignment performed by the
2743 /// lastprivate clause.
2744 /// \param LPKind Lastprivate kind, e.g. 'conditional'.
2745 /// \param LPKindLoc Location of the lastprivate kind.
2746 /// \param ColonLoc Location of the ':' symbol if lastprivate kind is used.
2747 /// \param PreInit Statement that must be executed before entering the OpenMP
2748 /// region with this clause.
2749 /// \param PostUpdate Expression that must be executed after exit from the
2750 /// OpenMP region with this clause.
2751 static OMPLastprivateClause *
2752 Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
2753 SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs,
2754 ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps,
2755 OpenMPLastprivateModifier LPKind, SourceLocation LPKindLoc,
2756 SourceLocation ColonLoc, Stmt *PreInit, Expr *PostUpdate);
2757
2758 /// Creates an empty clause with the place for \a N variables.
2759 ///
2760 /// \param C AST context.
2761 /// \param N The number of variables.
2762 static OMPLastprivateClause *CreateEmpty(const ASTContext &C, unsigned N);
2763
2764 /// Lastprivate kind.
2765 OpenMPLastprivateModifier getKind() const { return LPKind; }
2766 /// Returns the location of the lastprivate kind.
2767 SourceLocation getKindLoc() const { return LPKindLoc; }
2768 /// Returns the location of the ':' symbol, if any.
2769 SourceLocation getColonLoc() const { return ColonLoc; }
2770
2771 using helper_expr_iterator = MutableArrayRef<Expr *>::iterator;
2772 using helper_expr_const_iterator = ArrayRef<const Expr *>::iterator;
2773 using helper_expr_range = llvm::iterator_range<helper_expr_iterator>;
2774 using helper_expr_const_range =
2775 llvm::iterator_range<helper_expr_const_iterator>;
2776
2777 /// Set list of helper expressions, required for generation of private
2778 /// copies of original lastprivate variables.
2779 void setPrivateCopies(ArrayRef<Expr *> PrivateCopies);
2780
2781 helper_expr_const_range private_copies() const {
2782 return helper_expr_const_range(getPrivateCopies().begin(),
2783 getPrivateCopies().end());
2784 }
2785
2786 helper_expr_range private_copies() {
2787 return helper_expr_range(getPrivateCopies().begin(),
2788 getPrivateCopies().end());
2789 }
2790
2791 helper_expr_const_range source_exprs() const {
2792 return helper_expr_const_range(getSourceExprs().begin(),
2793 getSourceExprs().end());
2794 }
2795
2796 helper_expr_range source_exprs() {
2797 return helper_expr_range(getSourceExprs().begin(), getSourceExprs().end());
2798 }
2799
2800 helper_expr_const_range destination_exprs() const {
2801 return helper_expr_const_range(getDestinationExprs().begin(),
2802 getDestinationExprs().end());
2803 }
2804
2805 helper_expr_range destination_exprs() {
2806 return helper_expr_range(getDestinationExprs().begin(),
2807 getDestinationExprs().end());
2808 }
2809
2810 helper_expr_const_range assignment_ops() const {
2811 return helper_expr_const_range(getAssignmentOps().begin(),
2812 getAssignmentOps().end());
2813 }
2814
2815 helper_expr_range assignment_ops() {
2816 return helper_expr_range(getAssignmentOps().begin(),
2817 getAssignmentOps().end());
2818 }
2819
2820 child_range children() {
2821 return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
2822 reinterpret_cast<Stmt **>(varlist_end()));
2823 }
2824
2825 const_child_range children() const {
2826 auto Children = const_cast<OMPLastprivateClause *>(this)->children();
2827 return const_child_range(Children.begin(), Children.end());
2828 }
2829
2830 child_range used_children() {
2831 return child_range(child_iterator(), child_iterator());
2832 }
2833 const_child_range used_children() const {
2834 return const_child_range(const_child_iterator(), const_child_iterator());
2835 }
2836
2837 static bool classof(const OMPClause *T) {
2838 return T->getClauseKind() == llvm::omp::OMPC_lastprivate;
2839 }
2840};
2841
2842/// This represents clause 'shared' in the '#pragma omp ...' directives.
2843///
2844/// \code
2845/// #pragma omp parallel shared(a,b)
2846/// \endcode
2847/// In this example directive '#pragma omp parallel' has clause 'shared'
2848/// with the variables 'a' and 'b'.
2849class OMPSharedClause final
2850 : public OMPVarListClause<OMPSharedClause>,
2851 private llvm::TrailingObjects<OMPSharedClause, Expr *> {
2852 friend OMPVarListClause;
2853 friend TrailingObjects;
2854
2855 /// Build clause with number of variables \a N.
2856 ///
2857 /// \param StartLoc Starting location of the clause.
2858 /// \param LParenLoc Location of '('.
2859 /// \param EndLoc Ending location of the clause.
2860 /// \param N Number of the variables in the clause.
2861 OMPSharedClause(SourceLocation StartLoc, SourceLocation LParenLoc,
2862 SourceLocation EndLoc, unsigned N)
2863 : OMPVarListClause<OMPSharedClause>(llvm::omp::OMPC_shared, StartLoc,
2864 LParenLoc, EndLoc, N) {}
2865
2866 /// Build an empty clause.
2867 ///
2868 /// \param N Number of variables.
2869 explicit OMPSharedClause(unsigned N)
2870 : OMPVarListClause<OMPSharedClause>(llvm::omp::OMPC_shared,
2871 SourceLocation(), SourceLocation(),
2872 SourceLocation(), N) {}
2873
2874public:
2875 /// Creates clause with a list of variables \a VL.
2876 ///
2877 /// \param C AST context.
2878 /// \param StartLoc Starting location of the clause.
2879 /// \param LParenLoc Location of '('.
2880 /// \param EndLoc Ending location of the clause.
2881 /// \param VL List of references to the variables.
2882 static OMPSharedClause *Create(const ASTContext &C, SourceLocation StartLoc,
2883 SourceLocation LParenLoc,
2884 SourceLocation EndLoc, ArrayRef<Expr *> VL);
2885
2886 /// Creates an empty clause with \a N variables.
2887 ///
2888 /// \param C AST context.
2889 /// \param N The number of variables.
2890 static OMPSharedClause *CreateEmpty(const ASTContext &C, unsigned N);
2891
2892 child_range children() {
2893 return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
2894 reinterpret_cast<Stmt **>(varlist_end()));
2895 }
2896
2897 const_child_range children() const {
2898 auto Children = const_cast<OMPSharedClause *>(this)->children();
2899 return const_child_range(Children.begin(), Children.end());
2900 }
2901
2902 child_range used_children() {
2903 return child_range(child_iterator(), child_iterator());
2904 }
2905 const_child_range used_children() const {
2906 return const_child_range(const_child_iterator(), const_child_iterator());
2907 }
2908
2909 static bool classof(const OMPClause *T) {
2910 return T->getClauseKind() == llvm::omp::OMPC_shared;
2911 }
2912};
2913
2914/// This represents clause 'reduction' in the '#pragma omp ...'
2915/// directives.
2916///
2917/// \code
2918/// #pragma omp parallel reduction(+:a,b)
2919/// \endcode
2920/// In this example directive '#pragma omp parallel' has clause 'reduction'
2921/// with operator '+' and the variables 'a' and 'b'.
2922class OMPReductionClause final
2923 : public OMPVarListClause<OMPReductionClause>,
2924 public OMPClauseWithPostUpdate,
2925 private llvm::TrailingObjects<OMPReductionClause, Expr *> {
2926 friend class OMPClauseReader;
2927 friend OMPVarListClause;
2928 friend TrailingObjects;
2929
2930 /// Reduction modifier.
2931 OpenMPReductionClauseModifier Modifier = OMPC_REDUCTION_unknown;
2932
2933 /// Reduction modifier location.
2934 SourceLocation ModifierLoc;
2935
2936 /// Location of ':'.
2937 SourceLocation ColonLoc;
2938
2939 /// Nested name specifier for C++.
2940 NestedNameSpecifierLoc QualifierLoc;
2941
2942 /// Name of custom operator.
2943 DeclarationNameInfo NameInfo;
2944
2945 /// Build clause with number of variables \a N.
2946 ///
2947 /// \param StartLoc Starting location of the clause.
2948 /// \param LParenLoc Location of '('.
2949 /// \param ModifierLoc Modifier location.
2950 /// \param ColonLoc Location of ':'.
2951 /// \param EndLoc Ending location of the clause.
2952 /// \param N Number of the variables in the clause.
2953 /// \param QualifierLoc The nested-name qualifier with location information
2954 /// \param NameInfo The full name info for reduction identifier.
2955 OMPReductionClause(SourceLocation StartLoc, SourceLocation LParenLoc,
2956 SourceLocation ModifierLoc, SourceLocation ColonLoc,
2957 SourceLocation EndLoc,
2958 OpenMPReductionClauseModifier Modifier, unsigned N,
2959 NestedNameSpecifierLoc QualifierLoc,
2960 const DeclarationNameInfo &NameInfo)
2961 : OMPVarListClause<OMPReductionClause>(llvm::omp::OMPC_reduction,
2962 StartLoc, LParenLoc, EndLoc, N),
2963 OMPClauseWithPostUpdate(this), Modifier(Modifier),
2964 ModifierLoc(ModifierLoc), ColonLoc(ColonLoc),
2965 QualifierLoc(QualifierLoc), NameInfo(NameInfo) {}
2966
2967 /// Build an empty clause.
2968 ///
2969 /// \param N Number of variables.
2970 explicit OMPReductionClause(unsigned N)
2971 : OMPVarListClause<OMPReductionClause>(llvm::omp::OMPC_reduction,
2972 SourceLocation(), SourceLocation(),
2973 SourceLocation(), N),
2974 OMPClauseWithPostUpdate(this) {}
2975
2976 /// Sets reduction modifier.
2977 void setModifier(OpenMPReductionClauseModifier M) { Modifier = M; }
2978
2979 /// Sets location of the modifier.
2980 void setModifierLoc(SourceLocation Loc) { ModifierLoc = Loc; }
2981
2982 /// Sets location of ':' symbol in clause.
2983 void setColonLoc(SourceLocation CL) { ColonLoc = CL; }
2984
2985 /// Sets the name info for specified reduction identifier.
2986 void setNameInfo(DeclarationNameInfo DNI) { NameInfo = DNI; }
2987
2988 /// Sets the nested name specifier.
2989 void setQualifierLoc(NestedNameSpecifierLoc NSL) { QualifierLoc = NSL; }
2990
2991 /// Set list of helper expressions, required for proper codegen of the
2992 /// clause. These expressions represent private copy of the reduction
2993 /// variable.
2994 void setPrivates(ArrayRef<Expr *> Privates);
2995
2996 /// Get the list of helper privates.
2997 MutableArrayRef<Expr *> getPrivates() {
2998 return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
2999 }
3000 ArrayRef<const Expr *> getPrivates() const {
3001 return llvm::makeArrayRef(varlist_end(), varlist_size());
3002 }
3003
3004 /// Set list of helper expressions, required for proper codegen of the
3005 /// clause. These expressions represent LHS expression in the final
3006 /// reduction expression performed by the reduction clause.
3007 void setLHSExprs(ArrayRef<Expr *> LHSExprs);
3008
3009 /// Get the list of helper LHS expressions.
3010 MutableArrayRef<Expr *> getLHSExprs() {
3011 return MutableArrayRef<Expr *>(getPrivates().end(), varlist_size());
3012 }
3013 ArrayRef<const Expr *> getLHSExprs() const {
3014 return llvm::makeArrayRef(getPrivates().end(), varlist_size());
3015 }
3016
3017 /// Set list of helper expressions, required for proper codegen of the
3018 /// clause. These expressions represent RHS expression in the final
3019 /// reduction expression performed by the reduction clause.
3020 /// Also, variables in these expressions are used for proper initialization of
3021 /// reduction copies.
3022 void setRHSExprs(ArrayRef<Expr *> RHSExprs);
3023
3024 /// Get the list of helper destination expressions.
3025 MutableArrayRef<Expr *> getRHSExprs() {
3026 return MutableArrayRef<Expr *>(getLHSExprs().end(), varlist_size());
3027 }
3028 ArrayRef<const Expr *> getRHSExprs() const {
3029 return llvm::makeArrayRef(getLHSExprs().end(), varlist_size());
3030 }
3031
3032 /// Set list of helper reduction expressions, required for proper
3033 /// codegen of the clause. These expressions are binary expressions or
3034 /// operator/custom reduction call that calculates new value from source
3035 /// helper expressions to destination helper expressions.
3036 void setReductionOps(ArrayRef<Expr *> ReductionOps);
3037
3038 /// Get the list of helper reduction expressions.
3039 MutableArrayRef<Expr *> getReductionOps() {
3040 return MutableArrayRef<Expr *>(getRHSExprs().end(), varlist_size());
3041 }
3042 ArrayRef<const Expr *> getReductionOps() const {
3043 return llvm::makeArrayRef(getRHSExprs().end(), varlist_size());
3044 }
3045
3046 /// Set list of helper copy operations for inscan reductions.
3047 /// The form is: Temps[i] = LHS[i];
3048 void setInscanCopyOps(ArrayRef<Expr *> Ops);
3049
3050 /// Get the list of helper inscan copy operations.
3051 MutableArrayRef<Expr *> getInscanCopyOps() {
3052 return MutableArrayRef<Expr *>(getReductionOps().end(), varlist_size());
3053 }
3054 ArrayRef<const Expr *> getInscanCopyOps() const {
3055 return llvm::makeArrayRef(getReductionOps().end(), varlist_size());
3056 }
3057
3058 /// Set list of helper temp vars for inscan copy array operations.
3059 void setInscanCopyArrayTemps(ArrayRef<Expr *> CopyArrayTemps);
3060
3061 /// Get the list of helper inscan copy temps.
3062 MutableArrayRef<Expr *> getInscanCopyArrayTemps() {
3063 return MutableArrayRef<Expr *>(getInscanCopyOps().end(), varlist_size());
3064 }
3065 ArrayRef<const Expr *> getInscanCopyArrayTemps() const {
3066 return llvm::makeArrayRef(getInscanCopyOps().end(), varlist_size());
3067 }
3068
3069 /// Set list of helper temp elements vars for inscan copy array operations.
3070 void setInscanCopyArrayElems(ArrayRef<Expr *> CopyArrayElems);
3071
3072 /// Get the list of helper inscan copy temps.
3073 MutableArrayRef<Expr *> getInscanCopyArrayElems() {
3074 return MutableArrayRef<Expr *>(getInscanCopyArrayTemps().end(),
3075 varlist_size());
3076 }
3077 ArrayRef<const Expr *> getInscanCopyArrayElems() const {
3078 return llvm::makeArrayRef(getInscanCopyArrayTemps().end(), varlist_size());
3079 }
3080
3081public:
3082 /// Creates clause with a list of variables \a VL.
3083 ///
3084 /// \param StartLoc Starting location of the clause.
3085 /// \param LParenLoc Location of '('.
3086 /// \param ModifierLoc Modifier location.
3087 /// \param ColonLoc Location of ':'.
3088 /// \param EndLoc Ending location of the clause.
3089 /// \param VL The variables in the clause.
3090 /// \param QualifierLoc The nested-name qualifier with location information
3091 /// \param NameInfo The full name info for reduction identifier.
3092 /// \param Privates List of helper expressions for proper generation of
3093 /// private copies.
3094 /// \param LHSExprs List of helper expressions for proper generation of
3095 /// assignment operation required for copyprivate clause. This list represents
3096 /// LHSs of the reduction expressions.
3097 /// \param RHSExprs List of helper expressions for proper generation of
3098 /// assignment operation required for copyprivate clause. This list represents
3099 /// RHSs of the reduction expressions.
3100 /// Also, variables in these expressions are used for proper initialization of
3101 /// reduction copies.
3102 /// \param ReductionOps List of helper expressions that represents reduction
3103 /// expressions:
3104 /// \code
3105 /// LHSExprs binop RHSExprs;
3106 /// operator binop(LHSExpr, RHSExpr);
3107 /// <CutomReduction>(LHSExpr, RHSExpr);
3108 /// \endcode
3109 /// Required for proper codegen of final reduction operation performed by the
3110 /// reduction clause.
3111 /// \param CopyOps List of copy operations for inscan reductions:
3112 /// \code
3113 /// TempExprs = LHSExprs;
3114 /// \endcode
3115 /// \param CopyArrayTemps Temp arrays for prefix sums.
3116 /// \param CopyArrayElems Temp arrays for prefix sums.
3117 /// \param PreInit Statement that must be executed before entering the OpenMP
3118 /// region with this clause.
3119 /// \param PostUpdate Expression that must be executed after exit from the
3120 /// OpenMP region with this clause.
3121 static OMPReductionClause *
3122 Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
3123 SourceLocation ModifierLoc, SourceLocation ColonLoc,
3124 SourceLocation EndLoc, OpenMPReductionClauseModifier Modifier,
3125 ArrayRef<Expr *> VL, NestedNameSpecifierLoc QualifierLoc,
3126 const DeclarationNameInfo &NameInfo, ArrayRef<Expr *> Privates,
3127 ArrayRef<Expr *> LHSExprs, ArrayRef<Expr *> RHSExprs,
3128 ArrayRef<Expr *> ReductionOps, ArrayRef<Expr *> CopyOps,
3129 ArrayRef<Expr *> CopyArrayTemps, ArrayRef<Expr *> CopyArrayElems,
3130 Stmt *PreInit, Expr *PostUpdate);
3131
3132 /// Creates an empty clause with the place for \a N variables.
3133 ///
3134 /// \param C AST context.
3135 /// \param N The number of variables.
3136 /// \param Modifier Reduction modifier.
3137 static OMPReductionClause *
3138 CreateEmpty(const ASTContext &C, unsigned N,
3139 OpenMPReductionClauseModifier Modifier);
3140
3141 /// Returns modifier.
3142 OpenMPReductionClauseModifier getModifier() const { return Modifier; }
3143
3144 /// Returns modifier location.
3145 SourceLocation getModifierLoc() const { return ModifierLoc; }
3146
3147 /// Gets location of ':' symbol in clause.
3148 SourceLocation getColonLoc() const { return ColonLoc; }
3149
3150 /// Gets the name info for specified reduction identifier.
3151 const DeclarationNameInfo &getNameInfo() const { return NameInfo; }
3152
3153 /// Gets the nested name specifier.
3154 NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
3155
3156 using helper_expr_iterator = MutableArrayRef<Expr *>::iterator;
3157 using helper_expr_const_iterator = ArrayRef<const Expr *>::iterator;
3158 using helper_expr_range = llvm::iterator_range<helper_expr_iterator>;
3159 using helper_expr_const_range =
3160 llvm::iterator_range<helper_expr_const_iterator>;
3161
3162 helper_expr_const_range privates() const {
3163 return helper_expr_const_range(getPrivates().begin(), getPrivates().end());
3164 }
3165
3166 helper_expr_range privates() {
3167 return helper_expr_range(getPrivates().begin(), getPrivates().end());
3168 }
3169
3170 helper_expr_const_range lhs_exprs() const {
3171 return helper_expr_const_range(getLHSExprs().begin(), getLHSExprs().end());
3172 }
3173
3174 helper_expr_range lhs_exprs() {
3175 return helper_expr_range(getLHSExprs().begin(), getLHSExprs().end());
3176 }
3177
3178 helper_expr_const_range rhs_exprs() const {
3179 return helper_expr_const_range(getRHSExprs().begin(), getRHSExprs().end());
3180 }
3181
3182 helper_expr_range rhs_exprs() {
3183 return helper_expr_range(getRHSExprs().begin(), getRHSExprs().end());
3184 }
3185
3186 helper_expr_const_range reduction_ops() const {
3187 return helper_expr_const_range(getReductionOps().begin(),
3188 getReductionOps().end());
3189 }
3190
3191 helper_expr_range reduction_ops() {
3192 return helper_expr_range(getReductionOps().begin(),
3193 getReductionOps().end());
3194 }
3195
3196 helper_expr_const_range copy_ops() const {
3197 return helper_expr_const_range(getInscanCopyOps().begin(),
3198 getInscanCopyOps().end());
3199 }
3200
3201 helper_expr_range copy_ops() {
3202 return helper_expr_range(getInscanCopyOps().begin(),
3203 getInscanCopyOps().end());
3204 }
3205
3206 helper_expr_const_range copy_array_temps() const {
3207 return helper_expr_const_range(getInscanCopyArrayTemps().begin(),
3208 getInscanCopyArrayTemps().end());
3209 }
3210
3211 helper_expr_range copy_array_temps() {
3212 return helper_expr_range(getInscanCopyArrayTemps().begin(),
3213 getInscanCopyArrayTemps().end());
3214 }
3215
3216 helper_expr_const_range copy_array_elems() const {
3217 return helper_expr_const_range(getInscanCopyArrayElems().begin(),
3218 getInscanCopyArrayElems().end());
3219 }
3220
3221 helper_expr_range copy_array_elems() {
3222 return helper_expr_range(getInscanCopyArrayElems().begin(),
3223 getInscanCopyArrayElems().end());
3224 }
3225
3226 child_range children() {
3227 return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
3228 reinterpret_cast<Stmt **>(varlist_end()));
3229 }
3230
3231 const_child_range children() const {
3232 auto Children = const_cast<OMPReductionClause *>(this)->children();
3233 return const_child_range(Children.begin(), Children.end());
3234 }
3235
3236 child_range used_children() {
3237 return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
3238 reinterpret_cast<Stmt **>(varlist_end()));
3239 }
3240 const_child_range used_children() const {
3241 auto Children = const_cast<OMPReductionClause *>(this)->used_children();
3242 return const_child_range(Children.begin(), Children.end());
3243 }
3244
3245 static bool classof(const OMPClause *T) {
3246 return T->getClauseKind() == llvm::omp::OMPC_reduction;
3247 }
3248};
3249
3250/// This represents clause 'task_reduction' in the '#pragma omp taskgroup'
3251/// directives.
3252///
3253/// \code
3254/// #pragma omp taskgroup task_reduction(+:a,b)
3255/// \endcode
3256/// In this example directive '#pragma omp taskgroup' has clause
3257/// 'task_reduction' with operator '+' and the variables 'a' and 'b'.
3258class OMPTaskReductionClause final
3259 : public OMPVarListClause<OMPTaskReductionClause>,
3260 public OMPClauseWithPostUpdate,
3261 private llvm::TrailingObjects<OMPTaskReductionClause, Expr *> {
3262 friend class OMPClauseReader;
3263 friend OMPVarListClause;
3264 friend TrailingObjects;
3265
3266 /// Location of ':'.
3267 SourceLocation ColonLoc;
3268
3269 /// Nested name specifier for C++.
3270 NestedNameSpecifierLoc QualifierLoc;
3271
3272 /// Name of custom operator.
3273 DeclarationNameInfo NameInfo;
3274
3275 /// Build clause with number of variables \a N.
3276 ///
3277 /// \param StartLoc Starting location of the clause.
3278 /// \param LParenLoc Location of '('.
3279 /// \param EndLoc Ending location of the clause.
3280 /// \param ColonLoc Location of ':'.
3281 /// \param N Number of the variables in the clause.
3282 /// \param QualifierLoc The nested-name qualifier with location information
3283 /// \param NameInfo The full name info for reduction identifier.
3284 OMPTaskReductionClause(SourceLocation StartLoc, SourceLocation LParenLoc,
3285 SourceLocation ColonLoc, SourceLocation EndLoc,
3286 unsigned N, NestedNameSpecifierLoc QualifierLoc,
3287 const DeclarationNameInfo &NameInfo)
3288 : OMPVarListClause<OMPTaskReductionClause>(
3289 llvm::omp::OMPC_task_reduction, StartLoc, LParenLoc, EndLoc, N),
3290 OMPClauseWithPostUpdate(this), ColonLoc(ColonLoc),
3291 QualifierLoc(QualifierLoc), NameInfo(NameInfo) {}
3292
3293 /// Build an empty clause.
3294 ///
3295 /// \param N Number of variables.
3296 explicit OMPTaskReductionClause(unsigned N)
3297 : OMPVarListClause<OMPTaskReductionClause>(
3298 llvm::omp::OMPC_task_reduction, SourceLocation(), SourceLocation(),
3299 SourceLocation(), N),
3300 OMPClauseWithPostUpdate(this) {}
3301
3302 /// Sets location of ':' symbol in clause.
3303 void setColonLoc(SourceLocation CL) { ColonLoc = CL; }
3304
3305 /// Sets the name info for specified reduction identifier.
3306 void setNameInfo(DeclarationNameInfo DNI) { NameInfo = DNI; }
3307
3308 /// Sets the nested name specifier.
3309 void setQualifierLoc(NestedNameSpecifierLoc NSL) { QualifierLoc = NSL; }
3310
3311 /// Set list of helper expressions, required for proper codegen of the clause.
3312 /// These expressions represent private copy of the reduction variable.
3313 void setPrivates(ArrayRef<Expr *> Privates);
3314
3315 /// Get the list of helper privates.
3316 MutableArrayRef<Expr *> getPrivates() {
3317 return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
3318 }
3319 ArrayRef<const Expr *> getPrivates() const {
3320 return llvm::makeArrayRef(varlist_end(), varlist_size());
3321 }
3322
3323 /// Set list of helper expressions, required for proper codegen of the clause.
3324 /// These expressions represent LHS expression in the final reduction
3325 /// expression performed by the reduction clause.
3326 void setLHSExprs(ArrayRef<Expr *> LHSExprs);
3327
3328 /// Get the list of helper LHS expressions.
3329 MutableArrayRef<Expr *> getLHSExprs() {
3330 return MutableArrayRef<Expr *>(getPrivates().end(), varlist_size());
3331 }
3332 ArrayRef<const Expr *> getLHSExprs() const {
3333 return llvm::makeArrayRef(getPrivates().end(), varlist_size());
3334 }
3335
3336 /// Set list of helper expressions, required for proper codegen of the clause.
3337 /// These expressions represent RHS expression in the final reduction
3338 /// expression performed by the reduction clause. Also, variables in these
3339 /// expressions are used for proper initialization of reduction copies.
3340 void setRHSExprs(ArrayRef<Expr *> RHSExprs);
3341
3342 /// Get the list of helper destination expressions.
3343 MutableArrayRef<Expr *> getRHSExprs() {
3344 return MutableArrayRef<Expr *>(getLHSExprs().end(), varlist_size());
3345 }
3346 ArrayRef<const Expr *> getRHSExprs() const {
3347 return llvm::makeArrayRef(getLHSExprs().end(), varlist_size());
3348 }
3349
3350 /// Set list of helper reduction expressions, required for proper
3351 /// codegen of the clause. These expressions are binary expressions or
3352 /// operator/custom reduction call that calculates new value from source
3353 /// helper expressions to destination helper expressions.
3354 void setReductionOps(ArrayRef<Expr *> ReductionOps);
3355
3356 /// Get the list of helper reduction expressions.
3357 MutableArrayRef<Expr *> getReductionOps() {
3358 return MutableArrayRef<Expr *>(getRHSExprs().end(), varlist_size());
3359 }
3360 ArrayRef<const Expr *> getReductionOps() const {
3361 return llvm::makeArrayRef(getRHSExprs().end(), varlist_size());
3362 }
3363
3364public:
3365 /// Creates clause with a list of variables \a VL.
3366 ///
3367 /// \param StartLoc Starting location of the clause.
3368 /// \param LParenLoc Location of '('.
3369 /// \param ColonLoc Location of ':'.
3370 /// \param EndLoc Ending location of the clause.
3371 /// \param VL The variables in the clause.
3372 /// \param QualifierLoc The nested-name qualifier with location information
3373 /// \param NameInfo The full name info for reduction identifier.
3374 /// \param Privates List of helper expressions for proper generation of
3375 /// private copies.
3376 /// \param LHSExprs List of helper expressions for proper generation of
3377 /// assignment operation required for copyprivate clause. This list represents
3378 /// LHSs of the reduction expressions.
3379 /// \param RHSExprs List of helper expressions for proper generation of
3380 /// assignment operation required for copyprivate clause. This list represents
3381 /// RHSs of the reduction expressions.
3382 /// Also, variables in these expressions are used for proper initialization of
3383 /// reduction copies.
3384 /// \param ReductionOps List of helper expressions that represents reduction
3385 /// expressions:
3386 /// \code
3387 /// LHSExprs binop RHSExprs;
3388 /// operator binop(LHSExpr, RHSExpr);
3389 /// <CutomReduction>(LHSExpr, RHSExpr);
3390 /// \endcode
3391 /// Required for proper codegen of final reduction operation performed by the
3392 /// reduction clause.
3393 /// \param PreInit Statement that must be executed before entering the OpenMP
3394 /// region with this clause.
3395 /// \param PostUpdate Expression that must be executed after exit from the
3396 /// OpenMP region with this clause.
3397 static OMPTaskReductionClause *
3398 Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
3399 SourceLocation ColonLoc, SourceLocation EndLoc, ArrayRef<Expr *> VL,
3400 NestedNameSpecifierLoc QualifierLoc,
3401 const DeclarationNameInfo &NameInfo, ArrayRef<Expr *> Privates,
3402 ArrayRef<Expr *> LHSExprs, ArrayRef<Expr *> RHSExprs,
3403 ArrayRef<Expr *> ReductionOps, Stmt *PreInit, Expr *PostUpdate);
3404
3405 /// Creates an empty clause with the place for \a N variables.
3406 ///
3407 /// \param C AST context.
3408 /// \param N The number of variables.
3409 static OMPTaskReductionClause *CreateEmpty(const ASTContext &C, unsigned N);
3410
3411 /// Gets location of ':' symbol in clause.
3412 SourceLocation getColonLoc() const { return ColonLoc; }
3413
3414 /// Gets the name info for specified reduction identifier.
3415 const DeclarationNameInfo &getNameInfo() const { return NameInfo; }
3416
3417 /// Gets the nested name specifier.
3418 NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
3419
3420 using helper_expr_iterator = MutableArrayRef<Expr *>::iterator;
3421 using helper_expr_const_iterator = ArrayRef<const Expr *>::iterator;
3422 using helper_expr_range = llvm::iterator_range<helper_expr_iterator>;
3423 using helper_expr_const_range =
3424 llvm::iterator_range<helper_expr_const_iterator>;
3425
3426 helper_expr_const_range privates() const {
3427 return helper_expr_const_range(getPrivates().begin(), getPrivates().end());
3428 }
3429
3430 helper_expr_range privates() {
3431 return helper_expr_range(getPrivates().begin(), getPrivates().end());
3432 }
3433
3434 helper_expr_const_range lhs_exprs() const {
3435 return helper_expr_const_range(getLHSExprs().begin(), getLHSExprs().end());
3436 }
3437
3438 helper_expr_range lhs_exprs() {
3439 return helper_expr_range(getLHSExprs().begin(), getLHSExprs().end());
3440 }
3441
3442 helper_expr_const_range rhs_exprs() const {
3443 return helper_expr_const_range(getRHSExprs().begin(), getRHSExprs().end());
3444 }
3445
3446 helper_expr_range rhs_exprs() {
3447 return helper_expr_range(getRHSExprs().begin(), getRHSExprs().end());
3448 }
3449
3450 helper_expr_const_range reduction_ops() const {
3451 return helper_expr_const_range(getReductionOps().begin(),
3452 getReductionOps().end());
3453 }
3454
3455 helper_expr_range reduction_ops() {
3456 return helper_expr_range(getReductionOps().begin(),
3457 getReductionOps().end());
3458 }
3459
3460 child_range children() {
3461 return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
3462 reinterpret_cast<Stmt **>(varlist_end()));
3463 }
3464
3465 const_child_range children() const {
3466 auto Children = const_cast<OMPTaskReductionClause *>(this)->children();
3467 return const_child_range(Children.begin(), Children.end());
3468 }
3469
3470 child_range used_children() {
3471 return child_range(child_iterator(), child_iterator());
3472 }
3473 const_child_range used_children() const {
3474 return const_child_range(const_child_iterator(), const_child_iterator());
3475 }
3476
3477 static bool classof(const OMPClause *T) {
3478 return T->getClauseKind() == llvm::omp::OMPC_task_reduction;
3479 }
3480};
3481
3482/// This represents clause 'in_reduction' in the '#pragma omp task' directives.
3483///
3484/// \code
3485/// #pragma omp task in_reduction(+:a,b)
3486/// \endcode
3487/// In this example directive '#pragma omp task' has clause 'in_reduction' with
3488/// operator '+' and the variables 'a' and 'b'.
3489class OMPInReductionClause final
3490 : public OMPVarListClause<OMPInReductionClause>,
3491 public OMPClauseWithPostUpdate,
3492 private llvm::TrailingObjects<OMPInReductionClause, Expr *> {
3493 friend class OMPClauseReader;
3494 friend OMPVarListClause;
3495 friend TrailingObjects;
3496
3497 /// Location of ':'.
3498 SourceLocation ColonLoc;
3499
3500 /// Nested name specifier for C++.
3501 NestedNameSpecifierLoc QualifierLoc;
3502
3503 /// Name of custom operator.
3504 DeclarationNameInfo NameInfo;
3505
3506 /// Build clause with number of variables \a N.
3507 ///
3508 /// \param StartLoc Starting location of the clause.
3509 /// \param LParenLoc Location of '('.
3510 /// \param EndLoc Ending location of the clause.
3511 /// \param ColonLoc Location of ':'.
3512 /// \param N Number of the variables in the clause.
3513 /// \param QualifierLoc The nested-name qualifier with location information
3514 /// \param NameInfo The full name info for reduction identifier.
3515 OMPInReductionClause(SourceLocation StartLoc, SourceLocation LParenLoc,
3516 SourceLocation ColonLoc, SourceLocation EndLoc,
3517 unsigned N, NestedNameSpecifierLoc QualifierLoc,
3518 const DeclarationNameInfo &NameInfo)
3519 : OMPVarListClause<OMPInReductionClause>(llvm::omp::OMPC_in_reduction,
3520 StartLoc, LParenLoc, EndLoc, N),
3521 OMPClauseWithPostUpdate(this), ColonLoc(ColonLoc),
3522 QualifierLoc(QualifierLoc), NameInfo(NameInfo) {}
3523
3524 /// Build an empty clause.
3525 ///
3526 /// \param N Number of variables.
3527 explicit OMPInReductionClause(unsigned N)
3528 : OMPVarListClause<OMPInReductionClause>(
3529 llvm::omp::OMPC_in_reduction, SourceLocation(), SourceLocation(),
3530 SourceLocation(), N),
3531 OMPClauseWithPostUpdate(this) {}
3532
3533 /// Sets location of ':' symbol in clause.
3534 void setColonLoc(SourceLocation CL) { ColonLoc = CL; }
3535
3536 /// Sets the name info for specified reduction identifier.
3537 void setNameInfo(DeclarationNameInfo DNI) { NameInfo = DNI; }
3538
3539 /// Sets the nested name specifier.
3540 void setQualifierLoc(NestedNameSpecifierLoc NSL) { QualifierLoc = NSL; }
3541
3542 /// Set list of helper expressions, required for proper codegen of the clause.
3543 /// These expressions represent private copy of the reduction variable.
3544 void setPrivates(ArrayRef<Expr *> Privates);
3545
3546 /// Get the list of helper privates.
3547 MutableArrayRef<Expr *> getPrivates() {
3548 return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
3549 }
3550 ArrayRef<const Expr *> getPrivates() const {
3551 return llvm::makeArrayRef(varlist_end(), varlist_size());
3552 }
3553
3554 /// Set list of helper expressions, required for proper codegen of the clause.
3555 /// These expressions represent LHS expression in the final reduction
3556 /// expression performed by the reduction clause.
3557 void setLHSExprs(ArrayRef<Expr *> LHSExprs);
3558
3559 /// Get the list of helper LHS expressions.
3560 MutableArrayRef<Expr *> getLHSExprs() {
3561 return MutableArrayRef<Expr *>(getPrivates().end(), varlist_size());
3562 }
3563 ArrayRef<const Expr *> getLHSExprs() const {
3564 return llvm::makeArrayRef(getPrivates().end(), varlist_size());
3565 }
3566
3567 /// Set list of helper expressions, required for proper codegen of the clause.
3568 /// These expressions represent RHS expression in the final reduction
3569 /// expression performed by the reduction clause. Also, variables in these
3570 /// expressions are used for proper initialization of reduction copies.
3571 void setRHSExprs(ArrayRef<Expr *> RHSExprs);
3572
3573 /// Get the list of helper destination expressions.
3574 MutableArrayRef<Expr *> getRHSExprs() {
3575 return MutableArrayRef<Expr *>(getLHSExprs().end(), varlist_size());
3576 }
3577 ArrayRef<const Expr *> getRHSExprs() const {
3578 return llvm::makeArrayRef(getLHSExprs().end(), varlist_size());
3579 }
3580
3581 /// Set list of helper reduction expressions, required for proper
3582 /// codegen of the clause. These expressions are binary expressions or
3583 /// operator/custom reduction call that calculates new value from source
3584 /// helper expressions to destination helper expressions.
3585 void setReductionOps(ArrayRef<Expr *> ReductionOps);
3586
3587 /// Get the list of helper reduction expressions.
3588 MutableArrayRef<Expr *> getReductionOps() {
3589 return MutableArrayRef<Expr *>(getRHSExprs().end(), varlist_size());
3590 }
3591 ArrayRef<const Expr *> getReductionOps() const {
3592 return llvm::makeArrayRef(getRHSExprs().end(), varlist_size());
3593 }
3594
3595 /// Set list of helper reduction taskgroup descriptors.
3596 void setTaskgroupDescriptors(ArrayRef<Expr *> ReductionOps);
3597
3598 /// Get the list of helper reduction taskgroup descriptors.
3599 MutableArrayRef<Expr *> getTaskgroupDescriptors() {
3600 return MutableArrayRef<Expr *>(getReductionOps().end(), varlist_size());
3601 }
3602 ArrayRef<const Expr *> getTaskgroupDescriptors() const {
3603 return llvm::makeArrayRef(getReductionOps().end(), varlist_size());
3604 }
3605
3606public:
3607 /// Creates clause with a list of variables \a VL.
3608 ///
3609 /// \param StartLoc Starting location of the clause.
3610 /// \param LParenLoc Location of '('.
3611 /// \param ColonLoc Location of ':'.
3612 /// \param EndLoc Ending location of the clause.
3613 /// \param VL The variables in the clause.
3614 /// \param QualifierLoc The nested-name qualifier with location information
3615 /// \param NameInfo The full name info for reduction identifier.
3616 /// \param Privates List of helper expressions for proper generation of
3617 /// private copies.
3618 /// \param LHSExprs List of helper expressions for proper generation of
3619 /// assignment operation required for copyprivate clause. This list represents
3620 /// LHSs of the reduction expressions.
3621 /// \param RHSExprs List of helper expressions for proper generation of
3622 /// assignment operation required for copyprivate clause. This list represents
3623 /// RHSs of the reduction expressions.
3624 /// Also, variables in these expressions are used for proper initialization of
3625 /// reduction copies.
3626 /// \param ReductionOps List of helper expressions that represents reduction
3627 /// expressions:
3628 /// \code
3629 /// LHSExprs binop RHSExprs;
3630 /// operator binop(LHSExpr, RHSExpr);
3631 /// <CutomReduction>(LHSExpr, RHSExpr);
3632 /// \endcode
3633 /// Required for proper codegen of final reduction operation performed by the
3634 /// reduction clause.
3635 /// \param TaskgroupDescriptors List of helper taskgroup descriptors for
3636 /// corresponding items in parent taskgroup task_reduction clause.
3637 /// \param PreInit Statement that must be executed before entering the OpenMP
3638 /// region with this clause.
3639 /// \param PostUpdate Expression that must be executed after exit from the
3640 /// OpenMP region with this clause.
3641 static OMPInReductionClause *
3642 Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
3643 SourceLocation ColonLoc, SourceLocation EndLoc, ArrayRef<Expr *> VL,
3644 NestedNameSpecifierLoc QualifierLoc,
3645 const DeclarationNameInfo &NameInfo, ArrayRef<Expr *> Privates,
3646 ArrayRef<Expr *> LHSExprs, ArrayRef<Expr *> RHSExprs,
3647 ArrayRef<Expr *> ReductionOps, ArrayRef<Expr *> TaskgroupDescriptors,
3648 Stmt *PreInit, Expr *PostUpdate);
3649
3650 /// Creates an empty clause with the place for \a N variables.
3651 ///
3652 /// \param C AST context.
3653 /// \param N The number of variables.
3654 static OMPInReductionClause *CreateEmpty(const ASTContext &C, unsigned N);
3655
3656 /// Gets location of ':' symbol in clause.
3657 SourceLocation getColonLoc() const { return ColonLoc; }
3658
3659 /// Gets the name info for specified reduction identifier.
3660 const DeclarationNameInfo &getNameInfo() const { return NameInfo; }
3661
3662 /// Gets the nested name specifier.
3663 NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
3664
3665 using helper_expr_iterator = MutableArrayRef<Expr *>::iterator;
3666 using helper_expr_const_iterator = ArrayRef<const Expr *>::iterator;
3667 using helper_expr_range = llvm::iterator_range<helper_expr_iterator>;
3668 using helper_expr_const_range =
3669 llvm::iterator_range<helper_expr_const_iterator>;
3670
3671 helper_expr_const_range privates() const {
3672 return helper_expr_const_range(getPrivates().begin(), getPrivates().end());
3673 }
3674
3675 helper_expr_range privates() {
3676 return helper_expr_range(getPrivates().begin(), getPrivates().end());
3677 }
3678
3679 helper_expr_const_range lhs_exprs() const {
3680 return helper_expr_const_range(getLHSExprs().begin(), getLHSExprs().end());
3681 }
3682
3683 helper_expr_range lhs_exprs() {
3684 return helper_expr_range(getLHSExprs().begin(), getLHSExprs().end());
3685 }
3686
3687 helper_expr_const_range rhs_exprs() const {
3688 return helper_expr_const_range(getRHSExprs().begin(), getRHSExprs().end());
3689 }
3690
3691 helper_expr_range rhs_exprs() {
3692 return helper_expr_range(getRHSExprs().begin(), getRHSExprs().end());
3693 }
3694
3695 helper_expr_const_range reduction_ops() const {
3696 return helper_expr_const_range(getReductionOps().begin(),
3697 getReductionOps().end());
3698 }
3699
3700 helper_expr_range reduction_ops() {
3701 return helper_expr_range(getReductionOps().begin(),
3702 getReductionOps().end());
3703 }
3704
3705 helper_expr_const_range taskgroup_descriptors() const {
3706 return helper_expr_const_range(getTaskgroupDescriptors().begin(),
3707 getTaskgroupDescriptors().end());
3708 }
3709
3710 helper_expr_range taskgroup_descriptors() {
3711 return helper_expr_range(getTaskgroupDescriptors().begin(),
3712 getTaskgroupDescriptors().end());
3713 }
3714
3715 child_range children() {
3716 return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
3717 reinterpret_cast<Stmt **>(varlist_end()));
3718 }
3719
3720 const_child_range children() const {
3721 auto Children = const_cast<OMPInReductionClause *>(this)->children();
3722 return const_child_range(Children.begin(), Children.end());
3723 }
3724
3725 child_range used_children() {
3726 return child_range(child_iterator(), child_iterator());
3727 }
3728 const_child_range used_children() const {
3729 return const_child_range(const_child_iterator(), const_child_iterator());
3730 }
3731
3732 static bool classof(const OMPClause *T) {
3733 return T->getClauseKind() == llvm::omp::OMPC_in_reduction;
3734 }
3735};
3736
3737/// This represents clause 'linear' in the '#pragma omp ...'
3738/// directives.
3739///
3740/// \code
3741/// #pragma omp simd linear(a,b : 2)
3742/// \endcode
3743/// In this example directive '#pragma omp simd' has clause 'linear'
3744/// with variables 'a', 'b' and linear step '2'.
3745class OMPLinearClause final
3746 : public OMPVarListClause<OMPLinearClause>,
3747 public OMPClauseWithPostUpdate,
3748 private llvm::TrailingObjects<OMPLinearClause, Expr *> {
3749 friend class OMPClauseReader;
3750 friend OMPVarListClause;
3751 friend TrailingObjects;
3752
3753 /// Modifier of 'linear' clause.
3754 OpenMPLinearClauseKind Modifier = OMPC_LINEAR_val;
3755
3756 /// Location of linear modifier if any.
3757 SourceLocation ModifierLoc;
3758
3759 /// Location of ':'.
3760 SourceLocation ColonLoc;
3761
3762 /// Sets the linear step for clause.
3763 void setStep(Expr *Step) { *(getFinals().end()) = Step; }
3764
3765 /// Sets the expression to calculate linear step for clause.
3766 void setCalcStep(Expr *CalcStep) { *(getFinals().end() + 1) = CalcStep; }
3767
3768 /// Build 'linear' clause with given number of variables \a NumVars.
3769 ///
3770 /// \param StartLoc Starting location of the clause.
3771 /// \param LParenLoc Location of '('.
3772 /// \param ColonLoc Location of ':'.
3773 /// \param EndLoc Ending location of the clause.
3774 /// \param NumVars Number of variables.
3775 OMPLinearClause(SourceLocation StartLoc, SourceLocation LParenLoc,
3776 OpenMPLinearClauseKind Modifier, SourceLocation ModifierLoc,
3777 SourceLocation ColonLoc, SourceLocation EndLoc,
3778 unsigned NumVars)
3779 : OMPVarListClause<OMPLinearClause>(llvm::omp::OMPC_linear, StartLoc,
3780 LParenLoc, EndLoc, NumVars),
3781 OMPClauseWithPostUpdate(this), Modifier(Modifier),
3782 ModifierLoc(ModifierLoc), ColonLoc(ColonLoc) {}
3783
3784 /// Build an empty clause.
3785 ///
3786 /// \param NumVars Number of variables.
3787 explicit OMPLinearClause(unsigned NumVars)
3788 : OMPVarListClause<OMPLinearClause>(llvm::omp::OMPC_linear,
3789 SourceLocation(), SourceLocation(),
3790 SourceLocation(), NumVars),
3791 OMPClauseWithPostUpdate(this) {}
3792
3793 /// Gets the list of initial values for linear variables.
3794 ///
3795 /// There are NumVars expressions with initial values allocated after the
3796 /// varlist, they are followed by NumVars update expressions (used to update
3797 /// the linear variable's value on current iteration) and they are followed by
3798 /// NumVars final expressions (used to calculate the linear variable's
3799 /// value after the loop body). After these lists, there are 2 helper
3800 /// expressions - linear step and a helper to calculate it before the
3801 /// loop body (used when the linear step is not constant):
3802 ///
3803 /// { Vars[] /* in OMPVarListClause */; Privates[]; Inits[]; Updates[];
3804 /// Finals[]; Step; CalcStep; }
3805 MutableArrayRef<Expr *> getPrivates() {
3806 return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
3807 }
3808 ArrayRef<const Expr *> getPrivates() const {
3809 return llvm::makeArrayRef(varlist_end(), varlist_size());
3810 }
3811
3812 MutableArrayRef<Expr *> getInits() {
3813 return MutableArrayRef<Expr *>(getPrivates().end(), varlist_size());
3814 }
3815 ArrayRef<const Expr *> getInits() const {
3816 return llvm::makeArrayRef(getPrivates().end(), varlist_size());
3817 }
3818
3819 /// Sets the list of update expressions for linear variables.
3820 MutableArrayRef<Expr *> getUpdates() {
3821 return MutableArrayRef<Expr *>(getInits().end(), varlist_size());
3822 }
3823 ArrayRef<const Expr *> getUpdates() const {
3824 return llvm::makeArrayRef(getInits().end(), varlist_size());
3825 }
3826
3827 /// Sets the list of final update expressions for linear variables.
3828 MutableArrayRef<Expr *> getFinals() {
3829 return MutableArrayRef<Expr *>(getUpdates().end(), varlist_size());
3830 }
3831 ArrayRef<const Expr *> getFinals() const {
3832 return llvm::makeArrayRef(getUpdates().end(), varlist_size());
3833 }
3834
3835 /// Gets the list of used expressions for linear variables.
3836 MutableArrayRef<Expr *> getUsedExprs() {
3837 return MutableArrayRef<Expr *>(getFinals().end() + 2, varlist_size() + 1);
3838 }
3839 ArrayRef<const Expr *> getUsedExprs() const {
3840 return llvm::makeArrayRef(getFinals().end() + 2, varlist_size() + 1);
3841 }
3842
3843 /// Sets the list of the copies of original linear variables.
3844 /// \param PL List of expressions.
3845 void setPrivates(ArrayRef<Expr *> PL);
3846
3847 /// Sets the list of the initial values for linear variables.
3848 /// \param IL List of expressions.
3849 void setInits(ArrayRef<Expr *> IL);
3850
3851public:
3852 /// Creates clause with a list of variables \a VL and a linear step
3853 /// \a Step.
3854 ///
3855 /// \param C AST Context.
3856 /// \param StartLoc Starting location of the clause.
3857 /// \param LParenLoc Location of '('.
3858 /// \param Modifier Modifier of 'linear' clause.
3859 /// \param ModifierLoc Modifier location.
3860 /// \param ColonLoc Location of ':'.
3861 /// \param EndLoc Ending location of the clause.
3862 /// \param VL List of references to the variables.
3863 /// \param PL List of private copies of original variables.
3864 /// \param IL List of initial values for the variables.
3865 /// \param Step Linear step.
3866 /// \param CalcStep Calculation of the linear step.
3867 /// \param PreInit Statement that must be executed before entering the OpenMP
3868 /// region with this clause.
3869 /// \param PostUpdate Expression that must be executed after exit from the
3870 /// OpenMP region with this clause.
3871 static OMPLinearClause *
3872 Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
3873 OpenMPLinearClauseKind Modifier, SourceLocation ModifierLoc,
3874 SourceLocation ColonLoc, SourceLocation EndLoc, ArrayRef<Expr *> VL,
3875 ArrayRef<Expr *> PL, ArrayRef<Expr *> IL, Expr *Step, Expr *CalcStep,
3876 Stmt *PreInit, Expr *PostUpdate);
3877
3878 /// Creates an empty clause with the place for \a NumVars variables.
3879 ///
3880 /// \param C AST context.
3881 /// \param NumVars Number of variables.
3882 static OMPLinearClause *CreateEmpty(const ASTContext &C, unsigned NumVars);
3883
3884 /// Set modifier.
3885 void setModifier(OpenMPLinearClauseKind Kind) { Modifier = Kind; }
3886
3887 /// Return modifier.
3888 OpenMPLinearClauseKind getModifier() const { return Modifier; }
3889
3890 /// Set modifier location.
3891 void setModifierLoc(SourceLocation Loc) { ModifierLoc = Loc; }
3892
3893 /// Return modifier location.
3894 SourceLocation getModifierLoc() const { return ModifierLoc; }
3895
3896 /// Sets the location of ':'.
3897 void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
3898
3899 /// Returns the location of ':'.
3900 SourceLocation getColonLoc() const { return ColonLoc; }
3901
3902 /// Returns linear step.
3903 Expr *getStep() { return *(getFinals().end()); }
3904
3905 /// Returns linear step.
3906 const Expr *getStep() const { return *(getFinals().end()); }
3907
3908 /// Returns expression to calculate linear step.
3909 Expr *getCalcStep() { return *(getFinals().end() + 1); }
3910
3911 /// Returns expression to calculate linear step.
3912 const Expr *getCalcStep() const { return *(getFinals().end() + 1); }
3913
3914 /// Sets the list of update expressions for linear variables.
3915 /// \param UL List of expressions.
3916 void setUpdates(ArrayRef<Expr *> UL);
3917
3918 /// Sets the list of final update expressions for linear variables.
3919 /// \param FL List of expressions.
3920 void setFinals(ArrayRef<Expr *> FL);
3921
3922 /// Sets the list of used expressions for the linear clause.
3923 void setUsedExprs(ArrayRef<Expr *> UE);
3924
3925 using privates_iterator = MutableArrayRef<Expr *>::iterator;
3926 using privates_const_iterator = ArrayRef<const Expr *>::iterator;
3927 using privates_range = llvm::iterator_range<privates_iterator>;
3928 using privates_const_range = llvm::iterator_range<privates_const_iterator>;
3929
3930 privates_range privates() {
3931 return privates_range(getPrivates().begin(), getPrivates().end());
3932 }
3933
3934 privates_const_range privates() const {
3935 return privates_const_range(getPrivates().begin(), getPrivates().end());
3936 }
3937
3938 using inits_iterator = MutableArrayRef<Expr *>::iterator;
3939 using inits_const_iterator = ArrayRef<const Expr *>::iterator;
3940 using inits_range = llvm::iterator_range<inits_iterator>;
3941 using inits_const_range = llvm::iterator_range<inits_const_iterator>;
3942
3943 inits_range inits() {
3944 return inits_range(getInits().begin(), getInits().end());
3945 }
3946
3947 inits_const_range inits() const {
3948 return inits_const_range(getInits().begin(), getInits().end());
3949 }
3950
3951 using updates_iterator = MutableArrayRef<Expr *>::iterator;
3952 using updates_const_iterator = ArrayRef<const Expr *>::iterator;
3953 using updates_range = llvm::iterator_range<updates_iterator>;
3954 using updates_const_range = llvm::iterator_range<updates_const_iterator>;
3955
3956 updates_range updates() {
3957 return updates_range(getUpdates().begin(), getUpdates().end());
3958 }
3959
3960 updates_const_range updates() const {
3961 return updates_const_range(getUpdates().begin(), getUpdates().end());
3962 }
3963
3964 using finals_iterator = MutableArrayRef<Expr *>::iterator;
3965 using finals_const_iterator = ArrayRef<const Expr *>::iterator;
3966 using finals_range = llvm::iterator_range<finals_iterator>;
3967 using finals_const_range = llvm::iterator_range<finals_const_iterator>;
3968
3969 finals_range finals() {
3970 return finals_range(getFinals().begin(), getFinals().end());
3971 }
3972
3973 finals_const_range finals() const {
3974 return finals_const_range(getFinals().begin(), getFinals().end());
3975 }
3976
3977 using used_expressions_iterator = MutableArrayRef<Expr *>::iterator;
3978 using used_expressions_const_iterator = ArrayRef<const Expr *>::iterator;
3979 using used_expressions_range =
3980 llvm::iterator_range<used_expressions_iterator>;
3981 using used_expressions_const_range =
3982 llvm::iterator_range<used_expressions_const_iterator>;
3983
3984 used_expressions_range used_expressions() {
3985 return finals_range(getUsedExprs().begin(), getUsedExprs().end());
3986 }
3987
3988 used_expressions_const_range used_expressions() const {
3989 return finals_const_range(getUsedExprs().begin(), getUsedExprs().end());
3990 }
3991
3992 child_range children() {
3993 return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
3994 reinterpret_cast<Stmt **>(varlist_end()));
3995 }
3996
3997 const_child_range children() const {
3998 auto Children = const_cast<OMPLinearClause *>(this)->children();
3999 return const_child_range(Children.begin(), Children.end());
4000 }
4001
4002 child_range used_children();
4003
4004 const_child_range used_children() const {
4005 auto Children = const_cast<OMPLinearClause *>(this)->used_children();
4006 return const_child_range(Children.begin(), Children.end());
4007 }
4008
4009 static bool classof(const OMPClause *T) {
4010 return T->getClauseKind() == llvm::omp::OMPC_linear;
4011 }
4012};
4013
4014/// This represents clause 'aligned' in the '#pragma omp ...'
4015/// directives.
4016///
4017/// \code
4018/// #pragma omp simd aligned(a,b : 8)
4019/// \endcode
4020/// In this example directive '#pragma omp simd' has clause 'aligned'
4021/// with variables 'a', 'b' and alignment '8'.
4022class OMPAlignedClause final
4023 : public OMPVarListClause<OMPAlignedClause>,
4024 private llvm::TrailingObjects<OMPAlignedClause, Expr *> {
4025 friend class OMPClauseReader;
4026 friend OMPVarListClause;
4027 friend TrailingObjects;
4028
4029 /// Location of ':'.
4030 SourceLocation ColonLoc;
4031
4032 /// Sets the alignment for clause.
4033 void setAlignment(Expr *A) { *varlist_end() = A; }
4034
4035 /// Build 'aligned' clause with given number of variables \a NumVars.
4036 ///
4037 /// \param StartLoc Starting location of the clause.
4038 /// \param LParenLoc Location of '('.
4039 /// \param ColonLoc Location of ':'.
4040 /// \param EndLoc Ending location of the clause.
4041 /// \param NumVars Number of variables.
4042 OMPAlignedClause(SourceLocation StartLoc, SourceLocation LParenLoc,
4043 SourceLocation ColonLoc, SourceLocation EndLoc,
4044 unsigned NumVars)
4045 : OMPVarListClause<OMPAlignedClause>(llvm::omp::OMPC_aligned, StartLoc,
4046 LParenLoc, EndLoc, NumVars),
4047 ColonLoc(ColonLoc) {}
4048
4049 /// Build an empty clause.
4050 ///
4051 /// \param NumVars Number of variables.
4052 explicit OMPAlignedClause(unsigned NumVars)
4053 : OMPVarListClause<OMPAlignedClause>(llvm::omp::OMPC_aligned,
4054 SourceLocation(), SourceLocation(),
4055 SourceLocation(), NumVars) {}
4056
4057public:
4058 /// Creates clause with a list of variables \a VL and alignment \a A.
4059 ///
4060 /// \param C AST Context.
4061 /// \param StartLoc Starting location of the clause.
4062 /// \param LParenLoc Location of '('.
4063 /// \param ColonLoc Location of ':'.
4064 /// \param EndLoc Ending location of the clause.
4065 /// \param VL List of references to the variables.
4066 /// \param A Alignment.
4067 static OMPAlignedClause *Create(const ASTContext &C, SourceLocation StartLoc,
4068 SourceLocation LParenLoc,
4069 SourceLocation ColonLoc,
4070 SourceLocation EndLoc, ArrayRef<Expr *> VL,
4071 Expr *A);
4072
4073 /// Creates an empty clause with the place for \a NumVars variables.
4074 ///
4075 /// \param C AST context.
4076 /// \param NumVars Number of variables.
4077 static OMPAlignedClause *CreateEmpty(const ASTContext &C, unsigned NumVars);
4078
4079 /// Sets the location of ':'.
4080 void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
4081
4082 /// Returns the location of ':'.
4083 SourceLocation getColonLoc() const { return ColonLoc; }
4084
4085 /// Returns alignment.
4086 Expr *getAlignment() { return *varlist_end(); }
4087
4088 /// Returns alignment.
4089 const Expr *getAlignment() const { return *varlist_end(); }
4090
4091 child_range children() {
4092 return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
4093 reinterpret_cast<Stmt **>(varlist_end()));
4094 }
4095
4096 const_child_range children() const {
4097 auto Children = const_cast<OMPAlignedClause *>(this)->children();
4098 return const_child_range(Children.begin(), Children.end());
4099 }
4100
4101 child_range used_children() {
4102 return child_range(child_iterator(), child_iterator());
4103 }
4104 const_child_range used_children() const {
4105 return const_child_range(const_child_iterator(), const_child_iterator());
4106 }
4107
4108 static bool classof(const OMPClause *T) {
4109 return T->getClauseKind() == llvm::omp::OMPC_aligned;
4110 }
4111};
4112
4113/// This represents clause 'copyin' in the '#pragma omp ...' directives.
4114///
4115/// \code
4116/// #pragma omp parallel copyin(a,b)
4117/// \endcode
4118/// In this example directive '#pragma omp parallel' has clause 'copyin'
4119/// with the variables 'a' and 'b'.
4120class OMPCopyinClause final
4121 : public OMPVarListClause<OMPCopyinClause>,
4122 private llvm::TrailingObjects<OMPCopyinClause, Expr *> {
4123 // Class has 3 additional tail allocated arrays:
4124 // 1. List of helper expressions for proper generation of assignment operation
4125 // required for copyin clause. This list represents sources.
4126 // 2. List of helper expressions for proper generation of assignment operation
4127 // required for copyin clause. This list represents destinations.
4128 // 3. List of helper expressions that represents assignment operation:
4129 // \code
4130 // DstExprs = SrcExprs;
4131 // \endcode
4132 // Required for proper codegen of propagation of master's thread values of
4133 // threadprivate variables to local instances of that variables in other
4134 // implicit threads.
4135
4136 friend class OMPClauseReader;
4137 friend OMPVarListClause;
4138 friend TrailingObjects;
4139
4140 /// Build clause with number of variables \a N.
4141 ///
4142 /// \param StartLoc Starting location of the clause.
4143 /// \param LParenLoc Location of '('.
4144 /// \param EndLoc Ending location of the clause.
4145 /// \param N Number of the variables in the clause.
4146 OMPCopyinClause(SourceLocation StartLoc, SourceLocation LParenLoc,
4147 SourceLocation EndLoc, unsigned N)
4148 : OMPVarListClause<OMPCopyinClause>(llvm::omp::OMPC_copyin, StartLoc,
4149 LParenLoc, EndLoc, N) {}
4150
4151 /// Build an empty clause.
4152 ///
4153 /// \param N Number of variables.
4154 explicit OMPCopyinClause(unsigned N)
4155 : OMPVarListClause<OMPCopyinClause>(llvm::omp::OMPC_copyin,
4156 SourceLocation(), SourceLocation(),
4157 SourceLocation(), N) {}
4158
4159 /// Set list of helper expressions, required for proper codegen of the
4160 /// clause. These expressions represent source expression in the final
4161 /// assignment statement performed by the copyin clause.
4162 void setSourceExprs(ArrayRef<Expr *> SrcExprs);
4163
4164 /// Get the list of helper source expressions.
4165 MutableArrayRef<Expr *> getSourceExprs() {
4166 return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
4167 }
4168 ArrayRef<const Expr *> getSourceExprs() const {
4169 return llvm::makeArrayRef(varlist_end(), varlist_size());
4170 }
4171
4172 /// Set list of helper expressions, required for proper codegen of the
4173 /// clause. These expressions represent destination expression in the final
4174 /// assignment statement performed by the copyin clause.
4175 void setDestinationExprs(ArrayRef<Expr *> DstExprs);
4176
4177 /// Get the list of helper destination expressions.
4178 MutableArrayRef<Expr *> getDestinationExprs() {
4179 return MutableArrayRef<Expr *>(getSourceExprs().end(), varlist_size());
4180 }
4181 ArrayRef<const Expr *> getDestinationExprs() const {
4182 return llvm::makeArrayRef(getSourceExprs().end(), varlist_size());
4183 }
4184
4185 /// Set list of helper assignment expressions, required for proper
4186 /// codegen of the clause. These expressions are assignment expressions that
4187 /// assign source helper expressions to destination helper expressions
4188 /// correspondingly.
4189 void setAssignmentOps(ArrayRef<Expr *> AssignmentOps);
4190
4191 /// Get the list of helper assignment expressions.
4192 MutableArrayRef<Expr *> getAssignmentOps() {
4193 return MutableArrayRef<Expr *>(getDestinationExprs().end(), varlist_size());
4194 }
4195 ArrayRef<const Expr *> getAssignmentOps() const {
4196 return llvm::makeArrayRef(getDestinationExprs().end(), varlist_size());
4197 }
4198
4199public:
4200 /// Creates clause with a list of variables \a VL.
4201 ///
4202 /// \param C AST context.
4203 /// \param StartLoc Starting location of the clause.
4204 /// \param LParenLoc Location of '('.
4205 /// \param EndLoc Ending location of the clause.
4206 /// \param VL List of references to the variables.
4207 /// \param SrcExprs List of helper expressions for proper generation of
4208 /// assignment operation required for copyin clause. This list represents
4209 /// sources.
4210 /// \param DstExprs List of helper expressions for proper generation of
4211 /// assignment operation required for copyin clause. This list represents
4212 /// destinations.
4213 /// \param AssignmentOps List of helper expressions that represents assignment
4214 /// operation:
4215 /// \code
4216 /// DstExprs = SrcExprs;
4217 /// \endcode
4218 /// Required for proper codegen of propagation of master's thread values of
4219 /// threadprivate variables to local instances of that variables in other
4220 /// implicit threads.
4221 static OMPCopyinClause *
4222 Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
4223 SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs,
4224 ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps);
4225
4226 /// Creates an empty clause with \a N variables.
4227 ///
4228 /// \param C AST context.
4229 /// \param N The number of variables.
4230 static OMPCopyinClause *CreateEmpty(const ASTContext &C, unsigned N);
4231
4232 using helper_expr_iterator = MutableArrayRef<Expr *>::iterator;
4233 using helper_expr_const_iterator = ArrayRef<const Expr *>::iterator;
4234 using helper_expr_range = llvm::iterator_range<helper_expr_iterator>;
4235 using helper_expr_const_range =
4236 llvm::iterator_range<helper_expr_const_iterator>;
4237
4238 helper_expr_const_range source_exprs() const {
4239 return helper_expr_const_range(getSourceExprs().begin(),
4240 getSourceExprs().end());
4241 }
4242
4243 helper_expr_range source_exprs() {
4244 return helper_expr_range(getSourceExprs().begin(), getSourceExprs().end());
4245 }
4246
4247 helper_expr_const_range destination_exprs() const {
4248 return helper_expr_const_range(getDestinationExprs().begin(),
4249 getDestinationExprs().end());
4250 }
4251
4252 helper_expr_range destination_exprs() {
4253 return helper_expr_range(getDestinationExprs().begin(),
4254 getDestinationExprs().end());
4255 }
4256
4257 helper_expr_const_range assignment_ops() const {
4258 return helper_expr_const_range(getAssignmentOps().begin(),
4259 getAssignmentOps().end());
4260 }
4261
4262 helper_expr_range assignment_ops() {
4263 return helper_expr_range(getAssignmentOps().begin(),
4264 getAssignmentOps().end());
4265 }
4266
4267 child_range children() {
4268 return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
4269 reinterpret_cast<Stmt **>(varlist_end()));
4270 }
4271
4272 const_child_range children() const {
4273 auto Children = const_cast<OMPCopyinClause *>(this)->children();
4274 return const_child_range(Children.begin(), Children.end());
4275 }
4276
4277 child_range used_children() {
4278 return child_range(child_iterator(), child_iterator());
4279 }
4280 const_child_range used_children() const {
4281 return const_child_range(const_child_iterator(), const_child_iterator());
4282 }
4283
4284 static bool classof(const OMPClause *T) {
4285 return T->getClauseKind() == llvm::omp::OMPC_copyin;
4286 }
4287};
4288
4289/// This represents clause 'copyprivate' in the '#pragma omp ...'
4290/// directives.
4291///
4292/// \code
4293/// #pragma omp single copyprivate(a,b)
4294/// \endcode
4295/// In this example directive '#pragma omp single' has clause 'copyprivate'
4296/// with the variables 'a' and 'b'.
4297class OMPCopyprivateClause final
4298 : public OMPVarListClause<OMPCopyprivateClause>,
4299 private llvm::TrailingObjects<OMPCopyprivateClause, Expr *> {
4300 friend class OMPClauseReader;
4301 friend OMPVarListClause;
4302 friend TrailingObjects;
4303
4304 /// Build clause with number of variables \a N.
4305 ///
4306 /// \param StartLoc Starting location of the clause.
4307 /// \param LParenLoc Location of '('.
4308 /// \param EndLoc Ending location of the clause.
4309 /// \param N Number of the variables in the clause.
4310 OMPCopyprivateClause(SourceLocation StartLoc, SourceLocation LParenLoc,
4311 SourceLocation EndLoc, unsigned N)
4312 : OMPVarListClause<OMPCopyprivateClause>(llvm::omp::OMPC_copyprivate,
4313 StartLoc, LParenLoc, EndLoc, N) {
4314 }
4315
4316 /// Build an empty clause.
4317 ///
4318 /// \param N Number of variables.
4319 explicit OMPCopyprivateClause(unsigned N)
4320 : OMPVarListClause<OMPCopyprivateClause>(
4321 llvm::omp::OMPC_copyprivate, SourceLocation(), SourceLocation(),
4322 SourceLocation(), N) {}
4323
4324 /// Set list of helper expressions, required for proper codegen of the
4325 /// clause. These expressions represent source expression in the final
4326 /// assignment statement performed by the copyprivate clause.
4327 void setSourceExprs(ArrayRef<Expr *> SrcExprs);
4328
4329 /// Get the list of helper source expressions.
4330 MutableArrayRef<Expr *> getSourceExprs() {
4331 return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
4332 }
4333 ArrayRef<const Expr *> getSourceExprs() const {
4334 return llvm::makeArrayRef(varlist_end(), varlist_size());
4335 }
4336
4337 /// Set list of helper expressions, required for proper codegen of the
4338 /// clause. These expressions represent destination expression in the final
4339 /// assignment statement performed by the copyprivate clause.
4340 void setDestinationExprs(ArrayRef<Expr *> DstExprs);
4341
4342 /// Get the list of helper destination expressions.
4343 MutableArrayRef<Expr *> getDestinationExprs() {
4344 return MutableArrayRef<Expr *>(getSourceExprs().end(), varlist_size());
4345 }
4346 ArrayRef<const Expr *> getDestinationExprs() const {
4347 return llvm::makeArrayRef(getSourceExprs().end(), varlist_size());
4348 }
4349
4350 /// Set list of helper assignment expressions, required for proper
4351 /// codegen of the clause. These expressions are assignment expressions that
4352 /// assign source helper expressions to destination helper expressions
4353 /// correspondingly.
4354 void setAssignmentOps(ArrayRef<Expr *> AssignmentOps);
4355
4356 /// Get the list of helper assignment expressions.
4357 MutableArrayRef<Expr *> getAssignmentOps() {
4358 return MutableArrayRef<Expr *>(getDestinationExprs().end(), varlist_size());
4359 }
4360 ArrayRef<const Expr *> getAssignmentOps() const {
4361 return llvm::makeArrayRef(getDestinationExprs().end(), varlist_size());
4362 }
4363
4364public:
4365 /// Creates clause with a list of variables \a VL.
4366 ///
4367 /// \param C AST context.
4368 /// \param StartLoc Starting location of the clause.
4369 /// \param LParenLoc Location of '('.
4370 /// \param EndLoc Ending location of the clause.
4371 /// \param VL List of references to the variables.
4372 /// \param SrcExprs List of helper expressions for proper generation of
4373 /// assignment operation required for copyprivate clause. This list represents
4374 /// sources.
4375 /// \param DstExprs List of helper expressions for proper generation of
4376 /// assignment operation required for copyprivate clause. This list represents
4377 /// destinations.
4378 /// \param AssignmentOps List of helper expressions that represents assignment
4379 /// operation:
4380 /// \code
4381 /// DstExprs = SrcExprs;
4382 /// \endcode
4383 /// Required for proper codegen of final assignment performed by the
4384 /// copyprivate clause.
4385 static OMPCopyprivateClause *
4386 Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
4387 SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs,
4388 ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps);
4389
4390 /// Creates an empty clause with \a N variables.
4391 ///
4392 /// \param C AST context.
4393 /// \param N The number of variables.
4394 static OMPCopyprivateClause *CreateEmpty(const ASTContext &C, unsigned N);
4395
4396 using helper_expr_iterator = MutableArrayRef<Expr *>::iterator;
4397 using helper_expr_const_iterator = ArrayRef<const Expr *>::iterator;
4398 using helper_expr_range = llvm::iterator_range<helper_expr_iterator>;
4399 using helper_expr_const_range =
4400 llvm::iterator_range<helper_expr_const_iterator>;
4401
4402 helper_expr_const_range source_exprs() const {
4403 return helper_expr_const_range(getSourceExprs().begin(),
4404 getSourceExprs().end());
4405 }
4406
4407 helper_expr_range source_exprs() {
4408 return helper_expr_range(getSourceExprs().begin(), getSourceExprs().end());
4409 }
4410
4411 helper_expr_const_range destination_exprs() const {
4412 return helper_expr_const_range(getDestinationExprs().begin(),
4413 getDestinationExprs().end());
4414 }
4415
4416 helper_expr_range destination_exprs() {
4417 return helper_expr_range(getDestinationExprs().begin(),
4418 getDestinationExprs().end());
4419 }
4420
4421 helper_expr_const_range assignment_ops() const {
4422 return helper_expr_const_range(getAssignmentOps().begin(),
4423 getAssignmentOps().end());
4424 }
4425
4426 helper_expr_range assignment_ops() {
4427 return helper_expr_range(getAssignmentOps().begin(),
4428 getAssignmentOps().end());
4429 }
4430
4431 child_range children() {
4432 return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
4433 reinterpret_cast<Stmt **>(varlist_end()));
4434 }
4435
4436 const_child_range children() const {
4437 auto Children = const_cast<OMPCopyprivateClause *>(this)->children();
4438 return const_child_range(Children.begin(), Children.end());
4439 }
4440
4441 child_range used_children() {
4442 return child_range(child_iterator(), child_iterator());
4443 }
4444 const_child_range used_children() const {
4445 return const_child_range(const_child_iterator(), const_child_iterator());
4446 }
4447
4448 static bool classof(const OMPClause *T) {
4449 return T->getClauseKind() == llvm::omp::OMPC_copyprivate;
4450 }
4451};
4452
4453/// This represents implicit clause 'flush' for the '#pragma omp flush'
4454/// directive.
4455/// This clause does not exist by itself, it can be only as a part of 'omp
4456/// flush' directive. This clause is introduced to keep the original structure
4457/// of \a OMPExecutableDirective class and its derivatives and to use the
4458/// existing infrastructure of clauses with the list of variables.
4459///
4460/// \code
4461/// #pragma omp flush(a,b)
4462/// \endcode
4463/// In this example directive '#pragma omp flush' has implicit clause 'flush'
4464/// with the variables 'a' and 'b'.
4465class OMPFlushClause final
4466 : public OMPVarListClause<OMPFlushClause>,
4467 private llvm::TrailingObjects<OMPFlushClause, Expr *> {
4468 friend OMPVarListClause;
4469 friend TrailingObjects;
4470
4471 /// Build clause with number of variables \a N.
4472 ///
4473 /// \param StartLoc Starting location of the clause.
4474 /// \param LParenLoc Location of '('.
4475 /// \param EndLoc Ending location of the clause.
4476 /// \param N Number of the variables in the clause.
4477 OMPFlushClause(SourceLocation StartLoc, SourceLocation LParenLoc,
4478 SourceLocation EndLoc, unsigned N)
4479 : OMPVarListClause<OMPFlushClause>(llvm::omp::OMPC_flush, StartLoc,
4480 LParenLoc, EndLoc, N) {}
4481
4482 /// Build an empty clause.
4483 ///
4484 /// \param N Number of variables.
4485 explicit OMPFlushClause(unsigned N)
4486 : OMPVarListClause<OMPFlushClause>(llvm::omp::OMPC_flush,
4487 SourceLocation(), SourceLocation(),
4488 SourceLocation(), N) {}
4489
4490public:
4491 /// Creates clause with a list of variables \a VL.
4492 ///
4493 /// \param C AST context.
4494 /// \param StartLoc Starting location of the clause.
4495 /// \param LParenLoc Location of '('.
4496 /// \param EndLoc Ending location of the clause.
4497 /// \param VL List of references to the variables.
4498 static OMPFlushClause *Create(const ASTContext &C, SourceLocation StartLoc,
4499 SourceLocation LParenLoc, SourceLocation EndLoc,
4500 ArrayRef<Expr *> VL);
4501
4502 /// Creates an empty clause with \a N variables.
4503 ///
4504 /// \param C AST context.
4505 /// \param N The number of variables.
4506 static OMPFlushClause *CreateEmpty(const ASTContext &C, unsigned N);
4507
4508 child_range children() {
4509 return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
4510 reinterpret_cast<Stmt **>(varlist_end()));
4511 }
4512
4513 const_child_range children() const {
4514 auto Children = const_cast<OMPFlushClause *>(this)->children();
4515 return const_child_range(Children.begin(), Children.end());
4516 }
4517
4518 child_range used_children() {
4519 return child_range(child_iterator(), child_iterator());
4520 }
4521 const_child_range used_children() const {
4522 return const_child_range(const_child_iterator(), const_child_iterator());
4523 }
4524
4525 static bool classof(const OMPClause *T) {
4526 return T->getClauseKind() == llvm::omp::OMPC_flush;
4527 }
4528};
4529
4530/// This represents implicit clause 'depobj' for the '#pragma omp depobj'
4531/// directive.
4532/// This clause does not exist by itself, it can be only as a part of 'omp
4533/// depobj' directive. This clause is introduced to keep the original structure
4534/// of \a OMPExecutableDirective class and its derivatives and to use the
4535/// existing infrastructure of clauses with the list of variables.
4536///
4537/// \code
4538/// #pragma omp depobj(a) destroy
4539/// \endcode
4540/// In this example directive '#pragma omp depobj' has implicit clause 'depobj'
4541/// with the depobj 'a'.
4542class OMPDepobjClause final : public OMPClause {
4543 friend class OMPClauseReader;
4544
4545 /// Location of '('.
4546 SourceLocation LParenLoc;
4547
4548 /// Chunk size.
4549 Expr *Depobj = nullptr;
4550
4551 /// Build clause with number of variables \a N.
4552 ///
4553 /// \param StartLoc Starting location of the clause.
4554 /// \param LParenLoc Location of '('.
4555 /// \param EndLoc Ending location of the clause.
4556 OMPDepobjClause(SourceLocation StartLoc, SourceLocation LParenLoc,
4557 SourceLocation EndLoc)
4558 : OMPClause(llvm::omp::OMPC_depobj, StartLoc, EndLoc),
4559 LParenLoc(LParenLoc) {}
4560
4561 /// Build an empty clause.
4562 ///
4563 explicit OMPDepobjClause()
4564 : OMPClause(llvm::omp::OMPC_depobj, SourceLocation(), SourceLocation()) {}
4565
4566 void setDepobj(Expr *E) { Depobj = E; }
4567
4568 /// Sets the location of '('.
4569 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
4570
4571public:
4572 /// Creates clause.
4573 ///
4574 /// \param C AST context.
4575 /// \param StartLoc Starting location of the clause.
4576 /// \param LParenLoc Location of '('.
4577 /// \param EndLoc Ending location of the clause.
4578 /// \param Depobj depobj expression associated with the 'depobj' directive.
4579 static OMPDepobjClause *Create(const ASTContext &C, SourceLocation StartLoc,
4580 SourceLocation LParenLoc,
4581 SourceLocation EndLoc, Expr *Depobj);
4582
4583 /// Creates an empty clause.
4584 ///
4585 /// \param C AST context.
4586 static OMPDepobjClause *CreateEmpty(const ASTContext &C);
4587
4588 /// Returns depobj expression associated with the clause.
4589 Expr *getDepobj() { return Depobj; }
4590 const Expr *getDepobj() const { return Depobj; }
4591
4592 /// Returns the location of '('.
4593 SourceLocation getLParenLoc() const { return LParenLoc; }
4594
4595 child_range children() {
4596 return child_range(reinterpret_cast<Stmt **>(&Depobj),
4597 reinterpret_cast<Stmt **>(&Depobj) + 1);
4598 }
4599
4600 const_child_range children() const {
4601 auto Children = const_cast<OMPDepobjClause *>(this)->children();
4602 return const_child_range(Children.begin(), Children.end());
4603 }
4604
4605 child_range used_children() {
4606 return child_range(child_iterator(), child_iterator());
4607 }
4608 const_child_range used_children() const {
4609 return const_child_range(const_child_iterator(), const_child_iterator());
4610 }
4611
4612 static bool classof(const OMPClause *T) {
4613 return T->getClauseKind() == llvm::omp::OMPC_depobj;
4614 }
4615};
4616
4617/// This represents implicit clause 'depend' for the '#pragma omp task'
4618/// directive.
4619///
4620/// \code
4621/// #pragma omp task depend(in:a,b)
4622/// \endcode
4623/// In this example directive '#pragma omp task' with clause 'depend' with the
4624/// variables 'a' and 'b' with dependency 'in'.
4625class OMPDependClause final
4626 : public OMPVarListClause<OMPDependClause>,
4627 private llvm::TrailingObjects<OMPDependClause, Expr *> {
4628 friend class OMPClauseReader;
4629 friend OMPVarListClause;
4630 friend TrailingObjects;
4631
4632 /// Dependency type (one of in, out, inout).
4633 OpenMPDependClauseKind DepKind = OMPC_DEPEND_unknown;
4634
4635 /// Dependency type location.
4636 SourceLocation DepLoc;
4637
4638 /// Colon location.
4639 SourceLocation ColonLoc;
4640
4641 /// Number of loops, associated with the depend clause.
4642 unsigned NumLoops = 0;
4643
4644 /// Build clause with number of variables \a N.
4645 ///
4646 /// \param StartLoc Starting location of the clause.
4647 /// \param LParenLoc Location of '('.
4648 /// \param EndLoc Ending location of the clause.
4649 /// \param N Number of the variables in the clause.
4650 /// \param NumLoops Number of loops that is associated with this depend
4651 /// clause.
4652 OMPDependClause(SourceLocation StartLoc, SourceLocation LParenLoc,
4653 SourceLocation EndLoc, unsigned N, unsigned NumLoops)
4654 : OMPVarListClause<OMPDependClause>(llvm::omp::OMPC_depend, StartLoc,
4655 LParenLoc, EndLoc, N),
4656 NumLoops(NumLoops) {}
4657
4658 /// Build an empty clause.
4659 ///
4660 /// \param N Number of variables.
4661 /// \param NumLoops Number of loops that is associated with this depend
4662 /// clause.
4663 explicit OMPDependClause(unsigned N, unsigned NumLoops)
4664 : OMPVarListClause<OMPDependClause>(llvm::omp::OMPC_depend,
4665 SourceLocation(), SourceLocation(),
4666 SourceLocation(), N),
4667 NumLoops(NumLoops) {}
4668
4669 /// Set dependency kind.
4670 void setDependencyKind(OpenMPDependClauseKind K) { DepKind = K; }
4671
4672 /// Set dependency kind and its location.
4673 void setDependencyLoc(SourceLocation Loc) { DepLoc = Loc; }
4674
4675 /// Set colon location.
4676 void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
4677
4678 /// Sets optional dependency modifier.
4679 void setModifier(Expr *DepModifier);
4680
4681public:
4682 /// Creates clause with a list of variables \a VL.
4683 ///
4684 /// \param C AST context.
4685 /// \param StartLoc Starting location of the clause.
4686 /// \param LParenLoc Location of '('.
4687 /// \param EndLoc Ending location of the clause.
4688 /// \param DepKind Dependency type.
4689 /// \param DepLoc Location of the dependency type.
4690 /// \param ColonLoc Colon location.
4691 /// \param VL List of references to the variables.
4692 /// \param NumLoops Number of loops that is associated with this depend
4693 /// clause.
4694 static OMPDependClause *Create(const ASTContext &C, SourceLocation StartLoc,
4695 SourceLocation LParenLoc,
4696 SourceLocation EndLoc, Expr *DepModifier,
4697 OpenMPDependClauseKind DepKind,
4698 SourceLocation DepLoc, SourceLocation ColonLoc,
4699 ArrayRef<Expr *> VL, unsigned NumLoops);
4700
4701 /// Creates an empty clause with \a N variables.
4702 ///
4703 /// \param C AST context.
4704 /// \param N The number of variables.
4705 /// \param NumLoops Number of loops that is associated with this depend
4706 /// clause.
4707 static OMPDependClause *CreateEmpty(const ASTContext &C, unsigned N,
4708 unsigned NumLoops);
4709
4710 /// Get dependency type.
4711 OpenMPDependClauseKind getDependencyKind() const { return DepKind; }
4712
4713 /// Return optional depend modifier.
4714 Expr *getModifier();
4715 const Expr *getModifier() const {
4716 return const_cast<OMPDependClause *>(this)->getModifier();
4717 }
4718
4719 /// Get dependency type location.
4720 SourceLocation getDependencyLoc() const { return DepLoc; }
4721
4722 /// Get colon location.
4723 SourceLocation getColonLoc() const { return ColonLoc; }
4724
4725 /// Get number of loops associated with the clause.
4726 unsigned getNumLoops() const { return NumLoops; }
4727
4728 /// Set the loop data for the depend clauses with 'sink|source' kind of
4729 /// dependency.
4730 void setLoopData(unsigned NumLoop, Expr *Cnt);
4731
4732 /// Get the loop data.
4733 Expr *getLoopData(unsigned NumLoop);
4734 const Expr *getLoopData(unsigned NumLoop) const;
4735
4736 child_range children() {
4737 return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
4738 reinterpret_cast<Stmt **>(varlist_end()));
4739 }
4740
4741 const_child_range children() const {
4742 auto Children = const_cast<OMPDependClause *>(this)->children();
4743 return const_child_range(Children.begin(), Children.end());
4744 }
4745
4746 child_range used_children() {
4747 return child_range(child_iterator(), child_iterator());
4748 }
4749 const_child_range used_children() const {
4750 return const_child_range(const_child_iterator(), const_child_iterator());
4751 }
4752
4753 static bool classof(const OMPClause *T) {
4754 return T->getClauseKind() == llvm::omp::OMPC_depend;
4755 }
4756};
4757
4758/// This represents 'device' clause in the '#pragma omp ...'
4759/// directive.
4760///
4761/// \code
4762/// #pragma omp target device(a)
4763/// \endcode
4764/// In this example directive '#pragma omp target' has clause 'device'
4765/// with single expression 'a'.
4766class OMPDeviceClause : public OMPClause, public OMPClauseWithPreInit {
4767 friend class OMPClauseReader;
4768
4769 /// Location of '('.
4770 SourceLocation LParenLoc;
4771
4772 /// Device clause modifier.
4773 OpenMPDeviceClauseModifier Modifier = OMPC_DEVICE_unknown;
4774
4775 /// Location of the modifier.
4776 SourceLocation ModifierLoc;
4777
4778 /// Device number.
4779 Stmt *Device = nullptr;
4780
4781 /// Set the device number.
4782 ///
4783 /// \param E Device number.
4784 void setDevice(Expr *E) { Device = E; }
4785
4786 /// Sets modifier.
4787 void setModifier(OpenMPDeviceClauseModifier M) { Modifier = M; }
4788
4789 /// Setst modifier location.
4790 void setModifierLoc(SourceLocation Loc) { ModifierLoc = Loc; }
4791
4792public:
4793 /// Build 'device' clause.
4794 ///
4795 /// \param Modifier Clause modifier.
4796 /// \param E Expression associated with this clause.
4797 /// \param CaptureRegion Innermost OpenMP region where expressions in this
4798 /// clause must be captured.
4799 /// \param StartLoc Starting location of the clause.
4800 /// \param ModifierLoc Modifier location.
4801 /// \param LParenLoc Location of '('.
4802 /// \param EndLoc Ending location of the clause.
4803 OMPDeviceClause(OpenMPDeviceClauseModifier Modifier, Expr *E, Stmt *HelperE,
4804 OpenMPDirectiveKind CaptureRegion, SourceLocation StartLoc,
4805 SourceLocation LParenLoc, SourceLocation ModifierLoc,
4806 SourceLocation EndLoc)
4807 : OMPClause(llvm::omp::OMPC_device, StartLoc, EndLoc),
4808 OMPClauseWithPreInit(this), LParenLoc(LParenLoc), Modifier(Modifier),
4809 ModifierLoc(ModifierLoc), Device(E) {
4810 setPreInitStmt(HelperE, CaptureRegion);
4811 }
4812
4813 /// Build an empty clause.
4814 OMPDeviceClause()
4815 : OMPClause(llvm::omp::OMPC_device, SourceLocation(), SourceLocation()),
4816 OMPClauseWithPreInit(this) {}
4817
4818 /// Sets the location of '('.
4819 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
4820
4821 /// Returns the location of '('.
4822 SourceLocation getLParenLoc() const { return LParenLoc; }
4823
4824 /// Return device number.
4825 Expr *getDevice() { return cast<Expr>(Device); }
4826
4827 /// Return device number.
4828 Expr *getDevice() const { return cast<Expr>(Device); }
4829
4830 /// Gets modifier.
4831 OpenMPDeviceClauseModifier getModifier() const { return Modifier; }
4832
4833 /// Gets modifier location.
4834 SourceLocation getModifierLoc() const { return ModifierLoc; }
4835
4836 child_range children() { return child_range(&Device, &Device + 1); }
4837
4838 const_child_range children() const {
4839 return const_child_range(&Device, &Device + 1);
4840 }
4841
4842 child_range used_children() {
4843 return child_range(child_iterator(), child_iterator());
4844 }
4845 const_child_range used_children() const {
4846 return const_child_range(const_child_iterator(), const_child_iterator());
4847 }
4848
4849 static bool classof(const OMPClause *T) {
4850 return T->getClauseKind() == llvm::omp::OMPC_device;
4851 }
4852};
4853
4854/// This represents 'threads' clause in the '#pragma omp ...' directive.
4855///
4856/// \code
4857/// #pragma omp ordered threads
4858/// \endcode
4859/// In this example directive '#pragma omp ordered' has simple 'threads' clause.
4860class OMPThreadsClause : public OMPClause {
4861public:
4862 /// Build 'threads' clause.
4863 ///
4864 /// \param StartLoc Starting location of the clause.
4865 /// \param EndLoc Ending location of the clause.
4866 OMPThreadsClause(SourceLocation StartLoc, SourceLocation EndLoc)
4867 : OMPClause(llvm::omp::OMPC_threads, StartLoc, EndLoc) {}
4868
4869 /// Build an empty clause.
4870 OMPThreadsClause()
4871 : OMPClause(llvm::omp::OMPC_threads, SourceLocation(), SourceLocation()) {
4872 }
4873
4874 child_range children() {
4875 return child_range(child_iterator(), child_iterator());
4876 }
4877
4878 const_child_range children() const {
4879 return const_child_range(const_child_iterator(), const_child_iterator());
4880 }
4881
4882 child_range used_children() {
4883 return child_range(child_iterator(), child_iterator());
4884 }
4885 const_child_range used_children() const {
4886 return const_child_range(const_child_iterator(), const_child_iterator());
4887 }
4888
4889 static bool classof(const OMPClause *T) {
4890 return T->getClauseKind() == llvm::omp::OMPC_threads;
4891 }
4892};
4893
4894/// This represents 'simd' clause in the '#pragma omp ...' directive.
4895///
4896/// \code
4897/// #pragma omp ordered simd
4898/// \endcode
4899/// In this example directive '#pragma omp ordered' has simple 'simd' clause.
4900class OMPSIMDClause : public OMPClause {
4901public:
4902 /// Build 'simd' clause.
4903 ///
4904 /// \param StartLoc Starting location of the clause.
4905 /// \param EndLoc Ending location of the clause.
4906 OMPSIMDClause(SourceLocation StartLoc, SourceLocation EndLoc)
4907 : OMPClause(llvm::omp::OMPC_simd, StartLoc, EndLoc) {}
4908
4909 /// Build an empty clause.
4910 OMPSIMDClause()
4911 : OMPClause(llvm::omp::OMPC_simd, SourceLocation(), SourceLocation()) {}
4912
4913 child_range children() {
4914 return child_range(child_iterator(), child_iterator());
4915 }
4916
4917 const_child_range children() const {
4918 return const_child_range(const_child_iterator(), const_child_iterator());
4919 }
4920
4921 child_range used_children() {
4922 return child_range(child_iterator(), child_iterator());
4923 }
4924 const_child_range used_children() const {
4925 return const_child_range(const_child_iterator(), const_child_iterator());
4926 }
4927
4928 static bool classof(const OMPClause *T) {
4929 return T->getClauseKind() == llvm::omp::OMPC_simd;
4930 }
4931};
4932
4933/// Struct that defines common infrastructure to handle mappable
4934/// expressions used in OpenMP clauses.
4935class OMPClauseMappableExprCommon {
4936public:
4937 /// Class that represents a component of a mappable expression. E.g.
4938 /// for an expression S.a, the first component is a declaration reference
4939 /// expression associated with 'S' and the second is a member expression
4940 /// associated with the field declaration 'a'. If the expression is an array
4941 /// subscript it may not have any associated declaration. In that case the
4942 /// associated declaration is set to nullptr.
4943 class MappableComponent {
4944 /// Pair of Expression and Non-contiguous pair associated with the
4945 /// component.
4946 llvm::PointerIntPair<Expr *, 1, bool> AssociatedExpressionNonContiguousPr;
4947
4948 /// Declaration associated with the declaration. If the component does
4949 /// not have a declaration (e.g. array subscripts or section), this is set
4950 /// to nullptr.
4951 ValueDecl *AssociatedDeclaration = nullptr;
4952
4953 public:
4954 explicit MappableComponent() = default;
4955 explicit MappableComponent(Expr *AssociatedExpression,
4956 ValueDecl *AssociatedDeclaration,
4957 bool IsNonContiguous)
4958 : AssociatedExpressionNonContiguousPr(AssociatedExpression,
4959 IsNonContiguous),
4960 AssociatedDeclaration(
4961 AssociatedDeclaration
4962 ? cast<ValueDecl>(AssociatedDeclaration->getCanonicalDecl())
4963 : nullptr) {}
4964
4965 Expr *getAssociatedExpression() const {
4966 return AssociatedExpressionNonContiguousPr.getPointer();
4967 }
4968
4969 bool isNonContiguous() const {
4970 return AssociatedExpressionNonContiguousPr.getInt();
4971 }
4972
4973 ValueDecl *getAssociatedDeclaration() const {
4974 return AssociatedDeclaration;
4975 }
4976 };
4977
4978 // List of components of an expression. This first one is the whole
4979 // expression and the last one is the base expression.
4980 using MappableExprComponentList = SmallVector<MappableComponent, 8>;
4981 using MappableExprComponentListRef = ArrayRef<MappableComponent>;
4982
4983 // List of all component lists associated to the same base declaration.
4984 // E.g. if both 'S.a' and 'S.b' are a mappable expressions, each will have
4985 // their component list but the same base declaration 'S'.
4986 using MappableExprComponentLists = SmallVector<MappableExprComponentList, 8>;
4987 using MappableExprComponentListsRef = ArrayRef<MappableExprComponentList>;
4988
4989protected:
4990 // Return the total number of elements in a list of component lists.
4991 static unsigned
4992 getComponentsTotalNumber(MappableExprComponentListsRef ComponentLists);
4993
4994 // Return the total number of elements in a list of declarations. All
4995 // declarations are expected to be canonical.
4996 static unsigned
4997 getUniqueDeclarationsTotalNumber(ArrayRef<const ValueDecl *> Declarations);
4998};
4999
5000/// This structure contains all sizes needed for by an
5001/// OMPMappableExprListClause.
5002struct OMPMappableExprListSizeTy {
5003 /// Number of expressions listed.
5004 unsigned NumVars;
5005 /// Number of unique base declarations.
5006 unsigned NumUniqueDeclarations;
5007 /// Number of component lists.
5008 unsigned NumComponentLists;
5009 /// Total number of expression components.
5010 unsigned NumComponents;
5011 OMPMappableExprListSizeTy() = default;
5012 OMPMappableExprListSizeTy(unsigned NumVars, unsigned NumUniqueDeclarations,
5013 unsigned NumComponentLists, unsigned NumComponents)
5014 : NumVars(NumVars), NumUniqueDeclarations(NumUniqueDeclarations),
5015 NumComponentLists(NumComponentLists), NumComponents(NumComponents) {}
5016};
5017
5018/// This represents clauses with a list of expressions that are mappable.
5019/// Examples of these clauses are 'map' in
5020/// '#pragma omp target [enter|exit] [data]...' directives, and 'to' and 'from
5021/// in '#pragma omp target update...' directives.
5022template <class T>
5023class OMPMappableExprListClause : public OMPVarListClause<T>,
5024 public OMPClauseMappableExprCommon {
5025 friend class OMPClauseReader;
5026
5027 /// Number of unique declarations in this clause.
5028 unsigned NumUniqueDeclarations;
5029
5030 /// Number of component lists in this clause.
5031 unsigned NumComponentLists;
5032
5033 /// Total number of components in this clause.
5034 unsigned NumComponents;
5035
5036 /// Whether this clause is possible to have user-defined mappers associated.
5037 /// It should be true for map, to, and from clauses, and false for
5038 /// use_device_ptr and is_device_ptr.
5039 const bool SupportsMapper;
5040
5041 /// C++ nested name specifier for the associated user-defined mapper.
5042 NestedNameSpecifierLoc MapperQualifierLoc;
5043
5044 /// The associated user-defined mapper identifier information.
5045 DeclarationNameInfo MapperIdInfo;
5046
5047protected:
5048 /// Build a clause for \a NumUniqueDeclarations declarations, \a
5049 /// NumComponentLists total component lists, and \a NumComponents total
5050 /// components.
5051 ///
5052 /// \param K Kind of the clause.
5053 /// \param Locs Locations needed to build a mappable clause. It includes 1)
5054 /// StartLoc: starting location of the clause (the clause keyword); 2)
5055 /// LParenLoc: location of '('; 3) EndLoc: ending location of the clause.
5056 /// \param Sizes All required sizes to build a mappable clause. It includes 1)
5057 /// NumVars: number of expressions listed in this clause; 2)
5058 /// NumUniqueDeclarations: number of unique base declarations in this clause;
5059 /// 3) NumComponentLists: number of component lists in this clause; and 4)
5060 /// NumComponents: total number of expression components in the clause.
5061 /// \param SupportsMapper Indicates whether this clause is possible to have
5062 /// user-defined mappers associated.
5063 /// \param MapperQualifierLocPtr C++ nested name specifier for the associated
5064 /// user-defined mapper.
5065 /// \param MapperIdInfoPtr The identifier of associated user-defined mapper.
5066 OMPMappableExprListClause(
5067 OpenMPClauseKind K, const OMPVarListLocTy &Locs,
5068 const OMPMappableExprListSizeTy &Sizes, bool SupportsMapper = false,
5069 NestedNameSpecifierLoc *MapperQualifierLocPtr = nullptr,
5070 DeclarationNameInfo *MapperIdInfoPtr = nullptr)
5071 : OMPVarListClause<T>(K, Locs.StartLoc, Locs.LParenLoc, Locs.EndLoc,
5072 Sizes.NumVars),
5073 NumUniqueDeclarations(Sizes.NumUniqueDeclarations),
5074 NumComponentLists(Sizes.NumComponentLists),
5075 NumComponents(Sizes.NumComponents), SupportsMapper(SupportsMapper) {
5076 if (MapperQualifierLocPtr)
5077 MapperQualifierLoc = *MapperQualifierLocPtr;
5078 if (MapperIdInfoPtr)
5079 MapperIdInfo = *MapperIdInfoPtr;
5080 }
5081
5082 /// Get the unique declarations that are in the trailing objects of the
5083 /// class.
5084 MutableArrayRef<ValueDecl *> getUniqueDeclsRef() {
5085 return MutableArrayRef<ValueDecl *>(
5086 static_cast<T *>(this)->template getTrailingObjects<ValueDecl *>(),
5087 NumUniqueDeclarations);
5088 }
5089
5090 /// Get the unique declarations that are in the trailing objects of the
5091 /// class.
5092 ArrayRef<ValueDecl *> getUniqueDeclsRef() const {
5093 return ArrayRef<ValueDecl *>(
5094 static_cast<const T *>(this)
5095 ->template getTrailingObjects<ValueDecl *>(),
5096 NumUniqueDeclarations);
5097 }
5098
5099 /// Set the unique declarations that are in the trailing objects of the
5100 /// class.
5101 void setUniqueDecls(ArrayRef<ValueDecl *> UDs) {
5102 assert(UDs.size() == NumUniqueDeclarations &&((void)0)
5103 "Unexpected amount of unique declarations.")((void)0);
5104 std::copy(UDs.begin(), UDs.end(), getUniqueDeclsRef().begin());
5105 }
5106
5107 /// Get the number of lists per declaration that are in the trailing
5108 /// objects of the class.
5109 MutableArrayRef<unsigned> getDeclNumListsRef() {
5110 return MutableArrayRef<unsigned>(
5111 static_cast<T *>(this)->template getTrailingObjects<unsigned>(),
5112 NumUniqueDeclarations);
5113 }
5114
5115 /// Get the number of lists per declaration that are in the trailing
5116 /// objects of the class.
5117 ArrayRef<unsigned> getDeclNumListsRef() const {
5118 return ArrayRef<unsigned>(
5119 static_cast<const T *>(this)->template getTrailingObjects<unsigned>(),
5120 NumUniqueDeclarations);
5121 }
5122
5123 /// Set the number of lists per declaration that are in the trailing
5124 /// objects of the class.
5125 void setDeclNumLists(ArrayRef<unsigned> DNLs) {
5126 assert(DNLs.size() == NumUniqueDeclarations &&((void)0)
5127 "Unexpected amount of list numbers.")((void)0);
5128 std::copy(DNLs.begin(), DNLs.end(), getDeclNumListsRef().begin());
5129 }
5130
5131 /// Get the cumulative component lists sizes that are in the trailing
5132 /// objects of the class. They are appended after the number of lists.
5133 MutableArrayRef<unsigned> getComponentListSizesRef() {
5134 return MutableArrayRef<unsigned>(
5135 static_cast<T *>(this)->template getTrailingObjects<unsigned>() +
5136 NumUniqueDeclarations,
5137 NumComponentLists);
5138 }
5139
5140 /// Get the cumulative component lists sizes that are in the trailing
5141 /// objects of the class. They are appended after the number of lists.
5142 ArrayRef<unsigned> getComponentListSizesRef() const {
5143 return ArrayRef<unsigned>(
5144 static_cast<const T *>(this)->template getTrailingObjects<unsigned>() +
5145 NumUniqueDeclarations,
5146 NumComponentLists);
5147 }
5148
5149 /// Set the cumulative component lists sizes that are in the trailing
5150 /// objects of the class.
5151 void setComponentListSizes(ArrayRef<unsigned> CLSs) {
5152 assert(CLSs.size() == NumComponentLists &&((void)0)
5153 "Unexpected amount of component lists.")((void)0);
5154 std::copy(CLSs.begin(), CLSs.end(), getComponentListSizesRef().begin());
5155 }
5156
5157 /// Get the components that are in the trailing objects of the class.
5158 MutableArrayRef<MappableComponent> getComponentsRef() {
5159 return MutableArrayRef<MappableComponent>(
5160 static_cast<T *>(this)
5161 ->template getTrailingObjects<MappableComponent>(),
5162 NumComponents);
5163 }
5164
5165 /// Get the components that are in the trailing objects of the class.
5166 ArrayRef<MappableComponent> getComponentsRef() const {
5167 return ArrayRef<MappableComponent>(
5168 static_cast<const T *>(this)
5169 ->template getTrailingObjects<MappableComponent>(),
5170 NumComponents);
5171 }
5172
5173 /// Set the components that are in the trailing objects of the class.
5174 /// This requires the list sizes so that it can also fill the original
5175 /// expressions, which are the first component of each list.
5176 void setComponents(ArrayRef<MappableComponent> Components,
5177 ArrayRef<unsigned> CLSs) {
5178 assert(Components.size() == NumComponents &&((void)0)
5179 "Unexpected amount of component lists.")((void)0);
5180 assert(CLSs.size() == NumComponentLists &&((void)0)
5181 "Unexpected amount of list sizes.")((void)0);
5182 std::copy(Components.begin(), Components.end(), getComponentsRef().begin());
5183 }
5184
5185 /// Fill the clause information from the list of declarations and
5186 /// associated component lists.
5187 void setClauseInfo(ArrayRef<ValueDecl *> Declarations,
5188 MappableExprComponentListsRef ComponentLists) {
5189 // Perform some checks to make sure the data sizes are consistent with the
5190 // information available when the clause was created.
5191 assert(getUniqueDeclarationsTotalNumber(Declarations) ==((void)0)
5192 NumUniqueDeclarations &&((void)0)
5193 "Unexpected number of mappable expression info entries!")((void)0);
5194 assert(getComponentsTotalNumber(ComponentLists) == NumComponents &&((void)0)
5195 "Unexpected total number of components!")((void)0);
5196 assert(Declarations.size() == ComponentLists.size() &&((void)0)
5197 "Declaration and component lists size is not consistent!")((void)0);
5198 assert(Declarations.size() == NumComponentLists &&((void)0)
5199 "Unexpected declaration and component lists size!")((void)0);
5200
5201 // Organize the components by declaration and retrieve the original
5202 // expression. Original expressions are always the first component of the
5203 // mappable component list.
5204 llvm::MapVector<ValueDecl *, SmallVector<MappableExprComponentListRef, 8>>
5205 ComponentListMap;
5206 {
5207 auto CI = ComponentLists.begin();
5208 for (auto DI = Declarations.begin(), DE = Declarations.end(); DI != DE;
5209 ++DI, ++CI) {
5210 assert(!CI->empty() && "Invalid component list!")((void)0);
5211 ComponentListMap[*DI].push_back(*CI);
5212 }
5213 }
5214
5215 // Iterators of the target storage.
5216 auto UniqueDeclarations = getUniqueDeclsRef();
5217 auto UDI = UniqueDeclarations.begin();
5218
5219 auto DeclNumLists = getDeclNumListsRef();
5220 auto DNLI = DeclNumLists.begin();
5221
5222 auto ComponentListSizes = getComponentListSizesRef();
5223 auto CLSI = ComponentListSizes.begin();
5224
5225 auto Components = getComponentsRef();
5226 auto CI = Components.begin();
5227
5228 // Variable to compute the accumulation of the number of components.
5229 unsigned PrevSize = 0u;
5230
5231 // Scan all the declarations and associated component lists.
5232 for (auto &M : ComponentListMap) {
5233 // The declaration.
5234 auto *D = M.first;
5235 // The component lists.
5236 auto CL = M.second;
5237
5238 // Initialize the entry.
5239 *UDI = D;
5240 ++UDI;
5241
5242 *DNLI = CL.size();
5243 ++DNLI;
5244
5245 // Obtain the cumulative sizes and concatenate all the components in the
5246 // reserved storage.
5247 for (auto C : CL) {
5248 // Accumulate with the previous size.
5249 PrevSize += C.size();
5250
5251 // Save the size.
5252 *CLSI = PrevSize;
5253 ++CLSI;
5254
5255 // Append components after the current components iterator.
5256 CI = std::copy(C.begin(), C.end(), CI);
5257 }
5258 }
5259 }
5260
5261 /// Set the nested name specifier of associated user-defined mapper.
5262 void setMapperQualifierLoc(NestedNameSpecifierLoc NNSL) {
5263 MapperQualifierLoc = NNSL;
5264 }
5265
5266 /// Set the name of associated user-defined mapper.
5267 void setMapperIdInfo(DeclarationNameInfo MapperId) {
5268 MapperIdInfo = MapperId;
5269 }
5270
5271 /// Get the user-defined mapper references that are in the trailing objects of
5272 /// the class.
5273 MutableArrayRef<Expr *> getUDMapperRefs() {
5274 assert(SupportsMapper &&((void)0)
5275 "Must be a clause that is possible to have user-defined mappers")((void)0);
5276 return llvm::makeMutableArrayRef<Expr *>(
5277 static_cast<T *>(this)->template getTrailingObjects<Expr *>() +
5278 OMPVarListClause<T>::varlist_size(),
5279 OMPVarListClause<T>::varlist_size());
5280 }
5281
5282 /// Get the user-defined mappers references that are in the trailing objects
5283 /// of the class.
5284 ArrayRef<Expr *> getUDMapperRefs() const {
5285 assert(SupportsMapper &&((void)0)
5286 "Must be a clause that is possible to have user-defined mappers")((void)0);
5287 return llvm::makeArrayRef<Expr *>(
5288 static_cast<const T *>(this)->template getTrailingObjects<Expr *>() +
5289 OMPVarListClause<T>::varlist_size(),
5290 OMPVarListClause<T>::varlist_size());
5291 }
5292
5293 /// Set the user-defined mappers that are in the trailing objects of the
5294 /// class.
5295 void setUDMapperRefs(ArrayRef<Expr *> DMDs) {
5296 assert(DMDs.size() == OMPVarListClause<T>::varlist_size() &&((void)0)
5297 "Unexpected number of user-defined mappers.")((void)0);
5298 assert(SupportsMapper &&((void)0)
5299 "Must be a clause that is possible to have user-defined mappers")((void)0);
5300 std::copy(DMDs.begin(), DMDs.end(), getUDMapperRefs().begin());
5301 }
5302
5303public:
5304 /// Return the number of unique base declarations in this clause.
5305 unsigned getUniqueDeclarationsNum() const { return NumUniqueDeclarations; }
5306
5307 /// Return the number of lists derived from the clause expressions.
5308 unsigned getTotalComponentListNum() const { return NumComponentLists; }
5309
5310 /// Return the total number of components in all lists derived from the
5311 /// clause.
5312 unsigned getTotalComponentsNum() const { return NumComponents; }
5313
5314 /// Gets the nested name specifier for associated user-defined mapper.
5315 NestedNameSpecifierLoc getMapperQualifierLoc() const {
5316 return MapperQualifierLoc;
5317 }
5318
5319 /// Gets the name info for associated user-defined mapper.
5320 const DeclarationNameInfo &getMapperIdInfo() const { return MapperIdInfo; }
5321
5322 /// Iterator that browse the components by lists. It also allows
5323 /// browsing components of a single declaration.
5324 class const_component_lists_iterator
5325 : public llvm::iterator_adaptor_base<
5326 const_component_lists_iterator,
5327 MappableExprComponentListRef::const_iterator,
5328 std::forward_iterator_tag, MappableComponent, ptrdiff_t,
5329 MappableComponent, MappableComponent> {
5330 // The declaration the iterator currently refers to.
5331 ArrayRef<ValueDecl *>::iterator DeclCur;
5332
5333 // The list number associated with the current declaration.
5334 ArrayRef<unsigned>::iterator NumListsCur;
5335
5336 // Whether this clause is possible to have user-defined mappers associated.
5337 const bool SupportsMapper;
5338
5339 // The user-defined mapper associated with the current declaration.
5340 ArrayRef<Expr *>::iterator MapperCur;
5341
5342 // Remaining lists for the current declaration.
5343 unsigned RemainingLists = 0;
5344
5345 // The cumulative size of the previous list, or zero if there is no previous
5346 // list.
5347 unsigned PrevListSize = 0;
5348
5349 // The cumulative sizes of the current list - it will delimit the remaining
5350 // range of interest.
5351 ArrayRef<unsigned>::const_iterator ListSizeCur;
5352 ArrayRef<unsigned>::const_iterator ListSizeEnd;
5353
5354 // Iterator to the end of the components storage.
5355 MappableExprComponentListRef::const_iterator End;
5356
5357 public:
5358 /// Construct an iterator that scans all lists.
5359 explicit const_component_lists_iterator(
5360 ArrayRef<ValueDecl *> UniqueDecls, ArrayRef<unsigned> DeclsListNum,
5361 ArrayRef<unsigned> CumulativeListSizes,
5362 MappableExprComponentListRef Components, bool SupportsMapper,
5363 ArrayRef<Expr *> Mappers)
5364 : const_component_lists_iterator::iterator_adaptor_base(
5365 Components.begin()),
5366 DeclCur(UniqueDecls.begin()), NumListsCur(DeclsListNum.begin()),
5367 SupportsMapper(SupportsMapper),
5368 ListSizeCur(CumulativeListSizes.begin()),
5369 ListSizeEnd(CumulativeListSizes.end()), End(Components.end()) {
5370 assert(UniqueDecls.size() == DeclsListNum.size() &&((void)0)
5371 "Inconsistent number of declarations and list sizes!")((void)0);
5372 if (!DeclsListNum.empty())
5373 RemainingLists = *NumListsCur;
5374 if (SupportsMapper)
5375 MapperCur = Mappers.begin();
5376 }
5377
5378 /// Construct an iterator that scan lists for a given declaration \a
5379 /// Declaration.
5380 explicit const_component_lists_iterator(
5381 const ValueDecl *Declaration, ArrayRef<ValueDecl *> UniqueDecls,
5382 ArrayRef<unsigned> DeclsListNum, ArrayRef<unsigned> CumulativeListSizes,
5383 MappableExprComponentListRef Components, bool SupportsMapper,
5384 ArrayRef<Expr *> Mappers)
5385 : const_component_lists_iterator(UniqueDecls, DeclsListNum,
5386 CumulativeListSizes, Components,
5387 SupportsMapper, Mappers) {
5388 // Look for the desired declaration. While we are looking for it, we
5389 // update the state so that we know the component where a given list
5390 // starts.
5391 for (; DeclCur != UniqueDecls.end(); ++DeclCur, ++NumListsCur) {
5392 if (*DeclCur == Declaration)
5393 break;
5394
5395 assert(*NumListsCur > 0 && "No lists associated with declaration??")((void)0);
5396
5397 // Skip the lists associated with the current declaration, but save the
5398 // last list size that was skipped.
5399 std::advance(ListSizeCur, *NumListsCur - 1);
5400 PrevListSize = *ListSizeCur;
5401 ++ListSizeCur;
5402
5403 if (SupportsMapper)
5404 ++MapperCur;
5405 }
5406
5407 // If we didn't find any declaration, advance the iterator to after the
5408 // last component and set remaining lists to zero.
5409 if (ListSizeCur == CumulativeListSizes.end()) {
5410 this->I = End;
5411 RemainingLists = 0u;
5412 return;
5413 }
5414
5415 // Set the remaining lists with the total number of lists of the current
5416 // declaration.
5417 RemainingLists = *NumListsCur;
5418
5419 // Adjust the list size end iterator to the end of the relevant range.
5420 ListSizeEnd = ListSizeCur;
5421 std::advance(ListSizeEnd, RemainingLists);
5422
5423 // Given that the list sizes are cumulative, the index of the component
5424 // that start the list is the size of the previous list.
5425 std::advance(this->I, PrevListSize);
5426 }
5427
5428 // Return the array with the current list. The sizes are cumulative, so the
5429 // array size is the difference between the current size and previous one.
5430 std::tuple<const ValueDecl *, MappableExprComponentListRef,
5431 const ValueDecl *>
5432 operator*() const {
5433 assert(ListSizeCur != ListSizeEnd && "Invalid iterator!")((void)0);
5434 const ValueDecl *Mapper = nullptr;
5435 if (SupportsMapper && *MapperCur)
5436 Mapper = cast<ValueDecl>(cast<DeclRefExpr>(*MapperCur)->getDecl());
5437 return std::make_tuple(
5438 *DeclCur,
5439 MappableExprComponentListRef(&*this->I, *ListSizeCur - PrevListSize),
5440 Mapper);
5441 }
5442 std::tuple<const ValueDecl *, MappableExprComponentListRef,
5443 const ValueDecl *>
5444 operator->() const {
5445 return **this;
5446 }
5447
5448 // Skip the components of the current list.
5449 const_component_lists_iterator &operator++() {
5450 assert(ListSizeCur != ListSizeEnd && RemainingLists &&((void)0)
5451 "Invalid iterator!")((void)0);
5452
5453 // If we don't have more lists just skip all the components. Otherwise,
5454 // advance the iterator by the number of components in the current list.
5455 if (std::next(ListSizeCur) == ListSizeEnd) {
5456 this->I = End;
5457 RemainingLists = 0;
5458 } else {
5459 std::advance(this->I, *ListSizeCur - PrevListSize);
5460 PrevListSize = *ListSizeCur;
5461
5462 // We are done with a declaration, move to the next one.
5463 if (!(--RemainingLists)) {
5464 ++DeclCur;
5465 ++NumListsCur;
5466 RemainingLists = *NumListsCur;
5467 assert(RemainingLists && "No lists in the following declaration??")((void)0);
5468 }
5469 }
5470
5471 ++ListSizeCur;
5472 if (SupportsMapper)
5473 ++MapperCur;
5474 return *this;
5475 }
5476 };
5477
5478 using const_component_lists_range =
5479 llvm::iterator_range<const_component_lists_iterator>;
5480
5481 /// Iterators for all component lists.
5482 const_component_lists_iterator component_lists_begin() const {
5483 return const_component_lists_iterator(
5484 getUniqueDeclsRef(), getDeclNumListsRef(), getComponentListSizesRef(),
5485 getComponentsRef(), SupportsMapper,
5486 SupportsMapper ? getUDMapperRefs() : llvm::None);
5487 }
5488 const_component_lists_iterator component_lists_end() const {
5489 return const_component_lists_iterator(
5490 ArrayRef<ValueDecl *>(), ArrayRef<unsigned>(), ArrayRef<unsigned>(),
5491 MappableExprComponentListRef(getComponentsRef().end(),
5492 getComponentsRef().end()),
5493 SupportsMapper, llvm::None);
5494 }
5495 const_component_lists_range component_lists() const {
5496 return {component_lists_begin(), component_lists_end()};
5497 }
5498
5499 /// Iterators for component lists associated with the provided
5500 /// declaration.
5501 const_component_lists_iterator
5502 decl_component_lists_begin(const ValueDecl *VD) const {
5503 return const_component_lists_iterator(
5504 VD, getUniqueDeclsRef(), getDeclNumListsRef(),
5505 getComponentListSizesRef(), getComponentsRef(), SupportsMapper,
5506 SupportsMapper ? getUDMapperRefs() : llvm::None);
5507 }
5508 const_component_lists_iterator decl_component_lists_end() const {
5509 return component_lists_end();
5510 }
5511 const_component_lists_range decl_component_lists(const ValueDecl *VD) const {
5512 return {decl_component_lists_begin(VD), decl_component_lists_end()};
5513 }
5514
5515 /// Iterators to access all the declarations, number of lists, list sizes, and
5516 /// components.
5517 using const_all_decls_iterator = ArrayRef<ValueDecl *>::iterator;
5518 using const_all_decls_range = llvm::iterator_range<const_all_decls_iterator>;
5519
5520 const_all_decls_range all_decls() const {
5521 auto A = getUniqueDeclsRef();
5522 return const_all_decls_range(A.begin(), A.end());
5523 }
5524
5525 using const_all_num_lists_iterator = ArrayRef<unsigned>::iterator;
5526 using const_all_num_lists_range =
5527 llvm::iterator_range<const_all_num_lists_iterator>;
5528
5529 const_all_num_lists_range all_num_lists() const {
5530 auto A = getDeclNumListsRef();
5531 return const_all_num_lists_range(A.begin(), A.end());
5532 }
5533
5534 using const_all_lists_sizes_iterator = ArrayRef<unsigned>::iterator;
5535 using const_all_lists_sizes_range =
5536 llvm::iterator_range<const_all_lists_sizes_iterator>;
5537
5538 const_all_lists_sizes_range all_lists_sizes() const {
5539 auto A = getComponentListSizesRef();
5540 return const_all_lists_sizes_range(A.begin(), A.end());
5541 }
5542
5543 using const_all_components_iterator = ArrayRef<MappableComponent>::iterator;
5544 using const_all_components_range =
5545 llvm::iterator_range<const_all_components_iterator>;
5546
5547 const_all_components_range all_components() const {
5548 auto A = getComponentsRef();
5549 return const_all_components_range(A.begin(), A.end());
5550 }
5551
5552 using mapperlist_iterator = MutableArrayRef<Expr *>::iterator;
5553 using mapperlist_const_iterator = ArrayRef<const Expr *>::iterator;
5554 using mapperlist_range = llvm::iterator_range<mapperlist_iterator>;
5555 using mapperlist_const_range =
5556 llvm::iterator_range<mapperlist_const_iterator>;
5557
5558 mapperlist_iterator mapperlist_begin() { return getUDMapperRefs().begin(); }
5559 mapperlist_iterator mapperlist_end() { return getUDMapperRefs().end(); }
5560 mapperlist_const_iterator mapperlist_begin() const {
5561 return getUDMapperRefs().begin();
5562 }
5563 mapperlist_const_iterator mapperlist_end() const {
5564 return getUDMapperRefs().end();
5565 }
5566 mapperlist_range mapperlists() {
5567 return mapperlist_range(mapperlist_begin(), mapperlist_end());
5568 }
5569 mapperlist_const_range mapperlists() const {
5570 return mapperlist_const_range(mapperlist_begin(), mapperlist_end());
5571 }
5572};
5573
5574/// This represents clause 'map' in the '#pragma omp ...'
5575/// directives.
5576///
5577/// \code
5578/// #pragma omp target map(a,b)
5579/// \endcode
5580/// In this example directive '#pragma omp target' has clause 'map'
5581/// with the variables 'a' and 'b'.
5582class OMPMapClause final : public OMPMappableExprListClause<OMPMapClause>,
5583 private llvm::TrailingObjects<
5584 OMPMapClause, Expr *, ValueDecl *, unsigned,
5585 OMPClauseMappableExprCommon::MappableComponent> {
5586 friend class OMPClauseReader;
5587 friend OMPMappableExprListClause;
5588 friend OMPVarListClause;
5589 friend TrailingObjects;
5590
5591 /// Define the sizes of each trailing object array except the last one. This
5592 /// is required for TrailingObjects to work properly.
5593 size_t numTrailingObjects(OverloadToken<Expr *>) const {
5594 // There are varlist_size() of expressions, and varlist_size() of
5595 // user-defined mappers.
5596 return 2 * varlist_size();
5597 }
5598 size_t numTrailingObjects(OverloadToken<ValueDecl *>) const {
5599 return getUniqueDeclarationsNum();
5600 }
5601 size_t numTrailingObjects(OverloadToken<unsigned>) const {
5602 return getUniqueDeclarationsNum() + getTotalComponentListNum();
5603 }
5604
5605private:
5606 /// Map-type-modifiers for the 'map' clause.
5607 OpenMPMapModifierKind MapTypeModifiers[NumberOfOMPMapClauseModifiers] = {
5608 OMPC_MAP_MODIFIER_unknown, OMPC_MAP_MODIFIER_unknown,
5609 OMPC_MAP_MODIFIER_unknown, OMPC_MAP_MODIFIER_unknown};
5610
5611 /// Location of map-type-modifiers for the 'map' clause.
5612 SourceLocation MapTypeModifiersLoc[NumberOfOMPMapClauseModifiers];
5613
5614 /// Map type for the 'map' clause.
5615 OpenMPMapClauseKind MapType = OMPC_MAP_unknown;
5616
5617 /// Is this an implicit map type or not.
5618 bool MapTypeIsImplicit = false;
5619
5620 /// Location of the map type.
5621 SourceLocation MapLoc;
5622
5623 /// Colon location.
5624 SourceLocation ColonLoc;
5625
5626 /// Build a clause for \a NumVars listed expressions, \a
5627 /// NumUniqueDeclarations declarations, \a NumComponentLists total component
5628 /// lists, and \a NumComponents total expression components.
5629 ///
5630 /// \param MapModifiers Map-type-modifiers.
5631 /// \param MapModifiersLoc Locations of map-type-modifiers.
5632 /// \param MapperQualifierLoc C++ nested name specifier for the associated
5633 /// user-defined mapper.
5634 /// \param MapperIdInfo The identifier of associated user-defined mapper.
5635 /// \param MapType Map type.
5636 /// \param MapTypeIsImplicit Map type is inferred implicitly.
5637 /// \param MapLoc Location of the map type.
5638 /// \param Locs Locations needed to build a mappable clause. It includes 1)
5639 /// StartLoc: starting location of the clause (the clause keyword); 2)
5640 /// LParenLoc: location of '('; 3) EndLoc: ending location of the clause.
5641 /// \param Sizes All required sizes to build a mappable clause. It includes 1)
5642 /// NumVars: number of expressions listed in this clause; 2)
5643 /// NumUniqueDeclarations: number of unique base declarations in this clause;
5644 /// 3) NumComponentLists: number of component lists in this clause; and 4)
5645 /// NumComponents: total number of expression components in the clause.
5646 explicit OMPMapClause(ArrayRef<OpenMPMapModifierKind> MapModifiers,
5647 ArrayRef<SourceLocation> MapModifiersLoc,
5648 NestedNameSpecifierLoc MapperQualifierLoc,
5649 DeclarationNameInfo MapperIdInfo,
5650 OpenMPMapClauseKind MapType, bool MapTypeIsImplicit,
5651 SourceLocation MapLoc, const OMPVarListLocTy &Locs,
5652 const OMPMappableExprListSizeTy &Sizes)
5653 : OMPMappableExprListClause(llvm::omp::OMPC_map, Locs, Sizes,
5654 /*SupportsMapper=*/true, &MapperQualifierLoc,
5655 &MapperIdInfo),
5656 MapType(MapType), MapTypeIsImplicit(MapTypeIsImplicit), MapLoc(MapLoc) {
5657 assert(llvm::array_lengthof(MapTypeModifiers) == MapModifiers.size() &&((void)0)
5658 "Unexpected number of map type modifiers.")((void)0);
5659 llvm::copy(MapModifiers, std::begin(MapTypeModifiers));
5660
5661 assert(llvm::array_lengthof(MapTypeModifiersLoc) ==((void)0)
5662 MapModifiersLoc.size() &&((void)0)
5663 "Unexpected number of map type modifier locations.")((void)0);
5664 llvm::copy(MapModifiersLoc, std::begin(MapTypeModifiersLoc));
5665 }
5666
5667 /// Build an empty clause.
5668 ///
5669 /// \param Sizes All required sizes to build a mappable clause. It includes 1)
5670 /// NumVars: number of expressions listed in this clause; 2)
5671 /// NumUniqueDeclarations: number of unique base declarations in this clause;
5672 /// 3) NumComponentLists: number of component lists in this clause; and 4)
5673 /// NumComponents: total number of expression components in the clause.
5674 explicit OMPMapClause(const OMPMappableExprListSizeTy &Sizes)
5675 : OMPMappableExprListClause(llvm::omp::OMPC_map, OMPVarListLocTy(), Sizes,
5676 /*SupportsMapper=*/true) {}
5677
5678 /// Set map-type-modifier for the clause.
5679 ///
5680 /// \param I index for map-type-modifier.
5681 /// \param T map-type-modifier for the clause.
5682 void setMapTypeModifier(unsigned I, OpenMPMapModifierKind T) {
5683 assert(I < NumberOfOMPMapClauseModifiers &&((void)0)
5684 "Unexpected index to store map type modifier, exceeds array size.")((void)0);
5685 MapTypeModifiers[I] = T;
5686 }
5687
5688 /// Set location for the map-type-modifier.
5689 ///
5690 /// \param I index for map-type-modifier location.
5691 /// \param TLoc map-type-modifier location.
5692 void setMapTypeModifierLoc(unsigned I, SourceLocation TLoc) {
5693 assert(I < NumberOfOMPMapClauseModifiers &&((void)0)
5694 "Index to store map type modifier location exceeds array size.")((void)0);
5695 MapTypeModifiersLoc[I] = TLoc;
5696 }
5697
5698 /// Set type for the clause.
5699 ///
5700 /// \param T Type for the clause.
5701 void setMapType(OpenMPMapClauseKind T) { MapType = T; }
5702
5703 /// Set type location.
5704 ///
5705 /// \param TLoc Type location.
5706 void setMapLoc(SourceLocation TLoc) { MapLoc = TLoc; }
5707
5708 /// Set colon location.
5709 void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
5710
5711public:
5712 /// Creates clause with a list of variables \a VL.
5713 ///
5714 /// \param C AST context.
5715 /// \param Locs Locations needed to build a mappable clause. It includes 1)
5716 /// StartLoc: starting location of the clause (the clause keyword); 2)
5717 /// LParenLoc: location of '('; 3) EndLoc: ending location of the clause.
5718 /// \param Vars The original expression used in the clause.
5719 /// \param Declarations Declarations used in the clause.
5720 /// \param ComponentLists Component lists used in the clause.
5721 /// \param UDMapperRefs References to user-defined mappers associated with
5722 /// expressions used in the clause.
5723 /// \param MapModifiers Map-type-modifiers.
5724 /// \param MapModifiersLoc Location of map-type-modifiers.
5725 /// \param UDMQualifierLoc C++ nested name specifier for the associated
5726 /// user-defined mapper.
5727 /// \param MapperId The identifier of associated user-defined mapper.
5728 /// \param Type Map type.
5729 /// \param TypeIsImplicit Map type is inferred implicitly.
5730 /// \param TypeLoc Location of the map type.
5731 static OMPMapClause *
5732 Create(const ASTContext &C, const OMPVarListLocTy &Locs,
5733 ArrayRef<Expr *> Vars, ArrayRef<ValueDecl *> Declarations,
5734 MappableExprComponentListsRef ComponentLists,
5735 ArrayRef<Expr *> UDMapperRefs,
5736 ArrayRef<OpenMPMapModifierKind> MapModifiers,
5737 ArrayRef<SourceLocation> MapModifiersLoc,
5738 NestedNameSpecifierLoc UDMQualifierLoc, DeclarationNameInfo MapperId,
5739 OpenMPMapClauseKind Type, bool TypeIsImplicit, SourceLocation TypeLoc);
5740
5741 /// Creates an empty clause with the place for \a NumVars original
5742 /// expressions, \a NumUniqueDeclarations declarations, \NumComponentLists
5743 /// lists, and \a NumComponents expression components.
5744 ///
5745 /// \param C AST context.
5746 /// \param Sizes All required sizes to build a mappable clause. It includes 1)
5747 /// NumVars: number of expressions listed in this clause; 2)
5748 /// NumUniqueDeclarations: number of unique base declarations in this clause;
5749 /// 3) NumComponentLists: number of component lists in this clause; and 4)
5750 /// NumComponents: total number of expression components in the clause.
5751 static OMPMapClause *CreateEmpty(const ASTContext &C,
5752 const OMPMappableExprListSizeTy &Sizes);
5753
5754 /// Fetches mapping kind for the clause.
5755 OpenMPMapClauseKind getMapType() const LLVM_READONLY__attribute__((__pure__)) { return MapType; }
5756
5757 /// Is this an implicit map type?
5758 /// We have to capture 'IsMapTypeImplicit' from the parser for more
5759 /// informative error messages. It helps distinguish map(r) from
5760 /// map(tofrom: r), which is important to print more helpful error
5761 /// messages for some target directives.
5762 bool isImplicitMapType() const LLVM_READONLY__attribute__((__pure__)) { return MapTypeIsImplicit; }
5763
5764 /// Fetches the map-type-modifier at 'Cnt' index of array of modifiers.
5765 ///
5766 /// \param Cnt index for map-type-modifier.
5767 OpenMPMapModifierKind getMapTypeModifier(unsigned Cnt) const LLVM_READONLY__attribute__((__pure__)) {
5768 assert(Cnt < NumberOfOMPMapClauseModifiers &&((void)0)
5769 "Requested modifier exceeds the total number of modifiers.")((void)0);
5770 return MapTypeModifiers[Cnt];
5771 }
5772
5773 /// Fetches the map-type-modifier location at 'Cnt' index of array of
5774 /// modifiers' locations.
5775 ///
5776 /// \param Cnt index for map-type-modifier location.
5777 SourceLocation getMapTypeModifierLoc(unsigned Cnt) const LLVM_READONLY__attribute__((__pure__)) {
5778 assert(Cnt < NumberOfOMPMapClauseModifiers &&((void)0)
5779 "Requested modifier location exceeds total number of modifiers.")((void)0);
5780 return MapTypeModifiersLoc[Cnt];
5781 }
5782
5783 /// Fetches ArrayRef of map-type-modifiers.
5784 ArrayRef<OpenMPMapModifierKind> getMapTypeModifiers() const LLVM_READONLY__attribute__((__pure__)) {
5785 return llvm::makeArrayRef(MapTypeModifiers);
5786 }
5787
5788 /// Fetches ArrayRef of location of map-type-modifiers.
5789 ArrayRef<SourceLocation> getMapTypeModifiersLoc() const LLVM_READONLY__attribute__((__pure__)) {
5790 return llvm::makeArrayRef(MapTypeModifiersLoc);
5791 }
5792
5793 /// Fetches location of clause mapping kind.
5794 SourceLocation getMapLoc() const LLVM_READONLY__attribute__((__pure__)) { return MapLoc; }
5795
5796 /// Get colon location.
5797 SourceLocation getColonLoc() const { return ColonLoc; }
5798
5799 child_range children() {
5800 return child_range(
5801 reinterpret_cast<Stmt **>(varlist_begin()),
5802 reinterpret_cast<Stmt **>(varlist_end()));
5803 }
5804
5805 const_child_range children() const {
5806 auto Children = const_cast<OMPMapClause *>(this)->children();
5807 return const_child_range(Children.begin(), Children.end());
5808 }
5809
5810 child_range used_children() {
5811 if (MapType == OMPC_MAP_to || MapType == OMPC_MAP_tofrom)
5812 return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
5813 reinterpret_cast<Stmt **>(varlist_end()));
5814 return child_range(child_iterator(), child_iterator());
5815 }
5816 const_child_range used_children() const {
5817 auto Children = const_cast<OMPMapClause *>(this)->used_children();
5818 return const_child_range(Children.begin(), Children.end());
5819 }
5820
5821
5822 static bool classof(const OMPClause *T) {
5823 return T->getClauseKind() == llvm::omp::OMPC_map;
5824 }
5825};
5826
5827/// This represents 'num_teams' clause in the '#pragma omp ...'
5828/// directive.
5829///
5830/// \code
5831/// #pragma omp teams num_teams(n)
5832/// \endcode
5833/// In this example directive '#pragma omp teams' has clause 'num_teams'
5834/// with single expression 'n'.
5835class OMPNumTeamsClause : public OMPClause, public OMPClauseWithPreInit {
5836 friend class OMPClauseReader;
5837
5838 /// Location of '('.
5839 SourceLocation LParenLoc;
5840
5841 /// NumTeams number.
5842 Stmt *NumTeams = nullptr;
5843
5844 /// Set the NumTeams number.
5845 ///
5846 /// \param E NumTeams number.
5847 void setNumTeams(Expr *E) { NumTeams = E; }
5848
5849public:
5850 /// Build 'num_teams' clause.
5851 ///
5852 /// \param E Expression associated with this clause.
5853 /// \param HelperE Helper Expression associated with this clause.
5854 /// \param CaptureRegion Innermost OpenMP region where expressions in this
5855 /// clause must be captured.
5856 /// \param StartLoc Starting location of the clause.
5857 /// \param LParenLoc Location of '('.
5858 /// \param EndLoc Ending location of the clause.
5859 OMPNumTeamsClause(Expr *E, Stmt *HelperE, OpenMPDirectiveKind CaptureRegion,
5860 SourceLocation StartLoc, SourceLocation LParenLoc,
5861 SourceLocation EndLoc)
5862 : OMPClause(llvm::omp::OMPC_num_teams, StartLoc, EndLoc),
5863 OMPClauseWithPreInit(this), LParenLoc(LParenLoc), NumTeams(E) {
5864 setPreInitStmt(HelperE, CaptureRegion);
5865 }
5866
5867 /// Build an empty clause.
5868 OMPNumTeamsClause()
5869 : OMPClause(llvm::omp::OMPC_num_teams, SourceLocation(),
5870 SourceLocation()),
5871 OMPClauseWithPreInit(this) {}
5872
5873 /// Sets the location of '('.
5874 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
5875
5876 /// Returns the location of '('.
5877 SourceLocation getLParenLoc() const { return LParenLoc; }
5878
5879 /// Return NumTeams number.
5880 Expr *getNumTeams() { return cast<Expr>(NumTeams); }
5881
5882 /// Return NumTeams number.
5883 Expr *getNumTeams() const { return cast<Expr>(NumTeams); }
5884
5885 child_range children() { return child_range(&NumTeams, &NumTeams + 1); }
5886
5887 const_child_range children() const {
5888 return const_child_range(&NumTeams, &NumTeams + 1);
5889 }
5890
5891 child_range used_children() {
5892 return child_range(child_iterator(), child_iterator());
5893 }
5894 const_child_range used_children() const {
5895 return const_child_range(const_child_iterator(), const_child_iterator());
5896 }
5897
5898 static bool classof(const OMPClause *T) {
5899 return T->getClauseKind() == llvm::omp::OMPC_num_teams;
5900 }
5901};
5902
5903/// This represents 'thread_limit' clause in the '#pragma omp ...'
5904/// directive.
5905///
5906/// \code
5907/// #pragma omp teams thread_limit(n)
5908/// \endcode
5909/// In this example directive '#pragma omp teams' has clause 'thread_limit'
5910/// with single expression 'n'.
5911class OMPThreadLimitClause : public OMPClause, public OMPClauseWithPreInit {
5912 friend class OMPClauseReader;
5913
5914 /// Location of '('.
5915 SourceLocation LParenLoc;
5916
5917 /// ThreadLimit number.
5918 Stmt *ThreadLimit = nullptr;
5919
5920 /// Set the ThreadLimit number.
5921 ///
5922 /// \param E ThreadLimit number.
5923 void setThreadLimit(Expr *E) { ThreadLimit = E; }
5924
5925public:
5926 /// Build 'thread_limit' clause.
5927 ///
5928 /// \param E Expression associated with this clause.
5929 /// \param HelperE Helper Expression associated with this clause.
5930 /// \param CaptureRegion Innermost OpenMP region where expressions in this
5931 /// clause must be captured.
5932 /// \param StartLoc Starting location of the clause.
5933 /// \param LParenLoc Location of '('.
5934 /// \param EndLoc Ending location of the clause.
5935 OMPThreadLimitClause(Expr *E, Stmt *HelperE,
5936 OpenMPDirectiveKind CaptureRegion,
5937 SourceLocation StartLoc, SourceLocation LParenLoc,
5938 SourceLocation EndLoc)
5939 : OMPClause(llvm::omp::OMPC_thread_limit, StartLoc, EndLoc),
5940 OMPClauseWithPreInit(this), LParenLoc(LParenLoc), ThreadLimit(E) {
5941 setPreInitStmt(HelperE, CaptureRegion);
5942 }
5943
5944 /// Build an empty clause.
5945 OMPThreadLimitClause()
5946 : OMPClause(llvm::omp::OMPC_thread_limit, SourceLocation(),
5947 SourceLocation()),
5948 OMPClauseWithPreInit(this) {}
5949
5950 /// Sets the location of '('.
5951 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
5952
5953 /// Returns the location of '('.
5954 SourceLocation getLParenLoc() const { return LParenLoc; }
5955
5956 /// Return ThreadLimit number.
5957 Expr *getThreadLimit() { return cast<Expr>(ThreadLimit); }
5958
5959 /// Return ThreadLimit number.
5960 Expr *getThreadLimit() const { return cast<Expr>(ThreadLimit); }
5961
5962 child_range children() { return child_range(&ThreadLimit, &ThreadLimit + 1); }
5963
5964 const_child_range children() const {
5965 return const_child_range(&ThreadLimit, &ThreadLimit + 1);
5966 }
5967
5968 child_range used_children() {
5969 return child_range(child_iterator(), child_iterator());
5970 }
5971 const_child_range used_children() const {
5972 return const_child_range(const_child_iterator(), const_child_iterator());
5973 }
5974
5975 static bool classof(const OMPClause *T) {
5976 return T->getClauseKind() == llvm::omp::OMPC_thread_limit;
5977 }
5978};
5979
5980/// This represents 'priority' clause in the '#pragma omp ...'
5981/// directive.
5982///
5983/// \code
5984/// #pragma omp task priority(n)
5985/// \endcode
5986/// In this example directive '#pragma omp teams' has clause 'priority' with
5987/// single expression 'n'.
5988class OMPPriorityClause : public OMPClause, public OMPClauseWithPreInit {
5989 friend class OMPClauseReader;
5990
5991 /// Location of '('.
5992 SourceLocation LParenLoc;
5993
5994 /// Priority number.
5995 Stmt *Priority = nullptr;
5996
5997 /// Set the Priority number.
5998 ///
5999 /// \param E Priority number.
6000 void setPriority(Expr *E) { Priority = E; }
6001
6002public:
6003 /// Build 'priority' clause.
6004 ///
6005 /// \param Priority Expression associated with this clause.
6006 /// \param HelperPriority Helper priority for the construct.
6007 /// \param CaptureRegion Innermost OpenMP region where expressions in this
6008 /// clause must be captured.
6009 /// \param StartLoc Starting location of the clause.
6010 /// \param LParenLoc Location of '('.
6011 /// \param EndLoc Ending location of the clause.
6012 OMPPriorityClause(Expr *Priority, Stmt *HelperPriority,
6013 OpenMPDirectiveKind CaptureRegion, SourceLocation StartLoc,
6014 SourceLocation LParenLoc, SourceLocation EndLoc)
6015 : OMPClause(llvm::omp::OMPC_priority, StartLoc, EndLoc),
6016 OMPClauseWithPreInit(this), LParenLoc(LParenLoc), Priority(Priority) {
6017 setPreInitStmt(HelperPriority, CaptureRegion);
6018 }
6019
6020 /// Build an empty clause.
6021 OMPPriorityClause()
6022 : OMPClause(llvm::omp::OMPC_priority, SourceLocation(), SourceLocation()),
6023 OMPClauseWithPreInit(this) {}
6024
6025 /// Sets the location of '('.
6026 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
6027
6028 /// Returns the location of '('.
6029 SourceLocation getLParenLoc() const { return LParenLoc; }
6030
6031 /// Return Priority number.
6032 Expr *getPriority() { return cast<Expr>(Priority); }
6033
6034 /// Return Priority number.
6035 Expr *getPriority() const { return cast<Expr>(Priority); }
6036
6037 child_range children() { return child_range(&Priority, &Priority + 1); }
6038
6039 const_child_range children() const {
6040 return const_child_range(&Priority, &Priority + 1);
6041 }
6042
6043 child_range used_children();
6044 const_child_range used_children() const {
6045 auto Children = const_cast<OMPPriorityClause *>(this)->used_children();
6046 return const_child_range(Children.begin(), Children.end());
6047 }
6048
6049 static bool classof(const OMPClause *T) {
6050 return T->getClauseKind() == llvm::omp::OMPC_priority;
6051 }
6052};
6053
6054/// This represents 'grainsize' clause in the '#pragma omp ...'
6055/// directive.
6056///
6057/// \code
6058/// #pragma omp taskloop grainsize(4)
6059/// \endcode
6060/// In this example directive '#pragma omp taskloop' has clause 'grainsize'
6061/// with single expression '4'.
6062class OMPGrainsizeClause : public OMPClause, public OMPClauseWithPreInit {
6063 friend class OMPClauseReader;
6064
6065 /// Location of '('.
6066 SourceLocation LParenLoc;
6067
6068 /// Safe iteration space distance.
6069 Stmt *Grainsize = nullptr;
6070
6071 /// Set safelen.
6072 void setGrainsize(Expr *Size) { Grainsize = Size; }
6073
6074public:
6075 /// Build 'grainsize' clause.
6076 ///
6077 /// \param Size Expression associated with this clause.
6078 /// \param HelperSize Helper grainsize for the construct.
6079 /// \param CaptureRegion Innermost OpenMP region where expressions in this
6080 /// clause must be captured.
6081 /// \param StartLoc Starting location of the clause.
6082 /// \param EndLoc Ending location of the clause.
6083 OMPGrainsizeClause(Expr *Size, Stmt *HelperSize,
6084 OpenMPDirectiveKind CaptureRegion, SourceLocation StartLoc,
6085 SourceLocation LParenLoc, SourceLocation EndLoc)
6086 : OMPClause(llvm::omp::OMPC_grainsize, StartLoc, EndLoc),
6087 OMPClauseWithPreInit(this), LParenLoc(LParenLoc), Grainsize(Size) {
6088 setPreInitStmt(HelperSize, CaptureRegion);
6089 }
6090
6091 /// Build an empty clause.
6092 explicit OMPGrainsizeClause()
6093 : OMPClause(llvm::omp::OMPC_grainsize, SourceLocation(),
6094 SourceLocation()),
6095 OMPClauseWithPreInit(this) {}
6096
6097 /// Sets the location of '('.
6098 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
6099
6100 /// Returns the location of '('.
6101 SourceLocation getLParenLoc() const { return LParenLoc; }
6102
6103 /// Return safe iteration space distance.
6104 Expr *getGrainsize() const { return cast_or_null<Expr>(Grainsize); }
6105
6106 child_range children() { return child_range(&Grainsize, &Grainsize + 1); }
6107
6108 const_child_range children() const {
6109 return const_child_range(&Grainsize, &Grainsize + 1);
6110 }
6111
6112 child_range used_children();
6113 const_child_range used_children() const {
6114 auto Children = const_cast<OMPGrainsizeClause *>(this)->used_children();
6115 return const_child_range(Children.begin(), Children.end());
6116 }
6117
6118 static bool classof(const OMPClause *T) {
6119 return T->getClauseKind() == llvm::omp::OMPC_grainsize;
6120 }
6121};
6122
6123/// This represents 'nogroup' clause in the '#pragma omp ...' directive.
6124///
6125/// \code
6126/// #pragma omp taskloop nogroup
6127/// \endcode
6128/// In this example directive '#pragma omp taskloop' has 'nogroup' clause.
6129class OMPNogroupClause : public OMPClause {
6130public:
6131 /// Build 'nogroup' clause.
6132 ///
6133 /// \param StartLoc Starting location of the clause.
6134 /// \param EndLoc Ending location of the clause.
6135 OMPNogroupClause(SourceLocation StartLoc, SourceLocation EndLoc)
6136 : OMPClause(llvm::omp::OMPC_nogroup, StartLoc, EndLoc) {}
6137
6138 /// Build an empty clause.
6139 OMPNogroupClause()
6140 : OMPClause(llvm::omp::OMPC_nogroup, SourceLocation(), SourceLocation()) {
6141 }
6142
6143 child_range children() {
6144 return child_range(child_iterator(), child_iterator());
6145 }
6146
6147 const_child_range children() const {
6148 return const_child_range(const_child_iterator(), const_child_iterator());
6149 }
6150
6151 child_range used_children() {
6152 return child_range(child_iterator(), child_iterator());
6153 }
6154 const_child_range used_children() const {
6155 return const_child_range(const_child_iterator(), const_child_iterator());
6156 }
6157
6158 static bool classof(const OMPClause *T) {
6159 return T->getClauseKind() == llvm::omp::OMPC_nogroup;
6160 }
6161};
6162
6163/// This represents 'num_tasks' clause in the '#pragma omp ...'
6164/// directive.
6165///
6166/// \code
6167/// #pragma omp taskloop num_tasks(4)
6168/// \endcode
6169/// In this example directive '#pragma omp taskloop' has clause 'num_tasks'
6170/// with single expression '4'.
6171class OMPNumTasksClause : public OMPClause, public OMPClauseWithPreInit {
6172 friend class OMPClauseReader;
6173
6174 /// Location of '('.
6175 SourceLocation LParenLoc;
6176
6177 /// Safe iteration space distance.
6178 Stmt *NumTasks = nullptr;
6179
6180 /// Set safelen.
6181 void setNumTasks(Expr *Size) { NumTasks = Size; }
6182
6183public:
6184 /// Build 'num_tasks' clause.
6185 ///
6186 /// \param Size Expression associated with this clause.
6187 /// \param HelperSize Helper grainsize for the construct.
6188 /// \param CaptureRegion Innermost OpenMP region where expressions in this
6189 /// clause must be captured.
6190 /// \param StartLoc Starting location of the clause.
6191 /// \param EndLoc Ending location of the clause.
6192 OMPNumTasksClause(Expr *Size, Stmt *HelperSize,
6193 OpenMPDirectiveKind CaptureRegion, SourceLocation StartLoc,
6194 SourceLocation LParenLoc, SourceLocation EndLoc)
6195 : OMPClause(llvm::omp::OMPC_num_tasks, StartLoc, EndLoc),
6196 OMPClauseWithPreInit(this), LParenLoc(LParenLoc), NumTasks(Size) {
6197 setPreInitStmt(HelperSize, CaptureRegion);
6198 }
6199
6200 /// Build an empty clause.
6201 explicit OMPNumTasksClause()
6202 : OMPClause(llvm::omp::OMPC_num_tasks, SourceLocation(),
6203 SourceLocation()),
6204 OMPClauseWithPreInit(this) {}
6205
6206 /// Sets the location of '('.
6207 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
6208
6209 /// Returns the location of '('.
6210 SourceLocation getLParenLoc() const { return LParenLoc; }
6211
6212 /// Return safe iteration space distance.
6213 Expr *getNumTasks() const { return cast_or_null<Expr>(NumTasks); }
6214
6215 child_range children() { return child_range(&NumTasks, &NumTasks + 1); }
6216
6217 const_child_range children() const {
6218 return const_child_range(&NumTasks, &NumTasks + 1);
6219 }
6220
6221 child_range used_children();
6222 const_child_range used_children() const {
6223 auto Children = const_cast<OMPNumTasksClause *>(this)->used_children();
6224 return const_child_range(Children.begin(), Children.end());
6225 }
6226
6227 static bool classof(const OMPClause *T) {
6228 return T->getClauseKind() == llvm::omp::OMPC_num_tasks;
6229 }
6230};
6231
6232/// This represents 'hint' clause in the '#pragma omp ...' directive.
6233///
6234/// \code
6235/// #pragma omp critical (name) hint(6)
6236/// \endcode
6237/// In this example directive '#pragma omp critical' has name 'name' and clause
6238/// 'hint' with argument '6'.
6239class OMPHintClause : public OMPClause {
6240 friend class OMPClauseReader;
6241
6242 /// Location of '('.
6243 SourceLocation LParenLoc;
6244
6245 /// Hint expression of the 'hint' clause.
6246 Stmt *Hint = nullptr;
6247
6248 /// Set hint expression.
6249 void setHint(Expr *H) { Hint = H; }
6250
6251public:
6252 /// Build 'hint' clause with expression \a Hint.
6253 ///
6254 /// \param Hint Hint expression.
6255 /// \param StartLoc Starting location of the clause.
6256 /// \param LParenLoc Location of '('.
6257 /// \param EndLoc Ending location of the clause.
6258 OMPHintClause(Expr *Hint, SourceLocation StartLoc, SourceLocation LParenLoc,
6259 SourceLocation EndLoc)
6260 : OMPClause(llvm::omp::OMPC_hint, StartLoc, EndLoc), LParenLoc(LParenLoc),
6261 Hint(Hint) {}
6262
6263 /// Build an empty clause.
6264 OMPHintClause()
6265 : OMPClause(llvm::omp::OMPC_hint, SourceLocation(), SourceLocation()) {}
6266
6267 /// Sets the location of '('.
6268 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
6269
6270 /// Returns the location of '('.
6271 SourceLocation getLParenLoc() const { return LParenLoc; }
6272
6273 /// Returns number of threads.
6274 Expr *getHint() const { return cast_or_null<Expr>(Hint); }
6275
6276 child_range children() { return child_range(&Hint, &Hint + 1); }
6277
6278 const_child_range children() const {
6279 return const_child_range(&Hint, &Hint + 1);
6280 }
6281
6282 child_range used_children() {
6283 return child_range(child_iterator(), child_iterator());
6284 }
6285 const_child_range used_children() const {
6286 return const_child_range(const_child_iterator(), const_child_iterator());
6287 }
6288
6289 static bool classof(const OMPClause *T) {
6290 return T->getClauseKind() == llvm::omp::OMPC_hint;
6291 }
6292};
6293
6294/// This represents 'dist_schedule' clause in the '#pragma omp ...'
6295/// directive.
6296///
6297/// \code
6298/// #pragma omp distribute dist_schedule(static, 3)
6299/// \endcode
6300/// In this example directive '#pragma omp distribute' has 'dist_schedule'
6301/// clause with arguments 'static' and '3'.
6302class OMPDistScheduleClause : public OMPClause, public OMPClauseWithPreInit {
6303 friend class OMPClauseReader;
6304
6305 /// Location of '('.
6306 SourceLocation LParenLoc;
6307
6308 /// A kind of the 'schedule' clause.
6309 OpenMPDistScheduleClauseKind Kind = OMPC_DIST_SCHEDULE_unknown;
6310
6311 /// Start location of the schedule kind in source code.
6312 SourceLocation KindLoc;
6313
6314 /// Location of ',' (if any).
6315 SourceLocation CommaLoc;
6316
6317 /// Chunk size.
6318 Expr *ChunkSize = nullptr;
6319
6320 /// Set schedule kind.
6321 ///
6322 /// \param K Schedule kind.
6323 void setDistScheduleKind(OpenMPDistScheduleClauseKind K) { Kind = K; }
6324
6325 /// Sets the location of '('.
6326 ///
6327 /// \param Loc Location of '('.
6328 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
6329
6330 /// Set schedule kind start location.
6331 ///
6332 /// \param KLoc Schedule kind location.
6333 void setDistScheduleKindLoc(SourceLocation KLoc) { KindLoc = KLoc; }
6334
6335 /// Set location of ','.
6336 ///
6337 /// \param Loc Location of ','.
6338 void setCommaLoc(SourceLocation Loc) { CommaLoc = Loc; }
6339
6340 /// Set chunk size.
6341 ///
6342 /// \param E Chunk size.
6343 void setChunkSize(Expr *E) { ChunkSize = E; }
6344
6345public:
6346 /// Build 'dist_schedule' clause with schedule kind \a Kind and chunk
6347 /// size expression \a ChunkSize.
6348 ///
6349 /// \param StartLoc Starting location of the clause.
6350 /// \param LParenLoc Location of '('.
6351 /// \param KLoc Starting location of the argument.
6352 /// \param CommaLoc Location of ','.
6353 /// \param EndLoc Ending location of the clause.
6354 /// \param Kind DistSchedule kind.
6355 /// \param ChunkSize Chunk size.
6356 /// \param HelperChunkSize Helper chunk size for combined directives.
6357 OMPDistScheduleClause(SourceLocation StartLoc, SourceLocation LParenLoc,
6358 SourceLocation KLoc, SourceLocation CommaLoc,
6359 SourceLocation EndLoc,
6360 OpenMPDistScheduleClauseKind Kind, Expr *ChunkSize,
6361 Stmt *HelperChunkSize)
6362 : OMPClause(llvm::omp::OMPC_dist_schedule, StartLoc, EndLoc),
6363 OMPClauseWithPreInit(this), LParenLoc(LParenLoc), Kind(Kind),
6364 KindLoc(KLoc), CommaLoc(CommaLoc), ChunkSize(ChunkSize) {
6365 setPreInitStmt(HelperChunkSize);
6366 }
6367
6368 /// Build an empty clause.
6369 explicit OMPDistScheduleClause()
6370 : OMPClause(llvm::omp::OMPC_dist_schedule, SourceLocation(),
6371 SourceLocation()),
6372 OMPClauseWithPreInit(this) {}
6373
6374 /// Get kind of the clause.
6375 OpenMPDistScheduleClauseKind getDistScheduleKind() const { return Kind; }
6376
6377 /// Get location of '('.
6378 SourceLocation getLParenLoc() { return LParenLoc; }
6379
6380 /// Get kind location.
6381 SourceLocation getDistScheduleKindLoc() { return KindLoc; }
6382
6383 /// Get location of ','.
6384 SourceLocation getCommaLoc() { return CommaLoc; }
6385
6386 /// Get chunk size.
6387 Expr *getChunkSize() { return ChunkSize; }
6388
6389 /// Get chunk size.
6390 const Expr *getChunkSize() const { return ChunkSize; }
6391
6392 child_range children() {
6393 return child_range(reinterpret_cast<Stmt **>(&ChunkSize),
6394 reinterpret_cast<Stmt **>(&ChunkSize) + 1);
6395 }
6396
6397 const_child_range children() const {
6398 auto Children = const_cast<OMPDistScheduleClause *>(this)->children();
6399 return const_child_range(Children.begin(), Children.end());
6400 }
6401
6402 child_range used_children() {
6403 return child_range(child_iterator(), child_iterator());
6404 }
6405 const_child_range used_children() const {
6406 return const_child_range(const_child_iterator(), const_child_iterator());
6407 }
6408
6409 static bool classof(const OMPClause *T) {
6410 return T->getClauseKind() == llvm::omp::OMPC_dist_schedule;
6411 }
6412};
6413
6414/// This represents 'defaultmap' clause in the '#pragma omp ...' directive.
6415///
6416/// \code
6417/// #pragma omp target defaultmap(tofrom: scalar)
6418/// \endcode
6419/// In this example directive '#pragma omp target' has 'defaultmap' clause of kind
6420/// 'scalar' with modifier 'tofrom'.
6421class OMPDefaultmapClause : public OMPClause {
6422 friend class OMPClauseReader;
6423
6424 /// Location of '('.
6425 SourceLocation LParenLoc;
6426
6427 /// Modifiers for 'defaultmap' clause.
6428 OpenMPDefaultmapClauseModifier Modifier = OMPC_DEFAULTMAP_MODIFIER_unknown;
6429
6430 /// Locations of modifiers.
6431 SourceLocation ModifierLoc;
6432
6433 /// A kind of the 'defaultmap' clause.
6434 OpenMPDefaultmapClauseKind Kind = OMPC_DEFAULTMAP_unknown;
6435
6436 /// Start location of the defaultmap kind in source code.
6437 SourceLocation KindLoc;
6438
6439 /// Set defaultmap kind.
6440 ///
6441 /// \param K Defaultmap kind.
6442 void setDefaultmapKind(OpenMPDefaultmapClauseKind K) { Kind = K; }
6443
6444 /// Set the defaultmap modifier.
6445 ///
6446 /// \param M Defaultmap modifier.
6447 void setDefaultmapModifier(OpenMPDefaultmapClauseModifier M) {
6448 Modifier = M;
6449 }
6450
6451 /// Set location of the defaultmap modifier.
6452 void setDefaultmapModifierLoc(SourceLocation Loc) {
6453 ModifierLoc = Loc;
6454 }
6455
6456 /// Sets the location of '('.
6457 ///
6458 /// \param Loc Location of '('.
6459 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
6460
6461 /// Set defaultmap kind start location.
6462 ///
6463 /// \param KLoc Defaultmap kind location.
6464 void setDefaultmapKindLoc(SourceLocation KLoc) { KindLoc = KLoc; }
6465
6466public:
6467 /// Build 'defaultmap' clause with defaultmap kind \a Kind
6468 ///
6469 /// \param StartLoc Starting location of the clause.
6470 /// \param LParenLoc Location of '('.
6471 /// \param KLoc Starting location of the argument.
6472 /// \param EndLoc Ending location of the clause.
6473 /// \param Kind Defaultmap kind.
6474 /// \param M The modifier applied to 'defaultmap' clause.
6475 /// \param MLoc Location of the modifier
6476 OMPDefaultmapClause(SourceLocation StartLoc, SourceLocation LParenLoc,
6477 SourceLocation MLoc, SourceLocation KLoc,
6478 SourceLocation EndLoc, OpenMPDefaultmapClauseKind Kind,
6479 OpenMPDefaultmapClauseModifier M)
6480 : OMPClause(llvm::omp::OMPC_defaultmap, StartLoc, EndLoc),
6481 LParenLoc(LParenLoc), Modifier(M), ModifierLoc(MLoc), Kind(Kind),
6482 KindLoc(KLoc) {}
6483
6484 /// Build an empty clause.
6485 explicit OMPDefaultmapClause()
6486 : OMPClause(llvm::omp::OMPC_defaultmap, SourceLocation(),
6487 SourceLocation()) {}
6488
6489 /// Get kind of the clause.
6490 OpenMPDefaultmapClauseKind getDefaultmapKind() const { return Kind; }
6491
6492 /// Get the modifier of the clause.
6493 OpenMPDefaultmapClauseModifier getDefaultmapModifier() const {
6494 return Modifier;
6495 }
6496
6497 /// Get location of '('.
6498 SourceLocation getLParenLoc() { return LParenLoc; }
6499
6500 /// Get kind location.
6501 SourceLocation getDefaultmapKindLoc() { return KindLoc; }
6502
6503 /// Get the modifier location.
6504 SourceLocation getDefaultmapModifierLoc() const {
6505 return ModifierLoc;
6506 }
6507
6508 child_range children() {
6509 return child_range(child_iterator(), child_iterator());
6510 }
6511
6512 const_child_range children() const {
6513 return const_child_range(const_child_iterator(), const_child_iterator());
6514 }
6515
6516 child_range used_children() {
6517 return child_range(child_iterator(), child_iterator());
6518 }
6519 const_child_range used_children() const {
6520 return const_child_range(const_child_iterator(), const_child_iterator());
6521 }
6522
6523 static bool classof(const OMPClause *T) {
6524 return T->getClauseKind() == llvm::omp::OMPC_defaultmap;
6525 }
6526};
6527
6528/// This represents clause 'to' in the '#pragma omp ...'
6529/// directives.
6530///
6531/// \code
6532/// #pragma omp target update to(a,b)
6533/// \endcode
6534/// In this example directive '#pragma omp target update' has clause 'to'
6535/// with the variables 'a' and 'b'.
6536class OMPToClause final : public OMPMappableExprListClause<OMPToClause>,
6537 private llvm::TrailingObjects<
6538 OMPToClause, Expr *, ValueDecl *, unsigned,
6539 OMPClauseMappableExprCommon::MappableComponent> {
6540 friend class OMPClauseReader;
6541 friend OMPMappableExprListClause;
6542 friend OMPVarListClause;
6543 friend TrailingObjects;
6544
6545 /// Motion-modifiers for the 'to' clause.
6546 OpenMPMotionModifierKind MotionModifiers[NumberOfOMPMotionModifiers] = {
6547 OMPC_MOTION_MODIFIER_unknown, OMPC_MOTION_MODIFIER_unknown};
6548
6549 /// Location of motion-modifiers for the 'to' clause.
6550 SourceLocation MotionModifiersLoc[NumberOfOMPMotionModifiers];
6551
6552 /// Colon location.
6553 SourceLocation ColonLoc;
6554
6555 /// Build clause with number of variables \a NumVars.
6556 ///
6557 /// \param TheMotionModifiers Motion-modifiers.
6558 /// \param TheMotionModifiersLoc Locations of motion-modifiers.
6559 /// \param MapperQualifierLoc C++ nested name specifier for the associated
6560 /// user-defined mapper.
6561 /// \param MapperIdInfo The identifier of associated user-defined mapper.
6562 /// \param Locs Locations needed to build a mappable clause. It includes 1)
6563 /// StartLoc: starting location of the clause (the clause keyword); 2)
6564 /// LParenLoc: location of '('; 3) EndLoc: ending location of the clause.
6565 /// \param Sizes All required sizes to build a mappable clause. It includes 1)
6566 /// NumVars: number of expressions listed in this clause; 2)
6567 /// NumUniqueDeclarations: number of unique base declarations in this clause;
6568 /// 3) NumComponentLists: number of component lists in this clause; and 4)
6569 /// NumComponents: total number of expression components in the clause.
6570 explicit OMPToClause(ArrayRef<OpenMPMotionModifierKind> TheMotionModifiers,
6571 ArrayRef<SourceLocation> TheMotionModifiersLoc,
6572 NestedNameSpecifierLoc MapperQualifierLoc,
6573 DeclarationNameInfo MapperIdInfo,
6574 const OMPVarListLocTy &Locs,
6575 const OMPMappableExprListSizeTy &Sizes)
6576 : OMPMappableExprListClause(llvm::omp::OMPC_to, Locs, Sizes,
6577 /*SupportsMapper=*/true, &MapperQualifierLoc,
6578 &MapperIdInfo) {
6579 assert(llvm::array_lengthof(MotionModifiers) == TheMotionModifiers.size() &&((void)0)
6580 "Unexpected number of motion modifiers.")((void)0);
6581 llvm::copy(TheMotionModifiers, std::begin(MotionModifiers));
6582
6583 assert(llvm::array_lengthof(MotionModifiersLoc) ==((void)0)
6584 TheMotionModifiersLoc.size() &&((void)0)
6585 "Unexpected number of motion modifier locations.")((void)0);
6586 llvm::copy(TheMotionModifiersLoc, std::begin(MotionModifiersLoc));
6587 }
6588
6589 /// Build an empty clause.
6590 ///
6591 /// \param Sizes All required sizes to build a mappable clause. It includes 1)
6592 /// NumVars: number of expressions listed in this clause; 2)
6593 /// NumUniqueDeclarations: number of unique base declarations in this clause;
6594 /// 3) NumComponentLists: number of component lists in this clause; and 4)
6595 /// NumComponents: total number of expression components in the clause.
6596 explicit OMPToClause(const OMPMappableExprListSizeTy &Sizes)
6597 : OMPMappableExprListClause(llvm::omp::OMPC_to, OMPVarListLocTy(), Sizes,
6598 /*SupportsMapper=*/true) {}
6599
6600 /// Set motion-modifier for the clause.
6601 ///
6602 /// \param I index for motion-modifier.
6603 /// \param T motion-modifier for the clause.
6604 void setMotionModifier(unsigned I, OpenMPMotionModifierKind T) {
6605 assert(I < NumberOfOMPMotionModifiers &&((void)0)
6606 "Unexpected index to store motion modifier, exceeds array size.")((void)0);
6607 MotionModifiers[I] = T;
6608 }
6609
6610 /// Set location for the motion-modifier.
6611 ///
6612 /// \param I index for motion-modifier location.
6613 /// \param TLoc motion-modifier location.
6614 void setMotionModifierLoc(unsigned I, SourceLocation TLoc) {
6615 assert(I < NumberOfOMPMotionModifiers &&((void)0)
6616 "Index to store motion modifier location exceeds array size.")((void)0);
6617 MotionModifiersLoc[I] = TLoc;
6618 }
6619
6620 /// Set colon location.
6621 void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
6622
6623 /// Define the sizes of each trailing object array except the last one. This
6624 /// is required for TrailingObjects to work properly.
6625 size_t numTrailingObjects(OverloadToken<Expr *>) const {
6626 // There are varlist_size() of expressions, and varlist_size() of
6627 // user-defined mappers.
6628 return 2 * varlist_size();
6629 }
6630 size_t numTrailingObjects(OverloadToken<ValueDecl *>) const {
6631 return getUniqueDeclarationsNum();
6632 }
6633 size_t numTrailingObjects(OverloadToken<unsigned>) const {
6634 return getUniqueDeclarationsNum() + getTotalComponentListNum();
6635 }
6636
6637public:
6638 /// Creates clause with a list of variables \a Vars.
6639 ///
6640 /// \param C AST context.
6641 /// \param Locs Locations needed to build a mappable clause. It includes 1)
6642 /// StartLoc: starting location of the clause (the clause keyword); 2)
6643 /// LParenLoc: location of '('; 3) EndLoc: ending location of the clause.
6644 /// \param Vars The original expression used in the clause.
6645 /// \param Declarations Declarations used in the clause.
6646 /// \param ComponentLists Component lists used in the clause.
6647 /// \param MotionModifiers Motion-modifiers.
6648 /// \param MotionModifiersLoc Location of motion-modifiers.
6649 /// \param UDMapperRefs References to user-defined mappers associated with
6650 /// expressions used in the clause.
6651 /// \param UDMQualifierLoc C++ nested name specifier for the associated
6652 /// user-defined mapper.
6653 /// \param MapperId The identifier of associated user-defined mapper.
6654 static OMPToClause *Create(const ASTContext &C, const OMPVarListLocTy &Locs,
6655 ArrayRef<Expr *> Vars,
6656 ArrayRef<ValueDecl *> Declarations,
6657 MappableExprComponentListsRef ComponentLists,
6658 ArrayRef<Expr *> UDMapperRefs,
6659 ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
6660 ArrayRef<SourceLocation> MotionModifiersLoc,
6661 NestedNameSpecifierLoc UDMQualifierLoc,
6662 DeclarationNameInfo MapperId);
6663
6664 /// Creates an empty clause with the place for \a NumVars variables.
6665 ///
6666 /// \param C AST context.
6667 /// \param Sizes All required sizes to build a mappable clause. It includes 1)
6668 /// NumVars: number of expressions listed in this clause; 2)
6669 /// NumUniqueDeclarations: number of unique base declarations in this clause;
6670 /// 3) NumComponentLists: number of component lists in this clause; and 4)
6671 /// NumComponents: total number of expression components in the clause.
6672 static OMPToClause *CreateEmpty(const ASTContext &C,
6673 const OMPMappableExprListSizeTy &Sizes);
6674
6675 /// Fetches the motion-modifier at 'Cnt' index of array of modifiers.
6676 ///
6677 /// \param Cnt index for motion-modifier.
6678 OpenMPMotionModifierKind getMotionModifier(unsigned Cnt) const LLVM_READONLY__attribute__((__pure__)) {
6679 assert(Cnt < NumberOfOMPMotionModifiers &&((void)0)
6680 "Requested modifier exceeds the total number of modifiers.")((void)0);
6681 return MotionModifiers[Cnt];
6682 }
6683
6684 /// Fetches the motion-modifier location at 'Cnt' index of array of modifiers'
6685 /// locations.
6686 ///
6687 /// \param Cnt index for motion-modifier location.
6688 SourceLocation getMotionModifierLoc(unsigned Cnt) const LLVM_READONLY__attribute__((__pure__)) {
6689 assert(Cnt < NumberOfOMPMotionModifiers &&((void)0)
6690 "Requested modifier location exceeds total number of modifiers.")((void)0);
6691 return MotionModifiersLoc[Cnt];
6692 }
6693
6694 /// Fetches ArrayRef of motion-modifiers.
6695 ArrayRef<OpenMPMotionModifierKind> getMotionModifiers() const LLVM_READONLY__attribute__((__pure__)) {
6696 return llvm::makeArrayRef(MotionModifiers);
6697 }
6698
6699 /// Fetches ArrayRef of location of motion-modifiers.
6700 ArrayRef<SourceLocation> getMotionModifiersLoc() const LLVM_READONLY__attribute__((__pure__)) {
6701 return llvm::makeArrayRef(MotionModifiersLoc);
6702 }
6703
6704 /// Get colon location.
6705 SourceLocation getColonLoc() const { return ColonLoc; }
6706
6707 child_range children() {
6708 return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
6709 reinterpret_cast<Stmt **>(varlist_end()));
6710 }
6711
6712 const_child_range children() const {
6713 auto Children = const_cast<OMPToClause *>(this)->children();
6714 return const_child_range(Children.begin(), Children.end());
6715 }
6716
6717 child_range used_children() {
6718 return child_range(child_iterator(), child_iterator());
6719 }
6720 const_child_range used_children() const {
6721 return const_child_range(const_child_iterator(), const_child_iterator());
6722 }
6723
6724 static bool classof(const OMPClause *T) {
6725 return T->getClauseKind() == llvm::omp::OMPC_to;
6726 }
6727};
6728
6729/// This represents clause 'from' in the '#pragma omp ...'
6730/// directives.
6731///
6732/// \code
6733/// #pragma omp target update from(a,b)
6734/// \endcode
6735/// In this example directive '#pragma omp target update' has clause 'from'
6736/// with the variables 'a' and 'b'.
6737class OMPFromClause final
6738 : public OMPMappableExprListClause<OMPFromClause>,
6739 private llvm::TrailingObjects<
6740 OMPFromClause, Expr *, ValueDecl *, unsigned,
6741 OMPClauseMappableExprCommon::MappableComponent> {
6742 friend class OMPClauseReader;
6743 friend OMPMappableExprListClause;
6744 friend OMPVarListClause;
6745 friend TrailingObjects;
6746
6747 /// Motion-modifiers for the 'from' clause.
6748 OpenMPMotionModifierKind MotionModifiers[NumberOfOMPMotionModifiers] = {
6749 OMPC_MOTION_MODIFIER_unknown, OMPC_MOTION_MODIFIER_unknown};
6750
6751 /// Location of motion-modifiers for the 'from' clause.
6752 SourceLocation MotionModifiersLoc[NumberOfOMPMotionModifiers];
6753
6754 /// Colon location.
6755 SourceLocation ColonLoc;
6756
6757 /// Build clause with number of variables \a NumVars.
6758 ///
6759 /// \param TheMotionModifiers Motion-modifiers.
6760 /// \param TheMotionModifiersLoc Locations of motion-modifiers.
6761 /// \param MapperQualifierLoc C++ nested name specifier for the associated
6762 /// user-defined mapper.
6763 /// \param MapperIdInfo The identifier of associated user-defined mapper.
6764 /// \param Locs Locations needed to build a mappable clause. It includes 1)
6765 /// StartLoc: starting location of the clause (the clause keyword); 2)
6766 /// LParenLoc: location of '('; 3) EndLoc: ending location of the clause.
6767 /// \param Sizes All required sizes to build a mappable clause. It includes 1)
6768 /// NumVars: number of expressions listed in this clause; 2)
6769 /// NumUniqueDeclarations: number of unique base declarations in this clause;
6770 /// 3) NumComponentLists: number of component lists in this clause; and 4)
6771 /// NumComponents: total number of expression components in the clause.
6772 explicit OMPFromClause(ArrayRef<OpenMPMotionModifierKind> TheMotionModifiers,
6773 ArrayRef<SourceLocation> TheMotionModifiersLoc,
6774 NestedNameSpecifierLoc MapperQualifierLoc,
6775 DeclarationNameInfo MapperIdInfo,
6776 const OMPVarListLocTy &Locs,
6777 const OMPMappableExprListSizeTy &Sizes)
6778 : OMPMappableExprListClause(llvm::omp::OMPC_from, Locs, Sizes,
6779 /*SupportsMapper=*/true, &MapperQualifierLoc,
6780 &MapperIdInfo) {
6781 assert(llvm::array_lengthof(MotionModifiers) == TheMotionModifiers.size() &&((void)0)
6782 "Unexpected number of motion modifiers.")((void)0);
6783 llvm::copy(TheMotionModifiers, std::begin(MotionModifiers));
6784
6785 assert(llvm::array_lengthof(MotionModifiersLoc) ==((void)0)
6786 TheMotionModifiersLoc.size() &&((void)0)
6787 "Unexpected number of motion modifier locations.")((void)0);
6788 llvm::copy(TheMotionModifiersLoc, std::begin(MotionModifiersLoc));
6789 }
6790
6791 /// Build an empty clause.
6792 ///
6793 /// \param Sizes All required sizes to build a mappable clause. It includes 1)
6794 /// NumVars: number of expressions listed in this clause; 2)
6795 /// NumUniqueDeclarations: number of unique base declarations in this clause;
6796 /// 3) NumComponentLists: number of component lists in this clause; and 4)
6797 /// NumComponents: total number of expression components in the clause.
6798 explicit OMPFromClause(const OMPMappableExprListSizeTy &Sizes)
6799 : OMPMappableExprListClause(llvm::omp::OMPC_from, OMPVarListLocTy(),
6800 Sizes, /*SupportsMapper=*/true) {}
6801
6802 /// Set motion-modifier for the clause.
6803 ///
6804 /// \param I index for motion-modifier.
6805 /// \param T motion-modifier for the clause.
6806 void setMotionModifier(unsigned I, OpenMPMotionModifierKind T) {
6807 assert(I < NumberOfOMPMotionModifiers &&((void)0)
6808 "Unexpected index to store motion modifier, exceeds array size.")((void)0);
6809 MotionModifiers[I] = T;
6810 }
6811
6812 /// Set location for the motion-modifier.
6813 ///
6814 /// \param I index for motion-modifier location.
6815 /// \param TLoc motion-modifier location.
6816 void setMotionModifierLoc(unsigned I, SourceLocation TLoc) {
6817 assert(I < NumberOfOMPMotionModifiers &&((void)0)
6818 "Index to store motion modifier location exceeds array size.")((void)0);
6819 MotionModifiersLoc[I] = TLoc;
6820 }
6821
6822 /// Set colon location.
6823 void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
6824
6825 /// Define the sizes of each trailing object array except the last one. This
6826 /// is required for TrailingObjects to work properly.
6827 size_t numTrailingObjects(OverloadToken<Expr *>) const {
6828 // There are varlist_size() of expressions, and varlist_size() of
6829 // user-defined mappers.
6830 return 2 * varlist_size();
6831 }
6832 size_t numTrailingObjects(OverloadToken<ValueDecl *>) const {
6833 return getUniqueDeclarationsNum();
6834 }
6835 size_t numTrailingObjects(OverloadToken<unsigned>) const {
6836 return getUniqueDeclarationsNum() + getTotalComponentListNum();
6837 }
6838
6839public:
6840 /// Creates clause with a list of variables \a Vars.
6841 ///
6842 /// \param C AST context.
6843 /// \param Locs Locations needed to build a mappable clause. It includes 1)
6844 /// StartLoc: starting location of the clause (the clause keyword); 2)
6845 /// LParenLoc: location of '('; 3) EndLoc: ending location of the clause.
6846 /// \param Vars The original expression used in the clause.
6847 /// \param Declarations Declarations used in the clause.
6848 /// \param ComponentLists Component lists used in the clause.
6849 /// \param MotionModifiers Motion-modifiers.
6850 /// \param MotionModifiersLoc Location of motion-modifiers.
6851 /// \param UDMapperRefs References to user-defined mappers associated with
6852 /// expressions used in the clause.
6853 /// \param UDMQualifierLoc C++ nested name specifier for the associated
6854 /// user-defined mapper.
6855 /// \param MapperId The identifier of associated user-defined mapper.
6856 static OMPFromClause *
6857 Create(const ASTContext &C, const OMPVarListLocTy &Locs,
6858 ArrayRef<Expr *> Vars, ArrayRef<ValueDecl *> Declarations,
6859 MappableExprComponentListsRef ComponentLists,
6860 ArrayRef<Expr *> UDMapperRefs,
6861 ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
6862 ArrayRef<SourceLocation> MotionModifiersLoc,
6863 NestedNameSpecifierLoc UDMQualifierLoc, DeclarationNameInfo MapperId);
6864
6865 /// Creates an empty clause with the place for \a NumVars variables.
6866 ///
6867 /// \param C AST context.
6868 /// \param Sizes All required sizes to build a mappable clause. It includes 1)
6869 /// NumVars: number of expressions listed in this clause; 2)
6870 /// NumUniqueDeclarations: number of unique base declarations in this clause;
6871 /// 3) NumComponentLists: number of component lists in this clause; and 4)
6872 /// NumComponents: total number of expression components in the clause.
6873 static OMPFromClause *CreateEmpty(const ASTContext &C,
6874 const OMPMappableExprListSizeTy &Sizes);
6875
6876 /// Fetches the motion-modifier at 'Cnt' index of array of modifiers.
6877 ///
6878 /// \param Cnt index for motion-modifier.
6879 OpenMPMotionModifierKind getMotionModifier(unsigned Cnt) const LLVM_READONLY__attribute__((__pure__)) {
6880 assert(Cnt < NumberOfOMPMotionModifiers &&((void)0)
6881 "Requested modifier exceeds the total number of modifiers.")((void)0);
6882 return MotionModifiers[Cnt];
6883 }
6884
6885 /// Fetches the motion-modifier location at 'Cnt' index of array of modifiers'
6886 /// locations.
6887 ///
6888 /// \param Cnt index for motion-modifier location.
6889 SourceLocation getMotionModifierLoc(unsigned Cnt) const LLVM_READONLY__attribute__((__pure__)) {
6890 assert(Cnt < NumberOfOMPMotionModifiers &&((void)0)
6891 "Requested modifier location exceeds total number of modifiers.")((void)0);
6892 return MotionModifiersLoc[Cnt];
6893 }
6894
6895 /// Fetches ArrayRef of motion-modifiers.
6896 ArrayRef<OpenMPMotionModifierKind> getMotionModifiers() const LLVM_READONLY__attribute__((__pure__)) {
6897 return llvm::makeArrayRef(MotionModifiers);
6898 }
6899
6900 /// Fetches ArrayRef of location of motion-modifiers.
6901 ArrayRef<SourceLocation> getMotionModifiersLoc() const LLVM_READONLY__attribute__((__pure__)) {
6902 return llvm::makeArrayRef(MotionModifiersLoc);
6903 }
6904
6905 /// Get colon location.
6906 SourceLocation getColonLoc() const { return ColonLoc; }
6907
6908 child_range children() {
6909 return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
6910 reinterpret_cast<Stmt **>(varlist_end()));
6911 }
6912
6913 const_child_range children() const {
6914 auto Children = const_cast<OMPFromClause *>(this)->children();
6915 return const_child_range(Children.begin(), Children.end());
6916 }
6917
6918 child_range used_children() {
6919 return child_range(child_iterator(), child_iterator());
6920 }
6921 const_child_range used_children() const {
6922 return const_child_range(const_child_iterator(), const_child_iterator());
6923 }
6924
6925 static bool classof(const OMPClause *T) {
6926 return T->getClauseKind() == llvm::omp::OMPC_from;
6927 }
6928};
6929
6930/// This represents clause 'use_device_ptr' in the '#pragma omp ...'
6931/// directives.
6932///
6933/// \code
6934/// #pragma omp target data use_device_ptr(a,b)
6935/// \endcode
6936/// In this example directive '#pragma omp target data' has clause
6937/// 'use_device_ptr' with the variables 'a' and 'b'.
6938class OMPUseDevicePtrClause final
6939 : public OMPMappableExprListClause<OMPUseDevicePtrClause>,
6940 private llvm::TrailingObjects<
6941 OMPUseDevicePtrClause, Expr *, ValueDecl *, unsigned,
6942 OMPClauseMappableExprCommon::MappableComponent> {
6943 friend class OMPClauseReader;
6944 friend OMPMappableExprListClause;
6945 friend OMPVarListClause;
6946 friend TrailingObjects;
6947
6948 /// Build clause with number of variables \a NumVars.
6949 ///
6950 /// \param Locs Locations needed to build a mappable clause. It includes 1)
6951 /// StartLoc: starting location of the clause (the clause keyword); 2)
6952 /// LParenLoc: location of '('; 3) EndLoc: ending location of the clause.
6953 /// \param Sizes All required sizes to build a mappable clause. It includes 1)
6954 /// NumVars: number of expressions listed in this clause; 2)
6955 /// NumUniqueDeclarations: number of unique base declarations in this clause;
6956 /// 3) NumComponentLists: number of component lists in this clause; and 4)
6957 /// NumComponents: total number of expression components in the clause.
6958 explicit OMPUseDevicePtrClause(const OMPVarListLocTy &Locs,
6959 const OMPMappableExprListSizeTy &Sizes)
6960 : OMPMappableExprListClause(llvm::omp::OMPC_use_device_ptr, Locs, Sizes) {
6961 }
6962
6963 /// Build an empty clause.
6964 ///
6965 /// \param Sizes All required sizes to build a mappable clause. It includes 1)
6966 /// NumVars: number of expressions listed in this clause; 2)
6967 /// NumUniqueDeclarations: number of unique base declarations in this clause;
6968 /// 3) NumComponentLists: number of component lists in this clause; and 4)
6969 /// NumComponents: total number of expression components in the clause.
6970 explicit OMPUseDevicePtrClause(const OMPMappableExprListSizeTy &Sizes)
6971 : OMPMappableExprListClause(llvm::omp::OMPC_use_device_ptr,
6972 OMPVarListLocTy(), Sizes) {}
6973
6974 /// Define the sizes of each trailing object array except the last one. This
6975 /// is required for TrailingObjects to work properly.
6976 size_t numTrailingObjects(OverloadToken<Expr *>) const {
6977 return 3 * varlist_size();
6978 }
6979 size_t numTrailingObjects(OverloadToken<ValueDecl *>) const {
6980 return getUniqueDeclarationsNum();
6981 }
6982 size_t numTrailingObjects(OverloadToken<unsigned>) const {
6983 return getUniqueDeclarationsNum() + getTotalComponentListNum();
6984 }
6985
6986 /// Sets the list of references to private copies with initializers for new
6987 /// private variables.
6988 /// \param VL List of references.
6989 void setPrivateCopies(ArrayRef<Expr *> VL);
6990
6991 /// Gets the list of references to private copies with initializers for new
6992 /// private variables.
6993 MutableArrayRef<Expr *> getPrivateCopies() {
6994 return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
6995 }
6996 ArrayRef<const Expr *> getPrivateCopies() const {
6997 return llvm::makeArrayRef(varlist_end(), varlist_size());
6998 }
6999
7000 /// Sets the list of references to initializer variables for new private
7001 /// variables.
7002 /// \param VL List of references.
7003 void setInits(ArrayRef<Expr *> VL);
7004
7005 /// Gets the list of references to initializer variables for new private
7006 /// variables.
7007 MutableArrayRef<Expr *> getInits() {
7008 return MutableArrayRef<Expr *>(getPrivateCopies().end(), varlist_size());
7009 }
7010 ArrayRef<const Expr *> getInits() const {
7011 return llvm::makeArrayRef(getPrivateCopies().end(), varlist_size());
7012 }
7013
7014public:
7015 /// Creates clause with a list of variables \a Vars.
7016 ///
7017 /// \param C AST context.
7018 /// \param Locs Locations needed to build a mappable clause. It includes 1)
7019 /// StartLoc: starting location of the clause (the clause keyword); 2)
7020 /// LParenLoc: location of '('; 3) EndLoc: ending location of the clause.
7021 /// \param Vars The original expression used in the clause.
7022 /// \param PrivateVars Expressions referring to private copies.
7023 /// \param Inits Expressions referring to private copy initializers.
7024 /// \param Declarations Declarations used in the clause.
7025 /// \param ComponentLists Component lists used in the clause.
7026 static OMPUseDevicePtrClause *
7027 Create(const ASTContext &C, const OMPVarListLocTy &Locs,
7028 ArrayRef<Expr *> Vars, ArrayRef<Expr *> PrivateVars,
7029 ArrayRef<Expr *> Inits, ArrayRef<ValueDecl *> Declarations,
7030 MappableExprComponentListsRef ComponentLists);
7031
7032 /// Creates an empty clause with the place for \a NumVars variables.
7033 ///
7034 /// \param C AST context.
7035 /// \param Sizes All required sizes to build a mappable clause. It includes 1)
7036 /// NumVars: number of expressions listed in this clause; 2)
7037 /// NumUniqueDeclarations: number of unique base declarations in this clause;
7038 /// 3) NumComponentLists: number of component lists in this clause; and 4)
7039 /// NumComponents: total number of expression components in the clause.
7040 static OMPUseDevicePtrClause *
7041 CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes);
7042
7043 using private_copies_iterator = MutableArrayRef<Expr *>::iterator;
7044 using private_copies_const_iterator = ArrayRef<const Expr *>::iterator;
7045 using private_copies_range = llvm::iterator_range<private_copies_iterator>;
7046 using private_copies_const_range =
7047 llvm::iterator_range<private_copies_const_iterator>;
7048
7049 private_copies_range private_copies() {
7050 return private_copies_range(getPrivateCopies().begin(),
7051 getPrivateCopies().end());
7052 }
7053
7054 private_copies_const_range private_copies() const {
7055 return private_copies_const_range(getPrivateCopies().begin(),
7056 getPrivateCopies().end());
7057 }
7058
7059 using inits_iterator = MutableArrayRef<Expr *>::iterator;
7060 using inits_const_iterator = ArrayRef<const Expr *>::iterator;
7061 using inits_range = llvm::iterator_range<inits_iterator>;
7062 using inits_const_range = llvm::iterator_range<inits_const_iterator>;
7063
7064 inits_range inits() {
7065 return inits_range(getInits().begin(), getInits().end());
7066 }
7067
7068 inits_const_range inits() const {
7069 return inits_const_range(getInits().begin(), getInits().end());
7070 }
7071
7072 child_range children() {
7073 return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
7074 reinterpret_cast<Stmt **>(varlist_end()));
7075 }
7076
7077 const_child_range children() const {
7078 auto Children = const_cast<OMPUseDevicePtrClause *>(this)->children();
7079 return const_child_range(Children.begin(), Children.end());
7080 }
7081
7082 child_range used_children() {
7083 return child_range(child_iterator(), child_iterator());
7084 }
7085 const_child_range used_children() const {
7086 return const_child_range(const_child_iterator(), const_child_iterator());
7087 }
7088
7089 static bool classof(const OMPClause *T) {
7090 return T->getClauseKind() == llvm::omp::OMPC_use_device_ptr;
7091 }
7092};
7093
7094/// This represents clause 'use_device_addr' in the '#pragma omp ...'
7095/// directives.
7096///
7097/// \code
7098/// #pragma omp target data use_device_addr(a,b)
7099/// \endcode
7100/// In this example directive '#pragma omp target data' has clause
7101/// 'use_device_addr' with the variables 'a' and 'b'.
7102class OMPUseDeviceAddrClause final
7103 : public OMPMappableExprListClause<OMPUseDeviceAddrClause>,
7104 private llvm::TrailingObjects<
7105 OMPUseDeviceAddrClause, Expr *, ValueDecl *, unsigned,
7106 OMPClauseMappableExprCommon::MappableComponent> {
7107 friend class OMPClauseReader;
7108 friend OMPMappableExprListClause;
7109 friend OMPVarListClause;
7110 friend TrailingObjects;
7111
7112 /// Build clause with number of variables \a NumVars.
7113 ///
7114 /// \param Locs Locations needed to build a mappable clause. It includes 1)
7115 /// StartLoc: starting location of the clause (the clause keyword); 2)
7116 /// LParenLoc: location of '('; 3) EndLoc: ending location of the clause.
7117 /// \param Sizes All required sizes to build a mappable clause. It includes 1)
7118 /// NumVars: number of expressions listed in this clause; 2)
7119 /// NumUniqueDeclarations: number of unique base declarations in this clause;
7120 /// 3) NumComponentLists: number of component lists in this clause; and 4)
7121 /// NumComponents: total number of expression components in the clause.
7122 explicit OMPUseDeviceAddrClause(const OMPVarListLocTy &Locs,
7123 const OMPMappableExprListSizeTy &Sizes)
7124 : OMPMappableExprListClause(llvm::omp::OMPC_use_device_addr, Locs,
7125 Sizes) {}
7126
7127 /// Build an empty clause.
7128 ///
7129 /// \param Sizes All required sizes to build a mappable clause. It includes 1)
7130 /// NumVars: number of expressions listed in this clause; 2)
7131 /// NumUniqueDeclarations: number of unique base declarations in this clause;
7132 /// 3) NumComponentLists: number of component lists in this clause; and 4)
7133 /// NumComponents: total number of expression components in the clause.
7134 explicit OMPUseDeviceAddrClause(const OMPMappableExprListSizeTy &Sizes)
7135 : OMPMappableExprListClause(llvm::omp::OMPC_use_device_addr,
7136 OMPVarListLocTy(), Sizes) {}
7137
7138 /// Define the sizes of each trailing object array except the last one. This
7139 /// is required for TrailingObjects to work properly.
7140 size_t numTrailingObjects(OverloadToken<Expr *>) const {
7141 return varlist_size();
7142 }
7143 size_t numTrailingObjects(OverloadToken<ValueDecl *>) const {
7144 return getUniqueDeclarationsNum();
7145 }
7146 size_t numTrailingObjects(OverloadToken<unsigned>) const {
7147 return getUniqueDeclarationsNum() + getTotalComponentListNum();
7148 }
7149
7150public:
7151 /// Creates clause with a list of variables \a Vars.
7152 ///
7153 /// \param C AST context.
7154 /// \param Locs Locations needed to build a mappable clause. It includes 1)
7155 /// StartLoc: starting location of the clause (the clause keyword); 2)
7156 /// LParenLoc: location of '('; 3) EndLoc: ending location of the clause.
7157 /// \param Vars The original expression used in the clause.
7158 /// \param Declarations Declarations used in the clause.
7159 /// \param ComponentLists Component lists used in the clause.
7160 static OMPUseDeviceAddrClause *
7161 Create(const ASTContext &C, const OMPVarListLocTy &Locs,
7162 ArrayRef<Expr *> Vars, ArrayRef<ValueDecl *> Declarations,
7163 MappableExprComponentListsRef ComponentLists);
7164
7165 /// Creates an empty clause with the place for \a NumVars variables.
7166 ///
7167 /// \param C AST context.
7168 /// \param Sizes All required sizes to build a mappable clause. It includes 1)
7169 /// NumVars: number of expressions listed in this clause; 2)
7170 /// NumUniqueDeclarations: number of unique base declarations in this clause;
7171 /// 3) NumComponentLists: number of component lists in this clause; and 4)
7172 /// NumComponents: total number of expression components in the clause.
7173 static OMPUseDeviceAddrClause *
7174 CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes);
7175
7176 child_range children() {
7177 return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
7178 reinterpret_cast<Stmt **>(varlist_end()));
7179 }
7180
7181 const_child_range children() const {
7182 auto Children = const_cast<OMPUseDeviceAddrClause *>(this)->children();
7183 return const_child_range(Children.begin(), Children.end());
7184 }
7185
7186 child_range used_children() {
7187 return child_range(child_iterator(), child_iterator());
7188 }
7189 const_child_range used_children() const {
7190 return const_child_range(const_child_iterator(), const_child_iterator());
7191 }
7192
7193 static bool classof(const OMPClause *T) {
7194 return T->getClauseKind() == llvm::omp::OMPC_use_device_addr;
7195 }
7196};
7197
7198/// This represents clause 'is_device_ptr' in the '#pragma omp ...'
7199/// directives.
7200///
7201/// \code
7202/// #pragma omp target is_device_ptr(a,b)
7203/// \endcode
7204/// In this example directive '#pragma omp target' has clause
7205/// 'is_device_ptr' with the variables 'a' and 'b'.
7206class OMPIsDevicePtrClause final
7207 : public OMPMappableExprListClause<OMPIsDevicePtrClause>,
7208 private llvm::TrailingObjects<
7209 OMPIsDevicePtrClause, Expr *, ValueDecl *, unsigned,
7210 OMPClauseMappableExprCommon::MappableComponent> {
7211 friend class OMPClauseReader;
7212 friend OMPMappableExprListClause;
7213 friend OMPVarListClause;
7214 friend TrailingObjects;
7215
7216 /// Build clause with number of variables \a NumVars.
7217 ///
7218 /// \param Locs Locations needed to build a mappable clause. It includes 1)
7219 /// StartLoc: starting location of the clause (the clause keyword); 2)
7220 /// LParenLoc: location of '('; 3) EndLoc: ending location of the clause.
7221 /// \param Sizes All required sizes to build a mappable clause. It includes 1)
7222 /// NumVars: number of expressions listed in this clause; 2)
7223 /// NumUniqueDeclarations: number of unique base declarations in this clause;
7224 /// 3) NumComponentLists: number of component lists in this clause; and 4)
7225 /// NumComponents: total number of expression components in the clause.
7226 explicit OMPIsDevicePtrClause(const OMPVarListLocTy &Locs,
7227 const OMPMappableExprListSizeTy &Sizes)
7228 : OMPMappableExprListClause(llvm::omp::OMPC_is_device_ptr, Locs, Sizes) {}
7229
7230 /// Build an empty clause.
7231 ///
7232 /// \param Sizes All required sizes to build a mappable clause. It includes 1)
7233 /// NumVars: number of expressions listed in this clause; 2)
7234 /// NumUniqueDeclarations: number of unique base declarations in this clause;
7235 /// 3) NumComponentLists: number of component lists in this clause; and 4)
7236 /// NumComponents: total number of expression components in the clause.
7237 explicit OMPIsDevicePtrClause(const OMPMappableExprListSizeTy &Sizes)
7238 : OMPMappableExprListClause(llvm::omp::OMPC_is_device_ptr,
7239 OMPVarListLocTy(), Sizes) {}
7240
7241 /// Define the sizes of each trailing object array except the last one. This
7242 /// is required for TrailingObjects to work properly.
7243 size_t numTrailingObjects(OverloadToken<Expr *>) const {
7244 return varlist_size();
7245 }
7246 size_t numTrailingObjects(OverloadToken<ValueDecl *>) const {
7247 return getUniqueDeclarationsNum();
7248 }
7249 size_t numTrailingObjects(OverloadToken<unsigned>) const {
7250 return getUniqueDeclarationsNum() + getTotalComponentListNum();
7251 }
7252
7253public:
7254 /// Creates clause with a list of variables \a Vars.
7255 ///
7256 /// \param C AST context.
7257 /// \param Locs Locations needed to build a mappable clause. It includes 1)
7258 /// StartLoc: starting location of the clause (the clause keyword); 2)
7259 /// LParenLoc: location of '('; 3) EndLoc: ending location of the clause.
7260 /// \param Vars The original expression used in the clause.
7261 /// \param Declarations Declarations used in the clause.
7262 /// \param ComponentLists Component lists used in the clause.
7263 static OMPIsDevicePtrClause *
7264 Create(const ASTContext &C, const OMPVarListLocTy &Locs,
7265 ArrayRef<Expr *> Vars, ArrayRef<ValueDecl *> Declarations,
7266 MappableExprComponentListsRef ComponentLists);
7267
7268 /// Creates an empty clause with the place for \a NumVars variables.
7269 ///
7270 /// \param C AST context.
7271 /// \param Sizes All required sizes to build a mappable clause. It includes 1)
7272 /// NumVars: number of expressions listed in this clause; 2)
7273 /// NumUniqueDeclarations: number of unique base declarations in this clause;
7274 /// 3) NumComponentLists: number of component lists in this clause; and 4)
7275 /// NumComponents: total number of expression components in the clause.
7276 static OMPIsDevicePtrClause *
7277 CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes);
7278
7279 child_range children() {
7280 return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
7281 reinterpret_cast<Stmt **>(varlist_end()));
7282 }
7283
7284 const_child_range children() const {
7285 auto Children = const_cast<OMPIsDevicePtrClause *>(this)->children();
7286 return const_child_range(Children.begin(), Children.end());
7287 }
7288
7289 child_range used_children() {
7290 return child_range(child_iterator(), child_iterator());
7291 }
7292 const_child_range used_children() const {
7293 return const_child_range(const_child_iterator(), const_child_iterator());
7294 }
7295
7296 static bool classof(const OMPClause *T) {
7297 return T->getClauseKind() == llvm::omp::OMPC_is_device_ptr;
7298 }
7299};
7300
7301/// This represents clause 'nontemporal' in the '#pragma omp ...' directives.
7302///
7303/// \code
7304/// #pragma omp simd nontemporal(a)
7305/// \endcode
7306/// In this example directive '#pragma omp simd' has clause 'nontemporal' for
7307/// the variable 'a'.
7308class OMPNontemporalClause final
7309 : public OMPVarListClause<OMPNontemporalClause>,
7310 private llvm::TrailingObjects<OMPNontemporalClause, Expr *> {
7311 friend class OMPClauseReader;
7312 friend OMPVarListClause;
7313 friend TrailingObjects;
7314
7315 /// Build clause with number of variables \a N.
7316 ///
7317 /// \param StartLoc Starting location of the clause.
7318 /// \param LParenLoc Location of '('.
7319 /// \param EndLoc Ending location of the clause.
7320 /// \param N Number of the variables in the clause.
7321 OMPNontemporalClause(SourceLocation StartLoc, SourceLocation LParenLoc,
7322 SourceLocation EndLoc, unsigned N)
7323 : OMPVarListClause<OMPNontemporalClause>(llvm::omp::OMPC_nontemporal,
7324 StartLoc, LParenLoc, EndLoc, N) {
7325 }
7326
7327 /// Build an empty clause.
7328 ///
7329 /// \param N Number of variables.
7330 explicit OMPNontemporalClause(unsigned N)
7331 : OMPVarListClause<OMPNontemporalClause>(
7332 llvm::omp::OMPC_nontemporal, SourceLocation(), SourceLocation(),
7333 SourceLocation(), N) {}
7334
7335 /// Get the list of privatied copies if the member expression was captured by
7336 /// one of the privatization clauses.
7337 MutableArrayRef<Expr *> getPrivateRefs() {
7338 return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
7339 }
7340 ArrayRef<const Expr *> getPrivateRefs() const {
7341 return llvm::makeArrayRef(varlist_end(), varlist_size());
7342 }
7343
7344public:
7345 /// Creates clause with a list of variables \a VL.
7346 ///
7347 /// \param C AST context.
7348 /// \param StartLoc Starting location of the clause.
7349 /// \param LParenLoc Location of '('.
7350 /// \param EndLoc Ending location of the clause.
7351 /// \param VL List of references to the variables.
7352 static OMPNontemporalClause *
7353 Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
7354 SourceLocation EndLoc, ArrayRef<Expr *> VL);
7355
7356 /// Creates an empty clause with the place for \a N variables.
7357 ///
7358 /// \param C AST context.
7359 /// \param N The number of variables.
7360 static OMPNontemporalClause *CreateEmpty(const ASTContext &C, unsigned N);
7361
7362 /// Sets the list of references to private copies created in private clauses.
7363 /// \param VL List of references.
7364 void setPrivateRefs(ArrayRef<Expr *> VL);
7365
7366 child_range children() {
7367 return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
7368 reinterpret_cast<Stmt **>(varlist_end()));
7369 }
7370
7371 const_child_range children() const {
7372 auto Children = const_cast<OMPNontemporalClause *>(this)->children();
7373 return const_child_range(Children.begin(), Children.end());
7374 }
7375
7376 child_range private_refs() {
7377 return child_range(reinterpret_cast<Stmt **>(getPrivateRefs().begin()),
7378 reinterpret_cast<Stmt **>(getPrivateRefs().end()));
7379 }
7380
7381 const_child_range private_refs() const {
7382 auto Children = const_cast<OMPNontemporalClause *>(this)->private_refs();
7383 return const_child_range(Children.begin(), Children.end());
7384 }
7385
7386 child_range used_children() {
7387 return child_range(child_iterator(), child_iterator());
7388 }
7389 const_child_range used_children() const {
7390 return const_child_range(const_child_iterator(), const_child_iterator());
7391 }
7392
7393 static bool classof(const OMPClause *T) {
7394 return T->getClauseKind() == llvm::omp::OMPC_nontemporal;
7395 }
7396};
7397
7398/// This represents 'order' clause in the '#pragma omp ...' directive.
7399///
7400/// \code
7401/// #pragma omp simd order(concurrent)
7402/// \endcode
7403/// In this example directive '#pragma omp parallel' has simple 'order'
7404/// clause with kind 'concurrent'.
7405class OMPOrderClause final : public OMPClause {
7406 friend class OMPClauseReader;
7407
7408 /// Location of '('.
7409 SourceLocation LParenLoc;
7410
7411 /// A kind of the 'default' clause.
7412 OpenMPOrderClauseKind Kind = OMPC_ORDER_unknown;
7413
7414 /// Start location of the kind in source code.
7415 SourceLocation KindKwLoc;
7416
7417 /// Set kind of the clause.
7418 ///
7419 /// \param K Argument of clause.
7420 void setKind(OpenMPOrderClauseKind K) { Kind = K; }
7421
7422 /// Set argument location.
7423 ///
7424 /// \param KLoc Argument location.
7425 void setKindKwLoc(SourceLocation KLoc) { KindKwLoc = KLoc; }
7426
7427public:
7428 /// Build 'order' clause with argument \p A ('concurrent').
7429 ///
7430 /// \param A Argument of the clause ('concurrent').
7431 /// \param ALoc Starting location of the argument.
7432 /// \param StartLoc Starting location of the clause.
7433 /// \param LParenLoc Location of '('.
7434 /// \param EndLoc Ending location of the clause.
7435 OMPOrderClause(OpenMPOrderClauseKind A, SourceLocation ALoc,
7436 SourceLocation StartLoc, SourceLocation LParenLoc,
7437 SourceLocation EndLoc)
7438 : OMPClause(llvm::omp::OMPC_order, StartLoc, EndLoc),
7439 LParenLoc(LParenLoc), Kind(A), KindKwLoc(ALoc) {}
7440
7441 /// Build an empty clause.
7442 OMPOrderClause()
7443 : OMPClause(llvm::omp::OMPC_order, SourceLocation(), SourceLocation()) {}
7444
7445 /// Sets the location of '('.
7446 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
7447
7448 /// Returns the location of '('.
7449 SourceLocation getLParenLoc() const { return LParenLoc; }
7450
7451 /// Returns kind of the clause.
7452 OpenMPOrderClauseKind getKind() const { return Kind; }
7453
7454 /// Returns location of clause kind.
7455 SourceLocation getKindKwLoc() const { return KindKwLoc; }
7456
7457 child_range children() {
7458 return child_range(child_iterator(), child_iterator());
7459 }
7460
7461 const_child_range children() const {
7462 return const_child_range(const_child_iterator(), const_child_iterator());
7463 }
7464
7465 child_range used_children() {
7466 return child_range(child_iterator(), child_iterator());
7467 }
7468 const_child_range used_children() const {
7469 return const_child_range(const_child_iterator(), const_child_iterator());
7470 }
7471
7472 static bool classof(const OMPClause *T) {
7473 return T->getClauseKind() == llvm::omp::OMPC_order;
7474 }
7475};
7476
7477/// This represents the 'init' clause in '#pragma omp ...' directives.
7478///
7479/// \code
7480/// #pragma omp interop init(target:obj)
7481/// \endcode
7482class OMPInitClause final
7483 : public OMPVarListClause<OMPInitClause>,
7484 private llvm::TrailingObjects<OMPInitClause, Expr *> {
7485 friend class OMPClauseReader;
7486 friend OMPVarListClause;
7487 friend TrailingObjects;
7488
7489 /// Location of interop variable.
7490 SourceLocation VarLoc;
7491
7492 bool IsTarget = false;
7493 bool IsTargetSync = false;
7494
7495 void setInteropVar(Expr *E) { varlist_begin()[0] = E; }
7496
7497 void setIsTarget(bool V) { IsTarget = V; }
7498
7499 void setIsTargetSync(bool V) { IsTargetSync = V; }
7500
7501 /// Sets the location of the interop variable.
7502 void setVarLoc(SourceLocation Loc) { VarLoc = Loc; }
7503
7504 /// Build 'init' clause.
7505 ///
7506 /// \param IsTarget Uses the 'target' interop-type.
7507 /// \param IsTargetSync Uses the 'targetsync' interop-type.
7508 /// \param StartLoc Starting location of the clause.
7509 /// \param LParenLoc Location of '('.
7510 /// \param VarLoc Location of the interop variable.
7511 /// \param EndLoc Ending location of the clause.
7512 /// \param N Number of expressions.
7513 OMPInitClause(bool IsTarget, bool IsTargetSync, SourceLocation StartLoc,
7514 SourceLocation LParenLoc, SourceLocation VarLoc,
7515 SourceLocation EndLoc, unsigned N)
7516 : OMPVarListClause<OMPInitClause>(llvm::omp::OMPC_init, StartLoc,
7517 LParenLoc, EndLoc, N),
7518 VarLoc(VarLoc), IsTarget(IsTarget), IsTargetSync(IsTargetSync) {}
7519
7520 /// Build an empty clause.
7521 OMPInitClause(unsigned N)
7522 : OMPVarListClause<OMPInitClause>(llvm::omp::OMPC_init, SourceLocation(),
7523 SourceLocation(), SourceLocation(), N) {
7524 }
7525
7526public:
7527 /// Creates a fully specified clause.
7528 ///
7529 /// \param C AST context.
7530 /// \param InteropVar The interop variable.
7531 /// \param PrefExprs The list of preference expressions.
7532 /// \param IsTarget Uses the 'target' interop-type.
7533 /// \param IsTargetSync Uses the 'targetsync' interop-type.
7534 /// \param StartLoc Starting location of the clause.
7535 /// \param LParenLoc Location of '('.
7536 /// \param VarLoc Location of the interop variable.
7537 /// \param EndLoc Ending location of the clause.
7538 static OMPInitClause *Create(const ASTContext &C, Expr *InteropVar,
7539 ArrayRef<Expr *> PrefExprs, bool IsTarget,
7540 bool IsTargetSync, SourceLocation StartLoc,
7541 SourceLocation LParenLoc, SourceLocation VarLoc,
7542 SourceLocation EndLoc);
7543
7544 /// Creates an empty clause with \a N expressions.
7545 ///
7546 /// \param C AST context.
7547 /// \param N Number of expression items.
7548 static OMPInitClause *CreateEmpty(const ASTContext &C, unsigned N);
7549
7550 /// Returns the location of the interop variable.
7551 SourceLocation getVarLoc() const { return VarLoc; }
7552
7553 /// Returns the interop variable.
7554 Expr *getInteropVar() { return varlist_begin()[0]; }
7555 const Expr *getInteropVar() const { return varlist_begin()[0]; }
7556
7557 /// Returns true is interop-type 'target' is used.
7558 bool getIsTarget() const { return IsTarget; }
7559
7560 /// Returns true is interop-type 'targetsync' is used.
7561 bool getIsTargetSync() const { return IsTargetSync; }
7562
7563 child_range children() {
7564 return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
7565 reinterpret_cast<Stmt **>(varlist_end()));
7566 }
7567
7568 const_child_range children() const {
7569 auto Children = const_cast<OMPInitClause *>(this)->children();
7570 return const_child_range(Children.begin(), Children.end());
7571 }
7572
7573 child_range used_children() {
7574 return child_range(child_iterator(), child_iterator());
7575 }
7576 const_child_range used_children() const {
7577 return const_child_range(const_child_iterator(), const_child_iterator());
7578 }
7579
7580 using prefs_iterator = MutableArrayRef<Expr *>::iterator;
7581 using const_prefs_iterator = ArrayRef<const Expr *>::iterator;
7582 using prefs_range = llvm::iterator_range<prefs_iterator>;
7583 using const_prefs_range = llvm::iterator_range<const_prefs_iterator>;
7584
7585 prefs_range prefs() {
7586 return prefs_range(reinterpret_cast<Expr **>(std::next(varlist_begin())),
7587 reinterpret_cast<Expr **>(varlist_end()));
7588 }
7589
7590 const_prefs_range prefs() const {
7591 auto Prefs = const_cast<OMPInitClause *>(this)->prefs();
7592 return const_prefs_range(Prefs.begin(), Prefs.end());
7593 }
7594
7595 static bool classof(const OMPClause *T) {
7596 return T->getClauseKind() == llvm::omp::OMPC_init;
7597 }
7598};
7599
7600/// This represents the 'use' clause in '#pragma omp ...' directives.
7601///
7602/// \code
7603/// #pragma omp interop use(obj)
7604/// \endcode
7605class OMPUseClause final : public OMPClause {
7606 friend class OMPClauseReader;
7607
7608 /// Location of '('.
7609 SourceLocation LParenLoc;
7610
7611 /// Location of interop variable.
7612 SourceLocation VarLoc;
7613
7614 /// The interop variable.
7615 Stmt *InteropVar = nullptr;
7616
7617 /// Set the interop variable.
7618 void setInteropVar(Expr *E) { InteropVar = E; }
7619
7620 /// Sets the location of '('.
7621 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
7622
7623 /// Sets the location of the interop variable.
7624 void setVarLoc(SourceLocation Loc) { VarLoc = Loc; }
7625
7626public:
7627 /// Build 'use' clause with and interop variable expression \a InteropVar.
7628 ///
7629 /// \param InteropVar The interop variable.
7630 /// \param StartLoc Starting location of the clause.
7631 /// \param LParenLoc Location of '('.
7632 /// \param VarLoc Location of the interop variable.
7633 /// \param EndLoc Ending location of the clause.
7634 OMPUseClause(Expr *InteropVar, SourceLocation StartLoc,
7635 SourceLocation LParenLoc, SourceLocation VarLoc,
7636 SourceLocation EndLoc)
7637 : OMPClause(llvm::omp::OMPC_use, StartLoc, EndLoc), LParenLoc(LParenLoc),
7638 VarLoc(VarLoc), InteropVar(InteropVar) {}
7639
7640 /// Build an empty clause.
7641 OMPUseClause()
7642 : OMPClause(llvm::omp::OMPC_use, SourceLocation(), SourceLocation()) {}
7643
7644 /// Returns the location of '('.
7645 SourceLocation getLParenLoc() const { return LParenLoc; }
7646
7647 /// Returns the location of the interop variable.
7648 SourceLocation getVarLoc() const { return VarLoc; }
7649
7650 /// Returns the interop variable.
7651 Expr *getInteropVar() const { return cast<Expr>(InteropVar); }
7652
7653 child_range children() { return child_range(&InteropVar, &InteropVar + 1); }
7654
7655 const_child_range children() const {
7656 return const_child_range(&InteropVar, &InteropVar + 1);
7657 }
7658
7659 child_range used_children() {
7660 return child_range(child_iterator(), child_iterator());
7661 }
7662 const_child_range used_children() const {
7663 return const_child_range(const_child_iterator(), const_child_iterator());
7664 }
7665
7666 static bool classof(const OMPClause *T) {
7667 return T->getClauseKind() == llvm::omp::OMPC_use;
7668 }
7669};
7670
7671/// This represents 'destroy' clause in the '#pragma omp depobj'
7672/// directive or the '#pragma omp interop' directive..
7673///
7674/// \code
7675/// #pragma omp depobj(a) destroy
7676/// #pragma omp interop destroy(obj)
7677/// \endcode
7678/// In these examples directive '#pragma omp depobj' and '#pragma omp interop'
7679/// have a 'destroy' clause. The 'interop' directive includes an object.
7680class OMPDestroyClause final : public OMPClause {
7681 friend class OMPClauseReader;
7682
7683 /// Location of '('.
7684 SourceLocation LParenLoc;
7685
7686 /// Location of interop variable.
7687 SourceLocation VarLoc;
7688
7689 /// The interop variable.
7690 Stmt *InteropVar = nullptr;
7691
7692 /// Set the interop variable.
7693 void setInteropVar(Expr *E) { InteropVar = E; }
7694
7695 /// Sets the location of '('.
7696 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
7697
7698 /// Sets the location of the interop variable.
7699 void setVarLoc(SourceLocation Loc) { VarLoc = Loc; }
7700
7701public:
7702 /// Build 'destroy' clause with an interop variable expression \a InteropVar.
7703 ///
7704 /// \param InteropVar The interop variable.
7705 /// \param StartLoc Starting location of the clause.
7706 /// \param LParenLoc Location of '('.
7707 /// \param VarLoc Location of the interop variable.
7708 /// \param EndLoc Ending location of the clause.
7709 OMPDestroyClause(Expr *InteropVar, SourceLocation StartLoc,
7710 SourceLocation LParenLoc, SourceLocation VarLoc,
7711 SourceLocation EndLoc)
7712 : OMPClause(llvm::omp::OMPC_destroy, StartLoc, EndLoc),
7713 LParenLoc(LParenLoc), VarLoc(VarLoc), InteropVar(InteropVar) {}
7714
7715 /// Build 'destroy' clause.
7716 ///
7717 /// \param StartLoc Starting location of the clause.
7718 /// \param EndLoc Ending location of the clause.
7719 OMPDestroyClause(SourceLocation StartLoc, SourceLocation EndLoc)
7720 : OMPClause(llvm::omp::OMPC_destroy, StartLoc, EndLoc) {}
7721
7722 /// Build an empty clause.
7723 OMPDestroyClause()
7724 : OMPClause(llvm::omp::OMPC_destroy, SourceLocation(), SourceLocation()) {
7725 }
7726
7727 /// Returns the location of '('.
7728 SourceLocation getLParenLoc() const { return LParenLoc; }
7729
7730 /// Returns the location of the interop variable.
7731 SourceLocation getVarLoc() const { return VarLoc; }
7732
7733 /// Returns the interop variable.
7734 Expr *getInteropVar() const { return cast_or_null<Expr>(InteropVar); }
7735
7736 child_range children() {
7737 if (InteropVar)
7738 return child_range(&InteropVar, &InteropVar + 1);
7739 return child_range(child_iterator(), child_iterator());
7740 }
7741
7742 const_child_range children() const {
7743 if (InteropVar)
7744 return const_child_range(&InteropVar, &InteropVar + 1);
7745 return const_child_range(const_child_iterator(), const_child_iterator());
7746 }
7747
7748 child_range used_children() {
7749 return child_range(child_iterator(), child_iterator());
7750 }
7751 const_child_range used_children() const {
7752 return const_child_range(const_child_iterator(), const_child_iterator());
7753 }
7754
7755 static bool classof(const OMPClause *T) {
7756 return T->getClauseKind() == llvm::omp::OMPC_destroy;
7757 }
7758};
7759
7760/// This represents 'novariants' clause in the '#pragma omp ...' directive.
7761///
7762/// \code
7763/// #pragma omp dispatch novariants(a > 5)
7764/// \endcode
7765/// In this example directive '#pragma omp dispatch' has simple 'novariants'
7766/// clause with condition 'a > 5'.
7767class OMPNovariantsClause final : public OMPClause,
7768 public OMPClauseWithPreInit {
7769 friend class OMPClauseReader;
7770
7771 /// Location of '('.
7772 SourceLocation LParenLoc;
7773
7774 /// Condition of the 'if' clause.
7775 Stmt *Condition = nullptr;
7776
7777 /// Set condition.
7778 void setCondition(Expr *Cond) { Condition = Cond; }
7779
7780 /// Sets the location of '('.
7781 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
7782
7783public:
7784 /// Build 'novariants' clause with condition \a Cond.
7785 ///
7786 /// \param Cond Condition of the clause.
7787 /// \param HelperCond Helper condition for the construct.
7788 /// \param CaptureRegion Innermost OpenMP region where expressions in this
7789 /// clause must be captured.
7790 /// \param StartLoc Starting location of the clause.
7791 /// \param LParenLoc Location of '('.
7792 /// \param EndLoc Ending location of the clause.
7793 OMPNovariantsClause(Expr *Cond, Stmt *HelperCond,
7794 OpenMPDirectiveKind CaptureRegion,
7795 SourceLocation StartLoc, SourceLocation LParenLoc,
7796 SourceLocation EndLoc)
7797 : OMPClause(llvm::omp::OMPC_novariants, StartLoc, EndLoc),
7798 OMPClauseWithPreInit(this), LParenLoc(LParenLoc), Condition(Cond) {
7799 setPreInitStmt(HelperCond, CaptureRegion);
7800 }
7801
7802 /// Build an empty clause.
7803 OMPNovariantsClause()
7804 : OMPClause(llvm::omp::OMPC_novariants, SourceLocation(),
7805 SourceLocation()),
7806 OMPClauseWithPreInit(this) {}
7807
7808 /// Returns the location of '('.
7809 SourceLocation getLParenLoc() const { return LParenLoc; }
7810
7811 /// Returns condition.
7812 Expr *getCondition() const { return cast_or_null<Expr>(Condition); }
7813
7814 child_range children() { return child_range(&Condition, &Condition + 1); }
7815
7816 const_child_range children() const {
7817 return const_child_range(&Condition, &Condition + 1);
7818 }
7819
7820 child_range used_children();
7821 const_child_range used_children() const {
7822 auto Children = const_cast<OMPNovariantsClause *>(this)->used_children();
7823 return const_child_range(Children.begin(), Children.end());
7824 }
7825
7826 static bool classof(const OMPClause *T) {
7827 return T->getClauseKind() == llvm::omp::OMPC_novariants;
7828 }
7829};
7830
7831/// This represents 'nocontext' clause in the '#pragma omp ...' directive.
7832///
7833/// \code
7834/// #pragma omp dispatch nocontext(a > 5)
7835/// \endcode
7836/// In this example directive '#pragma omp dispatch' has simple 'nocontext'
7837/// clause with condition 'a > 5'.
7838class OMPNocontextClause final : public OMPClause, public OMPClauseWithPreInit {
7839 friend class OMPClauseReader;
7840
7841 /// Location of '('.
7842 SourceLocation LParenLoc;
7843
7844 /// Condition of the 'if' clause.
7845 Stmt *Condition = nullptr;
7846
7847 /// Set condition.
7848 void setCondition(Expr *Cond) { Condition = Cond; }
7849
7850 /// Sets the location of '('.
7851 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
7852
7853public:
7854 /// Build 'nocontext' clause with condition \a Cond.
7855 ///
7856 /// \param Cond Condition of the clause.
7857 /// \param HelperCond Helper condition for the construct.
7858 /// \param CaptureRegion Innermost OpenMP region where expressions in this
7859 /// clause must be captured.
7860 /// \param StartLoc Starting location of the clause.
7861 /// \param LParenLoc Location of '('.
7862 /// \param EndLoc Ending location of the clause.
7863 OMPNocontextClause(Expr *Cond, Stmt *HelperCond,
7864 OpenMPDirectiveKind CaptureRegion, SourceLocation StartLoc,
7865 SourceLocation LParenLoc, SourceLocation EndLoc)
7866 : OMPClause(llvm::omp::OMPC_nocontext, StartLoc, EndLoc),
7867 OMPClauseWithPreInit(this), LParenLoc(LParenLoc), Condition(Cond) {
7868 setPreInitStmt(HelperCond, CaptureRegion);
7869 }
7870
7871 /// Build an empty clause.
7872 OMPNocontextClause()
7873 : OMPClause(llvm::omp::OMPC_nocontext, SourceLocation(),
7874 SourceLocation()),
7875 OMPClauseWithPreInit(this) {}
7876
7877 /// Returns the location of '('.
7878 SourceLocation getLParenLoc() const { return LParenLoc; }
7879
7880 /// Returns condition.
7881 Expr *getCondition() const { return cast_or_null<Expr>(Condition); }
7882
7883 child_range children() { return child_range(&Condition, &Condition + 1); }
7884
7885 const_child_range children() const {
7886 return const_child_range(&Condition, &Condition + 1);
7887 }
7888
7889 child_range used_children();
7890 const_child_range used_children() const {
7891 auto Children = const_cast<OMPNocontextClause *>(this)->used_children();
7892 return const_child_range(Children.begin(), Children.end());
7893 }
7894
7895 static bool classof(const OMPClause *T) {
7896 return T->getClauseKind() == llvm::omp::OMPC_nocontext;
7897 }
7898};
7899
7900/// This represents 'detach' clause in the '#pragma omp task' directive.
7901///
7902/// \code
7903/// #pragma omp task detach(evt)
7904/// \endcode
7905/// In this example directive '#pragma omp detach' has simple 'detach' clause
7906/// with the variable 'evt'.
7907class OMPDetachClause final : public OMPClause {
7908 friend class OMPClauseReader;
7909
7910 /// Location of '('.
7911 SourceLocation LParenLoc;
7912
7913 /// Expression of the 'detach' clause.
7914 Stmt *Evt = nullptr;
7915
7916 /// Set condition.
7917 void setEventHandler(Expr *E) { Evt = E; }
7918
7919 /// Sets the location of '('.
7920 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
7921
7922public:
7923 /// Build 'detach' clause with event-handler \a Evt.
7924 ///
7925 /// \param Evt Event handler expression.
7926 /// \param StartLoc Starting location of the clause.
7927 /// \param LParenLoc Location of '('.
7928 /// \param EndLoc Ending location of the clause.
7929 OMPDetachClause(Expr *Evt, SourceLocation StartLoc, SourceLocation LParenLoc,
7930 SourceLocation EndLoc)
7931 : OMPClause(llvm::omp::OMPC_detach, StartLoc, EndLoc),
7932 LParenLoc(LParenLoc), Evt(Evt) {}
7933
7934 /// Build an empty clause.
7935 OMPDetachClause()
7936 : OMPClause(llvm::omp::OMPC_detach, SourceLocation(), SourceLocation()) {}
7937
7938 /// Returns the location of '('.
7939 SourceLocation getLParenLoc() const { return LParenLoc; }
7940
7941 /// Returns event-handler expression.
7942 Expr *getEventHandler() const { return cast_or_null<Expr>(Evt); }
7943
7944 child_range children() { return child_range(&Evt, &Evt + 1); }
7945
7946 const_child_range children() const {
7947 return const_child_range(&Evt, &Evt + 1);
7948 }
7949
7950 child_range used_children() {
7951 return child_range(child_iterator(), child_iterator());
7952 }
7953 const_child_range used_children() const {
7954 return const_child_range(const_child_iterator(), const_child_iterator());
7955 }
7956
7957 static bool classof(const OMPClause *T) {
7958 return T->getClauseKind() == llvm::omp::OMPC_detach;
7959 }
7960};
7961
7962/// This represents clause 'inclusive' in the '#pragma omp scan' directive.
7963///
7964/// \code
7965/// #pragma omp scan inclusive(a,b)
7966/// \endcode
7967/// In this example directive '#pragma omp scan' has clause 'inclusive'
7968/// with the variables 'a' and 'b'.
7969class OMPInclusiveClause final
7970 : public OMPVarListClause<OMPInclusiveClause>,
7971 private llvm::TrailingObjects<OMPInclusiveClause, Expr *> {
7972 friend class OMPClauseReader;
7973 friend OMPVarListClause;
7974 friend TrailingObjects;
7975
7976 /// Build clause with number of variables \a N.
7977 ///
7978 /// \param StartLoc Starting location of the clause.
7979 /// \param LParenLoc Location of '('.
7980 /// \param EndLoc Ending location of the clause.
7981 /// \param N Number of the variables in the clause.
7982 OMPInclusiveClause(SourceLocation StartLoc, SourceLocation LParenLoc,
7983 SourceLocation EndLoc, unsigned N)
7984 : OMPVarListClause<OMPInclusiveClause>(llvm::omp::OMPC_inclusive,
7985 StartLoc, LParenLoc, EndLoc, N) {}
7986
7987 /// Build an empty clause.
7988 ///
7989 /// \param N Number of variables.
7990 explicit OMPInclusiveClause(unsigned N)
7991 : OMPVarListClause<OMPInclusiveClause>(llvm::omp::OMPC_inclusive,
7992 SourceLocation(), SourceLocation(),
7993 SourceLocation(), N) {}
7994
7995public:
7996 /// Creates clause with a list of variables \a VL.
7997 ///
7998 /// \param C AST context.
7999 /// \param StartLoc Starting location of the clause.
8000 /// \param LParenLoc Location of '('.
8001 /// \param EndLoc Ending location of the clause.
8002 /// \param VL List of references to the original variables.
8003 static OMPInclusiveClause *Create(const ASTContext &C,
8004 SourceLocation StartLoc,
8005 SourceLocation LParenLoc,
8006 SourceLocation EndLoc, ArrayRef<Expr *> VL);
8007
8008 /// Creates an empty clause with the place for \a N variables.
8009 ///
8010 /// \param C AST context.
8011 /// \param N The number of variables.
8012 static OMPInclusiveClause *CreateEmpty(const ASTContext &C, unsigned N);
8013
8014 child_range children() {
8015 return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
8016 reinterpret_cast<Stmt **>(varlist_end()));
8017 }
8018
8019 const_child_range children() const {
8020 auto Children = const_cast<OMPInclusiveClause *>(this)->children();
8021 return const_child_range(Children.begin(), Children.end());
8022 }
8023
8024 child_range used_children() {
8025 return child_range(child_iterator(), child_iterator());
8026 }
8027 const_child_range used_children() const {
8028 return const_child_range(const_child_iterator(), const_child_iterator());
8029 }
8030
8031 static bool classof(const OMPClause *T) {
8032 return T->getClauseKind() == llvm::omp::OMPC_inclusive;
8033 }
8034};
8035
8036/// This represents clause 'exclusive' in the '#pragma omp scan' directive.
8037///
8038/// \code
8039/// #pragma omp scan exclusive(a,b)
8040/// \endcode
8041/// In this example directive '#pragma omp scan' has clause 'exclusive'
8042/// with the variables 'a' and 'b'.
8043class OMPExclusiveClause final
8044 : public OMPVarListClause<OMPExclusiveClause>,
8045 private llvm::TrailingObjects<OMPExclusiveClause, Expr *> {
8046 friend class OMPClauseReader;
8047 friend OMPVarListClause;
8048 friend TrailingObjects;
8049
8050 /// Build clause with number of variables \a N.
8051 ///
8052 /// \param StartLoc Starting location of the clause.
8053 /// \param LParenLoc Location of '('.
8054 /// \param EndLoc Ending location of the clause.
8055 /// \param N Number of the variables in the clause.
8056 OMPExclusiveClause(SourceLocation StartLoc, SourceLocation LParenLoc,
8057 SourceLocation EndLoc, unsigned N)
8058 : OMPVarListClause<OMPExclusiveClause>(llvm::omp::OMPC_exclusive,
8059 StartLoc, LParenLoc, EndLoc, N) {}
8060
8061 /// Build an empty clause.
8062 ///
8063 /// \param N Number of variables.
8064 explicit OMPExclusiveClause(unsigned N)
8065 : OMPVarListClause<OMPExclusiveClause>(llvm::omp::OMPC_exclusive,
8066 SourceLocation(), SourceLocation(),
8067 SourceLocation(), N) {}
8068
8069public:
8070 /// Creates clause with a list of variables \a VL.
8071 ///
8072 /// \param C AST context.
8073 /// \param StartLoc Starting location of the clause.
8074 /// \param LParenLoc Location of '('.
8075 /// \param EndLoc Ending location of the clause.
8076 /// \param VL List of references to the original variables.
8077 static OMPExclusiveClause *Create(const ASTContext &C,
8078 SourceLocation StartLoc,
8079 SourceLocation LParenLoc,
8080 SourceLocation EndLoc, ArrayRef<Expr *> VL);
8081
8082 /// Creates an empty clause with the place for \a N variables.
8083 ///
8084 /// \param C AST context.
8085 /// \param N The number of variables.
8086 static OMPExclusiveClause *CreateEmpty(const ASTContext &C, unsigned N);
8087
8088 child_range children() {
8089 return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
8090 reinterpret_cast<Stmt **>(varlist_end()));
8091 }
8092
8093 const_child_range children() const {
8094 auto Children = const_cast<OMPExclusiveClause *>(this)->children();
8095 return const_child_range(Children.begin(), Children.end());
8096 }
8097
8098 child_range used_children() {
8099 return child_range(child_iterator(), child_iterator());
8100 }
8101 const_child_range used_children() const {
8102 return const_child_range(const_child_iterator(), const_child_iterator());
8103 }
8104
8105 static bool classof(const OMPClause *T) {
8106 return T->getClauseKind() == llvm::omp::OMPC_exclusive;
8107 }
8108};
8109
8110/// This represents clause 'uses_allocators' in the '#pragma omp target'-based
8111/// directives.
8112///
8113/// \code
8114/// #pragma omp target uses_allocators(default_allocator, my_allocator(traits))
8115/// \endcode
8116/// In this example directive '#pragma omp target' has clause 'uses_allocators'
8117/// with the allocators 'default_allocator' and user-defined 'my_allocator'.
8118class OMPUsesAllocatorsClause final
8119 : public OMPClause,
8120 private llvm::TrailingObjects<OMPUsesAllocatorsClause, Expr *,
8121 SourceLocation> {
8122public:
8123 /// Data for list of allocators.
8124 struct Data {
8125 /// Allocator.
8126 Expr *Allocator = nullptr;
8127 /// Allocator traits.
8128 Expr *AllocatorTraits = nullptr;
8129 /// Locations of '(' and ')' symbols.
8130 SourceLocation LParenLoc, RParenLoc;
8131 };
8132
8133private:
8134 friend class OMPClauseReader;
8135 friend TrailingObjects;
8136
8137 enum class ExprOffsets {
8138 Allocator,
8139 AllocatorTraits,
8140 Total,
8141 };
8142
8143 enum class ParenLocsOffsets {
8144 LParen,
8145 RParen,
8146 Total,
8147 };
8148
8149 /// Location of '('.
8150 SourceLocation LParenLoc;
8151 /// Total number of allocators in the clause.
8152 unsigned NumOfAllocators = 0;
8153
8154 /// Build clause.
8155 ///
8156 /// \param StartLoc Starting location of the clause.
8157 /// \param LParenLoc Location of '('.
8158 /// \param EndLoc Ending location of the clause.
8159 /// \param N Number of allocators asssociated with the clause.
8160 OMPUsesAllocatorsClause(SourceLocation StartLoc, SourceLocation LParenLoc,
8161 SourceLocation EndLoc, unsigned N)
8162 : OMPClause(llvm::omp::OMPC_uses_allocators, StartLoc, EndLoc),
8163 LParenLoc(LParenLoc), NumOfAllocators(N) {}
8164
8165 /// Build an empty clause.
8166 /// \param N Number of allocators asssociated with the clause.
8167 ///
8168 explicit OMPUsesAllocatorsClause(unsigned N)
8169 : OMPClause(llvm::omp::OMPC_uses_allocators, SourceLocation(),
8170 SourceLocation()),
8171 NumOfAllocators(N) {}
8172
8173 unsigned numTrailingObjects(OverloadToken<Expr *>) const {
8174 return NumOfAllocators * static_cast<int>(ExprOffsets::Total);
8175 }
8176
8177 /// Sets the location of '('.
8178 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
8179
8180 /// Sets the allocators data for the clause.
8181 void setAllocatorsData(ArrayRef<OMPUsesAllocatorsClause::Data> Data);
8182
8183public:
8184 /// Creates clause with a list of allocators \p Data.
8185 ///
8186 /// \param C AST context.
8187 /// \param StartLoc Starting location of the clause.
8188 /// \param LParenLoc Location of '('.
8189 /// \param EndLoc Ending location of the clause.
8190 /// \param Data List of allocators.
8191 static OMPUsesAllocatorsClause *
8192 Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
8193 SourceLocation EndLoc, ArrayRef<OMPUsesAllocatorsClause::Data> Data);
8194
8195 /// Creates an empty clause with the place for \p N allocators.
8196 ///
8197 /// \param C AST context.
8198 /// \param N The number of allocators.
8199 static OMPUsesAllocatorsClause *CreateEmpty(const ASTContext &C, unsigned N);
8200
8201 /// Returns the location of '('.
8202 SourceLocation getLParenLoc() const { return LParenLoc; }
8203
8204 /// Returns number of allocators associated with the clause.
8205 unsigned getNumberOfAllocators() const { return NumOfAllocators; }
8206
8207 /// Returns data for the specified allocator.
8208 OMPUsesAllocatorsClause::Data getAllocatorData(unsigned I) const;
8209
8210 // Iterators
8211 child_range children() {
8212 Stmt **Begin = reinterpret_cast<Stmt **>(getTrailingObjects<Expr *>());
8213 return child_range(Begin, Begin + NumOfAllocators *
8214 static_cast<int>(ExprOffsets::Total));
8215 }
8216 const_child_range children() const {
8217 Stmt *const *Begin =
8218 reinterpret_cast<Stmt *const *>(getTrailingObjects<Expr *>());
8219 return const_child_range(
8220 Begin, Begin + NumOfAllocators * static_cast<int>(ExprOffsets::Total));
8221 }
8222
8223 child_range used_children() {
8224 return child_range(child_iterator(), child_iterator());
8225 }
8226 const_child_range used_children() const {
8227 return const_child_range(const_child_iterator(), const_child_iterator());
8228 }
8229
8230 static bool classof(const OMPClause *T) {
8231 return T->getClauseKind() == llvm::omp::OMPC_uses_allocators;
8232 }
8233};
8234
8235/// This represents clause 'affinity' in the '#pragma omp task'-based
8236/// directives.
8237///
8238/// \code
8239/// #pragma omp task affinity(iterator(i = 0:n) : ([3][n])a, b[:n], c[i])
8240/// \endcode
8241/// In this example directive '#pragma omp task' has clause 'affinity' with the
8242/// affinity modifer 'iterator(i = 0:n)' and locator items '([3][n])a', 'b[:n]'
8243/// and 'c[i]'.
8244class OMPAffinityClause final
8245 : public OMPVarListClause<OMPAffinityClause>,
8246 private llvm::TrailingObjects<OMPAffinityClause, Expr *> {
8247 friend class OMPClauseReader;
8248 friend OMPVarListClause;
8249 friend TrailingObjects;
8250
8251 /// Location of ':' symbol.
8252 SourceLocation ColonLoc;
8253
8254 /// Build clause.
8255 ///
8256 /// \param StartLoc Starting location of the clause.
8257 /// \param LParenLoc Location of '('.
8258 /// \param ColonLoc Location of ':'.
8259 /// \param EndLoc Ending location of the clause.
8260 /// \param N Number of locators asssociated with the clause.
8261 OMPAffinityClause(SourceLocation StartLoc, SourceLocation LParenLoc,
8262 SourceLocation ColonLoc, SourceLocation EndLoc, unsigned N)
8263 : OMPVarListClause<OMPAffinityClause>(llvm::omp::OMPC_affinity, StartLoc,
8264 LParenLoc, EndLoc, N) {}
8265
8266 /// Build an empty clause.
8267 /// \param N Number of locators asssociated with the clause.
8268 ///
8269 explicit OMPAffinityClause(unsigned N)
8270 : OMPVarListClause<OMPAffinityClause>(llvm::omp::OMPC_affinity,
8271 SourceLocation(), SourceLocation(),
8272 SourceLocation(), N) {}
8273
8274 /// Sets the affinity modifier for the clause, if any.
8275 void setModifier(Expr *E) {
8276 getTrailingObjects<Expr *>()[varlist_size()] = E;
8277 }
8278
8279 /// Sets the location of ':' symbol.
8280 void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
8281
8282public:
8283 /// Creates clause with a modifier a list of locator items.
8284 ///
8285 /// \param C AST context.
8286 /// \param StartLoc Starting location of the clause.
8287 /// \param LParenLoc Location of '('.
8288 /// \param ColonLoc Location of ':'.
8289 /// \param EndLoc Ending location of the clause.
8290 /// \param Locators List of locator items.
8291 static OMPAffinityClause *Create(const ASTContext &C, SourceLocation StartLoc,
8292 SourceLocation LParenLoc,
8293 SourceLocation ColonLoc,
8294 SourceLocation EndLoc, Expr *Modifier,
8295 ArrayRef<Expr *> Locators);
8296
8297 /// Creates an empty clause with the place for \p N locator items.
8298 ///
8299 /// \param C AST context.
8300 /// \param N The number of locator items.
8301 static OMPAffinityClause *CreateEmpty(const ASTContext &C, unsigned N);
8302
8303 /// Gets affinity modifier.
8304 Expr *getModifier() { return getTrailingObjects<Expr *>()[varlist_size()]; }
8305 Expr *getModifier() const {
8306 return getTrailingObjects<Expr *>()[varlist_size()];
8307 }
8308
8309 /// Gets the location of ':' symbol.
8310 SourceLocation getColonLoc() const { return ColonLoc; }
8311
8312 // Iterators
8313 child_range children() {
8314 int Offset = getModifier() ? 1 : 0;
8315 return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
8316 reinterpret_cast<Stmt **>(varlist_end() + Offset));
8317 }
8318
8319 const_child_range children() const {
8320 auto Children = const_cast<OMPAffinityClause *>(this)->children();
8321 return const_child_range(Children.begin(), Children.end());
8322 }
8323
8324 child_range used_children() {
8325 return child_range(child_iterator(), child_iterator());
8326 }
8327 const_child_range used_children() const {
8328 return const_child_range(const_child_iterator(), const_child_iterator());
8329 }
8330
8331 static bool classof(const OMPClause *T) {
8332 return T->getClauseKind() == llvm::omp::OMPC_affinity;
8333 }
8334};
8335
8336/// This represents 'filter' clause in the '#pragma omp ...' directive.
8337///
8338/// \code
8339/// #pragma omp masked filter(tid)
8340/// \endcode
8341/// In this example directive '#pragma omp masked' has 'filter' clause with
8342/// thread id.
8343class OMPFilterClause final : public OMPClause, public OMPClauseWithPreInit {
8344 friend class OMPClauseReader;
8345
8346 /// Location of '('.
8347 SourceLocation LParenLoc;
8348
8349 /// Express of the 'filter' clause.
8350 Stmt *ThreadID = nullptr;
8351
8352 /// Sets the thread identifier.
8353 void setThreadID(Expr *TID) { ThreadID = TID; }
8354
8355 /// Sets the location of '('.
8356 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
8357
8358public:
8359 /// Build 'filter' clause with thread-id \a ThreadID.
8360 ///
8361 /// \param ThreadID Thread identifier.
8362 /// \param HelperE Helper expression associated with this clause.
8363 /// \param CaptureRegion Innermost OpenMP region where expressions in this
8364 /// clause must be captured.
8365 /// \param StartLoc Starting location of the clause.
8366 /// \param LParenLoc Location of '('.
8367 /// \param EndLoc Ending location of the clause.
8368 OMPFilterClause(Expr *ThreadID, Stmt *HelperE,
8369 OpenMPDirectiveKind CaptureRegion, SourceLocation StartLoc,
8370 SourceLocation LParenLoc, SourceLocation EndLoc)
8371 : OMPClause(llvm::omp::OMPC_filter, StartLoc, EndLoc),
8372 OMPClauseWithPreInit(this), LParenLoc(LParenLoc), ThreadID(ThreadID) {
8373 setPreInitStmt(HelperE, CaptureRegion);
8374 }
8375
8376 /// Build an empty clause.
8377 OMPFilterClause()
8378 : OMPClause(llvm::omp::OMPC_filter, SourceLocation(), SourceLocation()),
8379 OMPClauseWithPreInit(this) {}
8380 /// Returns the location of '('.
8381 SourceLocation getLParenLoc() const { return LParenLoc; }
8382
8383 /// Return thread identifier.
8384 Expr *getThreadID() { return cast<Expr>(ThreadID); }
8385
8386 /// Return thread identifier.
8387 Expr *getThreadID() const { return cast<Expr>(ThreadID); }
8388
8389 child_range children() { return child_range(&ThreadID, &ThreadID + 1); }
8390
8391 const_child_range children() const {
8392 return const_child_range(&ThreadID, &ThreadID + 1);
8393 }
8394
8395 child_range used_children() {
8396 return child_range(child_iterator(), child_iterator());
8397 }
8398 const_child_range used_children() const {
8399 return const_child_range(const_child_iterator(), const_child_iterator());
8400 }
8401
8402 static bool classof(const OMPClause *T) {
8403 return T->getClauseKind() == llvm::omp::OMPC_filter;
8404 }
8405};
8406
8407/// This class implements a simple visitor for OMPClause
8408/// subclasses.
8409template<class ImplClass, template <typename> class Ptr, typename RetTy>
8410class OMPClauseVisitorBase {
8411public:
8412#define PTR(CLASS) Ptr<CLASS>
8413#define DISPATCH(CLASS) \
8414 return static_cast<ImplClass*>(this)->Visit##CLASS(static_cast<PTR(CLASS)>(S))
8415
8416#define GEN_CLANG_CLAUSE_CLASS
8417#define CLAUSE_CLASS(Enum, Str, Class) \
8418 RetTy Visit##Class(PTR(Class) S) { DISPATCH(Class); }
8419#include "llvm/Frontend/OpenMP/OMP.inc"
8420
8421 RetTy Visit(PTR(OMPClause) S) {
8422 // Top switch clause: visit each OMPClause.
8423 switch (S->getClauseKind()) {
14
Called C++ object pointer is null
8424#define GEN_CLANG_CLAUSE_CLASS
8425#define CLAUSE_CLASS(Enum, Str, Class) \
8426 case llvm::omp::Clause::Enum: \
8427 return Visit##Class(static_cast<PTR(Class)>(S));
8428#define CLAUSE_NO_CLASS(Enum, Str) \
8429 case llvm::omp::Clause::Enum: \
8430 break;
8431#include "llvm/Frontend/OpenMP/OMP.inc"
8432 }
8433 }
8434 // Base case, ignore it. :)
8435 RetTy VisitOMPClause(PTR(OMPClause) Node) { return RetTy(); }
8436#undef PTR
8437#undef DISPATCH
8438};
8439
8440template <typename T> using const_ptr = std::add_pointer_t<std::add_const_t<T>>;
8441
8442template <class ImplClass, typename RetTy = void>
8443class OMPClauseVisitor
8444 : public OMPClauseVisitorBase<ImplClass, std::add_pointer_t, RetTy> {};
8445template<class ImplClass, typename RetTy = void>
8446class ConstOMPClauseVisitor :
8447 public OMPClauseVisitorBase <ImplClass, const_ptr, RetTy> {};
8448
8449class OMPClausePrinter final : public OMPClauseVisitor<OMPClausePrinter> {
8450 raw_ostream &OS;
8451 const PrintingPolicy &Policy;
8452
8453 /// Process clauses with list of variables.
8454 template <typename T> void VisitOMPClauseList(T *Node, char StartSym);
8455 /// Process motion clauses.
8456 template <typename T> void VisitOMPMotionClause(T *Node);
8457
8458public:
8459 OMPClausePrinter(raw_ostream &OS, const PrintingPolicy &Policy)
8460 : OS(OS), Policy(Policy) {}
8461
8462#define GEN_CLANG_CLAUSE_CLASS
8463#define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *S);
8464#include "llvm/Frontend/OpenMP/OMP.inc"
8465};
8466
8467struct OMPTraitProperty {
8468 llvm::omp::TraitProperty Kind = llvm::omp::TraitProperty::invalid;
8469
8470 /// The raw string as we parsed it. This is needed for the `isa` trait set
8471 /// (which accepts anything) and (later) extensions.
8472 StringRef RawString;
8473};
8474struct OMPTraitSelector {
8475 Expr *ScoreOrCondition = nullptr;
8476 llvm::omp::TraitSelector Kind = llvm::omp::TraitSelector::invalid;
8477 llvm::SmallVector<OMPTraitProperty, 1> Properties;
8478};
8479struct OMPTraitSet {
8480 llvm::omp::TraitSet Kind = llvm::omp::TraitSet::invalid;
8481 llvm::SmallVector<OMPTraitSelector, 2> Selectors;
8482};
8483
8484/// Helper data structure representing the traits in a match clause of an
8485/// `declare variant` or `metadirective`. The outer level is an ordered
8486/// collection of selector sets, each with an associated kind and an ordered
8487/// collection of selectors. A selector has a kind, an optional score/condition,
8488/// and an ordered collection of properties.
8489class OMPTraitInfo {
8490 /// Private constructor accesible only by ASTContext.
8491 OMPTraitInfo() {}
8492 friend class ASTContext;
8493
8494public:
8495 /// Reconstruct a (partial) OMPTraitInfo object from a mangled name.
8496 OMPTraitInfo(StringRef MangledName);
8497
8498 /// The outermost level of selector sets.
8499 llvm::SmallVector<OMPTraitSet, 2> Sets;
8500
8501 bool anyScoreOrCondition(
8502 llvm::function_ref<bool(Expr *&, bool /* IsScore */)> Cond) {
8503 return llvm::any_of(Sets, [&](OMPTraitSet &Set) {
8504 return llvm::any_of(
8505 Set.Selectors, [&](OMPTraitSelector &Selector) {
8506 return Cond(Selector.ScoreOrCondition,
8507 /* IsScore */ Selector.Kind !=
8508 llvm::omp::TraitSelector::user_condition);
8509 });
8510 });
8511 }
8512
8513 /// Create a variant match info object from this trait info object. While the
8514 /// former is a flat representation the actual main difference is that the
8515 /// latter uses clang::Expr to store the score/condition while the former is
8516 /// independent of clang. Thus, expressions and conditions are evaluated in
8517 /// this method.
8518 void getAsVariantMatchInfo(ASTContext &ASTCtx,
8519 llvm::omp::VariantMatchInfo &VMI) const;
8520
8521 /// Return a string representation identifying this context selector.
8522 std::string getMangledName() const;
8523
8524 /// Check the extension trait \p TP is active.
8525 bool isExtensionActive(llvm::omp::TraitProperty TP) {
8526 for (const OMPTraitSet &Set : Sets) {
8527 if (Set.Kind != llvm::omp::TraitSet::implementation)
8528 continue;
8529 for (const OMPTraitSelector &Selector : Set.Selectors) {
8530 if (Selector.Kind != llvm::omp::TraitSelector::implementation_extension)
8531 continue;
8532 for (const OMPTraitProperty &Property : Selector.Properties) {
8533 if (Property.Kind == TP)
8534 return true;
8535 }
8536 }
8537 }
8538 return false;
8539 }
8540
8541 /// Print a human readable representation into \p OS.
8542 void print(llvm::raw_ostream &OS, const PrintingPolicy &Policy) const;
8543};
8544llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const OMPTraitInfo &TI);
8545llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const OMPTraitInfo *TI);
8546
8547/// Clang specific specialization of the OMPContext to lookup target features.
8548struct TargetOMPContext final : public llvm::omp::OMPContext {
8549
8550 TargetOMPContext(ASTContext &ASTCtx,
8551 std::function<void(StringRef)> &&DiagUnknownTrait,
8552 const FunctionDecl *CurrentFunctionDecl);
8553 virtual ~TargetOMPContext() = default;
8554
8555 /// See llvm::omp::OMPContext::matchesISATrait
8556 bool matchesISATrait(StringRef RawString) const override;
8557
8558private:
8559 std::function<bool(StringRef)> FeatureValidityCheck;
8560 std::function<void(StringRef)> DiagUnknownTrait;
8561 llvm::StringMap<bool> FeatureMap;
8562};
8563
8564/// Contains data for OpenMP directives: clauses, children
8565/// expressions/statements (helpers for codegen) and associated statement, if
8566/// any.
8567class OMPChildren final
8568 : private llvm::TrailingObjects<OMPChildren, OMPClause *, Stmt *> {
8569 friend TrailingObjects;
8570 friend class OMPClauseReader;
8571 friend class OMPExecutableDirective;
8572 template <typename T> friend class OMPDeclarativeDirective;
8573
8574 /// Numbers of clauses.
8575 unsigned NumClauses = 0;
8576 /// Number of child expressions/stmts.
8577 unsigned NumChildren = 0;
8578 /// true if the directive has associated statement.
8579 bool HasAssociatedStmt = false;
8580
8581 /// Define the sizes of each trailing object array except the last one. This
8582 /// is required for TrailingObjects to work properly.
8583 size_t numTrailingObjects(OverloadToken<OMPClause *>) const {
8584 return NumClauses;
8585 }
8586
8587 OMPChildren() = delete;
8588
8589 OMPChildren(unsigned NumClauses, unsigned NumChildren, bool HasAssociatedStmt)
8590 : NumClauses(NumClauses), NumChildren(NumChildren),
8591 HasAssociatedStmt(HasAssociatedStmt) {}
8592
8593 static size_t size(unsigned NumClauses, bool HasAssociatedStmt,
8594 unsigned NumChildren);
8595
8596 static OMPChildren *Create(void *Mem, ArrayRef<OMPClause *> Clauses);
8597 static OMPChildren *Create(void *Mem, ArrayRef<OMPClause *> Clauses, Stmt *S,
8598 unsigned NumChildren = 0);
8599 static OMPChildren *CreateEmpty(void *Mem, unsigned NumClauses,
8600 bool HasAssociatedStmt = false,
8601 unsigned NumChildren = 0);
8602
8603public:
8604 unsigned getNumClauses() const { return NumClauses; }
8605 unsigned getNumChildren() const { return NumChildren; }
8606 bool hasAssociatedStmt() const { return HasAssociatedStmt; }
8607
8608 /// Set associated statement.
8609 void setAssociatedStmt(Stmt *S) {
8610 getTrailingObjects<Stmt *>()[NumChildren] = S;
8611 }
8612
8613 void setChildren(ArrayRef<Stmt *> Children);
8614
8615 /// Sets the list of variables for this clause.
8616 ///
8617 /// \param Clauses The list of clauses for the directive.
8618 ///
8619 void setClauses(ArrayRef<OMPClause *> Clauses);
8620
8621 /// Returns statement associated with the directive.
8622 const Stmt *getAssociatedStmt() const {
8623 return const_cast<OMPChildren *>(this)->getAssociatedStmt();
8624 }
8625 Stmt *getAssociatedStmt() {
8626 assert(HasAssociatedStmt &&((void)0)
8627 "Expected directive with the associated statement.")((void)0);
8628 return getTrailingObjects<Stmt *>()[NumChildren];
8629 }
8630
8631 /// Get the clauses storage.
8632 MutableArrayRef<OMPClause *> getClauses() {
8633 return llvm::makeMutableArrayRef(getTrailingObjects<OMPClause *>(),
8634 NumClauses);
8635 }
8636 ArrayRef<OMPClause *> getClauses() const {
8637 return const_cast<OMPChildren *>(this)->getClauses();
8638 }
8639
8640 /// Returns the captured statement associated with the
8641 /// component region within the (combined) directive.
8642 ///
8643 /// \param RegionKind Component region kind.
8644 const CapturedStmt *
8645 getCapturedStmt(OpenMPDirectiveKind RegionKind,
8646 ArrayRef<OpenMPDirectiveKind> CaptureRegions) const {
8647 assert(llvm::any_of(((void)0)
8648 CaptureRegions,((void)0)
8649 [=](const OpenMPDirectiveKind K) { return K == RegionKind; }) &&((void)0)
8650 "RegionKind not found in OpenMP CaptureRegions.")((void)0);
8651 auto *CS = cast<CapturedStmt>(getAssociatedStmt());
8652 for (auto ThisCaptureRegion : CaptureRegions) {
8653 if (ThisCaptureRegion == RegionKind)
8654 return CS;
8655 CS = cast<CapturedStmt>(CS->getCapturedStmt());
8656 }
8657 llvm_unreachable("Incorrect RegionKind specified for directive.")__builtin_unreachable();
8658 }
8659
8660 /// Get innermost captured statement for the construct.
8661 CapturedStmt *
8662 getInnermostCapturedStmt(ArrayRef<OpenMPDirectiveKind> CaptureRegions) {
8663 assert(hasAssociatedStmt() && "Must have associated captured statement.")((void)0);
8664 assert(!CaptureRegions.empty() &&((void)0)
8665 "At least one captured statement must be provided.")((void)0);
8666 auto *CS = cast<CapturedStmt>(getAssociatedStmt());
8667 for (unsigned Level = CaptureRegions.size(); Level > 1; --Level)
8668 CS = cast<CapturedStmt>(CS->getCapturedStmt());
8669 return CS;
8670 }
8671
8672 const CapturedStmt *
8673 getInnermostCapturedStmt(ArrayRef<OpenMPDirectiveKind> CaptureRegions) const {
8674 return const_cast<OMPChildren *>(this)->getInnermostCapturedStmt(
8675 CaptureRegions);
8676 }
8677
8678 MutableArrayRef<Stmt *> getChildren();
8679 ArrayRef<Stmt *> getChildren() const {
8680 return const_cast<OMPChildren *>(this)->getChildren();
8681 }
8682
8683 Stmt *getRawStmt() {
8684 assert(HasAssociatedStmt &&((void)0)
8685 "Expected directive with the associated statement.")((void)0);
8686 if (auto *CS = dyn_cast<CapturedStmt>(getAssociatedStmt())) {
8687 Stmt *S = nullptr;
8688 do {
8689 S = CS->getCapturedStmt();
8690 CS = dyn_cast<CapturedStmt>(S);
8691 } while (CS);
8692 return S;
8693 }
8694 return getAssociatedStmt();
8695 }
8696 const Stmt *getRawStmt() const {
8697 return const_cast<OMPChildren *>(this)->getRawStmt();
8698 }
8699
8700 Stmt::child_range getAssociatedStmtAsRange() {
8701 if (!HasAssociatedStmt)
8702 return Stmt::child_range(Stmt::child_iterator(), Stmt::child_iterator());
8703 return Stmt::child_range(&getTrailingObjects<Stmt *>()[NumChildren],
8704 &getTrailingObjects<Stmt *>()[NumChildren + 1]);
8705 }
8706};
8707
8708} // namespace clang
8709
8710#endif // LLVM_CLANG_AST_OPENMPCLAUSE_H