blob: 0dd9d2e460eda9eb72b2693a289869d7f9a6c123 [file] [log] [blame]
Richard Smith9e2341d2015-03-23 03:25:59 +00001//===-- ASTReader.cpp - AST File Reader ----------------------------------===//
Guy Benyei11169dd2012-12-18 14:30:41 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines the ASTReader class, which reads AST files.
11//
12//===----------------------------------------------------------------------===//
13
14#include "clang/Serialization/ASTReader.h"
15#include "ASTCommon.h"
16#include "ASTReaderInternals.h"
17#include "clang/AST/ASTConsumer.h"
18#include "clang/AST/ASTContext.h"
19#include "clang/AST/DeclTemplate.h"
20#include "clang/AST/Expr.h"
21#include "clang/AST/ExprCXX.h"
22#include "clang/AST/NestedNameSpecifier.h"
23#include "clang/AST/Type.h"
24#include "clang/AST/TypeLocVisitor.h"
Benjamin Kramerf3ca26982014-05-10 16:31:55 +000025#include "clang/Basic/DiagnosticOptions.h"
Guy Benyei11169dd2012-12-18 14:30:41 +000026#include "clang/Basic/FileManager.h"
Guy Benyei11169dd2012-12-18 14:30:41 +000027#include "clang/Basic/SourceManager.h"
28#include "clang/Basic/SourceManagerInternals.h"
29#include "clang/Basic/TargetInfo.h"
30#include "clang/Basic/TargetOptions.h"
31#include "clang/Basic/Version.h"
32#include "clang/Basic/VersionTuple.h"
Ben Langmuirb92de022014-04-29 16:25:26 +000033#include "clang/Frontend/Utils.h"
Guy Benyei11169dd2012-12-18 14:30:41 +000034#include "clang/Lex/HeaderSearch.h"
35#include "clang/Lex/HeaderSearchOptions.h"
36#include "clang/Lex/MacroInfo.h"
37#include "clang/Lex/PreprocessingRecord.h"
38#include "clang/Lex/Preprocessor.h"
39#include "clang/Lex/PreprocessorOptions.h"
40#include "clang/Sema/Scope.h"
41#include "clang/Sema/Sema.h"
42#include "clang/Serialization/ASTDeserializationListener.h"
Douglas Gregore060e572013-01-25 01:03:03 +000043#include "clang/Serialization/GlobalModuleIndex.h"
Guy Benyei11169dd2012-12-18 14:30:41 +000044#include "clang/Serialization/ModuleManager.h"
45#include "clang/Serialization/SerializationDiagnostic.h"
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +000046#include "llvm/ADT/Hashing.h"
Guy Benyei11169dd2012-12-18 14:30:41 +000047#include "llvm/ADT/StringExtras.h"
48#include "llvm/Bitcode/BitstreamReader.h"
49#include "llvm/Support/ErrorHandling.h"
50#include "llvm/Support/FileSystem.h"
51#include "llvm/Support/MemoryBuffer.h"
52#include "llvm/Support/Path.h"
53#include "llvm/Support/SaveAndRestore.h"
Dmitri Gribenkof430da42014-02-12 10:33:14 +000054#include "llvm/Support/raw_ostream.h"
Guy Benyei11169dd2012-12-18 14:30:41 +000055#include <algorithm>
Chris Lattner91f373e2013-01-20 00:57:52 +000056#include <cstdio>
Guy Benyei11169dd2012-12-18 14:30:41 +000057#include <iterator>
Rafael Espindola8a8e5542014-06-12 17:19:42 +000058#include <system_error>
Guy Benyei11169dd2012-12-18 14:30:41 +000059
60using namespace clang;
61using namespace clang::serialization;
62using namespace clang::serialization::reader;
Chris Lattner7fb3bef2013-01-20 00:56:42 +000063using llvm::BitstreamCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +000064
Ben Langmuircb69b572014-03-07 06:40:32 +000065
66//===----------------------------------------------------------------------===//
67// ChainedASTReaderListener implementation
68//===----------------------------------------------------------------------===//
69
70bool
71ChainedASTReaderListener::ReadFullVersionInformation(StringRef FullVersion) {
72 return First->ReadFullVersionInformation(FullVersion) ||
73 Second->ReadFullVersionInformation(FullVersion);
74}
Ben Langmuir4f5212a2014-04-14 22:12:44 +000075void ChainedASTReaderListener::ReadModuleName(StringRef ModuleName) {
76 First->ReadModuleName(ModuleName);
77 Second->ReadModuleName(ModuleName);
78}
79void ChainedASTReaderListener::ReadModuleMapFile(StringRef ModuleMapPath) {
80 First->ReadModuleMapFile(ModuleMapPath);
81 Second->ReadModuleMapFile(ModuleMapPath);
82}
Richard Smith1e2cf0d2014-10-31 02:28:58 +000083bool
84ChainedASTReaderListener::ReadLanguageOptions(const LangOptions &LangOpts,
85 bool Complain,
86 bool AllowCompatibleDifferences) {
87 return First->ReadLanguageOptions(LangOpts, Complain,
88 AllowCompatibleDifferences) ||
89 Second->ReadLanguageOptions(LangOpts, Complain,
90 AllowCompatibleDifferences);
Ben Langmuircb69b572014-03-07 06:40:32 +000091}
Chandler Carruth0d745bc2015-03-14 04:47:43 +000092bool ChainedASTReaderListener::ReadTargetOptions(
93 const TargetOptions &TargetOpts, bool Complain,
94 bool AllowCompatibleDifferences) {
95 return First->ReadTargetOptions(TargetOpts, Complain,
96 AllowCompatibleDifferences) ||
97 Second->ReadTargetOptions(TargetOpts, Complain,
98 AllowCompatibleDifferences);
Ben Langmuircb69b572014-03-07 06:40:32 +000099}
100bool ChainedASTReaderListener::ReadDiagnosticOptions(
Ben Langmuirb92de022014-04-29 16:25:26 +0000101 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) {
Ben Langmuircb69b572014-03-07 06:40:32 +0000102 return First->ReadDiagnosticOptions(DiagOpts, Complain) ||
103 Second->ReadDiagnosticOptions(DiagOpts, Complain);
104}
105bool
106ChainedASTReaderListener::ReadFileSystemOptions(const FileSystemOptions &FSOpts,
107 bool Complain) {
108 return First->ReadFileSystemOptions(FSOpts, Complain) ||
109 Second->ReadFileSystemOptions(FSOpts, Complain);
110}
111
112bool ChainedASTReaderListener::ReadHeaderSearchOptions(
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +0000113 const HeaderSearchOptions &HSOpts, StringRef SpecificModuleCachePath,
114 bool Complain) {
115 return First->ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
116 Complain) ||
117 Second->ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
118 Complain);
Ben Langmuircb69b572014-03-07 06:40:32 +0000119}
120bool ChainedASTReaderListener::ReadPreprocessorOptions(
121 const PreprocessorOptions &PPOpts, bool Complain,
122 std::string &SuggestedPredefines) {
123 return First->ReadPreprocessorOptions(PPOpts, Complain,
124 SuggestedPredefines) ||
125 Second->ReadPreprocessorOptions(PPOpts, Complain, SuggestedPredefines);
126}
127void ChainedASTReaderListener::ReadCounter(const serialization::ModuleFile &M,
128 unsigned Value) {
129 First->ReadCounter(M, Value);
130 Second->ReadCounter(M, Value);
131}
132bool ChainedASTReaderListener::needsInputFileVisitation() {
133 return First->needsInputFileVisitation() ||
134 Second->needsInputFileVisitation();
135}
136bool ChainedASTReaderListener::needsSystemInputFileVisitation() {
137 return First->needsSystemInputFileVisitation() ||
138 Second->needsSystemInputFileVisitation();
139}
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000140void ChainedASTReaderListener::visitModuleFile(StringRef Filename) {
141 First->visitModuleFile(Filename);
142 Second->visitModuleFile(Filename);
143}
Ben Langmuircb69b572014-03-07 06:40:32 +0000144bool ChainedASTReaderListener::visitInputFile(StringRef Filename,
Argyrios Kyrtzidis68ccbe02014-03-14 02:26:31 +0000145 bool isSystem,
146 bool isOverridden) {
Justin Bognerc65a66d2014-05-22 06:04:59 +0000147 bool Continue = false;
148 if (First->needsInputFileVisitation() &&
149 (!isSystem || First->needsSystemInputFileVisitation()))
150 Continue |= First->visitInputFile(Filename, isSystem, isOverridden);
151 if (Second->needsInputFileVisitation() &&
152 (!isSystem || Second->needsSystemInputFileVisitation()))
153 Continue |= Second->visitInputFile(Filename, isSystem, isOverridden);
154 return Continue;
Ben Langmuircb69b572014-03-07 06:40:32 +0000155}
156
Guy Benyei11169dd2012-12-18 14:30:41 +0000157//===----------------------------------------------------------------------===//
158// PCH validator implementation
159//===----------------------------------------------------------------------===//
160
161ASTReaderListener::~ASTReaderListener() {}
162
163/// \brief Compare the given set of language options against an existing set of
164/// language options.
165///
166/// \param Diags If non-NULL, diagnostics will be emitted via this engine.
Richard Smith1e2cf0d2014-10-31 02:28:58 +0000167/// \param AllowCompatibleDifferences If true, differences between compatible
168/// language options will be permitted.
Guy Benyei11169dd2012-12-18 14:30:41 +0000169///
170/// \returns true if the languagae options mis-match, false otherwise.
171static bool checkLanguageOptions(const LangOptions &LangOpts,
172 const LangOptions &ExistingLangOpts,
Richard Smith1e2cf0d2014-10-31 02:28:58 +0000173 DiagnosticsEngine *Diags,
174 bool AllowCompatibleDifferences = true) {
Guy Benyei11169dd2012-12-18 14:30:41 +0000175#define LANGOPT(Name, Bits, Default, Description) \
176 if (ExistingLangOpts.Name != LangOpts.Name) { \
177 if (Diags) \
178 Diags->Report(diag::err_pch_langopt_mismatch) \
179 << Description << LangOpts.Name << ExistingLangOpts.Name; \
180 return true; \
181 }
182
183#define VALUE_LANGOPT(Name, Bits, Default, Description) \
184 if (ExistingLangOpts.Name != LangOpts.Name) { \
185 if (Diags) \
186 Diags->Report(diag::err_pch_langopt_value_mismatch) \
187 << Description; \
188 return true; \
189 }
190
191#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
192 if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \
193 if (Diags) \
194 Diags->Report(diag::err_pch_langopt_value_mismatch) \
195 << Description; \
196 return true; \
197 }
198
Richard Smith1e2cf0d2014-10-31 02:28:58 +0000199#define COMPATIBLE_LANGOPT(Name, Bits, Default, Description) \
200 if (!AllowCompatibleDifferences) \
201 LANGOPT(Name, Bits, Default, Description)
202
203#define COMPATIBLE_ENUM_LANGOPT(Name, Bits, Default, Description) \
204 if (!AllowCompatibleDifferences) \
205 ENUM_LANGOPT(Name, Bits, Default, Description)
206
Guy Benyei11169dd2012-12-18 14:30:41 +0000207#define BENIGN_LANGOPT(Name, Bits, Default, Description)
208#define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description)
209#include "clang/Basic/LangOptions.def"
210
211 if (ExistingLangOpts.ObjCRuntime != LangOpts.ObjCRuntime) {
212 if (Diags)
213 Diags->Report(diag::err_pch_langopt_value_mismatch)
214 << "target Objective-C runtime";
215 return true;
216 }
217
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +0000218 if (ExistingLangOpts.CommentOpts.BlockCommandNames !=
219 LangOpts.CommentOpts.BlockCommandNames) {
220 if (Diags)
221 Diags->Report(diag::err_pch_langopt_value_mismatch)
222 << "block command names";
223 return true;
224 }
225
Guy Benyei11169dd2012-12-18 14:30:41 +0000226 return false;
227}
228
229/// \brief Compare the given set of target options against an existing set of
230/// target options.
231///
232/// \param Diags If non-NULL, diagnostics will be emitted via this engine.
233///
234/// \returns true if the target options mis-match, false otherwise.
235static bool checkTargetOptions(const TargetOptions &TargetOpts,
236 const TargetOptions &ExistingTargetOpts,
Chandler Carruth0d745bc2015-03-14 04:47:43 +0000237 DiagnosticsEngine *Diags,
238 bool AllowCompatibleDifferences = true) {
Guy Benyei11169dd2012-12-18 14:30:41 +0000239#define CHECK_TARGET_OPT(Field, Name) \
240 if (TargetOpts.Field != ExistingTargetOpts.Field) { \
241 if (Diags) \
242 Diags->Report(diag::err_pch_targetopt_mismatch) \
243 << Name << TargetOpts.Field << ExistingTargetOpts.Field; \
244 return true; \
245 }
246
Chandler Carruth0d745bc2015-03-14 04:47:43 +0000247 // The triple and ABI must match exactly.
Guy Benyei11169dd2012-12-18 14:30:41 +0000248 CHECK_TARGET_OPT(Triple, "target");
Guy Benyei11169dd2012-12-18 14:30:41 +0000249 CHECK_TARGET_OPT(ABI, "target ABI");
Chandler Carruth0d745bc2015-03-14 04:47:43 +0000250
251 // We can tolerate different CPUs in many cases, notably when one CPU
252 // supports a strict superset of another. When allowing compatible
253 // differences skip this check.
254 if (!AllowCompatibleDifferences)
255 CHECK_TARGET_OPT(CPU, "target CPU");
256
Guy Benyei11169dd2012-12-18 14:30:41 +0000257#undef CHECK_TARGET_OPT
258
259 // Compare feature sets.
260 SmallVector<StringRef, 4> ExistingFeatures(
261 ExistingTargetOpts.FeaturesAsWritten.begin(),
262 ExistingTargetOpts.FeaturesAsWritten.end());
263 SmallVector<StringRef, 4> ReadFeatures(TargetOpts.FeaturesAsWritten.begin(),
264 TargetOpts.FeaturesAsWritten.end());
265 std::sort(ExistingFeatures.begin(), ExistingFeatures.end());
266 std::sort(ReadFeatures.begin(), ReadFeatures.end());
267
Chandler Carruth0d745bc2015-03-14 04:47:43 +0000268 // We compute the set difference in both directions explicitly so that we can
269 // diagnose the differences differently.
270 SmallVector<StringRef, 4> UnmatchedExistingFeatures, UnmatchedReadFeatures;
271 std::set_difference(
272 ExistingFeatures.begin(), ExistingFeatures.end(), ReadFeatures.begin(),
273 ReadFeatures.end(), std::back_inserter(UnmatchedExistingFeatures));
274 std::set_difference(ReadFeatures.begin(), ReadFeatures.end(),
275 ExistingFeatures.begin(), ExistingFeatures.end(),
276 std::back_inserter(UnmatchedReadFeatures));
Guy Benyei11169dd2012-12-18 14:30:41 +0000277
Chandler Carruth0d745bc2015-03-14 04:47:43 +0000278 // If we are allowing compatible differences and the read feature set is
279 // a strict subset of the existing feature set, there is nothing to diagnose.
280 if (AllowCompatibleDifferences && UnmatchedReadFeatures.empty())
281 return false;
Guy Benyei11169dd2012-12-18 14:30:41 +0000282
Chandler Carruth0d745bc2015-03-14 04:47:43 +0000283 if (Diags) {
284 for (StringRef Feature : UnmatchedReadFeatures)
Guy Benyei11169dd2012-12-18 14:30:41 +0000285 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
Chandler Carruth0d745bc2015-03-14 04:47:43 +0000286 << /* is-existing-feature */ false << Feature;
287 for (StringRef Feature : UnmatchedExistingFeatures)
288 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
289 << /* is-existing-feature */ true << Feature;
Guy Benyei11169dd2012-12-18 14:30:41 +0000290 }
291
Chandler Carruth0d745bc2015-03-14 04:47:43 +0000292 return !UnmatchedReadFeatures.empty() || !UnmatchedExistingFeatures.empty();
Guy Benyei11169dd2012-12-18 14:30:41 +0000293}
294
295bool
296PCHValidator::ReadLanguageOptions(const LangOptions &LangOpts,
Richard Smith1e2cf0d2014-10-31 02:28:58 +0000297 bool Complain,
298 bool AllowCompatibleDifferences) {
Guy Benyei11169dd2012-12-18 14:30:41 +0000299 const LangOptions &ExistingLangOpts = PP.getLangOpts();
300 return checkLanguageOptions(LangOpts, ExistingLangOpts,
Richard Smith1e2cf0d2014-10-31 02:28:58 +0000301 Complain ? &Reader.Diags : nullptr,
302 AllowCompatibleDifferences);
Guy Benyei11169dd2012-12-18 14:30:41 +0000303}
304
305bool PCHValidator::ReadTargetOptions(const TargetOptions &TargetOpts,
Chandler Carruth0d745bc2015-03-14 04:47:43 +0000306 bool Complain,
307 bool AllowCompatibleDifferences) {
Guy Benyei11169dd2012-12-18 14:30:41 +0000308 const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts();
309 return checkTargetOptions(TargetOpts, ExistingTargetOpts,
Chandler Carruth0d745bc2015-03-14 04:47:43 +0000310 Complain ? &Reader.Diags : nullptr,
311 AllowCompatibleDifferences);
Guy Benyei11169dd2012-12-18 14:30:41 +0000312}
313
314namespace {
315 typedef llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/> >
316 MacroDefinitionsMap;
Craig Topper3598eb72013-07-05 04:43:31 +0000317 typedef llvm::DenseMap<DeclarationName, SmallVector<NamedDecl *, 8> >
318 DeclsMap;
Guy Benyei11169dd2012-12-18 14:30:41 +0000319}
320
Ben Langmuirb92de022014-04-29 16:25:26 +0000321static bool checkDiagnosticGroupMappings(DiagnosticsEngine &StoredDiags,
322 DiagnosticsEngine &Diags,
323 bool Complain) {
324 typedef DiagnosticsEngine::Level Level;
325
326 // Check current mappings for new -Werror mappings, and the stored mappings
327 // for cases that were explicitly mapped to *not* be errors that are now
328 // errors because of options like -Werror.
329 DiagnosticsEngine *MappingSources[] = { &Diags, &StoredDiags };
330
331 for (DiagnosticsEngine *MappingSource : MappingSources) {
332 for (auto DiagIDMappingPair : MappingSource->getDiagnosticMappings()) {
333 diag::kind DiagID = DiagIDMappingPair.first;
334 Level CurLevel = Diags.getDiagnosticLevel(DiagID, SourceLocation());
335 if (CurLevel < DiagnosticsEngine::Error)
336 continue; // not significant
337 Level StoredLevel =
338 StoredDiags.getDiagnosticLevel(DiagID, SourceLocation());
339 if (StoredLevel < DiagnosticsEngine::Error) {
340 if (Complain)
341 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror=" +
342 Diags.getDiagnosticIDs()->getWarningOptionForDiag(DiagID).str();
343 return true;
344 }
345 }
346 }
347
348 return false;
349}
350
Alp Tokerac4e8e52014-06-22 21:58:33 +0000351static bool isExtHandlingFromDiagsError(DiagnosticsEngine &Diags) {
352 diag::Severity Ext = Diags.getExtensionHandlingBehavior();
353 if (Ext == diag::Severity::Warning && Diags.getWarningsAsErrors())
354 return true;
355 return Ext >= diag::Severity::Error;
Ben Langmuirb92de022014-04-29 16:25:26 +0000356}
357
358static bool checkDiagnosticMappings(DiagnosticsEngine &StoredDiags,
359 DiagnosticsEngine &Diags,
360 bool IsSystem, bool Complain) {
361 // Top-level options
362 if (IsSystem) {
363 if (Diags.getSuppressSystemWarnings())
364 return false;
365 // If -Wsystem-headers was not enabled before, be conservative
366 if (StoredDiags.getSuppressSystemWarnings()) {
367 if (Complain)
368 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Wsystem-headers";
369 return true;
370 }
371 }
372
373 if (Diags.getWarningsAsErrors() && !StoredDiags.getWarningsAsErrors()) {
374 if (Complain)
375 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror";
376 return true;
377 }
378
379 if (Diags.getWarningsAsErrors() && Diags.getEnableAllWarnings() &&
380 !StoredDiags.getEnableAllWarnings()) {
381 if (Complain)
382 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Weverything -Werror";
383 return true;
384 }
385
386 if (isExtHandlingFromDiagsError(Diags) &&
387 !isExtHandlingFromDiagsError(StoredDiags)) {
388 if (Complain)
389 Diags.Report(diag::err_pch_diagopt_mismatch) << "-pedantic-errors";
390 return true;
391 }
392
393 return checkDiagnosticGroupMappings(StoredDiags, Diags, Complain);
394}
395
396bool PCHValidator::ReadDiagnosticOptions(
397 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) {
398 DiagnosticsEngine &ExistingDiags = PP.getDiagnostics();
399 IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(ExistingDiags.getDiagnosticIDs());
400 IntrusiveRefCntPtr<DiagnosticsEngine> Diags(
Alp Tokerf994cef2014-07-05 03:08:06 +0000401 new DiagnosticsEngine(DiagIDs, DiagOpts.get()));
Ben Langmuirb92de022014-04-29 16:25:26 +0000402 // This should never fail, because we would have processed these options
403 // before writing them to an ASTFile.
404 ProcessWarningOptions(*Diags, *DiagOpts, /*Report*/false);
405
406 ModuleManager &ModuleMgr = Reader.getModuleManager();
407 assert(ModuleMgr.size() >= 1 && "what ASTFile is this then");
408
409 // If the original import came from a file explicitly generated by the user,
410 // don't check the diagnostic mappings.
411 // FIXME: currently this is approximated by checking whether this is not a
Richard Smithe842a472014-10-22 02:05:46 +0000412 // module import of an implicitly-loaded module file.
Ben Langmuirb92de022014-04-29 16:25:26 +0000413 // Note: ModuleMgr.rbegin() may not be the current module, but it must be in
414 // the transitive closure of its imports, since unrelated modules cannot be
415 // imported until after this module finishes validation.
416 ModuleFile *TopImport = *ModuleMgr.rbegin();
417 while (!TopImport->ImportedBy.empty())
418 TopImport = TopImport->ImportedBy[0];
Richard Smithe842a472014-10-22 02:05:46 +0000419 if (TopImport->Kind != MK_ImplicitModule)
Ben Langmuirb92de022014-04-29 16:25:26 +0000420 return false;
421
422 StringRef ModuleName = TopImport->ModuleName;
423 assert(!ModuleName.empty() && "diagnostic options read before module name");
424
425 Module *M = PP.getHeaderSearchInfo().lookupModule(ModuleName);
426 assert(M && "missing module");
427
428 // FIXME: if the diagnostics are incompatible, save a DiagnosticOptions that
429 // contains the union of their flags.
430 return checkDiagnosticMappings(*Diags, ExistingDiags, M->IsSystem, Complain);
431}
432
Guy Benyei11169dd2012-12-18 14:30:41 +0000433/// \brief Collect the macro definitions provided by the given preprocessor
434/// options.
Craig Toppera13603a2014-05-22 05:54:18 +0000435static void
436collectMacroDefinitions(const PreprocessorOptions &PPOpts,
437 MacroDefinitionsMap &Macros,
438 SmallVectorImpl<StringRef> *MacroNames = nullptr) {
Guy Benyei11169dd2012-12-18 14:30:41 +0000439 for (unsigned I = 0, N = PPOpts.Macros.size(); I != N; ++I) {
440 StringRef Macro = PPOpts.Macros[I].first;
441 bool IsUndef = PPOpts.Macros[I].second;
442
443 std::pair<StringRef, StringRef> MacroPair = Macro.split('=');
444 StringRef MacroName = MacroPair.first;
445 StringRef MacroBody = MacroPair.second;
446
447 // For an #undef'd macro, we only care about the name.
448 if (IsUndef) {
449 if (MacroNames && !Macros.count(MacroName))
450 MacroNames->push_back(MacroName);
451
452 Macros[MacroName] = std::make_pair("", true);
453 continue;
454 }
455
456 // For a #define'd macro, figure out the actual definition.
457 if (MacroName.size() == Macro.size())
458 MacroBody = "1";
459 else {
460 // Note: GCC drops anything following an end-of-line character.
461 StringRef::size_type End = MacroBody.find_first_of("\n\r");
462 MacroBody = MacroBody.substr(0, End);
463 }
464
465 if (MacroNames && !Macros.count(MacroName))
466 MacroNames->push_back(MacroName);
467 Macros[MacroName] = std::make_pair(MacroBody, false);
468 }
469}
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +0000470
Guy Benyei11169dd2012-12-18 14:30:41 +0000471/// \brief Check the preprocessor options deserialized from the control block
472/// against the preprocessor options in an existing preprocessor.
473///
474/// \param Diags If non-null, produce diagnostics for any mismatches incurred.
475static bool checkPreprocessorOptions(const PreprocessorOptions &PPOpts,
476 const PreprocessorOptions &ExistingPPOpts,
477 DiagnosticsEngine *Diags,
478 FileManager &FileMgr,
Argyrios Kyrtzidisd3afa0c2013-04-26 21:33:40 +0000479 std::string &SuggestedPredefines,
480 const LangOptions &LangOpts) {
Guy Benyei11169dd2012-12-18 14:30:41 +0000481 // Check macro definitions.
482 MacroDefinitionsMap ASTFileMacros;
483 collectMacroDefinitions(PPOpts, ASTFileMacros);
484 MacroDefinitionsMap ExistingMacros;
485 SmallVector<StringRef, 4> ExistingMacroNames;
486 collectMacroDefinitions(ExistingPPOpts, ExistingMacros, &ExistingMacroNames);
487
488 for (unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) {
489 // Dig out the macro definition in the existing preprocessor options.
490 StringRef MacroName = ExistingMacroNames[I];
491 std::pair<StringRef, bool> Existing = ExistingMacros[MacroName];
492
493 // Check whether we know anything about this macro name or not.
494 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/> >::iterator Known
495 = ASTFileMacros.find(MacroName);
496 if (Known == ASTFileMacros.end()) {
497 // FIXME: Check whether this identifier was referenced anywhere in the
498 // AST file. If so, we should reject the AST file. Unfortunately, this
499 // information isn't in the control block. What shall we do about it?
500
501 if (Existing.second) {
502 SuggestedPredefines += "#undef ";
503 SuggestedPredefines += MacroName.str();
504 SuggestedPredefines += '\n';
505 } else {
506 SuggestedPredefines += "#define ";
507 SuggestedPredefines += MacroName.str();
508 SuggestedPredefines += ' ';
509 SuggestedPredefines += Existing.first.str();
510 SuggestedPredefines += '\n';
511 }
512 continue;
513 }
514
515 // If the macro was defined in one but undef'd in the other, we have a
516 // conflict.
517 if (Existing.second != Known->second.second) {
518 if (Diags) {
519 Diags->Report(diag::err_pch_macro_def_undef)
520 << MacroName << Known->second.second;
521 }
522 return true;
523 }
524
525 // If the macro was #undef'd in both, or if the macro bodies are identical,
526 // it's fine.
527 if (Existing.second || Existing.first == Known->second.first)
528 continue;
529
530 // The macro bodies differ; complain.
531 if (Diags) {
532 Diags->Report(diag::err_pch_macro_def_conflict)
533 << MacroName << Known->second.first << Existing.first;
534 }
535 return true;
536 }
537
538 // Check whether we're using predefines.
539 if (PPOpts.UsePredefines != ExistingPPOpts.UsePredefines) {
540 if (Diags) {
541 Diags->Report(diag::err_pch_undef) << ExistingPPOpts.UsePredefines;
542 }
543 return true;
544 }
545
Argyrios Kyrtzidisd3afa0c2013-04-26 21:33:40 +0000546 // Detailed record is important since it is used for the module cache hash.
547 if (LangOpts.Modules &&
548 PPOpts.DetailedRecord != ExistingPPOpts.DetailedRecord) {
549 if (Diags) {
550 Diags->Report(diag::err_pch_pp_detailed_record) << PPOpts.DetailedRecord;
551 }
552 return true;
553 }
554
Guy Benyei11169dd2012-12-18 14:30:41 +0000555 // Compute the #include and #include_macros lines we need.
556 for (unsigned I = 0, N = ExistingPPOpts.Includes.size(); I != N; ++I) {
557 StringRef File = ExistingPPOpts.Includes[I];
558 if (File == ExistingPPOpts.ImplicitPCHInclude)
559 continue;
560
561 if (std::find(PPOpts.Includes.begin(), PPOpts.Includes.end(), File)
562 != PPOpts.Includes.end())
563 continue;
564
565 SuggestedPredefines += "#include \"";
Manuel Klimek9af34ae2014-08-12 08:25:57 +0000566 SuggestedPredefines += File;
Guy Benyei11169dd2012-12-18 14:30:41 +0000567 SuggestedPredefines += "\"\n";
568 }
569
570 for (unsigned I = 0, N = ExistingPPOpts.MacroIncludes.size(); I != N; ++I) {
571 StringRef File = ExistingPPOpts.MacroIncludes[I];
572 if (std::find(PPOpts.MacroIncludes.begin(), PPOpts.MacroIncludes.end(),
573 File)
574 != PPOpts.MacroIncludes.end())
575 continue;
576
577 SuggestedPredefines += "#__include_macros \"";
Manuel Klimek9af34ae2014-08-12 08:25:57 +0000578 SuggestedPredefines += File;
Guy Benyei11169dd2012-12-18 14:30:41 +0000579 SuggestedPredefines += "\"\n##\n";
580 }
581
582 return false;
583}
584
585bool PCHValidator::ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
586 bool Complain,
587 std::string &SuggestedPredefines) {
588 const PreprocessorOptions &ExistingPPOpts = PP.getPreprocessorOpts();
589
590 return checkPreprocessorOptions(PPOpts, ExistingPPOpts,
Craig Toppera13603a2014-05-22 05:54:18 +0000591 Complain? &Reader.Diags : nullptr,
Guy Benyei11169dd2012-12-18 14:30:41 +0000592 PP.getFileManager(),
Argyrios Kyrtzidisd3afa0c2013-04-26 21:33:40 +0000593 SuggestedPredefines,
594 PP.getLangOpts());
Guy Benyei11169dd2012-12-18 14:30:41 +0000595}
596
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +0000597/// Check the header search options deserialized from the control block
598/// against the header search options in an existing preprocessor.
599///
600/// \param Diags If non-null, produce diagnostics for any mismatches incurred.
601static bool checkHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
602 StringRef SpecificModuleCachePath,
603 StringRef ExistingModuleCachePath,
604 DiagnosticsEngine *Diags,
605 const LangOptions &LangOpts) {
606 if (LangOpts.Modules) {
607 if (SpecificModuleCachePath != ExistingModuleCachePath) {
608 if (Diags)
609 Diags->Report(diag::err_pch_modulecache_mismatch)
610 << SpecificModuleCachePath << ExistingModuleCachePath;
611 return true;
612 }
613 }
614
615 return false;
616}
617
618bool PCHValidator::ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
619 StringRef SpecificModuleCachePath,
620 bool Complain) {
621 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
622 PP.getHeaderSearchInfo().getModuleCachePath(),
623 Complain ? &Reader.Diags : nullptr,
624 PP.getLangOpts());
625}
626
Guy Benyei11169dd2012-12-18 14:30:41 +0000627void PCHValidator::ReadCounter(const ModuleFile &M, unsigned Value) {
628 PP.setCounterValue(Value);
629}
630
631//===----------------------------------------------------------------------===//
632// AST reader implementation
633//===----------------------------------------------------------------------===//
634
Nico Weber824285e2014-05-08 04:26:47 +0000635void ASTReader::setDeserializationListener(ASTDeserializationListener *Listener,
636 bool TakeOwnership) {
Guy Benyei11169dd2012-12-18 14:30:41 +0000637 DeserializationListener = Listener;
Nico Weber824285e2014-05-08 04:26:47 +0000638 OwnsDeserializationListener = TakeOwnership;
Guy Benyei11169dd2012-12-18 14:30:41 +0000639}
640
641
642
643unsigned ASTSelectorLookupTrait::ComputeHash(Selector Sel) {
644 return serialization::ComputeHash(Sel);
645}
646
647
648std::pair<unsigned, unsigned>
649ASTSelectorLookupTrait::ReadKeyDataLength(const unsigned char*& d) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000650 using namespace llvm::support;
651 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
652 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
Guy Benyei11169dd2012-12-18 14:30:41 +0000653 return std::make_pair(KeyLen, DataLen);
654}
655
656ASTSelectorLookupTrait::internal_key_type
657ASTSelectorLookupTrait::ReadKey(const unsigned char* d, unsigned) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000658 using namespace llvm::support;
Guy Benyei11169dd2012-12-18 14:30:41 +0000659 SelectorTable &SelTable = Reader.getContext().Selectors;
Justin Bogner57ba0b22014-03-28 22:03:24 +0000660 unsigned N = endian::readNext<uint16_t, little, unaligned>(d);
661 IdentifierInfo *FirstII = Reader.getLocalIdentifier(
662 F, endian::readNext<uint32_t, little, unaligned>(d));
Guy Benyei11169dd2012-12-18 14:30:41 +0000663 if (N == 0)
664 return SelTable.getNullarySelector(FirstII);
665 else if (N == 1)
666 return SelTable.getUnarySelector(FirstII);
667
668 SmallVector<IdentifierInfo *, 16> Args;
669 Args.push_back(FirstII);
670 for (unsigned I = 1; I != N; ++I)
Justin Bogner57ba0b22014-03-28 22:03:24 +0000671 Args.push_back(Reader.getLocalIdentifier(
672 F, endian::readNext<uint32_t, little, unaligned>(d)));
Guy Benyei11169dd2012-12-18 14:30:41 +0000673
674 return SelTable.getSelector(N, Args.data());
675}
676
677ASTSelectorLookupTrait::data_type
678ASTSelectorLookupTrait::ReadData(Selector, const unsigned char* d,
679 unsigned DataLen) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000680 using namespace llvm::support;
Guy Benyei11169dd2012-12-18 14:30:41 +0000681
682 data_type Result;
683
Justin Bogner57ba0b22014-03-28 22:03:24 +0000684 Result.ID = Reader.getGlobalSelectorID(
685 F, endian::readNext<uint32_t, little, unaligned>(d));
Nico Weberff4b35e2014-12-27 22:14:15 +0000686 unsigned FullInstanceBits = endian::readNext<uint16_t, little, unaligned>(d);
687 unsigned FullFactoryBits = endian::readNext<uint16_t, little, unaligned>(d);
688 Result.InstanceBits = FullInstanceBits & 0x3;
689 Result.InstanceHasMoreThanOneDecl = (FullInstanceBits >> 2) & 0x1;
690 Result.FactoryBits = FullFactoryBits & 0x3;
691 Result.FactoryHasMoreThanOneDecl = (FullFactoryBits >> 2) & 0x1;
692 unsigned NumInstanceMethods = FullInstanceBits >> 3;
693 unsigned NumFactoryMethods = FullFactoryBits >> 3;
Guy Benyei11169dd2012-12-18 14:30:41 +0000694
695 // Load instance methods
696 for (unsigned I = 0; I != NumInstanceMethods; ++I) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000697 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
698 F, endian::readNext<uint32_t, little, unaligned>(d)))
Guy Benyei11169dd2012-12-18 14:30:41 +0000699 Result.Instance.push_back(Method);
700 }
701
702 // Load factory methods
703 for (unsigned I = 0; I != NumFactoryMethods; ++I) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000704 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
705 F, endian::readNext<uint32_t, little, unaligned>(d)))
Guy Benyei11169dd2012-12-18 14:30:41 +0000706 Result.Factory.push_back(Method);
707 }
708
709 return Result;
710}
711
Douglas Gregorbfd73d72013-01-23 18:53:14 +0000712unsigned ASTIdentifierLookupTraitBase::ComputeHash(const internal_key_type& a) {
713 return llvm::HashString(a);
Guy Benyei11169dd2012-12-18 14:30:41 +0000714}
715
716std::pair<unsigned, unsigned>
Douglas Gregorbfd73d72013-01-23 18:53:14 +0000717ASTIdentifierLookupTraitBase::ReadKeyDataLength(const unsigned char*& d) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000718 using namespace llvm::support;
719 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
720 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
Guy Benyei11169dd2012-12-18 14:30:41 +0000721 return std::make_pair(KeyLen, DataLen);
722}
723
Douglas Gregorbfd73d72013-01-23 18:53:14 +0000724ASTIdentifierLookupTraitBase::internal_key_type
725ASTIdentifierLookupTraitBase::ReadKey(const unsigned char* d, unsigned n) {
Guy Benyei11169dd2012-12-18 14:30:41 +0000726 assert(n >= 2 && d[n-1] == '\0');
Douglas Gregorbfd73d72013-01-23 18:53:14 +0000727 return StringRef((const char*) d, n-1);
Guy Benyei11169dd2012-12-18 14:30:41 +0000728}
729
Douglas Gregordcf25082013-02-11 18:16:18 +0000730/// \brief Whether the given identifier is "interesting".
731static bool isInterestingIdentifier(IdentifierInfo &II) {
732 return II.isPoisoned() ||
733 II.isExtensionToken() ||
734 II.getObjCOrBuiltinID() ||
735 II.hasRevertedTokenIDToIdentifier() ||
736 II.hadMacroDefinition() ||
737 II.getFETokenInfo<void>();
738}
739
Guy Benyei11169dd2012-12-18 14:30:41 +0000740IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k,
741 const unsigned char* d,
742 unsigned DataLen) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000743 using namespace llvm::support;
744 unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d);
Guy Benyei11169dd2012-12-18 14:30:41 +0000745 bool IsInteresting = RawID & 0x01;
746
747 // Wipe out the "is interesting" bit.
748 RawID = RawID >> 1;
749
750 IdentID ID = Reader.getGlobalIdentifierID(F, RawID);
751 if (!IsInteresting) {
752 // For uninteresting identifiers, just build the IdentifierInfo
753 // and associate it with the persistent ID.
754 IdentifierInfo *II = KnownII;
755 if (!II) {
Douglas Gregorbfd73d72013-01-23 18:53:14 +0000756 II = &Reader.getIdentifierTable().getOwn(k);
Guy Benyei11169dd2012-12-18 14:30:41 +0000757 KnownII = II;
758 }
759 Reader.SetIdentifierInfo(ID, II);
Douglas Gregordcf25082013-02-11 18:16:18 +0000760 if (!II->isFromAST()) {
761 bool WasInteresting = isInterestingIdentifier(*II);
762 II->setIsFromAST();
763 if (WasInteresting)
764 II->setChangedSinceDeserialization();
765 }
766 Reader.markIdentifierUpToDate(II);
Guy Benyei11169dd2012-12-18 14:30:41 +0000767 return II;
768 }
769
Justin Bogner57ba0b22014-03-28 22:03:24 +0000770 unsigned ObjCOrBuiltinID = endian::readNext<uint16_t, little, unaligned>(d);
771 unsigned Bits = endian::readNext<uint16_t, little, unaligned>(d);
Guy Benyei11169dd2012-12-18 14:30:41 +0000772 bool CPlusPlusOperatorKeyword = Bits & 0x01;
773 Bits >>= 1;
774 bool HasRevertedTokenIDToIdentifier = Bits & 0x01;
775 Bits >>= 1;
776 bool Poisoned = Bits & 0x01;
777 Bits >>= 1;
778 bool ExtensionToken = Bits & 0x01;
779 Bits >>= 1;
780 bool hadMacroDefinition = Bits & 0x01;
781 Bits >>= 1;
782
783 assert(Bits == 0 && "Extra bits in the identifier?");
784 DataLen -= 8;
785
786 // Build the IdentifierInfo itself and link the identifier ID with
787 // the new IdentifierInfo.
788 IdentifierInfo *II = KnownII;
789 if (!II) {
Douglas Gregorbfd73d72013-01-23 18:53:14 +0000790 II = &Reader.getIdentifierTable().getOwn(StringRef(k));
Guy Benyei11169dd2012-12-18 14:30:41 +0000791 KnownII = II;
792 }
793 Reader.markIdentifierUpToDate(II);
Douglas Gregordcf25082013-02-11 18:16:18 +0000794 if (!II->isFromAST()) {
795 bool WasInteresting = isInterestingIdentifier(*II);
796 II->setIsFromAST();
797 if (WasInteresting)
798 II->setChangedSinceDeserialization();
799 }
Guy Benyei11169dd2012-12-18 14:30:41 +0000800
801 // Set or check the various bits in the IdentifierInfo structure.
802 // Token IDs are read-only.
Argyrios Kyrtzidisddee8c92013-02-27 01:13:51 +0000803 if (HasRevertedTokenIDToIdentifier && II->getTokenID() != tok::identifier)
Guy Benyei11169dd2012-12-18 14:30:41 +0000804 II->RevertTokenIDToIdentifier();
805 II->setObjCOrBuiltinID(ObjCOrBuiltinID);
806 assert(II->isExtensionToken() == ExtensionToken &&
807 "Incorrect extension token flag");
808 (void)ExtensionToken;
809 if (Poisoned)
810 II->setIsPoisoned(true);
811 assert(II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword &&
812 "Incorrect C++ operator keyword flag");
813 (void)CPlusPlusOperatorKeyword;
814
815 // If this identifier is a macro, deserialize the macro
816 // definition.
817 if (hadMacroDefinition) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000818 uint32_t MacroDirectivesOffset =
819 endian::readNext<uint32_t, little, unaligned>(d);
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +0000820 DataLen -= 4;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +0000821
Richard Smithd7329392015-04-21 21:46:32 +0000822 Reader.addPendingMacro(II, &F, MacroDirectivesOffset);
Guy Benyei11169dd2012-12-18 14:30:41 +0000823 }
824
825 Reader.SetIdentifierInfo(ID, II);
826
827 // Read all of the declarations visible at global scope with this
828 // name.
829 if (DataLen > 0) {
830 SmallVector<uint32_t, 4> DeclIDs;
831 for (; DataLen > 0; DataLen -= 4)
Justin Bogner57ba0b22014-03-28 22:03:24 +0000832 DeclIDs.push_back(Reader.getGlobalDeclID(
833 F, endian::readNext<uint32_t, little, unaligned>(d)));
Guy Benyei11169dd2012-12-18 14:30:41 +0000834 Reader.SetGloballyVisibleDecls(II, DeclIDs);
835 }
836
837 return II;
838}
839
840unsigned
841ASTDeclContextNameLookupTrait::ComputeHash(const DeclNameKey &Key) const {
842 llvm::FoldingSetNodeID ID;
843 ID.AddInteger(Key.Kind);
844
845 switch (Key.Kind) {
846 case DeclarationName::Identifier:
847 case DeclarationName::CXXLiteralOperatorName:
848 ID.AddString(((IdentifierInfo*)Key.Data)->getName());
849 break;
850 case DeclarationName::ObjCZeroArgSelector:
851 case DeclarationName::ObjCOneArgSelector:
852 case DeclarationName::ObjCMultiArgSelector:
853 ID.AddInteger(serialization::ComputeHash(Selector(Key.Data)));
854 break;
855 case DeclarationName::CXXOperatorName:
856 ID.AddInteger((OverloadedOperatorKind)Key.Data);
857 break;
858 case DeclarationName::CXXConstructorName:
859 case DeclarationName::CXXDestructorName:
860 case DeclarationName::CXXConversionFunctionName:
861 case DeclarationName::CXXUsingDirective:
862 break;
863 }
864
865 return ID.ComputeHash();
866}
867
868ASTDeclContextNameLookupTrait::internal_key_type
869ASTDeclContextNameLookupTrait::GetInternalKey(
870 const external_key_type& Name) const {
871 DeclNameKey Key;
872 Key.Kind = Name.getNameKind();
873 switch (Name.getNameKind()) {
874 case DeclarationName::Identifier:
875 Key.Data = (uint64_t)Name.getAsIdentifierInfo();
876 break;
877 case DeclarationName::ObjCZeroArgSelector:
878 case DeclarationName::ObjCOneArgSelector:
879 case DeclarationName::ObjCMultiArgSelector:
880 Key.Data = (uint64_t)Name.getObjCSelector().getAsOpaquePtr();
881 break;
882 case DeclarationName::CXXOperatorName:
883 Key.Data = Name.getCXXOverloadedOperator();
884 break;
885 case DeclarationName::CXXLiteralOperatorName:
886 Key.Data = (uint64_t)Name.getCXXLiteralIdentifier();
887 break;
888 case DeclarationName::CXXConstructorName:
889 case DeclarationName::CXXDestructorName:
890 case DeclarationName::CXXConversionFunctionName:
891 case DeclarationName::CXXUsingDirective:
892 Key.Data = 0;
893 break;
894 }
895
896 return Key;
897}
898
899std::pair<unsigned, unsigned>
900ASTDeclContextNameLookupTrait::ReadKeyDataLength(const unsigned char*& d) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000901 using namespace llvm::support;
902 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
903 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
Guy Benyei11169dd2012-12-18 14:30:41 +0000904 return std::make_pair(KeyLen, DataLen);
905}
906
907ASTDeclContextNameLookupTrait::internal_key_type
908ASTDeclContextNameLookupTrait::ReadKey(const unsigned char* d, unsigned) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000909 using namespace llvm::support;
Guy Benyei11169dd2012-12-18 14:30:41 +0000910
911 DeclNameKey Key;
912 Key.Kind = (DeclarationName::NameKind)*d++;
913 switch (Key.Kind) {
914 case DeclarationName::Identifier:
Justin Bogner57ba0b22014-03-28 22:03:24 +0000915 Key.Data = (uint64_t)Reader.getLocalIdentifier(
916 F, endian::readNext<uint32_t, little, unaligned>(d));
Guy Benyei11169dd2012-12-18 14:30:41 +0000917 break;
918 case DeclarationName::ObjCZeroArgSelector:
919 case DeclarationName::ObjCOneArgSelector:
920 case DeclarationName::ObjCMultiArgSelector:
921 Key.Data =
Justin Bogner57ba0b22014-03-28 22:03:24 +0000922 (uint64_t)Reader.getLocalSelector(
923 F, endian::readNext<uint32_t, little, unaligned>(
924 d)).getAsOpaquePtr();
Guy Benyei11169dd2012-12-18 14:30:41 +0000925 break;
926 case DeclarationName::CXXOperatorName:
927 Key.Data = *d++; // OverloadedOperatorKind
928 break;
929 case DeclarationName::CXXLiteralOperatorName:
Justin Bogner57ba0b22014-03-28 22:03:24 +0000930 Key.Data = (uint64_t)Reader.getLocalIdentifier(
931 F, endian::readNext<uint32_t, little, unaligned>(d));
Guy Benyei11169dd2012-12-18 14:30:41 +0000932 break;
933 case DeclarationName::CXXConstructorName:
934 case DeclarationName::CXXDestructorName:
935 case DeclarationName::CXXConversionFunctionName:
936 case DeclarationName::CXXUsingDirective:
937 Key.Data = 0;
938 break;
939 }
940
941 return Key;
942}
943
944ASTDeclContextNameLookupTrait::data_type
945ASTDeclContextNameLookupTrait::ReadData(internal_key_type,
946 const unsigned char* d,
947 unsigned DataLen) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000948 using namespace llvm::support;
949 unsigned NumDecls = endian::readNext<uint16_t, little, unaligned>(d);
Argyrios Kyrtzidisc57e5032013-01-11 22:29:49 +0000950 LE32DeclID *Start = reinterpret_cast<LE32DeclID *>(
951 const_cast<unsigned char *>(d));
Guy Benyei11169dd2012-12-18 14:30:41 +0000952 return std::make_pair(Start, Start + NumDecls);
953}
954
955bool ASTReader::ReadDeclContextStorage(ModuleFile &M,
Chris Lattner7fb3bef2013-01-20 00:56:42 +0000956 BitstreamCursor &Cursor,
Guy Benyei11169dd2012-12-18 14:30:41 +0000957 const std::pair<uint64_t, uint64_t> &Offsets,
958 DeclContextInfo &Info) {
959 SavedStreamPosition SavedPosition(Cursor);
960 // First the lexical decls.
961 if (Offsets.first != 0) {
962 Cursor.JumpToBit(Offsets.first);
963
964 RecordData Record;
Chris Lattner0e6c9402013-01-20 02:38:54 +0000965 StringRef Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +0000966 unsigned Code = Cursor.ReadCode();
Chris Lattner0e6c9402013-01-20 02:38:54 +0000967 unsigned RecCode = Cursor.readRecord(Code, Record, &Blob);
Guy Benyei11169dd2012-12-18 14:30:41 +0000968 if (RecCode != DECL_CONTEXT_LEXICAL) {
969 Error("Expected lexical block");
970 return true;
971 }
972
Chris Lattner0e6c9402013-01-20 02:38:54 +0000973 Info.LexicalDecls = reinterpret_cast<const KindDeclIDPair*>(Blob.data());
974 Info.NumLexicalDecls = Blob.size() / sizeof(KindDeclIDPair);
Guy Benyei11169dd2012-12-18 14:30:41 +0000975 }
976
977 // Now the lookup table.
978 if (Offsets.second != 0) {
979 Cursor.JumpToBit(Offsets.second);
980
981 RecordData Record;
Chris Lattner0e6c9402013-01-20 02:38:54 +0000982 StringRef Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +0000983 unsigned Code = Cursor.ReadCode();
Chris Lattner0e6c9402013-01-20 02:38:54 +0000984 unsigned RecCode = Cursor.readRecord(Code, Record, &Blob);
Guy Benyei11169dd2012-12-18 14:30:41 +0000985 if (RecCode != DECL_CONTEXT_VISIBLE) {
986 Error("Expected visible lookup table block");
987 return true;
988 }
Justin Bognerda4e6502014-04-14 16:34:29 +0000989 Info.NameLookupTableData = ASTDeclContextNameLookupTable::Create(
990 (const unsigned char *)Blob.data() + Record[0],
991 (const unsigned char *)Blob.data() + sizeof(uint32_t),
992 (const unsigned char *)Blob.data(),
993 ASTDeclContextNameLookupTrait(*this, M));
Guy Benyei11169dd2012-12-18 14:30:41 +0000994 }
995
996 return false;
997}
998
999void ASTReader::Error(StringRef Msg) {
1000 Error(diag::err_fe_pch_malformed, Msg);
Douglas Gregor940e8052013-05-10 22:15:13 +00001001 if (Context.getLangOpts().Modules && !Diags.isDiagnosticInFlight()) {
1002 Diag(diag::note_module_cache_path)
1003 << PP.getHeaderSearchInfo().getModuleCachePath();
1004 }
Guy Benyei11169dd2012-12-18 14:30:41 +00001005}
1006
1007void ASTReader::Error(unsigned DiagID,
1008 StringRef Arg1, StringRef Arg2) {
1009 if (Diags.isDiagnosticInFlight())
1010 Diags.SetDelayedDiagnostic(DiagID, Arg1, Arg2);
1011 else
1012 Diag(DiagID) << Arg1 << Arg2;
1013}
1014
1015//===----------------------------------------------------------------------===//
1016// Source Manager Deserialization
1017//===----------------------------------------------------------------------===//
1018
1019/// \brief Read the line table in the source manager block.
1020/// \returns true if there was an error.
1021bool ASTReader::ParseLineTable(ModuleFile &F,
Richard Smith7ed1bc92014-12-05 22:42:13 +00001022 const RecordData &Record) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001023 unsigned Idx = 0;
1024 LineTableInfo &LineTable = SourceMgr.getLineTable();
1025
1026 // Parse the file names
1027 std::map<int, int> FileIDs;
1028 for (int I = 0, N = Record[Idx++]; I != N; ++I) {
1029 // Extract the file name
Richard Smith7ed1bc92014-12-05 22:42:13 +00001030 auto Filename = ReadPath(F, Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00001031 FileIDs[I] = LineTable.getLineTableFilenameID(Filename);
1032 }
1033
1034 // Parse the line entries
1035 std::vector<LineEntry> Entries;
1036 while (Idx < Record.size()) {
1037 int FID = Record[Idx++];
1038 assert(FID >= 0 && "Serialized line entries for non-local file.");
1039 // Remap FileID from 1-based old view.
1040 FID += F.SLocEntryBaseID - 1;
1041
1042 // Extract the line entries
1043 unsigned NumEntries = Record[Idx++];
1044 assert(NumEntries && "Numentries is 00000");
1045 Entries.clear();
1046 Entries.reserve(NumEntries);
1047 for (unsigned I = 0; I != NumEntries; ++I) {
1048 unsigned FileOffset = Record[Idx++];
1049 unsigned LineNo = Record[Idx++];
1050 int FilenameID = FileIDs[Record[Idx++]];
1051 SrcMgr::CharacteristicKind FileKind
1052 = (SrcMgr::CharacteristicKind)Record[Idx++];
1053 unsigned IncludeOffset = Record[Idx++];
1054 Entries.push_back(LineEntry::get(FileOffset, LineNo, FilenameID,
1055 FileKind, IncludeOffset));
1056 }
1057 LineTable.AddEntry(FileID::get(FID), Entries);
1058 }
1059
1060 return false;
1061}
1062
1063/// \brief Read a source manager block
1064bool ASTReader::ReadSourceManagerBlock(ModuleFile &F) {
1065 using namespace SrcMgr;
1066
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001067 BitstreamCursor &SLocEntryCursor = F.SLocEntryCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00001068
1069 // Set the source-location entry cursor to the current position in
1070 // the stream. This cursor will be used to read the contents of the
1071 // source manager block initially, and then lazily read
1072 // source-location entries as needed.
1073 SLocEntryCursor = F.Stream;
1074
1075 // The stream itself is going to skip over the source manager block.
1076 if (F.Stream.SkipBlock()) {
1077 Error("malformed block record in AST file");
1078 return true;
1079 }
1080
1081 // Enter the source manager block.
1082 if (SLocEntryCursor.EnterSubBlock(SOURCE_MANAGER_BLOCK_ID)) {
1083 Error("malformed source manager block record in AST file");
1084 return true;
1085 }
1086
1087 RecordData Record;
1088 while (true) {
Chris Lattnere7b154b2013-01-19 21:39:22 +00001089 llvm::BitstreamEntry E = SLocEntryCursor.advanceSkippingSubblocks();
1090
1091 switch (E.Kind) {
1092 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1093 case llvm::BitstreamEntry::Error:
1094 Error("malformed block record in AST file");
1095 return true;
1096 case llvm::BitstreamEntry::EndBlock:
Guy Benyei11169dd2012-12-18 14:30:41 +00001097 return false;
Chris Lattnere7b154b2013-01-19 21:39:22 +00001098 case llvm::BitstreamEntry::Record:
1099 // The interesting case.
1100 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00001101 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00001102
Guy Benyei11169dd2012-12-18 14:30:41 +00001103 // Read a record.
Guy Benyei11169dd2012-12-18 14:30:41 +00001104 Record.clear();
Chris Lattner15c3e7d2013-01-21 18:28:26 +00001105 StringRef Blob;
1106 switch (SLocEntryCursor.readRecord(E.ID, Record, &Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001107 default: // Default behavior: ignore.
1108 break;
1109
1110 case SM_SLOC_FILE_ENTRY:
1111 case SM_SLOC_BUFFER_ENTRY:
1112 case SM_SLOC_EXPANSION_ENTRY:
1113 // Once we hit one of the source location entries, we're done.
1114 return false;
1115 }
1116 }
1117}
1118
1119/// \brief If a header file is not found at the path that we expect it to be
1120/// and the PCH file was moved from its original location, try to resolve the
1121/// file by assuming that header+PCH were moved together and the header is in
1122/// the same place relative to the PCH.
1123static std::string
1124resolveFileRelativeToOriginalDir(const std::string &Filename,
1125 const std::string &OriginalDir,
1126 const std::string &CurrDir) {
1127 assert(OriginalDir != CurrDir &&
1128 "No point trying to resolve the file if the PCH dir didn't change");
1129 using namespace llvm::sys;
1130 SmallString<128> filePath(Filename);
1131 fs::make_absolute(filePath);
1132 assert(path::is_absolute(OriginalDir));
1133 SmallString<128> currPCHPath(CurrDir);
1134
1135 path::const_iterator fileDirI = path::begin(path::parent_path(filePath)),
1136 fileDirE = path::end(path::parent_path(filePath));
1137 path::const_iterator origDirI = path::begin(OriginalDir),
1138 origDirE = path::end(OriginalDir);
1139 // Skip the common path components from filePath and OriginalDir.
1140 while (fileDirI != fileDirE && origDirI != origDirE &&
1141 *fileDirI == *origDirI) {
1142 ++fileDirI;
1143 ++origDirI;
1144 }
1145 for (; origDirI != origDirE; ++origDirI)
1146 path::append(currPCHPath, "..");
1147 path::append(currPCHPath, fileDirI, fileDirE);
1148 path::append(currPCHPath, path::filename(Filename));
1149 return currPCHPath.str();
1150}
1151
1152bool ASTReader::ReadSLocEntry(int ID) {
1153 if (ID == 0)
1154 return false;
1155
1156 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1157 Error("source location entry ID out-of-range for AST file");
1158 return true;
1159 }
1160
1161 ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second;
1162 F->SLocEntryCursor.JumpToBit(F->SLocEntryOffsets[ID - F->SLocEntryBaseID]);
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001163 BitstreamCursor &SLocEntryCursor = F->SLocEntryCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00001164 unsigned BaseOffset = F->SLocEntryBaseOffset;
1165
1166 ++NumSLocEntriesRead;
Chris Lattnere7b154b2013-01-19 21:39:22 +00001167 llvm::BitstreamEntry Entry = SLocEntryCursor.advance();
1168 if (Entry.Kind != llvm::BitstreamEntry::Record) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001169 Error("incorrectly-formatted source location entry in AST file");
1170 return true;
1171 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00001172
Guy Benyei11169dd2012-12-18 14:30:41 +00001173 RecordData Record;
Chris Lattner0e6c9402013-01-20 02:38:54 +00001174 StringRef Blob;
1175 switch (SLocEntryCursor.readRecord(Entry.ID, Record, &Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001176 default:
1177 Error("incorrectly-formatted source location entry in AST file");
1178 return true;
1179
1180 case SM_SLOC_FILE_ENTRY: {
1181 // We will detect whether a file changed and return 'Failure' for it, but
1182 // we will also try to fail gracefully by setting up the SLocEntry.
1183 unsigned InputID = Record[4];
1184 InputFile IF = getInputFile(*F, InputID);
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00001185 const FileEntry *File = IF.getFile();
1186 bool OverriddenBuffer = IF.isOverridden();
Guy Benyei11169dd2012-12-18 14:30:41 +00001187
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00001188 // Note that we only check if a File was returned. If it was out-of-date
1189 // we have complained but we will continue creating a FileID to recover
1190 // gracefully.
1191 if (!File)
Guy Benyei11169dd2012-12-18 14:30:41 +00001192 return true;
1193
1194 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
1195 if (IncludeLoc.isInvalid() && F->Kind != MK_MainFile) {
1196 // This is the module's main file.
1197 IncludeLoc = getImportLocation(F);
1198 }
1199 SrcMgr::CharacteristicKind
1200 FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
1201 FileID FID = SourceMgr.createFileID(File, IncludeLoc, FileCharacter,
1202 ID, BaseOffset + Record[0]);
1203 SrcMgr::FileInfo &FileInfo =
1204 const_cast<SrcMgr::FileInfo&>(SourceMgr.getSLocEntry(FID).getFile());
1205 FileInfo.NumCreatedFIDs = Record[5];
1206 if (Record[3])
1207 FileInfo.setHasLineDirectives();
1208
1209 const DeclID *FirstDecl = F->FileSortedDecls + Record[6];
1210 unsigned NumFileDecls = Record[7];
1211 if (NumFileDecls) {
1212 assert(F->FileSortedDecls && "FILE_SORTED_DECLS not encountered yet ?");
1213 FileDeclIDs[FID] = FileDeclsInfo(F, llvm::makeArrayRef(FirstDecl,
1214 NumFileDecls));
1215 }
1216
1217 const SrcMgr::ContentCache *ContentCache
1218 = SourceMgr.getOrCreateContentCache(File,
1219 /*isSystemFile=*/FileCharacter != SrcMgr::C_User);
1220 if (OverriddenBuffer && !ContentCache->BufferOverridden &&
1221 ContentCache->ContentsEntry == ContentCache->OrigEntry) {
1222 unsigned Code = SLocEntryCursor.ReadCode();
1223 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00001224 unsigned RecCode = SLocEntryCursor.readRecord(Code, Record, &Blob);
Guy Benyei11169dd2012-12-18 14:30:41 +00001225
1226 if (RecCode != SM_SLOC_BUFFER_BLOB) {
1227 Error("AST record has invalid code");
1228 return true;
1229 }
1230
Rafael Espindolad87f8d72014-08-27 20:03:29 +00001231 std::unique_ptr<llvm::MemoryBuffer> Buffer
Chris Lattner0e6c9402013-01-20 02:38:54 +00001232 = llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), File->getName());
David Blaikie49cc3182014-08-27 20:54:45 +00001233 SourceMgr.overrideFileContents(File, std::move(Buffer));
Guy Benyei11169dd2012-12-18 14:30:41 +00001234 }
1235
1236 break;
1237 }
1238
1239 case SM_SLOC_BUFFER_ENTRY: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00001240 const char *Name = Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00001241 unsigned Offset = Record[0];
1242 SrcMgr::CharacteristicKind
1243 FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
1244 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
Richard Smithe842a472014-10-22 02:05:46 +00001245 if (IncludeLoc.isInvalid() &&
1246 (F->Kind == MK_ImplicitModule || F->Kind == MK_ExplicitModule)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001247 IncludeLoc = getImportLocation(F);
1248 }
1249 unsigned Code = SLocEntryCursor.ReadCode();
1250 Record.clear();
1251 unsigned RecCode
Chris Lattner0e6c9402013-01-20 02:38:54 +00001252 = SLocEntryCursor.readRecord(Code, Record, &Blob);
Guy Benyei11169dd2012-12-18 14:30:41 +00001253
1254 if (RecCode != SM_SLOC_BUFFER_BLOB) {
1255 Error("AST record has invalid code");
1256 return true;
1257 }
1258
Rafael Espindolad87f8d72014-08-27 20:03:29 +00001259 std::unique_ptr<llvm::MemoryBuffer> Buffer =
1260 llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name);
David Blaikie50a5f972014-08-29 07:59:55 +00001261 SourceMgr.createFileID(std::move(Buffer), FileCharacter, ID,
Rafael Espindolad87f8d72014-08-27 20:03:29 +00001262 BaseOffset + Offset, IncludeLoc);
Guy Benyei11169dd2012-12-18 14:30:41 +00001263 break;
1264 }
1265
1266 case SM_SLOC_EXPANSION_ENTRY: {
1267 SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1]);
1268 SourceMgr.createExpansionLoc(SpellingLoc,
1269 ReadSourceLocation(*F, Record[2]),
1270 ReadSourceLocation(*F, Record[3]),
1271 Record[4],
1272 ID,
1273 BaseOffset + Record[0]);
1274 break;
1275 }
1276 }
1277
1278 return false;
1279}
1280
1281std::pair<SourceLocation, StringRef> ASTReader::getModuleImportLoc(int ID) {
1282 if (ID == 0)
1283 return std::make_pair(SourceLocation(), "");
1284
1285 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1286 Error("source location entry ID out-of-range for AST file");
1287 return std::make_pair(SourceLocation(), "");
1288 }
1289
1290 // Find which module file this entry lands in.
1291 ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second;
Richard Smithe842a472014-10-22 02:05:46 +00001292 if (M->Kind != MK_ImplicitModule && M->Kind != MK_ExplicitModule)
Guy Benyei11169dd2012-12-18 14:30:41 +00001293 return std::make_pair(SourceLocation(), "");
1294
1295 // FIXME: Can we map this down to a particular submodule? That would be
1296 // ideal.
Ben Langmuirbeee15e2014-04-14 18:00:01 +00001297 return std::make_pair(M->ImportLoc, StringRef(M->ModuleName));
Guy Benyei11169dd2012-12-18 14:30:41 +00001298}
1299
1300/// \brief Find the location where the module F is imported.
1301SourceLocation ASTReader::getImportLocation(ModuleFile *F) {
1302 if (F->ImportLoc.isValid())
1303 return F->ImportLoc;
1304
1305 // Otherwise we have a PCH. It's considered to be "imported" at the first
1306 // location of its includer.
1307 if (F->ImportedBy.empty() || !F->ImportedBy[0]) {
Ben Langmuirbeee15e2014-04-14 18:00:01 +00001308 // Main file is the importer.
1309 assert(!SourceMgr.getMainFileID().isInvalid() && "missing main file");
1310 return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID());
Guy Benyei11169dd2012-12-18 14:30:41 +00001311 }
Guy Benyei11169dd2012-12-18 14:30:41 +00001312 return F->ImportedBy[0]->FirstLoc;
1313}
1314
1315/// ReadBlockAbbrevs - Enter a subblock of the specified BlockID with the
1316/// specified cursor. Read the abbreviations that are at the top of the block
1317/// and then leave the cursor pointing into the block.
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001318bool ASTReader::ReadBlockAbbrevs(BitstreamCursor &Cursor, unsigned BlockID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001319 if (Cursor.EnterSubBlock(BlockID)) {
1320 Error("malformed block record in AST file");
1321 return Failure;
1322 }
1323
1324 while (true) {
1325 uint64_t Offset = Cursor.GetCurrentBitNo();
1326 unsigned Code = Cursor.ReadCode();
1327
1328 // We expect all abbrevs to be at the start of the block.
1329 if (Code != llvm::bitc::DEFINE_ABBREV) {
1330 Cursor.JumpToBit(Offset);
1331 return false;
1332 }
1333 Cursor.ReadAbbrevRecord();
1334 }
1335}
1336
Richard Smithe40f2ba2013-08-07 21:41:30 +00001337Token ASTReader::ReadToken(ModuleFile &F, const RecordDataImpl &Record,
John McCallf413f5e2013-05-03 00:10:13 +00001338 unsigned &Idx) {
1339 Token Tok;
1340 Tok.startToken();
1341 Tok.setLocation(ReadSourceLocation(F, Record, Idx));
1342 Tok.setLength(Record[Idx++]);
1343 if (IdentifierInfo *II = getLocalIdentifier(F, Record[Idx++]))
1344 Tok.setIdentifierInfo(II);
1345 Tok.setKind((tok::TokenKind)Record[Idx++]);
1346 Tok.setFlag((Token::TokenFlags)Record[Idx++]);
1347 return Tok;
1348}
1349
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001350MacroInfo *ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001351 BitstreamCursor &Stream = F.MacroCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00001352
1353 // Keep track of where we are in the stream, then jump back there
1354 // after reading this macro.
1355 SavedStreamPosition SavedPosition(Stream);
1356
1357 Stream.JumpToBit(Offset);
1358 RecordData Record;
1359 SmallVector<IdentifierInfo*, 16> MacroArgs;
Craig Toppera13603a2014-05-22 05:54:18 +00001360 MacroInfo *Macro = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00001361
Guy Benyei11169dd2012-12-18 14:30:41 +00001362 while (true) {
Chris Lattnerefa77172013-01-20 00:00:22 +00001363 // Advance to the next record, but if we get to the end of the block, don't
1364 // pop it (removing all the abbreviations from the cursor) since we want to
1365 // be able to reseek within the block and read entries.
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001366 unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd;
Chris Lattnerefa77172013-01-20 00:00:22 +00001367 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks(Flags);
1368
1369 switch (Entry.Kind) {
1370 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1371 case llvm::BitstreamEntry::Error:
1372 Error("malformed block record in AST file");
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001373 return Macro;
Chris Lattnerefa77172013-01-20 00:00:22 +00001374 case llvm::BitstreamEntry::EndBlock:
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001375 return Macro;
Chris Lattnerefa77172013-01-20 00:00:22 +00001376 case llvm::BitstreamEntry::Record:
1377 // The interesting case.
1378 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00001379 }
1380
1381 // Read a record.
Guy Benyei11169dd2012-12-18 14:30:41 +00001382 Record.clear();
1383 PreprocessorRecordTypes RecType =
Chris Lattner0e6c9402013-01-20 02:38:54 +00001384 (PreprocessorRecordTypes)Stream.readRecord(Entry.ID, Record);
Guy Benyei11169dd2012-12-18 14:30:41 +00001385 switch (RecType) {
Richard Smithd7329392015-04-21 21:46:32 +00001386 case PP_MODULE_MACRO:
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001387 case PP_MACRO_DIRECTIVE_HISTORY:
1388 return Macro;
1389
Guy Benyei11169dd2012-12-18 14:30:41 +00001390 case PP_MACRO_OBJECT_LIKE:
1391 case PP_MACRO_FUNCTION_LIKE: {
1392 // If we already have a macro, that means that we've hit the end
1393 // of the definition of the macro we were looking for. We're
1394 // done.
1395 if (Macro)
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001396 return Macro;
Guy Benyei11169dd2012-12-18 14:30:41 +00001397
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001398 unsigned NextIndex = 1; // Skip identifier ID.
1399 SubmoduleID SubModID = getGlobalSubmoduleID(F, Record[NextIndex++]);
Guy Benyei11169dd2012-12-18 14:30:41 +00001400 SourceLocation Loc = ReadSourceLocation(F, Record, NextIndex);
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001401 MacroInfo *MI = PP.AllocateDeserializedMacroInfo(Loc, SubModID);
Argyrios Kyrtzidis7572be22013-01-07 19:16:23 +00001402 MI->setDefinitionEndLoc(ReadSourceLocation(F, Record, NextIndex));
Guy Benyei11169dd2012-12-18 14:30:41 +00001403 MI->setIsUsed(Record[NextIndex++]);
Argyrios Kyrtzidis9ef53ce2014-04-09 18:21:23 +00001404 MI->setUsedForHeaderGuard(Record[NextIndex++]);
Guy Benyei11169dd2012-12-18 14:30:41 +00001405
Guy Benyei11169dd2012-12-18 14:30:41 +00001406 if (RecType == PP_MACRO_FUNCTION_LIKE) {
1407 // Decode function-like macro info.
1408 bool isC99VarArgs = Record[NextIndex++];
1409 bool isGNUVarArgs = Record[NextIndex++];
1410 bool hasCommaPasting = Record[NextIndex++];
1411 MacroArgs.clear();
1412 unsigned NumArgs = Record[NextIndex++];
1413 for (unsigned i = 0; i != NumArgs; ++i)
1414 MacroArgs.push_back(getLocalIdentifier(F, Record[NextIndex++]));
1415
1416 // Install function-like macro info.
1417 MI->setIsFunctionLike();
1418 if (isC99VarArgs) MI->setIsC99Varargs();
1419 if (isGNUVarArgs) MI->setIsGNUVarargs();
1420 if (hasCommaPasting) MI->setHasCommaPasting();
1421 MI->setArgumentList(MacroArgs.data(), MacroArgs.size(),
1422 PP.getPreprocessorAllocator());
1423 }
1424
Guy Benyei11169dd2012-12-18 14:30:41 +00001425 // Remember that we saw this macro last so that we add the tokens that
1426 // form its body to it.
1427 Macro = MI;
1428
1429 if (NextIndex + 1 == Record.size() && PP.getPreprocessingRecord() &&
1430 Record[NextIndex]) {
1431 // We have a macro definition. Register the association
1432 PreprocessedEntityID
1433 GlobalID = getGlobalPreprocessedEntityID(F, Record[NextIndex]);
1434 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
Richard Smith66a81862015-05-04 02:25:31 +00001435 PreprocessingRecord::PPEntityID PPID =
1436 PPRec.getPPEntityID(GlobalID - 1, /*isLoaded=*/true);
1437 MacroDefinitionRecord *PPDef = cast_or_null<MacroDefinitionRecord>(
1438 PPRec.getPreprocessedEntity(PPID));
Argyrios Kyrtzidis832de9f2013-02-22 18:35:59 +00001439 if (PPDef)
1440 PPRec.RegisterMacroDefinition(Macro, PPDef);
Guy Benyei11169dd2012-12-18 14:30:41 +00001441 }
1442
1443 ++NumMacrosRead;
1444 break;
1445 }
1446
1447 case PP_TOKEN: {
1448 // If we see a TOKEN before a PP_MACRO_*, then the file is
1449 // erroneous, just pretend we didn't see this.
Craig Toppera13603a2014-05-22 05:54:18 +00001450 if (!Macro) break;
Guy Benyei11169dd2012-12-18 14:30:41 +00001451
John McCallf413f5e2013-05-03 00:10:13 +00001452 unsigned Idx = 0;
1453 Token Tok = ReadToken(F, Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00001454 Macro->AddTokenToBody(Tok);
1455 break;
1456 }
1457 }
1458 }
1459}
1460
1461PreprocessedEntityID
1462ASTReader::getGlobalPreprocessedEntityID(ModuleFile &M, unsigned LocalID) const {
1463 ContinuousRangeMap<uint32_t, int, 2>::const_iterator
1464 I = M.PreprocessedEntityRemap.find(LocalID - NUM_PREDEF_PP_ENTITY_IDS);
1465 assert(I != M.PreprocessedEntityRemap.end()
1466 && "Invalid index into preprocessed entity index remap");
1467
1468 return LocalID + I->second;
1469}
1470
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001471unsigned HeaderFileInfoTrait::ComputeHash(internal_key_ref ikey) {
1472 return llvm::hash_combine(ikey.Size, ikey.ModTime);
Guy Benyei11169dd2012-12-18 14:30:41 +00001473}
Richard Smith7ed1bc92014-12-05 22:42:13 +00001474
Guy Benyei11169dd2012-12-18 14:30:41 +00001475HeaderFileInfoTrait::internal_key_type
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001476HeaderFileInfoTrait::GetInternalKey(const FileEntry *FE) {
1477 internal_key_type ikey = { FE->getSize(), FE->getModificationTime(),
Richard Smith7ed1bc92014-12-05 22:42:13 +00001478 FE->getName(), /*Imported*/false };
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001479 return ikey;
1480}
Guy Benyei11169dd2012-12-18 14:30:41 +00001481
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001482bool HeaderFileInfoTrait::EqualKey(internal_key_ref a, internal_key_ref b) {
1483 if (a.Size != b.Size || a.ModTime != b.ModTime)
Guy Benyei11169dd2012-12-18 14:30:41 +00001484 return false;
1485
Richard Smith7ed1bc92014-12-05 22:42:13 +00001486 if (llvm::sys::path::is_absolute(a.Filename) &&
1487 strcmp(a.Filename, b.Filename) == 0)
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001488 return true;
1489
Guy Benyei11169dd2012-12-18 14:30:41 +00001490 // Determine whether the actual files are equivalent.
Argyrios Kyrtzidis2a513e82013-03-04 20:33:40 +00001491 FileManager &FileMgr = Reader.getFileManager();
Richard Smith7ed1bc92014-12-05 22:42:13 +00001492 auto GetFile = [&](const internal_key_type &Key) -> const FileEntry* {
1493 if (!Key.Imported)
1494 return FileMgr.getFile(Key.Filename);
1495
1496 std::string Resolved = Key.Filename;
1497 Reader.ResolveImportedPath(M, Resolved);
1498 return FileMgr.getFile(Resolved);
1499 };
1500
1501 const FileEntry *FEA = GetFile(a);
1502 const FileEntry *FEB = GetFile(b);
1503 return FEA && FEA == FEB;
Guy Benyei11169dd2012-12-18 14:30:41 +00001504}
1505
1506std::pair<unsigned, unsigned>
1507HeaderFileInfoTrait::ReadKeyDataLength(const unsigned char*& d) {
Justin Bogner57ba0b22014-03-28 22:03:24 +00001508 using namespace llvm::support;
1509 unsigned KeyLen = (unsigned) endian::readNext<uint16_t, little, unaligned>(d);
Guy Benyei11169dd2012-12-18 14:30:41 +00001510 unsigned DataLen = (unsigned) *d++;
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001511 return std::make_pair(KeyLen, DataLen);
Guy Benyei11169dd2012-12-18 14:30:41 +00001512}
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001513
1514HeaderFileInfoTrait::internal_key_type
1515HeaderFileInfoTrait::ReadKey(const unsigned char *d, unsigned) {
Justin Bogner57ba0b22014-03-28 22:03:24 +00001516 using namespace llvm::support;
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001517 internal_key_type ikey;
Justin Bogner57ba0b22014-03-28 22:03:24 +00001518 ikey.Size = off_t(endian::readNext<uint64_t, little, unaligned>(d));
1519 ikey.ModTime = time_t(endian::readNext<uint64_t, little, unaligned>(d));
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001520 ikey.Filename = (const char *)d;
Richard Smith7ed1bc92014-12-05 22:42:13 +00001521 ikey.Imported = true;
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001522 return ikey;
1523}
1524
Guy Benyei11169dd2012-12-18 14:30:41 +00001525HeaderFileInfoTrait::data_type
Argyrios Kyrtzidisb146baa2013-03-13 21:13:51 +00001526HeaderFileInfoTrait::ReadData(internal_key_ref key, const unsigned char *d,
Guy Benyei11169dd2012-12-18 14:30:41 +00001527 unsigned DataLen) {
1528 const unsigned char *End = d + DataLen;
Justin Bogner57ba0b22014-03-28 22:03:24 +00001529 using namespace llvm::support;
Guy Benyei11169dd2012-12-18 14:30:41 +00001530 HeaderFileInfo HFI;
1531 unsigned Flags = *d++;
Lawrence Crowlb53e5482013-06-20 21:14:14 +00001532 HFI.HeaderRole = static_cast<ModuleMap::ModuleHeaderRole>
1533 ((Flags >> 6) & 0x03);
Guy Benyei11169dd2012-12-18 14:30:41 +00001534 HFI.isImport = (Flags >> 5) & 0x01;
1535 HFI.isPragmaOnce = (Flags >> 4) & 0x01;
1536 HFI.DirInfo = (Flags >> 2) & 0x03;
1537 HFI.Resolved = (Flags >> 1) & 0x01;
1538 HFI.IndexHeaderMapHeader = Flags & 0x01;
Justin Bogner57ba0b22014-03-28 22:03:24 +00001539 HFI.NumIncludes = endian::readNext<uint16_t, little, unaligned>(d);
1540 HFI.ControllingMacroID = Reader.getGlobalIdentifierID(
1541 M, endian::readNext<uint32_t, little, unaligned>(d));
1542 if (unsigned FrameworkOffset =
1543 endian::readNext<uint32_t, little, unaligned>(d)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001544 // The framework offset is 1 greater than the actual offset,
1545 // since 0 is used as an indicator for "no framework name".
1546 StringRef FrameworkName(FrameworkStrings + FrameworkOffset - 1);
1547 HFI.Framework = HS->getUniqueFrameworkName(FrameworkName);
1548 }
1549
Argyrios Kyrtzidisb146baa2013-03-13 21:13:51 +00001550 if (d != End) {
Justin Bogner57ba0b22014-03-28 22:03:24 +00001551 uint32_t LocalSMID = endian::readNext<uint32_t, little, unaligned>(d);
Argyrios Kyrtzidisb146baa2013-03-13 21:13:51 +00001552 if (LocalSMID) {
1553 // This header is part of a module. Associate it with the module to enable
1554 // implicit module import.
1555 SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID);
1556 Module *Mod = Reader.getSubmodule(GlobalSMID);
1557 HFI.isModuleHeader = true;
1558 FileManager &FileMgr = Reader.getFileManager();
1559 ModuleMap &ModMap =
1560 Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap();
Richard Smith7ed1bc92014-12-05 22:42:13 +00001561 // FIXME: This information should be propagated through the
1562 // SUBMODULE_HEADER etc records rather than from here.
Richard Smith3c1a41a2014-12-02 00:08:08 +00001563 // FIXME: We don't ever mark excluded headers.
Richard Smith7ed1bc92014-12-05 22:42:13 +00001564 std::string Filename = key.Filename;
1565 if (key.Imported)
1566 Reader.ResolveImportedPath(M, Filename);
1567 Module::Header H = { key.Filename, FileMgr.getFile(Filename) };
Hans Wennborg0101b542014-12-02 02:13:09 +00001568 ModMap.addHeader(Mod, H, HFI.getHeaderRole());
Argyrios Kyrtzidisb146baa2013-03-13 21:13:51 +00001569 }
1570 }
1571
Guy Benyei11169dd2012-12-18 14:30:41 +00001572 assert(End == d && "Wrong data length in HeaderFileInfo deserialization");
1573 (void)End;
1574
1575 // This HeaderFileInfo was externally loaded.
1576 HFI.External = true;
1577 return HFI;
1578}
1579
Richard Smithd7329392015-04-21 21:46:32 +00001580void ASTReader::addPendingMacro(IdentifierInfo *II,
1581 ModuleFile *M,
1582 uint64_t MacroDirectivesOffset) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001583 assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard");
1584 PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset));
Guy Benyei11169dd2012-12-18 14:30:41 +00001585}
1586
1587void ASTReader::ReadDefinedMacros() {
1588 // Note that we are loading defined macros.
1589 Deserializing Macros(this);
1590
1591 for (ModuleReverseIterator I = ModuleMgr.rbegin(),
1592 E = ModuleMgr.rend(); I != E; ++I) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001593 BitstreamCursor &MacroCursor = (*I)->MacroCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00001594
1595 // If there was no preprocessor block, skip this file.
1596 if (!MacroCursor.getBitStreamReader())
1597 continue;
1598
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001599 BitstreamCursor Cursor = MacroCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00001600 Cursor.JumpToBit((*I)->MacroStartOffset);
1601
1602 RecordData Record;
1603 while (true) {
Chris Lattnere7b154b2013-01-19 21:39:22 +00001604 llvm::BitstreamEntry E = Cursor.advanceSkippingSubblocks();
1605
1606 switch (E.Kind) {
1607 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1608 case llvm::BitstreamEntry::Error:
1609 Error("malformed block record in AST file");
1610 return;
1611 case llvm::BitstreamEntry::EndBlock:
1612 goto NextCursor;
1613
1614 case llvm::BitstreamEntry::Record:
Chris Lattnere7b154b2013-01-19 21:39:22 +00001615 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00001616 switch (Cursor.readRecord(E.ID, Record)) {
Chris Lattnere7b154b2013-01-19 21:39:22 +00001617 default: // Default behavior: ignore.
1618 break;
1619
1620 case PP_MACRO_OBJECT_LIKE:
1621 case PP_MACRO_FUNCTION_LIKE:
1622 getLocalIdentifier(**I, Record[0]);
1623 break;
1624
1625 case PP_TOKEN:
1626 // Ignore tokens.
1627 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00001628 }
Guy Benyei11169dd2012-12-18 14:30:41 +00001629 break;
1630 }
1631 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00001632 NextCursor: ;
Guy Benyei11169dd2012-12-18 14:30:41 +00001633 }
1634}
1635
1636namespace {
1637 /// \brief Visitor class used to look up identifirs in an AST file.
1638 class IdentifierLookupVisitor {
1639 StringRef Name;
1640 unsigned PriorGeneration;
Douglas Gregor00a50f72013-01-25 00:38:33 +00001641 unsigned &NumIdentifierLookups;
1642 unsigned &NumIdentifierLookupHits;
Guy Benyei11169dd2012-12-18 14:30:41 +00001643 IdentifierInfo *Found;
Douglas Gregor00a50f72013-01-25 00:38:33 +00001644
Guy Benyei11169dd2012-12-18 14:30:41 +00001645 public:
Douglas Gregor00a50f72013-01-25 00:38:33 +00001646 IdentifierLookupVisitor(StringRef Name, unsigned PriorGeneration,
1647 unsigned &NumIdentifierLookups,
1648 unsigned &NumIdentifierLookupHits)
Douglas Gregor7211ac12013-01-25 23:32:03 +00001649 : Name(Name), PriorGeneration(PriorGeneration),
Douglas Gregor00a50f72013-01-25 00:38:33 +00001650 NumIdentifierLookups(NumIdentifierLookups),
1651 NumIdentifierLookupHits(NumIdentifierLookupHits),
1652 Found()
1653 {
1654 }
Guy Benyei11169dd2012-12-18 14:30:41 +00001655
1656 static bool visit(ModuleFile &M, void *UserData) {
1657 IdentifierLookupVisitor *This
1658 = static_cast<IdentifierLookupVisitor *>(UserData);
1659
1660 // If we've already searched this module file, skip it now.
1661 if (M.Generation <= This->PriorGeneration)
1662 return true;
Douglas Gregore060e572013-01-25 01:03:03 +00001663
Guy Benyei11169dd2012-12-18 14:30:41 +00001664 ASTIdentifierLookupTable *IdTable
1665 = (ASTIdentifierLookupTable *)M.IdentifierLookupTable;
1666 if (!IdTable)
1667 return false;
1668
1669 ASTIdentifierLookupTrait Trait(IdTable->getInfoObj().getReader(),
1670 M, This->Found);
Douglas Gregor00a50f72013-01-25 00:38:33 +00001671 ++This->NumIdentifierLookups;
1672 ASTIdentifierLookupTable::iterator Pos = IdTable->find(This->Name,&Trait);
Guy Benyei11169dd2012-12-18 14:30:41 +00001673 if (Pos == IdTable->end())
1674 return false;
1675
1676 // Dereferencing the iterator has the effect of building the
1677 // IdentifierInfo node and populating it with the various
1678 // declarations it needs.
Douglas Gregor00a50f72013-01-25 00:38:33 +00001679 ++This->NumIdentifierLookupHits;
Guy Benyei11169dd2012-12-18 14:30:41 +00001680 This->Found = *Pos;
1681 return true;
1682 }
1683
1684 // \brief Retrieve the identifier info found within the module
1685 // files.
1686 IdentifierInfo *getIdentifierInfo() const { return Found; }
1687 };
1688}
1689
1690void ASTReader::updateOutOfDateIdentifier(IdentifierInfo &II) {
1691 // Note that we are loading an identifier.
1692 Deserializing AnIdentifier(this);
1693
1694 unsigned PriorGeneration = 0;
1695 if (getContext().getLangOpts().Modules)
1696 PriorGeneration = IdentifierGeneration[&II];
Douglas Gregore060e572013-01-25 01:03:03 +00001697
1698 // If there is a global index, look there first to determine which modules
1699 // provably do not have any results for this identifier.
Douglas Gregor7211ac12013-01-25 23:32:03 +00001700 GlobalModuleIndex::HitSet Hits;
Craig Toppera13603a2014-05-22 05:54:18 +00001701 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
Douglas Gregore060e572013-01-25 01:03:03 +00001702 if (!loadGlobalIndex()) {
Douglas Gregor7211ac12013-01-25 23:32:03 +00001703 if (GlobalIndex->lookupIdentifier(II.getName(), Hits)) {
1704 HitsPtr = &Hits;
Douglas Gregore060e572013-01-25 01:03:03 +00001705 }
1706 }
1707
Douglas Gregor7211ac12013-01-25 23:32:03 +00001708 IdentifierLookupVisitor Visitor(II.getName(), PriorGeneration,
Douglas Gregor00a50f72013-01-25 00:38:33 +00001709 NumIdentifierLookups,
1710 NumIdentifierLookupHits);
Douglas Gregor7211ac12013-01-25 23:32:03 +00001711 ModuleMgr.visit(IdentifierLookupVisitor::visit, &Visitor, HitsPtr);
Guy Benyei11169dd2012-12-18 14:30:41 +00001712 markIdentifierUpToDate(&II);
1713}
1714
1715void ASTReader::markIdentifierUpToDate(IdentifierInfo *II) {
1716 if (!II)
1717 return;
1718
1719 II->setOutOfDate(false);
1720
1721 // Update the generation for this identifier.
1722 if (getContext().getLangOpts().Modules)
Richard Smith053f6c62014-05-16 23:01:30 +00001723 IdentifierGeneration[II] = getGeneration();
Guy Benyei11169dd2012-12-18 14:30:41 +00001724}
1725
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001726void ASTReader::resolvePendingMacro(IdentifierInfo *II,
1727 const PendingMacroInfo &PMInfo) {
Richard Smithd7329392015-04-21 21:46:32 +00001728 ModuleFile &M = *PMInfo.M;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001729
1730 BitstreamCursor &Cursor = M.MacroCursor;
1731 SavedStreamPosition SavedPosition(Cursor);
Richard Smithd7329392015-04-21 21:46:32 +00001732 Cursor.JumpToBit(PMInfo.MacroDirectivesOffset);
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001733
Richard Smith713369b2015-04-23 20:40:50 +00001734 struct ModuleMacroRecord {
1735 SubmoduleID SubModID;
1736 MacroInfo *MI;
1737 SmallVector<SubmoduleID, 8> Overrides;
1738 };
1739 llvm::SmallVector<ModuleMacroRecord, 8> ModuleMacros;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001740
Richard Smithd7329392015-04-21 21:46:32 +00001741 // We expect to see a sequence of PP_MODULE_MACRO records listing exported
1742 // macros, followed by a PP_MACRO_DIRECTIVE_HISTORY record with the complete
1743 // macro histroy.
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001744 RecordData Record;
Richard Smithd7329392015-04-21 21:46:32 +00001745 while (true) {
1746 llvm::BitstreamEntry Entry =
1747 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
1748 if (Entry.Kind != llvm::BitstreamEntry::Record) {
1749 Error("malformed block record in AST file");
1750 return;
1751 }
1752
1753 Record.clear();
Aaron Ballmanc75a1922015-04-22 15:25:05 +00001754 switch ((PreprocessorRecordTypes)Cursor.readRecord(Entry.ID, Record)) {
Richard Smithd7329392015-04-21 21:46:32 +00001755 case PP_MACRO_DIRECTIVE_HISTORY:
1756 break;
1757
1758 case PP_MODULE_MACRO: {
Richard Smith713369b2015-04-23 20:40:50 +00001759 ModuleMacros.push_back(ModuleMacroRecord());
1760 auto &Info = ModuleMacros.back();
Richard Smithe56c8bc2015-04-22 00:26:11 +00001761 Info.SubModID = getGlobalSubmoduleID(M, Record[0]);
1762 Info.MI = getMacro(getGlobalMacroID(M, Record[1]));
Richard Smith713369b2015-04-23 20:40:50 +00001763 for (int I = 2, N = Record.size(); I != N; ++I)
1764 Info.Overrides.push_back(getGlobalSubmoduleID(M, Record[I]));
Richard Smithd7329392015-04-21 21:46:32 +00001765 continue;
1766 }
1767
1768 default:
1769 Error("malformed block record in AST file");
1770 return;
1771 }
1772
1773 // We found the macro directive history; that's the last record
1774 // for this macro.
1775 break;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001776 }
1777
Richard Smithd7329392015-04-21 21:46:32 +00001778 // Module macros are listed in reverse dependency order.
Richard Smithe56c8bc2015-04-22 00:26:11 +00001779 {
1780 std::reverse(ModuleMacros.begin(), ModuleMacros.end());
Richard Smithe56c8bc2015-04-22 00:26:11 +00001781 llvm::SmallVector<ModuleMacro*, 8> Overrides;
Richard Smith713369b2015-04-23 20:40:50 +00001782 for (auto &MMR : ModuleMacros) {
Richard Smithe56c8bc2015-04-22 00:26:11 +00001783 Overrides.clear();
Richard Smith713369b2015-04-23 20:40:50 +00001784 for (unsigned ModID : MMR.Overrides) {
Richard Smithb8b2ed62015-04-23 18:18:26 +00001785 Module *Mod = getSubmodule(ModID);
1786 auto *Macro = PP.getModuleMacro(Mod, II);
Richard Smithe56c8bc2015-04-22 00:26:11 +00001787 assert(Macro && "missing definition for overridden macro");
Richard Smith5dbef922015-04-22 02:09:43 +00001788 Overrides.push_back(Macro);
Richard Smithe56c8bc2015-04-22 00:26:11 +00001789 }
1790
1791 bool Inserted = false;
Richard Smith713369b2015-04-23 20:40:50 +00001792 Module *Owner = getSubmodule(MMR.SubModID);
Richard Smith20e883e2015-04-29 23:20:19 +00001793 PP.addModuleMacro(Owner, II, MMR.MI, Overrides, Inserted);
Richard Smithd7329392015-04-21 21:46:32 +00001794 }
1795 }
1796
1797 // Don't read the directive history for a module; we don't have anywhere
1798 // to put it.
1799 if (M.Kind == MK_ImplicitModule || M.Kind == MK_ExplicitModule)
1800 return;
1801
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001802 // Deserialize the macro directives history in reverse source-order.
Craig Toppera13603a2014-05-22 05:54:18 +00001803 MacroDirective *Latest = nullptr, *Earliest = nullptr;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001804 unsigned Idx = 0, N = Record.size();
1805 while (Idx < N) {
Craig Toppera13603a2014-05-22 05:54:18 +00001806 MacroDirective *MD = nullptr;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001807 SourceLocation Loc = ReadSourceLocation(M, Record, Idx);
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00001808 MacroDirective::Kind K = (MacroDirective::Kind)Record[Idx++];
1809 switch (K) {
1810 case MacroDirective::MD_Define: {
Richard Smith713369b2015-04-23 20:40:50 +00001811 MacroInfo *MI = getMacro(getGlobalMacroID(M, Record[Idx++]));
Richard Smith3981b172015-04-30 02:16:23 +00001812 MD = PP.AllocateDefMacroDirective(MI, Loc);
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00001813 break;
1814 }
Richard Smithdaa69e02014-07-25 04:40:03 +00001815 case MacroDirective::MD_Undefine: {
Richard Smith3981b172015-04-30 02:16:23 +00001816 MD = PP.AllocateUndefMacroDirective(Loc);
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00001817 break;
Richard Smithdaa69e02014-07-25 04:40:03 +00001818 }
1819 case MacroDirective::MD_Visibility:
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00001820 bool isPublic = Record[Idx++];
1821 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic);
1822 break;
1823 }
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001824
1825 if (!Latest)
1826 Latest = MD;
1827 if (Earliest)
1828 Earliest->setPrevious(MD);
1829 Earliest = MD;
1830 }
1831
1832 PP.setLoadedMacroDirective(II, Latest);
1833}
1834
Argyrios Kyrtzidisce9b49e2014-03-14 02:26:27 +00001835ASTReader::InputFileInfo
1836ASTReader::readInputFileInfo(ModuleFile &F, unsigned ID) {
Ben Langmuir198c1682014-03-07 07:27:49 +00001837 // Go find this input file.
1838 BitstreamCursor &Cursor = F.InputFilesCursor;
1839 SavedStreamPosition SavedPosition(Cursor);
1840 Cursor.JumpToBit(F.InputFileOffsets[ID-1]);
1841
1842 unsigned Code = Cursor.ReadCode();
1843 RecordData Record;
1844 StringRef Blob;
1845
1846 unsigned Result = Cursor.readRecord(Code, Record, &Blob);
1847 assert(static_cast<InputFileRecordTypes>(Result) == INPUT_FILE &&
1848 "invalid record type for input file");
1849 (void)Result;
1850
Argyrios Kyrtzidisce9b49e2014-03-14 02:26:27 +00001851 std::string Filename;
1852 off_t StoredSize;
1853 time_t StoredTime;
1854 bool Overridden;
Richard Smith7ed1bc92014-12-05 22:42:13 +00001855
Ben Langmuir198c1682014-03-07 07:27:49 +00001856 assert(Record[0] == ID && "Bogus stored ID or offset");
1857 StoredSize = static_cast<off_t>(Record[1]);
1858 StoredTime = static_cast<time_t>(Record[2]);
1859 Overridden = static_cast<bool>(Record[3]);
1860 Filename = Blob;
Richard Smith7ed1bc92014-12-05 22:42:13 +00001861 ResolveImportedPath(F, Filename);
1862
Hans Wennborg73945142014-03-14 17:45:06 +00001863 InputFileInfo R = { std::move(Filename), StoredSize, StoredTime, Overridden };
1864 return R;
Ben Langmuir198c1682014-03-07 07:27:49 +00001865}
1866
1867std::string ASTReader::getInputFileName(ModuleFile &F, unsigned int ID) {
Argyrios Kyrtzidisce9b49e2014-03-14 02:26:27 +00001868 return readInputFileInfo(F, ID).Filename;
Ben Langmuir198c1682014-03-07 07:27:49 +00001869}
1870
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00001871InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001872 // If this ID is bogus, just return an empty input file.
1873 if (ID == 0 || ID > F.InputFilesLoaded.size())
1874 return InputFile();
1875
1876 // If we've already loaded this input file, return it.
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00001877 if (F.InputFilesLoaded[ID-1].getFile())
Guy Benyei11169dd2012-12-18 14:30:41 +00001878 return F.InputFilesLoaded[ID-1];
1879
Argyrios Kyrtzidis9308f0a2014-01-08 19:13:34 +00001880 if (F.InputFilesLoaded[ID-1].isNotFound())
1881 return InputFile();
1882
Guy Benyei11169dd2012-12-18 14:30:41 +00001883 // Go find this input file.
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001884 BitstreamCursor &Cursor = F.InputFilesCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00001885 SavedStreamPosition SavedPosition(Cursor);
1886 Cursor.JumpToBit(F.InputFileOffsets[ID-1]);
1887
Argyrios Kyrtzidisce9b49e2014-03-14 02:26:27 +00001888 InputFileInfo FI = readInputFileInfo(F, ID);
1889 off_t StoredSize = FI.StoredSize;
1890 time_t StoredTime = FI.StoredTime;
1891 bool Overridden = FI.Overridden;
1892 StringRef Filename = FI.Filename;
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00001893
Ben Langmuir198c1682014-03-07 07:27:49 +00001894 const FileEntry *File
1895 = Overridden? FileMgr.getVirtualFile(Filename, StoredSize, StoredTime)
1896 : FileMgr.getFile(Filename, /*OpenFile=*/false);
1897
1898 // If we didn't find the file, resolve it relative to the
1899 // original directory from which this AST file was created.
Craig Toppera13603a2014-05-22 05:54:18 +00001900 if (File == nullptr && !F.OriginalDir.empty() && !CurrentDir.empty() &&
Ben Langmuir198c1682014-03-07 07:27:49 +00001901 F.OriginalDir != CurrentDir) {
1902 std::string Resolved = resolveFileRelativeToOriginalDir(Filename,
1903 F.OriginalDir,
1904 CurrentDir);
1905 if (!Resolved.empty())
1906 File = FileMgr.getFile(Resolved);
1907 }
1908
1909 // For an overridden file, create a virtual file with the stored
1910 // size/timestamp.
Craig Toppera13603a2014-05-22 05:54:18 +00001911 if (Overridden && File == nullptr) {
Ben Langmuir198c1682014-03-07 07:27:49 +00001912 File = FileMgr.getVirtualFile(Filename, StoredSize, StoredTime);
1913 }
1914
Craig Toppera13603a2014-05-22 05:54:18 +00001915 if (File == nullptr) {
Ben Langmuir198c1682014-03-07 07:27:49 +00001916 if (Complain) {
1917 std::string ErrorStr = "could not find file '";
1918 ErrorStr += Filename;
1919 ErrorStr += "' referenced by AST file";
1920 Error(ErrorStr.c_str());
Guy Benyei11169dd2012-12-18 14:30:41 +00001921 }
Ben Langmuir198c1682014-03-07 07:27:49 +00001922 // Record that we didn't find the file.
1923 F.InputFilesLoaded[ID-1] = InputFile::getNotFound();
1924 return InputFile();
1925 }
Guy Benyei11169dd2012-12-18 14:30:41 +00001926
Ben Langmuir198c1682014-03-07 07:27:49 +00001927 // Check if there was a request to override the contents of the file
1928 // that was part of the precompiled header. Overridding such a file
1929 // can lead to problems when lexing using the source locations from the
1930 // PCH.
1931 SourceManager &SM = getSourceManager();
1932 if (!Overridden && SM.isFileOverridden(File)) {
1933 if (Complain)
1934 Error(diag::err_fe_pch_file_overridden, Filename);
1935 // After emitting the diagnostic, recover by disabling the override so
1936 // that the original file will be used.
1937 SM.disableFileContentsOverride(File);
1938 // The FileEntry is a virtual file entry with the size of the contents
1939 // that would override the original contents. Set it to the original's
1940 // size/time.
1941 FileMgr.modifyFileEntry(const_cast<FileEntry*>(File),
1942 StoredSize, StoredTime);
1943 }
Guy Benyei11169dd2012-12-18 14:30:41 +00001944
Ben Langmuir198c1682014-03-07 07:27:49 +00001945 bool IsOutOfDate = false;
1946
1947 // For an overridden file, there is nothing to validate.
Richard Smith96fdab62014-10-28 16:24:08 +00001948 if (!Overridden && //
1949 (StoredSize != File->getSize() ||
1950#if defined(LLVM_ON_WIN32)
1951 false
1952#else
Ben Langmuir198c1682014-03-07 07:27:49 +00001953 // In our regression testing, the Windows file system seems to
1954 // have inconsistent modification times that sometimes
1955 // erroneously trigger this error-handling path.
Richard Smith96fdab62014-10-28 16:24:08 +00001956 //
1957 // This also happens in networked file systems, so disable this
1958 // check if validation is disabled or if we have an explicitly
1959 // built PCM file.
1960 //
1961 // FIXME: Should we also do this for PCH files? They could also
1962 // reasonably get shared across a network during a distributed build.
1963 (StoredTime != File->getModificationTime() && !DisableValidation &&
1964 F.Kind != MK_ExplicitModule)
Guy Benyei11169dd2012-12-18 14:30:41 +00001965#endif
Ben Langmuir198c1682014-03-07 07:27:49 +00001966 )) {
1967 if (Complain) {
1968 // Build a list of the PCH imports that got us here (in reverse).
1969 SmallVector<ModuleFile *, 4> ImportStack(1, &F);
1970 while (ImportStack.back()->ImportedBy.size() > 0)
1971 ImportStack.push_back(ImportStack.back()->ImportedBy[0]);
Ben Langmuire82630d2014-01-17 00:19:09 +00001972
Ben Langmuir198c1682014-03-07 07:27:49 +00001973 // The top-level PCH is stale.
1974 StringRef TopLevelPCHName(ImportStack.back()->FileName);
1975 Error(diag::err_fe_pch_file_modified, Filename, TopLevelPCHName);
Ben Langmuire82630d2014-01-17 00:19:09 +00001976
Ben Langmuir198c1682014-03-07 07:27:49 +00001977 // Print the import stack.
1978 if (ImportStack.size() > 1 && !Diags.isDiagnosticInFlight()) {
1979 Diag(diag::note_pch_required_by)
1980 << Filename << ImportStack[0]->FileName;
1981 for (unsigned I = 1; I < ImportStack.size(); ++I)
Ben Langmuire82630d2014-01-17 00:19:09 +00001982 Diag(diag::note_pch_required_by)
Ben Langmuir198c1682014-03-07 07:27:49 +00001983 << ImportStack[I-1]->FileName << ImportStack[I]->FileName;
Douglas Gregor7029ce12013-03-19 00:28:20 +00001984 }
1985
Ben Langmuir198c1682014-03-07 07:27:49 +00001986 if (!Diags.isDiagnosticInFlight())
1987 Diag(diag::note_pch_rebuild_required) << TopLevelPCHName;
Guy Benyei11169dd2012-12-18 14:30:41 +00001988 }
1989
Ben Langmuir198c1682014-03-07 07:27:49 +00001990 IsOutOfDate = true;
Guy Benyei11169dd2012-12-18 14:30:41 +00001991 }
1992
Ben Langmuir198c1682014-03-07 07:27:49 +00001993 InputFile IF = InputFile(File, Overridden, IsOutOfDate);
1994
1995 // Note that we've loaded this input file.
1996 F.InputFilesLoaded[ID-1] = IF;
1997 return IF;
Guy Benyei11169dd2012-12-18 14:30:41 +00001998}
1999
Richard Smith7ed1bc92014-12-05 22:42:13 +00002000/// \brief If we are loading a relocatable PCH or module file, and the filename
2001/// is not an absolute path, add the system or module root to the beginning of
2002/// the file name.
2003void ASTReader::ResolveImportedPath(ModuleFile &M, std::string &Filename) {
2004 // Resolve relative to the base directory, if we have one.
2005 if (!M.BaseDirectory.empty())
2006 return ResolveImportedPath(Filename, M.BaseDirectory);
Guy Benyei11169dd2012-12-18 14:30:41 +00002007}
2008
Richard Smith7ed1bc92014-12-05 22:42:13 +00002009void ASTReader::ResolveImportedPath(std::string &Filename, StringRef Prefix) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002010 if (Filename.empty() || llvm::sys::path::is_absolute(Filename))
2011 return;
2012
Richard Smith7ed1bc92014-12-05 22:42:13 +00002013 SmallString<128> Buffer;
2014 llvm::sys::path::append(Buffer, Prefix, Filename);
2015 Filename.assign(Buffer.begin(), Buffer.end());
Guy Benyei11169dd2012-12-18 14:30:41 +00002016}
2017
2018ASTReader::ASTReadResult
2019ASTReader::ReadControlBlock(ModuleFile &F,
Dmitri Gribenkof8579502013-01-12 19:30:44 +00002020 SmallVectorImpl<ImportedModule> &Loaded,
Ben Langmuirbeee15e2014-04-14 18:00:01 +00002021 const ModuleFile *ImportedBy,
Guy Benyei11169dd2012-12-18 14:30:41 +00002022 unsigned ClientLoadCapabilities) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00002023 BitstreamCursor &Stream = F.Stream;
Guy Benyei11169dd2012-12-18 14:30:41 +00002024
2025 if (Stream.EnterSubBlock(CONTROL_BLOCK_ID)) {
2026 Error("malformed block record in AST file");
2027 return Failure;
2028 }
2029
Richard Smith1e2cf0d2014-10-31 02:28:58 +00002030 // Should we allow the configuration of the module file to differ from the
2031 // configuration of the current translation unit in a compatible way?
2032 //
2033 // FIXME: Allow this for files explicitly specified with -include-pch too.
2034 bool AllowCompatibleConfigurationMismatch = F.Kind == MK_ExplicitModule;
2035
Guy Benyei11169dd2012-12-18 14:30:41 +00002036 // Read all of the records and blocks in the control block.
2037 RecordData Record;
Richard Smitha1825302014-10-23 22:18:29 +00002038 unsigned NumInputs = 0;
2039 unsigned NumUserInputs = 0;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002040 while (1) {
2041 llvm::BitstreamEntry Entry = Stream.advance();
2042
2043 switch (Entry.Kind) {
2044 case llvm::BitstreamEntry::Error:
2045 Error("malformed block record in AST file");
2046 return Failure;
Dmitri Gribenkof430da42014-02-12 10:33:14 +00002047 case llvm::BitstreamEntry::EndBlock: {
2048 // Validate input files.
2049 const HeaderSearchOptions &HSOpts =
2050 PP.getHeaderSearchInfo().getHeaderSearchOpts();
Ben Langmuircb69b572014-03-07 06:40:32 +00002051
Richard Smitha1825302014-10-23 22:18:29 +00002052 // All user input files reside at the index range [0, NumUserInputs), and
2053 // system input files reside at [NumUserInputs, NumInputs).
Ben Langmuiracb803e2014-11-10 22:13:10 +00002054 if (!DisableValidation) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002055 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
Ben Langmuircb69b572014-03-07 06:40:32 +00002056
Dmitri Gribenkof430da42014-02-12 10:33:14 +00002057 // If we are reading a module, we will create a verification timestamp,
2058 // so we verify all input files. Otherwise, verify only user input
2059 // files.
Ben Langmuircb69b572014-03-07 06:40:32 +00002060
2061 unsigned N = NumUserInputs;
2062 if (ValidateSystemInputs ||
Richard Smithe842a472014-10-22 02:05:46 +00002063 (HSOpts.ModulesValidateOncePerBuildSession &&
Ben Langmuiracb803e2014-11-10 22:13:10 +00002064 F.InputFilesValidationTimestamp <= HSOpts.BuildSessionTimestamp &&
Richard Smithe842a472014-10-22 02:05:46 +00002065 F.Kind == MK_ImplicitModule))
Ben Langmuircb69b572014-03-07 06:40:32 +00002066 N = NumInputs;
2067
Ben Langmuir3d4417c2014-02-07 17:31:11 +00002068 for (unsigned I = 0; I < N; ++I) {
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00002069 InputFile IF = getInputFile(F, I+1, Complain);
2070 if (!IF.getFile() || IF.isOutOfDate())
Guy Benyei11169dd2012-12-18 14:30:41 +00002071 return OutOfDate;
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00002072 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002073 }
Ben Langmuircb69b572014-03-07 06:40:32 +00002074
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +00002075 if (Listener)
2076 Listener->visitModuleFile(F.FileName);
2077
Ben Langmuircb69b572014-03-07 06:40:32 +00002078 if (Listener && Listener->needsInputFileVisitation()) {
2079 unsigned N = Listener->needsSystemInputFileVisitation() ? NumInputs
2080 : NumUserInputs;
Argyrios Kyrtzidis68ccbe02014-03-14 02:26:31 +00002081 for (unsigned I = 0; I < N; ++I) {
2082 bool IsSystem = I >= NumUserInputs;
2083 InputFileInfo FI = readInputFileInfo(F, I+1);
2084 Listener->visitInputFile(FI.Filename, IsSystem, FI.Overridden);
2085 }
Ben Langmuircb69b572014-03-07 06:40:32 +00002086 }
2087
Guy Benyei11169dd2012-12-18 14:30:41 +00002088 return Success;
Dmitri Gribenkof430da42014-02-12 10:33:14 +00002089 }
2090
Chris Lattnere7b154b2013-01-19 21:39:22 +00002091 case llvm::BitstreamEntry::SubBlock:
2092 switch (Entry.ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002093 case INPUT_FILES_BLOCK_ID:
2094 F.InputFilesCursor = Stream;
2095 if (Stream.SkipBlock() || // Skip with the main cursor
2096 // Read the abbreviations
2097 ReadBlockAbbrevs(F.InputFilesCursor, INPUT_FILES_BLOCK_ID)) {
2098 Error("malformed block record in AST file");
2099 return Failure;
2100 }
2101 continue;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002102
Guy Benyei11169dd2012-12-18 14:30:41 +00002103 default:
Chris Lattnere7b154b2013-01-19 21:39:22 +00002104 if (Stream.SkipBlock()) {
2105 Error("malformed block record in AST file");
2106 return Failure;
2107 }
2108 continue;
Guy Benyei11169dd2012-12-18 14:30:41 +00002109 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00002110
2111 case llvm::BitstreamEntry::Record:
2112 // The interesting case.
2113 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00002114 }
2115
2116 // Read and process a record.
2117 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00002118 StringRef Blob;
2119 switch ((ControlRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002120 case METADATA: {
2121 if (Record[0] != VERSION_MAJOR && !DisableValidation) {
2122 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
Dmitri Gribenko2228cd32014-02-11 15:40:09 +00002123 Diag(Record[0] < VERSION_MAJOR? diag::err_pch_version_too_old
2124 : diag::err_pch_version_too_new);
Guy Benyei11169dd2012-12-18 14:30:41 +00002125 return VersionMismatch;
2126 }
2127
2128 bool hasErrors = Record[5];
2129 if (hasErrors && !DisableValidation && !AllowASTWithCompilerErrors) {
2130 Diag(diag::err_pch_with_compiler_errors);
2131 return HadErrors;
2132 }
2133
2134 F.RelocatablePCH = Record[4];
Richard Smith7ed1bc92014-12-05 22:42:13 +00002135 // Relative paths in a relocatable PCH are relative to our sysroot.
2136 if (F.RelocatablePCH)
2137 F.BaseDirectory = isysroot.empty() ? "/" : isysroot;
Guy Benyei11169dd2012-12-18 14:30:41 +00002138
2139 const std::string &CurBranch = getClangFullRepositoryVersion();
Chris Lattner0e6c9402013-01-20 02:38:54 +00002140 StringRef ASTBranch = Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00002141 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) {
2142 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
Dmitri Gribenko2228cd32014-02-11 15:40:09 +00002143 Diag(diag::err_pch_different_branch) << ASTBranch << CurBranch;
Guy Benyei11169dd2012-12-18 14:30:41 +00002144 return VersionMismatch;
2145 }
2146 break;
2147 }
2148
Ben Langmuir487ea142014-10-23 18:05:36 +00002149 case SIGNATURE:
2150 assert((!F.Signature || F.Signature == Record[0]) && "signature changed");
2151 F.Signature = Record[0];
2152 break;
2153
Guy Benyei11169dd2012-12-18 14:30:41 +00002154 case IMPORTS: {
2155 // Load each of the imported PCH files.
2156 unsigned Idx = 0, N = Record.size();
2157 while (Idx < N) {
2158 // Read information about the AST file.
2159 ModuleKind ImportedKind = (ModuleKind)Record[Idx++];
2160 // The import location will be the local one for now; we will adjust
2161 // all import locations of module imports after the global source
2162 // location info are setup.
2163 SourceLocation ImportLoc =
2164 SourceLocation::getFromRawEncoding(Record[Idx++]);
Douglas Gregor7029ce12013-03-19 00:28:20 +00002165 off_t StoredSize = (off_t)Record[Idx++];
2166 time_t StoredModTime = (time_t)Record[Idx++];
Ben Langmuir487ea142014-10-23 18:05:36 +00002167 ASTFileSignature StoredSignature = Record[Idx++];
Richard Smith7ed1bc92014-12-05 22:42:13 +00002168 auto ImportedFile = ReadPath(F, Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00002169
2170 // Load the AST file.
2171 switch(ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F, Loaded,
Ben Langmuir487ea142014-10-23 18:05:36 +00002172 StoredSize, StoredModTime, StoredSignature,
Guy Benyei11169dd2012-12-18 14:30:41 +00002173 ClientLoadCapabilities)) {
2174 case Failure: return Failure;
2175 // If we have to ignore the dependency, we'll have to ignore this too.
Douglas Gregor2f1806e2013-03-19 00:38:50 +00002176 case Missing:
Guy Benyei11169dd2012-12-18 14:30:41 +00002177 case OutOfDate: return OutOfDate;
2178 case VersionMismatch: return VersionMismatch;
2179 case ConfigurationMismatch: return ConfigurationMismatch;
2180 case HadErrors: return HadErrors;
2181 case Success: break;
2182 }
2183 }
2184 break;
2185 }
2186
Richard Smith7f330cd2015-03-18 01:42:29 +00002187 case KNOWN_MODULE_FILES:
2188 break;
2189
Guy Benyei11169dd2012-12-18 14:30:41 +00002190 case LANGUAGE_OPTIONS: {
2191 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
Richard Smith1e2cf0d2014-10-31 02:28:58 +00002192 // FIXME: The &F == *ModuleMgr.begin() check is wrong for modules.
Guy Benyei11169dd2012-12-18 14:30:41 +00002193 if (Listener && &F == *ModuleMgr.begin() &&
Richard Smith1e2cf0d2014-10-31 02:28:58 +00002194 ParseLanguageOptions(Record, Complain, *Listener,
2195 AllowCompatibleConfigurationMismatch) &&
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002196 !DisableValidation && !AllowConfigurationMismatch)
Guy Benyei11169dd2012-12-18 14:30:41 +00002197 return ConfigurationMismatch;
2198 break;
2199 }
2200
2201 case TARGET_OPTIONS: {
2202 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
2203 if (Listener && &F == *ModuleMgr.begin() &&
Chandler Carruth0d745bc2015-03-14 04:47:43 +00002204 ParseTargetOptions(Record, Complain, *Listener,
2205 AllowCompatibleConfigurationMismatch) &&
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002206 !DisableValidation && !AllowConfigurationMismatch)
Guy Benyei11169dd2012-12-18 14:30:41 +00002207 return ConfigurationMismatch;
2208 break;
2209 }
2210
2211 case DIAGNOSTIC_OPTIONS: {
Ben Langmuirb92de022014-04-29 16:25:26 +00002212 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate)==0;
Guy Benyei11169dd2012-12-18 14:30:41 +00002213 if (Listener && &F == *ModuleMgr.begin() &&
Richard Smith1e2cf0d2014-10-31 02:28:58 +00002214 !AllowCompatibleConfigurationMismatch &&
Guy Benyei11169dd2012-12-18 14:30:41 +00002215 ParseDiagnosticOptions(Record, Complain, *Listener) &&
Ben Langmuirb92de022014-04-29 16:25:26 +00002216 !DisableValidation)
2217 return OutOfDate;
Guy Benyei11169dd2012-12-18 14:30:41 +00002218 break;
2219 }
2220
2221 case FILE_SYSTEM_OPTIONS: {
2222 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
2223 if (Listener && &F == *ModuleMgr.begin() &&
Richard Smith1e2cf0d2014-10-31 02:28:58 +00002224 !AllowCompatibleConfigurationMismatch &&
Guy Benyei11169dd2012-12-18 14:30:41 +00002225 ParseFileSystemOptions(Record, Complain, *Listener) &&
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002226 !DisableValidation && !AllowConfigurationMismatch)
Guy Benyei11169dd2012-12-18 14:30:41 +00002227 return ConfigurationMismatch;
2228 break;
2229 }
2230
2231 case HEADER_SEARCH_OPTIONS: {
2232 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
2233 if (Listener && &F == *ModuleMgr.begin() &&
Richard Smith1e2cf0d2014-10-31 02:28:58 +00002234 !AllowCompatibleConfigurationMismatch &&
Guy Benyei11169dd2012-12-18 14:30:41 +00002235 ParseHeaderSearchOptions(Record, Complain, *Listener) &&
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002236 !DisableValidation && !AllowConfigurationMismatch)
Guy Benyei11169dd2012-12-18 14:30:41 +00002237 return ConfigurationMismatch;
2238 break;
2239 }
2240
2241 case PREPROCESSOR_OPTIONS: {
2242 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
2243 if (Listener && &F == *ModuleMgr.begin() &&
Richard Smith1e2cf0d2014-10-31 02:28:58 +00002244 !AllowCompatibleConfigurationMismatch &&
Guy Benyei11169dd2012-12-18 14:30:41 +00002245 ParsePreprocessorOptions(Record, Complain, *Listener,
2246 SuggestedPredefines) &&
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002247 !DisableValidation && !AllowConfigurationMismatch)
Guy Benyei11169dd2012-12-18 14:30:41 +00002248 return ConfigurationMismatch;
2249 break;
2250 }
2251
2252 case ORIGINAL_FILE:
2253 F.OriginalSourceFileID = FileID::get(Record[0]);
Chris Lattner0e6c9402013-01-20 02:38:54 +00002254 F.ActualOriginalSourceFileName = Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00002255 F.OriginalSourceFileName = F.ActualOriginalSourceFileName;
Richard Smith7ed1bc92014-12-05 22:42:13 +00002256 ResolveImportedPath(F, F.OriginalSourceFileName);
Guy Benyei11169dd2012-12-18 14:30:41 +00002257 break;
2258
2259 case ORIGINAL_FILE_ID:
2260 F.OriginalSourceFileID = FileID::get(Record[0]);
2261 break;
2262
2263 case ORIGINAL_PCH_DIR:
Chris Lattner0e6c9402013-01-20 02:38:54 +00002264 F.OriginalDir = Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00002265 break;
2266
Ben Langmuirbeee15e2014-04-14 18:00:01 +00002267 case MODULE_NAME:
2268 F.ModuleName = Blob;
Ben Langmuir4f5212a2014-04-14 22:12:44 +00002269 if (Listener)
2270 Listener->ReadModuleName(F.ModuleName);
Ben Langmuirbeee15e2014-04-14 18:00:01 +00002271 break;
2272
Richard Smith223d3f22014-12-06 03:21:08 +00002273 case MODULE_DIRECTORY: {
2274 assert(!F.ModuleName.empty() &&
2275 "MODULE_DIRECTORY found before MODULE_NAME");
2276 // If we've already loaded a module map file covering this module, we may
2277 // have a better path for it (relative to the current build).
2278 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName);
2279 if (M && M->Directory) {
2280 // If we're implicitly loading a module, the base directory can't
2281 // change between the build and use.
2282 if (F.Kind != MK_ExplicitModule) {
2283 const DirectoryEntry *BuildDir =
2284 PP.getFileManager().getDirectory(Blob);
2285 if (!BuildDir || BuildDir != M->Directory) {
2286 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
2287 Diag(diag::err_imported_module_relocated)
2288 << F.ModuleName << Blob << M->Directory->getName();
2289 return OutOfDate;
2290 }
2291 }
2292 F.BaseDirectory = M->Directory->getName();
2293 } else {
2294 F.BaseDirectory = Blob;
2295 }
Richard Smith7ed1bc92014-12-05 22:42:13 +00002296 break;
Richard Smith223d3f22014-12-06 03:21:08 +00002297 }
Richard Smith7ed1bc92014-12-05 22:42:13 +00002298
Ben Langmuirbeee15e2014-04-14 18:00:01 +00002299 case MODULE_MAP_FILE:
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00002300 if (ASTReadResult Result =
2301 ReadModuleMapFileBlock(Record, F, ImportedBy, ClientLoadCapabilities))
2302 return Result;
Ben Langmuir264ea152014-11-08 00:06:39 +00002303 break;
2304
Guy Benyei11169dd2012-12-18 14:30:41 +00002305 case INPUT_FILE_OFFSETS:
Richard Smitha1825302014-10-23 22:18:29 +00002306 NumInputs = Record[0];
2307 NumUserInputs = Record[1];
Richard Smithec216502015-02-13 19:48:37 +00002308 F.InputFileOffsets = (const uint64_t *)Blob.data();
Richard Smitha1825302014-10-23 22:18:29 +00002309 F.InputFilesLoaded.resize(NumInputs);
Guy Benyei11169dd2012-12-18 14:30:41 +00002310 break;
2311 }
2312 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002313}
2314
Ben Langmuir2c9af442014-04-10 17:57:43 +00002315ASTReader::ASTReadResult
2316ASTReader::ReadASTBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00002317 BitstreamCursor &Stream = F.Stream;
Guy Benyei11169dd2012-12-18 14:30:41 +00002318
2319 if (Stream.EnterSubBlock(AST_BLOCK_ID)) {
2320 Error("malformed block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002321 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002322 }
2323
2324 // Read all of the records and blocks for the AST file.
2325 RecordData Record;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002326 while (1) {
2327 llvm::BitstreamEntry Entry = Stream.advance();
2328
2329 switch (Entry.Kind) {
2330 case llvm::BitstreamEntry::Error:
2331 Error("error at end of module block in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002332 return Failure;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002333 case llvm::BitstreamEntry::EndBlock: {
Richard Smithc0fbba72013-04-03 22:49:41 +00002334 // Outside of C++, we do not store a lookup map for the translation unit.
2335 // Instead, mark it as needing a lookup map to be built if this module
2336 // contains any declarations lexically within it (which it always does!).
2337 // This usually has no cost, since we very rarely need the lookup map for
2338 // the translation unit outside C++.
Guy Benyei11169dd2012-12-18 14:30:41 +00002339 DeclContext *DC = Context.getTranslationUnitDecl();
Richard Smithc0fbba72013-04-03 22:49:41 +00002340 if (DC->hasExternalLexicalStorage() &&
2341 !getContext().getLangOpts().CPlusPlus)
Guy Benyei11169dd2012-12-18 14:30:41 +00002342 DC->setMustBuildLookupTable();
Chris Lattnere7b154b2013-01-19 21:39:22 +00002343
Ben Langmuir2c9af442014-04-10 17:57:43 +00002344 return Success;
Guy Benyei11169dd2012-12-18 14:30:41 +00002345 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00002346 case llvm::BitstreamEntry::SubBlock:
2347 switch (Entry.ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002348 case DECLTYPES_BLOCK_ID:
2349 // We lazily load the decls block, but we want to set up the
2350 // DeclsCursor cursor to point into it. Clone our current bitcode
2351 // cursor to it, enter the block and read the abbrevs in that block.
2352 // With the main cursor, we just skip over it.
2353 F.DeclsCursor = Stream;
2354 if (Stream.SkipBlock() || // Skip with the main cursor.
2355 // Read the abbrevs.
2356 ReadBlockAbbrevs(F.DeclsCursor, DECLTYPES_BLOCK_ID)) {
2357 Error("malformed block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002358 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002359 }
2360 break;
Richard Smithb9eab6d2014-03-20 19:44:17 +00002361
Guy Benyei11169dd2012-12-18 14:30:41 +00002362 case PREPROCESSOR_BLOCK_ID:
2363 F.MacroCursor = Stream;
2364 if (!PP.getExternalSource())
2365 PP.setExternalSource(this);
Chris Lattnere7b154b2013-01-19 21:39:22 +00002366
Guy Benyei11169dd2012-12-18 14:30:41 +00002367 if (Stream.SkipBlock() ||
2368 ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID)) {
2369 Error("malformed block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002370 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002371 }
2372 F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo();
2373 break;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002374
Guy Benyei11169dd2012-12-18 14:30:41 +00002375 case PREPROCESSOR_DETAIL_BLOCK_ID:
2376 F.PreprocessorDetailCursor = Stream;
2377 if (Stream.SkipBlock() ||
Chris Lattnere7b154b2013-01-19 21:39:22 +00002378 ReadBlockAbbrevs(F.PreprocessorDetailCursor,
Guy Benyei11169dd2012-12-18 14:30:41 +00002379 PREPROCESSOR_DETAIL_BLOCK_ID)) {
Chris Lattnere7b154b2013-01-19 21:39:22 +00002380 Error("malformed preprocessor detail record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002381 return Failure;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002382 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002383 F.PreprocessorDetailStartOffset
Chris Lattnere7b154b2013-01-19 21:39:22 +00002384 = F.PreprocessorDetailCursor.GetCurrentBitNo();
2385
Guy Benyei11169dd2012-12-18 14:30:41 +00002386 if (!PP.getPreprocessingRecord())
2387 PP.createPreprocessingRecord();
2388 if (!PP.getPreprocessingRecord()->getExternalSource())
2389 PP.getPreprocessingRecord()->SetExternalSource(*this);
2390 break;
2391
2392 case SOURCE_MANAGER_BLOCK_ID:
2393 if (ReadSourceManagerBlock(F))
Ben Langmuir2c9af442014-04-10 17:57:43 +00002394 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002395 break;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002396
Guy Benyei11169dd2012-12-18 14:30:41 +00002397 case SUBMODULE_BLOCK_ID:
Ben Langmuir2c9af442014-04-10 17:57:43 +00002398 if (ASTReadResult Result = ReadSubmoduleBlock(F, ClientLoadCapabilities))
2399 return Result;
Guy Benyei11169dd2012-12-18 14:30:41 +00002400 break;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002401
Guy Benyei11169dd2012-12-18 14:30:41 +00002402 case COMMENTS_BLOCK_ID: {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00002403 BitstreamCursor C = Stream;
Guy Benyei11169dd2012-12-18 14:30:41 +00002404 if (Stream.SkipBlock() ||
2405 ReadBlockAbbrevs(C, COMMENTS_BLOCK_ID)) {
2406 Error("malformed comments block in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002407 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002408 }
2409 CommentsCursors.push_back(std::make_pair(C, &F));
2410 break;
2411 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00002412
Guy Benyei11169dd2012-12-18 14:30:41 +00002413 default:
Chris Lattnere7b154b2013-01-19 21:39:22 +00002414 if (Stream.SkipBlock()) {
2415 Error("malformed block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002416 return Failure;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002417 }
2418 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00002419 }
2420 continue;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002421
2422 case llvm::BitstreamEntry::Record:
2423 // The interesting case.
2424 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00002425 }
2426
2427 // Read and process a record.
2428 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00002429 StringRef Blob;
2430 switch ((ASTRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002431 default: // Default behavior: ignore.
2432 break;
2433
2434 case TYPE_OFFSET: {
2435 if (F.LocalNumTypes != 0) {
2436 Error("duplicate TYPE_OFFSET record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002437 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002438 }
Chris Lattner0e6c9402013-01-20 02:38:54 +00002439 F.TypeOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002440 F.LocalNumTypes = Record[0];
2441 unsigned LocalBaseTypeIndex = Record[1];
2442 F.BaseTypeIndex = getTotalNumTypes();
2443
2444 if (F.LocalNumTypes > 0) {
2445 // Introduce the global -> local mapping for types within this module.
2446 GlobalTypeMap.insert(std::make_pair(getTotalNumTypes(), &F));
2447
2448 // Introduce the local -> global mapping for types within this module.
2449 F.TypeRemap.insertOrReplace(
2450 std::make_pair(LocalBaseTypeIndex,
2451 F.BaseTypeIndex - LocalBaseTypeIndex));
Ben Langmuir52ca6782014-10-20 16:27:32 +00002452
2453 TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes);
Guy Benyei11169dd2012-12-18 14:30:41 +00002454 }
2455 break;
2456 }
2457
2458 case DECL_OFFSET: {
2459 if (F.LocalNumDecls != 0) {
2460 Error("duplicate DECL_OFFSET record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002461 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002462 }
Chris Lattner0e6c9402013-01-20 02:38:54 +00002463 F.DeclOffsets = (const DeclOffset *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002464 F.LocalNumDecls = Record[0];
2465 unsigned LocalBaseDeclID = Record[1];
2466 F.BaseDeclID = getTotalNumDecls();
2467
2468 if (F.LocalNumDecls > 0) {
2469 // Introduce the global -> local mapping for declarations within this
2470 // module.
2471 GlobalDeclMap.insert(
2472 std::make_pair(getTotalNumDecls() + NUM_PREDEF_DECL_IDS, &F));
2473
2474 // Introduce the local -> global mapping for declarations within this
2475 // module.
2476 F.DeclRemap.insertOrReplace(
2477 std::make_pair(LocalBaseDeclID, F.BaseDeclID - LocalBaseDeclID));
2478
2479 // Introduce the global -> local mapping for declarations within this
2480 // module.
2481 F.GlobalToLocalDeclIDs[&F] = LocalBaseDeclID;
Ben Langmuirfe971d92014-08-16 04:54:18 +00002482
Ben Langmuir52ca6782014-10-20 16:27:32 +00002483 DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls);
2484 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002485 break;
2486 }
2487
2488 case TU_UPDATE_LEXICAL: {
2489 DeclContext *TU = Context.getTranslationUnitDecl();
2490 DeclContextInfo &Info = F.DeclContextInfos[TU];
Chris Lattner0e6c9402013-01-20 02:38:54 +00002491 Info.LexicalDecls = reinterpret_cast<const KindDeclIDPair *>(Blob.data());
Guy Benyei11169dd2012-12-18 14:30:41 +00002492 Info.NumLexicalDecls
Chris Lattner0e6c9402013-01-20 02:38:54 +00002493 = static_cast<unsigned int>(Blob.size() / sizeof(KindDeclIDPair));
Guy Benyei11169dd2012-12-18 14:30:41 +00002494 TU->setHasExternalLexicalStorage(true);
2495 break;
2496 }
2497
2498 case UPDATE_VISIBLE: {
2499 unsigned Idx = 0;
2500 serialization::DeclID ID = ReadDeclID(F, Record, Idx);
2501 ASTDeclContextNameLookupTable *Table =
Justin Bognerda4e6502014-04-14 16:34:29 +00002502 ASTDeclContextNameLookupTable::Create(
2503 (const unsigned char *)Blob.data() + Record[Idx++],
2504 (const unsigned char *)Blob.data() + sizeof(uint32_t),
2505 (const unsigned char *)Blob.data(),
2506 ASTDeclContextNameLookupTrait(*this, F));
Richard Smithcd45dbc2014-04-19 03:48:30 +00002507 if (Decl *D = GetExistingDecl(ID)) {
Richard Smithd9174792014-03-11 03:10:46 +00002508 auto *DC = cast<DeclContext>(D);
2509 DC->getPrimaryContext()->setHasExternalVisibleStorage(true);
Richard Smith52e3fba2014-03-11 07:17:35 +00002510 auto *&LookupTable = F.DeclContextInfos[DC].NameLookupTableData;
2511 delete LookupTable;
2512 LookupTable = Table;
Guy Benyei11169dd2012-12-18 14:30:41 +00002513 } else
2514 PendingVisibleUpdates[ID].push_back(std::make_pair(Table, &F));
2515 break;
2516 }
2517
2518 case IDENTIFIER_TABLE:
Chris Lattner0e6c9402013-01-20 02:38:54 +00002519 F.IdentifierTableData = Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002520 if (Record[0]) {
Justin Bognerda4e6502014-04-14 16:34:29 +00002521 F.IdentifierLookupTable = ASTIdentifierLookupTable::Create(
2522 (const unsigned char *)F.IdentifierTableData + Record[0],
2523 (const unsigned char *)F.IdentifierTableData + sizeof(uint32_t),
2524 (const unsigned char *)F.IdentifierTableData,
2525 ASTIdentifierLookupTrait(*this, F));
Guy Benyei11169dd2012-12-18 14:30:41 +00002526
2527 PP.getIdentifierTable().setExternalIdentifierLookup(this);
2528 }
2529 break;
2530
2531 case IDENTIFIER_OFFSET: {
2532 if (F.LocalNumIdentifiers != 0) {
2533 Error("duplicate IDENTIFIER_OFFSET record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002534 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002535 }
Chris Lattner0e6c9402013-01-20 02:38:54 +00002536 F.IdentifierOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002537 F.LocalNumIdentifiers = Record[0];
2538 unsigned LocalBaseIdentifierID = Record[1];
2539 F.BaseIdentifierID = getTotalNumIdentifiers();
2540
2541 if (F.LocalNumIdentifiers > 0) {
2542 // Introduce the global -> local mapping for identifiers within this
2543 // module.
2544 GlobalIdentifierMap.insert(std::make_pair(getTotalNumIdentifiers() + 1,
2545 &F));
2546
2547 // Introduce the local -> global mapping for identifiers within this
2548 // module.
2549 F.IdentifierRemap.insertOrReplace(
2550 std::make_pair(LocalBaseIdentifierID,
2551 F.BaseIdentifierID - LocalBaseIdentifierID));
Ben Langmuirfe971d92014-08-16 04:54:18 +00002552
Ben Langmuir52ca6782014-10-20 16:27:32 +00002553 IdentifiersLoaded.resize(IdentifiersLoaded.size()
2554 + F.LocalNumIdentifiers);
2555 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002556 break;
2557 }
2558
Ben Langmuir332aafe2014-01-31 01:06:56 +00002559 case EAGERLY_DESERIALIZED_DECLS:
Richard Smith9e2341d2015-03-23 03:25:59 +00002560 // FIXME: Skip reading this record if our ASTConsumer doesn't care
2561 // about "interesting" decls (for instance, if we're building a module).
Guy Benyei11169dd2012-12-18 14:30:41 +00002562 for (unsigned I = 0, N = Record.size(); I != N; ++I)
Ben Langmuir332aafe2014-01-31 01:06:56 +00002563 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I]));
Guy Benyei11169dd2012-12-18 14:30:41 +00002564 break;
2565
2566 case SPECIAL_TYPES:
Douglas Gregor44180f82013-02-01 23:45:03 +00002567 if (SpecialTypes.empty()) {
2568 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2569 SpecialTypes.push_back(getGlobalTypeID(F, Record[I]));
2570 break;
2571 }
2572
2573 if (SpecialTypes.size() != Record.size()) {
2574 Error("invalid special-types record");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002575 return Failure;
Douglas Gregor44180f82013-02-01 23:45:03 +00002576 }
2577
2578 for (unsigned I = 0, N = Record.size(); I != N; ++I) {
2579 serialization::TypeID ID = getGlobalTypeID(F, Record[I]);
2580 if (!SpecialTypes[I])
2581 SpecialTypes[I] = ID;
2582 // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate
2583 // merge step?
2584 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002585 break;
2586
2587 case STATISTICS:
2588 TotalNumStatements += Record[0];
2589 TotalNumMacros += Record[1];
2590 TotalLexicalDeclContexts += Record[2];
2591 TotalVisibleDeclContexts += Record[3];
2592 break;
2593
2594 case UNUSED_FILESCOPED_DECLS:
2595 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2596 UnusedFileScopedDecls.push_back(getGlobalDeclID(F, Record[I]));
2597 break;
2598
2599 case DELEGATING_CTORS:
2600 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2601 DelegatingCtorDecls.push_back(getGlobalDeclID(F, Record[I]));
2602 break;
2603
2604 case WEAK_UNDECLARED_IDENTIFIERS:
2605 if (Record.size() % 4 != 0) {
2606 Error("invalid weak identifiers record");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002607 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002608 }
2609
2610 // FIXME: Ignore weak undeclared identifiers from non-original PCH
2611 // files. This isn't the way to do it :)
2612 WeakUndeclaredIdentifiers.clear();
2613
2614 // Translate the weak, undeclared identifiers into global IDs.
2615 for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) {
2616 WeakUndeclaredIdentifiers.push_back(
2617 getGlobalIdentifierID(F, Record[I++]));
2618 WeakUndeclaredIdentifiers.push_back(
2619 getGlobalIdentifierID(F, Record[I++]));
2620 WeakUndeclaredIdentifiers.push_back(
2621 ReadSourceLocation(F, Record, I).getRawEncoding());
2622 WeakUndeclaredIdentifiers.push_back(Record[I++]);
2623 }
2624 break;
2625
Guy Benyei11169dd2012-12-18 14:30:41 +00002626 case SELECTOR_OFFSETS: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00002627 F.SelectorOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002628 F.LocalNumSelectors = Record[0];
2629 unsigned LocalBaseSelectorID = Record[1];
2630 F.BaseSelectorID = getTotalNumSelectors();
2631
2632 if (F.LocalNumSelectors > 0) {
2633 // Introduce the global -> local mapping for selectors within this
2634 // module.
2635 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F));
2636
2637 // Introduce the local -> global mapping for selectors within this
2638 // module.
2639 F.SelectorRemap.insertOrReplace(
2640 std::make_pair(LocalBaseSelectorID,
2641 F.BaseSelectorID - LocalBaseSelectorID));
Ben Langmuir52ca6782014-10-20 16:27:32 +00002642
2643 SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors);
Guy Benyei11169dd2012-12-18 14:30:41 +00002644 }
2645 break;
2646 }
2647
2648 case METHOD_POOL:
Chris Lattner0e6c9402013-01-20 02:38:54 +00002649 F.SelectorLookupTableData = (const unsigned char *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002650 if (Record[0])
2651 F.SelectorLookupTable
2652 = ASTSelectorLookupTable::Create(
2653 F.SelectorLookupTableData + Record[0],
2654 F.SelectorLookupTableData,
2655 ASTSelectorLookupTrait(*this, F));
2656 TotalNumMethodPoolEntries += Record[1];
2657 break;
2658
2659 case REFERENCED_SELECTOR_POOL:
2660 if (!Record.empty()) {
2661 for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) {
2662 ReferencedSelectorsData.push_back(getGlobalSelectorID(F,
2663 Record[Idx++]));
2664 ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx).
2665 getRawEncoding());
2666 }
2667 }
2668 break;
2669
2670 case PP_COUNTER_VALUE:
2671 if (!Record.empty() && Listener)
2672 Listener->ReadCounter(F, Record[0]);
2673 break;
2674
2675 case FILE_SORTED_DECLS:
Chris Lattner0e6c9402013-01-20 02:38:54 +00002676 F.FileSortedDecls = (const DeclID *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002677 F.NumFileSortedDecls = Record[0];
2678 break;
2679
2680 case SOURCE_LOCATION_OFFSETS: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00002681 F.SLocEntryOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002682 F.LocalNumSLocEntries = Record[0];
2683 unsigned SLocSpaceSize = Record[1];
Benjamin Kramer867ea1d2014-03-02 13:01:17 +00002684 std::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) =
Ben Langmuir52ca6782014-10-20 16:27:32 +00002685 SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries,
Guy Benyei11169dd2012-12-18 14:30:41 +00002686 SLocSpaceSize);
2687 // Make our entry in the range map. BaseID is negative and growing, so
2688 // we invert it. Because we invert it, though, we need the other end of
2689 // the range.
2690 unsigned RangeStart =
2691 unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1;
2692 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F));
2693 F.FirstLoc = SourceLocation::getFromRawEncoding(F.SLocEntryBaseOffset);
2694
2695 // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing.
2696 assert((F.SLocEntryBaseOffset & (1U << 31U)) == 0);
2697 GlobalSLocOffsetMap.insert(
2698 std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset
2699 - SLocSpaceSize,&F));
2700
2701 // Initialize the remapping table.
2702 // Invalid stays invalid.
Richard Smithb9eab6d2014-03-20 19:44:17 +00002703 F.SLocRemap.insertOrReplace(std::make_pair(0U, 0));
Guy Benyei11169dd2012-12-18 14:30:41 +00002704 // This module. Base was 2 when being compiled.
Richard Smithb9eab6d2014-03-20 19:44:17 +00002705 F.SLocRemap.insertOrReplace(std::make_pair(2U,
Guy Benyei11169dd2012-12-18 14:30:41 +00002706 static_cast<int>(F.SLocEntryBaseOffset - 2)));
2707
2708 TotalNumSLocEntries += F.LocalNumSLocEntries;
2709 break;
2710 }
2711
2712 case MODULE_OFFSET_MAP: {
2713 // Additional remapping information.
Chris Lattner0e6c9402013-01-20 02:38:54 +00002714 const unsigned char *Data = (const unsigned char*)Blob.data();
2715 const unsigned char *DataEnd = Data + Blob.size();
Richard Smithb9eab6d2014-03-20 19:44:17 +00002716
2717 // If we see this entry before SOURCE_LOCATION_OFFSETS, add placeholders.
2718 if (F.SLocRemap.find(0) == F.SLocRemap.end()) {
2719 F.SLocRemap.insert(std::make_pair(0U, 0));
2720 F.SLocRemap.insert(std::make_pair(2U, 1));
2721 }
2722
Guy Benyei11169dd2012-12-18 14:30:41 +00002723 // Continuous range maps we may be updating in our module.
Ben Langmuir785180e2014-10-20 16:27:30 +00002724 typedef ContinuousRangeMap<uint32_t, int, 2>::Builder
2725 RemapBuilder;
2726 RemapBuilder SLocRemap(F.SLocRemap);
2727 RemapBuilder IdentifierRemap(F.IdentifierRemap);
2728 RemapBuilder MacroRemap(F.MacroRemap);
2729 RemapBuilder PreprocessedEntityRemap(F.PreprocessedEntityRemap);
2730 RemapBuilder SubmoduleRemap(F.SubmoduleRemap);
2731 RemapBuilder SelectorRemap(F.SelectorRemap);
2732 RemapBuilder DeclRemap(F.DeclRemap);
2733 RemapBuilder TypeRemap(F.TypeRemap);
Guy Benyei11169dd2012-12-18 14:30:41 +00002734
2735 while(Data < DataEnd) {
Justin Bogner57ba0b22014-03-28 22:03:24 +00002736 using namespace llvm::support;
2737 uint16_t Len = endian::readNext<uint16_t, little, unaligned>(Data);
Guy Benyei11169dd2012-12-18 14:30:41 +00002738 StringRef Name = StringRef((const char*)Data, Len);
2739 Data += Len;
2740 ModuleFile *OM = ModuleMgr.lookup(Name);
2741 if (!OM) {
2742 Error("SourceLocation remap refers to unknown module");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002743 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002744 }
2745
Justin Bogner57ba0b22014-03-28 22:03:24 +00002746 uint32_t SLocOffset =
2747 endian::readNext<uint32_t, little, unaligned>(Data);
2748 uint32_t IdentifierIDOffset =
2749 endian::readNext<uint32_t, little, unaligned>(Data);
2750 uint32_t MacroIDOffset =
2751 endian::readNext<uint32_t, little, unaligned>(Data);
2752 uint32_t PreprocessedEntityIDOffset =
2753 endian::readNext<uint32_t, little, unaligned>(Data);
2754 uint32_t SubmoduleIDOffset =
2755 endian::readNext<uint32_t, little, unaligned>(Data);
2756 uint32_t SelectorIDOffset =
2757 endian::readNext<uint32_t, little, unaligned>(Data);
2758 uint32_t DeclIDOffset =
2759 endian::readNext<uint32_t, little, unaligned>(Data);
2760 uint32_t TypeIndexOffset =
2761 endian::readNext<uint32_t, little, unaligned>(Data);
2762
Ben Langmuir785180e2014-10-20 16:27:30 +00002763 uint32_t None = std::numeric_limits<uint32_t>::max();
2764
2765 auto mapOffset = [&](uint32_t Offset, uint32_t BaseOffset,
2766 RemapBuilder &Remap) {
2767 if (Offset != None)
2768 Remap.insert(std::make_pair(Offset,
2769 static_cast<int>(BaseOffset - Offset)));
2770 };
2771 mapOffset(SLocOffset, OM->SLocEntryBaseOffset, SLocRemap);
2772 mapOffset(IdentifierIDOffset, OM->BaseIdentifierID, IdentifierRemap);
2773 mapOffset(MacroIDOffset, OM->BaseMacroID, MacroRemap);
2774 mapOffset(PreprocessedEntityIDOffset, OM->BasePreprocessedEntityID,
2775 PreprocessedEntityRemap);
2776 mapOffset(SubmoduleIDOffset, OM->BaseSubmoduleID, SubmoduleRemap);
2777 mapOffset(SelectorIDOffset, OM->BaseSelectorID, SelectorRemap);
2778 mapOffset(DeclIDOffset, OM->BaseDeclID, DeclRemap);
2779 mapOffset(TypeIndexOffset, OM->BaseTypeIndex, TypeRemap);
Guy Benyei11169dd2012-12-18 14:30:41 +00002780
2781 // Global -> local mappings.
2782 F.GlobalToLocalDeclIDs[OM] = DeclIDOffset;
2783 }
2784 break;
2785 }
2786
2787 case SOURCE_MANAGER_LINE_TABLE:
2788 if (ParseLineTable(F, Record))
Ben Langmuir2c9af442014-04-10 17:57:43 +00002789 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002790 break;
2791
2792 case SOURCE_LOCATION_PRELOADS: {
2793 // Need to transform from the local view (1-based IDs) to the global view,
2794 // which is based off F.SLocEntryBaseID.
2795 if (!F.PreloadSLocEntries.empty()) {
2796 Error("Multiple SOURCE_LOCATION_PRELOADS records in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002797 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002798 }
2799
2800 F.PreloadSLocEntries.swap(Record);
2801 break;
2802 }
2803
2804 case EXT_VECTOR_DECLS:
2805 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2806 ExtVectorDecls.push_back(getGlobalDeclID(F, Record[I]));
2807 break;
2808
2809 case VTABLE_USES:
2810 if (Record.size() % 3 != 0) {
2811 Error("Invalid VTABLE_USES record");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002812 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002813 }
2814
2815 // Later tables overwrite earlier ones.
2816 // FIXME: Modules will have some trouble with this. This is clearly not
2817 // the right way to do this.
2818 VTableUses.clear();
2819
2820 for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) {
2821 VTableUses.push_back(getGlobalDeclID(F, Record[Idx++]));
2822 VTableUses.push_back(
2823 ReadSourceLocation(F, Record, Idx).getRawEncoding());
2824 VTableUses.push_back(Record[Idx++]);
2825 }
2826 break;
2827
Guy Benyei11169dd2012-12-18 14:30:41 +00002828 case PENDING_IMPLICIT_INSTANTIATIONS:
2829 if (PendingInstantiations.size() % 2 != 0) {
2830 Error("Invalid existing PendingInstantiations");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002831 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002832 }
2833
2834 if (Record.size() % 2 != 0) {
2835 Error("Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002836 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002837 }
2838
2839 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
2840 PendingInstantiations.push_back(getGlobalDeclID(F, Record[I++]));
2841 PendingInstantiations.push_back(
2842 ReadSourceLocation(F, Record, I).getRawEncoding());
2843 }
2844 break;
2845
2846 case SEMA_DECL_REFS:
Richard Smith3d8e97e2013-10-18 06:54:39 +00002847 if (Record.size() != 2) {
2848 Error("Invalid SEMA_DECL_REFS block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002849 return Failure;
Richard Smith3d8e97e2013-10-18 06:54:39 +00002850 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002851 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2852 SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
2853 break;
2854
2855 case PPD_ENTITIES_OFFSETS: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00002856 F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data();
2857 assert(Blob.size() % sizeof(PPEntityOffset) == 0);
2858 F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset);
Guy Benyei11169dd2012-12-18 14:30:41 +00002859
2860 unsigned LocalBasePreprocessedEntityID = Record[0];
2861
2862 unsigned StartingID;
2863 if (!PP.getPreprocessingRecord())
2864 PP.createPreprocessingRecord();
2865 if (!PP.getPreprocessingRecord()->getExternalSource())
2866 PP.getPreprocessingRecord()->SetExternalSource(*this);
2867 StartingID
2868 = PP.getPreprocessingRecord()
Ben Langmuir52ca6782014-10-20 16:27:32 +00002869 ->allocateLoadedEntities(F.NumPreprocessedEntities);
Guy Benyei11169dd2012-12-18 14:30:41 +00002870 F.BasePreprocessedEntityID = StartingID;
2871
2872 if (F.NumPreprocessedEntities > 0) {
2873 // Introduce the global -> local mapping for preprocessed entities in
2874 // this module.
2875 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
2876
2877 // Introduce the local -> global mapping for preprocessed entities in
2878 // this module.
2879 F.PreprocessedEntityRemap.insertOrReplace(
2880 std::make_pair(LocalBasePreprocessedEntityID,
2881 F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID));
2882 }
2883
2884 break;
2885 }
2886
2887 case DECL_UPDATE_OFFSETS: {
2888 if (Record.size() % 2 != 0) {
2889 Error("invalid DECL_UPDATE_OFFSETS block in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002890 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002891 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00002892 for (unsigned I = 0, N = Record.size(); I != N; I += 2) {
2893 GlobalDeclID ID = getGlobalDeclID(F, Record[I]);
2894 DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I + 1]));
2895
2896 // If we've already loaded the decl, perform the updates when we finish
2897 // loading this block.
2898 if (Decl *D = GetExistingDecl(ID))
2899 PendingUpdateRecords.push_back(std::make_pair(ID, D));
2900 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002901 break;
2902 }
2903
2904 case DECL_REPLACEMENTS: {
2905 if (Record.size() % 3 != 0) {
2906 Error("invalid DECL_REPLACEMENTS block in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002907 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002908 }
2909 for (unsigned I = 0, N = Record.size(); I != N; I += 3)
2910 ReplacedDecls[getGlobalDeclID(F, Record[I])]
2911 = ReplacedDeclInfo(&F, Record[I+1], Record[I+2]);
2912 break;
2913 }
2914
2915 case OBJC_CATEGORIES_MAP: {
2916 if (F.LocalNumObjCCategoriesInMap != 0) {
2917 Error("duplicate OBJC_CATEGORIES_MAP record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002918 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002919 }
2920
2921 F.LocalNumObjCCategoriesInMap = Record[0];
Chris Lattner0e6c9402013-01-20 02:38:54 +00002922 F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002923 break;
2924 }
2925
2926 case OBJC_CATEGORIES:
2927 F.ObjCCategories.swap(Record);
2928 break;
Richard Smithc2bb8182015-03-24 06:36:48 +00002929
Guy Benyei11169dd2012-12-18 14:30:41 +00002930 case CXX_BASE_SPECIFIER_OFFSETS: {
2931 if (F.LocalNumCXXBaseSpecifiers != 0) {
2932 Error("duplicate CXX_BASE_SPECIFIER_OFFSETS record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002933 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002934 }
Richard Smithc2bb8182015-03-24 06:36:48 +00002935
Guy Benyei11169dd2012-12-18 14:30:41 +00002936 F.LocalNumCXXBaseSpecifiers = Record[0];
Chris Lattner0e6c9402013-01-20 02:38:54 +00002937 F.CXXBaseSpecifiersOffsets = (const uint32_t *)Blob.data();
Richard Smithc2bb8182015-03-24 06:36:48 +00002938 break;
2939 }
2940
2941 case CXX_CTOR_INITIALIZERS_OFFSETS: {
2942 if (F.LocalNumCXXCtorInitializers != 0) {
2943 Error("duplicate CXX_CTOR_INITIALIZERS_OFFSETS record in AST file");
2944 return Failure;
2945 }
2946
2947 F.LocalNumCXXCtorInitializers = Record[0];
2948 F.CXXCtorInitializersOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002949 break;
2950 }
2951
2952 case DIAG_PRAGMA_MAPPINGS:
2953 if (F.PragmaDiagMappings.empty())
2954 F.PragmaDiagMappings.swap(Record);
2955 else
2956 F.PragmaDiagMappings.insert(F.PragmaDiagMappings.end(),
2957 Record.begin(), Record.end());
2958 break;
2959
2960 case CUDA_SPECIAL_DECL_REFS:
2961 // Later tables overwrite earlier ones.
2962 // FIXME: Modules will have trouble with this.
2963 CUDASpecialDeclRefs.clear();
2964 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2965 CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
2966 break;
2967
2968 case HEADER_SEARCH_TABLE: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00002969 F.HeaderFileInfoTableData = Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002970 F.LocalNumHeaderFileInfos = Record[1];
Guy Benyei11169dd2012-12-18 14:30:41 +00002971 if (Record[0]) {
2972 F.HeaderFileInfoTable
2973 = HeaderFileInfoLookupTable::Create(
2974 (const unsigned char *)F.HeaderFileInfoTableData + Record[0],
2975 (const unsigned char *)F.HeaderFileInfoTableData,
2976 HeaderFileInfoTrait(*this, F,
2977 &PP.getHeaderSearchInfo(),
Chris Lattner0e6c9402013-01-20 02:38:54 +00002978 Blob.data() + Record[2]));
Guy Benyei11169dd2012-12-18 14:30:41 +00002979
2980 PP.getHeaderSearchInfo().SetExternalSource(this);
2981 if (!PP.getHeaderSearchInfo().getExternalLookup())
2982 PP.getHeaderSearchInfo().SetExternalLookup(this);
2983 }
2984 break;
2985 }
2986
2987 case FP_PRAGMA_OPTIONS:
2988 // Later tables overwrite earlier ones.
2989 FPPragmaOptions.swap(Record);
2990 break;
2991
2992 case OPENCL_EXTENSIONS:
2993 // Later tables overwrite earlier ones.
2994 OpenCLExtensions.swap(Record);
2995 break;
2996
2997 case TENTATIVE_DEFINITIONS:
2998 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2999 TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I]));
3000 break;
3001
3002 case KNOWN_NAMESPACES:
3003 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3004 KnownNamespaces.push_back(getGlobalDeclID(F, Record[I]));
3005 break;
Nick Lewycky8334af82013-01-26 00:35:08 +00003006
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00003007 case UNDEFINED_BUT_USED:
3008 if (UndefinedButUsed.size() % 2 != 0) {
3009 Error("Invalid existing UndefinedButUsed");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003010 return Failure;
Nick Lewycky8334af82013-01-26 00:35:08 +00003011 }
3012
3013 if (Record.size() % 2 != 0) {
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00003014 Error("invalid undefined-but-used record");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003015 return Failure;
Nick Lewycky8334af82013-01-26 00:35:08 +00003016 }
3017 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00003018 UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++]));
3019 UndefinedButUsed.push_back(
Nick Lewycky8334af82013-01-26 00:35:08 +00003020 ReadSourceLocation(F, Record, I).getRawEncoding());
3021 }
3022 break;
3023
Guy Benyei11169dd2012-12-18 14:30:41 +00003024 case IMPORTED_MODULES: {
Richard Smithe842a472014-10-22 02:05:46 +00003025 if (F.Kind != MK_ImplicitModule && F.Kind != MK_ExplicitModule) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003026 // If we aren't loading a module (which has its own exports), make
3027 // all of the imported modules visible.
3028 // FIXME: Deal with macros-only imports.
Richard Smith56be7542014-03-21 00:33:59 +00003029 for (unsigned I = 0, N = Record.size(); I != N; /**/) {
3030 unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]);
3031 SourceLocation Loc = ReadSourceLocation(F, Record, I);
3032 if (GlobalID)
Aaron Ballman4f45b712014-03-21 15:22:56 +00003033 ImportedModules.push_back(ImportedSubmodule(GlobalID, Loc));
Guy Benyei11169dd2012-12-18 14:30:41 +00003034 }
3035 }
3036 break;
3037 }
3038
3039 case LOCAL_REDECLARATIONS: {
3040 F.RedeclarationChains.swap(Record);
3041 break;
3042 }
3043
3044 case LOCAL_REDECLARATIONS_MAP: {
3045 if (F.LocalNumRedeclarationsInMap != 0) {
3046 Error("duplicate LOCAL_REDECLARATIONS_MAP record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003047 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003048 }
3049
3050 F.LocalNumRedeclarationsInMap = Record[0];
Chris Lattner0e6c9402013-01-20 02:38:54 +00003051 F.RedeclarationsMap = (const LocalRedeclarationsInfo *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003052 break;
3053 }
3054
Guy Benyei11169dd2012-12-18 14:30:41 +00003055 case MACRO_OFFSET: {
3056 if (F.LocalNumMacros != 0) {
3057 Error("duplicate MACRO_OFFSET record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003058 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003059 }
Chris Lattner0e6c9402013-01-20 02:38:54 +00003060 F.MacroOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003061 F.LocalNumMacros = Record[0];
3062 unsigned LocalBaseMacroID = Record[1];
3063 F.BaseMacroID = getTotalNumMacros();
3064
3065 if (F.LocalNumMacros > 0) {
3066 // Introduce the global -> local mapping for macros within this module.
3067 GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F));
3068
3069 // Introduce the local -> global mapping for macros within this module.
3070 F.MacroRemap.insertOrReplace(
3071 std::make_pair(LocalBaseMacroID,
3072 F.BaseMacroID - LocalBaseMacroID));
Ben Langmuir52ca6782014-10-20 16:27:32 +00003073
3074 MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros);
Guy Benyei11169dd2012-12-18 14:30:41 +00003075 }
3076 break;
3077 }
3078
Richard Smithe40f2ba2013-08-07 21:41:30 +00003079 case LATE_PARSED_TEMPLATE: {
3080 LateParsedTemplates.append(Record.begin(), Record.end());
3081 break;
3082 }
Dario Domizioli13a0a382014-05-23 12:13:25 +00003083
3084 case OPTIMIZE_PRAGMA_OPTIONS:
3085 if (Record.size() != 1) {
3086 Error("invalid pragma optimize record");
3087 return Failure;
3088 }
3089 OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]);
3090 break;
Nico Weber72889432014-09-06 01:25:55 +00003091
3092 case UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES:
3093 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3094 UnusedLocalTypedefNameCandidates.push_back(
3095 getGlobalDeclID(F, Record[I]));
3096 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00003097 }
3098 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003099}
3100
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003101ASTReader::ASTReadResult
3102ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F,
3103 const ModuleFile *ImportedBy,
3104 unsigned ClientLoadCapabilities) {
3105 unsigned Idx = 0;
Richard Smith7ed1bc92014-12-05 22:42:13 +00003106 F.ModuleMapPath = ReadPath(F, Record, Idx);
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003107
Richard Smithe842a472014-10-22 02:05:46 +00003108 if (F.Kind == MK_ExplicitModule) {
3109 // For an explicitly-loaded module, we don't care whether the original
3110 // module map file exists or matches.
3111 return Success;
3112 }
3113
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003114 // Try to resolve ModuleName in the current header search context and
3115 // verify that it is found in the same module map file as we saved. If the
3116 // top-level AST file is a main file, skip this check because there is no
3117 // usable header search context.
3118 assert(!F.ModuleName.empty() &&
Richard Smithe842a472014-10-22 02:05:46 +00003119 "MODULE_NAME should come before MODULE_MAP_FILE");
3120 if (F.Kind == MK_ImplicitModule &&
3121 (*ModuleMgr.begin())->Kind != MK_MainFile) {
3122 // An implicitly-loaded module file should have its module listed in some
3123 // module map file that we've already loaded.
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003124 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName);
Richard Smithe842a472014-10-22 02:05:46 +00003125 auto &Map = PP.getHeaderSearchInfo().getModuleMap();
3126 const FileEntry *ModMap = M ? Map.getModuleMapFileForUniquing(M) : nullptr;
3127 if (!ModMap) {
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003128 assert(ImportedBy && "top-level import should be verified");
3129 if ((ClientLoadCapabilities & ARR_Missing) == 0)
Richard Smithe842a472014-10-22 02:05:46 +00003130 Diag(diag::err_imported_module_not_found) << F.ModuleName << F.FileName
3131 << ImportedBy->FileName
3132 << F.ModuleMapPath;
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003133 return Missing;
3134 }
3135
Richard Smithe842a472014-10-22 02:05:46 +00003136 assert(M->Name == F.ModuleName && "found module with different name");
3137
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003138 // Check the primary module map file.
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003139 const FileEntry *StoredModMap = FileMgr.getFile(F.ModuleMapPath);
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003140 if (StoredModMap == nullptr || StoredModMap != ModMap) {
3141 assert(ModMap && "found module is missing module map file");
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003142 assert(ImportedBy && "top-level import should be verified");
3143 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3144 Diag(diag::err_imported_module_modmap_changed)
3145 << F.ModuleName << ImportedBy->FileName
3146 << ModMap->getName() << F.ModuleMapPath;
3147 return OutOfDate;
3148 }
3149
3150 llvm::SmallPtrSet<const FileEntry *, 1> AdditionalStoredMaps;
3151 for (unsigned I = 0, N = Record[Idx++]; I < N; ++I) {
3152 // FIXME: we should use input files rather than storing names.
Richard Smith7ed1bc92014-12-05 22:42:13 +00003153 std::string Filename = ReadPath(F, Record, Idx);
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003154 const FileEntry *F =
3155 FileMgr.getFile(Filename, false, false);
3156 if (F == nullptr) {
3157 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3158 Error("could not find file '" + Filename +"' referenced by AST file");
3159 return OutOfDate;
3160 }
3161 AdditionalStoredMaps.insert(F);
3162 }
3163
3164 // Check any additional module map files (e.g. module.private.modulemap)
3165 // that are not in the pcm.
3166 if (auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) {
3167 for (const FileEntry *ModMap : *AdditionalModuleMaps) {
3168 // Remove files that match
3169 // Note: SmallPtrSet::erase is really remove
3170 if (!AdditionalStoredMaps.erase(ModMap)) {
3171 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3172 Diag(diag::err_module_different_modmap)
3173 << F.ModuleName << /*new*/0 << ModMap->getName();
3174 return OutOfDate;
3175 }
3176 }
3177 }
3178
3179 // Check any additional module map files that are in the pcm, but not
3180 // found in header search. Cases that match are already removed.
3181 for (const FileEntry *ModMap : AdditionalStoredMaps) {
3182 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3183 Diag(diag::err_module_different_modmap)
3184 << F.ModuleName << /*not new*/1 << ModMap->getName();
3185 return OutOfDate;
3186 }
3187 }
3188
3189 if (Listener)
3190 Listener->ReadModuleMapFile(F.ModuleMapPath);
3191 return Success;
3192}
3193
3194
Douglas Gregorc1489562013-02-12 23:36:21 +00003195/// \brief Move the given method to the back of the global list of methods.
3196static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) {
3197 // Find the entry for this selector in the method pool.
3198 Sema::GlobalMethodPool::iterator Known
3199 = S.MethodPool.find(Method->getSelector());
3200 if (Known == S.MethodPool.end())
3201 return;
3202
3203 // Retrieve the appropriate method list.
3204 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
3205 : Known->second.second;
3206 bool Found = false;
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00003207 for (ObjCMethodList *List = &Start; List; List = List->getNext()) {
Douglas Gregorc1489562013-02-12 23:36:21 +00003208 if (!Found) {
Nico Weber2e0c8f72014-12-27 03:58:08 +00003209 if (List->getMethod() == Method) {
Douglas Gregorc1489562013-02-12 23:36:21 +00003210 Found = true;
3211 } else {
3212 // Keep searching.
3213 continue;
3214 }
3215 }
3216
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00003217 if (List->getNext())
Nico Weber2e0c8f72014-12-27 03:58:08 +00003218 List->setMethod(List->getNext()->getMethod());
Douglas Gregorc1489562013-02-12 23:36:21 +00003219 else
Nico Weber2e0c8f72014-12-27 03:58:08 +00003220 List->setMethod(Method);
Douglas Gregorc1489562013-02-12 23:36:21 +00003221 }
3222}
3223
Richard Smithde711422015-04-23 21:20:19 +00003224void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner) {
Richard Smith10434f32015-05-02 02:08:26 +00003225 assert(Owner->NameVisibility != Module::Hidden && "nothing to make visible?");
Richard Smith20e883e2015-04-29 23:20:19 +00003226 for (Decl *D : Names) {
Richard Smith49f906a2014-03-01 00:08:04 +00003227 bool wasHidden = D->Hidden;
3228 D->Hidden = false;
Guy Benyei11169dd2012-12-18 14:30:41 +00003229
Richard Smith49f906a2014-03-01 00:08:04 +00003230 if (wasHidden && SemaObj) {
3231 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) {
3232 moveMethodToBackOfGlobalList(*SemaObj, Method);
Douglas Gregorc1489562013-02-12 23:36:21 +00003233 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003234 }
3235 }
3236}
3237
Richard Smith49f906a2014-03-01 00:08:04 +00003238void ASTReader::makeModuleVisible(Module *Mod,
Argyrios Kyrtzidis125df052013-02-01 16:36:12 +00003239 Module::NameVisibilityKind NameVisibility,
Richard Smitha7e2cc62015-05-01 01:53:09 +00003240 SourceLocation ImportLoc) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003241 llvm::SmallPtrSet<Module *, 4> Visited;
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003242 SmallVector<Module *, 4> Stack;
Robert Wilhelm25284cc2013-08-23 16:11:15 +00003243 Stack.push_back(Mod);
Guy Benyei11169dd2012-12-18 14:30:41 +00003244 while (!Stack.empty()) {
Robert Wilhelm25284cc2013-08-23 16:11:15 +00003245 Mod = Stack.pop_back_val();
Guy Benyei11169dd2012-12-18 14:30:41 +00003246
3247 if (NameVisibility <= Mod->NameVisibility) {
Robert Wilhelm25284cc2013-08-23 16:11:15 +00003248 // This module already has this level of visibility (or greater), so
Guy Benyei11169dd2012-12-18 14:30:41 +00003249 // there is nothing more to do.
3250 continue;
3251 }
Richard Smith49f906a2014-03-01 00:08:04 +00003252
Guy Benyei11169dd2012-12-18 14:30:41 +00003253 if (!Mod->isAvailable()) {
3254 // Modules that aren't available cannot be made visible.
3255 continue;
3256 }
3257
3258 // Update the module's name visibility.
3259 Mod->NameVisibility = NameVisibility;
Richard Smith49f906a2014-03-01 00:08:04 +00003260
Guy Benyei11169dd2012-12-18 14:30:41 +00003261 // If we've already deserialized any names from this module,
3262 // mark them as visible.
3263 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
3264 if (Hidden != HiddenNamesMap.end()) {
Richard Smith57721ac2014-07-21 04:10:40 +00003265 auto HiddenNames = std::move(*Hidden);
Guy Benyei11169dd2012-12-18 14:30:41 +00003266 HiddenNamesMap.erase(Hidden);
Richard Smithde711422015-04-23 21:20:19 +00003267 makeNamesVisible(HiddenNames.second, HiddenNames.first);
Richard Smith57721ac2014-07-21 04:10:40 +00003268 assert(HiddenNamesMap.find(Mod) == HiddenNamesMap.end() &&
3269 "making names visible added hidden names");
Guy Benyei11169dd2012-12-18 14:30:41 +00003270 }
Dmitri Gribenkoe9bcf5b2013-11-04 21:51:33 +00003271
Guy Benyei11169dd2012-12-18 14:30:41 +00003272 // Push any exported modules onto the stack to be marked as visible.
Argyrios Kyrtzidis8739f7b2013-02-19 19:34:40 +00003273 SmallVector<Module *, 16> Exports;
3274 Mod->getExportedModules(Exports);
3275 for (SmallVectorImpl<Module *>::iterator
3276 I = Exports.begin(), E = Exports.end(); I != E; ++I) {
3277 Module *Exported = *I;
David Blaikie82e95a32014-11-19 07:49:47 +00003278 if (Visited.insert(Exported).second)
Argyrios Kyrtzidis8739f7b2013-02-19 19:34:40 +00003279 Stack.push_back(Exported);
Guy Benyei11169dd2012-12-18 14:30:41 +00003280 }
3281 }
3282}
3283
Douglas Gregore060e572013-01-25 01:03:03 +00003284bool ASTReader::loadGlobalIndex() {
3285 if (GlobalIndex)
3286 return false;
3287
3288 if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
3289 !Context.getLangOpts().Modules)
3290 return true;
3291
3292 // Try to load the global index.
3293 TriedLoadingGlobalIndex = true;
3294 StringRef ModuleCachePath
3295 = getPreprocessor().getHeaderSearchInfo().getModuleCachePath();
3296 std::pair<GlobalModuleIndex *, GlobalModuleIndex::ErrorCode> Result
Douglas Gregor7029ce12013-03-19 00:28:20 +00003297 = GlobalModuleIndex::readIndex(ModuleCachePath);
Douglas Gregore060e572013-01-25 01:03:03 +00003298 if (!Result.first)
3299 return true;
3300
3301 GlobalIndex.reset(Result.first);
Douglas Gregor7211ac12013-01-25 23:32:03 +00003302 ModuleMgr.setGlobalIndex(GlobalIndex.get());
Douglas Gregore060e572013-01-25 01:03:03 +00003303 return false;
3304}
3305
3306bool ASTReader::isGlobalIndexUnavailable() const {
3307 return Context.getLangOpts().Modules && UseGlobalIndex &&
3308 !hasGlobalIndex() && TriedLoadingGlobalIndex;
3309}
3310
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003311static void updateModuleTimestamp(ModuleFile &MF) {
3312 // Overwrite the timestamp file contents so that file's mtime changes.
3313 std::string TimestampFilename = MF.getTimestampFilename();
Rafael Espindoladae941a2014-08-25 18:17:04 +00003314 std::error_code EC;
3315 llvm::raw_fd_ostream OS(TimestampFilename, EC, llvm::sys::fs::F_Text);
3316 if (EC)
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003317 return;
3318 OS << "Timestamp file\n";
3319}
3320
Guy Benyei11169dd2012-12-18 14:30:41 +00003321ASTReader::ASTReadResult ASTReader::ReadAST(const std::string &FileName,
3322 ModuleKind Type,
3323 SourceLocation ImportLoc,
3324 unsigned ClientLoadCapabilities) {
Argyrios Kyrtzidisdc9fdaf2013-05-24 05:44:08 +00003325 llvm::SaveAndRestore<SourceLocation>
3326 SetCurImportLocRAII(CurrentImportLoc, ImportLoc);
3327
Richard Smithd1c46742014-04-30 02:24:17 +00003328 // Defer any pending actions until we get to the end of reading the AST file.
3329 Deserializing AnASTFile(this);
3330
Guy Benyei11169dd2012-12-18 14:30:41 +00003331 // Bump the generation number.
Richard Smith053f6c62014-05-16 23:01:30 +00003332 unsigned PreviousGeneration = incrementGeneration(Context);
Guy Benyei11169dd2012-12-18 14:30:41 +00003333
3334 unsigned NumModules = ModuleMgr.size();
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003335 SmallVector<ImportedModule, 4> Loaded;
Guy Benyei11169dd2012-12-18 14:30:41 +00003336 switch(ASTReadResult ReadResult = ReadASTCore(FileName, Type, ImportLoc,
Craig Toppera13603a2014-05-22 05:54:18 +00003337 /*ImportedBy=*/nullptr, Loaded,
Ben Langmuir487ea142014-10-23 18:05:36 +00003338 0, 0, 0,
Guy Benyei11169dd2012-12-18 14:30:41 +00003339 ClientLoadCapabilities)) {
3340 case Failure:
Douglas Gregor7029ce12013-03-19 00:28:20 +00003341 case Missing:
Guy Benyei11169dd2012-12-18 14:30:41 +00003342 case OutOfDate:
3343 case VersionMismatch:
3344 case ConfigurationMismatch:
Ben Langmuir9801b252014-06-20 00:24:56 +00003345 case HadErrors: {
3346 llvm::SmallPtrSet<ModuleFile *, 4> LoadedSet;
3347 for (const ImportedModule &IM : Loaded)
3348 LoadedSet.insert(IM.Mod);
3349
Douglas Gregor7029ce12013-03-19 00:28:20 +00003350 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, ModuleMgr.end(),
Ben Langmuir9801b252014-06-20 00:24:56 +00003351 LoadedSet,
Douglas Gregor7029ce12013-03-19 00:28:20 +00003352 Context.getLangOpts().Modules
3353 ? &PP.getHeaderSearchInfo().getModuleMap()
Craig Toppera13603a2014-05-22 05:54:18 +00003354 : nullptr);
Douglas Gregore060e572013-01-25 01:03:03 +00003355
3356 // If we find that any modules are unusable, the global index is going
3357 // to be out-of-date. Just remove it.
3358 GlobalIndex.reset();
Craig Toppera13603a2014-05-22 05:54:18 +00003359 ModuleMgr.setGlobalIndex(nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00003360 return ReadResult;
Ben Langmuir9801b252014-06-20 00:24:56 +00003361 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003362 case Success:
3363 break;
3364 }
3365
3366 // Here comes stuff that we only do once the entire chain is loaded.
3367
3368 // Load the AST blocks of all of the modules that we loaded.
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003369 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
3370 MEnd = Loaded.end();
Guy Benyei11169dd2012-12-18 14:30:41 +00003371 M != MEnd; ++M) {
3372 ModuleFile &F = *M->Mod;
3373
3374 // Read the AST block.
Ben Langmuir2c9af442014-04-10 17:57:43 +00003375 if (ASTReadResult Result = ReadASTBlock(F, ClientLoadCapabilities))
3376 return Result;
Guy Benyei11169dd2012-12-18 14:30:41 +00003377
3378 // Once read, set the ModuleFile bit base offset and update the size in
3379 // bits of all files we've seen.
3380 F.GlobalBitOffset = TotalModulesSizeInBits;
3381 TotalModulesSizeInBits += F.SizeInBits;
3382 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F));
3383
3384 // Preload SLocEntries.
3385 for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) {
3386 int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID;
3387 // Load it through the SourceManager and don't call ReadSLocEntry()
3388 // directly because the entry may have already been loaded in which case
3389 // calling ReadSLocEntry() directly would trigger an assertion in
3390 // SourceManager.
3391 SourceMgr.getLoadedSLocEntryByID(Index);
3392 }
3393 }
3394
Douglas Gregor603cd862013-03-22 18:50:14 +00003395 // Setup the import locations and notify the module manager that we've
3396 // committed to these module files.
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003397 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
3398 MEnd = Loaded.end();
Guy Benyei11169dd2012-12-18 14:30:41 +00003399 M != MEnd; ++M) {
3400 ModuleFile &F = *M->Mod;
Douglas Gregor603cd862013-03-22 18:50:14 +00003401
3402 ModuleMgr.moduleFileAccepted(&F);
3403
3404 // Set the import location.
Argyrios Kyrtzidis71c1af82013-02-01 16:36:14 +00003405 F.DirectImportLoc = ImportLoc;
Guy Benyei11169dd2012-12-18 14:30:41 +00003406 if (!M->ImportedBy)
3407 F.ImportLoc = M->ImportLoc;
3408 else
3409 F.ImportLoc = ReadSourceLocation(*M->ImportedBy,
3410 M->ImportLoc.getRawEncoding());
3411 }
3412
3413 // Mark all of the identifiers in the identifier table as being out of date,
3414 // so that various accessors know to check the loaded modules when the
3415 // identifier is used.
3416 for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(),
3417 IdEnd = PP.getIdentifierTable().end();
3418 Id != IdEnd; ++Id)
3419 Id->second->setOutOfDate(true);
3420
3421 // Resolve any unresolved module exports.
Douglas Gregorfb912652013-03-20 21:10:35 +00003422 for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) {
3423 UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I];
Guy Benyei11169dd2012-12-18 14:30:41 +00003424 SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID);
3425 Module *ResolvedMod = getSubmodule(GlobalID);
Douglas Gregorfb912652013-03-20 21:10:35 +00003426
3427 switch (Unresolved.Kind) {
3428 case UnresolvedModuleRef::Conflict:
3429 if (ResolvedMod) {
3430 Module::Conflict Conflict;
3431 Conflict.Other = ResolvedMod;
3432 Conflict.Message = Unresolved.String.str();
3433 Unresolved.Mod->Conflicts.push_back(Conflict);
3434 }
3435 continue;
3436
3437 case UnresolvedModuleRef::Import:
Guy Benyei11169dd2012-12-18 14:30:41 +00003438 if (ResolvedMod)
Richard Smith38477db2015-05-02 00:45:56 +00003439 Unresolved.Mod->Imports.insert(ResolvedMod);
Guy Benyei11169dd2012-12-18 14:30:41 +00003440 continue;
Guy Benyei11169dd2012-12-18 14:30:41 +00003441
Douglas Gregorfb912652013-03-20 21:10:35 +00003442 case UnresolvedModuleRef::Export:
3443 if (ResolvedMod || Unresolved.IsWildcard)
3444 Unresolved.Mod->Exports.push_back(
3445 Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard));
3446 continue;
3447 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003448 }
Douglas Gregorfb912652013-03-20 21:10:35 +00003449 UnresolvedModuleRefs.clear();
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003450
3451 // FIXME: How do we load the 'use'd modules? They may not be submodules.
3452 // Might be unnecessary as use declarations are only used to build the
3453 // module itself.
Guy Benyei11169dd2012-12-18 14:30:41 +00003454
3455 InitializeContext();
3456
Richard Smith3d8e97e2013-10-18 06:54:39 +00003457 if (SemaObj)
3458 UpdateSema();
3459
Guy Benyei11169dd2012-12-18 14:30:41 +00003460 if (DeserializationListener)
3461 DeserializationListener->ReaderInitialized(this);
3462
3463 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
3464 if (!PrimaryModule.OriginalSourceFileID.isInvalid()) {
3465 PrimaryModule.OriginalSourceFileID
3466 = FileID::get(PrimaryModule.SLocEntryBaseID
3467 + PrimaryModule.OriginalSourceFileID.getOpaqueValue() - 1);
3468
3469 // If this AST file is a precompiled preamble, then set the
3470 // preamble file ID of the source manager to the file source file
3471 // from which the preamble was built.
3472 if (Type == MK_Preamble) {
3473 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID);
3474 } else if (Type == MK_MainFile) {
3475 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID);
3476 }
3477 }
3478
3479 // For any Objective-C class definitions we have already loaded, make sure
3480 // that we load any additional categories.
3481 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
3482 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
3483 ObjCClassesLoaded[I],
3484 PreviousGeneration);
3485 }
Douglas Gregore060e572013-01-25 01:03:03 +00003486
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003487 if (PP.getHeaderSearchInfo()
3488 .getHeaderSearchOpts()
3489 .ModulesValidateOncePerBuildSession) {
3490 // Now we are certain that the module and all modules it depends on are
3491 // up to date. Create or update timestamp files for modules that are
3492 // located in the module cache (not for PCH files that could be anywhere
3493 // in the filesystem).
3494 for (unsigned I = 0, N = Loaded.size(); I != N; ++I) {
3495 ImportedModule &M = Loaded[I];
Richard Smithe842a472014-10-22 02:05:46 +00003496 if (M.Mod->Kind == MK_ImplicitModule) {
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003497 updateModuleTimestamp(*M.Mod);
3498 }
3499 }
3500 }
3501
Guy Benyei11169dd2012-12-18 14:30:41 +00003502 return Success;
3503}
3504
Ben Langmuir487ea142014-10-23 18:05:36 +00003505static ASTFileSignature readASTFileSignature(llvm::BitstreamReader &StreamFile);
3506
Ben Langmuir70a1b812015-03-24 04:43:52 +00003507/// \brief Whether \p Stream starts with the AST/PCH file magic number 'CPCH'.
3508static bool startsWithASTFileMagic(BitstreamCursor &Stream) {
3509 return Stream.Read(8) == 'C' &&
3510 Stream.Read(8) == 'P' &&
3511 Stream.Read(8) == 'C' &&
3512 Stream.Read(8) == 'H';
3513}
3514
Guy Benyei11169dd2012-12-18 14:30:41 +00003515ASTReader::ASTReadResult
3516ASTReader::ReadASTCore(StringRef FileName,
3517 ModuleKind Type,
3518 SourceLocation ImportLoc,
3519 ModuleFile *ImportedBy,
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003520 SmallVectorImpl<ImportedModule> &Loaded,
Douglas Gregor7029ce12013-03-19 00:28:20 +00003521 off_t ExpectedSize, time_t ExpectedModTime,
Ben Langmuir487ea142014-10-23 18:05:36 +00003522 ASTFileSignature ExpectedSignature,
Guy Benyei11169dd2012-12-18 14:30:41 +00003523 unsigned ClientLoadCapabilities) {
3524 ModuleFile *M;
Guy Benyei11169dd2012-12-18 14:30:41 +00003525 std::string ErrorStr;
Douglas Gregor7029ce12013-03-19 00:28:20 +00003526 ModuleManager::AddModuleResult AddResult
3527 = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy,
Richard Smith053f6c62014-05-16 23:01:30 +00003528 getGeneration(), ExpectedSize, ExpectedModTime,
Ben Langmuir487ea142014-10-23 18:05:36 +00003529 ExpectedSignature, readASTFileSignature,
Douglas Gregor7029ce12013-03-19 00:28:20 +00003530 M, ErrorStr);
Guy Benyei11169dd2012-12-18 14:30:41 +00003531
Douglas Gregor7029ce12013-03-19 00:28:20 +00003532 switch (AddResult) {
3533 case ModuleManager::AlreadyLoaded:
3534 return Success;
3535
3536 case ModuleManager::NewlyLoaded:
3537 // Load module file below.
3538 break;
3539
3540 case ModuleManager::Missing:
Richard Smithe842a472014-10-22 02:05:46 +00003541 // The module file was missing; if the client can handle that, return
Douglas Gregor7029ce12013-03-19 00:28:20 +00003542 // it.
3543 if (ClientLoadCapabilities & ARR_Missing)
3544 return Missing;
3545
3546 // Otherwise, return an error.
3547 {
3548 std::string Msg = "Unable to load module \"" + FileName.str() + "\": "
3549 + ErrorStr;
3550 Error(Msg);
3551 }
3552 return Failure;
3553
3554 case ModuleManager::OutOfDate:
3555 // We couldn't load the module file because it is out-of-date. If the
3556 // client can handle out-of-date, return it.
3557 if (ClientLoadCapabilities & ARR_OutOfDate)
3558 return OutOfDate;
3559
3560 // Otherwise, return an error.
3561 {
3562 std::string Msg = "Unable to load module \"" + FileName.str() + "\": "
3563 + ErrorStr;
3564 Error(Msg);
3565 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003566 return Failure;
3567 }
3568
Douglas Gregor7029ce12013-03-19 00:28:20 +00003569 assert(M && "Missing module file");
Guy Benyei11169dd2012-12-18 14:30:41 +00003570
3571 // FIXME: This seems rather a hack. Should CurrentDir be part of the
3572 // module?
3573 if (FileName != "-") {
3574 CurrentDir = llvm::sys::path::parent_path(FileName);
3575 if (CurrentDir.empty()) CurrentDir = ".";
3576 }
3577
3578 ModuleFile &F = *M;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00003579 BitstreamCursor &Stream = F.Stream;
Rafael Espindolafd832392014-11-12 14:48:44 +00003580 Stream.init(&F.StreamFile);
Adrian Prantlcbc368c2015-02-25 02:44:04 +00003581 F.SizeInBits = F.Buffer->getBufferSize() * 8;
3582
Guy Benyei11169dd2012-12-18 14:30:41 +00003583 // Sniff for the signature.
Ben Langmuir70a1b812015-03-24 04:43:52 +00003584 if (!startsWithASTFileMagic(Stream)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003585 Diag(diag::err_not_a_pch_file) << FileName;
3586 return Failure;
3587 }
3588
3589 // This is used for compatibility with older PCH formats.
3590 bool HaveReadControlBlock = false;
3591
Chris Lattnerefa77172013-01-20 00:00:22 +00003592 while (1) {
3593 llvm::BitstreamEntry Entry = Stream.advance();
3594
3595 switch (Entry.Kind) {
3596 case llvm::BitstreamEntry::Error:
3597 case llvm::BitstreamEntry::EndBlock:
3598 case llvm::BitstreamEntry::Record:
Guy Benyei11169dd2012-12-18 14:30:41 +00003599 Error("invalid record at top-level of AST file");
3600 return Failure;
Chris Lattnerefa77172013-01-20 00:00:22 +00003601
3602 case llvm::BitstreamEntry::SubBlock:
3603 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00003604 }
3605
Guy Benyei11169dd2012-12-18 14:30:41 +00003606 // We only know the control subblock ID.
Chris Lattnerefa77172013-01-20 00:00:22 +00003607 switch (Entry.ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003608 case llvm::bitc::BLOCKINFO_BLOCK_ID:
3609 if (Stream.ReadBlockInfoBlock()) {
3610 Error("malformed BlockInfoBlock in AST file");
3611 return Failure;
3612 }
3613 break;
3614 case CONTROL_BLOCK_ID:
3615 HaveReadControlBlock = true;
Ben Langmuirbeee15e2014-04-14 18:00:01 +00003616 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003617 case Success:
3618 break;
3619
3620 case Failure: return Failure;
Douglas Gregor7029ce12013-03-19 00:28:20 +00003621 case Missing: return Missing;
Guy Benyei11169dd2012-12-18 14:30:41 +00003622 case OutOfDate: return OutOfDate;
3623 case VersionMismatch: return VersionMismatch;
3624 case ConfigurationMismatch: return ConfigurationMismatch;
3625 case HadErrors: return HadErrors;
3626 }
3627 break;
3628 case AST_BLOCK_ID:
3629 if (!HaveReadControlBlock) {
3630 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
Dmitri Gribenko2228cd32014-02-11 15:40:09 +00003631 Diag(diag::err_pch_version_too_old);
Guy Benyei11169dd2012-12-18 14:30:41 +00003632 return VersionMismatch;
3633 }
3634
3635 // Record that we've loaded this module.
3636 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc));
3637 return Success;
3638
3639 default:
3640 if (Stream.SkipBlock()) {
3641 Error("malformed block record in AST file");
3642 return Failure;
3643 }
3644 break;
3645 }
3646 }
3647
3648 return Success;
3649}
3650
Richard Smitha7e2cc62015-05-01 01:53:09 +00003651void ASTReader::InitializeContext() {
Guy Benyei11169dd2012-12-18 14:30:41 +00003652 // If there's a listener, notify them that we "read" the translation unit.
3653 if (DeserializationListener)
3654 DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID,
3655 Context.getTranslationUnitDecl());
3656
Guy Benyei11169dd2012-12-18 14:30:41 +00003657 // FIXME: Find a better way to deal with collisions between these
3658 // built-in types. Right now, we just ignore the problem.
3659
3660 // Load the special types.
3661 if (SpecialTypes.size() >= NumSpecialTypeIDs) {
3662 if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) {
3663 if (!Context.CFConstantStringTypeDecl)
3664 Context.setCFConstantStringType(GetType(String));
3665 }
3666
3667 if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) {
3668 QualType FileType = GetType(File);
3669 if (FileType.isNull()) {
3670 Error("FILE type is NULL");
3671 return;
3672 }
3673
3674 if (!Context.FILEDecl) {
3675 if (const TypedefType *Typedef = FileType->getAs<TypedefType>())
3676 Context.setFILEDecl(Typedef->getDecl());
3677 else {
3678 const TagType *Tag = FileType->getAs<TagType>();
3679 if (!Tag) {
3680 Error("Invalid FILE type in AST file");
3681 return;
3682 }
3683 Context.setFILEDecl(Tag->getDecl());
3684 }
3685 }
3686 }
3687
3688 if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) {
3689 QualType Jmp_bufType = GetType(Jmp_buf);
3690 if (Jmp_bufType.isNull()) {
3691 Error("jmp_buf type is NULL");
3692 return;
3693 }
3694
3695 if (!Context.jmp_bufDecl) {
3696 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>())
3697 Context.setjmp_bufDecl(Typedef->getDecl());
3698 else {
3699 const TagType *Tag = Jmp_bufType->getAs<TagType>();
3700 if (!Tag) {
3701 Error("Invalid jmp_buf type in AST file");
3702 return;
3703 }
3704 Context.setjmp_bufDecl(Tag->getDecl());
3705 }
3706 }
3707 }
3708
3709 if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) {
3710 QualType Sigjmp_bufType = GetType(Sigjmp_buf);
3711 if (Sigjmp_bufType.isNull()) {
3712 Error("sigjmp_buf type is NULL");
3713 return;
3714 }
3715
3716 if (!Context.sigjmp_bufDecl) {
3717 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>())
3718 Context.setsigjmp_bufDecl(Typedef->getDecl());
3719 else {
3720 const TagType *Tag = Sigjmp_bufType->getAs<TagType>();
3721 assert(Tag && "Invalid sigjmp_buf type in AST file");
3722 Context.setsigjmp_bufDecl(Tag->getDecl());
3723 }
3724 }
3725 }
3726
3727 if (unsigned ObjCIdRedef
3728 = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) {
3729 if (Context.ObjCIdRedefinitionType.isNull())
3730 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef);
3731 }
3732
3733 if (unsigned ObjCClassRedef
3734 = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) {
3735 if (Context.ObjCClassRedefinitionType.isNull())
3736 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef);
3737 }
3738
3739 if (unsigned ObjCSelRedef
3740 = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) {
3741 if (Context.ObjCSelRedefinitionType.isNull())
3742 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef);
3743 }
3744
3745 if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) {
3746 QualType Ucontext_tType = GetType(Ucontext_t);
3747 if (Ucontext_tType.isNull()) {
3748 Error("ucontext_t type is NULL");
3749 return;
3750 }
3751
3752 if (!Context.ucontext_tDecl) {
3753 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>())
3754 Context.setucontext_tDecl(Typedef->getDecl());
3755 else {
3756 const TagType *Tag = Ucontext_tType->getAs<TagType>();
3757 assert(Tag && "Invalid ucontext_t type in AST file");
3758 Context.setucontext_tDecl(Tag->getDecl());
3759 }
3760 }
3761 }
3762 }
3763
3764 ReadPragmaDiagnosticMappings(Context.getDiagnostics());
3765
3766 // If there were any CUDA special declarations, deserialize them.
3767 if (!CUDASpecialDeclRefs.empty()) {
3768 assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!");
3769 Context.setcudaConfigureCallDecl(
3770 cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0])));
3771 }
Richard Smith56be7542014-03-21 00:33:59 +00003772
Guy Benyei11169dd2012-12-18 14:30:41 +00003773 // Re-export any modules that were imported by a non-module AST file.
Richard Smitha7e2cc62015-05-01 01:53:09 +00003774 // FIXME: This does not make macro-only imports visible again.
Richard Smith56be7542014-03-21 00:33:59 +00003775 for (auto &Import : ImportedModules) {
Richard Smitha7e2cc62015-05-01 01:53:09 +00003776 if (Module *Imported = getSubmodule(Import.ID)) {
Argyrios Kyrtzidis125df052013-02-01 16:36:12 +00003777 makeModuleVisible(Imported, Module::AllVisible,
Richard Smitha7e2cc62015-05-01 01:53:09 +00003778 /*ImportLoc=*/Import.ImportLoc);
3779 PP.makeModuleVisible(Imported, Import.ImportLoc);
3780 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003781 }
3782 ImportedModules.clear();
3783}
3784
3785void ASTReader::finalizeForWriting() {
Richard Smithde711422015-04-23 21:20:19 +00003786 // Nothing to do for now.
Guy Benyei11169dd2012-12-18 14:30:41 +00003787}
3788
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00003789/// \brief Given a cursor at the start of an AST file, scan ahead and drop the
3790/// cursor into the start of the given block ID, returning false on success and
3791/// true on failure.
3792static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00003793 while (1) {
3794 llvm::BitstreamEntry Entry = Cursor.advance();
3795 switch (Entry.Kind) {
3796 case llvm::BitstreamEntry::Error:
3797 case llvm::BitstreamEntry::EndBlock:
3798 return true;
3799
3800 case llvm::BitstreamEntry::Record:
3801 // Ignore top-level records.
3802 Cursor.skipRecord(Entry.ID);
3803 break;
3804
3805 case llvm::BitstreamEntry::SubBlock:
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00003806 if (Entry.ID == BlockID) {
3807 if (Cursor.EnterSubBlock(BlockID))
Chris Lattner7fb3bef2013-01-20 00:56:42 +00003808 return true;
3809 // Found it!
3810 return false;
3811 }
3812
3813 if (Cursor.SkipBlock())
3814 return true;
3815 }
3816 }
3817}
3818
Ben Langmuir70a1b812015-03-24 04:43:52 +00003819/// \brief Reads and return the signature record from \p StreamFile's control
3820/// block, or else returns 0.
Ben Langmuir487ea142014-10-23 18:05:36 +00003821static ASTFileSignature readASTFileSignature(llvm::BitstreamReader &StreamFile){
3822 BitstreamCursor Stream(StreamFile);
Ben Langmuir70a1b812015-03-24 04:43:52 +00003823 if (!startsWithASTFileMagic(Stream))
Ben Langmuir487ea142014-10-23 18:05:36 +00003824 return 0;
Ben Langmuir487ea142014-10-23 18:05:36 +00003825
3826 // Scan for the CONTROL_BLOCK_ID block.
3827 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID))
3828 return 0;
3829
3830 // Scan for SIGNATURE inside the control block.
3831 ASTReader::RecordData Record;
3832 while (1) {
3833 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
3834 if (Entry.Kind == llvm::BitstreamEntry::EndBlock ||
3835 Entry.Kind != llvm::BitstreamEntry::Record)
3836 return 0;
3837
3838 Record.clear();
3839 StringRef Blob;
3840 if (SIGNATURE == Stream.readRecord(Entry.ID, Record, &Blob))
3841 return Record[0];
3842 }
3843}
3844
Guy Benyei11169dd2012-12-18 14:30:41 +00003845/// \brief Retrieve the name of the original source file name
3846/// directly from the AST file, without actually loading the AST
3847/// file.
3848std::string ASTReader::getOriginalSourceFile(const std::string &ASTFileName,
3849 FileManager &FileMgr,
3850 DiagnosticsEngine &Diags) {
3851 // Open the AST file.
Benjamin Kramera8857962014-10-26 22:44:13 +00003852 auto Buffer = FileMgr.getBufferForFile(ASTFileName);
Guy Benyei11169dd2012-12-18 14:30:41 +00003853 if (!Buffer) {
Benjamin Kramera8857962014-10-26 22:44:13 +00003854 Diags.Report(diag::err_fe_unable_to_read_pch_file)
3855 << ASTFileName << Buffer.getError().message();
Guy Benyei11169dd2012-12-18 14:30:41 +00003856 return std::string();
3857 }
3858
3859 // Initialize the stream
3860 llvm::BitstreamReader StreamFile;
Adrian Prantlcbc368c2015-02-25 02:44:04 +00003861 StreamFile.init((const unsigned char *)(*Buffer)->getBufferStart(),
3862 (const unsigned char *)(*Buffer)->getBufferEnd());
Rafael Espindolaaf0e40a2014-11-12 14:42:25 +00003863 BitstreamCursor Stream(StreamFile);
Guy Benyei11169dd2012-12-18 14:30:41 +00003864
3865 // Sniff for the signature.
Ben Langmuir70a1b812015-03-24 04:43:52 +00003866 if (!startsWithASTFileMagic(Stream)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003867 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName;
3868 return std::string();
3869 }
Chris Lattner7fb3bef2013-01-20 00:56:42 +00003870
Chris Lattnere7b154b2013-01-19 21:39:22 +00003871 // Scan for the CONTROL_BLOCK_ID block.
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00003872 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00003873 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
3874 return std::string();
Chris Lattnere7b154b2013-01-19 21:39:22 +00003875 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003876
Chris Lattner7fb3bef2013-01-20 00:56:42 +00003877 // Scan for ORIGINAL_FILE inside the control block.
3878 RecordData Record;
Chris Lattnere7b154b2013-01-19 21:39:22 +00003879 while (1) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00003880 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
Chris Lattnere7b154b2013-01-19 21:39:22 +00003881 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
3882 return std::string();
3883
3884 if (Entry.Kind != llvm::BitstreamEntry::Record) {
3885 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
3886 return std::string();
Guy Benyei11169dd2012-12-18 14:30:41 +00003887 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00003888
Guy Benyei11169dd2012-12-18 14:30:41 +00003889 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00003890 StringRef Blob;
3891 if (Stream.readRecord(Entry.ID, Record, &Blob) == ORIGINAL_FILE)
3892 return Blob.str();
Guy Benyei11169dd2012-12-18 14:30:41 +00003893 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003894}
3895
3896namespace {
3897 class SimplePCHValidator : public ASTReaderListener {
3898 const LangOptions &ExistingLangOpts;
3899 const TargetOptions &ExistingTargetOpts;
3900 const PreprocessorOptions &ExistingPPOpts;
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00003901 std::string ExistingModuleCachePath;
Guy Benyei11169dd2012-12-18 14:30:41 +00003902 FileManager &FileMgr;
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00003903
Guy Benyei11169dd2012-12-18 14:30:41 +00003904 public:
3905 SimplePCHValidator(const LangOptions &ExistingLangOpts,
3906 const TargetOptions &ExistingTargetOpts,
3907 const PreprocessorOptions &ExistingPPOpts,
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00003908 StringRef ExistingModuleCachePath,
Guy Benyei11169dd2012-12-18 14:30:41 +00003909 FileManager &FileMgr)
3910 : ExistingLangOpts(ExistingLangOpts),
3911 ExistingTargetOpts(ExistingTargetOpts),
3912 ExistingPPOpts(ExistingPPOpts),
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00003913 ExistingModuleCachePath(ExistingModuleCachePath),
Guy Benyei11169dd2012-12-18 14:30:41 +00003914 FileMgr(FileMgr)
3915 {
3916 }
3917
Richard Smith1e2cf0d2014-10-31 02:28:58 +00003918 bool ReadLanguageOptions(const LangOptions &LangOpts, bool Complain,
3919 bool AllowCompatibleDifferences) override {
3920 return checkLanguageOptions(ExistingLangOpts, LangOpts, nullptr,
3921 AllowCompatibleDifferences);
Guy Benyei11169dd2012-12-18 14:30:41 +00003922 }
Chandler Carruth0d745bc2015-03-14 04:47:43 +00003923 bool ReadTargetOptions(const TargetOptions &TargetOpts, bool Complain,
3924 bool AllowCompatibleDifferences) override {
3925 return checkTargetOptions(ExistingTargetOpts, TargetOpts, nullptr,
3926 AllowCompatibleDifferences);
Guy Benyei11169dd2012-12-18 14:30:41 +00003927 }
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00003928 bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
3929 StringRef SpecificModuleCachePath,
3930 bool Complain) override {
3931 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
3932 ExistingModuleCachePath,
3933 nullptr, ExistingLangOpts);
3934 }
Craig Topper3e89dfe2014-03-13 02:13:41 +00003935 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
3936 bool Complain,
3937 std::string &SuggestedPredefines) override {
Craig Toppera13603a2014-05-22 05:54:18 +00003938 return checkPreprocessorOptions(ExistingPPOpts, PPOpts, nullptr, FileMgr,
Argyrios Kyrtzidisd3afa0c2013-04-26 21:33:40 +00003939 SuggestedPredefines, ExistingLangOpts);
Guy Benyei11169dd2012-12-18 14:30:41 +00003940 }
3941 };
3942}
3943
3944bool ASTReader::readASTFileControlBlock(StringRef Filename,
3945 FileManager &FileMgr,
3946 ASTReaderListener &Listener) {
3947 // Open the AST file.
Richard Smith7f330cd2015-03-18 01:42:29 +00003948 // FIXME: This allows use of the VFS; we do not allow use of the
3949 // VFS when actually loading a module.
Benjamin Kramera8857962014-10-26 22:44:13 +00003950 auto Buffer = FileMgr.getBufferForFile(Filename);
Guy Benyei11169dd2012-12-18 14:30:41 +00003951 if (!Buffer) {
3952 return true;
3953 }
3954
3955 // Initialize the stream
3956 llvm::BitstreamReader StreamFile;
Adrian Prantlcbc368c2015-02-25 02:44:04 +00003957 StreamFile.init((const unsigned char *)(*Buffer)->getBufferStart(),
3958 (const unsigned char *)(*Buffer)->getBufferEnd());
Rafael Espindolaaf0e40a2014-11-12 14:42:25 +00003959 BitstreamCursor Stream(StreamFile);
Guy Benyei11169dd2012-12-18 14:30:41 +00003960
3961 // Sniff for the signature.
Ben Langmuir70a1b812015-03-24 04:43:52 +00003962 if (!startsWithASTFileMagic(Stream))
Guy Benyei11169dd2012-12-18 14:30:41 +00003963 return true;
Guy Benyei11169dd2012-12-18 14:30:41 +00003964
Chris Lattner7fb3bef2013-01-20 00:56:42 +00003965 // Scan for the CONTROL_BLOCK_ID block.
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00003966 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID))
Chris Lattner7fb3bef2013-01-20 00:56:42 +00003967 return true;
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00003968
3969 bool NeedsInputFiles = Listener.needsInputFileVisitation();
Ben Langmuircb69b572014-03-07 06:40:32 +00003970 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
Richard Smithd4b230b2014-10-27 23:01:16 +00003971 bool NeedsImports = Listener.needsImportVisitation();
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00003972 BitstreamCursor InputFilesCursor;
3973 if (NeedsInputFiles) {
3974 InputFilesCursor = Stream;
3975 if (SkipCursorToBlock(InputFilesCursor, INPUT_FILES_BLOCK_ID))
3976 return true;
3977
3978 // Read the abbreviations
3979 while (true) {
3980 uint64_t Offset = InputFilesCursor.GetCurrentBitNo();
3981 unsigned Code = InputFilesCursor.ReadCode();
3982
3983 // We expect all abbrevs to be at the start of the block.
3984 if (Code != llvm::bitc::DEFINE_ABBREV) {
3985 InputFilesCursor.JumpToBit(Offset);
3986 break;
3987 }
3988 InputFilesCursor.ReadAbbrevRecord();
3989 }
3990 }
Chris Lattner7fb3bef2013-01-20 00:56:42 +00003991
3992 // Scan for ORIGINAL_FILE inside the control block.
Guy Benyei11169dd2012-12-18 14:30:41 +00003993 RecordData Record;
Richard Smith7ed1bc92014-12-05 22:42:13 +00003994 std::string ModuleDir;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00003995 while (1) {
3996 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
3997 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
3998 return false;
3999
4000 if (Entry.Kind != llvm::BitstreamEntry::Record)
4001 return true;
4002
Guy Benyei11169dd2012-12-18 14:30:41 +00004003 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00004004 StringRef Blob;
4005 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob);
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004006 switch ((ControlRecordTypes)RecCode) {
4007 case METADATA: {
4008 if (Record[0] != VERSION_MAJOR)
4009 return true;
Guy Benyei11169dd2012-12-18 14:30:41 +00004010
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004011 if (Listener.ReadFullVersionInformation(Blob))
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004012 return true;
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004013
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004014 break;
4015 }
Ben Langmuir4f5212a2014-04-14 22:12:44 +00004016 case MODULE_NAME:
4017 Listener.ReadModuleName(Blob);
4018 break;
Richard Smith7ed1bc92014-12-05 22:42:13 +00004019 case MODULE_DIRECTORY:
4020 ModuleDir = Blob;
4021 break;
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00004022 case MODULE_MAP_FILE: {
4023 unsigned Idx = 0;
Richard Smith7ed1bc92014-12-05 22:42:13 +00004024 auto Path = ReadString(Record, Idx);
4025 ResolveImportedPath(Path, ModuleDir);
4026 Listener.ReadModuleMapFile(Path);
Ben Langmuir4f5212a2014-04-14 22:12:44 +00004027 break;
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00004028 }
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004029 case LANGUAGE_OPTIONS:
Richard Smith1e2cf0d2014-10-31 02:28:58 +00004030 if (ParseLanguageOptions(Record, false, Listener,
4031 /*AllowCompatibleConfigurationMismatch*/false))
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004032 return true;
4033 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004034
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004035 case TARGET_OPTIONS:
Chandler Carruth0d745bc2015-03-14 04:47:43 +00004036 if (ParseTargetOptions(Record, false, Listener,
4037 /*AllowCompatibleConfigurationMismatch*/ false))
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004038 return true;
4039 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004040
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004041 case DIAGNOSTIC_OPTIONS:
4042 if (ParseDiagnosticOptions(Record, false, Listener))
4043 return true;
4044 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004045
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004046 case FILE_SYSTEM_OPTIONS:
4047 if (ParseFileSystemOptions(Record, false, Listener))
4048 return true;
4049 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004050
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004051 case HEADER_SEARCH_OPTIONS:
4052 if (ParseHeaderSearchOptions(Record, false, Listener))
4053 return true;
4054 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004055
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004056 case PREPROCESSOR_OPTIONS: {
4057 std::string IgnoredSuggestedPredefines;
4058 if (ParsePreprocessorOptions(Record, false, Listener,
4059 IgnoredSuggestedPredefines))
4060 return true;
4061 break;
4062 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004063
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004064 case INPUT_FILE_OFFSETS: {
4065 if (!NeedsInputFiles)
4066 break;
4067
4068 unsigned NumInputFiles = Record[0];
4069 unsigned NumUserFiles = Record[1];
Richard Smithec216502015-02-13 19:48:37 +00004070 const uint64_t *InputFileOffs = (const uint64_t *)Blob.data();
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004071 for (unsigned I = 0; I != NumInputFiles; ++I) {
4072 // Go find this input file.
4073 bool isSystemFile = I >= NumUserFiles;
Ben Langmuircb69b572014-03-07 06:40:32 +00004074
4075 if (isSystemFile && !NeedsSystemInputFiles)
4076 break; // the rest are system input files
4077
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004078 BitstreamCursor &Cursor = InputFilesCursor;
4079 SavedStreamPosition SavedPosition(Cursor);
4080 Cursor.JumpToBit(InputFileOffs[I]);
4081
4082 unsigned Code = Cursor.ReadCode();
4083 RecordData Record;
4084 StringRef Blob;
4085 bool shouldContinue = false;
4086 switch ((InputFileRecordTypes)Cursor.readRecord(Code, Record, &Blob)) {
4087 case INPUT_FILE:
Argyrios Kyrtzidis68ccbe02014-03-14 02:26:31 +00004088 bool Overridden = static_cast<bool>(Record[3]);
Richard Smith7ed1bc92014-12-05 22:42:13 +00004089 std::string Filename = Blob;
4090 ResolveImportedPath(Filename, ModuleDir);
4091 shouldContinue =
4092 Listener.visitInputFile(Filename, isSystemFile, Overridden);
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004093 break;
4094 }
4095 if (!shouldContinue)
4096 break;
4097 }
4098 break;
4099 }
4100
Richard Smithd4b230b2014-10-27 23:01:16 +00004101 case IMPORTS: {
4102 if (!NeedsImports)
4103 break;
4104
4105 unsigned Idx = 0, N = Record.size();
4106 while (Idx < N) {
4107 // Read information about the AST file.
Richard Smith79c98cc2014-10-27 23:25:15 +00004108 Idx += 5; // ImportLoc, Size, ModTime, Signature
Richard Smith7ed1bc92014-12-05 22:42:13 +00004109 std::string Filename = ReadString(Record, Idx);
4110 ResolveImportedPath(Filename, ModuleDir);
4111 Listener.visitImport(Filename);
Richard Smithd4b230b2014-10-27 23:01:16 +00004112 }
4113 break;
4114 }
4115
Richard Smith7f330cd2015-03-18 01:42:29 +00004116 case KNOWN_MODULE_FILES: {
4117 // Known-but-not-technically-used module files are treated as imports.
4118 if (!NeedsImports)
4119 break;
4120
4121 unsigned Idx = 0, N = Record.size();
4122 while (Idx < N) {
4123 std::string Filename = ReadString(Record, Idx);
4124 ResolveImportedPath(Filename, ModuleDir);
4125 Listener.visitImport(Filename);
4126 }
4127 break;
4128 }
4129
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004130 default:
4131 // No other validation to perform.
4132 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004133 }
4134 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004135}
4136
4137
4138bool ASTReader::isAcceptableASTFile(StringRef Filename,
4139 FileManager &FileMgr,
4140 const LangOptions &LangOpts,
4141 const TargetOptions &TargetOpts,
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00004142 const PreprocessorOptions &PPOpts,
4143 std::string ExistingModuleCachePath) {
4144 SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts,
4145 ExistingModuleCachePath, FileMgr);
Guy Benyei11169dd2012-12-18 14:30:41 +00004146 return !readASTFileControlBlock(Filename, FileMgr, validator);
4147}
4148
Ben Langmuir2c9af442014-04-10 17:57:43 +00004149ASTReader::ASTReadResult
4150ASTReader::ReadSubmoduleBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004151 // Enter the submodule block.
4152 if (F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) {
4153 Error("malformed submodule block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004154 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004155 }
4156
4157 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
4158 bool First = true;
Craig Toppera13603a2014-05-22 05:54:18 +00004159 Module *CurrentModule = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00004160 RecordData Record;
4161 while (true) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004162 llvm::BitstreamEntry Entry = F.Stream.advanceSkippingSubblocks();
4163
4164 switch (Entry.Kind) {
4165 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
4166 case llvm::BitstreamEntry::Error:
4167 Error("malformed block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004168 return Failure;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004169 case llvm::BitstreamEntry::EndBlock:
Ben Langmuir2c9af442014-04-10 17:57:43 +00004170 return Success;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004171 case llvm::BitstreamEntry::Record:
4172 // The interesting case.
4173 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004174 }
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004175
Guy Benyei11169dd2012-12-18 14:30:41 +00004176 // Read a record.
Chris Lattner0e6c9402013-01-20 02:38:54 +00004177 StringRef Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00004178 Record.clear();
Richard Smith03478d92014-10-23 22:12:14 +00004179 auto Kind = F.Stream.readRecord(Entry.ID, Record, &Blob);
4180
4181 if ((Kind == SUBMODULE_METADATA) != First) {
4182 Error("submodule metadata record should be at beginning of block");
4183 return Failure;
4184 }
4185 First = false;
4186
4187 // Submodule information is only valid if we have a current module.
4188 // FIXME: Should we error on these cases?
4189 if (!CurrentModule && Kind != SUBMODULE_METADATA &&
4190 Kind != SUBMODULE_DEFINITION)
4191 continue;
4192
4193 switch (Kind) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004194 default: // Default behavior: ignore.
4195 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004196
Richard Smith03478d92014-10-23 22:12:14 +00004197 case SUBMODULE_DEFINITION: {
Douglas Gregor8d932422013-03-20 03:59:18 +00004198 if (Record.size() < 8) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004199 Error("malformed module definition");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004200 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004201 }
Richard Smith03478d92014-10-23 22:12:14 +00004202
Chris Lattner0e6c9402013-01-20 02:38:54 +00004203 StringRef Name = Blob;
Richard Smith9bca2982014-03-08 00:03:56 +00004204 unsigned Idx = 0;
4205 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]);
4206 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]);
4207 bool IsFramework = Record[Idx++];
4208 bool IsExplicit = Record[Idx++];
4209 bool IsSystem = Record[Idx++];
4210 bool IsExternC = Record[Idx++];
4211 bool InferSubmodules = Record[Idx++];
4212 bool InferExplicitSubmodules = Record[Idx++];
4213 bool InferExportWildcard = Record[Idx++];
4214 bool ConfigMacrosExhaustive = Record[Idx++];
Douglas Gregor8d932422013-03-20 03:59:18 +00004215
Ben Langmuirbeee15e2014-04-14 18:00:01 +00004216 Module *ParentModule = nullptr;
Ben Langmuir9d6448b2014-08-09 00:57:23 +00004217 if (Parent)
Guy Benyei11169dd2012-12-18 14:30:41 +00004218 ParentModule = getSubmodule(Parent);
Ben Langmuirbeee15e2014-04-14 18:00:01 +00004219
Guy Benyei11169dd2012-12-18 14:30:41 +00004220 // Retrieve this (sub)module from the module map, creating it if
4221 // necessary.
Ben Langmuir9d6448b2014-08-09 00:57:23 +00004222 CurrentModule = ModMap.findOrCreateModule(Name, ParentModule, IsFramework,
Guy Benyei11169dd2012-12-18 14:30:41 +00004223 IsExplicit).first;
Ben Langmuir9d6448b2014-08-09 00:57:23 +00004224
4225 // FIXME: set the definition loc for CurrentModule, or call
4226 // ModMap.setInferredModuleAllowedBy()
4227
Guy Benyei11169dd2012-12-18 14:30:41 +00004228 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS;
4229 if (GlobalIndex >= SubmodulesLoaded.size() ||
4230 SubmodulesLoaded[GlobalIndex]) {
4231 Error("too many submodules");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004232 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004233 }
Douglas Gregor8a114ab2013-02-06 22:40:31 +00004234
Douglas Gregor7029ce12013-03-19 00:28:20 +00004235 if (!ParentModule) {
4236 if (const FileEntry *CurFile = CurrentModule->getASTFile()) {
4237 if (CurFile != F.File) {
4238 if (!Diags.isDiagnosticInFlight()) {
4239 Diag(diag::err_module_file_conflict)
4240 << CurrentModule->getTopLevelModuleName()
4241 << CurFile->getName()
4242 << F.File->getName();
4243 }
Ben Langmuir2c9af442014-04-10 17:57:43 +00004244 return Failure;
Douglas Gregor8a114ab2013-02-06 22:40:31 +00004245 }
Douglas Gregor8a114ab2013-02-06 22:40:31 +00004246 }
Douglas Gregor7029ce12013-03-19 00:28:20 +00004247
4248 CurrentModule->setASTFile(F.File);
Douglas Gregor8a114ab2013-02-06 22:40:31 +00004249 }
Ben Langmuirbeee15e2014-04-14 18:00:01 +00004250
Guy Benyei11169dd2012-12-18 14:30:41 +00004251 CurrentModule->IsFromModuleFile = true;
4252 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem;
Richard Smith9bca2982014-03-08 00:03:56 +00004253 CurrentModule->IsExternC = IsExternC;
Guy Benyei11169dd2012-12-18 14:30:41 +00004254 CurrentModule->InferSubmodules = InferSubmodules;
4255 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules;
4256 CurrentModule->InferExportWildcard = InferExportWildcard;
Douglas Gregor8d932422013-03-20 03:59:18 +00004257 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive;
Guy Benyei11169dd2012-12-18 14:30:41 +00004258 if (DeserializationListener)
4259 DeserializationListener->ModuleRead(GlobalID, CurrentModule);
4260
4261 SubmodulesLoaded[GlobalIndex] = CurrentModule;
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004262
Douglas Gregorfb912652013-03-20 21:10:35 +00004263 // Clear out data that will be replaced by what is the module file.
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004264 CurrentModule->LinkLibraries.clear();
Douglas Gregor8d932422013-03-20 03:59:18 +00004265 CurrentModule->ConfigMacros.clear();
Douglas Gregorfb912652013-03-20 21:10:35 +00004266 CurrentModule->UnresolvedConflicts.clear();
4267 CurrentModule->Conflicts.clear();
Guy Benyei11169dd2012-12-18 14:30:41 +00004268 break;
4269 }
4270
4271 case SUBMODULE_UMBRELLA_HEADER: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00004272 if (const FileEntry *Umbrella = PP.getFileManager().getFile(Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004273 if (!CurrentModule->getUmbrellaHeader())
4274 ModMap.setUmbrellaHeader(CurrentModule, Umbrella);
4275 else if (CurrentModule->getUmbrellaHeader() != Umbrella) {
Ben Langmuirbc35fbe2015-02-20 21:46:39 +00004276 // This can be a spurious difference caused by changing the VFS to
4277 // point to a different copy of the file, and it is too late to
4278 // to rebuild safely.
4279 // FIXME: If we wrote the virtual paths instead of the 'real' paths,
4280 // after input file validation only real problems would remain and we
4281 // could just error. For now, assume it's okay.
4282 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004283 }
4284 }
4285 break;
4286 }
4287
Richard Smith202210b2014-10-24 20:23:01 +00004288 case SUBMODULE_HEADER:
4289 case SUBMODULE_EXCLUDED_HEADER:
4290 case SUBMODULE_PRIVATE_HEADER:
4291 // We lazily associate headers with their modules via the HeaderInfo table.
Argyrios Kyrtzidisb146baa2013-03-13 21:13:51 +00004292 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
4293 // of complete filenames or remove it entirely.
Richard Smith202210b2014-10-24 20:23:01 +00004294 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004295
Richard Smith202210b2014-10-24 20:23:01 +00004296 case SUBMODULE_TEXTUAL_HEADER:
4297 case SUBMODULE_PRIVATE_TEXTUAL_HEADER:
4298 // FIXME: Textual headers are not marked in the HeaderInfo table. Load
4299 // them here.
4300 break;
Lawrence Crowlb53e5482013-06-20 21:14:14 +00004301
Guy Benyei11169dd2012-12-18 14:30:41 +00004302 case SUBMODULE_TOPHEADER: {
Argyrios Kyrtzidis3c5305c2013-03-13 21:13:43 +00004303 CurrentModule->addTopHeaderFilename(Blob);
Guy Benyei11169dd2012-12-18 14:30:41 +00004304 break;
4305 }
4306
4307 case SUBMODULE_UMBRELLA_DIR: {
Guy Benyei11169dd2012-12-18 14:30:41 +00004308 if (const DirectoryEntry *Umbrella
Chris Lattner0e6c9402013-01-20 02:38:54 +00004309 = PP.getFileManager().getDirectory(Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004310 if (!CurrentModule->getUmbrellaDir())
4311 ModMap.setUmbrellaDir(CurrentModule, Umbrella);
4312 else if (CurrentModule->getUmbrellaDir() != Umbrella) {
Ben Langmuir2c9af442014-04-10 17:57:43 +00004313 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
4314 Error("mismatched umbrella directories in submodule");
4315 return OutOfDate;
Guy Benyei11169dd2012-12-18 14:30:41 +00004316 }
4317 }
4318 break;
4319 }
4320
4321 case SUBMODULE_METADATA: {
Guy Benyei11169dd2012-12-18 14:30:41 +00004322 F.BaseSubmoduleID = getTotalNumSubmodules();
4323 F.LocalNumSubmodules = Record[0];
4324 unsigned LocalBaseSubmoduleID = Record[1];
4325 if (F.LocalNumSubmodules > 0) {
4326 // Introduce the global -> local mapping for submodules within this
4327 // module.
4328 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F));
4329
4330 // Introduce the local -> global mapping for submodules within this
4331 // module.
4332 F.SubmoduleRemap.insertOrReplace(
4333 std::make_pair(LocalBaseSubmoduleID,
4334 F.BaseSubmoduleID - LocalBaseSubmoduleID));
Ben Langmuirfe971d92014-08-16 04:54:18 +00004335
Ben Langmuir52ca6782014-10-20 16:27:32 +00004336 SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules);
4337 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004338 break;
4339 }
4340
4341 case SUBMODULE_IMPORTS: {
Guy Benyei11169dd2012-12-18 14:30:41 +00004342 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) {
Douglas Gregorfb912652013-03-20 21:10:35 +00004343 UnresolvedModuleRef Unresolved;
Guy Benyei11169dd2012-12-18 14:30:41 +00004344 Unresolved.File = &F;
4345 Unresolved.Mod = CurrentModule;
4346 Unresolved.ID = Record[Idx];
Douglas Gregorfb912652013-03-20 21:10:35 +00004347 Unresolved.Kind = UnresolvedModuleRef::Import;
Guy Benyei11169dd2012-12-18 14:30:41 +00004348 Unresolved.IsWildcard = false;
Douglas Gregorfb912652013-03-20 21:10:35 +00004349 UnresolvedModuleRefs.push_back(Unresolved);
Guy Benyei11169dd2012-12-18 14:30:41 +00004350 }
4351 break;
4352 }
4353
4354 case SUBMODULE_EXPORTS: {
Guy Benyei11169dd2012-12-18 14:30:41 +00004355 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) {
Douglas Gregorfb912652013-03-20 21:10:35 +00004356 UnresolvedModuleRef Unresolved;
Guy Benyei11169dd2012-12-18 14:30:41 +00004357 Unresolved.File = &F;
4358 Unresolved.Mod = CurrentModule;
4359 Unresolved.ID = Record[Idx];
Douglas Gregorfb912652013-03-20 21:10:35 +00004360 Unresolved.Kind = UnresolvedModuleRef::Export;
Guy Benyei11169dd2012-12-18 14:30:41 +00004361 Unresolved.IsWildcard = Record[Idx + 1];
Douglas Gregorfb912652013-03-20 21:10:35 +00004362 UnresolvedModuleRefs.push_back(Unresolved);
Guy Benyei11169dd2012-12-18 14:30:41 +00004363 }
4364
4365 // Once we've loaded the set of exports, there's no reason to keep
4366 // the parsed, unresolved exports around.
4367 CurrentModule->UnresolvedExports.clear();
4368 break;
4369 }
4370 case SUBMODULE_REQUIRES: {
Richard Smitha3feee22013-10-28 22:18:19 +00004371 CurrentModule->addRequirement(Blob, Record[0], Context.getLangOpts(),
Guy Benyei11169dd2012-12-18 14:30:41 +00004372 Context.getTargetInfo());
4373 break;
4374 }
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004375
4376 case SUBMODULE_LINK_LIBRARY:
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004377 CurrentModule->LinkLibraries.push_back(
Chris Lattner0e6c9402013-01-20 02:38:54 +00004378 Module::LinkLibrary(Blob, Record[0]));
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004379 break;
Douglas Gregor35b13ec2013-03-20 00:22:05 +00004380
4381 case SUBMODULE_CONFIG_MACRO:
Douglas Gregor35b13ec2013-03-20 00:22:05 +00004382 CurrentModule->ConfigMacros.push_back(Blob.str());
4383 break;
Douglas Gregorfb912652013-03-20 21:10:35 +00004384
4385 case SUBMODULE_CONFLICT: {
Douglas Gregorfb912652013-03-20 21:10:35 +00004386 UnresolvedModuleRef Unresolved;
4387 Unresolved.File = &F;
4388 Unresolved.Mod = CurrentModule;
4389 Unresolved.ID = Record[0];
4390 Unresolved.Kind = UnresolvedModuleRef::Conflict;
4391 Unresolved.IsWildcard = false;
4392 Unresolved.String = Blob;
4393 UnresolvedModuleRefs.push_back(Unresolved);
4394 break;
4395 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004396 }
4397 }
4398}
4399
4400/// \brief Parse the record that corresponds to a LangOptions data
4401/// structure.
4402///
4403/// This routine parses the language options from the AST file and then gives
4404/// them to the AST listener if one is set.
4405///
4406/// \returns true if the listener deems the file unacceptable, false otherwise.
4407bool ASTReader::ParseLanguageOptions(const RecordData &Record,
4408 bool Complain,
Richard Smith1e2cf0d2014-10-31 02:28:58 +00004409 ASTReaderListener &Listener,
4410 bool AllowCompatibleDifferences) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004411 LangOptions LangOpts;
4412 unsigned Idx = 0;
4413#define LANGOPT(Name, Bits, Default, Description) \
4414 LangOpts.Name = Record[Idx++];
4415#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
4416 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
4417#include "clang/Basic/LangOptions.def"
Alexey Samsonovedf99a92014-11-07 22:29:38 +00004418#define SANITIZER(NAME, ID) \
4419 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]);
Will Dietzf54319c2013-01-18 11:30:38 +00004420#include "clang/Basic/Sanitizers.def"
Guy Benyei11169dd2012-12-18 14:30:41 +00004421
4422 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++];
4423 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx);
4424 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion);
4425
4426 unsigned Length = Record[Idx++];
4427 LangOpts.CurrentModule.assign(Record.begin() + Idx,
4428 Record.begin() + Idx + Length);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004429
4430 Idx += Length;
4431
4432 // Comment options.
4433 for (unsigned N = Record[Idx++]; N; --N) {
4434 LangOpts.CommentOpts.BlockCommandNames.push_back(
4435 ReadString(Record, Idx));
4436 }
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004437 LangOpts.CommentOpts.ParseAllComments = Record[Idx++];
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004438
Richard Smith1e2cf0d2014-10-31 02:28:58 +00004439 return Listener.ReadLanguageOptions(LangOpts, Complain,
4440 AllowCompatibleDifferences);
Guy Benyei11169dd2012-12-18 14:30:41 +00004441}
4442
Chandler Carruth0d745bc2015-03-14 04:47:43 +00004443bool ASTReader::ParseTargetOptions(const RecordData &Record, bool Complain,
4444 ASTReaderListener &Listener,
4445 bool AllowCompatibleDifferences) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004446 unsigned Idx = 0;
4447 TargetOptions TargetOpts;
4448 TargetOpts.Triple = ReadString(Record, Idx);
4449 TargetOpts.CPU = ReadString(Record, Idx);
4450 TargetOpts.ABI = ReadString(Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00004451 for (unsigned N = Record[Idx++]; N; --N) {
4452 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx));
4453 }
4454 for (unsigned N = Record[Idx++]; N; --N) {
4455 TargetOpts.Features.push_back(ReadString(Record, Idx));
4456 }
4457
Chandler Carruth0d745bc2015-03-14 04:47:43 +00004458 return Listener.ReadTargetOptions(TargetOpts, Complain,
4459 AllowCompatibleDifferences);
Guy Benyei11169dd2012-12-18 14:30:41 +00004460}
4461
4462bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain,
4463 ASTReaderListener &Listener) {
Ben Langmuirb92de022014-04-29 16:25:26 +00004464 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions);
Guy Benyei11169dd2012-12-18 14:30:41 +00004465 unsigned Idx = 0;
Ben Langmuirb92de022014-04-29 16:25:26 +00004466#define DIAGOPT(Name, Bits, Default) DiagOpts->Name = Record[Idx++];
Guy Benyei11169dd2012-12-18 14:30:41 +00004467#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
Ben Langmuirb92de022014-04-29 16:25:26 +00004468 DiagOpts->set##Name(static_cast<Type>(Record[Idx++]));
Guy Benyei11169dd2012-12-18 14:30:41 +00004469#include "clang/Basic/DiagnosticOptions.def"
4470
Richard Smith3be1cb22014-08-07 00:24:21 +00004471 for (unsigned N = Record[Idx++]; N; --N)
Ben Langmuirb92de022014-04-29 16:25:26 +00004472 DiagOpts->Warnings.push_back(ReadString(Record, Idx));
Richard Smith3be1cb22014-08-07 00:24:21 +00004473 for (unsigned N = Record[Idx++]; N; --N)
4474 DiagOpts->Remarks.push_back(ReadString(Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00004475
4476 return Listener.ReadDiagnosticOptions(DiagOpts, Complain);
4477}
4478
4479bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain,
4480 ASTReaderListener &Listener) {
4481 FileSystemOptions FSOpts;
4482 unsigned Idx = 0;
4483 FSOpts.WorkingDir = ReadString(Record, Idx);
4484 return Listener.ReadFileSystemOptions(FSOpts, Complain);
4485}
4486
4487bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record,
4488 bool Complain,
4489 ASTReaderListener &Listener) {
4490 HeaderSearchOptions HSOpts;
4491 unsigned Idx = 0;
4492 HSOpts.Sysroot = ReadString(Record, Idx);
4493
4494 // Include entries.
4495 for (unsigned N = Record[Idx++]; N; --N) {
4496 std::string Path = ReadString(Record, Idx);
4497 frontend::IncludeDirGroup Group
4498 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]);
Guy Benyei11169dd2012-12-18 14:30:41 +00004499 bool IsFramework = Record[Idx++];
4500 bool IgnoreSysRoot = Record[Idx++];
Guy Benyei11169dd2012-12-18 14:30:41 +00004501 HSOpts.UserEntries.push_back(
Daniel Dunbar53681732013-01-30 00:34:26 +00004502 HeaderSearchOptions::Entry(Path, Group, IsFramework, IgnoreSysRoot));
Guy Benyei11169dd2012-12-18 14:30:41 +00004503 }
4504
4505 // System header prefixes.
4506 for (unsigned N = Record[Idx++]; N; --N) {
4507 std::string Prefix = ReadString(Record, Idx);
4508 bool IsSystemHeader = Record[Idx++];
4509 HSOpts.SystemHeaderPrefixes.push_back(
4510 HeaderSearchOptions::SystemHeaderPrefix(Prefix, IsSystemHeader));
4511 }
4512
4513 HSOpts.ResourceDir = ReadString(Record, Idx);
4514 HSOpts.ModuleCachePath = ReadString(Record, Idx);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004515 HSOpts.ModuleUserBuildPath = ReadString(Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00004516 HSOpts.DisableModuleHash = Record[Idx++];
4517 HSOpts.UseBuiltinIncludes = Record[Idx++];
4518 HSOpts.UseStandardSystemIncludes = Record[Idx++];
4519 HSOpts.UseStandardCXXIncludes = Record[Idx++];
4520 HSOpts.UseLibcxx = Record[Idx++];
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00004521 std::string SpecificModuleCachePath = ReadString(Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00004522
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00004523 return Listener.ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
4524 Complain);
Guy Benyei11169dd2012-12-18 14:30:41 +00004525}
4526
4527bool ASTReader::ParsePreprocessorOptions(const RecordData &Record,
4528 bool Complain,
4529 ASTReaderListener &Listener,
4530 std::string &SuggestedPredefines) {
4531 PreprocessorOptions PPOpts;
4532 unsigned Idx = 0;
4533
4534 // Macro definitions/undefs
4535 for (unsigned N = Record[Idx++]; N; --N) {
4536 std::string Macro = ReadString(Record, Idx);
4537 bool IsUndef = Record[Idx++];
4538 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef));
4539 }
4540
4541 // Includes
4542 for (unsigned N = Record[Idx++]; N; --N) {
4543 PPOpts.Includes.push_back(ReadString(Record, Idx));
4544 }
4545
4546 // Macro Includes
4547 for (unsigned N = Record[Idx++]; N; --N) {
4548 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx));
4549 }
4550
4551 PPOpts.UsePredefines = Record[Idx++];
Argyrios Kyrtzidisd3afa0c2013-04-26 21:33:40 +00004552 PPOpts.DetailedRecord = Record[Idx++];
Guy Benyei11169dd2012-12-18 14:30:41 +00004553 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx);
4554 PPOpts.ImplicitPTHInclude = ReadString(Record, Idx);
4555 PPOpts.ObjCXXARCStandardLibrary =
4556 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]);
4557 SuggestedPredefines.clear();
4558 return Listener.ReadPreprocessorOptions(PPOpts, Complain,
4559 SuggestedPredefines);
4560}
4561
4562std::pair<ModuleFile *, unsigned>
4563ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) {
4564 GlobalPreprocessedEntityMapType::iterator
4565 I = GlobalPreprocessedEntityMap.find(GlobalIndex);
4566 assert(I != GlobalPreprocessedEntityMap.end() &&
4567 "Corrupted global preprocessed entity map");
4568 ModuleFile *M = I->second;
4569 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID;
4570 return std::make_pair(M, LocalIndex);
4571}
4572
Benjamin Kramerb4ef6682015-02-06 17:25:10 +00004573llvm::iterator_range<PreprocessingRecord::iterator>
Guy Benyei11169dd2012-12-18 14:30:41 +00004574ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const {
4575 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
4576 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID,
4577 Mod.NumPreprocessedEntities);
4578
Benjamin Kramerb4ef6682015-02-06 17:25:10 +00004579 return llvm::make_range(PreprocessingRecord::iterator(),
4580 PreprocessingRecord::iterator());
Guy Benyei11169dd2012-12-18 14:30:41 +00004581}
4582
Benjamin Kramerb4ef6682015-02-06 17:25:10 +00004583llvm::iterator_range<ASTReader::ModuleDeclIterator>
Guy Benyei11169dd2012-12-18 14:30:41 +00004584ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) {
Benjamin Kramerb4ef6682015-02-06 17:25:10 +00004585 return llvm::make_range(
4586 ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls),
4587 ModuleDeclIterator(this, &Mod,
4588 Mod.FileSortedDecls + Mod.NumFileSortedDecls));
Guy Benyei11169dd2012-12-18 14:30:41 +00004589}
4590
4591PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) {
4592 PreprocessedEntityID PPID = Index+1;
4593 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
4594 ModuleFile &M = *PPInfo.first;
4595 unsigned LocalIndex = PPInfo.second;
4596 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
4597
Guy Benyei11169dd2012-12-18 14:30:41 +00004598 if (!PP.getPreprocessingRecord()) {
4599 Error("no preprocessing record");
Craig Toppera13603a2014-05-22 05:54:18 +00004600 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00004601 }
4602
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004603 SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor);
4604 M.PreprocessorDetailCursor.JumpToBit(PPOffs.BitOffset);
4605
4606 llvm::BitstreamEntry Entry =
4607 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
4608 if (Entry.Kind != llvm::BitstreamEntry::Record)
Craig Toppera13603a2014-05-22 05:54:18 +00004609 return nullptr;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004610
Guy Benyei11169dd2012-12-18 14:30:41 +00004611 // Read the record.
4612 SourceRange Range(ReadSourceLocation(M, PPOffs.Begin),
4613 ReadSourceLocation(M, PPOffs.End));
4614 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
Chris Lattner0e6c9402013-01-20 02:38:54 +00004615 StringRef Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00004616 RecordData Record;
4617 PreprocessorDetailRecordTypes RecType =
Chris Lattner0e6c9402013-01-20 02:38:54 +00004618 (PreprocessorDetailRecordTypes)M.PreprocessorDetailCursor.readRecord(
4619 Entry.ID, Record, &Blob);
Guy Benyei11169dd2012-12-18 14:30:41 +00004620 switch (RecType) {
4621 case PPD_MACRO_EXPANSION: {
4622 bool isBuiltin = Record[0];
Craig Toppera13603a2014-05-22 05:54:18 +00004623 IdentifierInfo *Name = nullptr;
Richard Smith66a81862015-05-04 02:25:31 +00004624 MacroDefinitionRecord *Def = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00004625 if (isBuiltin)
4626 Name = getLocalIdentifier(M, Record[1]);
4627 else {
Richard Smith66a81862015-05-04 02:25:31 +00004628 PreprocessedEntityID GlobalID =
4629 getGlobalPreprocessedEntityID(M, Record[1]);
4630 Def = cast<MacroDefinitionRecord>(
4631 PPRec.getLoadedPreprocessedEntity(GlobalID - 1));
Guy Benyei11169dd2012-12-18 14:30:41 +00004632 }
4633
4634 MacroExpansion *ME;
4635 if (isBuiltin)
4636 ME = new (PPRec) MacroExpansion(Name, Range);
4637 else
4638 ME = new (PPRec) MacroExpansion(Def, Range);
4639
4640 return ME;
4641 }
4642
4643 case PPD_MACRO_DEFINITION: {
4644 // Decode the identifier info and then check again; if the macro is
4645 // still defined and associated with the identifier,
4646 IdentifierInfo *II = getLocalIdentifier(M, Record[0]);
Richard Smith66a81862015-05-04 02:25:31 +00004647 MacroDefinitionRecord *MD = new (PPRec) MacroDefinitionRecord(II, Range);
Guy Benyei11169dd2012-12-18 14:30:41 +00004648
4649 if (DeserializationListener)
4650 DeserializationListener->MacroDefinitionRead(PPID, MD);
4651
4652 return MD;
4653 }
4654
4655 case PPD_INCLUSION_DIRECTIVE: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00004656 const char *FullFileNameStart = Blob.data() + Record[0];
4657 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]);
Craig Toppera13603a2014-05-22 05:54:18 +00004658 const FileEntry *File = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00004659 if (!FullFileName.empty())
4660 File = PP.getFileManager().getFile(FullFileName);
4661
4662 // FIXME: Stable encoding
4663 InclusionDirective::InclusionKind Kind
4664 = static_cast<InclusionDirective::InclusionKind>(Record[2]);
4665 InclusionDirective *ID
4666 = new (PPRec) InclusionDirective(PPRec, Kind,
Chris Lattner0e6c9402013-01-20 02:38:54 +00004667 StringRef(Blob.data(), Record[0]),
Guy Benyei11169dd2012-12-18 14:30:41 +00004668 Record[1], Record[3],
4669 File,
4670 Range);
4671 return ID;
4672 }
4673 }
4674
4675 llvm_unreachable("Invalid PreprocessorDetailRecordTypes");
4676}
4677
4678/// \brief \arg SLocMapI points at a chunk of a module that contains no
4679/// preprocessed entities or the entities it contains are not the ones we are
4680/// looking for. Find the next module that contains entities and return the ID
4681/// of the first entry.
4682PreprocessedEntityID ASTReader::findNextPreprocessedEntity(
4683 GlobalSLocOffsetMapType::const_iterator SLocMapI) const {
4684 ++SLocMapI;
4685 for (GlobalSLocOffsetMapType::const_iterator
4686 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
4687 ModuleFile &M = *SLocMapI->second;
4688 if (M.NumPreprocessedEntities)
4689 return M.BasePreprocessedEntityID;
4690 }
4691
4692 return getTotalNumPreprocessedEntities();
4693}
4694
4695namespace {
4696
4697template <unsigned PPEntityOffset::*PPLoc>
4698struct PPEntityComp {
4699 const ASTReader &Reader;
4700 ModuleFile &M;
4701
4702 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) { }
4703
4704 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const {
4705 SourceLocation LHS = getLoc(L);
4706 SourceLocation RHS = getLoc(R);
4707 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
4708 }
4709
4710 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const {
4711 SourceLocation LHS = getLoc(L);
4712 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
4713 }
4714
4715 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const {
4716 SourceLocation RHS = getLoc(R);
4717 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
4718 }
4719
4720 SourceLocation getLoc(const PPEntityOffset &PPE) const {
4721 return Reader.ReadSourceLocation(M, PPE.*PPLoc);
4722 }
4723};
4724
4725}
4726
Alp Toker2e9ce4c2014-05-16 18:59:21 +00004727PreprocessedEntityID ASTReader::findPreprocessedEntity(SourceLocation Loc,
4728 bool EndsAfter) const {
4729 if (SourceMgr.isLocalSourceLocation(Loc))
Guy Benyei11169dd2012-12-18 14:30:41 +00004730 return getTotalNumPreprocessedEntities();
4731
Alp Toker2e9ce4c2014-05-16 18:59:21 +00004732 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
4733 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
Guy Benyei11169dd2012-12-18 14:30:41 +00004734 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
4735 "Corrupted global sloc offset map");
4736
4737 if (SLocMapI->second->NumPreprocessedEntities == 0)
4738 return findNextPreprocessedEntity(SLocMapI);
4739
4740 ModuleFile &M = *SLocMapI->second;
4741 typedef const PPEntityOffset *pp_iterator;
4742 pp_iterator pp_begin = M.PreprocessedEntityOffsets;
4743 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities;
4744
4745 size_t Count = M.NumPreprocessedEntities;
4746 size_t Half;
4747 pp_iterator First = pp_begin;
4748 pp_iterator PPI;
4749
Alp Toker2e9ce4c2014-05-16 18:59:21 +00004750 if (EndsAfter) {
4751 PPI = std::upper_bound(pp_begin, pp_end, Loc,
4752 PPEntityComp<&PPEntityOffset::Begin>(*this, M));
4753 } else {
4754 // Do a binary search manually instead of using std::lower_bound because
4755 // The end locations of entities may be unordered (when a macro expansion
4756 // is inside another macro argument), but for this case it is not important
4757 // whether we get the first macro expansion or its containing macro.
4758 while (Count > 0) {
4759 Half = Count / 2;
4760 PPI = First;
4761 std::advance(PPI, Half);
4762 if (SourceMgr.isBeforeInTranslationUnit(ReadSourceLocation(M, PPI->End),
4763 Loc)) {
4764 First = PPI;
4765 ++First;
4766 Count = Count - Half - 1;
4767 } else
4768 Count = Half;
4769 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004770 }
4771
4772 if (PPI == pp_end)
4773 return findNextPreprocessedEntity(SLocMapI);
4774
4775 return M.BasePreprocessedEntityID + (PPI - pp_begin);
4776}
4777
Guy Benyei11169dd2012-12-18 14:30:41 +00004778/// \brief Returns a pair of [Begin, End) indices of preallocated
4779/// preprocessed entities that \arg Range encompasses.
4780std::pair<unsigned, unsigned>
4781 ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) {
4782 if (Range.isInvalid())
4783 return std::make_pair(0,0);
4784 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
4785
Alp Toker2e9ce4c2014-05-16 18:59:21 +00004786 PreprocessedEntityID BeginID =
4787 findPreprocessedEntity(Range.getBegin(), false);
4788 PreprocessedEntityID EndID = findPreprocessedEntity(Range.getEnd(), true);
Guy Benyei11169dd2012-12-18 14:30:41 +00004789 return std::make_pair(BeginID, EndID);
4790}
4791
4792/// \brief Optionally returns true or false if the preallocated preprocessed
4793/// entity with index \arg Index came from file \arg FID.
David Blaikie05785d12013-02-20 22:23:23 +00004794Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index,
Guy Benyei11169dd2012-12-18 14:30:41 +00004795 FileID FID) {
4796 if (FID.isInvalid())
4797 return false;
4798
4799 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
4800 ModuleFile &M = *PPInfo.first;
4801 unsigned LocalIndex = PPInfo.second;
4802 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
4803
4804 SourceLocation Loc = ReadSourceLocation(M, PPOffs.Begin);
4805 if (Loc.isInvalid())
4806 return false;
4807
4808 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
4809 return true;
4810 else
4811 return false;
4812}
4813
4814namespace {
4815 /// \brief Visitor used to search for information about a header file.
4816 class HeaderFileInfoVisitor {
Guy Benyei11169dd2012-12-18 14:30:41 +00004817 const FileEntry *FE;
4818
David Blaikie05785d12013-02-20 22:23:23 +00004819 Optional<HeaderFileInfo> HFI;
Guy Benyei11169dd2012-12-18 14:30:41 +00004820
4821 public:
Argyrios Kyrtzidis61a38962013-03-06 18:12:44 +00004822 explicit HeaderFileInfoVisitor(const FileEntry *FE)
4823 : FE(FE) { }
Guy Benyei11169dd2012-12-18 14:30:41 +00004824
4825 static bool visit(ModuleFile &M, void *UserData) {
4826 HeaderFileInfoVisitor *This
4827 = static_cast<HeaderFileInfoVisitor *>(UserData);
4828
Guy Benyei11169dd2012-12-18 14:30:41 +00004829 HeaderFileInfoLookupTable *Table
4830 = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable);
4831 if (!Table)
4832 return false;
4833
4834 // Look in the on-disk hash table for an entry for this file name.
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00004835 HeaderFileInfoLookupTable::iterator Pos = Table->find(This->FE);
Guy Benyei11169dd2012-12-18 14:30:41 +00004836 if (Pos == Table->end())
4837 return false;
4838
4839 This->HFI = *Pos;
4840 return true;
4841 }
4842
David Blaikie05785d12013-02-20 22:23:23 +00004843 Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; }
Guy Benyei11169dd2012-12-18 14:30:41 +00004844 };
4845}
4846
4847HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) {
Argyrios Kyrtzidis61a38962013-03-06 18:12:44 +00004848 HeaderFileInfoVisitor Visitor(FE);
Guy Benyei11169dd2012-12-18 14:30:41 +00004849 ModuleMgr.visit(&HeaderFileInfoVisitor::visit, &Visitor);
Argyrios Kyrtzidis1054bbf2013-05-08 23:46:55 +00004850 if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
Guy Benyei11169dd2012-12-18 14:30:41 +00004851 return *HFI;
Guy Benyei11169dd2012-12-18 14:30:41 +00004852
4853 return HeaderFileInfo();
4854}
4855
4856void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) {
4857 // FIXME: Make it work properly with modules.
Dmitri Gribenkof8579502013-01-12 19:30:44 +00004858 SmallVector<DiagnosticsEngine::DiagState *, 32> DiagStates;
Guy Benyei11169dd2012-12-18 14:30:41 +00004859 for (ModuleIterator I = ModuleMgr.begin(), E = ModuleMgr.end(); I != E; ++I) {
4860 ModuleFile &F = *(*I);
4861 unsigned Idx = 0;
4862 DiagStates.clear();
4863 assert(!Diag.DiagStates.empty());
4864 DiagStates.push_back(&Diag.DiagStates.front()); // the command-line one.
4865 while (Idx < F.PragmaDiagMappings.size()) {
4866 SourceLocation Loc = ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]);
4867 unsigned DiagStateID = F.PragmaDiagMappings[Idx++];
4868 if (DiagStateID != 0) {
4869 Diag.DiagStatePoints.push_back(
4870 DiagnosticsEngine::DiagStatePoint(DiagStates[DiagStateID-1],
4871 FullSourceLoc(Loc, SourceMgr)));
4872 continue;
4873 }
4874
4875 assert(DiagStateID == 0);
4876 // A new DiagState was created here.
4877 Diag.DiagStates.push_back(*Diag.GetCurDiagState());
4878 DiagnosticsEngine::DiagState *NewState = &Diag.DiagStates.back();
4879 DiagStates.push_back(NewState);
4880 Diag.DiagStatePoints.push_back(
4881 DiagnosticsEngine::DiagStatePoint(NewState,
4882 FullSourceLoc(Loc, SourceMgr)));
4883 while (1) {
4884 assert(Idx < F.PragmaDiagMappings.size() &&
4885 "Invalid data, didn't find '-1' marking end of diag/map pairs");
4886 if (Idx >= F.PragmaDiagMappings.size()) {
4887 break; // Something is messed up but at least avoid infinite loop in
4888 // release build.
4889 }
4890 unsigned DiagID = F.PragmaDiagMappings[Idx++];
4891 if (DiagID == (unsigned)-1) {
4892 break; // no more diag/map pairs for this location.
4893 }
Alp Tokerc726c362014-06-10 09:31:37 +00004894 diag::Severity Map = (diag::Severity)F.PragmaDiagMappings[Idx++];
4895 DiagnosticMapping Mapping = Diag.makeUserMapping(Map, Loc);
4896 Diag.GetCurDiagState()->setMapping(DiagID, Mapping);
Guy Benyei11169dd2012-12-18 14:30:41 +00004897 }
4898 }
4899 }
4900}
4901
4902/// \brief Get the correct cursor and offset for loading a type.
4903ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) {
4904 GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index);
4905 assert(I != GlobalTypeMap.end() && "Corrupted global type map");
4906 ModuleFile *M = I->second;
4907 return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex]);
4908}
4909
4910/// \brief Read and return the type with the given index..
4911///
4912/// The index is the type ID, shifted and minus the number of predefs. This
4913/// routine actually reads the record corresponding to the type at the given
4914/// location. It is a helper routine for GetType, which deals with reading type
4915/// IDs.
4916QualType ASTReader::readTypeRecord(unsigned Index) {
4917 RecordLocation Loc = TypeCursorForIndex(Index);
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004918 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00004919
4920 // Keep track of where we are in the stream, then jump back there
4921 // after reading this type.
4922 SavedStreamPosition SavedPosition(DeclsCursor);
4923
4924 ReadingKindTracker ReadingKind(Read_Type, *this);
4925
4926 // Note that we are loading a type record.
4927 Deserializing AType(this);
4928
4929 unsigned Idx = 0;
4930 DeclsCursor.JumpToBit(Loc.Offset);
4931 RecordData Record;
4932 unsigned Code = DeclsCursor.ReadCode();
Chris Lattner0e6c9402013-01-20 02:38:54 +00004933 switch ((TypeCode)DeclsCursor.readRecord(Code, Record)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004934 case TYPE_EXT_QUAL: {
4935 if (Record.size() != 2) {
4936 Error("Incorrect encoding of extended qualifier type");
4937 return QualType();
4938 }
4939 QualType Base = readType(*Loc.F, Record, Idx);
4940 Qualifiers Quals = Qualifiers::fromOpaqueValue(Record[Idx++]);
4941 return Context.getQualifiedType(Base, Quals);
4942 }
4943
4944 case TYPE_COMPLEX: {
4945 if (Record.size() != 1) {
4946 Error("Incorrect encoding of complex type");
4947 return QualType();
4948 }
4949 QualType ElemType = readType(*Loc.F, Record, Idx);
4950 return Context.getComplexType(ElemType);
4951 }
4952
4953 case TYPE_POINTER: {
4954 if (Record.size() != 1) {
4955 Error("Incorrect encoding of pointer type");
4956 return QualType();
4957 }
4958 QualType PointeeType = readType(*Loc.F, Record, Idx);
4959 return Context.getPointerType(PointeeType);
4960 }
4961
Reid Kleckner8a365022013-06-24 17:51:48 +00004962 case TYPE_DECAYED: {
4963 if (Record.size() != 1) {
4964 Error("Incorrect encoding of decayed type");
4965 return QualType();
4966 }
4967 QualType OriginalType = readType(*Loc.F, Record, Idx);
4968 QualType DT = Context.getAdjustedParameterType(OriginalType);
4969 if (!isa<DecayedType>(DT))
4970 Error("Decayed type does not decay");
4971 return DT;
4972 }
4973
Reid Kleckner0503a872013-12-05 01:23:43 +00004974 case TYPE_ADJUSTED: {
4975 if (Record.size() != 2) {
4976 Error("Incorrect encoding of adjusted type");
4977 return QualType();
4978 }
4979 QualType OriginalTy = readType(*Loc.F, Record, Idx);
4980 QualType AdjustedTy = readType(*Loc.F, Record, Idx);
4981 return Context.getAdjustedType(OriginalTy, AdjustedTy);
4982 }
4983
Guy Benyei11169dd2012-12-18 14:30:41 +00004984 case TYPE_BLOCK_POINTER: {
4985 if (Record.size() != 1) {
4986 Error("Incorrect encoding of block pointer type");
4987 return QualType();
4988 }
4989 QualType PointeeType = readType(*Loc.F, Record, Idx);
4990 return Context.getBlockPointerType(PointeeType);
4991 }
4992
4993 case TYPE_LVALUE_REFERENCE: {
4994 if (Record.size() != 2) {
4995 Error("Incorrect encoding of lvalue reference type");
4996 return QualType();
4997 }
4998 QualType PointeeType = readType(*Loc.F, Record, Idx);
4999 return Context.getLValueReferenceType(PointeeType, Record[1]);
5000 }
5001
5002 case TYPE_RVALUE_REFERENCE: {
5003 if (Record.size() != 1) {
5004 Error("Incorrect encoding of rvalue reference type");
5005 return QualType();
5006 }
5007 QualType PointeeType = readType(*Loc.F, Record, Idx);
5008 return Context.getRValueReferenceType(PointeeType);
5009 }
5010
5011 case TYPE_MEMBER_POINTER: {
5012 if (Record.size() != 2) {
5013 Error("Incorrect encoding of member pointer type");
5014 return QualType();
5015 }
5016 QualType PointeeType = readType(*Loc.F, Record, Idx);
5017 QualType ClassType = readType(*Loc.F, Record, Idx);
5018 if (PointeeType.isNull() || ClassType.isNull())
5019 return QualType();
5020
5021 return Context.getMemberPointerType(PointeeType, ClassType.getTypePtr());
5022 }
5023
5024 case TYPE_CONSTANT_ARRAY: {
5025 QualType ElementType = readType(*Loc.F, Record, Idx);
5026 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5027 unsigned IndexTypeQuals = Record[2];
5028 unsigned Idx = 3;
5029 llvm::APInt Size = ReadAPInt(Record, Idx);
5030 return Context.getConstantArrayType(ElementType, Size,
5031 ASM, IndexTypeQuals);
5032 }
5033
5034 case TYPE_INCOMPLETE_ARRAY: {
5035 QualType ElementType = readType(*Loc.F, Record, Idx);
5036 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5037 unsigned IndexTypeQuals = Record[2];
5038 return Context.getIncompleteArrayType(ElementType, ASM, IndexTypeQuals);
5039 }
5040
5041 case TYPE_VARIABLE_ARRAY: {
5042 QualType ElementType = readType(*Loc.F, Record, Idx);
5043 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5044 unsigned IndexTypeQuals = Record[2];
5045 SourceLocation LBLoc = ReadSourceLocation(*Loc.F, Record[3]);
5046 SourceLocation RBLoc = ReadSourceLocation(*Loc.F, Record[4]);
5047 return Context.getVariableArrayType(ElementType, ReadExpr(*Loc.F),
5048 ASM, IndexTypeQuals,
5049 SourceRange(LBLoc, RBLoc));
5050 }
5051
5052 case TYPE_VECTOR: {
5053 if (Record.size() != 3) {
5054 Error("incorrect encoding of vector type in AST file");
5055 return QualType();
5056 }
5057
5058 QualType ElementType = readType(*Loc.F, Record, Idx);
5059 unsigned NumElements = Record[1];
5060 unsigned VecKind = Record[2];
5061 return Context.getVectorType(ElementType, NumElements,
5062 (VectorType::VectorKind)VecKind);
5063 }
5064
5065 case TYPE_EXT_VECTOR: {
5066 if (Record.size() != 3) {
5067 Error("incorrect encoding of extended vector type in AST file");
5068 return QualType();
5069 }
5070
5071 QualType ElementType = readType(*Loc.F, Record, Idx);
5072 unsigned NumElements = Record[1];
5073 return Context.getExtVectorType(ElementType, NumElements);
5074 }
5075
5076 case TYPE_FUNCTION_NO_PROTO: {
5077 if (Record.size() != 6) {
5078 Error("incorrect encoding of no-proto function type");
5079 return QualType();
5080 }
5081 QualType ResultType = readType(*Loc.F, Record, Idx);
5082 FunctionType::ExtInfo Info(Record[1], Record[2], Record[3],
5083 (CallingConv)Record[4], Record[5]);
5084 return Context.getFunctionNoProtoType(ResultType, Info);
5085 }
5086
5087 case TYPE_FUNCTION_PROTO: {
5088 QualType ResultType = readType(*Loc.F, Record, Idx);
5089
5090 FunctionProtoType::ExtProtoInfo EPI;
5091 EPI.ExtInfo = FunctionType::ExtInfo(/*noreturn*/ Record[1],
5092 /*hasregparm*/ Record[2],
5093 /*regparm*/ Record[3],
5094 static_cast<CallingConv>(Record[4]),
5095 /*produces*/ Record[5]);
5096
5097 unsigned Idx = 6;
Guy Benyei11169dd2012-12-18 14:30:41 +00005098
5099 EPI.Variadic = Record[Idx++];
5100 EPI.HasTrailingReturn = Record[Idx++];
5101 EPI.TypeQuals = Record[Idx++];
5102 EPI.RefQualifier = static_cast<RefQualifierKind>(Record[Idx++]);
Richard Smith564417a2014-03-20 21:47:22 +00005103 SmallVector<QualType, 8> ExceptionStorage;
Richard Smith8acb4282014-07-31 21:57:55 +00005104 readExceptionSpec(*Loc.F, ExceptionStorage, EPI.ExceptionSpec, Record, Idx);
Richard Smith01b2cb42014-07-26 06:37:51 +00005105
5106 unsigned NumParams = Record[Idx++];
5107 SmallVector<QualType, 16> ParamTypes;
5108 for (unsigned I = 0; I != NumParams; ++I)
5109 ParamTypes.push_back(readType(*Loc.F, Record, Idx));
5110
Jordan Rose5c382722013-03-08 21:51:21 +00005111 return Context.getFunctionType(ResultType, ParamTypes, EPI);
Guy Benyei11169dd2012-12-18 14:30:41 +00005112 }
5113
5114 case TYPE_UNRESOLVED_USING: {
5115 unsigned Idx = 0;
5116 return Context.getTypeDeclType(
5117 ReadDeclAs<UnresolvedUsingTypenameDecl>(*Loc.F, Record, Idx));
5118 }
5119
5120 case TYPE_TYPEDEF: {
5121 if (Record.size() != 2) {
5122 Error("incorrect encoding of typedef type");
5123 return QualType();
5124 }
5125 unsigned Idx = 0;
5126 TypedefNameDecl *Decl = ReadDeclAs<TypedefNameDecl>(*Loc.F, Record, Idx);
5127 QualType Canonical = readType(*Loc.F, Record, Idx);
5128 if (!Canonical.isNull())
5129 Canonical = Context.getCanonicalType(Canonical);
5130 return Context.getTypedefType(Decl, Canonical);
5131 }
5132
5133 case TYPE_TYPEOF_EXPR:
5134 return Context.getTypeOfExprType(ReadExpr(*Loc.F));
5135
5136 case TYPE_TYPEOF: {
5137 if (Record.size() != 1) {
5138 Error("incorrect encoding of typeof(type) in AST file");
5139 return QualType();
5140 }
5141 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5142 return Context.getTypeOfType(UnderlyingType);
5143 }
5144
5145 case TYPE_DECLTYPE: {
5146 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5147 return Context.getDecltypeType(ReadExpr(*Loc.F), UnderlyingType);
5148 }
5149
5150 case TYPE_UNARY_TRANSFORM: {
5151 QualType BaseType = readType(*Loc.F, Record, Idx);
5152 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5153 UnaryTransformType::UTTKind UKind = (UnaryTransformType::UTTKind)Record[2];
5154 return Context.getUnaryTransformType(BaseType, UnderlyingType, UKind);
5155 }
5156
Richard Smith74aeef52013-04-26 16:15:35 +00005157 case TYPE_AUTO: {
5158 QualType Deduced = readType(*Loc.F, Record, Idx);
5159 bool IsDecltypeAuto = Record[Idx++];
Richard Smith27d807c2013-04-30 13:56:41 +00005160 bool IsDependent = Deduced.isNull() ? Record[Idx++] : false;
Manuel Klimek2fdbea22013-08-22 12:12:24 +00005161 return Context.getAutoType(Deduced, IsDecltypeAuto, IsDependent);
Richard Smith74aeef52013-04-26 16:15:35 +00005162 }
Guy Benyei11169dd2012-12-18 14:30:41 +00005163
5164 case TYPE_RECORD: {
5165 if (Record.size() != 2) {
5166 Error("incorrect encoding of record type");
5167 return QualType();
5168 }
5169 unsigned Idx = 0;
5170 bool IsDependent = Record[Idx++];
5171 RecordDecl *RD = ReadDeclAs<RecordDecl>(*Loc.F, Record, Idx);
5172 RD = cast_or_null<RecordDecl>(RD->getCanonicalDecl());
5173 QualType T = Context.getRecordType(RD);
5174 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5175 return T;
5176 }
5177
5178 case TYPE_ENUM: {
5179 if (Record.size() != 2) {
5180 Error("incorrect encoding of enum type");
5181 return QualType();
5182 }
5183 unsigned Idx = 0;
5184 bool IsDependent = Record[Idx++];
5185 QualType T
5186 = Context.getEnumType(ReadDeclAs<EnumDecl>(*Loc.F, Record, Idx));
5187 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5188 return T;
5189 }
5190
5191 case TYPE_ATTRIBUTED: {
5192 if (Record.size() != 3) {
5193 Error("incorrect encoding of attributed type");
5194 return QualType();
5195 }
5196 QualType modifiedType = readType(*Loc.F, Record, Idx);
5197 QualType equivalentType = readType(*Loc.F, Record, Idx);
5198 AttributedType::Kind kind = static_cast<AttributedType::Kind>(Record[2]);
5199 return Context.getAttributedType(kind, modifiedType, equivalentType);
5200 }
5201
5202 case TYPE_PAREN: {
5203 if (Record.size() != 1) {
5204 Error("incorrect encoding of paren type");
5205 return QualType();
5206 }
5207 QualType InnerType = readType(*Loc.F, Record, Idx);
5208 return Context.getParenType(InnerType);
5209 }
5210
5211 case TYPE_PACK_EXPANSION: {
5212 if (Record.size() != 2) {
5213 Error("incorrect encoding of pack expansion type");
5214 return QualType();
5215 }
5216 QualType Pattern = readType(*Loc.F, Record, Idx);
5217 if (Pattern.isNull())
5218 return QualType();
David Blaikie05785d12013-02-20 22:23:23 +00005219 Optional<unsigned> NumExpansions;
Guy Benyei11169dd2012-12-18 14:30:41 +00005220 if (Record[1])
5221 NumExpansions = Record[1] - 1;
5222 return Context.getPackExpansionType(Pattern, NumExpansions);
5223 }
5224
5225 case TYPE_ELABORATED: {
5226 unsigned Idx = 0;
5227 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5228 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5229 QualType NamedType = readType(*Loc.F, Record, Idx);
5230 return Context.getElaboratedType(Keyword, NNS, NamedType);
5231 }
5232
5233 case TYPE_OBJC_INTERFACE: {
5234 unsigned Idx = 0;
5235 ObjCInterfaceDecl *ItfD
5236 = ReadDeclAs<ObjCInterfaceDecl>(*Loc.F, Record, Idx);
5237 return Context.getObjCInterfaceType(ItfD->getCanonicalDecl());
5238 }
5239
5240 case TYPE_OBJC_OBJECT: {
5241 unsigned Idx = 0;
5242 QualType Base = readType(*Loc.F, Record, Idx);
5243 unsigned NumProtos = Record[Idx++];
5244 SmallVector<ObjCProtocolDecl*, 4> Protos;
5245 for (unsigned I = 0; I != NumProtos; ++I)
5246 Protos.push_back(ReadDeclAs<ObjCProtocolDecl>(*Loc.F, Record, Idx));
5247 return Context.getObjCObjectType(Base, Protos.data(), NumProtos);
5248 }
5249
5250 case TYPE_OBJC_OBJECT_POINTER: {
5251 unsigned Idx = 0;
5252 QualType Pointee = readType(*Loc.F, Record, Idx);
5253 return Context.getObjCObjectPointerType(Pointee);
5254 }
5255
5256 case TYPE_SUBST_TEMPLATE_TYPE_PARM: {
5257 unsigned Idx = 0;
5258 QualType Parm = readType(*Loc.F, Record, Idx);
5259 QualType Replacement = readType(*Loc.F, Record, Idx);
Stephan Tolksdorfe96f8b32014-03-15 10:23:27 +00005260 return Context.getSubstTemplateTypeParmType(
5261 cast<TemplateTypeParmType>(Parm),
5262 Context.getCanonicalType(Replacement));
Guy Benyei11169dd2012-12-18 14:30:41 +00005263 }
5264
5265 case TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK: {
5266 unsigned Idx = 0;
5267 QualType Parm = readType(*Loc.F, Record, Idx);
5268 TemplateArgument ArgPack = ReadTemplateArgument(*Loc.F, Record, Idx);
5269 return Context.getSubstTemplateTypeParmPackType(
5270 cast<TemplateTypeParmType>(Parm),
5271 ArgPack);
5272 }
5273
5274 case TYPE_INJECTED_CLASS_NAME: {
5275 CXXRecordDecl *D = ReadDeclAs<CXXRecordDecl>(*Loc.F, Record, Idx);
5276 QualType TST = readType(*Loc.F, Record, Idx); // probably derivable
5277 // FIXME: ASTContext::getInjectedClassNameType is not currently suitable
5278 // for AST reading, too much interdependencies.
Richard Smith6377f8f2014-10-21 21:15:18 +00005279 const Type *T = nullptr;
5280 for (auto *DI = D; DI; DI = DI->getPreviousDecl()) {
5281 if (const Type *Existing = DI->getTypeForDecl()) {
5282 T = Existing;
5283 break;
5284 }
5285 }
5286 if (!T) {
Richard Smithf17fdbd2014-04-24 02:25:27 +00005287 T = new (Context, TypeAlignment) InjectedClassNameType(D, TST);
Richard Smith6377f8f2014-10-21 21:15:18 +00005288 for (auto *DI = D; DI; DI = DI->getPreviousDecl())
5289 DI->setTypeForDecl(T);
5290 }
Richard Smithf17fdbd2014-04-24 02:25:27 +00005291 return QualType(T, 0);
Guy Benyei11169dd2012-12-18 14:30:41 +00005292 }
5293
5294 case TYPE_TEMPLATE_TYPE_PARM: {
5295 unsigned Idx = 0;
5296 unsigned Depth = Record[Idx++];
5297 unsigned Index = Record[Idx++];
5298 bool Pack = Record[Idx++];
5299 TemplateTypeParmDecl *D
5300 = ReadDeclAs<TemplateTypeParmDecl>(*Loc.F, Record, Idx);
5301 return Context.getTemplateTypeParmType(Depth, Index, Pack, D);
5302 }
5303
5304 case TYPE_DEPENDENT_NAME: {
5305 unsigned Idx = 0;
5306 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5307 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5308 const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx);
5309 QualType Canon = readType(*Loc.F, Record, Idx);
5310 if (!Canon.isNull())
5311 Canon = Context.getCanonicalType(Canon);
5312 return Context.getDependentNameType(Keyword, NNS, Name, Canon);
5313 }
5314
5315 case TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION: {
5316 unsigned Idx = 0;
5317 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5318 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5319 const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx);
5320 unsigned NumArgs = Record[Idx++];
5321 SmallVector<TemplateArgument, 8> Args;
5322 Args.reserve(NumArgs);
5323 while (NumArgs--)
5324 Args.push_back(ReadTemplateArgument(*Loc.F, Record, Idx));
5325 return Context.getDependentTemplateSpecializationType(Keyword, NNS, Name,
5326 Args.size(), Args.data());
5327 }
5328
5329 case TYPE_DEPENDENT_SIZED_ARRAY: {
5330 unsigned Idx = 0;
5331
5332 // ArrayType
5333 QualType ElementType = readType(*Loc.F, Record, Idx);
5334 ArrayType::ArraySizeModifier ASM
5335 = (ArrayType::ArraySizeModifier)Record[Idx++];
5336 unsigned IndexTypeQuals = Record[Idx++];
5337
5338 // DependentSizedArrayType
5339 Expr *NumElts = ReadExpr(*Loc.F);
5340 SourceRange Brackets = ReadSourceRange(*Loc.F, Record, Idx);
5341
5342 return Context.getDependentSizedArrayType(ElementType, NumElts, ASM,
5343 IndexTypeQuals, Brackets);
5344 }
5345
5346 case TYPE_TEMPLATE_SPECIALIZATION: {
5347 unsigned Idx = 0;
5348 bool IsDependent = Record[Idx++];
5349 TemplateName Name = ReadTemplateName(*Loc.F, Record, Idx);
5350 SmallVector<TemplateArgument, 8> Args;
5351 ReadTemplateArgumentList(Args, *Loc.F, Record, Idx);
5352 QualType Underlying = readType(*Loc.F, Record, Idx);
5353 QualType T;
5354 if (Underlying.isNull())
5355 T = Context.getCanonicalTemplateSpecializationType(Name, Args.data(),
5356 Args.size());
5357 else
5358 T = Context.getTemplateSpecializationType(Name, Args.data(),
5359 Args.size(), Underlying);
5360 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5361 return T;
5362 }
5363
5364 case TYPE_ATOMIC: {
5365 if (Record.size() != 1) {
5366 Error("Incorrect encoding of atomic type");
5367 return QualType();
5368 }
5369 QualType ValueType = readType(*Loc.F, Record, Idx);
5370 return Context.getAtomicType(ValueType);
5371 }
5372 }
5373 llvm_unreachable("Invalid TypeCode!");
5374}
5375
Richard Smith564417a2014-03-20 21:47:22 +00005376void ASTReader::readExceptionSpec(ModuleFile &ModuleFile,
5377 SmallVectorImpl<QualType> &Exceptions,
Richard Smith8acb4282014-07-31 21:57:55 +00005378 FunctionProtoType::ExceptionSpecInfo &ESI,
Richard Smith564417a2014-03-20 21:47:22 +00005379 const RecordData &Record, unsigned &Idx) {
5380 ExceptionSpecificationType EST =
5381 static_cast<ExceptionSpecificationType>(Record[Idx++]);
Richard Smith8acb4282014-07-31 21:57:55 +00005382 ESI.Type = EST;
Richard Smith564417a2014-03-20 21:47:22 +00005383 if (EST == EST_Dynamic) {
Richard Smith8acb4282014-07-31 21:57:55 +00005384 for (unsigned I = 0, N = Record[Idx++]; I != N; ++I)
Richard Smith564417a2014-03-20 21:47:22 +00005385 Exceptions.push_back(readType(ModuleFile, Record, Idx));
Richard Smith8acb4282014-07-31 21:57:55 +00005386 ESI.Exceptions = Exceptions;
Richard Smith564417a2014-03-20 21:47:22 +00005387 } else if (EST == EST_ComputedNoexcept) {
Richard Smith8acb4282014-07-31 21:57:55 +00005388 ESI.NoexceptExpr = ReadExpr(ModuleFile);
Richard Smith564417a2014-03-20 21:47:22 +00005389 } else if (EST == EST_Uninstantiated) {
Richard Smith8acb4282014-07-31 21:57:55 +00005390 ESI.SourceDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
5391 ESI.SourceTemplate = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
Richard Smith564417a2014-03-20 21:47:22 +00005392 } else if (EST == EST_Unevaluated) {
Richard Smith8acb4282014-07-31 21:57:55 +00005393 ESI.SourceDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
Richard Smith564417a2014-03-20 21:47:22 +00005394 }
5395}
5396
Guy Benyei11169dd2012-12-18 14:30:41 +00005397class clang::TypeLocReader : public TypeLocVisitor<TypeLocReader> {
5398 ASTReader &Reader;
5399 ModuleFile &F;
5400 const ASTReader::RecordData &Record;
5401 unsigned &Idx;
5402
5403 SourceLocation ReadSourceLocation(const ASTReader::RecordData &R,
5404 unsigned &I) {
5405 return Reader.ReadSourceLocation(F, R, I);
5406 }
5407
5408 template<typename T>
5409 T *ReadDeclAs(const ASTReader::RecordData &Record, unsigned &Idx) {
5410 return Reader.ReadDeclAs<T>(F, Record, Idx);
5411 }
5412
5413public:
5414 TypeLocReader(ASTReader &Reader, ModuleFile &F,
5415 const ASTReader::RecordData &Record, unsigned &Idx)
5416 : Reader(Reader), F(F), Record(Record), Idx(Idx)
5417 { }
5418
5419 // We want compile-time assurance that we've enumerated all of
5420 // these, so unfortunately we have to declare them first, then
5421 // define them out-of-line.
5422#define ABSTRACT_TYPELOC(CLASS, PARENT)
5423#define TYPELOC(CLASS, PARENT) \
5424 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
5425#include "clang/AST/TypeLocNodes.def"
5426
5427 void VisitFunctionTypeLoc(FunctionTypeLoc);
5428 void VisitArrayTypeLoc(ArrayTypeLoc);
5429};
5430
5431void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
5432 // nothing to do
5433}
5434void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
5435 TL.setBuiltinLoc(ReadSourceLocation(Record, Idx));
5436 if (TL.needsExtraLocalData()) {
5437 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Record[Idx++]));
5438 TL.setWrittenSignSpec(static_cast<DeclSpec::TSS>(Record[Idx++]));
5439 TL.setWrittenWidthSpec(static_cast<DeclSpec::TSW>(Record[Idx++]));
5440 TL.setModeAttr(Record[Idx++]);
5441 }
5442}
5443void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
5444 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5445}
5446void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
5447 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5448}
Reid Kleckner8a365022013-06-24 17:51:48 +00005449void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
5450 // nothing to do
5451}
Reid Kleckner0503a872013-12-05 01:23:43 +00005452void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
5453 // nothing to do
5454}
Guy Benyei11169dd2012-12-18 14:30:41 +00005455void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
5456 TL.setCaretLoc(ReadSourceLocation(Record, Idx));
5457}
5458void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
5459 TL.setAmpLoc(ReadSourceLocation(Record, Idx));
5460}
5461void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
5462 TL.setAmpAmpLoc(ReadSourceLocation(Record, Idx));
5463}
5464void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
5465 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5466 TL.setClassTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5467}
5468void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) {
5469 TL.setLBracketLoc(ReadSourceLocation(Record, Idx));
5470 TL.setRBracketLoc(ReadSourceLocation(Record, Idx));
5471 if (Record[Idx++])
5472 TL.setSizeExpr(Reader.ReadExpr(F));
5473 else
Craig Toppera13603a2014-05-22 05:54:18 +00005474 TL.setSizeExpr(nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00005475}
5476void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) {
5477 VisitArrayTypeLoc(TL);
5478}
5479void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) {
5480 VisitArrayTypeLoc(TL);
5481}
5482void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
5483 VisitArrayTypeLoc(TL);
5484}
5485void TypeLocReader::VisitDependentSizedArrayTypeLoc(
5486 DependentSizedArrayTypeLoc TL) {
5487 VisitArrayTypeLoc(TL);
5488}
5489void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
5490 DependentSizedExtVectorTypeLoc TL) {
5491 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5492}
5493void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
5494 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5495}
5496void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
5497 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5498}
5499void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) {
5500 TL.setLocalRangeBegin(ReadSourceLocation(Record, Idx));
5501 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5502 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5503 TL.setLocalRangeEnd(ReadSourceLocation(Record, Idx));
Alp Tokerb3fd5cf2014-01-21 00:32:38 +00005504 for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) {
5505 TL.setParam(i, ReadDeclAs<ParmVarDecl>(Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00005506 }
5507}
5508void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) {
5509 VisitFunctionTypeLoc(TL);
5510}
5511void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) {
5512 VisitFunctionTypeLoc(TL);
5513}
5514void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
5515 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5516}
5517void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
5518 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5519}
5520void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
5521 TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
5522 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5523 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5524}
5525void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
5526 TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
5527 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5528 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5529 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5530}
5531void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
5532 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5533}
5534void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
5535 TL.setKWLoc(ReadSourceLocation(Record, Idx));
5536 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5537 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5538 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5539}
5540void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) {
5541 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5542}
5543void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) {
5544 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5545}
5546void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) {
5547 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5548}
5549void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
5550 TL.setAttrNameLoc(ReadSourceLocation(Record, Idx));
5551 if (TL.hasAttrOperand()) {
5552 SourceRange range;
5553 range.setBegin(ReadSourceLocation(Record, Idx));
5554 range.setEnd(ReadSourceLocation(Record, Idx));
5555 TL.setAttrOperandParensRange(range);
5556 }
5557 if (TL.hasAttrExprOperand()) {
5558 if (Record[Idx++])
5559 TL.setAttrExprOperand(Reader.ReadExpr(F));
5560 else
Craig Toppera13603a2014-05-22 05:54:18 +00005561 TL.setAttrExprOperand(nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00005562 } else if (TL.hasAttrEnumOperand())
5563 TL.setAttrEnumOperandLoc(ReadSourceLocation(Record, Idx));
5564}
5565void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
5566 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5567}
5568void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
5569 SubstTemplateTypeParmTypeLoc TL) {
5570 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5571}
5572void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
5573 SubstTemplateTypeParmPackTypeLoc TL) {
5574 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5575}
5576void TypeLocReader::VisitTemplateSpecializationTypeLoc(
5577 TemplateSpecializationTypeLoc TL) {
5578 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx));
5579 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx));
5580 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5581 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5582 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i)
5583 TL.setArgLocInfo(i,
5584 Reader.GetTemplateArgumentLocInfo(F,
5585 TL.getTypePtr()->getArg(i).getKind(),
5586 Record, Idx));
5587}
5588void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
5589 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5590 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5591}
5592void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
5593 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5594 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5595}
5596void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
5597 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5598}
5599void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
5600 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5601 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5602 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5603}
5604void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc(
5605 DependentTemplateSpecializationTypeLoc TL) {
5606 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5607 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5608 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx));
5609 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx));
5610 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5611 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5612 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
5613 TL.setArgLocInfo(I,
5614 Reader.GetTemplateArgumentLocInfo(F,
5615 TL.getTypePtr()->getArg(I).getKind(),
5616 Record, Idx));
5617}
5618void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
5619 TL.setEllipsisLoc(ReadSourceLocation(Record, Idx));
5620}
5621void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
5622 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5623}
5624void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
5625 TL.setHasBaseTypeAsWritten(Record[Idx++]);
5626 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5627 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5628 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
5629 TL.setProtocolLoc(i, ReadSourceLocation(Record, Idx));
5630}
5631void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
5632 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5633}
5634void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
5635 TL.setKWLoc(ReadSourceLocation(Record, Idx));
5636 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5637 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5638}
5639
5640TypeSourceInfo *ASTReader::GetTypeSourceInfo(ModuleFile &F,
5641 const RecordData &Record,
5642 unsigned &Idx) {
5643 QualType InfoTy = readType(F, Record, Idx);
5644 if (InfoTy.isNull())
Craig Toppera13603a2014-05-22 05:54:18 +00005645 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00005646
5647 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy);
5648 TypeLocReader TLR(*this, F, Record, Idx);
5649 for (TypeLoc TL = TInfo->getTypeLoc(); !TL.isNull(); TL = TL.getNextTypeLoc())
5650 TLR.Visit(TL);
5651 return TInfo;
5652}
5653
5654QualType ASTReader::GetType(TypeID ID) {
5655 unsigned FastQuals = ID & Qualifiers::FastMask;
5656 unsigned Index = ID >> Qualifiers::FastWidth;
5657
5658 if (Index < NUM_PREDEF_TYPE_IDS) {
5659 QualType T;
5660 switch ((PredefinedTypeIDs)Index) {
5661 case PREDEF_TYPE_NULL_ID: return QualType();
5662 case PREDEF_TYPE_VOID_ID: T = Context.VoidTy; break;
5663 case PREDEF_TYPE_BOOL_ID: T = Context.BoolTy; break;
5664
5665 case PREDEF_TYPE_CHAR_U_ID:
5666 case PREDEF_TYPE_CHAR_S_ID:
5667 // FIXME: Check that the signedness of CharTy is correct!
5668 T = Context.CharTy;
5669 break;
5670
5671 case PREDEF_TYPE_UCHAR_ID: T = Context.UnsignedCharTy; break;
5672 case PREDEF_TYPE_USHORT_ID: T = Context.UnsignedShortTy; break;
5673 case PREDEF_TYPE_UINT_ID: T = Context.UnsignedIntTy; break;
5674 case PREDEF_TYPE_ULONG_ID: T = Context.UnsignedLongTy; break;
5675 case PREDEF_TYPE_ULONGLONG_ID: T = Context.UnsignedLongLongTy; break;
5676 case PREDEF_TYPE_UINT128_ID: T = Context.UnsignedInt128Ty; break;
5677 case PREDEF_TYPE_SCHAR_ID: T = Context.SignedCharTy; break;
5678 case PREDEF_TYPE_WCHAR_ID: T = Context.WCharTy; break;
5679 case PREDEF_TYPE_SHORT_ID: T = Context.ShortTy; break;
5680 case PREDEF_TYPE_INT_ID: T = Context.IntTy; break;
5681 case PREDEF_TYPE_LONG_ID: T = Context.LongTy; break;
5682 case PREDEF_TYPE_LONGLONG_ID: T = Context.LongLongTy; break;
5683 case PREDEF_TYPE_INT128_ID: T = Context.Int128Ty; break;
5684 case PREDEF_TYPE_HALF_ID: T = Context.HalfTy; break;
5685 case PREDEF_TYPE_FLOAT_ID: T = Context.FloatTy; break;
5686 case PREDEF_TYPE_DOUBLE_ID: T = Context.DoubleTy; break;
5687 case PREDEF_TYPE_LONGDOUBLE_ID: T = Context.LongDoubleTy; break;
5688 case PREDEF_TYPE_OVERLOAD_ID: T = Context.OverloadTy; break;
5689 case PREDEF_TYPE_BOUND_MEMBER: T = Context.BoundMemberTy; break;
5690 case PREDEF_TYPE_PSEUDO_OBJECT: T = Context.PseudoObjectTy; break;
5691 case PREDEF_TYPE_DEPENDENT_ID: T = Context.DependentTy; break;
5692 case PREDEF_TYPE_UNKNOWN_ANY: T = Context.UnknownAnyTy; break;
5693 case PREDEF_TYPE_NULLPTR_ID: T = Context.NullPtrTy; break;
5694 case PREDEF_TYPE_CHAR16_ID: T = Context.Char16Ty; break;
5695 case PREDEF_TYPE_CHAR32_ID: T = Context.Char32Ty; break;
5696 case PREDEF_TYPE_OBJC_ID: T = Context.ObjCBuiltinIdTy; break;
5697 case PREDEF_TYPE_OBJC_CLASS: T = Context.ObjCBuiltinClassTy; break;
5698 case PREDEF_TYPE_OBJC_SEL: T = Context.ObjCBuiltinSelTy; break;
Guy Benyeid8a08ea2012-12-18 14:38:23 +00005699 case PREDEF_TYPE_IMAGE1D_ID: T = Context.OCLImage1dTy; break;
5700 case PREDEF_TYPE_IMAGE1D_ARR_ID: T = Context.OCLImage1dArrayTy; break;
5701 case PREDEF_TYPE_IMAGE1D_BUFF_ID: T = Context.OCLImage1dBufferTy; break;
5702 case PREDEF_TYPE_IMAGE2D_ID: T = Context.OCLImage2dTy; break;
5703 case PREDEF_TYPE_IMAGE2D_ARR_ID: T = Context.OCLImage2dArrayTy; break;
5704 case PREDEF_TYPE_IMAGE3D_ID: T = Context.OCLImage3dTy; break;
Guy Benyei61054192013-02-07 10:55:47 +00005705 case PREDEF_TYPE_SAMPLER_ID: T = Context.OCLSamplerTy; break;
Guy Benyei1b4fb3e2013-01-20 12:31:11 +00005706 case PREDEF_TYPE_EVENT_ID: T = Context.OCLEventTy; break;
Guy Benyei11169dd2012-12-18 14:30:41 +00005707 case PREDEF_TYPE_AUTO_DEDUCT: T = Context.getAutoDeductType(); break;
5708
5709 case PREDEF_TYPE_AUTO_RREF_DEDUCT:
5710 T = Context.getAutoRRefDeductType();
5711 break;
5712
5713 case PREDEF_TYPE_ARC_UNBRIDGED_CAST:
5714 T = Context.ARCUnbridgedCastTy;
5715 break;
5716
5717 case PREDEF_TYPE_VA_LIST_TAG:
5718 T = Context.getVaListTagType();
5719 break;
5720
5721 case PREDEF_TYPE_BUILTIN_FN:
5722 T = Context.BuiltinFnTy;
5723 break;
5724 }
5725
5726 assert(!T.isNull() && "Unknown predefined type");
5727 return T.withFastQualifiers(FastQuals);
5728 }
5729
5730 Index -= NUM_PREDEF_TYPE_IDS;
5731 assert(Index < TypesLoaded.size() && "Type index out-of-range");
5732 if (TypesLoaded[Index].isNull()) {
5733 TypesLoaded[Index] = readTypeRecord(Index);
5734 if (TypesLoaded[Index].isNull())
5735 return QualType();
5736
5737 TypesLoaded[Index]->setFromAST();
5738 if (DeserializationListener)
5739 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID),
5740 TypesLoaded[Index]);
5741 }
5742
5743 return TypesLoaded[Index].withFastQualifiers(FastQuals);
5744}
5745
5746QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) {
5747 return GetType(getGlobalTypeID(F, LocalID));
5748}
5749
5750serialization::TypeID
5751ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const {
5752 unsigned FastQuals = LocalID & Qualifiers::FastMask;
5753 unsigned LocalIndex = LocalID >> Qualifiers::FastWidth;
5754
5755 if (LocalIndex < NUM_PREDEF_TYPE_IDS)
5756 return LocalID;
5757
5758 ContinuousRangeMap<uint32_t, int, 2>::iterator I
5759 = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS);
5760 assert(I != F.TypeRemap.end() && "Invalid index into type index remap");
5761
5762 unsigned GlobalIndex = LocalIndex + I->second;
5763 return (GlobalIndex << Qualifiers::FastWidth) | FastQuals;
5764}
5765
5766TemplateArgumentLocInfo
5767ASTReader::GetTemplateArgumentLocInfo(ModuleFile &F,
5768 TemplateArgument::ArgKind Kind,
5769 const RecordData &Record,
5770 unsigned &Index) {
5771 switch (Kind) {
5772 case TemplateArgument::Expression:
5773 return ReadExpr(F);
5774 case TemplateArgument::Type:
5775 return GetTypeSourceInfo(F, Record, Index);
5776 case TemplateArgument::Template: {
5777 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
5778 Index);
5779 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
5780 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
5781 SourceLocation());
5782 }
5783 case TemplateArgument::TemplateExpansion: {
5784 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
5785 Index);
5786 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
5787 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Index);
5788 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
5789 EllipsisLoc);
5790 }
5791 case TemplateArgument::Null:
5792 case TemplateArgument::Integral:
5793 case TemplateArgument::Declaration:
5794 case TemplateArgument::NullPtr:
5795 case TemplateArgument::Pack:
5796 // FIXME: Is this right?
5797 return TemplateArgumentLocInfo();
5798 }
5799 llvm_unreachable("unexpected template argument loc");
5800}
5801
5802TemplateArgumentLoc
5803ASTReader::ReadTemplateArgumentLoc(ModuleFile &F,
5804 const RecordData &Record, unsigned &Index) {
5805 TemplateArgument Arg = ReadTemplateArgument(F, Record, Index);
5806
5807 if (Arg.getKind() == TemplateArgument::Expression) {
5808 if (Record[Index++]) // bool InfoHasSameExpr.
5809 return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr()));
5810 }
5811 return TemplateArgumentLoc(Arg, GetTemplateArgumentLocInfo(F, Arg.getKind(),
5812 Record, Index));
5813}
5814
Enea Zaffanella6dbe1872013-08-10 07:24:53 +00005815const ASTTemplateArgumentListInfo*
5816ASTReader::ReadASTTemplateArgumentListInfo(ModuleFile &F,
5817 const RecordData &Record,
5818 unsigned &Index) {
5819 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Index);
5820 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Index);
5821 unsigned NumArgsAsWritten = Record[Index++];
5822 TemplateArgumentListInfo TemplArgsInfo(LAngleLoc, RAngleLoc);
5823 for (unsigned i = 0; i != NumArgsAsWritten; ++i)
5824 TemplArgsInfo.addArgument(ReadTemplateArgumentLoc(F, Record, Index));
5825 return ASTTemplateArgumentListInfo::Create(getContext(), TemplArgsInfo);
5826}
5827
Guy Benyei11169dd2012-12-18 14:30:41 +00005828Decl *ASTReader::GetExternalDecl(uint32_t ID) {
5829 return GetDecl(ID);
5830}
5831
Richard Smith50895422015-01-31 03:04:55 +00005832template<typename TemplateSpecializationDecl>
5833static void completeRedeclChainForTemplateSpecialization(Decl *D) {
5834 if (auto *TSD = dyn_cast<TemplateSpecializationDecl>(D))
5835 TSD->getSpecializedTemplate()->LoadLazySpecializations();
5836}
5837
Richard Smith053f6c62014-05-16 23:01:30 +00005838void ASTReader::CompleteRedeclChain(const Decl *D) {
Richard Smith851072e2014-05-19 20:59:20 +00005839 if (NumCurrentElementsDeserializing) {
5840 // We arrange to not care about the complete redeclaration chain while we're
5841 // deserializing. Just remember that the AST has marked this one as complete
5842 // but that it's not actually complete yet, so we know we still need to
5843 // complete it later.
5844 PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D));
5845 return;
5846 }
5847
Richard Smith053f6c62014-05-16 23:01:30 +00005848 const DeclContext *DC = D->getDeclContext()->getRedeclContext();
5849
Richard Smith053f6c62014-05-16 23:01:30 +00005850 // If this is a named declaration, complete it by looking it up
5851 // within its context.
5852 //
Richard Smith01bdb7a2014-08-28 05:44:07 +00005853 // FIXME: Merging a function definition should merge
Richard Smith053f6c62014-05-16 23:01:30 +00005854 // all mergeable entities within it.
5855 if (isa<TranslationUnitDecl>(DC) || isa<NamespaceDecl>(DC) ||
5856 isa<CXXRecordDecl>(DC) || isa<EnumDecl>(DC)) {
5857 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) {
5858 auto *II = Name.getAsIdentifierInfo();
5859 if (isa<TranslationUnitDecl>(DC) && II) {
5860 // Outside of C++, we don't have a lookup table for the TU, so update
5861 // the identifier instead. In C++, either way should work fine.
5862 if (II->isOutOfDate())
5863 updateOutOfDateIdentifier(*II);
5864 } else
5865 DC->lookup(Name);
Richard Smith01bdb7a2014-08-28 05:44:07 +00005866 } else if (needsAnonymousDeclarationNumber(cast<NamedDecl>(D))) {
5867 // FIXME: It'd be nice to do something a bit more targeted here.
5868 D->getDeclContext()->decls_begin();
Richard Smith053f6c62014-05-16 23:01:30 +00005869 }
5870 }
Richard Smith50895422015-01-31 03:04:55 +00005871
5872 if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D))
5873 CTSD->getSpecializedTemplate()->LoadLazySpecializations();
5874 if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D))
5875 VTSD->getSpecializedTemplate()->LoadLazySpecializations();
5876 if (auto *FD = dyn_cast<FunctionDecl>(D)) {
5877 if (auto *Template = FD->getPrimaryTemplate())
5878 Template->LoadLazySpecializations();
5879 }
Richard Smith053f6c62014-05-16 23:01:30 +00005880}
5881
Richard Smithc2bb8182015-03-24 06:36:48 +00005882uint64_t ASTReader::ReadCXXCtorInitializersRef(ModuleFile &M,
5883 const RecordData &Record,
5884 unsigned &Idx) {
5885 if (Idx >= Record.size() || Record[Idx] > M.LocalNumCXXCtorInitializers) {
5886 Error("malformed AST file: missing C++ ctor initializers");
5887 return 0;
5888 }
5889
5890 unsigned LocalID = Record[Idx++];
5891 return getGlobalBitOffset(M, M.CXXCtorInitializersOffsets[LocalID - 1]);
5892}
5893
5894CXXCtorInitializer **
5895ASTReader::GetExternalCXXCtorInitializers(uint64_t Offset) {
5896 RecordLocation Loc = getLocalBitOffset(Offset);
5897 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
5898 SavedStreamPosition SavedPosition(Cursor);
5899 Cursor.JumpToBit(Loc.Offset);
5900 ReadingKindTracker ReadingKind(Read_Decl, *this);
5901
5902 RecordData Record;
5903 unsigned Code = Cursor.ReadCode();
5904 unsigned RecCode = Cursor.readRecord(Code, Record);
5905 if (RecCode != DECL_CXX_CTOR_INITIALIZERS) {
5906 Error("malformed AST file: missing C++ ctor initializers");
5907 return nullptr;
5908 }
5909
5910 unsigned Idx = 0;
5911 return ReadCXXCtorInitializers(*Loc.F, Record, Idx);
5912}
5913
Richard Smithcd45dbc2014-04-19 03:48:30 +00005914uint64_t ASTReader::readCXXBaseSpecifiers(ModuleFile &M,
5915 const RecordData &Record,
5916 unsigned &Idx) {
5917 if (Idx >= Record.size() || Record[Idx] > M.LocalNumCXXBaseSpecifiers) {
5918 Error("malformed AST file: missing C++ base specifier");
Guy Benyei11169dd2012-12-18 14:30:41 +00005919 return 0;
Richard Smithcd45dbc2014-04-19 03:48:30 +00005920 }
5921
Guy Benyei11169dd2012-12-18 14:30:41 +00005922 unsigned LocalID = Record[Idx++];
5923 return getGlobalBitOffset(M, M.CXXBaseSpecifiersOffsets[LocalID - 1]);
5924}
5925
5926CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) {
5927 RecordLocation Loc = getLocalBitOffset(Offset);
Chris Lattner7fb3bef2013-01-20 00:56:42 +00005928 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00005929 SavedStreamPosition SavedPosition(Cursor);
5930 Cursor.JumpToBit(Loc.Offset);
5931 ReadingKindTracker ReadingKind(Read_Decl, *this);
5932 RecordData Record;
5933 unsigned Code = Cursor.ReadCode();
Chris Lattner0e6c9402013-01-20 02:38:54 +00005934 unsigned RecCode = Cursor.readRecord(Code, Record);
Guy Benyei11169dd2012-12-18 14:30:41 +00005935 if (RecCode != DECL_CXX_BASE_SPECIFIERS) {
Richard Smithcd45dbc2014-04-19 03:48:30 +00005936 Error("malformed AST file: missing C++ base specifiers");
Craig Toppera13603a2014-05-22 05:54:18 +00005937 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00005938 }
5939
5940 unsigned Idx = 0;
5941 unsigned NumBases = Record[Idx++];
5942 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases);
5943 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases];
5944 for (unsigned I = 0; I != NumBases; ++I)
5945 Bases[I] = ReadCXXBaseSpecifier(*Loc.F, Record, Idx);
5946 return Bases;
5947}
5948
5949serialization::DeclID
5950ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const {
5951 if (LocalID < NUM_PREDEF_DECL_IDS)
5952 return LocalID;
5953
5954 ContinuousRangeMap<uint32_t, int, 2>::iterator I
5955 = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS);
5956 assert(I != F.DeclRemap.end() && "Invalid index into decl index remap");
5957
5958 return LocalID + I->second;
5959}
5960
5961bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID,
5962 ModuleFile &M) const {
Richard Smithfe620d22015-03-05 23:24:12 +00005963 // Predefined decls aren't from any module.
5964 if (ID < NUM_PREDEF_DECL_IDS)
5965 return false;
5966
Guy Benyei11169dd2012-12-18 14:30:41 +00005967 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(ID);
5968 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
5969 return &M == I->second;
5970}
5971
Douglas Gregor9f782892013-01-21 15:25:38 +00005972ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) {
Guy Benyei11169dd2012-12-18 14:30:41 +00005973 if (!D->isFromASTFile())
Craig Toppera13603a2014-05-22 05:54:18 +00005974 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00005975 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID());
5976 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
5977 return I->second;
5978}
5979
5980SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) {
5981 if (ID < NUM_PREDEF_DECL_IDS)
5982 return SourceLocation();
Richard Smithcd45dbc2014-04-19 03:48:30 +00005983
Guy Benyei11169dd2012-12-18 14:30:41 +00005984 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
5985
5986 if (Index > DeclsLoaded.size()) {
5987 Error("declaration ID out-of-range for AST file");
5988 return SourceLocation();
5989 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00005990
Guy Benyei11169dd2012-12-18 14:30:41 +00005991 if (Decl *D = DeclsLoaded[Index])
5992 return D->getLocation();
5993
5994 unsigned RawLocation = 0;
5995 RecordLocation Rec = DeclCursorForID(ID, RawLocation);
5996 return ReadSourceLocation(*Rec.F, RawLocation);
5997}
5998
Richard Smithfe620d22015-03-05 23:24:12 +00005999static Decl *getPredefinedDecl(ASTContext &Context, PredefinedDeclIDs ID) {
6000 switch (ID) {
6001 case PREDEF_DECL_NULL_ID:
6002 return nullptr;
6003
6004 case PREDEF_DECL_TRANSLATION_UNIT_ID:
6005 return Context.getTranslationUnitDecl();
6006
6007 case PREDEF_DECL_OBJC_ID_ID:
6008 return Context.getObjCIdDecl();
6009
6010 case PREDEF_DECL_OBJC_SEL_ID:
6011 return Context.getObjCSelDecl();
6012
6013 case PREDEF_DECL_OBJC_CLASS_ID:
6014 return Context.getObjCClassDecl();
6015
6016 case PREDEF_DECL_OBJC_PROTOCOL_ID:
6017 return Context.getObjCProtocolDecl();
6018
6019 case PREDEF_DECL_INT_128_ID:
6020 return Context.getInt128Decl();
6021
6022 case PREDEF_DECL_UNSIGNED_INT_128_ID:
6023 return Context.getUInt128Decl();
6024
6025 case PREDEF_DECL_OBJC_INSTANCETYPE_ID:
6026 return Context.getObjCInstanceTypeDecl();
6027
6028 case PREDEF_DECL_BUILTIN_VA_LIST_ID:
6029 return Context.getBuiltinVaListDecl();
Richard Smithf19e1272015-03-07 00:04:49 +00006030
6031 case PREDEF_DECL_EXTERN_C_CONTEXT_ID:
6032 return Context.getExternCContextDecl();
Richard Smithfe620d22015-03-05 23:24:12 +00006033 }
Yaron Keren322bdad2015-03-06 07:49:14 +00006034 llvm_unreachable("PredefinedDeclIDs unknown enum value");
Richard Smithfe620d22015-03-05 23:24:12 +00006035}
6036
Richard Smithcd45dbc2014-04-19 03:48:30 +00006037Decl *ASTReader::GetExistingDecl(DeclID ID) {
6038 if (ID < NUM_PREDEF_DECL_IDS) {
Richard Smithfe620d22015-03-05 23:24:12 +00006039 Decl *D = getPredefinedDecl(Context, (PredefinedDeclIDs)ID);
6040 if (D) {
6041 // Track that we have merged the declaration with ID \p ID into the
6042 // pre-existing predefined declaration \p D.
6043 auto &Merged = MergedDecls[D->getCanonicalDecl()];
6044 if (Merged.empty())
6045 Merged.push_back(ID);
Guy Benyei11169dd2012-12-18 14:30:41 +00006046 }
Richard Smithfe620d22015-03-05 23:24:12 +00006047 return D;
Guy Benyei11169dd2012-12-18 14:30:41 +00006048 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00006049
Guy Benyei11169dd2012-12-18 14:30:41 +00006050 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6051
6052 if (Index >= DeclsLoaded.size()) {
6053 assert(0 && "declaration ID out-of-range for AST file");
6054 Error("declaration ID out-of-range for AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00006055 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00006056 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00006057
6058 return DeclsLoaded[Index];
6059}
6060
6061Decl *ASTReader::GetDecl(DeclID ID) {
6062 if (ID < NUM_PREDEF_DECL_IDS)
6063 return GetExistingDecl(ID);
6064
6065 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6066
6067 if (Index >= DeclsLoaded.size()) {
6068 assert(0 && "declaration ID out-of-range for AST file");
6069 Error("declaration ID out-of-range for AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00006070 return nullptr;
Richard Smithcd45dbc2014-04-19 03:48:30 +00006071 }
6072
Guy Benyei11169dd2012-12-18 14:30:41 +00006073 if (!DeclsLoaded[Index]) {
6074 ReadDeclRecord(ID);
6075 if (DeserializationListener)
6076 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
6077 }
6078
6079 return DeclsLoaded[Index];
6080}
6081
6082DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M,
6083 DeclID GlobalID) {
6084 if (GlobalID < NUM_PREDEF_DECL_IDS)
6085 return GlobalID;
6086
6087 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID);
6088 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6089 ModuleFile *Owner = I->second;
6090
6091 llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos
6092 = M.GlobalToLocalDeclIDs.find(Owner);
6093 if (Pos == M.GlobalToLocalDeclIDs.end())
6094 return 0;
6095
6096 return GlobalID - Owner->BaseDeclID + Pos->second;
6097}
6098
6099serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F,
6100 const RecordData &Record,
6101 unsigned &Idx) {
6102 if (Idx >= Record.size()) {
6103 Error("Corrupted AST file");
6104 return 0;
6105 }
6106
6107 return getGlobalDeclID(F, Record[Idx++]);
6108}
6109
6110/// \brief Resolve the offset of a statement into a statement.
6111///
6112/// This operation will read a new statement from the external
6113/// source each time it is called, and is meant to be used via a
6114/// LazyOffsetPtr (which is used by Decls for the body of functions, etc).
6115Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) {
6116 // Switch case IDs are per Decl.
6117 ClearSwitchCaseIDs();
6118
6119 // Offset here is a global offset across the entire chain.
6120 RecordLocation Loc = getLocalBitOffset(Offset);
6121 Loc.F->DeclsCursor.JumpToBit(Loc.Offset);
6122 return ReadStmtFromStream(*Loc.F);
6123}
6124
6125namespace {
6126 class FindExternalLexicalDeclsVisitor {
6127 ASTReader &Reader;
6128 const DeclContext *DC;
6129 bool (*isKindWeWant)(Decl::Kind);
6130
6131 SmallVectorImpl<Decl*> &Decls;
6132 bool PredefsVisited[NUM_PREDEF_DECL_IDS];
6133
6134 public:
6135 FindExternalLexicalDeclsVisitor(ASTReader &Reader, const DeclContext *DC,
6136 bool (*isKindWeWant)(Decl::Kind),
6137 SmallVectorImpl<Decl*> &Decls)
6138 : Reader(Reader), DC(DC), isKindWeWant(isKindWeWant), Decls(Decls)
6139 {
6140 for (unsigned I = 0; I != NUM_PREDEF_DECL_IDS; ++I)
6141 PredefsVisited[I] = false;
6142 }
6143
6144 static bool visit(ModuleFile &M, bool Preorder, void *UserData) {
6145 if (Preorder)
6146 return false;
6147
6148 FindExternalLexicalDeclsVisitor *This
6149 = static_cast<FindExternalLexicalDeclsVisitor *>(UserData);
6150
6151 ModuleFile::DeclContextInfosMap::iterator Info
6152 = M.DeclContextInfos.find(This->DC);
6153 if (Info == M.DeclContextInfos.end() || !Info->second.LexicalDecls)
6154 return false;
6155
6156 // Load all of the declaration IDs
6157 for (const KindDeclIDPair *ID = Info->second.LexicalDecls,
6158 *IDE = ID + Info->second.NumLexicalDecls;
6159 ID != IDE; ++ID) {
6160 if (This->isKindWeWant && !This->isKindWeWant((Decl::Kind)ID->first))
6161 continue;
6162
6163 // Don't add predefined declarations to the lexical context more
6164 // than once.
6165 if (ID->second < NUM_PREDEF_DECL_IDS) {
6166 if (This->PredefsVisited[ID->second])
6167 continue;
6168
6169 This->PredefsVisited[ID->second] = true;
6170 }
6171
6172 if (Decl *D = This->Reader.GetLocalDecl(M, ID->second)) {
6173 if (!This->DC->isDeclInLexicalTraversal(D))
6174 This->Decls.push_back(D);
6175 }
6176 }
6177
6178 return false;
6179 }
6180 };
6181}
6182
6183ExternalLoadResult ASTReader::FindExternalLexicalDecls(const DeclContext *DC,
6184 bool (*isKindWeWant)(Decl::Kind),
6185 SmallVectorImpl<Decl*> &Decls) {
6186 // There might be lexical decls in multiple modules, for the TU at
6187 // least. Walk all of the modules in the order they were loaded.
6188 FindExternalLexicalDeclsVisitor Visitor(*this, DC, isKindWeWant, Decls);
6189 ModuleMgr.visitDepthFirst(&FindExternalLexicalDeclsVisitor::visit, &Visitor);
6190 ++NumLexicalDeclContextsRead;
6191 return ELR_Success;
6192}
6193
6194namespace {
6195
6196class DeclIDComp {
6197 ASTReader &Reader;
6198 ModuleFile &Mod;
6199
6200public:
6201 DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {}
6202
6203 bool operator()(LocalDeclID L, LocalDeclID R) const {
6204 SourceLocation LHS = getLocation(L);
6205 SourceLocation RHS = getLocation(R);
6206 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6207 }
6208
6209 bool operator()(SourceLocation LHS, LocalDeclID R) const {
6210 SourceLocation RHS = getLocation(R);
6211 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6212 }
6213
6214 bool operator()(LocalDeclID L, SourceLocation RHS) const {
6215 SourceLocation LHS = getLocation(L);
6216 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6217 }
6218
6219 SourceLocation getLocation(LocalDeclID ID) const {
6220 return Reader.getSourceManager().getFileLoc(
6221 Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID)));
6222 }
6223};
6224
6225}
6226
6227void ASTReader::FindFileRegionDecls(FileID File,
6228 unsigned Offset, unsigned Length,
6229 SmallVectorImpl<Decl *> &Decls) {
6230 SourceManager &SM = getSourceManager();
6231
6232 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File);
6233 if (I == FileDeclIDs.end())
6234 return;
6235
6236 FileDeclsInfo &DInfo = I->second;
6237 if (DInfo.Decls.empty())
6238 return;
6239
6240 SourceLocation
6241 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset);
6242 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length);
6243
6244 DeclIDComp DIDComp(*this, *DInfo.Mod);
6245 ArrayRef<serialization::LocalDeclID>::iterator
6246 BeginIt = std::lower_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
6247 BeginLoc, DIDComp);
6248 if (BeginIt != DInfo.Decls.begin())
6249 --BeginIt;
6250
6251 // If we are pointing at a top-level decl inside an objc container, we need
6252 // to backtrack until we find it otherwise we will fail to report that the
6253 // region overlaps with an objc container.
6254 while (BeginIt != DInfo.Decls.begin() &&
6255 GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt))
6256 ->isTopLevelDeclInObjCContainer())
6257 --BeginIt;
6258
6259 ArrayRef<serialization::LocalDeclID>::iterator
6260 EndIt = std::upper_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
6261 EndLoc, DIDComp);
6262 if (EndIt != DInfo.Decls.end())
6263 ++EndIt;
6264
6265 for (ArrayRef<serialization::LocalDeclID>::iterator
6266 DIt = BeginIt; DIt != EndIt; ++DIt)
6267 Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt)));
6268}
6269
6270namespace {
6271 /// \brief ModuleFile visitor used to perform name lookup into a
6272 /// declaration context.
6273 class DeclContextNameLookupVisitor {
6274 ASTReader &Reader;
Richard Smith8c913ec2014-08-14 02:21:01 +00006275 ArrayRef<const DeclContext *> Contexts;
Guy Benyei11169dd2012-12-18 14:30:41 +00006276 DeclarationName Name;
6277 SmallVectorImpl<NamedDecl *> &Decls;
Richard Smith52874ec2015-02-13 20:17:14 +00006278 llvm::SmallPtrSetImpl<NamedDecl *> &DeclSet;
Guy Benyei11169dd2012-12-18 14:30:41 +00006279
6280 public:
Richard Smith8c913ec2014-08-14 02:21:01 +00006281 DeclContextNameLookupVisitor(ASTReader &Reader,
6282 ArrayRef<const DeclContext *> Contexts,
Guy Benyei11169dd2012-12-18 14:30:41 +00006283 DeclarationName Name,
Richard Smith52874ec2015-02-13 20:17:14 +00006284 SmallVectorImpl<NamedDecl *> &Decls,
6285 llvm::SmallPtrSetImpl<NamedDecl *> &DeclSet)
6286 : Reader(Reader), Contexts(Contexts), Name(Name), Decls(Decls),
6287 DeclSet(DeclSet) { }
Guy Benyei11169dd2012-12-18 14:30:41 +00006288
6289 static bool visit(ModuleFile &M, void *UserData) {
6290 DeclContextNameLookupVisitor *This
6291 = static_cast<DeclContextNameLookupVisitor *>(UserData);
6292
6293 // Check whether we have any visible declaration information for
6294 // this context in this module.
6295 ModuleFile::DeclContextInfosMap::iterator Info;
6296 bool FoundInfo = false;
Richard Smith8c913ec2014-08-14 02:21:01 +00006297 for (auto *DC : This->Contexts) {
6298 Info = M.DeclContextInfos.find(DC);
6299 if (Info != M.DeclContextInfos.end() &&
Guy Benyei11169dd2012-12-18 14:30:41 +00006300 Info->second.NameLookupTableData) {
6301 FoundInfo = true;
6302 break;
6303 }
6304 }
6305
6306 if (!FoundInfo)
6307 return false;
Richard Smith8c913ec2014-08-14 02:21:01 +00006308
Guy Benyei11169dd2012-12-18 14:30:41 +00006309 // Look for this name within this module.
Richard Smith52e3fba2014-03-11 07:17:35 +00006310 ASTDeclContextNameLookupTable *LookupTable =
Guy Benyei11169dd2012-12-18 14:30:41 +00006311 Info->second.NameLookupTableData;
6312 ASTDeclContextNameLookupTable::iterator Pos
6313 = LookupTable->find(This->Name);
6314 if (Pos == LookupTable->end())
6315 return false;
6316
6317 bool FoundAnything = false;
6318 ASTDeclContextNameLookupTrait::data_type Data = *Pos;
6319 for (; Data.first != Data.second; ++Data.first) {
6320 NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M, *Data.first);
6321 if (!ND)
6322 continue;
6323
6324 if (ND->getDeclName() != This->Name) {
6325 // A name might be null because the decl's redeclarable part is
6326 // currently read before reading its name. The lookup is triggered by
6327 // building that decl (likely indirectly), and so it is later in the
6328 // sense of "already existing" and can be ignored here.
Richard Smith8c913ec2014-08-14 02:21:01 +00006329 // FIXME: This should not happen; deserializing declarations should
6330 // not perform lookups since that can lead to deserialization cycles.
Guy Benyei11169dd2012-12-18 14:30:41 +00006331 continue;
6332 }
Richard Smith8c913ec2014-08-14 02:21:01 +00006333
Guy Benyei11169dd2012-12-18 14:30:41 +00006334 // Record this declaration.
6335 FoundAnything = true;
Richard Smith52874ec2015-02-13 20:17:14 +00006336 if (This->DeclSet.insert(ND).second)
6337 This->Decls.push_back(ND);
Guy Benyei11169dd2012-12-18 14:30:41 +00006338 }
6339
6340 return FoundAnything;
6341 }
6342 };
6343}
6344
Douglas Gregor9f782892013-01-21 15:25:38 +00006345/// \brief Retrieve the "definitive" module file for the definition of the
6346/// given declaration context, if there is one.
6347///
6348/// The "definitive" module file is the only place where we need to look to
6349/// find information about the declarations within the given declaration
6350/// context. For example, C++ and Objective-C classes, C structs/unions, and
6351/// Objective-C protocols, categories, and extensions are all defined in a
6352/// single place in the source code, so they have definitive module files
6353/// associated with them. C++ namespaces, on the other hand, can have
6354/// definitions in multiple different module files.
6355///
6356/// Note: this needs to be kept in sync with ASTWriter::AddedVisibleDecl's
6357/// NDEBUG checking.
6358static ModuleFile *getDefinitiveModuleFileFor(const DeclContext *DC,
6359 ASTReader &Reader) {
Douglas Gregor7a6e2002013-01-22 17:08:30 +00006360 if (const DeclContext *DefDC = getDefinitiveDeclContext(DC))
6361 return Reader.getOwningModuleFile(cast<Decl>(DefDC));
Douglas Gregor9f782892013-01-21 15:25:38 +00006362
Craig Toppera13603a2014-05-22 05:54:18 +00006363 return nullptr;
Douglas Gregor9f782892013-01-21 15:25:38 +00006364}
6365
Richard Smith9ce12e32013-02-07 03:30:24 +00006366bool
Guy Benyei11169dd2012-12-18 14:30:41 +00006367ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC,
6368 DeclarationName Name) {
6369 assert(DC->hasExternalVisibleStorage() &&
6370 "DeclContext has no visible decls in storage");
6371 if (!Name)
Richard Smith9ce12e32013-02-07 03:30:24 +00006372 return false;
Guy Benyei11169dd2012-12-18 14:30:41 +00006373
Richard Smith8c913ec2014-08-14 02:21:01 +00006374 Deserializing LookupResults(this);
6375
Guy Benyei11169dd2012-12-18 14:30:41 +00006376 SmallVector<NamedDecl *, 64> Decls;
Richard Smith52874ec2015-02-13 20:17:14 +00006377 llvm::SmallPtrSet<NamedDecl*, 64> DeclSet;
Richard Smith8c913ec2014-08-14 02:21:01 +00006378
Guy Benyei11169dd2012-12-18 14:30:41 +00006379 // Compute the declaration contexts we need to look into. Multiple such
6380 // declaration contexts occur when two declaration contexts from disjoint
6381 // modules get merged, e.g., when two namespaces with the same name are
6382 // independently defined in separate modules.
6383 SmallVector<const DeclContext *, 2> Contexts;
6384 Contexts.push_back(DC);
Richard Smith8c913ec2014-08-14 02:21:01 +00006385
Guy Benyei11169dd2012-12-18 14:30:41 +00006386 if (DC->isNamespace()) {
Richard Smithcd45dbc2014-04-19 03:48:30 +00006387 auto Merged = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC)));
Guy Benyei11169dd2012-12-18 14:30:41 +00006388 if (Merged != MergedDecls.end()) {
6389 for (unsigned I = 0, N = Merged->second.size(); I != N; ++I)
6390 Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I])));
6391 }
6392 }
Richard Smith8c913ec2014-08-14 02:21:01 +00006393
6394 auto LookUpInContexts = [&](ArrayRef<const DeclContext*> Contexts) {
Richard Smith52874ec2015-02-13 20:17:14 +00006395 DeclContextNameLookupVisitor Visitor(*this, Contexts, Name, Decls, DeclSet);
Richard Smith8c913ec2014-08-14 02:21:01 +00006396
6397 // If we can definitively determine which module file to look into,
6398 // only look there. Otherwise, look in all module files.
6399 ModuleFile *Definitive;
6400 if (Contexts.size() == 1 &&
6401 (Definitive = getDefinitiveModuleFileFor(Contexts[0], *this))) {
6402 DeclContextNameLookupVisitor::visit(*Definitive, &Visitor);
6403 } else {
6404 ModuleMgr.visit(&DeclContextNameLookupVisitor::visit, &Visitor);
6405 }
6406 };
6407
6408 LookUpInContexts(Contexts);
6409
6410 // If this might be an implicit special member function, then also search
6411 // all merged definitions of the surrounding class. We need to search them
6412 // individually, because finding an entity in one of them doesn't imply that
6413 // we can't find a different entity in another one.
Richard Smithcd45dbc2014-04-19 03:48:30 +00006414 if (isa<CXXRecordDecl>(DC)) {
Richard Smith02793752015-03-27 21:16:39 +00006415 auto Merged = MergedLookups.find(DC);
6416 if (Merged != MergedLookups.end()) {
6417 for (unsigned I = 0; I != Merged->second.size(); ++I) {
6418 const DeclContext *Context = Merged->second[I];
6419 LookUpInContexts(Context);
6420 // We might have just added some more merged lookups. If so, our
6421 // iterator is now invalid, so grab a fresh one before continuing.
6422 Merged = MergedLookups.find(DC);
Richard Smithe0612472014-11-21 05:16:13 +00006423 }
Richard Smith8c913ec2014-08-14 02:21:01 +00006424 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00006425 }
6426
Guy Benyei11169dd2012-12-18 14:30:41 +00006427 ++NumVisibleDeclContextsRead;
6428 SetExternalVisibleDeclsForName(DC, Name, Decls);
Richard Smith9ce12e32013-02-07 03:30:24 +00006429 return !Decls.empty();
Guy Benyei11169dd2012-12-18 14:30:41 +00006430}
6431
6432namespace {
6433 /// \brief ModuleFile visitor used to retrieve all visible names in a
6434 /// declaration context.
6435 class DeclContextAllNamesVisitor {
6436 ASTReader &Reader;
Dmitri Gribenkof8579502013-01-12 19:30:44 +00006437 SmallVectorImpl<const DeclContext *> &Contexts;
Craig Topper3598eb72013-07-05 04:43:31 +00006438 DeclsMap &Decls;
Richard Smith52874ec2015-02-13 20:17:14 +00006439 llvm::SmallPtrSet<NamedDecl *, 256> DeclSet;
Argyrios Kyrtzidis2810e9d2012-12-19 22:21:18 +00006440 bool VisitAll;
Guy Benyei11169dd2012-12-18 14:30:41 +00006441
6442 public:
6443 DeclContextAllNamesVisitor(ASTReader &Reader,
6444 SmallVectorImpl<const DeclContext *> &Contexts,
Craig Topper3598eb72013-07-05 04:43:31 +00006445 DeclsMap &Decls, bool VisitAll)
Argyrios Kyrtzidis2810e9d2012-12-19 22:21:18 +00006446 : Reader(Reader), Contexts(Contexts), Decls(Decls), VisitAll(VisitAll) { }
Guy Benyei11169dd2012-12-18 14:30:41 +00006447
6448 static bool visit(ModuleFile &M, void *UserData) {
6449 DeclContextAllNamesVisitor *This
6450 = static_cast<DeclContextAllNamesVisitor *>(UserData);
6451
6452 // Check whether we have any visible declaration information for
6453 // this context in this module.
6454 ModuleFile::DeclContextInfosMap::iterator Info;
6455 bool FoundInfo = false;
6456 for (unsigned I = 0, N = This->Contexts.size(); I != N; ++I) {
6457 Info = M.DeclContextInfos.find(This->Contexts[I]);
6458 if (Info != M.DeclContextInfos.end() &&
6459 Info->second.NameLookupTableData) {
6460 FoundInfo = true;
6461 break;
6462 }
6463 }
6464
6465 if (!FoundInfo)
6466 return false;
6467
Richard Smith52e3fba2014-03-11 07:17:35 +00006468 ASTDeclContextNameLookupTable *LookupTable =
Guy Benyei11169dd2012-12-18 14:30:41 +00006469 Info->second.NameLookupTableData;
6470 bool FoundAnything = false;
6471 for (ASTDeclContextNameLookupTable::data_iterator
Douglas Gregor5e306b12013-01-23 22:38:11 +00006472 I = LookupTable->data_begin(), E = LookupTable->data_end();
6473 I != E;
6474 ++I) {
Guy Benyei11169dd2012-12-18 14:30:41 +00006475 ASTDeclContextNameLookupTrait::data_type Data = *I;
6476 for (; Data.first != Data.second; ++Data.first) {
6477 NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M,
6478 *Data.first);
6479 if (!ND)
6480 continue;
6481
6482 // Record this declaration.
6483 FoundAnything = true;
Richard Smith52874ec2015-02-13 20:17:14 +00006484 if (This->DeclSet.insert(ND).second)
6485 This->Decls[ND->getDeclName()].push_back(ND);
Guy Benyei11169dd2012-12-18 14:30:41 +00006486 }
6487 }
6488
Argyrios Kyrtzidis2810e9d2012-12-19 22:21:18 +00006489 return FoundAnything && !This->VisitAll;
Guy Benyei11169dd2012-12-18 14:30:41 +00006490 }
6491 };
6492}
6493
6494void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) {
6495 if (!DC->hasExternalVisibleStorage())
6496 return;
Craig Topper79be4cd2013-07-05 04:33:53 +00006497 DeclsMap Decls;
Guy Benyei11169dd2012-12-18 14:30:41 +00006498
6499 // Compute the declaration contexts we need to look into. Multiple such
6500 // declaration contexts occur when two declaration contexts from disjoint
6501 // modules get merged, e.g., when two namespaces with the same name are
6502 // independently defined in separate modules.
6503 SmallVector<const DeclContext *, 2> Contexts;
6504 Contexts.push_back(DC);
6505
6506 if (DC->isNamespace()) {
6507 MergedDeclsMap::iterator Merged
6508 = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC)));
6509 if (Merged != MergedDecls.end()) {
6510 for (unsigned I = 0, N = Merged->second.size(); I != N; ++I)
6511 Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I])));
6512 }
6513 }
6514
Argyrios Kyrtzidis2810e9d2012-12-19 22:21:18 +00006515 DeclContextAllNamesVisitor Visitor(*this, Contexts, Decls,
6516 /*VisitAll=*/DC->isFileContext());
Guy Benyei11169dd2012-12-18 14:30:41 +00006517 ModuleMgr.visit(&DeclContextAllNamesVisitor::visit, &Visitor);
6518 ++NumVisibleDeclContextsRead;
6519
Craig Topper79be4cd2013-07-05 04:33:53 +00006520 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) {
Guy Benyei11169dd2012-12-18 14:30:41 +00006521 SetExternalVisibleDeclsForName(DC, I->first, I->second);
6522 }
6523 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false);
6524}
6525
6526/// \brief Under non-PCH compilation the consumer receives the objc methods
6527/// before receiving the implementation, and codegen depends on this.
6528/// We simulate this by deserializing and passing to consumer the methods of the
6529/// implementation before passing the deserialized implementation decl.
6530static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD,
6531 ASTConsumer *Consumer) {
6532 assert(ImplD && Consumer);
6533
Aaron Ballmanaff18c02014-03-13 19:03:34 +00006534 for (auto *I : ImplD->methods())
6535 Consumer->HandleInterestingDecl(DeclGroupRef(I));
Guy Benyei11169dd2012-12-18 14:30:41 +00006536
6537 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD));
6538}
6539
6540void ASTReader::PassInterestingDeclsToConsumer() {
6541 assert(Consumer);
Richard Smith04d05b52014-03-23 00:27:18 +00006542
6543 if (PassingDeclsToConsumer)
6544 return;
6545
6546 // Guard variable to avoid recursively redoing the process of passing
6547 // decls to consumer.
6548 SaveAndRestore<bool> GuardPassingDeclsToConsumer(PassingDeclsToConsumer,
6549 true);
6550
Richard Smith9e2341d2015-03-23 03:25:59 +00006551 // Ensure that we've loaded all potentially-interesting declarations
6552 // that need to be eagerly loaded.
6553 for (auto ID : EagerlyDeserializedDecls)
6554 GetDecl(ID);
6555 EagerlyDeserializedDecls.clear();
6556
Guy Benyei11169dd2012-12-18 14:30:41 +00006557 while (!InterestingDecls.empty()) {
6558 Decl *D = InterestingDecls.front();
6559 InterestingDecls.pop_front();
6560
6561 PassInterestingDeclToConsumer(D);
6562 }
6563}
6564
6565void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
6566 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
6567 PassObjCImplDeclToConsumer(ImplD, Consumer);
6568 else
6569 Consumer->HandleInterestingDecl(DeclGroupRef(D));
6570}
6571
6572void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) {
6573 this->Consumer = Consumer;
6574
Richard Smith9e2341d2015-03-23 03:25:59 +00006575 if (Consumer)
6576 PassInterestingDeclsToConsumer();
Richard Smith7f330cd2015-03-18 01:42:29 +00006577
6578 if (DeserializationListener)
6579 DeserializationListener->ReaderInitialized(this);
Guy Benyei11169dd2012-12-18 14:30:41 +00006580}
6581
6582void ASTReader::PrintStats() {
6583 std::fprintf(stderr, "*** AST File Statistics:\n");
6584
6585 unsigned NumTypesLoaded
6586 = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(),
6587 QualType());
6588 unsigned NumDeclsLoaded
6589 = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(),
Craig Toppera13603a2014-05-22 05:54:18 +00006590 (Decl *)nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00006591 unsigned NumIdentifiersLoaded
6592 = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(),
6593 IdentifiersLoaded.end(),
Craig Toppera13603a2014-05-22 05:54:18 +00006594 (IdentifierInfo *)nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00006595 unsigned NumMacrosLoaded
6596 = MacrosLoaded.size() - std::count(MacrosLoaded.begin(),
6597 MacrosLoaded.end(),
Craig Toppera13603a2014-05-22 05:54:18 +00006598 (MacroInfo *)nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00006599 unsigned NumSelectorsLoaded
6600 = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(),
6601 SelectorsLoaded.end(),
6602 Selector());
6603
6604 if (unsigned TotalNumSLocEntries = getTotalNumSLocs())
6605 std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n",
6606 NumSLocEntriesRead, TotalNumSLocEntries,
6607 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
6608 if (!TypesLoaded.empty())
6609 std::fprintf(stderr, " %u/%u types read (%f%%)\n",
6610 NumTypesLoaded, (unsigned)TypesLoaded.size(),
6611 ((float)NumTypesLoaded/TypesLoaded.size() * 100));
6612 if (!DeclsLoaded.empty())
6613 std::fprintf(stderr, " %u/%u declarations read (%f%%)\n",
6614 NumDeclsLoaded, (unsigned)DeclsLoaded.size(),
6615 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100));
6616 if (!IdentifiersLoaded.empty())
6617 std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n",
6618 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(),
6619 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
6620 if (!MacrosLoaded.empty())
6621 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
6622 NumMacrosLoaded, (unsigned)MacrosLoaded.size(),
6623 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100));
6624 if (!SelectorsLoaded.empty())
6625 std::fprintf(stderr, " %u/%u selectors read (%f%%)\n",
6626 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(),
6627 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
6628 if (TotalNumStatements)
6629 std::fprintf(stderr, " %u/%u statements read (%f%%)\n",
6630 NumStatementsRead, TotalNumStatements,
6631 ((float)NumStatementsRead/TotalNumStatements * 100));
6632 if (TotalNumMacros)
6633 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
6634 NumMacrosRead, TotalNumMacros,
6635 ((float)NumMacrosRead/TotalNumMacros * 100));
6636 if (TotalLexicalDeclContexts)
6637 std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n",
6638 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
6639 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
6640 * 100));
6641 if (TotalVisibleDeclContexts)
6642 std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n",
6643 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
6644 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
6645 * 100));
6646 if (TotalNumMethodPoolEntries) {
6647 std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n",
6648 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
6649 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
6650 * 100));
Guy Benyei11169dd2012-12-18 14:30:41 +00006651 }
Douglas Gregorad2f7a52013-01-28 17:54:36 +00006652 if (NumMethodPoolLookups) {
6653 std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n",
6654 NumMethodPoolHits, NumMethodPoolLookups,
6655 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
6656 }
6657 if (NumMethodPoolTableLookups) {
6658 std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n",
6659 NumMethodPoolTableHits, NumMethodPoolTableLookups,
6660 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups
6661 * 100.0));
6662 }
6663
Douglas Gregor00a50f72013-01-25 00:38:33 +00006664 if (NumIdentifierLookupHits) {
6665 std::fprintf(stderr,
6666 " %u / %u identifier table lookups succeeded (%f%%)\n",
6667 NumIdentifierLookupHits, NumIdentifierLookups,
6668 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
6669 }
6670
Douglas Gregore060e572013-01-25 01:03:03 +00006671 if (GlobalIndex) {
6672 std::fprintf(stderr, "\n");
6673 GlobalIndex->printStats();
6674 }
6675
Guy Benyei11169dd2012-12-18 14:30:41 +00006676 std::fprintf(stderr, "\n");
6677 dump();
6678 std::fprintf(stderr, "\n");
6679}
6680
6681template<typename Key, typename ModuleFile, unsigned InitialCapacity>
6682static void
6683dumpModuleIDMap(StringRef Name,
6684 const ContinuousRangeMap<Key, ModuleFile *,
6685 InitialCapacity> &Map) {
6686 if (Map.begin() == Map.end())
6687 return;
6688
6689 typedef ContinuousRangeMap<Key, ModuleFile *, InitialCapacity> MapType;
6690 llvm::errs() << Name << ":\n";
6691 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
6692 I != IEnd; ++I) {
6693 llvm::errs() << " " << I->first << " -> " << I->second->FileName
6694 << "\n";
6695 }
6696}
6697
6698void ASTReader::dump() {
6699 llvm::errs() << "*** PCH/ModuleFile Remappings:\n";
6700 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap);
6701 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap);
6702 dumpModuleIDMap("Global type map", GlobalTypeMap);
6703 dumpModuleIDMap("Global declaration map", GlobalDeclMap);
6704 dumpModuleIDMap("Global identifier map", GlobalIdentifierMap);
6705 dumpModuleIDMap("Global macro map", GlobalMacroMap);
6706 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap);
6707 dumpModuleIDMap("Global selector map", GlobalSelectorMap);
6708 dumpModuleIDMap("Global preprocessed entity map",
6709 GlobalPreprocessedEntityMap);
6710
6711 llvm::errs() << "\n*** PCH/Modules Loaded:";
6712 for (ModuleManager::ModuleConstIterator M = ModuleMgr.begin(),
6713 MEnd = ModuleMgr.end();
6714 M != MEnd; ++M)
6715 (*M)->dump();
6716}
6717
6718/// Return the amount of memory used by memory buffers, breaking down
6719/// by heap-backed versus mmap'ed memory.
6720void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const {
6721 for (ModuleConstIterator I = ModuleMgr.begin(),
6722 E = ModuleMgr.end(); I != E; ++I) {
6723 if (llvm::MemoryBuffer *buf = (*I)->Buffer.get()) {
6724 size_t bytes = buf->getBufferSize();
6725 switch (buf->getBufferKind()) {
6726 case llvm::MemoryBuffer::MemoryBuffer_Malloc:
6727 sizes.malloc_bytes += bytes;
6728 break;
6729 case llvm::MemoryBuffer::MemoryBuffer_MMap:
6730 sizes.mmap_bytes += bytes;
6731 break;
6732 }
6733 }
6734 }
6735}
6736
6737void ASTReader::InitializeSema(Sema &S) {
6738 SemaObj = &S;
6739 S.addExternalSource(this);
6740
6741 // Makes sure any declarations that were deserialized "too early"
6742 // still get added to the identifier's declaration chains.
Ben Langmuir5418f402014-09-10 21:29:41 +00006743 for (uint64_t ID : PreloadedDeclIDs) {
6744 NamedDecl *D = cast<NamedDecl>(GetDecl(ID));
6745 pushExternalDeclIntoScope(D, D->getDeclName());
Guy Benyei11169dd2012-12-18 14:30:41 +00006746 }
Ben Langmuir5418f402014-09-10 21:29:41 +00006747 PreloadedDeclIDs.clear();
Guy Benyei11169dd2012-12-18 14:30:41 +00006748
Richard Smith3d8e97e2013-10-18 06:54:39 +00006749 // FIXME: What happens if these are changed by a module import?
Guy Benyei11169dd2012-12-18 14:30:41 +00006750 if (!FPPragmaOptions.empty()) {
6751 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS");
6752 SemaObj->FPFeatures.fp_contract = FPPragmaOptions[0];
6753 }
6754
Richard Smith3d8e97e2013-10-18 06:54:39 +00006755 // FIXME: What happens if these are changed by a module import?
Guy Benyei11169dd2012-12-18 14:30:41 +00006756 if (!OpenCLExtensions.empty()) {
6757 unsigned I = 0;
6758#define OPENCLEXT(nm) SemaObj->OpenCLFeatures.nm = OpenCLExtensions[I++];
6759#include "clang/Basic/OpenCLExtensions.def"
6760
6761 assert(OpenCLExtensions.size() == I && "Wrong number of OPENCL_EXTENSIONS");
6762 }
Richard Smith3d8e97e2013-10-18 06:54:39 +00006763
6764 UpdateSema();
6765}
6766
6767void ASTReader::UpdateSema() {
6768 assert(SemaObj && "no Sema to update");
6769
6770 // Load the offsets of the declarations that Sema references.
6771 // They will be lazily deserialized when needed.
6772 if (!SemaDeclRefs.empty()) {
6773 assert(SemaDeclRefs.size() % 2 == 0);
6774 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 2) {
6775 if (!SemaObj->StdNamespace)
6776 SemaObj->StdNamespace = SemaDeclRefs[I];
6777 if (!SemaObj->StdBadAlloc)
6778 SemaObj->StdBadAlloc = SemaDeclRefs[I+1];
6779 }
6780 SemaDeclRefs.clear();
6781 }
Dario Domizioli13a0a382014-05-23 12:13:25 +00006782
6783 // Update the state of 'pragma clang optimize'. Use the same API as if we had
6784 // encountered the pragma in the source.
6785 if(OptimizeOffPragmaLocation.isValid())
6786 SemaObj->ActOnPragmaOptimize(/* IsOn = */ false, OptimizeOffPragmaLocation);
Guy Benyei11169dd2012-12-18 14:30:41 +00006787}
6788
6789IdentifierInfo* ASTReader::get(const char *NameStart, const char *NameEnd) {
6790 // Note that we are loading an identifier.
6791 Deserializing AnIdentifier(this);
Douglas Gregore060e572013-01-25 01:03:03 +00006792 StringRef Name(NameStart, NameEnd - NameStart);
6793
6794 // If there is a global index, look there first to determine which modules
6795 // provably do not have any results for this identifier.
Douglas Gregor7211ac12013-01-25 23:32:03 +00006796 GlobalModuleIndex::HitSet Hits;
Craig Toppera13603a2014-05-22 05:54:18 +00006797 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
Douglas Gregore060e572013-01-25 01:03:03 +00006798 if (!loadGlobalIndex()) {
Douglas Gregor7211ac12013-01-25 23:32:03 +00006799 if (GlobalIndex->lookupIdentifier(Name, Hits)) {
6800 HitsPtr = &Hits;
Douglas Gregore060e572013-01-25 01:03:03 +00006801 }
6802 }
Douglas Gregor7211ac12013-01-25 23:32:03 +00006803 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0,
Douglas Gregor00a50f72013-01-25 00:38:33 +00006804 NumIdentifierLookups,
6805 NumIdentifierLookupHits);
Douglas Gregor7211ac12013-01-25 23:32:03 +00006806 ModuleMgr.visit(IdentifierLookupVisitor::visit, &Visitor, HitsPtr);
Guy Benyei11169dd2012-12-18 14:30:41 +00006807 IdentifierInfo *II = Visitor.getIdentifierInfo();
6808 markIdentifierUpToDate(II);
6809 return II;
6810}
6811
6812namespace clang {
6813 /// \brief An identifier-lookup iterator that enumerates all of the
6814 /// identifiers stored within a set of AST files.
6815 class ASTIdentifierIterator : public IdentifierIterator {
6816 /// \brief The AST reader whose identifiers are being enumerated.
6817 const ASTReader &Reader;
6818
6819 /// \brief The current index into the chain of AST files stored in
6820 /// the AST reader.
6821 unsigned Index;
6822
6823 /// \brief The current position within the identifier lookup table
6824 /// of the current AST file.
6825 ASTIdentifierLookupTable::key_iterator Current;
6826
6827 /// \brief The end position within the identifier lookup table of
6828 /// the current AST file.
6829 ASTIdentifierLookupTable::key_iterator End;
6830
6831 public:
6832 explicit ASTIdentifierIterator(const ASTReader &Reader);
6833
Craig Topper3e89dfe2014-03-13 02:13:41 +00006834 StringRef Next() override;
Guy Benyei11169dd2012-12-18 14:30:41 +00006835 };
6836}
6837
6838ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader)
6839 : Reader(Reader), Index(Reader.ModuleMgr.size() - 1) {
6840 ASTIdentifierLookupTable *IdTable
6841 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].IdentifierLookupTable;
6842 Current = IdTable->key_begin();
6843 End = IdTable->key_end();
6844}
6845
6846StringRef ASTIdentifierIterator::Next() {
6847 while (Current == End) {
6848 // If we have exhausted all of our AST files, we're done.
6849 if (Index == 0)
6850 return StringRef();
6851
6852 --Index;
6853 ASTIdentifierLookupTable *IdTable
6854 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].
6855 IdentifierLookupTable;
6856 Current = IdTable->key_begin();
6857 End = IdTable->key_end();
6858 }
6859
6860 // We have any identifiers remaining in the current AST file; return
6861 // the next one.
Douglas Gregorbfd73d72013-01-23 18:53:14 +00006862 StringRef Result = *Current;
Guy Benyei11169dd2012-12-18 14:30:41 +00006863 ++Current;
Douglas Gregorbfd73d72013-01-23 18:53:14 +00006864 return Result;
Guy Benyei11169dd2012-12-18 14:30:41 +00006865}
6866
Argyrios Kyrtzidis9aca3c62013-04-17 22:10:55 +00006867IdentifierIterator *ASTReader::getIdentifiers() {
6868 if (!loadGlobalIndex())
6869 return GlobalIndex->createIdentifierIterator();
6870
Guy Benyei11169dd2012-12-18 14:30:41 +00006871 return new ASTIdentifierIterator(*this);
6872}
6873
6874namespace clang { namespace serialization {
6875 class ReadMethodPoolVisitor {
6876 ASTReader &Reader;
6877 Selector Sel;
6878 unsigned PriorGeneration;
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00006879 unsigned InstanceBits;
6880 unsigned FactoryBits;
Nico Weberff4b35e2014-12-27 22:14:15 +00006881 bool InstanceHasMoreThanOneDecl;
6882 bool FactoryHasMoreThanOneDecl;
Dmitri Gribenkof8579502013-01-12 19:30:44 +00006883 SmallVector<ObjCMethodDecl *, 4> InstanceMethods;
6884 SmallVector<ObjCMethodDecl *, 4> FactoryMethods;
Guy Benyei11169dd2012-12-18 14:30:41 +00006885
6886 public:
Nico Weber2e0c8f72014-12-27 03:58:08 +00006887 ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel,
Guy Benyei11169dd2012-12-18 14:30:41 +00006888 unsigned PriorGeneration)
Nico Weber2e0c8f72014-12-27 03:58:08 +00006889 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration),
Nico Weberff4b35e2014-12-27 22:14:15 +00006890 InstanceBits(0), FactoryBits(0), InstanceHasMoreThanOneDecl(false),
6891 FactoryHasMoreThanOneDecl(false) {}
Nico Weber2e0c8f72014-12-27 03:58:08 +00006892
Guy Benyei11169dd2012-12-18 14:30:41 +00006893 static bool visit(ModuleFile &M, void *UserData) {
6894 ReadMethodPoolVisitor *This
6895 = static_cast<ReadMethodPoolVisitor *>(UserData);
6896
6897 if (!M.SelectorLookupTable)
6898 return false;
6899
6900 // If we've already searched this module file, skip it now.
6901 if (M.Generation <= This->PriorGeneration)
6902 return true;
6903
Douglas Gregorad2f7a52013-01-28 17:54:36 +00006904 ++This->Reader.NumMethodPoolTableLookups;
Guy Benyei11169dd2012-12-18 14:30:41 +00006905 ASTSelectorLookupTable *PoolTable
6906 = (ASTSelectorLookupTable*)M.SelectorLookupTable;
6907 ASTSelectorLookupTable::iterator Pos = PoolTable->find(This->Sel);
6908 if (Pos == PoolTable->end())
6909 return false;
Douglas Gregorad2f7a52013-01-28 17:54:36 +00006910
6911 ++This->Reader.NumMethodPoolTableHits;
Guy Benyei11169dd2012-12-18 14:30:41 +00006912 ++This->Reader.NumSelectorsRead;
6913 // FIXME: Not quite happy with the statistics here. We probably should
6914 // disable this tracking when called via LoadSelector.
6915 // Also, should entries without methods count as misses?
6916 ++This->Reader.NumMethodPoolEntriesRead;
6917 ASTSelectorLookupTrait::data_type Data = *Pos;
6918 if (This->Reader.DeserializationListener)
6919 This->Reader.DeserializationListener->SelectorRead(Data.ID,
6920 This->Sel);
6921
6922 This->InstanceMethods.append(Data.Instance.begin(), Data.Instance.end());
6923 This->FactoryMethods.append(Data.Factory.begin(), Data.Factory.end());
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00006924 This->InstanceBits = Data.InstanceBits;
6925 This->FactoryBits = Data.FactoryBits;
Nico Weberff4b35e2014-12-27 22:14:15 +00006926 This->InstanceHasMoreThanOneDecl = Data.InstanceHasMoreThanOneDecl;
6927 This->FactoryHasMoreThanOneDecl = Data.FactoryHasMoreThanOneDecl;
Guy Benyei11169dd2012-12-18 14:30:41 +00006928 return true;
6929 }
6930
6931 /// \brief Retrieve the instance methods found by this visitor.
6932 ArrayRef<ObjCMethodDecl *> getInstanceMethods() const {
6933 return InstanceMethods;
6934 }
6935
6936 /// \brief Retrieve the instance methods found by this visitor.
6937 ArrayRef<ObjCMethodDecl *> getFactoryMethods() const {
6938 return FactoryMethods;
6939 }
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00006940
6941 unsigned getInstanceBits() const { return InstanceBits; }
6942 unsigned getFactoryBits() const { return FactoryBits; }
Nico Weberff4b35e2014-12-27 22:14:15 +00006943 bool instanceHasMoreThanOneDecl() const {
6944 return InstanceHasMoreThanOneDecl;
6945 }
6946 bool factoryHasMoreThanOneDecl() const { return FactoryHasMoreThanOneDecl; }
Guy Benyei11169dd2012-12-18 14:30:41 +00006947 };
6948} } // end namespace clang::serialization
6949
6950/// \brief Add the given set of methods to the method list.
6951static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods,
6952 ObjCMethodList &List) {
6953 for (unsigned I = 0, N = Methods.size(); I != N; ++I) {
6954 S.addMethodToGlobalList(&List, Methods[I]);
6955 }
6956}
6957
6958void ASTReader::ReadMethodPool(Selector Sel) {
6959 // Get the selector generation and update it to the current generation.
6960 unsigned &Generation = SelectorGeneration[Sel];
6961 unsigned PriorGeneration = Generation;
Richard Smith053f6c62014-05-16 23:01:30 +00006962 Generation = getGeneration();
Guy Benyei11169dd2012-12-18 14:30:41 +00006963
6964 // Search for methods defined with this selector.
Douglas Gregorad2f7a52013-01-28 17:54:36 +00006965 ++NumMethodPoolLookups;
Guy Benyei11169dd2012-12-18 14:30:41 +00006966 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration);
6967 ModuleMgr.visit(&ReadMethodPoolVisitor::visit, &Visitor);
6968
6969 if (Visitor.getInstanceMethods().empty() &&
Douglas Gregorad2f7a52013-01-28 17:54:36 +00006970 Visitor.getFactoryMethods().empty())
Guy Benyei11169dd2012-12-18 14:30:41 +00006971 return;
Douglas Gregorad2f7a52013-01-28 17:54:36 +00006972
6973 ++NumMethodPoolHits;
6974
Guy Benyei11169dd2012-12-18 14:30:41 +00006975 if (!getSema())
6976 return;
6977
6978 Sema &S = *getSema();
6979 Sema::GlobalMethodPool::iterator Pos
6980 = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first;
Ben Langmuira0c32e92015-01-12 19:27:00 +00006981
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00006982 Pos->second.first.setBits(Visitor.getInstanceBits());
Nico Weberff4b35e2014-12-27 22:14:15 +00006983 Pos->second.first.setHasMoreThanOneDecl(Visitor.instanceHasMoreThanOneDecl());
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00006984 Pos->second.second.setBits(Visitor.getFactoryBits());
Nico Weberff4b35e2014-12-27 22:14:15 +00006985 Pos->second.second.setHasMoreThanOneDecl(Visitor.factoryHasMoreThanOneDecl());
Ben Langmuira0c32e92015-01-12 19:27:00 +00006986
6987 // Add methods to the global pool *after* setting hasMoreThanOneDecl, since
6988 // when building a module we keep every method individually and may need to
6989 // update hasMoreThanOneDecl as we add the methods.
6990 addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first);
6991 addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second);
Guy Benyei11169dd2012-12-18 14:30:41 +00006992}
6993
6994void ASTReader::ReadKnownNamespaces(
6995 SmallVectorImpl<NamespaceDecl *> &Namespaces) {
6996 Namespaces.clear();
6997
6998 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
6999 if (NamespaceDecl *Namespace
7000 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I])))
7001 Namespaces.push_back(Namespace);
7002 }
7003}
7004
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00007005void ASTReader::ReadUndefinedButUsed(
Nick Lewyckyf0f56162013-01-31 03:23:57 +00007006 llvm::DenseMap<NamedDecl*, SourceLocation> &Undefined) {
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00007007 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
7008 NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++]));
Nick Lewycky8334af82013-01-26 00:35:08 +00007009 SourceLocation Loc =
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00007010 SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]);
Nick Lewycky8334af82013-01-26 00:35:08 +00007011 Undefined.insert(std::make_pair(D, Loc));
7012 }
7013}
Nick Lewycky8334af82013-01-26 00:35:08 +00007014
Guy Benyei11169dd2012-12-18 14:30:41 +00007015void ASTReader::ReadTentativeDefinitions(
7016 SmallVectorImpl<VarDecl *> &TentativeDefs) {
7017 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
7018 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I]));
7019 if (Var)
7020 TentativeDefs.push_back(Var);
7021 }
7022 TentativeDefinitions.clear();
7023}
7024
7025void ASTReader::ReadUnusedFileScopedDecls(
7026 SmallVectorImpl<const DeclaratorDecl *> &Decls) {
7027 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
7028 DeclaratorDecl *D
7029 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I]));
7030 if (D)
7031 Decls.push_back(D);
7032 }
7033 UnusedFileScopedDecls.clear();
7034}
7035
7036void ASTReader::ReadDelegatingConstructors(
7037 SmallVectorImpl<CXXConstructorDecl *> &Decls) {
7038 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
7039 CXXConstructorDecl *D
7040 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I]));
7041 if (D)
7042 Decls.push_back(D);
7043 }
7044 DelegatingCtorDecls.clear();
7045}
7046
7047void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) {
7048 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
7049 TypedefNameDecl *D
7050 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I]));
7051 if (D)
7052 Decls.push_back(D);
7053 }
7054 ExtVectorDecls.clear();
7055}
7056
Nico Weber72889432014-09-06 01:25:55 +00007057void ASTReader::ReadUnusedLocalTypedefNameCandidates(
7058 llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) {
7059 for (unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N;
7060 ++I) {
7061 TypedefNameDecl *D = dyn_cast_or_null<TypedefNameDecl>(
7062 GetDecl(UnusedLocalTypedefNameCandidates[I]));
7063 if (D)
7064 Decls.insert(D);
7065 }
7066 UnusedLocalTypedefNameCandidates.clear();
7067}
7068
Guy Benyei11169dd2012-12-18 14:30:41 +00007069void ASTReader::ReadReferencedSelectors(
7070 SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) {
7071 if (ReferencedSelectorsData.empty())
7072 return;
7073
7074 // If there are @selector references added them to its pool. This is for
7075 // implementation of -Wselector.
7076 unsigned int DataSize = ReferencedSelectorsData.size()-1;
7077 unsigned I = 0;
7078 while (I < DataSize) {
7079 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]);
7080 SourceLocation SelLoc
7081 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]);
7082 Sels.push_back(std::make_pair(Sel, SelLoc));
7083 }
7084 ReferencedSelectorsData.clear();
7085}
7086
7087void ASTReader::ReadWeakUndeclaredIdentifiers(
7088 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo> > &WeakIDs) {
7089 if (WeakUndeclaredIdentifiers.empty())
7090 return;
7091
7092 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) {
7093 IdentifierInfo *WeakId
7094 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
7095 IdentifierInfo *AliasId
7096 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
7097 SourceLocation Loc
7098 = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]);
7099 bool Used = WeakUndeclaredIdentifiers[I++];
7100 WeakInfo WI(AliasId, Loc);
7101 WI.setUsed(Used);
7102 WeakIDs.push_back(std::make_pair(WeakId, WI));
7103 }
7104 WeakUndeclaredIdentifiers.clear();
7105}
7106
7107void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) {
7108 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) {
7109 ExternalVTableUse VT;
7110 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++]));
7111 VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]);
7112 VT.DefinitionRequired = VTableUses[Idx++];
7113 VTables.push_back(VT);
7114 }
7115
7116 VTableUses.clear();
7117}
7118
7119void ASTReader::ReadPendingInstantiations(
7120 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation> > &Pending) {
7121 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
7122 ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++]));
7123 SourceLocation Loc
7124 = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]);
7125
7126 Pending.push_back(std::make_pair(D, Loc));
7127 }
7128 PendingInstantiations.clear();
7129}
7130
Richard Smithe40f2ba2013-08-07 21:41:30 +00007131void ASTReader::ReadLateParsedTemplates(
Chandler Carruth52cee4d2015-03-26 09:08:15 +00007132 llvm::MapVector<const FunctionDecl *, LateParsedTemplate *> &LPTMap) {
Richard Smithe40f2ba2013-08-07 21:41:30 +00007133 for (unsigned Idx = 0, N = LateParsedTemplates.size(); Idx < N;
7134 /* In loop */) {
7135 FunctionDecl *FD = cast<FunctionDecl>(GetDecl(LateParsedTemplates[Idx++]));
7136
7137 LateParsedTemplate *LT = new LateParsedTemplate;
7138 LT->D = GetDecl(LateParsedTemplates[Idx++]);
7139
7140 ModuleFile *F = getOwningModuleFile(LT->D);
7141 assert(F && "No module");
7142
7143 unsigned TokN = LateParsedTemplates[Idx++];
7144 LT->Toks.reserve(TokN);
7145 for (unsigned T = 0; T < TokN; ++T)
7146 LT->Toks.push_back(ReadToken(*F, LateParsedTemplates, Idx));
7147
Chandler Carruth52cee4d2015-03-26 09:08:15 +00007148 LPTMap.insert(std::make_pair(FD, LT));
Richard Smithe40f2ba2013-08-07 21:41:30 +00007149 }
7150
7151 LateParsedTemplates.clear();
7152}
7153
Guy Benyei11169dd2012-12-18 14:30:41 +00007154void ASTReader::LoadSelector(Selector Sel) {
7155 // It would be complicated to avoid reading the methods anyway. So don't.
7156 ReadMethodPool(Sel);
7157}
7158
7159void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) {
7160 assert(ID && "Non-zero identifier ID required");
7161 assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range");
7162 IdentifiersLoaded[ID - 1] = II;
7163 if (DeserializationListener)
7164 DeserializationListener->IdentifierRead(ID, II);
7165}
7166
7167/// \brief Set the globally-visible declarations associated with the given
7168/// identifier.
7169///
7170/// If the AST reader is currently in a state where the given declaration IDs
7171/// cannot safely be resolved, they are queued until it is safe to resolve
7172/// them.
7173///
7174/// \param II an IdentifierInfo that refers to one or more globally-visible
7175/// declarations.
7176///
7177/// \param DeclIDs the set of declaration IDs with the name @p II that are
7178/// visible at global scope.
7179///
Douglas Gregor6168bd22013-02-18 15:53:43 +00007180/// \param Decls if non-null, this vector will be populated with the set of
7181/// deserialized declarations. These declarations will not be pushed into
7182/// scope.
Guy Benyei11169dd2012-12-18 14:30:41 +00007183void
7184ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II,
7185 const SmallVectorImpl<uint32_t> &DeclIDs,
Douglas Gregor6168bd22013-02-18 15:53:43 +00007186 SmallVectorImpl<Decl *> *Decls) {
7187 if (NumCurrentElementsDeserializing && !Decls) {
7188 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
Guy Benyei11169dd2012-12-18 14:30:41 +00007189 return;
7190 }
7191
7192 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
Ben Langmuir5418f402014-09-10 21:29:41 +00007193 if (!SemaObj) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007194 // Queue this declaration so that it will be added to the
7195 // translation unit scope and identifier's declaration chain
7196 // once a Sema object is known.
Ben Langmuir5418f402014-09-10 21:29:41 +00007197 PreloadedDeclIDs.push_back(DeclIDs[I]);
7198 continue;
Guy Benyei11169dd2012-12-18 14:30:41 +00007199 }
Ben Langmuir5418f402014-09-10 21:29:41 +00007200
7201 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I]));
7202
7203 // If we're simply supposed to record the declarations, do so now.
7204 if (Decls) {
7205 Decls->push_back(D);
7206 continue;
7207 }
7208
7209 // Introduce this declaration into the translation-unit scope
7210 // and add it to the declaration chain for this identifier, so
7211 // that (unqualified) name lookup will find it.
7212 pushExternalDeclIntoScope(D, II);
Guy Benyei11169dd2012-12-18 14:30:41 +00007213 }
7214}
7215
Douglas Gregorc8a992f2013-01-21 16:52:34 +00007216IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007217 if (ID == 0)
Craig Toppera13603a2014-05-22 05:54:18 +00007218 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007219
7220 if (IdentifiersLoaded.empty()) {
7221 Error("no identifier table in AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00007222 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007223 }
7224
7225 ID -= 1;
7226 if (!IdentifiersLoaded[ID]) {
7227 GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1);
7228 assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map");
7229 ModuleFile *M = I->second;
7230 unsigned Index = ID - M->BaseIdentifierID;
7231 const char *Str = M->IdentifierTableData + M->IdentifierOffsets[Index];
7232
7233 // All of the strings in the AST file are preceded by a 16-bit length.
7234 // Extract that 16-bit length to avoid having to execute strlen().
7235 // NOTE: 'StrLenPtr' is an 'unsigned char*' so that we load bytes as
7236 // unsigned integers. This is important to avoid integer overflow when
7237 // we cast them to 'unsigned'.
7238 const unsigned char *StrLenPtr = (const unsigned char*) Str - 2;
7239 unsigned StrLen = (((unsigned) StrLenPtr[0])
7240 | (((unsigned) StrLenPtr[1]) << 8)) - 1;
Douglas Gregorc8a992f2013-01-21 16:52:34 +00007241 IdentifiersLoaded[ID]
7242 = &PP.getIdentifierTable().get(StringRef(Str, StrLen));
Guy Benyei11169dd2012-12-18 14:30:41 +00007243 if (DeserializationListener)
7244 DeserializationListener->IdentifierRead(ID + 1, IdentifiersLoaded[ID]);
7245 }
7246
7247 return IdentifiersLoaded[ID];
7248}
7249
Douglas Gregorc8a992f2013-01-21 16:52:34 +00007250IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) {
7251 return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID));
Guy Benyei11169dd2012-12-18 14:30:41 +00007252}
7253
7254IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) {
7255 if (LocalID < NUM_PREDEF_IDENT_IDS)
7256 return LocalID;
7257
7258 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7259 = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS);
7260 assert(I != M.IdentifierRemap.end()
7261 && "Invalid index into identifier index remap");
7262
7263 return LocalID + I->second;
7264}
7265
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00007266MacroInfo *ASTReader::getMacro(MacroID ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007267 if (ID == 0)
Craig Toppera13603a2014-05-22 05:54:18 +00007268 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007269
7270 if (MacrosLoaded.empty()) {
7271 Error("no macro table in AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00007272 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007273 }
7274
7275 ID -= NUM_PREDEF_MACRO_IDS;
7276 if (!MacrosLoaded[ID]) {
7277 GlobalMacroMapType::iterator I
7278 = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS);
7279 assert(I != GlobalMacroMap.end() && "Corrupted global macro map");
7280 ModuleFile *M = I->second;
7281 unsigned Index = ID - M->BaseMacroID;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00007282 MacrosLoaded[ID] = ReadMacroRecord(*M, M->MacroOffsets[Index]);
7283
7284 if (DeserializationListener)
7285 DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS,
7286 MacrosLoaded[ID]);
Guy Benyei11169dd2012-12-18 14:30:41 +00007287 }
7288
7289 return MacrosLoaded[ID];
7290}
7291
7292MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) {
7293 if (LocalID < NUM_PREDEF_MACRO_IDS)
7294 return LocalID;
7295
7296 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7297 = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS);
7298 assert(I != M.MacroRemap.end() && "Invalid index into macro index remap");
7299
7300 return LocalID + I->second;
7301}
7302
7303serialization::SubmoduleID
7304ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) {
7305 if (LocalID < NUM_PREDEF_SUBMODULE_IDS)
7306 return LocalID;
7307
7308 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7309 = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS);
7310 assert(I != M.SubmoduleRemap.end()
7311 && "Invalid index into submodule index remap");
7312
7313 return LocalID + I->second;
7314}
7315
7316Module *ASTReader::getSubmodule(SubmoduleID GlobalID) {
7317 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) {
7318 assert(GlobalID == 0 && "Unhandled global submodule ID");
Craig Toppera13603a2014-05-22 05:54:18 +00007319 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007320 }
7321
7322 if (GlobalID > SubmodulesLoaded.size()) {
7323 Error("submodule ID out of range in AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00007324 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007325 }
7326
7327 return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS];
7328}
Douglas Gregorc147b0b2013-01-12 01:29:50 +00007329
7330Module *ASTReader::getModule(unsigned ID) {
7331 return getSubmodule(ID);
7332}
7333
Guy Benyei11169dd2012-12-18 14:30:41 +00007334Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) {
7335 return DecodeSelector(getGlobalSelectorID(M, LocalID));
7336}
7337
7338Selector ASTReader::DecodeSelector(serialization::SelectorID ID) {
7339 if (ID == 0)
7340 return Selector();
7341
7342 if (ID > SelectorsLoaded.size()) {
7343 Error("selector ID out of range in AST file");
7344 return Selector();
7345 }
7346
Craig Toppera13603a2014-05-22 05:54:18 +00007347 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007348 // Load this selector from the selector table.
7349 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID);
7350 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map");
7351 ModuleFile &M = *I->second;
7352 ASTSelectorLookupTrait Trait(*this, M);
7353 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS;
7354 SelectorsLoaded[ID - 1] =
7355 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0);
7356 if (DeserializationListener)
7357 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
7358 }
7359
7360 return SelectorsLoaded[ID - 1];
7361}
7362
7363Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) {
7364 return DecodeSelector(ID);
7365}
7366
7367uint32_t ASTReader::GetNumExternalSelectors() {
7368 // ID 0 (the null selector) is considered an external selector.
7369 return getTotalNumSelectors() + 1;
7370}
7371
7372serialization::SelectorID
7373ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const {
7374 if (LocalID < NUM_PREDEF_SELECTOR_IDS)
7375 return LocalID;
7376
7377 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7378 = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS);
7379 assert(I != M.SelectorRemap.end()
7380 && "Invalid index into selector index remap");
7381
7382 return LocalID + I->second;
7383}
7384
7385DeclarationName
7386ASTReader::ReadDeclarationName(ModuleFile &F,
7387 const RecordData &Record, unsigned &Idx) {
7388 DeclarationName::NameKind Kind = (DeclarationName::NameKind)Record[Idx++];
7389 switch (Kind) {
7390 case DeclarationName::Identifier:
Douglas Gregorc8a992f2013-01-21 16:52:34 +00007391 return DeclarationName(GetIdentifierInfo(F, Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00007392
7393 case DeclarationName::ObjCZeroArgSelector:
7394 case DeclarationName::ObjCOneArgSelector:
7395 case DeclarationName::ObjCMultiArgSelector:
7396 return DeclarationName(ReadSelector(F, Record, Idx));
7397
7398 case DeclarationName::CXXConstructorName:
7399 return Context.DeclarationNames.getCXXConstructorName(
7400 Context.getCanonicalType(readType(F, Record, Idx)));
7401
7402 case DeclarationName::CXXDestructorName:
7403 return Context.DeclarationNames.getCXXDestructorName(
7404 Context.getCanonicalType(readType(F, Record, Idx)));
7405
7406 case DeclarationName::CXXConversionFunctionName:
7407 return Context.DeclarationNames.getCXXConversionFunctionName(
7408 Context.getCanonicalType(readType(F, Record, Idx)));
7409
7410 case DeclarationName::CXXOperatorName:
7411 return Context.DeclarationNames.getCXXOperatorName(
7412 (OverloadedOperatorKind)Record[Idx++]);
7413
7414 case DeclarationName::CXXLiteralOperatorName:
7415 return Context.DeclarationNames.getCXXLiteralOperatorName(
7416 GetIdentifierInfo(F, Record, Idx));
7417
7418 case DeclarationName::CXXUsingDirective:
7419 return DeclarationName::getUsingDirectiveName();
7420 }
7421
7422 llvm_unreachable("Invalid NameKind!");
7423}
7424
7425void ASTReader::ReadDeclarationNameLoc(ModuleFile &F,
7426 DeclarationNameLoc &DNLoc,
7427 DeclarationName Name,
7428 const RecordData &Record, unsigned &Idx) {
7429 switch (Name.getNameKind()) {
7430 case DeclarationName::CXXConstructorName:
7431 case DeclarationName::CXXDestructorName:
7432 case DeclarationName::CXXConversionFunctionName:
7433 DNLoc.NamedType.TInfo = GetTypeSourceInfo(F, Record, Idx);
7434 break;
7435
7436 case DeclarationName::CXXOperatorName:
7437 DNLoc.CXXOperatorName.BeginOpNameLoc
7438 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7439 DNLoc.CXXOperatorName.EndOpNameLoc
7440 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7441 break;
7442
7443 case DeclarationName::CXXLiteralOperatorName:
7444 DNLoc.CXXLiteralOperatorName.OpNameLoc
7445 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7446 break;
7447
7448 case DeclarationName::Identifier:
7449 case DeclarationName::ObjCZeroArgSelector:
7450 case DeclarationName::ObjCOneArgSelector:
7451 case DeclarationName::ObjCMultiArgSelector:
7452 case DeclarationName::CXXUsingDirective:
7453 break;
7454 }
7455}
7456
7457void ASTReader::ReadDeclarationNameInfo(ModuleFile &F,
7458 DeclarationNameInfo &NameInfo,
7459 const RecordData &Record, unsigned &Idx) {
7460 NameInfo.setName(ReadDeclarationName(F, Record, Idx));
7461 NameInfo.setLoc(ReadSourceLocation(F, Record, Idx));
7462 DeclarationNameLoc DNLoc;
7463 ReadDeclarationNameLoc(F, DNLoc, NameInfo.getName(), Record, Idx);
7464 NameInfo.setInfo(DNLoc);
7465}
7466
7467void ASTReader::ReadQualifierInfo(ModuleFile &F, QualifierInfo &Info,
7468 const RecordData &Record, unsigned &Idx) {
7469 Info.QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx);
7470 unsigned NumTPLists = Record[Idx++];
7471 Info.NumTemplParamLists = NumTPLists;
7472 if (NumTPLists) {
7473 Info.TemplParamLists = new (Context) TemplateParameterList*[NumTPLists];
7474 for (unsigned i=0; i != NumTPLists; ++i)
7475 Info.TemplParamLists[i] = ReadTemplateParameterList(F, Record, Idx);
7476 }
7477}
7478
7479TemplateName
7480ASTReader::ReadTemplateName(ModuleFile &F, const RecordData &Record,
7481 unsigned &Idx) {
7482 TemplateName::NameKind Kind = (TemplateName::NameKind)Record[Idx++];
7483 switch (Kind) {
7484 case TemplateName::Template:
7485 return TemplateName(ReadDeclAs<TemplateDecl>(F, Record, Idx));
7486
7487 case TemplateName::OverloadedTemplate: {
7488 unsigned size = Record[Idx++];
7489 UnresolvedSet<8> Decls;
7490 while (size--)
7491 Decls.addDecl(ReadDeclAs<NamedDecl>(F, Record, Idx));
7492
7493 return Context.getOverloadedTemplateName(Decls.begin(), Decls.end());
7494 }
7495
7496 case TemplateName::QualifiedTemplate: {
7497 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
7498 bool hasTemplKeyword = Record[Idx++];
7499 TemplateDecl *Template = ReadDeclAs<TemplateDecl>(F, Record, Idx);
7500 return Context.getQualifiedTemplateName(NNS, hasTemplKeyword, Template);
7501 }
7502
7503 case TemplateName::DependentTemplate: {
7504 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
7505 if (Record[Idx++]) // isIdentifier
7506 return Context.getDependentTemplateName(NNS,
7507 GetIdentifierInfo(F, Record,
7508 Idx));
7509 return Context.getDependentTemplateName(NNS,
7510 (OverloadedOperatorKind)Record[Idx++]);
7511 }
7512
7513 case TemplateName::SubstTemplateTemplateParm: {
7514 TemplateTemplateParmDecl *param
7515 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
7516 if (!param) return TemplateName();
7517 TemplateName replacement = ReadTemplateName(F, Record, Idx);
7518 return Context.getSubstTemplateTemplateParm(param, replacement);
7519 }
7520
7521 case TemplateName::SubstTemplateTemplateParmPack: {
7522 TemplateTemplateParmDecl *Param
7523 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
7524 if (!Param)
7525 return TemplateName();
7526
7527 TemplateArgument ArgPack = ReadTemplateArgument(F, Record, Idx);
7528 if (ArgPack.getKind() != TemplateArgument::Pack)
7529 return TemplateName();
7530
7531 return Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
7532 }
7533 }
7534
7535 llvm_unreachable("Unhandled template name kind!");
7536}
7537
7538TemplateArgument
7539ASTReader::ReadTemplateArgument(ModuleFile &F,
7540 const RecordData &Record, unsigned &Idx) {
7541 TemplateArgument::ArgKind Kind = (TemplateArgument::ArgKind)Record[Idx++];
7542 switch (Kind) {
7543 case TemplateArgument::Null:
7544 return TemplateArgument();
7545 case TemplateArgument::Type:
7546 return TemplateArgument(readType(F, Record, Idx));
7547 case TemplateArgument::Declaration: {
7548 ValueDecl *D = ReadDeclAs<ValueDecl>(F, Record, Idx);
David Blaikie0f62c8d2014-10-16 04:21:25 +00007549 return TemplateArgument(D, readType(F, Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00007550 }
7551 case TemplateArgument::NullPtr:
7552 return TemplateArgument(readType(F, Record, Idx), /*isNullPtr*/true);
7553 case TemplateArgument::Integral: {
7554 llvm::APSInt Value = ReadAPSInt(Record, Idx);
7555 QualType T = readType(F, Record, Idx);
7556 return TemplateArgument(Context, Value, T);
7557 }
7558 case TemplateArgument::Template:
7559 return TemplateArgument(ReadTemplateName(F, Record, Idx));
7560 case TemplateArgument::TemplateExpansion: {
7561 TemplateName Name = ReadTemplateName(F, Record, Idx);
David Blaikie05785d12013-02-20 22:23:23 +00007562 Optional<unsigned> NumTemplateExpansions;
Guy Benyei11169dd2012-12-18 14:30:41 +00007563 if (unsigned NumExpansions = Record[Idx++])
7564 NumTemplateExpansions = NumExpansions - 1;
7565 return TemplateArgument(Name, NumTemplateExpansions);
7566 }
7567 case TemplateArgument::Expression:
7568 return TemplateArgument(ReadExpr(F));
7569 case TemplateArgument::Pack: {
7570 unsigned NumArgs = Record[Idx++];
7571 TemplateArgument *Args = new (Context) TemplateArgument[NumArgs];
7572 for (unsigned I = 0; I != NumArgs; ++I)
7573 Args[I] = ReadTemplateArgument(F, Record, Idx);
7574 return TemplateArgument(Args, NumArgs);
7575 }
7576 }
7577
7578 llvm_unreachable("Unhandled template argument kind!");
7579}
7580
7581TemplateParameterList *
7582ASTReader::ReadTemplateParameterList(ModuleFile &F,
7583 const RecordData &Record, unsigned &Idx) {
7584 SourceLocation TemplateLoc = ReadSourceLocation(F, Record, Idx);
7585 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Idx);
7586 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Idx);
7587
7588 unsigned NumParams = Record[Idx++];
7589 SmallVector<NamedDecl *, 16> Params;
7590 Params.reserve(NumParams);
7591 while (NumParams--)
7592 Params.push_back(ReadDeclAs<NamedDecl>(F, Record, Idx));
7593
7594 TemplateParameterList* TemplateParams =
7595 TemplateParameterList::Create(Context, TemplateLoc, LAngleLoc,
7596 Params.data(), Params.size(), RAngleLoc);
7597 return TemplateParams;
7598}
7599
7600void
7601ASTReader::
Craig Topper5603df42013-07-05 19:34:19 +00007602ReadTemplateArgumentList(SmallVectorImpl<TemplateArgument> &TemplArgs,
Guy Benyei11169dd2012-12-18 14:30:41 +00007603 ModuleFile &F, const RecordData &Record,
7604 unsigned &Idx) {
7605 unsigned NumTemplateArgs = Record[Idx++];
7606 TemplArgs.reserve(NumTemplateArgs);
7607 while (NumTemplateArgs--)
7608 TemplArgs.push_back(ReadTemplateArgument(F, Record, Idx));
7609}
7610
7611/// \brief Read a UnresolvedSet structure.
Richard Smitha4ba74c2013-08-30 04:46:40 +00007612void ASTReader::ReadUnresolvedSet(ModuleFile &F, LazyASTUnresolvedSet &Set,
Guy Benyei11169dd2012-12-18 14:30:41 +00007613 const RecordData &Record, unsigned &Idx) {
7614 unsigned NumDecls = Record[Idx++];
7615 Set.reserve(Context, NumDecls);
7616 while (NumDecls--) {
Richard Smitha4ba74c2013-08-30 04:46:40 +00007617 DeclID ID = ReadDeclID(F, Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00007618 AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
Richard Smitha4ba74c2013-08-30 04:46:40 +00007619 Set.addLazyDecl(Context, ID, AS);
Guy Benyei11169dd2012-12-18 14:30:41 +00007620 }
7621}
7622
7623CXXBaseSpecifier
7624ASTReader::ReadCXXBaseSpecifier(ModuleFile &F,
7625 const RecordData &Record, unsigned &Idx) {
7626 bool isVirtual = static_cast<bool>(Record[Idx++]);
7627 bool isBaseOfClass = static_cast<bool>(Record[Idx++]);
7628 AccessSpecifier AS = static_cast<AccessSpecifier>(Record[Idx++]);
7629 bool inheritConstructors = static_cast<bool>(Record[Idx++]);
7630 TypeSourceInfo *TInfo = GetTypeSourceInfo(F, Record, Idx);
7631 SourceRange Range = ReadSourceRange(F, Record, Idx);
7632 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Idx);
7633 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo,
7634 EllipsisLoc);
7635 Result.setInheritConstructors(inheritConstructors);
7636 return Result;
7637}
7638
Richard Smithc2bb8182015-03-24 06:36:48 +00007639CXXCtorInitializer **
Guy Benyei11169dd2012-12-18 14:30:41 +00007640ASTReader::ReadCXXCtorInitializers(ModuleFile &F, const RecordData &Record,
7641 unsigned &Idx) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007642 unsigned NumInitializers = Record[Idx++];
Richard Smithc2bb8182015-03-24 06:36:48 +00007643 assert(NumInitializers && "wrote ctor initializers but have no inits");
7644 auto **CtorInitializers = new (Context) CXXCtorInitializer*[NumInitializers];
7645 for (unsigned i = 0; i != NumInitializers; ++i) {
7646 TypeSourceInfo *TInfo = nullptr;
7647 bool IsBaseVirtual = false;
7648 FieldDecl *Member = nullptr;
7649 IndirectFieldDecl *IndirectMember = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007650
Richard Smithc2bb8182015-03-24 06:36:48 +00007651 CtorInitializerType Type = (CtorInitializerType)Record[Idx++];
7652 switch (Type) {
7653 case CTOR_INITIALIZER_BASE:
7654 TInfo = GetTypeSourceInfo(F, Record, Idx);
7655 IsBaseVirtual = Record[Idx++];
7656 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00007657
Richard Smithc2bb8182015-03-24 06:36:48 +00007658 case CTOR_INITIALIZER_DELEGATING:
7659 TInfo = GetTypeSourceInfo(F, Record, Idx);
7660 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00007661
Richard Smithc2bb8182015-03-24 06:36:48 +00007662 case CTOR_INITIALIZER_MEMBER:
7663 Member = ReadDeclAs<FieldDecl>(F, Record, Idx);
7664 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00007665
Richard Smithc2bb8182015-03-24 06:36:48 +00007666 case CTOR_INITIALIZER_INDIRECT_MEMBER:
7667 IndirectMember = ReadDeclAs<IndirectFieldDecl>(F, Record, Idx);
7668 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00007669 }
Richard Smithc2bb8182015-03-24 06:36:48 +00007670
7671 SourceLocation MemberOrEllipsisLoc = ReadSourceLocation(F, Record, Idx);
7672 Expr *Init = ReadExpr(F);
7673 SourceLocation LParenLoc = ReadSourceLocation(F, Record, Idx);
7674 SourceLocation RParenLoc = ReadSourceLocation(F, Record, Idx);
7675 bool IsWritten = Record[Idx++];
7676 unsigned SourceOrderOrNumArrayIndices;
7677 SmallVector<VarDecl *, 8> Indices;
7678 if (IsWritten) {
7679 SourceOrderOrNumArrayIndices = Record[Idx++];
7680 } else {
7681 SourceOrderOrNumArrayIndices = Record[Idx++];
7682 Indices.reserve(SourceOrderOrNumArrayIndices);
7683 for (unsigned i=0; i != SourceOrderOrNumArrayIndices; ++i)
7684 Indices.push_back(ReadDeclAs<VarDecl>(F, Record, Idx));
7685 }
7686
7687 CXXCtorInitializer *BOMInit;
7688 if (Type == CTOR_INITIALIZER_BASE) {
7689 BOMInit = new (Context)
7690 CXXCtorInitializer(Context, TInfo, IsBaseVirtual, LParenLoc, Init,
7691 RParenLoc, MemberOrEllipsisLoc);
7692 } else if (Type == CTOR_INITIALIZER_DELEGATING) {
7693 BOMInit = new (Context)
7694 CXXCtorInitializer(Context, TInfo, LParenLoc, Init, RParenLoc);
7695 } else if (IsWritten) {
7696 if (Member)
7697 BOMInit = new (Context) CXXCtorInitializer(
7698 Context, Member, MemberOrEllipsisLoc, LParenLoc, Init, RParenLoc);
7699 else
7700 BOMInit = new (Context)
7701 CXXCtorInitializer(Context, IndirectMember, MemberOrEllipsisLoc,
7702 LParenLoc, Init, RParenLoc);
7703 } else {
7704 if (IndirectMember) {
7705 assert(Indices.empty() && "Indirect field improperly initialized");
7706 BOMInit = new (Context)
7707 CXXCtorInitializer(Context, IndirectMember, MemberOrEllipsisLoc,
7708 LParenLoc, Init, RParenLoc);
7709 } else {
7710 BOMInit = CXXCtorInitializer::Create(
7711 Context, Member, MemberOrEllipsisLoc, LParenLoc, Init, RParenLoc,
7712 Indices.data(), Indices.size());
7713 }
7714 }
7715
7716 if (IsWritten)
7717 BOMInit->setSourceOrder(SourceOrderOrNumArrayIndices);
7718 CtorInitializers[i] = BOMInit;
Guy Benyei11169dd2012-12-18 14:30:41 +00007719 }
7720
Richard Smithc2bb8182015-03-24 06:36:48 +00007721 return CtorInitializers;
Guy Benyei11169dd2012-12-18 14:30:41 +00007722}
7723
7724NestedNameSpecifier *
7725ASTReader::ReadNestedNameSpecifier(ModuleFile &F,
7726 const RecordData &Record, unsigned &Idx) {
7727 unsigned N = Record[Idx++];
Craig Toppera13603a2014-05-22 05:54:18 +00007728 NestedNameSpecifier *NNS = nullptr, *Prev = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007729 for (unsigned I = 0; I != N; ++I) {
7730 NestedNameSpecifier::SpecifierKind Kind
7731 = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
7732 switch (Kind) {
7733 case NestedNameSpecifier::Identifier: {
7734 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
7735 NNS = NestedNameSpecifier::Create(Context, Prev, II);
7736 break;
7737 }
7738
7739 case NestedNameSpecifier::Namespace: {
7740 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
7741 NNS = NestedNameSpecifier::Create(Context, Prev, NS);
7742 break;
7743 }
7744
7745 case NestedNameSpecifier::NamespaceAlias: {
7746 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
7747 NNS = NestedNameSpecifier::Create(Context, Prev, Alias);
7748 break;
7749 }
7750
7751 case NestedNameSpecifier::TypeSpec:
7752 case NestedNameSpecifier::TypeSpecWithTemplate: {
7753 const Type *T = readType(F, Record, Idx).getTypePtrOrNull();
7754 if (!T)
Craig Toppera13603a2014-05-22 05:54:18 +00007755 return nullptr;
7756
Guy Benyei11169dd2012-12-18 14:30:41 +00007757 bool Template = Record[Idx++];
7758 NNS = NestedNameSpecifier::Create(Context, Prev, Template, T);
7759 break;
7760 }
7761
7762 case NestedNameSpecifier::Global: {
7763 NNS = NestedNameSpecifier::GlobalSpecifier(Context);
7764 // No associated value, and there can't be a prefix.
7765 break;
7766 }
Nikola Smiljanic67860242014-09-26 00:28:20 +00007767
7768 case NestedNameSpecifier::Super: {
7769 CXXRecordDecl *RD = ReadDeclAs<CXXRecordDecl>(F, Record, Idx);
7770 NNS = NestedNameSpecifier::SuperSpecifier(Context, RD);
7771 break;
7772 }
Guy Benyei11169dd2012-12-18 14:30:41 +00007773 }
7774 Prev = NNS;
7775 }
7776 return NNS;
7777}
7778
7779NestedNameSpecifierLoc
7780ASTReader::ReadNestedNameSpecifierLoc(ModuleFile &F, const RecordData &Record,
7781 unsigned &Idx) {
7782 unsigned N = Record[Idx++];
7783 NestedNameSpecifierLocBuilder Builder;
7784 for (unsigned I = 0; I != N; ++I) {
7785 NestedNameSpecifier::SpecifierKind Kind
7786 = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
7787 switch (Kind) {
7788 case NestedNameSpecifier::Identifier: {
7789 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
7790 SourceRange Range = ReadSourceRange(F, Record, Idx);
7791 Builder.Extend(Context, II, Range.getBegin(), Range.getEnd());
7792 break;
7793 }
7794
7795 case NestedNameSpecifier::Namespace: {
7796 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
7797 SourceRange Range = ReadSourceRange(F, Record, Idx);
7798 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
7799 break;
7800 }
7801
7802 case NestedNameSpecifier::NamespaceAlias: {
7803 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
7804 SourceRange Range = ReadSourceRange(F, Record, Idx);
7805 Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd());
7806 break;
7807 }
7808
7809 case NestedNameSpecifier::TypeSpec:
7810 case NestedNameSpecifier::TypeSpecWithTemplate: {
7811 bool Template = Record[Idx++];
7812 TypeSourceInfo *T = GetTypeSourceInfo(F, Record, Idx);
7813 if (!T)
7814 return NestedNameSpecifierLoc();
7815 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
7816
7817 // FIXME: 'template' keyword location not saved anywhere, so we fake it.
7818 Builder.Extend(Context,
7819 Template? T->getTypeLoc().getBeginLoc() : SourceLocation(),
7820 T->getTypeLoc(), ColonColonLoc);
7821 break;
7822 }
7823
7824 case NestedNameSpecifier::Global: {
7825 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
7826 Builder.MakeGlobal(Context, ColonColonLoc);
7827 break;
7828 }
Nikola Smiljanic67860242014-09-26 00:28:20 +00007829
7830 case NestedNameSpecifier::Super: {
7831 CXXRecordDecl *RD = ReadDeclAs<CXXRecordDecl>(F, Record, Idx);
7832 SourceRange Range = ReadSourceRange(F, Record, Idx);
7833 Builder.MakeSuper(Context, RD, Range.getBegin(), Range.getEnd());
7834 break;
7835 }
Guy Benyei11169dd2012-12-18 14:30:41 +00007836 }
7837 }
Nikola Smiljanic67860242014-09-26 00:28:20 +00007838
Guy Benyei11169dd2012-12-18 14:30:41 +00007839 return Builder.getWithLocInContext(Context);
7840}
7841
7842SourceRange
7843ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record,
7844 unsigned &Idx) {
7845 SourceLocation beg = ReadSourceLocation(F, Record, Idx);
7846 SourceLocation end = ReadSourceLocation(F, Record, Idx);
7847 return SourceRange(beg, end);
7848}
7849
7850/// \brief Read an integral value
7851llvm::APInt ASTReader::ReadAPInt(const RecordData &Record, unsigned &Idx) {
7852 unsigned BitWidth = Record[Idx++];
7853 unsigned NumWords = llvm::APInt::getNumWords(BitWidth);
7854 llvm::APInt Result(BitWidth, NumWords, &Record[Idx]);
7855 Idx += NumWords;
7856 return Result;
7857}
7858
7859/// \brief Read a signed integral value
7860llvm::APSInt ASTReader::ReadAPSInt(const RecordData &Record, unsigned &Idx) {
7861 bool isUnsigned = Record[Idx++];
7862 return llvm::APSInt(ReadAPInt(Record, Idx), isUnsigned);
7863}
7864
7865/// \brief Read a floating-point value
Tim Northover178723a2013-01-22 09:46:51 +00007866llvm::APFloat ASTReader::ReadAPFloat(const RecordData &Record,
7867 const llvm::fltSemantics &Sem,
7868 unsigned &Idx) {
7869 return llvm::APFloat(Sem, ReadAPInt(Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00007870}
7871
7872// \brief Read a string
7873std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) {
7874 unsigned Len = Record[Idx++];
7875 std::string Result(Record.data() + Idx, Record.data() + Idx + Len);
7876 Idx += Len;
7877 return Result;
7878}
7879
Richard Smith7ed1bc92014-12-05 22:42:13 +00007880std::string ASTReader::ReadPath(ModuleFile &F, const RecordData &Record,
7881 unsigned &Idx) {
7882 std::string Filename = ReadString(Record, Idx);
7883 ResolveImportedPath(F, Filename);
7884 return Filename;
7885}
7886
Guy Benyei11169dd2012-12-18 14:30:41 +00007887VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record,
7888 unsigned &Idx) {
7889 unsigned Major = Record[Idx++];
7890 unsigned Minor = Record[Idx++];
7891 unsigned Subminor = Record[Idx++];
7892 if (Minor == 0)
7893 return VersionTuple(Major);
7894 if (Subminor == 0)
7895 return VersionTuple(Major, Minor - 1);
7896 return VersionTuple(Major, Minor - 1, Subminor - 1);
7897}
7898
7899CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F,
7900 const RecordData &Record,
7901 unsigned &Idx) {
7902 CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx);
7903 return CXXTemporary::Create(Context, Decl);
7904}
7905
7906DiagnosticBuilder ASTReader::Diag(unsigned DiagID) {
Argyrios Kyrtzidisdc9fdaf2013-05-24 05:44:08 +00007907 return Diag(CurrentImportLoc, DiagID);
Guy Benyei11169dd2012-12-18 14:30:41 +00007908}
7909
7910DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) {
7911 return Diags.Report(Loc, DiagID);
7912}
7913
7914/// \brief Retrieve the identifier table associated with the
7915/// preprocessor.
7916IdentifierTable &ASTReader::getIdentifierTable() {
7917 return PP.getIdentifierTable();
7918}
7919
7920/// \brief Record that the given ID maps to the given switch-case
7921/// statement.
7922void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) {
Craig Toppera13603a2014-05-22 05:54:18 +00007923 assert((*CurrSwitchCaseStmts)[ID] == nullptr &&
Guy Benyei11169dd2012-12-18 14:30:41 +00007924 "Already have a SwitchCase with this ID");
7925 (*CurrSwitchCaseStmts)[ID] = SC;
7926}
7927
7928/// \brief Retrieve the switch-case statement with the given ID.
7929SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) {
Craig Toppera13603a2014-05-22 05:54:18 +00007930 assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID");
Guy Benyei11169dd2012-12-18 14:30:41 +00007931 return (*CurrSwitchCaseStmts)[ID];
7932}
7933
7934void ASTReader::ClearSwitchCaseIDs() {
7935 CurrSwitchCaseStmts->clear();
7936}
7937
7938void ASTReader::ReadComments() {
7939 std::vector<RawComment *> Comments;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00007940 for (SmallVectorImpl<std::pair<BitstreamCursor,
Guy Benyei11169dd2012-12-18 14:30:41 +00007941 serialization::ModuleFile *> >::iterator
7942 I = CommentsCursors.begin(),
7943 E = CommentsCursors.end();
7944 I != E; ++I) {
Dmitri Gribenko9ee0e302014-03-27 15:40:39 +00007945 Comments.clear();
Chris Lattner7fb3bef2013-01-20 00:56:42 +00007946 BitstreamCursor &Cursor = I->first;
Guy Benyei11169dd2012-12-18 14:30:41 +00007947 serialization::ModuleFile &F = *I->second;
7948 SavedStreamPosition SavedPosition(Cursor);
7949
7950 RecordData Record;
7951 while (true) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00007952 llvm::BitstreamEntry Entry =
7953 Cursor.advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd);
Dmitri Gribenko9ee0e302014-03-27 15:40:39 +00007954
Chris Lattner7fb3bef2013-01-20 00:56:42 +00007955 switch (Entry.Kind) {
7956 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
7957 case llvm::BitstreamEntry::Error:
7958 Error("malformed block record in AST file");
7959 return;
7960 case llvm::BitstreamEntry::EndBlock:
7961 goto NextCursor;
7962 case llvm::BitstreamEntry::Record:
7963 // The interesting case.
Guy Benyei11169dd2012-12-18 14:30:41 +00007964 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00007965 }
7966
7967 // Read a record.
7968 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00007969 switch ((CommentRecordTypes)Cursor.readRecord(Entry.ID, Record)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007970 case COMMENTS_RAW_COMMENT: {
7971 unsigned Idx = 0;
7972 SourceRange SR = ReadSourceRange(F, Record, Idx);
7973 RawComment::CommentKind Kind =
7974 (RawComment::CommentKind) Record[Idx++];
7975 bool IsTrailingComment = Record[Idx++];
7976 bool IsAlmostTrailingComment = Record[Idx++];
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00007977 Comments.push_back(new (Context) RawComment(
7978 SR, Kind, IsTrailingComment, IsAlmostTrailingComment,
7979 Context.getLangOpts().CommentOpts.ParseAllComments));
Guy Benyei11169dd2012-12-18 14:30:41 +00007980 break;
7981 }
7982 }
7983 }
Dmitri Gribenko9ee0e302014-03-27 15:40:39 +00007984 NextCursor:
7985 Context.Comments.addDeserializedComments(Comments);
Guy Benyei11169dd2012-12-18 14:30:41 +00007986 }
Guy Benyei11169dd2012-12-18 14:30:41 +00007987}
7988
Argyrios Kyrtzidis1bde1172014-11-18 05:24:18 +00007989void ASTReader::getInputFiles(ModuleFile &F,
7990 SmallVectorImpl<serialization::InputFile> &Files) {
7991 for (unsigned I = 0, E = F.InputFilesLoaded.size(); I != E; ++I) {
7992 unsigned ID = I+1;
7993 Files.push_back(getInputFile(F, ID));
7994 }
7995}
7996
Richard Smithcd45dbc2014-04-19 03:48:30 +00007997std::string ASTReader::getOwningModuleNameForDiagnostic(const Decl *D) {
7998 // If we know the owning module, use it.
7999 if (Module *M = D->getOwningModule())
8000 return M->getFullModuleName();
8001
8002 // Otherwise, use the name of the top-level module the decl is within.
8003 if (ModuleFile *M = getOwningModuleFile(D))
8004 return M->ModuleName;
8005
8006 // Not from a module.
8007 return "";
8008}
8009
Guy Benyei11169dd2012-12-18 14:30:41 +00008010void ASTReader::finishPendingActions() {
Richard Smith851072e2014-05-19 20:59:20 +00008011 while (!PendingIdentifierInfos.empty() ||
8012 !PendingIncompleteDeclChains.empty() || !PendingDeclChains.empty() ||
Richard Smith2b9e3e32013-10-18 06:05:18 +00008013 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() ||
Richard Smitha0ce9c42014-07-29 23:23:27 +00008014 !PendingUpdateRecords.empty()) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008015 // If any identifiers with corresponding top-level declarations have
8016 // been loaded, load those declarations now.
Craig Topper79be4cd2013-07-05 04:33:53 +00008017 typedef llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2> >
8018 TopLevelDeclsMap;
8019 TopLevelDeclsMap TopLevelDecls;
8020
Guy Benyei11169dd2012-12-18 14:30:41 +00008021 while (!PendingIdentifierInfos.empty()) {
Douglas Gregor6168bd22013-02-18 15:53:43 +00008022 IdentifierInfo *II = PendingIdentifierInfos.back().first;
Richard Smithf0ae3c2d2014-03-28 17:31:23 +00008023 SmallVector<uint32_t, 4> DeclIDs =
8024 std::move(PendingIdentifierInfos.back().second);
Douglas Gregorcb15f082013-02-19 18:26:28 +00008025 PendingIdentifierInfos.pop_back();
Douglas Gregor6168bd22013-02-18 15:53:43 +00008026
8027 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]);
Guy Benyei11169dd2012-12-18 14:30:41 +00008028 }
Richard Smithf0ae3c2d2014-03-28 17:31:23 +00008029
Richard Smith851072e2014-05-19 20:59:20 +00008030 // For each decl chain that we wanted to complete while deserializing, mark
8031 // it as "still needs to be completed".
8032 for (unsigned I = 0; I != PendingIncompleteDeclChains.size(); ++I) {
8033 markIncompleteDeclChain(PendingIncompleteDeclChains[I]);
8034 }
8035 PendingIncompleteDeclChains.clear();
8036
Guy Benyei11169dd2012-12-18 14:30:41 +00008037 // Load pending declaration chains.
Richard Smithfe620d22015-03-05 23:24:12 +00008038 for (unsigned I = 0; I != PendingDeclChains.size(); ++I) {
Richard Smithfe620d22015-03-05 23:24:12 +00008039 PendingDeclChainsKnown.erase(PendingDeclChains[I]);
Richard Smithe687bf82015-03-16 20:54:07 +00008040 loadPendingDeclChain(PendingDeclChains[I]);
Richard Smithfe620d22015-03-05 23:24:12 +00008041 }
8042 assert(PendingDeclChainsKnown.empty());
Guy Benyei11169dd2012-12-18 14:30:41 +00008043 PendingDeclChains.clear();
8044
Douglas Gregor6168bd22013-02-18 15:53:43 +00008045 // Make the most recent of the top-level declarations visible.
Craig Topper79be4cd2013-07-05 04:33:53 +00008046 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
8047 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
Douglas Gregor6168bd22013-02-18 15:53:43 +00008048 IdentifierInfo *II = TLD->first;
8049 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
Argyrios Kyrtzidise5edbf92013-04-26 21:33:35 +00008050 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II);
Douglas Gregor6168bd22013-02-18 15:53:43 +00008051 }
8052 }
8053
Guy Benyei11169dd2012-12-18 14:30:41 +00008054 // Load any pending macro definitions.
8055 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008056 IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
8057 SmallVector<PendingMacroInfo, 2> GlobalIDs;
8058 GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
8059 // Initialize the macro history from chained-PCHs ahead of module imports.
Richard Smith49f906a2014-03-01 00:08:04 +00008060 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
Argyrios Kyrtzidis719736c2013-01-19 03:14:56 +00008061 ++IDIdx) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008062 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
Richard Smithe842a472014-10-22 02:05:46 +00008063 if (Info.M->Kind != MK_ImplicitModule &&
8064 Info.M->Kind != MK_ExplicitModule)
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008065 resolvePendingMacro(II, Info);
8066 }
8067 // Handle module imports.
Richard Smith49f906a2014-03-01 00:08:04 +00008068 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008069 ++IDIdx) {
8070 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
Richard Smithe842a472014-10-22 02:05:46 +00008071 if (Info.M->Kind == MK_ImplicitModule ||
8072 Info.M->Kind == MK_ExplicitModule)
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008073 resolvePendingMacro(II, Info);
Guy Benyei11169dd2012-12-18 14:30:41 +00008074 }
8075 }
8076 PendingMacroIDs.clear();
Argyrios Kyrtzidis83a6e3b2013-02-16 00:48:59 +00008077
8078 // Wire up the DeclContexts for Decls that we delayed setting until
8079 // recursive loading is completed.
8080 while (!PendingDeclContextInfos.empty()) {
8081 PendingDeclContextInfo Info = PendingDeclContextInfos.front();
8082 PendingDeclContextInfos.pop_front();
8083 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC));
8084 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC));
8085 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext());
8086 }
Richard Smith2b9e3e32013-10-18 06:05:18 +00008087
Richard Smithd1c46742014-04-30 02:24:17 +00008088 // Perform any pending declaration updates.
Richard Smithd6db68c2014-08-07 20:58:41 +00008089 while (!PendingUpdateRecords.empty()) {
Richard Smithd1c46742014-04-30 02:24:17 +00008090 auto Update = PendingUpdateRecords.pop_back_val();
8091 ReadingKindTracker ReadingKind(Read_Decl, *this);
8092 loadDeclUpdateRecords(Update.first, Update.second);
8093 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008094 }
Richard Smith8a639892015-01-24 01:07:20 +00008095
8096 // At this point, all update records for loaded decls are in place, so any
8097 // fake class definitions should have become real.
8098 assert(PendingFakeDefinitionData.empty() &&
8099 "faked up a class definition but never saw the real one");
8100
Guy Benyei11169dd2012-12-18 14:30:41 +00008101 // If we deserialized any C++ or Objective-C class definitions, any
8102 // Objective-C protocol definitions, or any redeclarable templates, make sure
8103 // that all redeclarations point to the definitions. Note that this can only
8104 // happen now, after the redeclaration chains have been fully wired.
Craig Topperc6914d02014-08-25 04:15:02 +00008105 for (Decl *D : PendingDefinitions) {
8106 if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
Richard Smith5b21db82014-04-23 18:20:42 +00008107 if (const TagType *TagT = dyn_cast<TagType>(TD->getTypeForDecl())) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008108 // Make sure that the TagType points at the definition.
8109 const_cast<TagType*>(TagT)->decl = TD;
8110 }
Richard Smith8ce51082015-03-11 01:44:51 +00008111
Craig Topperc6914d02014-08-25 04:15:02 +00008112 if (auto RD = dyn_cast<CXXRecordDecl>(D)) {
Richard Smith8ce51082015-03-11 01:44:51 +00008113 for (auto *R = getMostRecentExistingDecl(RD); R;
8114 R = R->getPreviousDecl()) {
8115 assert((R == D) ==
8116 cast<CXXRecordDecl>(R)->isThisDeclarationADefinition() &&
Richard Smith2c381642014-08-27 23:11:59 +00008117 "declaration thinks it's the definition but it isn't");
Aaron Ballman86c93902014-03-06 23:45:36 +00008118 cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData;
Richard Smith2c381642014-08-27 23:11:59 +00008119 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008120 }
8121
8122 continue;
8123 }
Richard Smith8ce51082015-03-11 01:44:51 +00008124
Craig Topperc6914d02014-08-25 04:15:02 +00008125 if (auto ID = dyn_cast<ObjCInterfaceDecl>(D)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008126 // Make sure that the ObjCInterfaceType points at the definition.
8127 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl))
8128 ->Decl = ID;
Richard Smith8ce51082015-03-11 01:44:51 +00008129
8130 for (auto *R = getMostRecentExistingDecl(ID); R; R = R->getPreviousDecl())
8131 cast<ObjCInterfaceDecl>(R)->Data = ID->Data;
8132
Guy Benyei11169dd2012-12-18 14:30:41 +00008133 continue;
8134 }
Richard Smith8ce51082015-03-11 01:44:51 +00008135
Craig Topperc6914d02014-08-25 04:15:02 +00008136 if (auto PD = dyn_cast<ObjCProtocolDecl>(D)) {
Richard Smith8ce51082015-03-11 01:44:51 +00008137 for (auto *R = getMostRecentExistingDecl(PD); R; R = R->getPreviousDecl())
8138 cast<ObjCProtocolDecl>(R)->Data = PD->Data;
8139
Guy Benyei11169dd2012-12-18 14:30:41 +00008140 continue;
8141 }
Richard Smith8ce51082015-03-11 01:44:51 +00008142
Craig Topperc6914d02014-08-25 04:15:02 +00008143 auto RTD = cast<RedeclarableTemplateDecl>(D)->getCanonicalDecl();
Richard Smith8ce51082015-03-11 01:44:51 +00008144 for (auto *R = getMostRecentExistingDecl(RTD); R; R = R->getPreviousDecl())
8145 cast<RedeclarableTemplateDecl>(R)->Common = RTD->Common;
Guy Benyei11169dd2012-12-18 14:30:41 +00008146 }
8147 PendingDefinitions.clear();
8148
8149 // Load the bodies of any functions or methods we've encountered. We do
8150 // this now (delayed) so that we can be sure that the declaration chains
8151 // have been fully wired up.
Richard Smith8ce51082015-03-11 01:44:51 +00008152 // FIXME: There seems to be no point in delaying this, it does not depend
8153 // on the redecl chains having been wired up.
Guy Benyei11169dd2012-12-18 14:30:41 +00008154 for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
8155 PBEnd = PendingBodies.end();
8156 PB != PBEnd; ++PB) {
8157 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
8158 // FIXME: Check for =delete/=default?
8159 // FIXME: Complain about ODR violations here?
8160 if (!getContext().getLangOpts().Modules || !FD->hasBody())
8161 FD->setLazyBody(PB->second);
8162 continue;
8163 }
8164
8165 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first);
8166 if (!getContext().getLangOpts().Modules || !MD->hasBody())
8167 MD->setLazyBody(PB->second);
8168 }
8169 PendingBodies.clear();
Richard Smitha0ce9c42014-07-29 23:23:27 +00008170}
8171
8172void ASTReader::diagnoseOdrViolations() {
Richard Smithbb853c72014-08-13 01:23:33 +00008173 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty())
8174 return;
8175
Richard Smitha0ce9c42014-07-29 23:23:27 +00008176 // Trigger the import of the full definition of each class that had any
8177 // odr-merging problems, so we can produce better diagnostics for them.
Richard Smithbb853c72014-08-13 01:23:33 +00008178 // These updates may in turn find and diagnose some ODR failures, so take
8179 // ownership of the set first.
8180 auto OdrMergeFailures = std::move(PendingOdrMergeFailures);
8181 PendingOdrMergeFailures.clear();
8182 for (auto &Merge : OdrMergeFailures) {
Richard Smitha0ce9c42014-07-29 23:23:27 +00008183 Merge.first->buildLookup();
8184 Merge.first->decls_begin();
8185 Merge.first->bases_begin();
8186 Merge.first->vbases_begin();
8187 for (auto *RD : Merge.second) {
8188 RD->decls_begin();
8189 RD->bases_begin();
8190 RD->vbases_begin();
8191 }
8192 }
8193
8194 // For each declaration from a merged context, check that the canonical
8195 // definition of that context also contains a declaration of the same
8196 // entity.
8197 //
8198 // Caution: this loop does things that might invalidate iterators into
8199 // PendingOdrMergeChecks. Don't turn this into a range-based for loop!
8200 while (!PendingOdrMergeChecks.empty()) {
8201 NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
8202
8203 // FIXME: Skip over implicit declarations for now. This matters for things
8204 // like implicitly-declared special member functions. This isn't entirely
8205 // correct; we can end up with multiple unmerged declarations of the same
8206 // implicit entity.
8207 if (D->isImplicit())
8208 continue;
8209
8210 DeclContext *CanonDef = D->getDeclContext();
Richard Smitha0ce9c42014-07-29 23:23:27 +00008211
8212 bool Found = false;
8213 const Decl *DCanon = D->getCanonicalDecl();
8214
Richard Smith01bdb7a2014-08-28 05:44:07 +00008215 for (auto RI : D->redecls()) {
8216 if (RI->getLexicalDeclContext() == CanonDef) {
8217 Found = true;
8218 break;
8219 }
8220 }
8221 if (Found)
8222 continue;
8223
Richard Smitha0ce9c42014-07-29 23:23:27 +00008224 llvm::SmallVector<const NamedDecl*, 4> Candidates;
Richard Smith01bdb7a2014-08-28 05:44:07 +00008225 DeclContext::lookup_result R = CanonDef->lookup(D->getDeclName());
Richard Smitha0ce9c42014-07-29 23:23:27 +00008226 for (DeclContext::lookup_iterator I = R.begin(), E = R.end();
8227 !Found && I != E; ++I) {
8228 for (auto RI : (*I)->redecls()) {
8229 if (RI->getLexicalDeclContext() == CanonDef) {
8230 // This declaration is present in the canonical definition. If it's
8231 // in the same redecl chain, it's the one we're looking for.
8232 if (RI->getCanonicalDecl() == DCanon)
8233 Found = true;
8234 else
8235 Candidates.push_back(cast<NamedDecl>(RI));
8236 break;
8237 }
8238 }
8239 }
8240
8241 if (!Found) {
Richard Smithd08aeb62014-08-28 01:33:39 +00008242 // The AST doesn't like TagDecls becoming invalid after they've been
8243 // completed. We only really need to mark FieldDecls as invalid here.
8244 if (!isa<TagDecl>(D))
8245 D->setInvalidDecl();
Richard Smith4ab3dbd2015-02-13 22:43:51 +00008246
8247 // Ensure we don't accidentally recursively enter deserialization while
8248 // we're producing our diagnostic.
8249 Deserializing RecursionGuard(this);
Richard Smitha0ce9c42014-07-29 23:23:27 +00008250
8251 std::string CanonDefModule =
8252 getOwningModuleNameForDiagnostic(cast<Decl>(CanonDef));
8253 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl)
8254 << D << getOwningModuleNameForDiagnostic(D)
8255 << CanonDef << CanonDefModule.empty() << CanonDefModule;
8256
8257 if (Candidates.empty())
8258 Diag(cast<Decl>(CanonDef)->getLocation(),
8259 diag::note_module_odr_violation_no_possible_decls) << D;
8260 else {
8261 for (unsigned I = 0, N = Candidates.size(); I != N; ++I)
8262 Diag(Candidates[I]->getLocation(),
8263 diag::note_module_odr_violation_possible_decl)
8264 << Candidates[I];
8265 }
8266
8267 DiagnosedOdrMergeFailures.insert(CanonDef);
8268 }
8269 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00008270
Richard Smith4ab3dbd2015-02-13 22:43:51 +00008271 if (OdrMergeFailures.empty())
8272 return;
8273
8274 // Ensure we don't accidentally recursively enter deserialization while
8275 // we're producing our diagnostics.
8276 Deserializing RecursionGuard(this);
8277
Richard Smithcd45dbc2014-04-19 03:48:30 +00008278 // Issue any pending ODR-failure diagnostics.
Richard Smithbb853c72014-08-13 01:23:33 +00008279 for (auto &Merge : OdrMergeFailures) {
Richard Smitha0ce9c42014-07-29 23:23:27 +00008280 // If we've already pointed out a specific problem with this class, don't
8281 // bother issuing a general "something's different" diagnostic.
David Blaikie82e95a32014-11-19 07:49:47 +00008282 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
Richard Smithcd45dbc2014-04-19 03:48:30 +00008283 continue;
8284
8285 bool Diagnosed = false;
8286 for (auto *RD : Merge.second) {
8287 // Multiple different declarations got merged together; tell the user
8288 // where they came from.
8289 if (Merge.first != RD) {
8290 // FIXME: Walk the definition, figure out what's different,
8291 // and diagnose that.
8292 if (!Diagnosed) {
8293 std::string Module = getOwningModuleNameForDiagnostic(Merge.first);
8294 Diag(Merge.first->getLocation(),
8295 diag::err_module_odr_violation_different_definitions)
8296 << Merge.first << Module.empty() << Module;
8297 Diagnosed = true;
8298 }
8299
8300 Diag(RD->getLocation(),
8301 diag::note_module_odr_violation_different_definitions)
8302 << getOwningModuleNameForDiagnostic(RD);
8303 }
8304 }
8305
8306 if (!Diagnosed) {
8307 // All definitions are updates to the same declaration. This happens if a
8308 // module instantiates the declaration of a class template specialization
8309 // and two or more other modules instantiate its definition.
8310 //
8311 // FIXME: Indicate which modules had instantiations of this definition.
8312 // FIXME: How can this even happen?
8313 Diag(Merge.first->getLocation(),
8314 diag::err_module_odr_violation_different_instantiations)
8315 << Merge.first;
8316 }
8317 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008318}
8319
8320void ASTReader::FinishedDeserializing() {
8321 assert(NumCurrentElementsDeserializing &&
8322 "FinishedDeserializing not paired with StartedDeserializing");
8323 if (NumCurrentElementsDeserializing == 1) {
8324 // We decrease NumCurrentElementsDeserializing only after pending actions
8325 // are finished, to avoid recursively re-calling finishPendingActions().
8326 finishPendingActions();
8327 }
8328 --NumCurrentElementsDeserializing;
8329
Richard Smitha0ce9c42014-07-29 23:23:27 +00008330 if (NumCurrentElementsDeserializing == 0) {
Richard Smith9e2341d2015-03-23 03:25:59 +00008331 // Propagate exception specification updates along redeclaration chains.
Richard Smith7226f2a2015-03-23 19:54:56 +00008332 while (!PendingExceptionSpecUpdates.empty()) {
8333 auto Updates = std::move(PendingExceptionSpecUpdates);
8334 PendingExceptionSpecUpdates.clear();
8335 for (auto Update : Updates) {
8336 auto *FPT = Update.second->getType()->castAs<FunctionProtoType>();
8337 SemaObj->UpdateExceptionSpec(Update.second,
8338 FPT->getExtProtoInfo().ExceptionSpec);
8339 }
Richard Smith9e2341d2015-03-23 03:25:59 +00008340 }
8341
Richard Smitha0ce9c42014-07-29 23:23:27 +00008342 diagnoseOdrViolations();
8343
Richard Smith04d05b52014-03-23 00:27:18 +00008344 // We are not in recursive loading, so it's safe to pass the "interesting"
8345 // decls to the consumer.
Richard Smitha0ce9c42014-07-29 23:23:27 +00008346 if (Consumer)
8347 PassInterestingDeclsToConsumer();
Guy Benyei11169dd2012-12-18 14:30:41 +00008348 }
8349}
8350
Argyrios Kyrtzidise5edbf92013-04-26 21:33:35 +00008351void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) {
Richard Smith9e2341d2015-03-23 03:25:59 +00008352 if (IdentifierInfo *II = Name.getAsIdentifierInfo()) {
8353 // Remove any fake results before adding any real ones.
8354 auto It = PendingFakeLookupResults.find(II);
8355 if (It != PendingFakeLookupResults.end()) {
8356 for (auto *ND : PendingFakeLookupResults[II])
8357 SemaObj->IdResolver.RemoveDecl(ND);
Ben Langmuireb8bd2d2015-04-10 22:25:42 +00008358 // FIXME: this works around module+PCH performance issue.
8359 // Rather than erase the result from the map, which is O(n), just clear
8360 // the vector of NamedDecls.
8361 It->second.clear();
Richard Smith9e2341d2015-03-23 03:25:59 +00008362 }
8363 }
Argyrios Kyrtzidise5edbf92013-04-26 21:33:35 +00008364
8365 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
8366 SemaObj->TUScope->AddDecl(D);
8367 } else if (SemaObj->TUScope) {
8368 // Adding the decl to IdResolver may have failed because it was already in
8369 // (even though it was not added in scope). If it is already in, make sure
8370 // it gets in the scope as well.
8371 if (std::find(SemaObj->IdResolver.begin(Name),
8372 SemaObj->IdResolver.end(), D) != SemaObj->IdResolver.end())
8373 SemaObj->TUScope->AddDecl(D);
8374 }
8375}
8376
Nico Weber824285e2014-05-08 04:26:47 +00008377ASTReader::ASTReader(Preprocessor &PP, ASTContext &Context, StringRef isysroot,
8378 bool DisableValidation, bool AllowASTWithCompilerErrors,
8379 bool AllowConfigurationMismatch, bool ValidateSystemInputs,
Ben Langmuir2cb4a782014-02-05 22:21:15 +00008380 bool UseGlobalIndex)
Craig Toppera13603a2014-05-22 05:54:18 +00008381 : Listener(new PCHValidator(PP, *this)), DeserializationListener(nullptr),
Nico Weber824285e2014-05-08 04:26:47 +00008382 OwnsDeserializationListener(false), SourceMgr(PP.getSourceManager()),
Craig Toppera13603a2014-05-22 05:54:18 +00008383 FileMgr(PP.getFileManager()), Diags(PP.getDiagnostics()),
8384 SemaObj(nullptr), PP(PP), Context(Context), Consumer(nullptr),
8385 ModuleMgr(PP.getFileManager()), isysroot(isysroot),
8386 DisableValidation(DisableValidation),
Nico Weber824285e2014-05-08 04:26:47 +00008387 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
8388 AllowConfigurationMismatch(AllowConfigurationMismatch),
8389 ValidateSystemInputs(ValidateSystemInputs),
8390 UseGlobalIndex(UseGlobalIndex), TriedLoadingGlobalIndex(false),
Richard Smith053f6c62014-05-16 23:01:30 +00008391 CurrSwitchCaseStmts(&SwitchCaseStmts),
Nico Weber824285e2014-05-08 04:26:47 +00008392 NumSLocEntriesRead(0), TotalNumSLocEntries(0), NumStatementsRead(0),
8393 TotalNumStatements(0), NumMacrosRead(0), TotalNumMacros(0),
8394 NumIdentifierLookups(0), NumIdentifierLookupHits(0), NumSelectorsRead(0),
8395 NumMethodPoolEntriesRead(0), NumMethodPoolLookups(0),
8396 NumMethodPoolHits(0), NumMethodPoolTableLookups(0),
8397 NumMethodPoolTableHits(0), TotalNumMethodPoolEntries(0),
8398 NumLexicalDeclContextsRead(0), TotalLexicalDeclContexts(0),
8399 NumVisibleDeclContextsRead(0), TotalVisibleDeclContexts(0),
8400 TotalModulesSizeInBits(0), NumCurrentElementsDeserializing(0),
Richard Smithc2bb8182015-03-24 06:36:48 +00008401 PassingDeclsToConsumer(false), ReadingKind(Read_None) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008402 SourceMgr.setExternalSLocEntrySource(this);
8403}
8404
8405ASTReader::~ASTReader() {
Nico Weber824285e2014-05-08 04:26:47 +00008406 if (OwnsDeserializationListener)
8407 delete DeserializationListener;
8408
Guy Benyei11169dd2012-12-18 14:30:41 +00008409 for (DeclContextVisibleUpdatesPending::iterator
8410 I = PendingVisibleUpdates.begin(),
8411 E = PendingVisibleUpdates.end();
8412 I != E; ++I) {
8413 for (DeclContextVisibleUpdates::iterator J = I->second.begin(),
8414 F = I->second.end();
8415 J != F; ++J)
8416 delete J->first;
8417 }
8418}