blob: f18122dd941869e4c48cbae5bfe172c9e0a71c96 [file] [log] [blame]
Nick Lewycky995e26b2013-01-31 03:23:57 +00001//===--- ASTReader.cpp - AST File Reader ----------------------------------===//
Guy Benyei7f92f2d2012-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"
Stephen Hines6bcf27b2014-05-29 04:14:42 -070025#include "clang/Basic/DiagnosticOptions.h"
Guy Benyei7f92f2d2012-12-18 14:30:41 +000026#include "clang/Basic/FileManager.h"
Guy Benyei7f92f2d2012-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"
Stephen Hines6bcf27b2014-05-29 04:14:42 -070033#include "clang/Frontend/Utils.h"
Guy Benyei7f92f2d2012-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 Gregor1a49d972013-01-25 01:03:03 +000043#include "clang/Serialization/GlobalModuleIndex.h"
Guy Benyei7f92f2d2012-12-18 14:30:41 +000044#include "clang/Serialization/ModuleManager.h"
45#include "clang/Serialization/SerializationDiagnostic.h"
Argyrios Kyrtzidised3802e2013-03-06 18:12:47 +000046#include "llvm/ADT/Hashing.h"
Guy Benyei7f92f2d2012-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"
Stephen Hines651f13c2014-04-23 16:59:28 -070054#include "llvm/Support/raw_ostream.h"
Guy Benyei7f92f2d2012-12-18 14:30:41 +000055#include <algorithm>
Chris Lattnere4e4a882013-01-20 00:57:52 +000056#include <cstdio>
Guy Benyei7f92f2d2012-12-18 14:30:41 +000057#include <iterator>
Stephen Hinesc568f1e2014-07-21 00:47:37 -070058#include <system_error>
Guy Benyei7f92f2d2012-12-18 14:30:41 +000059
60using namespace clang;
61using namespace clang::serialization;
62using namespace clang::serialization::reader;
Chris Lattner8f9a1eb2013-01-20 00:56:42 +000063using llvm::BitstreamCursor;
Guy Benyei7f92f2d2012-12-18 14:30:41 +000064
Stephen Hines651f13c2014-04-23 16:59:28 -070065
66//===----------------------------------------------------------------------===//
67// ChainedASTReaderListener implementation
68//===----------------------------------------------------------------------===//
69
70bool
71ChainedASTReaderListener::ReadFullVersionInformation(StringRef FullVersion) {
72 return First->ReadFullVersionInformation(FullVersion) ||
73 Second->ReadFullVersionInformation(FullVersion);
74}
Stephen Hines6bcf27b2014-05-29 04:14:42 -070075void 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}
Stephen Hines651f13c2014-04-23 16:59:28 -070083bool ChainedASTReaderListener::ReadLanguageOptions(const LangOptions &LangOpts,
84 bool Complain) {
85 return First->ReadLanguageOptions(LangOpts, Complain) ||
86 Second->ReadLanguageOptions(LangOpts, Complain);
87}
88bool
89ChainedASTReaderListener::ReadTargetOptions(const TargetOptions &TargetOpts,
90 bool Complain) {
91 return First->ReadTargetOptions(TargetOpts, Complain) ||
92 Second->ReadTargetOptions(TargetOpts, Complain);
93}
94bool ChainedASTReaderListener::ReadDiagnosticOptions(
Stephen Hines6bcf27b2014-05-29 04:14:42 -070095 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) {
Stephen Hines651f13c2014-04-23 16:59:28 -070096 return First->ReadDiagnosticOptions(DiagOpts, Complain) ||
97 Second->ReadDiagnosticOptions(DiagOpts, Complain);
98}
99bool
100ChainedASTReaderListener::ReadFileSystemOptions(const FileSystemOptions &FSOpts,
101 bool Complain) {
102 return First->ReadFileSystemOptions(FSOpts, Complain) ||
103 Second->ReadFileSystemOptions(FSOpts, Complain);
104}
105
106bool ChainedASTReaderListener::ReadHeaderSearchOptions(
107 const HeaderSearchOptions &HSOpts, bool Complain) {
108 return First->ReadHeaderSearchOptions(HSOpts, Complain) ||
109 Second->ReadHeaderSearchOptions(HSOpts, Complain);
110}
111bool ChainedASTReaderListener::ReadPreprocessorOptions(
112 const PreprocessorOptions &PPOpts, bool Complain,
113 std::string &SuggestedPredefines) {
114 return First->ReadPreprocessorOptions(PPOpts, Complain,
115 SuggestedPredefines) ||
116 Second->ReadPreprocessorOptions(PPOpts, Complain, SuggestedPredefines);
117}
118void ChainedASTReaderListener::ReadCounter(const serialization::ModuleFile &M,
119 unsigned Value) {
120 First->ReadCounter(M, Value);
121 Second->ReadCounter(M, Value);
122}
123bool ChainedASTReaderListener::needsInputFileVisitation() {
124 return First->needsInputFileVisitation() ||
125 Second->needsInputFileVisitation();
126}
127bool ChainedASTReaderListener::needsSystemInputFileVisitation() {
128 return First->needsSystemInputFileVisitation() ||
129 Second->needsSystemInputFileVisitation();
130}
131void ChainedASTReaderListener::visitModuleFile(StringRef Filename) {
132 First->visitModuleFile(Filename);
133 Second->visitModuleFile(Filename);
134}
135bool ChainedASTReaderListener::visitInputFile(StringRef Filename,
136 bool isSystem,
137 bool isOverridden) {
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700138 bool Continue = false;
139 if (First->needsInputFileVisitation() &&
140 (!isSystem || First->needsSystemInputFileVisitation()))
141 Continue |= First->visitInputFile(Filename, isSystem, isOverridden);
142 if (Second->needsInputFileVisitation() &&
143 (!isSystem || Second->needsSystemInputFileVisitation()))
144 Continue |= Second->visitInputFile(Filename, isSystem, isOverridden);
145 return Continue;
Stephen Hines651f13c2014-04-23 16:59:28 -0700146}
147
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000148//===----------------------------------------------------------------------===//
149// PCH validator implementation
150//===----------------------------------------------------------------------===//
151
152ASTReaderListener::~ASTReaderListener() {}
153
154/// \brief Compare the given set of language options against an existing set of
155/// language options.
156///
157/// \param Diags If non-NULL, diagnostics will be emitted via this engine.
158///
159/// \returns true if the languagae options mis-match, false otherwise.
160static bool checkLanguageOptions(const LangOptions &LangOpts,
161 const LangOptions &ExistingLangOpts,
162 DiagnosticsEngine *Diags) {
163#define LANGOPT(Name, Bits, Default, Description) \
164 if (ExistingLangOpts.Name != LangOpts.Name) { \
165 if (Diags) \
166 Diags->Report(diag::err_pch_langopt_mismatch) \
167 << Description << LangOpts.Name << ExistingLangOpts.Name; \
168 return true; \
169 }
170
171#define VALUE_LANGOPT(Name, Bits, Default, Description) \
172 if (ExistingLangOpts.Name != LangOpts.Name) { \
173 if (Diags) \
174 Diags->Report(diag::err_pch_langopt_value_mismatch) \
175 << Description; \
176 return true; \
177 }
178
179#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
180 if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \
181 if (Diags) \
182 Diags->Report(diag::err_pch_langopt_value_mismatch) \
183 << Description; \
184 return true; \
185 }
186
187#define BENIGN_LANGOPT(Name, Bits, Default, Description)
188#define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description)
189#include "clang/Basic/LangOptions.def"
190
191 if (ExistingLangOpts.ObjCRuntime != LangOpts.ObjCRuntime) {
192 if (Diags)
193 Diags->Report(diag::err_pch_langopt_value_mismatch)
194 << "target Objective-C runtime";
195 return true;
196 }
197
Dmitri Gribenko6ebf0912013-02-22 14:21:27 +0000198 if (ExistingLangOpts.CommentOpts.BlockCommandNames !=
199 LangOpts.CommentOpts.BlockCommandNames) {
200 if (Diags)
201 Diags->Report(diag::err_pch_langopt_value_mismatch)
202 << "block command names";
203 return true;
204 }
205
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000206 return false;
207}
208
209/// \brief Compare the given set of target options against an existing set of
210/// target options.
211///
212/// \param Diags If non-NULL, diagnostics will be emitted via this engine.
213///
214/// \returns true if the target options mis-match, false otherwise.
215static bool checkTargetOptions(const TargetOptions &TargetOpts,
216 const TargetOptions &ExistingTargetOpts,
217 DiagnosticsEngine *Diags) {
218#define CHECK_TARGET_OPT(Field, Name) \
219 if (TargetOpts.Field != ExistingTargetOpts.Field) { \
220 if (Diags) \
221 Diags->Report(diag::err_pch_targetopt_mismatch) \
222 << Name << TargetOpts.Field << ExistingTargetOpts.Field; \
223 return true; \
224 }
225
226 CHECK_TARGET_OPT(Triple, "target");
227 CHECK_TARGET_OPT(CPU, "target CPU");
228 CHECK_TARGET_OPT(ABI, "target ABI");
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000229#undef CHECK_TARGET_OPT
230
231 // Compare feature sets.
232 SmallVector<StringRef, 4> ExistingFeatures(
233 ExistingTargetOpts.FeaturesAsWritten.begin(),
234 ExistingTargetOpts.FeaturesAsWritten.end());
235 SmallVector<StringRef, 4> ReadFeatures(TargetOpts.FeaturesAsWritten.begin(),
236 TargetOpts.FeaturesAsWritten.end());
237 std::sort(ExistingFeatures.begin(), ExistingFeatures.end());
238 std::sort(ReadFeatures.begin(), ReadFeatures.end());
239
240 unsigned ExistingIdx = 0, ExistingN = ExistingFeatures.size();
241 unsigned ReadIdx = 0, ReadN = ReadFeatures.size();
242 while (ExistingIdx < ExistingN && ReadIdx < ReadN) {
243 if (ExistingFeatures[ExistingIdx] == ReadFeatures[ReadIdx]) {
244 ++ExistingIdx;
245 ++ReadIdx;
246 continue;
247 }
248
249 if (ReadFeatures[ReadIdx] < ExistingFeatures[ExistingIdx]) {
250 if (Diags)
251 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
252 << false << ReadFeatures[ReadIdx];
253 return true;
254 }
255
256 if (Diags)
257 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
258 << true << ExistingFeatures[ExistingIdx];
259 return true;
260 }
261
262 if (ExistingIdx < ExistingN) {
263 if (Diags)
264 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
265 << true << ExistingFeatures[ExistingIdx];
266 return true;
267 }
268
269 if (ReadIdx < ReadN) {
270 if (Diags)
271 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
272 << false << ReadFeatures[ReadIdx];
273 return true;
274 }
275
276 return false;
277}
278
279bool
280PCHValidator::ReadLanguageOptions(const LangOptions &LangOpts,
281 bool Complain) {
282 const LangOptions &ExistingLangOpts = PP.getLangOpts();
283 return checkLanguageOptions(LangOpts, ExistingLangOpts,
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700284 Complain? &Reader.Diags : nullptr);
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000285}
286
287bool PCHValidator::ReadTargetOptions(const TargetOptions &TargetOpts,
288 bool Complain) {
289 const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts();
290 return checkTargetOptions(TargetOpts, ExistingTargetOpts,
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700291 Complain? &Reader.Diags : nullptr);
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000292}
293
294namespace {
295 typedef llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/> >
296 MacroDefinitionsMap;
Craig Topper8ae63872013-07-05 04:43:31 +0000297 typedef llvm::DenseMap<DeclarationName, SmallVector<NamedDecl *, 8> >
298 DeclsMap;
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000299}
300
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700301static bool checkDiagnosticGroupMappings(DiagnosticsEngine &StoredDiags,
302 DiagnosticsEngine &Diags,
303 bool Complain) {
304 typedef DiagnosticsEngine::Level Level;
305
306 // Check current mappings for new -Werror mappings, and the stored mappings
307 // for cases that were explicitly mapped to *not* be errors that are now
308 // errors because of options like -Werror.
309 DiagnosticsEngine *MappingSources[] = { &Diags, &StoredDiags };
310
311 for (DiagnosticsEngine *MappingSource : MappingSources) {
312 for (auto DiagIDMappingPair : MappingSource->getDiagnosticMappings()) {
313 diag::kind DiagID = DiagIDMappingPair.first;
314 Level CurLevel = Diags.getDiagnosticLevel(DiagID, SourceLocation());
315 if (CurLevel < DiagnosticsEngine::Error)
316 continue; // not significant
317 Level StoredLevel =
318 StoredDiags.getDiagnosticLevel(DiagID, SourceLocation());
319 if (StoredLevel < DiagnosticsEngine::Error) {
320 if (Complain)
321 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror=" +
322 Diags.getDiagnosticIDs()->getWarningOptionForDiag(DiagID).str();
323 return true;
324 }
325 }
326 }
327
328 return false;
329}
330
Stephen Hinesc568f1e2014-07-21 00:47:37 -0700331static bool isExtHandlingFromDiagsError(DiagnosticsEngine &Diags) {
332 diag::Severity Ext = Diags.getExtensionHandlingBehavior();
333 if (Ext == diag::Severity::Warning && Diags.getWarningsAsErrors())
334 return true;
335 return Ext >= diag::Severity::Error;
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700336}
337
338static bool checkDiagnosticMappings(DiagnosticsEngine &StoredDiags,
339 DiagnosticsEngine &Diags,
340 bool IsSystem, bool Complain) {
341 // Top-level options
342 if (IsSystem) {
343 if (Diags.getSuppressSystemWarnings())
344 return false;
345 // If -Wsystem-headers was not enabled before, be conservative
346 if (StoredDiags.getSuppressSystemWarnings()) {
347 if (Complain)
348 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Wsystem-headers";
349 return true;
350 }
351 }
352
353 if (Diags.getWarningsAsErrors() && !StoredDiags.getWarningsAsErrors()) {
354 if (Complain)
355 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror";
356 return true;
357 }
358
359 if (Diags.getWarningsAsErrors() && Diags.getEnableAllWarnings() &&
360 !StoredDiags.getEnableAllWarnings()) {
361 if (Complain)
362 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Weverything -Werror";
363 return true;
364 }
365
366 if (isExtHandlingFromDiagsError(Diags) &&
367 !isExtHandlingFromDiagsError(StoredDiags)) {
368 if (Complain)
369 Diags.Report(diag::err_pch_diagopt_mismatch) << "-pedantic-errors";
370 return true;
371 }
372
373 return checkDiagnosticGroupMappings(StoredDiags, Diags, Complain);
374}
375
376bool PCHValidator::ReadDiagnosticOptions(
377 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) {
378 DiagnosticsEngine &ExistingDiags = PP.getDiagnostics();
379 IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(ExistingDiags.getDiagnosticIDs());
380 IntrusiveRefCntPtr<DiagnosticsEngine> Diags(
Stephen Hinesc568f1e2014-07-21 00:47:37 -0700381 new DiagnosticsEngine(DiagIDs, DiagOpts.get()));
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700382 // This should never fail, because we would have processed these options
383 // before writing them to an ASTFile.
384 ProcessWarningOptions(*Diags, *DiagOpts, /*Report*/false);
385
386 ModuleManager &ModuleMgr = Reader.getModuleManager();
387 assert(ModuleMgr.size() >= 1 && "what ASTFile is this then");
388
389 // If the original import came from a file explicitly generated by the user,
390 // don't check the diagnostic mappings.
391 // FIXME: currently this is approximated by checking whether this is not a
392 // module import.
393 // Note: ModuleMgr.rbegin() may not be the current module, but it must be in
394 // the transitive closure of its imports, since unrelated modules cannot be
395 // imported until after this module finishes validation.
396 ModuleFile *TopImport = *ModuleMgr.rbegin();
397 while (!TopImport->ImportedBy.empty())
398 TopImport = TopImport->ImportedBy[0];
399 if (TopImport->Kind != MK_Module)
400 return false;
401
402 StringRef ModuleName = TopImport->ModuleName;
403 assert(!ModuleName.empty() && "diagnostic options read before module name");
404
405 Module *M = PP.getHeaderSearchInfo().lookupModule(ModuleName);
406 assert(M && "missing module");
407
408 // FIXME: if the diagnostics are incompatible, save a DiagnosticOptions that
409 // contains the union of their flags.
410 return checkDiagnosticMappings(*Diags, ExistingDiags, M->IsSystem, Complain);
411}
412
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000413/// \brief Collect the macro definitions provided by the given preprocessor
414/// options.
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700415static void
416collectMacroDefinitions(const PreprocessorOptions &PPOpts,
417 MacroDefinitionsMap &Macros,
418 SmallVectorImpl<StringRef> *MacroNames = nullptr) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000419 for (unsigned I = 0, N = PPOpts.Macros.size(); I != N; ++I) {
420 StringRef Macro = PPOpts.Macros[I].first;
421 bool IsUndef = PPOpts.Macros[I].second;
422
423 std::pair<StringRef, StringRef> MacroPair = Macro.split('=');
424 StringRef MacroName = MacroPair.first;
425 StringRef MacroBody = MacroPair.second;
426
427 // For an #undef'd macro, we only care about the name.
428 if (IsUndef) {
429 if (MacroNames && !Macros.count(MacroName))
430 MacroNames->push_back(MacroName);
431
432 Macros[MacroName] = std::make_pair("", true);
433 continue;
434 }
435
436 // For a #define'd macro, figure out the actual definition.
437 if (MacroName.size() == Macro.size())
438 MacroBody = "1";
439 else {
440 // Note: GCC drops anything following an end-of-line character.
441 StringRef::size_type End = MacroBody.find_first_of("\n\r");
442 MacroBody = MacroBody.substr(0, End);
443 }
444
445 if (MacroNames && !Macros.count(MacroName))
446 MacroNames->push_back(MacroName);
447 Macros[MacroName] = std::make_pair(MacroBody, false);
448 }
449}
450
451/// \brief Check the preprocessor options deserialized from the control block
452/// against the preprocessor options in an existing preprocessor.
453///
454/// \param Diags If non-null, produce diagnostics for any mismatches incurred.
455static bool checkPreprocessorOptions(const PreprocessorOptions &PPOpts,
456 const PreprocessorOptions &ExistingPPOpts,
457 DiagnosticsEngine *Diags,
458 FileManager &FileMgr,
Argyrios Kyrtzidis65110ca2013-04-26 21:33:40 +0000459 std::string &SuggestedPredefines,
460 const LangOptions &LangOpts) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000461 // Check macro definitions.
462 MacroDefinitionsMap ASTFileMacros;
463 collectMacroDefinitions(PPOpts, ASTFileMacros);
464 MacroDefinitionsMap ExistingMacros;
465 SmallVector<StringRef, 4> ExistingMacroNames;
466 collectMacroDefinitions(ExistingPPOpts, ExistingMacros, &ExistingMacroNames);
467
468 for (unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) {
469 // Dig out the macro definition in the existing preprocessor options.
470 StringRef MacroName = ExistingMacroNames[I];
471 std::pair<StringRef, bool> Existing = ExistingMacros[MacroName];
472
473 // Check whether we know anything about this macro name or not.
474 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/> >::iterator Known
475 = ASTFileMacros.find(MacroName);
476 if (Known == ASTFileMacros.end()) {
477 // FIXME: Check whether this identifier was referenced anywhere in the
478 // AST file. If so, we should reject the AST file. Unfortunately, this
479 // information isn't in the control block. What shall we do about it?
480
481 if (Existing.second) {
482 SuggestedPredefines += "#undef ";
483 SuggestedPredefines += MacroName.str();
484 SuggestedPredefines += '\n';
485 } else {
486 SuggestedPredefines += "#define ";
487 SuggestedPredefines += MacroName.str();
488 SuggestedPredefines += ' ';
489 SuggestedPredefines += Existing.first.str();
490 SuggestedPredefines += '\n';
491 }
492 continue;
493 }
494
495 // If the macro was defined in one but undef'd in the other, we have a
496 // conflict.
497 if (Existing.second != Known->second.second) {
498 if (Diags) {
499 Diags->Report(diag::err_pch_macro_def_undef)
500 << MacroName << Known->second.second;
501 }
502 return true;
503 }
504
505 // If the macro was #undef'd in both, or if the macro bodies are identical,
506 // it's fine.
507 if (Existing.second || Existing.first == Known->second.first)
508 continue;
509
510 // The macro bodies differ; complain.
511 if (Diags) {
512 Diags->Report(diag::err_pch_macro_def_conflict)
513 << MacroName << Known->second.first << Existing.first;
514 }
515 return true;
516 }
517
518 // Check whether we're using predefines.
519 if (PPOpts.UsePredefines != ExistingPPOpts.UsePredefines) {
520 if (Diags) {
521 Diags->Report(diag::err_pch_undef) << ExistingPPOpts.UsePredefines;
522 }
523 return true;
524 }
525
Argyrios Kyrtzidis65110ca2013-04-26 21:33:40 +0000526 // Detailed record is important since it is used for the module cache hash.
527 if (LangOpts.Modules &&
528 PPOpts.DetailedRecord != ExistingPPOpts.DetailedRecord) {
529 if (Diags) {
530 Diags->Report(diag::err_pch_pp_detailed_record) << PPOpts.DetailedRecord;
531 }
532 return true;
533 }
534
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000535 // Compute the #include and #include_macros lines we need.
536 for (unsigned I = 0, N = ExistingPPOpts.Includes.size(); I != N; ++I) {
537 StringRef File = ExistingPPOpts.Includes[I];
538 if (File == ExistingPPOpts.ImplicitPCHInclude)
539 continue;
540
541 if (std::find(PPOpts.Includes.begin(), PPOpts.Includes.end(), File)
542 != PPOpts.Includes.end())
543 continue;
544
545 SuggestedPredefines += "#include \"";
546 SuggestedPredefines +=
547 HeaderSearch::NormalizeDashIncludePath(File, FileMgr);
548 SuggestedPredefines += "\"\n";
549 }
550
551 for (unsigned I = 0, N = ExistingPPOpts.MacroIncludes.size(); I != N; ++I) {
552 StringRef File = ExistingPPOpts.MacroIncludes[I];
553 if (std::find(PPOpts.MacroIncludes.begin(), PPOpts.MacroIncludes.end(),
554 File)
555 != PPOpts.MacroIncludes.end())
556 continue;
557
558 SuggestedPredefines += "#__include_macros \"";
559 SuggestedPredefines +=
560 HeaderSearch::NormalizeDashIncludePath(File, FileMgr);
561 SuggestedPredefines += "\"\n##\n";
562 }
563
564 return false;
565}
566
567bool PCHValidator::ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
568 bool Complain,
569 std::string &SuggestedPredefines) {
570 const PreprocessorOptions &ExistingPPOpts = PP.getPreprocessorOpts();
571
572 return checkPreprocessorOptions(PPOpts, ExistingPPOpts,
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700573 Complain? &Reader.Diags : nullptr,
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000574 PP.getFileManager(),
Argyrios Kyrtzidis65110ca2013-04-26 21:33:40 +0000575 SuggestedPredefines,
576 PP.getLangOpts());
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000577}
578
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000579void PCHValidator::ReadCounter(const ModuleFile &M, unsigned Value) {
580 PP.setCounterValue(Value);
581}
582
583//===----------------------------------------------------------------------===//
584// AST reader implementation
585//===----------------------------------------------------------------------===//
586
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700587void ASTReader::setDeserializationListener(ASTDeserializationListener *Listener,
588 bool TakeOwnership) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000589 DeserializationListener = Listener;
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700590 OwnsDeserializationListener = TakeOwnership;
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000591}
592
593
594
595unsigned ASTSelectorLookupTrait::ComputeHash(Selector Sel) {
596 return serialization::ComputeHash(Sel);
597}
598
599
600std::pair<unsigned, unsigned>
601ASTSelectorLookupTrait::ReadKeyDataLength(const unsigned char*& d) {
Stephen Hines651f13c2014-04-23 16:59:28 -0700602 using namespace llvm::support;
603 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
604 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000605 return std::make_pair(KeyLen, DataLen);
606}
607
608ASTSelectorLookupTrait::internal_key_type
609ASTSelectorLookupTrait::ReadKey(const unsigned char* d, unsigned) {
Stephen Hines651f13c2014-04-23 16:59:28 -0700610 using namespace llvm::support;
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000611 SelectorTable &SelTable = Reader.getContext().Selectors;
Stephen Hines651f13c2014-04-23 16:59:28 -0700612 unsigned N = endian::readNext<uint16_t, little, unaligned>(d);
613 IdentifierInfo *FirstII = Reader.getLocalIdentifier(
614 F, endian::readNext<uint32_t, little, unaligned>(d));
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000615 if (N == 0)
616 return SelTable.getNullarySelector(FirstII);
617 else if (N == 1)
618 return SelTable.getUnarySelector(FirstII);
619
620 SmallVector<IdentifierInfo *, 16> Args;
621 Args.push_back(FirstII);
622 for (unsigned I = 1; I != N; ++I)
Stephen Hines651f13c2014-04-23 16:59:28 -0700623 Args.push_back(Reader.getLocalIdentifier(
624 F, endian::readNext<uint32_t, little, unaligned>(d)));
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000625
626 return SelTable.getSelector(N, Args.data());
627}
628
629ASTSelectorLookupTrait::data_type
630ASTSelectorLookupTrait::ReadData(Selector, const unsigned char* d,
631 unsigned DataLen) {
Stephen Hines651f13c2014-04-23 16:59:28 -0700632 using namespace llvm::support;
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000633
634 data_type Result;
635
Stephen Hines651f13c2014-04-23 16:59:28 -0700636 Result.ID = Reader.getGlobalSelectorID(
637 F, endian::readNext<uint32_t, little, unaligned>(d));
638 unsigned NumInstanceMethodsAndBits =
639 endian::readNext<uint16_t, little, unaligned>(d);
640 unsigned NumFactoryMethodsAndBits =
641 endian::readNext<uint16_t, little, unaligned>(d);
Argyrios Kyrtzidis2e3d8c02013-04-17 00:08:58 +0000642 Result.InstanceBits = NumInstanceMethodsAndBits & 0x3;
643 Result.FactoryBits = NumFactoryMethodsAndBits & 0x3;
644 unsigned NumInstanceMethods = NumInstanceMethodsAndBits >> 2;
645 unsigned NumFactoryMethods = NumFactoryMethodsAndBits >> 2;
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000646
647 // Load instance methods
648 for (unsigned I = 0; I != NumInstanceMethods; ++I) {
Stephen Hines651f13c2014-04-23 16:59:28 -0700649 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
650 F, endian::readNext<uint32_t, little, unaligned>(d)))
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000651 Result.Instance.push_back(Method);
652 }
653
654 // Load factory methods
655 for (unsigned I = 0; I != NumFactoryMethods; ++I) {
Stephen Hines651f13c2014-04-23 16:59:28 -0700656 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
657 F, endian::readNext<uint32_t, little, unaligned>(d)))
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000658 Result.Factory.push_back(Method);
659 }
660
661 return Result;
662}
663
Douglas Gregor479633c2013-01-23 18:53:14 +0000664unsigned ASTIdentifierLookupTraitBase::ComputeHash(const internal_key_type& a) {
665 return llvm::HashString(a);
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000666}
667
668std::pair<unsigned, unsigned>
Douglas Gregor479633c2013-01-23 18:53:14 +0000669ASTIdentifierLookupTraitBase::ReadKeyDataLength(const unsigned char*& d) {
Stephen Hines651f13c2014-04-23 16:59:28 -0700670 using namespace llvm::support;
671 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
672 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000673 return std::make_pair(KeyLen, DataLen);
674}
675
Douglas Gregor479633c2013-01-23 18:53:14 +0000676ASTIdentifierLookupTraitBase::internal_key_type
677ASTIdentifierLookupTraitBase::ReadKey(const unsigned char* d, unsigned n) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000678 assert(n >= 2 && d[n-1] == '\0');
Douglas Gregor479633c2013-01-23 18:53:14 +0000679 return StringRef((const char*) d, n-1);
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000680}
681
Douglas Gregorf4e955b2013-02-11 18:16:18 +0000682/// \brief Whether the given identifier is "interesting".
683static bool isInterestingIdentifier(IdentifierInfo &II) {
684 return II.isPoisoned() ||
685 II.isExtensionToken() ||
686 II.getObjCOrBuiltinID() ||
687 II.hasRevertedTokenIDToIdentifier() ||
688 II.hadMacroDefinition() ||
689 II.getFETokenInfo<void>();
690}
691
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000692IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k,
693 const unsigned char* d,
694 unsigned DataLen) {
Stephen Hines651f13c2014-04-23 16:59:28 -0700695 using namespace llvm::support;
696 unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d);
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000697 bool IsInteresting = RawID & 0x01;
698
699 // Wipe out the "is interesting" bit.
700 RawID = RawID >> 1;
701
702 IdentID ID = Reader.getGlobalIdentifierID(F, RawID);
703 if (!IsInteresting) {
704 // For uninteresting identifiers, just build the IdentifierInfo
705 // and associate it with the persistent ID.
706 IdentifierInfo *II = KnownII;
707 if (!II) {
Douglas Gregor479633c2013-01-23 18:53:14 +0000708 II = &Reader.getIdentifierTable().getOwn(k);
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000709 KnownII = II;
710 }
711 Reader.SetIdentifierInfo(ID, II);
Douglas Gregorf4e955b2013-02-11 18:16:18 +0000712 if (!II->isFromAST()) {
713 bool WasInteresting = isInterestingIdentifier(*II);
714 II->setIsFromAST();
715 if (WasInteresting)
716 II->setChangedSinceDeserialization();
717 }
718 Reader.markIdentifierUpToDate(II);
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000719 return II;
720 }
721
Stephen Hines651f13c2014-04-23 16:59:28 -0700722 unsigned ObjCOrBuiltinID = endian::readNext<uint16_t, little, unaligned>(d);
723 unsigned Bits = endian::readNext<uint16_t, little, unaligned>(d);
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000724 bool CPlusPlusOperatorKeyword = Bits & 0x01;
725 Bits >>= 1;
726 bool HasRevertedTokenIDToIdentifier = Bits & 0x01;
727 Bits >>= 1;
728 bool Poisoned = Bits & 0x01;
729 Bits >>= 1;
730 bool ExtensionToken = Bits & 0x01;
731 Bits >>= 1;
Argyrios Kyrtzidis9317ab92013-03-22 21:12:57 +0000732 bool hasSubmoduleMacros = Bits & 0x01;
733 Bits >>= 1;
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000734 bool hadMacroDefinition = Bits & 0x01;
735 Bits >>= 1;
736
737 assert(Bits == 0 && "Extra bits in the identifier?");
738 DataLen -= 8;
739
740 // Build the IdentifierInfo itself and link the identifier ID with
741 // the new IdentifierInfo.
742 IdentifierInfo *II = KnownII;
743 if (!II) {
Douglas Gregor479633c2013-01-23 18:53:14 +0000744 II = &Reader.getIdentifierTable().getOwn(StringRef(k));
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000745 KnownII = II;
746 }
747 Reader.markIdentifierUpToDate(II);
Douglas Gregorf4e955b2013-02-11 18:16:18 +0000748 if (!II->isFromAST()) {
749 bool WasInteresting = isInterestingIdentifier(*II);
750 II->setIsFromAST();
751 if (WasInteresting)
752 II->setChangedSinceDeserialization();
753 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000754
755 // Set or check the various bits in the IdentifierInfo structure.
756 // Token IDs are read-only.
Argyrios Kyrtzidis1ebefc72013-02-27 01:13:51 +0000757 if (HasRevertedTokenIDToIdentifier && II->getTokenID() != tok::identifier)
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000758 II->RevertTokenIDToIdentifier();
759 II->setObjCOrBuiltinID(ObjCOrBuiltinID);
760 assert(II->isExtensionToken() == ExtensionToken &&
761 "Incorrect extension token flag");
762 (void)ExtensionToken;
763 if (Poisoned)
764 II->setIsPoisoned(true);
765 assert(II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword &&
766 "Incorrect C++ operator keyword flag");
767 (void)CPlusPlusOperatorKeyword;
768
769 // If this identifier is a macro, deserialize the macro
770 // definition.
771 if (hadMacroDefinition) {
Stephen Hines651f13c2014-04-23 16:59:28 -0700772 uint32_t MacroDirectivesOffset =
773 endian::readNext<uint32_t, little, unaligned>(d);
Argyrios Kyrtzidis9317ab92013-03-22 21:12:57 +0000774 DataLen -= 4;
775 SmallVector<uint32_t, 8> LocalMacroIDs;
776 if (hasSubmoduleMacros) {
Stephen Hines651f13c2014-04-23 16:59:28 -0700777 while (uint32_t LocalMacroID =
778 endian::readNext<uint32_t, little, unaligned>(d)) {
Argyrios Kyrtzidis9317ab92013-03-22 21:12:57 +0000779 DataLen -= 4;
780 LocalMacroIDs.push_back(LocalMacroID);
781 }
Argyrios Kyrtzidisdc1088f2013-01-19 03:14:56 +0000782 DataLen -= 4;
783 }
Argyrios Kyrtzidis9317ab92013-03-22 21:12:57 +0000784
785 if (F.Kind == MK_Module) {
Stephen Hines651f13c2014-04-23 16:59:28 -0700786 // Macro definitions are stored from newest to oldest, so reverse them
787 // before registering them.
788 llvm::SmallVector<unsigned, 8> MacroSizes;
Argyrios Kyrtzidis9317ab92013-03-22 21:12:57 +0000789 for (SmallVectorImpl<uint32_t>::iterator
Stephen Hines651f13c2014-04-23 16:59:28 -0700790 I = LocalMacroIDs.begin(), E = LocalMacroIDs.end(); I != E; /**/) {
791 unsigned Size = 1;
792
793 static const uint32_t HasOverridesFlag = 0x80000000U;
794 if (I + 1 != E && (I[1] & HasOverridesFlag))
795 Size += 1 + (I[1] & ~HasOverridesFlag);
796
797 MacroSizes.push_back(Size);
798 I += Size;
Argyrios Kyrtzidis9317ab92013-03-22 21:12:57 +0000799 }
Stephen Hines651f13c2014-04-23 16:59:28 -0700800
801 SmallVectorImpl<uint32_t>::iterator I = LocalMacroIDs.end();
802 for (SmallVectorImpl<unsigned>::reverse_iterator SI = MacroSizes.rbegin(),
803 SE = MacroSizes.rend();
804 SI != SE; ++SI) {
805 I -= *SI;
806
807 uint32_t LocalMacroID = *I;
Stephen Hinesc568f1e2014-07-21 00:47:37 -0700808 ArrayRef<uint32_t> Overrides;
Stephen Hines651f13c2014-04-23 16:59:28 -0700809 if (*SI != 1)
810 Overrides = llvm::makeArrayRef(&I[2], *SI - 2);
811 Reader.addPendingMacroFromModule(II, &F, LocalMacroID, Overrides);
812 }
813 assert(I == LocalMacroIDs.begin());
Argyrios Kyrtzidis9317ab92013-03-22 21:12:57 +0000814 } else {
815 Reader.addPendingMacroFromPCH(II, &F, MacroDirectivesOffset);
816 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000817 }
818
819 Reader.SetIdentifierInfo(ID, II);
820
821 // Read all of the declarations visible at global scope with this
822 // name.
823 if (DataLen > 0) {
824 SmallVector<uint32_t, 4> DeclIDs;
825 for (; DataLen > 0; DataLen -= 4)
Stephen Hines651f13c2014-04-23 16:59:28 -0700826 DeclIDs.push_back(Reader.getGlobalDeclID(
827 F, endian::readNext<uint32_t, little, unaligned>(d)));
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000828 Reader.SetGloballyVisibleDecls(II, DeclIDs);
829 }
830
831 return II;
832}
833
834unsigned
835ASTDeclContextNameLookupTrait::ComputeHash(const DeclNameKey &Key) const {
836 llvm::FoldingSetNodeID ID;
837 ID.AddInteger(Key.Kind);
838
839 switch (Key.Kind) {
840 case DeclarationName::Identifier:
841 case DeclarationName::CXXLiteralOperatorName:
842 ID.AddString(((IdentifierInfo*)Key.Data)->getName());
843 break;
844 case DeclarationName::ObjCZeroArgSelector:
845 case DeclarationName::ObjCOneArgSelector:
846 case DeclarationName::ObjCMultiArgSelector:
847 ID.AddInteger(serialization::ComputeHash(Selector(Key.Data)));
848 break;
849 case DeclarationName::CXXOperatorName:
850 ID.AddInteger((OverloadedOperatorKind)Key.Data);
851 break;
852 case DeclarationName::CXXConstructorName:
853 case DeclarationName::CXXDestructorName:
854 case DeclarationName::CXXConversionFunctionName:
855 case DeclarationName::CXXUsingDirective:
856 break;
857 }
858
859 return ID.ComputeHash();
860}
861
862ASTDeclContextNameLookupTrait::internal_key_type
863ASTDeclContextNameLookupTrait::GetInternalKey(
864 const external_key_type& Name) const {
865 DeclNameKey Key;
866 Key.Kind = Name.getNameKind();
867 switch (Name.getNameKind()) {
868 case DeclarationName::Identifier:
869 Key.Data = (uint64_t)Name.getAsIdentifierInfo();
870 break;
871 case DeclarationName::ObjCZeroArgSelector:
872 case DeclarationName::ObjCOneArgSelector:
873 case DeclarationName::ObjCMultiArgSelector:
874 Key.Data = (uint64_t)Name.getObjCSelector().getAsOpaquePtr();
875 break;
876 case DeclarationName::CXXOperatorName:
877 Key.Data = Name.getCXXOverloadedOperator();
878 break;
879 case DeclarationName::CXXLiteralOperatorName:
880 Key.Data = (uint64_t)Name.getCXXLiteralIdentifier();
881 break;
882 case DeclarationName::CXXConstructorName:
883 case DeclarationName::CXXDestructorName:
884 case DeclarationName::CXXConversionFunctionName:
885 case DeclarationName::CXXUsingDirective:
886 Key.Data = 0;
887 break;
888 }
889
890 return Key;
891}
892
893std::pair<unsigned, unsigned>
894ASTDeclContextNameLookupTrait::ReadKeyDataLength(const unsigned char*& d) {
Stephen Hines651f13c2014-04-23 16:59:28 -0700895 using namespace llvm::support;
896 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
897 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000898 return std::make_pair(KeyLen, DataLen);
899}
900
901ASTDeclContextNameLookupTrait::internal_key_type
902ASTDeclContextNameLookupTrait::ReadKey(const unsigned char* d, unsigned) {
Stephen Hines651f13c2014-04-23 16:59:28 -0700903 using namespace llvm::support;
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000904
905 DeclNameKey Key;
906 Key.Kind = (DeclarationName::NameKind)*d++;
907 switch (Key.Kind) {
908 case DeclarationName::Identifier:
Stephen Hines651f13c2014-04-23 16:59:28 -0700909 Key.Data = (uint64_t)Reader.getLocalIdentifier(
910 F, endian::readNext<uint32_t, little, unaligned>(d));
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000911 break;
912 case DeclarationName::ObjCZeroArgSelector:
913 case DeclarationName::ObjCOneArgSelector:
914 case DeclarationName::ObjCMultiArgSelector:
915 Key.Data =
Stephen Hines651f13c2014-04-23 16:59:28 -0700916 (uint64_t)Reader.getLocalSelector(
917 F, endian::readNext<uint32_t, little, unaligned>(
918 d)).getAsOpaquePtr();
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000919 break;
920 case DeclarationName::CXXOperatorName:
921 Key.Data = *d++; // OverloadedOperatorKind
922 break;
923 case DeclarationName::CXXLiteralOperatorName:
Stephen Hines651f13c2014-04-23 16:59:28 -0700924 Key.Data = (uint64_t)Reader.getLocalIdentifier(
925 F, endian::readNext<uint32_t, little, unaligned>(d));
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000926 break;
927 case DeclarationName::CXXConstructorName:
928 case DeclarationName::CXXDestructorName:
929 case DeclarationName::CXXConversionFunctionName:
930 case DeclarationName::CXXUsingDirective:
931 Key.Data = 0;
932 break;
933 }
934
935 return Key;
936}
937
938ASTDeclContextNameLookupTrait::data_type
939ASTDeclContextNameLookupTrait::ReadData(internal_key_type,
940 const unsigned char* d,
941 unsigned DataLen) {
Stephen Hines651f13c2014-04-23 16:59:28 -0700942 using namespace llvm::support;
943 unsigned NumDecls = endian::readNext<uint16_t, little, unaligned>(d);
Argyrios Kyrtzidise8b61cf2013-01-11 22:29:49 +0000944 LE32DeclID *Start = reinterpret_cast<LE32DeclID *>(
945 const_cast<unsigned char *>(d));
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000946 return std::make_pair(Start, Start + NumDecls);
947}
948
949bool ASTReader::ReadDeclContextStorage(ModuleFile &M,
Chris Lattner8f9a1eb2013-01-20 00:56:42 +0000950 BitstreamCursor &Cursor,
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000951 const std::pair<uint64_t, uint64_t> &Offsets,
952 DeclContextInfo &Info) {
953 SavedStreamPosition SavedPosition(Cursor);
954 // First the lexical decls.
955 if (Offsets.first != 0) {
956 Cursor.JumpToBit(Offsets.first);
957
958 RecordData Record;
Chris Lattnerb3ce3572013-01-20 02:38:54 +0000959 StringRef Blob;
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000960 unsigned Code = Cursor.ReadCode();
Chris Lattnerb3ce3572013-01-20 02:38:54 +0000961 unsigned RecCode = Cursor.readRecord(Code, Record, &Blob);
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000962 if (RecCode != DECL_CONTEXT_LEXICAL) {
963 Error("Expected lexical block");
964 return true;
965 }
966
Chris Lattnerb3ce3572013-01-20 02:38:54 +0000967 Info.LexicalDecls = reinterpret_cast<const KindDeclIDPair*>(Blob.data());
968 Info.NumLexicalDecls = Blob.size() / sizeof(KindDeclIDPair);
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000969 }
970
971 // Now the lookup table.
972 if (Offsets.second != 0) {
973 Cursor.JumpToBit(Offsets.second);
974
975 RecordData Record;
Chris Lattnerb3ce3572013-01-20 02:38:54 +0000976 StringRef Blob;
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000977 unsigned Code = Cursor.ReadCode();
Chris Lattnerb3ce3572013-01-20 02:38:54 +0000978 unsigned RecCode = Cursor.readRecord(Code, Record, &Blob);
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000979 if (RecCode != DECL_CONTEXT_VISIBLE) {
980 Error("Expected visible lookup table block");
981 return true;
982 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700983 Info.NameLookupTableData = ASTDeclContextNameLookupTable::Create(
984 (const unsigned char *)Blob.data() + Record[0],
985 (const unsigned char *)Blob.data() + sizeof(uint32_t),
986 (const unsigned char *)Blob.data(),
987 ASTDeclContextNameLookupTrait(*this, M));
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000988 }
989
990 return false;
991}
992
993void ASTReader::Error(StringRef Msg) {
994 Error(diag::err_fe_pch_malformed, Msg);
Douglas Gregorc1478612013-05-10 22:15:13 +0000995 if (Context.getLangOpts().Modules && !Diags.isDiagnosticInFlight()) {
996 Diag(diag::note_module_cache_path)
997 << PP.getHeaderSearchInfo().getModuleCachePath();
998 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000999}
1000
1001void ASTReader::Error(unsigned DiagID,
1002 StringRef Arg1, StringRef Arg2) {
1003 if (Diags.isDiagnosticInFlight())
1004 Diags.SetDelayedDiagnostic(DiagID, Arg1, Arg2);
1005 else
1006 Diag(DiagID) << Arg1 << Arg2;
1007}
1008
1009//===----------------------------------------------------------------------===//
1010// Source Manager Deserialization
1011//===----------------------------------------------------------------------===//
1012
1013/// \brief Read the line table in the source manager block.
1014/// \returns true if there was an error.
1015bool ASTReader::ParseLineTable(ModuleFile &F,
1016 SmallVectorImpl<uint64_t> &Record) {
1017 unsigned Idx = 0;
1018 LineTableInfo &LineTable = SourceMgr.getLineTable();
1019
1020 // Parse the file names
1021 std::map<int, int> FileIDs;
1022 for (int I = 0, N = Record[Idx++]; I != N; ++I) {
1023 // Extract the file name
1024 unsigned FilenameLen = Record[Idx++];
1025 std::string Filename(&Record[Idx], &Record[Idx] + FilenameLen);
1026 Idx += FilenameLen;
1027 MaybeAddSystemRootToFilename(F, Filename);
1028 FileIDs[I] = LineTable.getLineTableFilenameID(Filename);
1029 }
1030
1031 // Parse the line entries
1032 std::vector<LineEntry> Entries;
1033 while (Idx < Record.size()) {
1034 int FID = Record[Idx++];
1035 assert(FID >= 0 && "Serialized line entries for non-local file.");
1036 // Remap FileID from 1-based old view.
1037 FID += F.SLocEntryBaseID - 1;
1038
1039 // Extract the line entries
1040 unsigned NumEntries = Record[Idx++];
1041 assert(NumEntries && "Numentries is 00000");
1042 Entries.clear();
1043 Entries.reserve(NumEntries);
1044 for (unsigned I = 0; I != NumEntries; ++I) {
1045 unsigned FileOffset = Record[Idx++];
1046 unsigned LineNo = Record[Idx++];
1047 int FilenameID = FileIDs[Record[Idx++]];
1048 SrcMgr::CharacteristicKind FileKind
1049 = (SrcMgr::CharacteristicKind)Record[Idx++];
1050 unsigned IncludeOffset = Record[Idx++];
1051 Entries.push_back(LineEntry::get(FileOffset, LineNo, FilenameID,
1052 FileKind, IncludeOffset));
1053 }
1054 LineTable.AddEntry(FileID::get(FID), Entries);
1055 }
1056
1057 return false;
1058}
1059
1060/// \brief Read a source manager block
1061bool ASTReader::ReadSourceManagerBlock(ModuleFile &F) {
1062 using namespace SrcMgr;
1063
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00001064 BitstreamCursor &SLocEntryCursor = F.SLocEntryCursor;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001065
1066 // Set the source-location entry cursor to the current position in
1067 // the stream. This cursor will be used to read the contents of the
1068 // source manager block initially, and then lazily read
1069 // source-location entries as needed.
1070 SLocEntryCursor = F.Stream;
1071
1072 // The stream itself is going to skip over the source manager block.
1073 if (F.Stream.SkipBlock()) {
1074 Error("malformed block record in AST file");
1075 return true;
1076 }
1077
1078 // Enter the source manager block.
1079 if (SLocEntryCursor.EnterSubBlock(SOURCE_MANAGER_BLOCK_ID)) {
1080 Error("malformed source manager block record in AST file");
1081 return true;
1082 }
1083
1084 RecordData Record;
1085 while (true) {
Chris Lattner88bde502013-01-19 21:39:22 +00001086 llvm::BitstreamEntry E = SLocEntryCursor.advanceSkippingSubblocks();
1087
1088 switch (E.Kind) {
1089 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1090 case llvm::BitstreamEntry::Error:
1091 Error("malformed block record in AST file");
1092 return true;
1093 case llvm::BitstreamEntry::EndBlock:
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001094 return false;
Chris Lattner88bde502013-01-19 21:39:22 +00001095 case llvm::BitstreamEntry::Record:
1096 // The interesting case.
1097 break;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001098 }
Chris Lattner88bde502013-01-19 21:39:22 +00001099
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001100 // Read a record.
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001101 Record.clear();
Chris Lattner125eb3e2013-01-21 18:28:26 +00001102 StringRef Blob;
1103 switch (SLocEntryCursor.readRecord(E.ID, Record, &Blob)) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001104 default: // Default behavior: ignore.
1105 break;
1106
1107 case SM_SLOC_FILE_ENTRY:
1108 case SM_SLOC_BUFFER_ENTRY:
1109 case SM_SLOC_EXPANSION_ENTRY:
1110 // Once we hit one of the source location entries, we're done.
1111 return false;
1112 }
1113 }
1114}
1115
1116/// \brief If a header file is not found at the path that we expect it to be
1117/// and the PCH file was moved from its original location, try to resolve the
1118/// file by assuming that header+PCH were moved together and the header is in
1119/// the same place relative to the PCH.
1120static std::string
1121resolveFileRelativeToOriginalDir(const std::string &Filename,
1122 const std::string &OriginalDir,
1123 const std::string &CurrDir) {
1124 assert(OriginalDir != CurrDir &&
1125 "No point trying to resolve the file if the PCH dir didn't change");
1126 using namespace llvm::sys;
1127 SmallString<128> filePath(Filename);
1128 fs::make_absolute(filePath);
1129 assert(path::is_absolute(OriginalDir));
1130 SmallString<128> currPCHPath(CurrDir);
1131
1132 path::const_iterator fileDirI = path::begin(path::parent_path(filePath)),
1133 fileDirE = path::end(path::parent_path(filePath));
1134 path::const_iterator origDirI = path::begin(OriginalDir),
1135 origDirE = path::end(OriginalDir);
1136 // Skip the common path components from filePath and OriginalDir.
1137 while (fileDirI != fileDirE && origDirI != origDirE &&
1138 *fileDirI == *origDirI) {
1139 ++fileDirI;
1140 ++origDirI;
1141 }
1142 for (; origDirI != origDirE; ++origDirI)
1143 path::append(currPCHPath, "..");
1144 path::append(currPCHPath, fileDirI, fileDirE);
1145 path::append(currPCHPath, path::filename(Filename));
1146 return currPCHPath.str();
1147}
1148
1149bool ASTReader::ReadSLocEntry(int ID) {
1150 if (ID == 0)
1151 return false;
1152
1153 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1154 Error("source location entry ID out-of-range for AST file");
1155 return true;
1156 }
1157
1158 ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second;
1159 F->SLocEntryCursor.JumpToBit(F->SLocEntryOffsets[ID - F->SLocEntryBaseID]);
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00001160 BitstreamCursor &SLocEntryCursor = F->SLocEntryCursor;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001161 unsigned BaseOffset = F->SLocEntryBaseOffset;
1162
1163 ++NumSLocEntriesRead;
Chris Lattner88bde502013-01-19 21:39:22 +00001164 llvm::BitstreamEntry Entry = SLocEntryCursor.advance();
1165 if (Entry.Kind != llvm::BitstreamEntry::Record) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001166 Error("incorrectly-formatted source location entry in AST file");
1167 return true;
1168 }
Chris Lattner88bde502013-01-19 21:39:22 +00001169
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001170 RecordData Record;
Chris Lattnerb3ce3572013-01-20 02:38:54 +00001171 StringRef Blob;
1172 switch (SLocEntryCursor.readRecord(Entry.ID, Record, &Blob)) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001173 default:
1174 Error("incorrectly-formatted source location entry in AST file");
1175 return true;
1176
1177 case SM_SLOC_FILE_ENTRY: {
1178 // We will detect whether a file changed and return 'Failure' for it, but
1179 // we will also try to fail gracefully by setting up the SLocEntry.
1180 unsigned InputID = Record[4];
1181 InputFile IF = getInputFile(*F, InputID);
Argyrios Kyrtzidis8504b7b2013-03-01 03:26:04 +00001182 const FileEntry *File = IF.getFile();
1183 bool OverriddenBuffer = IF.isOverridden();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001184
Argyrios Kyrtzidis8504b7b2013-03-01 03:26:04 +00001185 // Note that we only check if a File was returned. If it was out-of-date
1186 // we have complained but we will continue creating a FileID to recover
1187 // gracefully.
1188 if (!File)
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001189 return true;
1190
1191 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
1192 if (IncludeLoc.isInvalid() && F->Kind != MK_MainFile) {
1193 // This is the module's main file.
1194 IncludeLoc = getImportLocation(F);
1195 }
1196 SrcMgr::CharacteristicKind
1197 FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
1198 FileID FID = SourceMgr.createFileID(File, IncludeLoc, FileCharacter,
1199 ID, BaseOffset + Record[0]);
1200 SrcMgr::FileInfo &FileInfo =
1201 const_cast<SrcMgr::FileInfo&>(SourceMgr.getSLocEntry(FID).getFile());
1202 FileInfo.NumCreatedFIDs = Record[5];
1203 if (Record[3])
1204 FileInfo.setHasLineDirectives();
1205
1206 const DeclID *FirstDecl = F->FileSortedDecls + Record[6];
1207 unsigned NumFileDecls = Record[7];
1208 if (NumFileDecls) {
1209 assert(F->FileSortedDecls && "FILE_SORTED_DECLS not encountered yet ?");
1210 FileDeclIDs[FID] = FileDeclsInfo(F, llvm::makeArrayRef(FirstDecl,
1211 NumFileDecls));
1212 }
1213
1214 const SrcMgr::ContentCache *ContentCache
1215 = SourceMgr.getOrCreateContentCache(File,
1216 /*isSystemFile=*/FileCharacter != SrcMgr::C_User);
1217 if (OverriddenBuffer && !ContentCache->BufferOverridden &&
1218 ContentCache->ContentsEntry == ContentCache->OrigEntry) {
1219 unsigned Code = SLocEntryCursor.ReadCode();
1220 Record.clear();
Chris Lattnerb3ce3572013-01-20 02:38:54 +00001221 unsigned RecCode = SLocEntryCursor.readRecord(Code, Record, &Blob);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001222
1223 if (RecCode != SM_SLOC_BUFFER_BLOB) {
1224 Error("AST record has invalid code");
1225 return true;
1226 }
1227
1228 llvm::MemoryBuffer *Buffer
Chris Lattnerb3ce3572013-01-20 02:38:54 +00001229 = llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), File->getName());
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001230 SourceMgr.overrideFileContents(File, Buffer);
1231 }
1232
1233 break;
1234 }
1235
1236 case SM_SLOC_BUFFER_ENTRY: {
Chris Lattnerb3ce3572013-01-20 02:38:54 +00001237 const char *Name = Blob.data();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001238 unsigned Offset = Record[0];
1239 SrcMgr::CharacteristicKind
1240 FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
1241 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
1242 if (IncludeLoc.isInvalid() && F->Kind == MK_Module) {
1243 IncludeLoc = getImportLocation(F);
1244 }
1245 unsigned Code = SLocEntryCursor.ReadCode();
1246 Record.clear();
1247 unsigned RecCode
Chris Lattnerb3ce3572013-01-20 02:38:54 +00001248 = SLocEntryCursor.readRecord(Code, Record, &Blob);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001249
1250 if (RecCode != SM_SLOC_BUFFER_BLOB) {
1251 Error("AST record has invalid code");
1252 return true;
1253 }
1254
1255 llvm::MemoryBuffer *Buffer
Chris Lattnerb3ce3572013-01-20 02:38:54 +00001256 = llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name);
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001257 SourceMgr.createFileID(Buffer, FileCharacter, ID, BaseOffset + Offset,
1258 IncludeLoc);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001259 break;
1260 }
1261
1262 case SM_SLOC_EXPANSION_ENTRY: {
1263 SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1]);
1264 SourceMgr.createExpansionLoc(SpellingLoc,
1265 ReadSourceLocation(*F, Record[2]),
1266 ReadSourceLocation(*F, Record[3]),
1267 Record[4],
1268 ID,
1269 BaseOffset + Record[0]);
1270 break;
1271 }
1272 }
1273
1274 return false;
1275}
1276
1277std::pair<SourceLocation, StringRef> ASTReader::getModuleImportLoc(int ID) {
1278 if (ID == 0)
1279 return std::make_pair(SourceLocation(), "");
1280
1281 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1282 Error("source location entry ID out-of-range for AST file");
1283 return std::make_pair(SourceLocation(), "");
1284 }
1285
1286 // Find which module file this entry lands in.
1287 ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second;
1288 if (M->Kind != MK_Module)
1289 return std::make_pair(SourceLocation(), "");
1290
1291 // FIXME: Can we map this down to a particular submodule? That would be
1292 // ideal.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001293 return std::make_pair(M->ImportLoc, StringRef(M->ModuleName));
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001294}
1295
1296/// \brief Find the location where the module F is imported.
1297SourceLocation ASTReader::getImportLocation(ModuleFile *F) {
1298 if (F->ImportLoc.isValid())
1299 return F->ImportLoc;
1300
1301 // Otherwise we have a PCH. It's considered to be "imported" at the first
1302 // location of its includer.
1303 if (F->ImportedBy.empty() || !F->ImportedBy[0]) {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001304 // Main file is the importer.
1305 assert(!SourceMgr.getMainFileID().isInvalid() && "missing main file");
1306 return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID());
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001307 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001308 return F->ImportedBy[0]->FirstLoc;
1309}
1310
1311/// ReadBlockAbbrevs - Enter a subblock of the specified BlockID with the
1312/// specified cursor. Read the abbreviations that are at the top of the block
1313/// and then leave the cursor pointing into the block.
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00001314bool ASTReader::ReadBlockAbbrevs(BitstreamCursor &Cursor, unsigned BlockID) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001315 if (Cursor.EnterSubBlock(BlockID)) {
1316 Error("malformed block record in AST file");
1317 return Failure;
1318 }
1319
1320 while (true) {
1321 uint64_t Offset = Cursor.GetCurrentBitNo();
1322 unsigned Code = Cursor.ReadCode();
1323
1324 // We expect all abbrevs to be at the start of the block.
1325 if (Code != llvm::bitc::DEFINE_ABBREV) {
1326 Cursor.JumpToBit(Offset);
1327 return false;
1328 }
1329 Cursor.ReadAbbrevRecord();
1330 }
1331}
1332
Richard Smithac32d902013-08-07 21:41:30 +00001333Token ASTReader::ReadToken(ModuleFile &F, const RecordDataImpl &Record,
John McCallaeeacf72013-05-03 00:10:13 +00001334 unsigned &Idx) {
1335 Token Tok;
1336 Tok.startToken();
1337 Tok.setLocation(ReadSourceLocation(F, Record, Idx));
1338 Tok.setLength(Record[Idx++]);
1339 if (IdentifierInfo *II = getLocalIdentifier(F, Record[Idx++]))
1340 Tok.setIdentifierInfo(II);
1341 Tok.setKind((tok::TokenKind)Record[Idx++]);
1342 Tok.setFlag((Token::TokenFlags)Record[Idx++]);
1343 return Tok;
1344}
1345
Argyrios Kyrtzidis9317ab92013-03-22 21:12:57 +00001346MacroInfo *ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) {
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00001347 BitstreamCursor &Stream = F.MacroCursor;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001348
1349 // Keep track of where we are in the stream, then jump back there
1350 // after reading this macro.
1351 SavedStreamPosition SavedPosition(Stream);
1352
1353 Stream.JumpToBit(Offset);
1354 RecordData Record;
1355 SmallVector<IdentifierInfo*, 16> MacroArgs;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001356 MacroInfo *Macro = nullptr;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001357
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001358 while (true) {
Chris Lattner99a5af02013-01-20 00:00:22 +00001359 // Advance to the next record, but if we get to the end of the block, don't
1360 // pop it (removing all the abbreviations from the cursor) since we want to
1361 // be able to reseek within the block and read entries.
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00001362 unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd;
Chris Lattner99a5af02013-01-20 00:00:22 +00001363 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks(Flags);
1364
1365 switch (Entry.Kind) {
1366 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1367 case llvm::BitstreamEntry::Error:
1368 Error("malformed block record in AST file");
Argyrios Kyrtzidis9317ab92013-03-22 21:12:57 +00001369 return Macro;
Chris Lattner99a5af02013-01-20 00:00:22 +00001370 case llvm::BitstreamEntry::EndBlock:
Argyrios Kyrtzidis9317ab92013-03-22 21:12:57 +00001371 return Macro;
Chris Lattner99a5af02013-01-20 00:00:22 +00001372 case llvm::BitstreamEntry::Record:
1373 // The interesting case.
1374 break;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001375 }
1376
1377 // Read a record.
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001378 Record.clear();
1379 PreprocessorRecordTypes RecType =
Chris Lattnerb3ce3572013-01-20 02:38:54 +00001380 (PreprocessorRecordTypes)Stream.readRecord(Entry.ID, Record);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001381 switch (RecType) {
Argyrios Kyrtzidis9317ab92013-03-22 21:12:57 +00001382 case PP_MACRO_DIRECTIVE_HISTORY:
1383 return Macro;
1384
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001385 case PP_MACRO_OBJECT_LIKE:
1386 case PP_MACRO_FUNCTION_LIKE: {
1387 // If we already have a macro, that means that we've hit the end
1388 // of the definition of the macro we were looking for. We're
1389 // done.
1390 if (Macro)
Argyrios Kyrtzidis9317ab92013-03-22 21:12:57 +00001391 return Macro;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001392
Argyrios Kyrtzidis9317ab92013-03-22 21:12:57 +00001393 unsigned NextIndex = 1; // Skip identifier ID.
1394 SubmoduleID SubModID = getGlobalSubmoduleID(F, Record[NextIndex++]);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001395 SourceLocation Loc = ReadSourceLocation(F, Record, NextIndex);
Argyrios Kyrtzidis9317ab92013-03-22 21:12:57 +00001396 MacroInfo *MI = PP.AllocateDeserializedMacroInfo(Loc, SubModID);
Argyrios Kyrtzidis8169b672013-01-07 19:16:23 +00001397 MI->setDefinitionEndLoc(ReadSourceLocation(F, Record, NextIndex));
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001398 MI->setIsUsed(Record[NextIndex++]);
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001399 MI->setUsedForHeaderGuard(Record[NextIndex++]);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001400
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001401 if (RecType == PP_MACRO_FUNCTION_LIKE) {
1402 // Decode function-like macro info.
1403 bool isC99VarArgs = Record[NextIndex++];
1404 bool isGNUVarArgs = Record[NextIndex++];
1405 bool hasCommaPasting = Record[NextIndex++];
1406 MacroArgs.clear();
1407 unsigned NumArgs = Record[NextIndex++];
1408 for (unsigned i = 0; i != NumArgs; ++i)
1409 MacroArgs.push_back(getLocalIdentifier(F, Record[NextIndex++]));
1410
1411 // Install function-like macro info.
1412 MI->setIsFunctionLike();
1413 if (isC99VarArgs) MI->setIsC99Varargs();
1414 if (isGNUVarArgs) MI->setIsGNUVarargs();
1415 if (hasCommaPasting) MI->setHasCommaPasting();
1416 MI->setArgumentList(MacroArgs.data(), MacroArgs.size(),
1417 PP.getPreprocessorAllocator());
1418 }
1419
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001420 // Remember that we saw this macro last so that we add the tokens that
1421 // form its body to it.
1422 Macro = MI;
1423
1424 if (NextIndex + 1 == Record.size() && PP.getPreprocessingRecord() &&
1425 Record[NextIndex]) {
1426 // We have a macro definition. Register the association
1427 PreprocessedEntityID
1428 GlobalID = getGlobalPreprocessedEntityID(F, Record[NextIndex]);
1429 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
Argyrios Kyrtzidis0b849d32013-02-22 18:35:59 +00001430 PreprocessingRecord::PPEntityID
1431 PPID = PPRec.getPPEntityID(GlobalID-1, /*isLoaded=*/true);
1432 MacroDefinition *PPDef =
1433 cast_or_null<MacroDefinition>(PPRec.getPreprocessedEntity(PPID));
1434 if (PPDef)
1435 PPRec.RegisterMacroDefinition(Macro, PPDef);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001436 }
1437
1438 ++NumMacrosRead;
1439 break;
1440 }
1441
1442 case PP_TOKEN: {
1443 // If we see a TOKEN before a PP_MACRO_*, then the file is
1444 // erroneous, just pretend we didn't see this.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001445 if (!Macro) break;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001446
John McCallaeeacf72013-05-03 00:10:13 +00001447 unsigned Idx = 0;
1448 Token Tok = ReadToken(F, Record, Idx);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001449 Macro->AddTokenToBody(Tok);
1450 break;
1451 }
1452 }
1453 }
1454}
1455
1456PreprocessedEntityID
1457ASTReader::getGlobalPreprocessedEntityID(ModuleFile &M, unsigned LocalID) const {
1458 ContinuousRangeMap<uint32_t, int, 2>::const_iterator
1459 I = M.PreprocessedEntityRemap.find(LocalID - NUM_PREDEF_PP_ENTITY_IDS);
1460 assert(I != M.PreprocessedEntityRemap.end()
1461 && "Invalid index into preprocessed entity index remap");
1462
1463 return LocalID + I->second;
1464}
1465
Argyrios Kyrtzidised3802e2013-03-06 18:12:47 +00001466unsigned HeaderFileInfoTrait::ComputeHash(internal_key_ref ikey) {
1467 return llvm::hash_combine(ikey.Size, ikey.ModTime);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001468}
1469
1470HeaderFileInfoTrait::internal_key_type
Argyrios Kyrtzidised3802e2013-03-06 18:12:47 +00001471HeaderFileInfoTrait::GetInternalKey(const FileEntry *FE) {
1472 internal_key_type ikey = { FE->getSize(), FE->getModificationTime(),
1473 FE->getName() };
1474 return ikey;
1475}
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001476
Argyrios Kyrtzidised3802e2013-03-06 18:12:47 +00001477bool HeaderFileInfoTrait::EqualKey(internal_key_ref a, internal_key_ref b) {
1478 if (a.Size != b.Size || a.ModTime != b.ModTime)
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001479 return false;
1480
Argyrios Kyrtzidised3802e2013-03-06 18:12:47 +00001481 if (strcmp(a.Filename, b.Filename) == 0)
1482 return true;
1483
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001484 // Determine whether the actual files are equivalent.
Argyrios Kyrtzidis1c1508b2013-03-04 20:33:40 +00001485 FileManager &FileMgr = Reader.getFileManager();
Argyrios Kyrtzidised3802e2013-03-06 18:12:47 +00001486 const FileEntry *FEA = FileMgr.getFile(a.Filename);
1487 const FileEntry *FEB = FileMgr.getFile(b.Filename);
Argyrios Kyrtzidis1c1508b2013-03-04 20:33:40 +00001488 return (FEA && FEA == FEB);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001489}
1490
1491std::pair<unsigned, unsigned>
1492HeaderFileInfoTrait::ReadKeyDataLength(const unsigned char*& d) {
Stephen Hines651f13c2014-04-23 16:59:28 -07001493 using namespace llvm::support;
1494 unsigned KeyLen = (unsigned) endian::readNext<uint16_t, little, unaligned>(d);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001495 unsigned DataLen = (unsigned) *d++;
Argyrios Kyrtzidised3802e2013-03-06 18:12:47 +00001496 return std::make_pair(KeyLen, DataLen);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001497}
Argyrios Kyrtzidised3802e2013-03-06 18:12:47 +00001498
1499HeaderFileInfoTrait::internal_key_type
1500HeaderFileInfoTrait::ReadKey(const unsigned char *d, unsigned) {
Stephen Hines651f13c2014-04-23 16:59:28 -07001501 using namespace llvm::support;
Argyrios Kyrtzidised3802e2013-03-06 18:12:47 +00001502 internal_key_type ikey;
Stephen Hines651f13c2014-04-23 16:59:28 -07001503 ikey.Size = off_t(endian::readNext<uint64_t, little, unaligned>(d));
1504 ikey.ModTime = time_t(endian::readNext<uint64_t, little, unaligned>(d));
Argyrios Kyrtzidised3802e2013-03-06 18:12:47 +00001505 ikey.Filename = (const char *)d;
1506 return ikey;
1507}
1508
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001509HeaderFileInfoTrait::data_type
Argyrios Kyrtzidis55ea75b2013-03-13 21:13:51 +00001510HeaderFileInfoTrait::ReadData(internal_key_ref key, const unsigned char *d,
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001511 unsigned DataLen) {
1512 const unsigned char *End = d + DataLen;
Stephen Hines651f13c2014-04-23 16:59:28 -07001513 using namespace llvm::support;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001514 HeaderFileInfo HFI;
1515 unsigned Flags = *d++;
Lawrence Crowlbc3f6282013-06-20 21:14:14 +00001516 HFI.HeaderRole = static_cast<ModuleMap::ModuleHeaderRole>
1517 ((Flags >> 6) & 0x03);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001518 HFI.isImport = (Flags >> 5) & 0x01;
1519 HFI.isPragmaOnce = (Flags >> 4) & 0x01;
1520 HFI.DirInfo = (Flags >> 2) & 0x03;
1521 HFI.Resolved = (Flags >> 1) & 0x01;
1522 HFI.IndexHeaderMapHeader = Flags & 0x01;
Stephen Hines651f13c2014-04-23 16:59:28 -07001523 HFI.NumIncludes = endian::readNext<uint16_t, little, unaligned>(d);
1524 HFI.ControllingMacroID = Reader.getGlobalIdentifierID(
1525 M, endian::readNext<uint32_t, little, unaligned>(d));
1526 if (unsigned FrameworkOffset =
1527 endian::readNext<uint32_t, little, unaligned>(d)) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001528 // The framework offset is 1 greater than the actual offset,
1529 // since 0 is used as an indicator for "no framework name".
1530 StringRef FrameworkName(FrameworkStrings + FrameworkOffset - 1);
1531 HFI.Framework = HS->getUniqueFrameworkName(FrameworkName);
1532 }
1533
Argyrios Kyrtzidis55ea75b2013-03-13 21:13:51 +00001534 if (d != End) {
Stephen Hines651f13c2014-04-23 16:59:28 -07001535 uint32_t LocalSMID = endian::readNext<uint32_t, little, unaligned>(d);
Argyrios Kyrtzidis55ea75b2013-03-13 21:13:51 +00001536 if (LocalSMID) {
1537 // This header is part of a module. Associate it with the module to enable
1538 // implicit module import.
1539 SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID);
1540 Module *Mod = Reader.getSubmodule(GlobalSMID);
1541 HFI.isModuleHeader = true;
1542 FileManager &FileMgr = Reader.getFileManager();
1543 ModuleMap &ModMap =
1544 Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap();
Lawrence Crowlbc3f6282013-06-20 21:14:14 +00001545 ModMap.addHeader(Mod, FileMgr.getFile(key.Filename), HFI.getHeaderRole());
Argyrios Kyrtzidis55ea75b2013-03-13 21:13:51 +00001546 }
1547 }
1548
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001549 assert(End == d && "Wrong data length in HeaderFileInfo deserialization");
1550 (void)End;
1551
1552 // This HeaderFileInfo was externally loaded.
1553 HFI.External = true;
1554 return HFI;
1555}
1556
Stephen Hines651f13c2014-04-23 16:59:28 -07001557void
1558ASTReader::addPendingMacroFromModule(IdentifierInfo *II, ModuleFile *M,
1559 GlobalMacroID GMacID,
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001560 ArrayRef<SubmoduleID> Overrides) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001561 assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001562 SubmoduleID *OverrideData = nullptr;
Stephen Hines651f13c2014-04-23 16:59:28 -07001563 if (!Overrides.empty()) {
1564 OverrideData = new (Context) SubmoduleID[Overrides.size() + 1];
1565 OverrideData[0] = Overrides.size();
1566 for (unsigned I = 0; I != Overrides.size(); ++I)
1567 OverrideData[I + 1] = getGlobalSubmoduleID(*M, Overrides[I]);
1568 }
1569 PendingMacroIDs[II].push_back(PendingMacroInfo(M, GMacID, OverrideData));
Argyrios Kyrtzidis9317ab92013-03-22 21:12:57 +00001570}
1571
1572void ASTReader::addPendingMacroFromPCH(IdentifierInfo *II,
1573 ModuleFile *M,
1574 uint64_t MacroDirectivesOffset) {
1575 assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard");
1576 PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset));
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001577}
1578
1579void ASTReader::ReadDefinedMacros() {
1580 // Note that we are loading defined macros.
1581 Deserializing Macros(this);
1582
1583 for (ModuleReverseIterator I = ModuleMgr.rbegin(),
1584 E = ModuleMgr.rend(); I != E; ++I) {
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00001585 BitstreamCursor &MacroCursor = (*I)->MacroCursor;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001586
1587 // If there was no preprocessor block, skip this file.
1588 if (!MacroCursor.getBitStreamReader())
1589 continue;
1590
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00001591 BitstreamCursor Cursor = MacroCursor;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001592 Cursor.JumpToBit((*I)->MacroStartOffset);
1593
1594 RecordData Record;
1595 while (true) {
Chris Lattner88bde502013-01-19 21:39:22 +00001596 llvm::BitstreamEntry E = Cursor.advanceSkippingSubblocks();
1597
1598 switch (E.Kind) {
1599 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1600 case llvm::BitstreamEntry::Error:
1601 Error("malformed block record in AST file");
1602 return;
1603 case llvm::BitstreamEntry::EndBlock:
1604 goto NextCursor;
1605
1606 case llvm::BitstreamEntry::Record:
Chris Lattner88bde502013-01-19 21:39:22 +00001607 Record.clear();
Chris Lattnerb3ce3572013-01-20 02:38:54 +00001608 switch (Cursor.readRecord(E.ID, Record)) {
Chris Lattner88bde502013-01-19 21:39:22 +00001609 default: // Default behavior: ignore.
1610 break;
1611
1612 case PP_MACRO_OBJECT_LIKE:
1613 case PP_MACRO_FUNCTION_LIKE:
1614 getLocalIdentifier(**I, Record[0]);
1615 break;
1616
1617 case PP_TOKEN:
1618 // Ignore tokens.
1619 break;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001620 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001621 break;
1622 }
1623 }
Chris Lattner88bde502013-01-19 21:39:22 +00001624 NextCursor: ;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001625 }
1626}
1627
1628namespace {
1629 /// \brief Visitor class used to look up identifirs in an AST file.
1630 class IdentifierLookupVisitor {
1631 StringRef Name;
1632 unsigned PriorGeneration;
Douglas Gregore1698072013-01-25 00:38:33 +00001633 unsigned &NumIdentifierLookups;
1634 unsigned &NumIdentifierLookupHits;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001635 IdentifierInfo *Found;
Douglas Gregore1698072013-01-25 00:38:33 +00001636
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001637 public:
Douglas Gregore1698072013-01-25 00:38:33 +00001638 IdentifierLookupVisitor(StringRef Name, unsigned PriorGeneration,
1639 unsigned &NumIdentifierLookups,
1640 unsigned &NumIdentifierLookupHits)
Douglas Gregor188bdcd2013-01-25 23:32:03 +00001641 : Name(Name), PriorGeneration(PriorGeneration),
Douglas Gregore1698072013-01-25 00:38:33 +00001642 NumIdentifierLookups(NumIdentifierLookups),
1643 NumIdentifierLookupHits(NumIdentifierLookupHits),
1644 Found()
1645 {
1646 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001647
1648 static bool visit(ModuleFile &M, void *UserData) {
1649 IdentifierLookupVisitor *This
1650 = static_cast<IdentifierLookupVisitor *>(UserData);
1651
1652 // If we've already searched this module file, skip it now.
1653 if (M.Generation <= This->PriorGeneration)
1654 return true;
Douglas Gregor1a49d972013-01-25 01:03:03 +00001655
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001656 ASTIdentifierLookupTable *IdTable
1657 = (ASTIdentifierLookupTable *)M.IdentifierLookupTable;
1658 if (!IdTable)
1659 return false;
1660
1661 ASTIdentifierLookupTrait Trait(IdTable->getInfoObj().getReader(),
1662 M, This->Found);
Douglas Gregore1698072013-01-25 00:38:33 +00001663 ++This->NumIdentifierLookups;
1664 ASTIdentifierLookupTable::iterator Pos = IdTable->find(This->Name,&Trait);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001665 if (Pos == IdTable->end())
1666 return false;
1667
1668 // Dereferencing the iterator has the effect of building the
1669 // IdentifierInfo node and populating it with the various
1670 // declarations it needs.
Douglas Gregore1698072013-01-25 00:38:33 +00001671 ++This->NumIdentifierLookupHits;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001672 This->Found = *Pos;
1673 return true;
1674 }
1675
1676 // \brief Retrieve the identifier info found within the module
1677 // files.
1678 IdentifierInfo *getIdentifierInfo() const { return Found; }
1679 };
1680}
1681
1682void ASTReader::updateOutOfDateIdentifier(IdentifierInfo &II) {
1683 // Note that we are loading an identifier.
1684 Deserializing AnIdentifier(this);
1685
1686 unsigned PriorGeneration = 0;
1687 if (getContext().getLangOpts().Modules)
1688 PriorGeneration = IdentifierGeneration[&II];
Douglas Gregor1a49d972013-01-25 01:03:03 +00001689
1690 // If there is a global index, look there first to determine which modules
1691 // provably do not have any results for this identifier.
Douglas Gregor188bdcd2013-01-25 23:32:03 +00001692 GlobalModuleIndex::HitSet Hits;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001693 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
Douglas Gregor1a49d972013-01-25 01:03:03 +00001694 if (!loadGlobalIndex()) {
Douglas Gregor188bdcd2013-01-25 23:32:03 +00001695 if (GlobalIndex->lookupIdentifier(II.getName(), Hits)) {
1696 HitsPtr = &Hits;
Douglas Gregor1a49d972013-01-25 01:03:03 +00001697 }
1698 }
1699
Douglas Gregor188bdcd2013-01-25 23:32:03 +00001700 IdentifierLookupVisitor Visitor(II.getName(), PriorGeneration,
Douglas Gregore1698072013-01-25 00:38:33 +00001701 NumIdentifierLookups,
1702 NumIdentifierLookupHits);
Douglas Gregor188bdcd2013-01-25 23:32:03 +00001703 ModuleMgr.visit(IdentifierLookupVisitor::visit, &Visitor, HitsPtr);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001704 markIdentifierUpToDate(&II);
1705}
1706
1707void ASTReader::markIdentifierUpToDate(IdentifierInfo *II) {
1708 if (!II)
1709 return;
1710
1711 II->setOutOfDate(false);
1712
1713 // Update the generation for this identifier.
1714 if (getContext().getLangOpts().Modules)
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001715 IdentifierGeneration[II] = getGeneration();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001716}
1717
Stephen Hines651f13c2014-04-23 16:59:28 -07001718struct ASTReader::ModuleMacroInfo {
1719 SubmoduleID SubModID;
1720 MacroInfo *MI;
1721 SubmoduleID *Overrides;
1722 // FIXME: Remove this.
1723 ModuleFile *F;
1724
1725 bool isDefine() const { return MI; }
1726
1727 SubmoduleID getSubmoduleID() const { return SubModID; }
1728
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001729 ArrayRef<SubmoduleID> getOverriddenSubmodules() const {
Stephen Hines651f13c2014-04-23 16:59:28 -07001730 if (!Overrides)
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001731 return None;
Stephen Hines651f13c2014-04-23 16:59:28 -07001732 return llvm::makeArrayRef(Overrides + 1, *Overrides);
1733 }
1734
1735 DefMacroDirective *import(Preprocessor &PP, SourceLocation ImportLoc) const {
1736 if (!MI)
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001737 return nullptr;
Stephen Hines651f13c2014-04-23 16:59:28 -07001738 return PP.AllocateDefMacroDirective(MI, ImportLoc, /*isImported=*/true);
1739 }
1740};
1741
1742ASTReader::ModuleMacroInfo *
1743ASTReader::getModuleMacro(const PendingMacroInfo &PMInfo) {
1744 ModuleMacroInfo Info;
1745
1746 uint32_t ID = PMInfo.ModuleMacroData.MacID;
1747 if (ID & 1) {
1748 // Macro undefinition.
1749 Info.SubModID = getGlobalSubmoduleID(*PMInfo.M, ID >> 1);
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001750 Info.MI = nullptr;
Stephen Hines651f13c2014-04-23 16:59:28 -07001751 } else {
1752 // Macro definition.
1753 GlobalMacroID GMacID = getGlobalMacroID(*PMInfo.M, ID >> 1);
1754 assert(GMacID);
1755
1756 // If this macro has already been loaded, don't do so again.
1757 // FIXME: This is highly dubious. Multiple macro definitions can have the
1758 // same MacroInfo (and hence the same GMacID) due to #pragma push_macro etc.
1759 if (MacrosLoaded[GMacID - NUM_PREDEF_MACRO_IDS])
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001760 return nullptr;
Stephen Hines651f13c2014-04-23 16:59:28 -07001761
1762 Info.MI = getMacro(GMacID);
1763 Info.SubModID = Info.MI->getOwningModuleID();
1764 }
1765 Info.Overrides = PMInfo.ModuleMacroData.Overrides;
1766 Info.F = PMInfo.M;
1767
1768 return new (Context) ModuleMacroInfo(Info);
1769}
1770
Argyrios Kyrtzidis9317ab92013-03-22 21:12:57 +00001771void ASTReader::resolvePendingMacro(IdentifierInfo *II,
1772 const PendingMacroInfo &PMInfo) {
1773 assert(II);
1774
1775 if (PMInfo.M->Kind != MK_Module) {
1776 installPCHMacroDirectives(II, *PMInfo.M,
1777 PMInfo.PCHMacroData.MacroDirectivesOffset);
1778 return;
1779 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001780
Argyrios Kyrtzidis9317ab92013-03-22 21:12:57 +00001781 // Module Macro.
1782
Stephen Hines651f13c2014-04-23 16:59:28 -07001783 ModuleMacroInfo *MMI = getModuleMacro(PMInfo);
1784 if (!MMI)
Argyrios Kyrtzidis9317ab92013-03-22 21:12:57 +00001785 return;
1786
Stephen Hines651f13c2014-04-23 16:59:28 -07001787 Module *Owner = getSubmodule(MMI->getSubmoduleID());
1788 if (Owner && Owner->NameVisibility == Module::Hidden) {
1789 // Macros in the owning module are hidden. Just remember this macro to
1790 // install if we make this module visible.
1791 HiddenNamesMap[Owner].HiddenMacros.insert(std::make_pair(II, MMI));
1792 } else {
1793 installImportedMacro(II, MMI, Owner);
Argyrios Kyrtzidis9317ab92013-03-22 21:12:57 +00001794 }
Argyrios Kyrtzidis9317ab92013-03-22 21:12:57 +00001795}
1796
1797void ASTReader::installPCHMacroDirectives(IdentifierInfo *II,
1798 ModuleFile &M, uint64_t Offset) {
1799 assert(M.Kind != MK_Module);
1800
1801 BitstreamCursor &Cursor = M.MacroCursor;
1802 SavedStreamPosition SavedPosition(Cursor);
1803 Cursor.JumpToBit(Offset);
1804
1805 llvm::BitstreamEntry Entry =
1806 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
1807 if (Entry.Kind != llvm::BitstreamEntry::Record) {
1808 Error("malformed block record in AST file");
1809 return;
1810 }
1811
1812 RecordData Record;
1813 PreprocessorRecordTypes RecType =
1814 (PreprocessorRecordTypes)Cursor.readRecord(Entry.ID, Record);
1815 if (RecType != PP_MACRO_DIRECTIVE_HISTORY) {
1816 Error("malformed block record in AST file");
1817 return;
1818 }
1819
1820 // Deserialize the macro directives history in reverse source-order.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001821 MacroDirective *Latest = nullptr, *Earliest = nullptr;
Argyrios Kyrtzidis9317ab92013-03-22 21:12:57 +00001822 unsigned Idx = 0, N = Record.size();
1823 while (Idx < N) {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001824 MacroDirective *MD = nullptr;
Argyrios Kyrtzidis9317ab92013-03-22 21:12:57 +00001825 SourceLocation Loc = ReadSourceLocation(M, Record, Idx);
Argyrios Kyrtzidisc56fff72013-03-26 17:17:01 +00001826 MacroDirective::Kind K = (MacroDirective::Kind)Record[Idx++];
1827 switch (K) {
1828 case MacroDirective::MD_Define: {
1829 GlobalMacroID GMacID = getGlobalMacroID(M, Record[Idx++]);
1830 MacroInfo *MI = getMacro(GMacID);
1831 bool isImported = Record[Idx++];
1832 bool isAmbiguous = Record[Idx++];
1833 DefMacroDirective *DefMD =
1834 PP.AllocateDefMacroDirective(MI, Loc, isImported);
1835 DefMD->setAmbiguous(isAmbiguous);
1836 MD = DefMD;
1837 break;
1838 }
1839 case MacroDirective::MD_Undefine:
1840 MD = PP.AllocateUndefMacroDirective(Loc);
1841 break;
1842 case MacroDirective::MD_Visibility: {
1843 bool isPublic = Record[Idx++];
1844 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic);
1845 break;
1846 }
1847 }
Argyrios Kyrtzidis9317ab92013-03-22 21:12:57 +00001848
1849 if (!Latest)
1850 Latest = MD;
1851 if (Earliest)
1852 Earliest->setPrevious(MD);
1853 Earliest = MD;
1854 }
1855
1856 PP.setLoadedMacroDirective(II, Latest);
1857}
1858
Argyrios Kyrtzidis52151fd2013-03-27 01:25:34 +00001859/// \brief For the given macro definitions, check if they are both in system
Douglas Gregor7332ae42013-04-12 21:00:54 +00001860/// modules.
1861static bool areDefinedInSystemModules(MacroInfo *PrevMI, MacroInfo *NewMI,
Douglas Gregorf9dbae72013-06-07 22:56:11 +00001862 Module *NewOwner, ASTReader &Reader) {
Argyrios Kyrtzidis52151fd2013-03-27 01:25:34 +00001863 assert(PrevMI && NewMI);
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001864 Module *PrevOwner = nullptr;
Argyrios Kyrtzidis52151fd2013-03-27 01:25:34 +00001865 if (SubmoduleID PrevModID = PrevMI->getOwningModuleID())
1866 PrevOwner = Reader.getSubmodule(PrevModID);
Douglas Gregorf9dbae72013-06-07 22:56:11 +00001867 SourceManager &SrcMgr = Reader.getSourceManager();
1868 bool PrevInSystem
1869 = PrevOwner? PrevOwner->IsSystem
1870 : SrcMgr.isInSystemHeader(PrevMI->getDefinitionLoc());
1871 bool NewInSystem
1872 = NewOwner? NewOwner->IsSystem
1873 : SrcMgr.isInSystemHeader(NewMI->getDefinitionLoc());
1874 if (PrevOwner && PrevOwner == NewOwner)
Argyrios Kyrtzidis52151fd2013-03-27 01:25:34 +00001875 return false;
Douglas Gregorf9dbae72013-06-07 22:56:11 +00001876 return PrevInSystem && NewInSystem;
Argyrios Kyrtzidis52151fd2013-03-27 01:25:34 +00001877}
1878
Stephen Hines651f13c2014-04-23 16:59:28 -07001879void ASTReader::removeOverriddenMacros(IdentifierInfo *II,
1880 AmbiguousMacros &Ambig,
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001881 ArrayRef<SubmoduleID> Overrides) {
Stephen Hines651f13c2014-04-23 16:59:28 -07001882 for (unsigned OI = 0, ON = Overrides.size(); OI != ON; ++OI) {
1883 SubmoduleID OwnerID = Overrides[OI];
Argyrios Kyrtzidis9317ab92013-03-22 21:12:57 +00001884
Stephen Hines651f13c2014-04-23 16:59:28 -07001885 // If this macro is not yet visible, remove it from the hidden names list.
1886 Module *Owner = getSubmodule(OwnerID);
1887 HiddenNames &Hidden = HiddenNamesMap[Owner];
1888 HiddenMacrosMap::iterator HI = Hidden.HiddenMacros.find(II);
1889 if (HI != Hidden.HiddenMacros.end()) {
1890 auto SubOverrides = HI->second->getOverriddenSubmodules();
1891 Hidden.HiddenMacros.erase(HI);
1892 removeOverriddenMacros(II, Ambig, SubOverrides);
1893 }
1894
1895 // If this macro is already in our list of conflicts, remove it from there.
1896 Ambig.erase(
1897 std::remove_if(Ambig.begin(), Ambig.end(), [&](DefMacroDirective *MD) {
1898 return MD->getInfo()->getOwningModuleID() == OwnerID;
1899 }),
1900 Ambig.end());
1901 }
1902}
1903
1904ASTReader::AmbiguousMacros *
1905ASTReader::removeOverriddenMacros(IdentifierInfo *II,
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001906 ArrayRef<SubmoduleID> Overrides) {
Argyrios Kyrtzidis9317ab92013-03-22 21:12:57 +00001907 MacroDirective *Prev = PP.getMacroDirective(II);
Stephen Hines651f13c2014-04-23 16:59:28 -07001908 if (!Prev && Overrides.empty())
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001909 return nullptr;
Stephen Hines651f13c2014-04-23 16:59:28 -07001910
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001911 DefMacroDirective *PrevDef = Prev ? Prev->getDefinition().getDirective()
1912 : nullptr;
Stephen Hines651f13c2014-04-23 16:59:28 -07001913 if (PrevDef && PrevDef->isAmbiguous()) {
1914 // We had a prior ambiguity. Check whether we resolve it (or make it worse).
1915 AmbiguousMacros &Ambig = AmbiguousMacroDefs[II];
1916 Ambig.push_back(PrevDef);
1917
1918 removeOverriddenMacros(II, Ambig, Overrides);
1919
1920 if (!Ambig.empty())
1921 return &Ambig;
1922
1923 AmbiguousMacroDefs.erase(II);
1924 } else {
1925 // There's no ambiguity yet. Maybe we're introducing one.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001926 AmbiguousMacros Ambig;
Stephen Hines651f13c2014-04-23 16:59:28 -07001927 if (PrevDef)
1928 Ambig.push_back(PrevDef);
1929
1930 removeOverriddenMacros(II, Ambig, Overrides);
1931
1932 if (!Ambig.empty()) {
1933 AmbiguousMacros &Result = AmbiguousMacroDefs[II];
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001934 std::swap(Result, Ambig);
Stephen Hines651f13c2014-04-23 16:59:28 -07001935 return &Result;
Argyrios Kyrtzidisc56fff72013-03-26 17:17:01 +00001936 }
Argyrios Kyrtzidis9317ab92013-03-22 21:12:57 +00001937 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001938
1939 // We ended up with no ambiguity.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001940 return nullptr;
Stephen Hines651f13c2014-04-23 16:59:28 -07001941}
1942
1943void ASTReader::installImportedMacro(IdentifierInfo *II, ModuleMacroInfo *MMI,
1944 Module *Owner) {
1945 assert(II && Owner);
1946
1947 SourceLocation ImportLoc = Owner->MacroVisibilityLoc;
1948 if (ImportLoc.isInvalid()) {
1949 // FIXME: If we made macros from this module visible but didn't provide a
1950 // source location for the import, we don't have a location for the macro.
1951 // Use the location at which the containing module file was first imported
1952 // for now.
1953 ImportLoc = MMI->F->DirectImportLoc;
1954 assert(ImportLoc.isValid() && "no import location for a visible macro?");
1955 }
1956
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001957 AmbiguousMacros *Prev =
Stephen Hines651f13c2014-04-23 16:59:28 -07001958 removeOverriddenMacros(II, MMI->getOverriddenSubmodules());
1959
Stephen Hines651f13c2014-04-23 16:59:28 -07001960 // Create a synthetic macro definition corresponding to the import (or null
1961 // if this was an undefinition of the macro).
1962 DefMacroDirective *MD = MMI->import(PP, ImportLoc);
1963
1964 // If there's no ambiguity, just install the macro.
1965 if (!Prev) {
1966 if (MD)
1967 PP.appendMacroDirective(II, MD);
1968 else
1969 PP.appendMacroDirective(II, PP.AllocateUndefMacroDirective(ImportLoc));
1970 return;
1971 }
1972 assert(!Prev->empty());
1973
1974 if (!MD) {
1975 // We imported a #undef that didn't remove all prior definitions. The most
1976 // recent prior definition remains, and we install it in the place of the
1977 // imported directive.
1978 MacroInfo *NewMI = Prev->back()->getInfo();
1979 Prev->pop_back();
1980 MD = PP.AllocateDefMacroDirective(NewMI, ImportLoc, /*Imported*/true);
1981 }
1982
1983 // We're introducing a macro definition that creates or adds to an ambiguity.
1984 // We can resolve that ambiguity if this macro is token-for-token identical to
1985 // all of the existing definitions.
1986 MacroInfo *NewMI = MD->getInfo();
1987 assert(NewMI && "macro definition with no MacroInfo?");
1988 while (!Prev->empty()) {
1989 MacroInfo *PrevMI = Prev->back()->getInfo();
1990 assert(PrevMI && "macro definition with no MacroInfo?");
1991
1992 // Before marking the macros as ambiguous, check if this is a case where
1993 // both macros are in system headers. If so, we trust that the system
1994 // did not get it wrong. This also handles cases where Clang's own
1995 // headers have a different spelling of certain system macros:
1996 // #define LONG_MAX __LONG_MAX__ (clang's limits.h)
1997 // #define LONG_MAX 0x7fffffffffffffffL (system's limits.h)
1998 //
1999 // FIXME: Remove the defined-in-system-headers check. clang's limits.h
2000 // overrides the system limits.h's macros, so there's no conflict here.
2001 if (NewMI != PrevMI &&
2002 !PrevMI->isIdenticalTo(*NewMI, PP, /*Syntactically=*/true) &&
2003 !areDefinedInSystemModules(PrevMI, NewMI, Owner, *this))
2004 break;
2005
2006 // The previous definition is the same as this one (or both are defined in
2007 // system modules so we can assume they're equivalent); we don't need to
2008 // track it any more.
2009 Prev->pop_back();
2010 }
2011
2012 if (!Prev->empty())
2013 MD->setAmbiguous(true);
2014
Argyrios Kyrtzidisc56fff72013-03-26 17:17:01 +00002015 PP.appendMacroDirective(II, MD);
Argyrios Kyrtzidis9317ab92013-03-22 21:12:57 +00002016}
2017
Stephen Hines651f13c2014-04-23 16:59:28 -07002018ASTReader::InputFileInfo
2019ASTReader::readInputFileInfo(ModuleFile &F, unsigned ID) {
2020 // Go find this input file.
2021 BitstreamCursor &Cursor = F.InputFilesCursor;
2022 SavedStreamPosition SavedPosition(Cursor);
2023 Cursor.JumpToBit(F.InputFileOffsets[ID-1]);
2024
2025 unsigned Code = Cursor.ReadCode();
2026 RecordData Record;
2027 StringRef Blob;
2028
2029 unsigned Result = Cursor.readRecord(Code, Record, &Blob);
2030 assert(static_cast<InputFileRecordTypes>(Result) == INPUT_FILE &&
2031 "invalid record type for input file");
2032 (void)Result;
2033
2034 std::string Filename;
2035 off_t StoredSize;
2036 time_t StoredTime;
2037 bool Overridden;
2038
2039 assert(Record[0] == ID && "Bogus stored ID or offset");
2040 StoredSize = static_cast<off_t>(Record[1]);
2041 StoredTime = static_cast<time_t>(Record[2]);
2042 Overridden = static_cast<bool>(Record[3]);
2043 Filename = Blob;
2044 MaybeAddSystemRootToFilename(F, Filename);
2045
2046 InputFileInfo R = { std::move(Filename), StoredSize, StoredTime, Overridden };
2047 return R;
2048}
2049
2050std::string ASTReader::getInputFileName(ModuleFile &F, unsigned int ID) {
2051 return readInputFileInfo(F, ID).Filename;
2052}
2053
Argyrios Kyrtzidis8504b7b2013-03-01 03:26:04 +00002054InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002055 // If this ID is bogus, just return an empty input file.
2056 if (ID == 0 || ID > F.InputFilesLoaded.size())
2057 return InputFile();
2058
2059 // If we've already loaded this input file, return it.
Argyrios Kyrtzidis8504b7b2013-03-01 03:26:04 +00002060 if (F.InputFilesLoaded[ID-1].getFile())
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002061 return F.InputFilesLoaded[ID-1];
2062
Stephen Hines651f13c2014-04-23 16:59:28 -07002063 if (F.InputFilesLoaded[ID-1].isNotFound())
2064 return InputFile();
2065
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002066 // Go find this input file.
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00002067 BitstreamCursor &Cursor = F.InputFilesCursor;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002068 SavedStreamPosition SavedPosition(Cursor);
2069 Cursor.JumpToBit(F.InputFileOffsets[ID-1]);
2070
Stephen Hines651f13c2014-04-23 16:59:28 -07002071 InputFileInfo FI = readInputFileInfo(F, ID);
2072 off_t StoredSize = FI.StoredSize;
2073 time_t StoredTime = FI.StoredTime;
2074 bool Overridden = FI.Overridden;
2075 StringRef Filename = FI.Filename;
Argyrios Kyrtzidis8504b7b2013-03-01 03:26:04 +00002076
Stephen Hines651f13c2014-04-23 16:59:28 -07002077 const FileEntry *File
2078 = Overridden? FileMgr.getVirtualFile(Filename, StoredSize, StoredTime)
2079 : FileMgr.getFile(Filename, /*OpenFile=*/false);
2080
2081 // If we didn't find the file, resolve it relative to the
2082 // original directory from which this AST file was created.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002083 if (File == nullptr && !F.OriginalDir.empty() && !CurrentDir.empty() &&
Stephen Hines651f13c2014-04-23 16:59:28 -07002084 F.OriginalDir != CurrentDir) {
2085 std::string Resolved = resolveFileRelativeToOriginalDir(Filename,
2086 F.OriginalDir,
2087 CurrentDir);
2088 if (!Resolved.empty())
2089 File = FileMgr.getFile(Resolved);
2090 }
2091
2092 // For an overridden file, create a virtual file with the stored
2093 // size/timestamp.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002094 if (Overridden && File == nullptr) {
Stephen Hines651f13c2014-04-23 16:59:28 -07002095 File = FileMgr.getVirtualFile(Filename, StoredSize, StoredTime);
2096 }
2097
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002098 if (File == nullptr) {
Stephen Hines651f13c2014-04-23 16:59:28 -07002099 if (Complain) {
2100 std::string ErrorStr = "could not find file '";
2101 ErrorStr += Filename;
2102 ErrorStr += "' referenced by AST file";
2103 Error(ErrorStr.c_str());
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002104 }
Stephen Hines651f13c2014-04-23 16:59:28 -07002105 // Record that we didn't find the file.
2106 F.InputFilesLoaded[ID-1] = InputFile::getNotFound();
2107 return InputFile();
2108 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002109
Stephen Hines651f13c2014-04-23 16:59:28 -07002110 // Check if there was a request to override the contents of the file
2111 // that was part of the precompiled header. Overridding such a file
2112 // can lead to problems when lexing using the source locations from the
2113 // PCH.
2114 SourceManager &SM = getSourceManager();
2115 if (!Overridden && SM.isFileOverridden(File)) {
2116 if (Complain)
2117 Error(diag::err_fe_pch_file_overridden, Filename);
2118 // After emitting the diagnostic, recover by disabling the override so
2119 // that the original file will be used.
2120 SM.disableFileContentsOverride(File);
2121 // The FileEntry is a virtual file entry with the size of the contents
2122 // that would override the original contents. Set it to the original's
2123 // size/time.
2124 FileMgr.modifyFileEntry(const_cast<FileEntry*>(File),
2125 StoredSize, StoredTime);
2126 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002127
Stephen Hines651f13c2014-04-23 16:59:28 -07002128 bool IsOutOfDate = false;
2129
2130 // For an overridden file, there is nothing to validate.
2131 if (!Overridden && (StoredSize != File->getSize()
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002132#if !defined(LLVM_ON_WIN32)
Stephen Hines651f13c2014-04-23 16:59:28 -07002133 // In our regression testing, the Windows file system seems to
2134 // have inconsistent modification times that sometimes
2135 // erroneously trigger this error-handling path.
2136 || StoredTime != File->getModificationTime()
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002137#endif
Stephen Hines651f13c2014-04-23 16:59:28 -07002138 )) {
2139 if (Complain) {
2140 // Build a list of the PCH imports that got us here (in reverse).
2141 SmallVector<ModuleFile *, 4> ImportStack(1, &F);
2142 while (ImportStack.back()->ImportedBy.size() > 0)
2143 ImportStack.push_back(ImportStack.back()->ImportedBy[0]);
2144
2145 // The top-level PCH is stale.
2146 StringRef TopLevelPCHName(ImportStack.back()->FileName);
2147 Error(diag::err_fe_pch_file_modified, Filename, TopLevelPCHName);
2148
2149 // Print the import stack.
2150 if (ImportStack.size() > 1 && !Diags.isDiagnosticInFlight()) {
2151 Diag(diag::note_pch_required_by)
2152 << Filename << ImportStack[0]->FileName;
2153 for (unsigned I = 1; I < ImportStack.size(); ++I)
2154 Diag(diag::note_pch_required_by)
2155 << ImportStack[I-1]->FileName << ImportStack[I]->FileName;
Douglas Gregor677e15f2013-03-19 00:28:20 +00002156 }
2157
Stephen Hines651f13c2014-04-23 16:59:28 -07002158 if (!Diags.isDiagnosticInFlight())
2159 Diag(diag::note_pch_rebuild_required) << TopLevelPCHName;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002160 }
2161
Stephen Hines651f13c2014-04-23 16:59:28 -07002162 IsOutOfDate = true;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002163 }
2164
Stephen Hines651f13c2014-04-23 16:59:28 -07002165 InputFile IF = InputFile(File, Overridden, IsOutOfDate);
2166
2167 // Note that we've loaded this input file.
2168 F.InputFilesLoaded[ID-1] = IF;
2169 return IF;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002170}
2171
2172const FileEntry *ASTReader::getFileEntry(StringRef filenameStrRef) {
2173 ModuleFile &M = ModuleMgr.getPrimaryModule();
2174 std::string Filename = filenameStrRef;
2175 MaybeAddSystemRootToFilename(M, Filename);
2176 const FileEntry *File = FileMgr.getFile(Filename);
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002177 if (File == nullptr && !M.OriginalDir.empty() && !CurrentDir.empty() &&
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002178 M.OriginalDir != CurrentDir) {
2179 std::string resolved = resolveFileRelativeToOriginalDir(Filename,
2180 M.OriginalDir,
2181 CurrentDir);
2182 if (!resolved.empty())
2183 File = FileMgr.getFile(resolved);
2184 }
2185
2186 return File;
2187}
2188
2189/// \brief If we are loading a relocatable PCH file, and the filename is
2190/// not an absolute path, add the system root to the beginning of the file
2191/// name.
2192void ASTReader::MaybeAddSystemRootToFilename(ModuleFile &M,
2193 std::string &Filename) {
2194 // If this is not a relocatable PCH file, there's nothing to do.
2195 if (!M.RelocatablePCH)
2196 return;
2197
2198 if (Filename.empty() || llvm::sys::path::is_absolute(Filename))
2199 return;
2200
2201 if (isysroot.empty()) {
2202 // If no system root was given, default to '/'
2203 Filename.insert(Filename.begin(), '/');
2204 return;
2205 }
2206
2207 unsigned Length = isysroot.size();
2208 if (isysroot[Length - 1] != '/')
2209 Filename.insert(Filename.begin(), '/');
2210
2211 Filename.insert(Filename.begin(), isysroot.begin(), isysroot.end());
2212}
2213
2214ASTReader::ASTReadResult
2215ASTReader::ReadControlBlock(ModuleFile &F,
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00002216 SmallVectorImpl<ImportedModule> &Loaded,
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002217 const ModuleFile *ImportedBy,
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002218 unsigned ClientLoadCapabilities) {
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00002219 BitstreamCursor &Stream = F.Stream;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002220
2221 if (Stream.EnterSubBlock(CONTROL_BLOCK_ID)) {
2222 Error("malformed block record in AST file");
2223 return Failure;
2224 }
2225
2226 // Read all of the records and blocks in the control block.
2227 RecordData Record;
Chris Lattner88bde502013-01-19 21:39:22 +00002228 while (1) {
2229 llvm::BitstreamEntry Entry = Stream.advance();
2230
2231 switch (Entry.Kind) {
2232 case llvm::BitstreamEntry::Error:
2233 Error("malformed block record in AST file");
2234 return Failure;
Stephen Hines651f13c2014-04-23 16:59:28 -07002235 case llvm::BitstreamEntry::EndBlock: {
2236 // Validate input files.
2237 const HeaderSearchOptions &HSOpts =
2238 PP.getHeaderSearchInfo().getHeaderSearchOpts();
2239
2240 // All user input files reside at the index range [0, Record[1]), and
2241 // system input files reside at [Record[1], Record[0]).
2242 // Record is the one from INPUT_FILE_OFFSETS.
2243 unsigned NumInputs = Record[0];
2244 unsigned NumUserInputs = Record[1];
2245
2246 if (!DisableValidation &&
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002247 (ValidateSystemInputs || !HSOpts.ModulesValidateOncePerBuildSession ||
Stephen Hines651f13c2014-04-23 16:59:28 -07002248 F.InputFilesValidationTimestamp <= HSOpts.BuildSessionTimestamp)) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002249 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
Stephen Hines651f13c2014-04-23 16:59:28 -07002250
2251 // If we are reading a module, we will create a verification timestamp,
2252 // so we verify all input files. Otherwise, verify only user input
2253 // files.
2254
2255 unsigned N = NumUserInputs;
2256 if (ValidateSystemInputs ||
2257 (HSOpts.ModulesValidateOncePerBuildSession && F.Kind == MK_Module))
2258 N = NumInputs;
2259
2260 for (unsigned I = 0; I < N; ++I) {
Argyrios Kyrtzidis8504b7b2013-03-01 03:26:04 +00002261 InputFile IF = getInputFile(F, I+1, Complain);
2262 if (!IF.getFile() || IF.isOutOfDate())
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002263 return OutOfDate;
Argyrios Kyrtzidis8504b7b2013-03-01 03:26:04 +00002264 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002265 }
Stephen Hines651f13c2014-04-23 16:59:28 -07002266
2267 if (Listener)
2268 Listener->visitModuleFile(F.FileName);
2269
2270 if (Listener && Listener->needsInputFileVisitation()) {
2271 unsigned N = Listener->needsSystemInputFileVisitation() ? NumInputs
2272 : NumUserInputs;
2273 for (unsigned I = 0; I < N; ++I) {
2274 bool IsSystem = I >= NumUserInputs;
2275 InputFileInfo FI = readInputFileInfo(F, I+1);
2276 Listener->visitInputFile(FI.Filename, IsSystem, FI.Overridden);
2277 }
2278 }
2279
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002280 return Success;
Stephen Hines651f13c2014-04-23 16:59:28 -07002281 }
2282
Chris Lattner88bde502013-01-19 21:39:22 +00002283 case llvm::BitstreamEntry::SubBlock:
2284 switch (Entry.ID) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002285 case INPUT_FILES_BLOCK_ID:
2286 F.InputFilesCursor = Stream;
2287 if (Stream.SkipBlock() || // Skip with the main cursor
2288 // Read the abbreviations
2289 ReadBlockAbbrevs(F.InputFilesCursor, INPUT_FILES_BLOCK_ID)) {
2290 Error("malformed block record in AST file");
2291 return Failure;
2292 }
2293 continue;
Chris Lattner88bde502013-01-19 21:39:22 +00002294
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002295 default:
Chris Lattner88bde502013-01-19 21:39:22 +00002296 if (Stream.SkipBlock()) {
2297 Error("malformed block record in AST file");
2298 return Failure;
2299 }
2300 continue;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002301 }
Chris Lattner88bde502013-01-19 21:39:22 +00002302
2303 case llvm::BitstreamEntry::Record:
2304 // The interesting case.
2305 break;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002306 }
2307
2308 // Read and process a record.
2309 Record.clear();
Chris Lattnerb3ce3572013-01-20 02:38:54 +00002310 StringRef Blob;
2311 switch ((ControlRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob)) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002312 case METADATA: {
2313 if (Record[0] != VERSION_MAJOR && !DisableValidation) {
2314 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
Stephen Hines651f13c2014-04-23 16:59:28 -07002315 Diag(Record[0] < VERSION_MAJOR? diag::err_pch_version_too_old
2316 : diag::err_pch_version_too_new);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002317 return VersionMismatch;
2318 }
2319
2320 bool hasErrors = Record[5];
2321 if (hasErrors && !DisableValidation && !AllowASTWithCompilerErrors) {
2322 Diag(diag::err_pch_with_compiler_errors);
2323 return HadErrors;
2324 }
2325
2326 F.RelocatablePCH = Record[4];
2327
2328 const std::string &CurBranch = getClangFullRepositoryVersion();
Chris Lattnerb3ce3572013-01-20 02:38:54 +00002329 StringRef ASTBranch = Blob;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002330 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) {
2331 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
Stephen Hines651f13c2014-04-23 16:59:28 -07002332 Diag(diag::err_pch_different_branch) << ASTBranch << CurBranch;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002333 return VersionMismatch;
2334 }
2335 break;
2336 }
2337
2338 case IMPORTS: {
2339 // Load each of the imported PCH files.
2340 unsigned Idx = 0, N = Record.size();
2341 while (Idx < N) {
2342 // Read information about the AST file.
2343 ModuleKind ImportedKind = (ModuleKind)Record[Idx++];
2344 // The import location will be the local one for now; we will adjust
2345 // all import locations of module imports after the global source
2346 // location info are setup.
2347 SourceLocation ImportLoc =
2348 SourceLocation::getFromRawEncoding(Record[Idx++]);
Douglas Gregor677e15f2013-03-19 00:28:20 +00002349 off_t StoredSize = (off_t)Record[Idx++];
2350 time_t StoredModTime = (time_t)Record[Idx++];
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002351 unsigned Length = Record[Idx++];
2352 SmallString<128> ImportedFile(Record.begin() + Idx,
2353 Record.begin() + Idx + Length);
2354 Idx += Length;
2355
2356 // Load the AST file.
2357 switch(ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F, Loaded,
Douglas Gregor677e15f2013-03-19 00:28:20 +00002358 StoredSize, StoredModTime,
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002359 ClientLoadCapabilities)) {
2360 case Failure: return Failure;
2361 // If we have to ignore the dependency, we'll have to ignore this too.
Douglas Gregorac39f132013-03-19 00:38:50 +00002362 case Missing:
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002363 case OutOfDate: return OutOfDate;
2364 case VersionMismatch: return VersionMismatch;
2365 case ConfigurationMismatch: return ConfigurationMismatch;
2366 case HadErrors: return HadErrors;
2367 case Success: break;
2368 }
2369 }
2370 break;
2371 }
2372
2373 case LANGUAGE_OPTIONS: {
2374 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2375 if (Listener && &F == *ModuleMgr.begin() &&
2376 ParseLanguageOptions(Record, Complain, *Listener) &&
Stephen Hines651f13c2014-04-23 16:59:28 -07002377 !DisableValidation && !AllowConfigurationMismatch)
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002378 return ConfigurationMismatch;
2379 break;
2380 }
2381
2382 case TARGET_OPTIONS: {
2383 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
2384 if (Listener && &F == *ModuleMgr.begin() &&
2385 ParseTargetOptions(Record, Complain, *Listener) &&
Stephen Hines651f13c2014-04-23 16:59:28 -07002386 !DisableValidation && !AllowConfigurationMismatch)
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002387 return ConfigurationMismatch;
2388 break;
2389 }
2390
2391 case DIAGNOSTIC_OPTIONS: {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002392 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate)==0;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002393 if (Listener && &F == *ModuleMgr.begin() &&
2394 ParseDiagnosticOptions(Record, Complain, *Listener) &&
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002395 !DisableValidation)
2396 return OutOfDate;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002397 break;
2398 }
2399
2400 case FILE_SYSTEM_OPTIONS: {
2401 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
2402 if (Listener && &F == *ModuleMgr.begin() &&
2403 ParseFileSystemOptions(Record, Complain, *Listener) &&
Stephen Hines651f13c2014-04-23 16:59:28 -07002404 !DisableValidation && !AllowConfigurationMismatch)
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002405 return ConfigurationMismatch;
2406 break;
2407 }
2408
2409 case HEADER_SEARCH_OPTIONS: {
2410 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
2411 if (Listener && &F == *ModuleMgr.begin() &&
2412 ParseHeaderSearchOptions(Record, Complain, *Listener) &&
Stephen Hines651f13c2014-04-23 16:59:28 -07002413 !DisableValidation && !AllowConfigurationMismatch)
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002414 return ConfigurationMismatch;
2415 break;
2416 }
2417
2418 case PREPROCESSOR_OPTIONS: {
2419 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
2420 if (Listener && &F == *ModuleMgr.begin() &&
2421 ParsePreprocessorOptions(Record, Complain, *Listener,
2422 SuggestedPredefines) &&
Stephen Hines651f13c2014-04-23 16:59:28 -07002423 !DisableValidation && !AllowConfigurationMismatch)
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002424 return ConfigurationMismatch;
2425 break;
2426 }
2427
2428 case ORIGINAL_FILE:
2429 F.OriginalSourceFileID = FileID::get(Record[0]);
Chris Lattnerb3ce3572013-01-20 02:38:54 +00002430 F.ActualOriginalSourceFileName = Blob;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002431 F.OriginalSourceFileName = F.ActualOriginalSourceFileName;
2432 MaybeAddSystemRootToFilename(F, F.OriginalSourceFileName);
2433 break;
2434
2435 case ORIGINAL_FILE_ID:
2436 F.OriginalSourceFileID = FileID::get(Record[0]);
2437 break;
2438
2439 case ORIGINAL_PCH_DIR:
Chris Lattnerb3ce3572013-01-20 02:38:54 +00002440 F.OriginalDir = Blob;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002441 break;
2442
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002443 case MODULE_NAME:
2444 F.ModuleName = Blob;
2445 if (Listener)
2446 Listener->ReadModuleName(F.ModuleName);
2447 break;
2448
2449 case MODULE_MAP_FILE:
2450 F.ModuleMapPath = Blob;
2451
2452 // Try to resolve ModuleName in the current header search context and
2453 // verify that it is found in the same module map file as we saved. If the
2454 // top-level AST file is a main file, skip this check because there is no
2455 // usable header search context.
2456 assert(!F.ModuleName.empty() &&
2457 "MODULE_NAME should come before MOUDLE_MAP_FILE");
2458 if (F.Kind == MK_Module &&
2459 (*ModuleMgr.begin())->Kind != MK_MainFile) {
2460 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName);
2461 if (!M) {
2462 assert(ImportedBy && "top-level import should be verified");
2463 if ((ClientLoadCapabilities & ARR_Missing) == 0)
2464 Diag(diag::err_imported_module_not_found)
2465 << F.ModuleName << ImportedBy->FileName;
2466 return Missing;
2467 }
2468
2469 const FileEntry *StoredModMap = FileMgr.getFile(F.ModuleMapPath);
2470 if (StoredModMap == nullptr || StoredModMap != M->ModuleMap) {
2471 assert(M->ModuleMap && "found module is missing module map file");
2472 assert(M->Name == F.ModuleName && "found module with different name");
2473 assert(ImportedBy && "top-level import should be verified");
2474 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
2475 Diag(diag::err_imported_module_modmap_changed)
2476 << F.ModuleName << ImportedBy->FileName
2477 << M->ModuleMap->getName() << F.ModuleMapPath;
2478 return OutOfDate;
2479 }
2480 }
2481
2482 if (Listener)
2483 Listener->ReadModuleMapFile(F.ModuleMapPath);
2484 break;
2485
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002486 case INPUT_FILE_OFFSETS:
Chris Lattnerb3ce3572013-01-20 02:38:54 +00002487 F.InputFileOffsets = (const uint32_t *)Blob.data();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002488 F.InputFilesLoaded.resize(Record[0]);
2489 break;
2490 }
2491 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002492}
2493
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002494ASTReader::ASTReadResult
2495ASTReader::ReadASTBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00002496 BitstreamCursor &Stream = F.Stream;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002497
2498 if (Stream.EnterSubBlock(AST_BLOCK_ID)) {
2499 Error("malformed block record in AST file");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002500 return Failure;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002501 }
2502
2503 // Read all of the records and blocks for the AST file.
2504 RecordData Record;
Chris Lattner88bde502013-01-19 21:39:22 +00002505 while (1) {
2506 llvm::BitstreamEntry Entry = Stream.advance();
2507
2508 switch (Entry.Kind) {
2509 case llvm::BitstreamEntry::Error:
2510 Error("error at end of module block in AST file");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002511 return Failure;
Chris Lattner88bde502013-01-19 21:39:22 +00002512 case llvm::BitstreamEntry::EndBlock: {
Richard Smith43828672013-04-03 22:49:41 +00002513 // Outside of C++, we do not store a lookup map for the translation unit.
2514 // Instead, mark it as needing a lookup map to be built if this module
2515 // contains any declarations lexically within it (which it always does!).
2516 // This usually has no cost, since we very rarely need the lookup map for
2517 // the translation unit outside C++.
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002518 DeclContext *DC = Context.getTranslationUnitDecl();
Richard Smith43828672013-04-03 22:49:41 +00002519 if (DC->hasExternalLexicalStorage() &&
2520 !getContext().getLangOpts().CPlusPlus)
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002521 DC->setMustBuildLookupTable();
Chris Lattner88bde502013-01-19 21:39:22 +00002522
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002523 return Success;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002524 }
Chris Lattner88bde502013-01-19 21:39:22 +00002525 case llvm::BitstreamEntry::SubBlock:
2526 switch (Entry.ID) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002527 case DECLTYPES_BLOCK_ID:
2528 // We lazily load the decls block, but we want to set up the
2529 // DeclsCursor cursor to point into it. Clone our current bitcode
2530 // cursor to it, enter the block and read the abbrevs in that block.
2531 // With the main cursor, we just skip over it.
2532 F.DeclsCursor = Stream;
2533 if (Stream.SkipBlock() || // Skip with the main cursor.
2534 // Read the abbrevs.
2535 ReadBlockAbbrevs(F.DeclsCursor, DECLTYPES_BLOCK_ID)) {
2536 Error("malformed block record in AST file");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002537 return Failure;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002538 }
2539 break;
Stephen Hines651f13c2014-04-23 16:59:28 -07002540
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002541 case PREPROCESSOR_BLOCK_ID:
2542 F.MacroCursor = Stream;
2543 if (!PP.getExternalSource())
2544 PP.setExternalSource(this);
Chris Lattner88bde502013-01-19 21:39:22 +00002545
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002546 if (Stream.SkipBlock() ||
2547 ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID)) {
2548 Error("malformed block record in AST file");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002549 return Failure;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002550 }
2551 F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo();
2552 break;
Chris Lattner88bde502013-01-19 21:39:22 +00002553
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002554 case PREPROCESSOR_DETAIL_BLOCK_ID:
2555 F.PreprocessorDetailCursor = Stream;
2556 if (Stream.SkipBlock() ||
Chris Lattner88bde502013-01-19 21:39:22 +00002557 ReadBlockAbbrevs(F.PreprocessorDetailCursor,
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002558 PREPROCESSOR_DETAIL_BLOCK_ID)) {
Chris Lattner88bde502013-01-19 21:39:22 +00002559 Error("malformed preprocessor detail record in AST file");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002560 return Failure;
Chris Lattner88bde502013-01-19 21:39:22 +00002561 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002562 F.PreprocessorDetailStartOffset
Chris Lattner88bde502013-01-19 21:39:22 +00002563 = F.PreprocessorDetailCursor.GetCurrentBitNo();
2564
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002565 if (!PP.getPreprocessingRecord())
2566 PP.createPreprocessingRecord();
2567 if (!PP.getPreprocessingRecord()->getExternalSource())
2568 PP.getPreprocessingRecord()->SetExternalSource(*this);
2569 break;
2570
2571 case SOURCE_MANAGER_BLOCK_ID:
2572 if (ReadSourceManagerBlock(F))
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002573 return Failure;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002574 break;
Chris Lattner88bde502013-01-19 21:39:22 +00002575
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002576 case SUBMODULE_BLOCK_ID:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002577 if (ASTReadResult Result = ReadSubmoduleBlock(F, ClientLoadCapabilities))
2578 return Result;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002579 break;
Chris Lattner88bde502013-01-19 21:39:22 +00002580
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002581 case COMMENTS_BLOCK_ID: {
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00002582 BitstreamCursor C = Stream;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002583 if (Stream.SkipBlock() ||
2584 ReadBlockAbbrevs(C, COMMENTS_BLOCK_ID)) {
2585 Error("malformed comments block in AST file");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002586 return Failure;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002587 }
2588 CommentsCursors.push_back(std::make_pair(C, &F));
2589 break;
2590 }
Chris Lattner88bde502013-01-19 21:39:22 +00002591
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002592 default:
Chris Lattner88bde502013-01-19 21:39:22 +00002593 if (Stream.SkipBlock()) {
2594 Error("malformed block record in AST file");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002595 return Failure;
Chris Lattner88bde502013-01-19 21:39:22 +00002596 }
2597 break;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002598 }
2599 continue;
Chris Lattner88bde502013-01-19 21:39:22 +00002600
2601 case llvm::BitstreamEntry::Record:
2602 // The interesting case.
2603 break;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002604 }
2605
2606 // Read and process a record.
2607 Record.clear();
Chris Lattnerb3ce3572013-01-20 02:38:54 +00002608 StringRef Blob;
2609 switch ((ASTRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob)) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002610 default: // Default behavior: ignore.
2611 break;
2612
2613 case TYPE_OFFSET: {
2614 if (F.LocalNumTypes != 0) {
2615 Error("duplicate TYPE_OFFSET record in AST file");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002616 return Failure;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002617 }
Chris Lattnerb3ce3572013-01-20 02:38:54 +00002618 F.TypeOffsets = (const uint32_t *)Blob.data();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002619 F.LocalNumTypes = Record[0];
2620 unsigned LocalBaseTypeIndex = Record[1];
2621 F.BaseTypeIndex = getTotalNumTypes();
2622
2623 if (F.LocalNumTypes > 0) {
2624 // Introduce the global -> local mapping for types within this module.
2625 GlobalTypeMap.insert(std::make_pair(getTotalNumTypes(), &F));
2626
2627 // Introduce the local -> global mapping for types within this module.
2628 F.TypeRemap.insertOrReplace(
2629 std::make_pair(LocalBaseTypeIndex,
2630 F.BaseTypeIndex - LocalBaseTypeIndex));
2631
2632 TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes);
2633 }
2634 break;
2635 }
2636
2637 case DECL_OFFSET: {
2638 if (F.LocalNumDecls != 0) {
2639 Error("duplicate DECL_OFFSET record in AST file");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002640 return Failure;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002641 }
Chris Lattnerb3ce3572013-01-20 02:38:54 +00002642 F.DeclOffsets = (const DeclOffset *)Blob.data();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002643 F.LocalNumDecls = Record[0];
2644 unsigned LocalBaseDeclID = Record[1];
2645 F.BaseDeclID = getTotalNumDecls();
2646
2647 if (F.LocalNumDecls > 0) {
2648 // Introduce the global -> local mapping for declarations within this
2649 // module.
2650 GlobalDeclMap.insert(
2651 std::make_pair(getTotalNumDecls() + NUM_PREDEF_DECL_IDS, &F));
2652
2653 // Introduce the local -> global mapping for declarations within this
2654 // module.
2655 F.DeclRemap.insertOrReplace(
2656 std::make_pair(LocalBaseDeclID, F.BaseDeclID - LocalBaseDeclID));
2657
2658 // Introduce the global -> local mapping for declarations within this
2659 // module.
2660 F.GlobalToLocalDeclIDs[&F] = LocalBaseDeclID;
2661
2662 DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls);
2663 }
2664 break;
2665 }
2666
2667 case TU_UPDATE_LEXICAL: {
2668 DeclContext *TU = Context.getTranslationUnitDecl();
2669 DeclContextInfo &Info = F.DeclContextInfos[TU];
Chris Lattnerb3ce3572013-01-20 02:38:54 +00002670 Info.LexicalDecls = reinterpret_cast<const KindDeclIDPair *>(Blob.data());
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002671 Info.NumLexicalDecls
Chris Lattnerb3ce3572013-01-20 02:38:54 +00002672 = static_cast<unsigned int>(Blob.size() / sizeof(KindDeclIDPair));
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002673 TU->setHasExternalLexicalStorage(true);
2674 break;
2675 }
2676
2677 case UPDATE_VISIBLE: {
2678 unsigned Idx = 0;
2679 serialization::DeclID ID = ReadDeclID(F, Record, Idx);
2680 ASTDeclContextNameLookupTable *Table =
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002681 ASTDeclContextNameLookupTable::Create(
2682 (const unsigned char *)Blob.data() + Record[Idx++],
2683 (const unsigned char *)Blob.data() + sizeof(uint32_t),
2684 (const unsigned char *)Blob.data(),
2685 ASTDeclContextNameLookupTrait(*this, F));
2686 if (Decl *D = GetExistingDecl(ID)) {
Stephen Hines651f13c2014-04-23 16:59:28 -07002687 auto *DC = cast<DeclContext>(D);
2688 DC->getPrimaryContext()->setHasExternalVisibleStorage(true);
2689 auto *&LookupTable = F.DeclContextInfos[DC].NameLookupTableData;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002690 // FIXME: There should never be an existing lookup table.
Stephen Hines651f13c2014-04-23 16:59:28 -07002691 delete LookupTable;
2692 LookupTable = Table;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002693 } else
2694 PendingVisibleUpdates[ID].push_back(std::make_pair(Table, &F));
2695 break;
2696 }
2697
2698 case IDENTIFIER_TABLE:
Chris Lattnerb3ce3572013-01-20 02:38:54 +00002699 F.IdentifierTableData = Blob.data();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002700 if (Record[0]) {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002701 F.IdentifierLookupTable = ASTIdentifierLookupTable::Create(
2702 (const unsigned char *)F.IdentifierTableData + Record[0],
2703 (const unsigned char *)F.IdentifierTableData + sizeof(uint32_t),
2704 (const unsigned char *)F.IdentifierTableData,
2705 ASTIdentifierLookupTrait(*this, F));
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002706
2707 PP.getIdentifierTable().setExternalIdentifierLookup(this);
2708 }
2709 break;
2710
2711 case IDENTIFIER_OFFSET: {
2712 if (F.LocalNumIdentifiers != 0) {
2713 Error("duplicate IDENTIFIER_OFFSET record in AST file");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002714 return Failure;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002715 }
Chris Lattnerb3ce3572013-01-20 02:38:54 +00002716 F.IdentifierOffsets = (const uint32_t *)Blob.data();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002717 F.LocalNumIdentifiers = Record[0];
2718 unsigned LocalBaseIdentifierID = Record[1];
2719 F.BaseIdentifierID = getTotalNumIdentifiers();
2720
2721 if (F.LocalNumIdentifiers > 0) {
2722 // Introduce the global -> local mapping for identifiers within this
2723 // module.
2724 GlobalIdentifierMap.insert(std::make_pair(getTotalNumIdentifiers() + 1,
2725 &F));
2726
2727 // Introduce the local -> global mapping for identifiers within this
2728 // module.
2729 F.IdentifierRemap.insertOrReplace(
2730 std::make_pair(LocalBaseIdentifierID,
2731 F.BaseIdentifierID - LocalBaseIdentifierID));
2732
2733 IdentifiersLoaded.resize(IdentifiersLoaded.size()
2734 + F.LocalNumIdentifiers);
2735 }
2736 break;
2737 }
2738
Stephen Hines651f13c2014-04-23 16:59:28 -07002739 case EAGERLY_DESERIALIZED_DECLS:
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002740 for (unsigned I = 0, N = Record.size(); I != N; ++I)
Stephen Hines651f13c2014-04-23 16:59:28 -07002741 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I]));
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002742 break;
2743
2744 case SPECIAL_TYPES:
Douglas Gregorf5cfc892013-02-01 23:45:03 +00002745 if (SpecialTypes.empty()) {
2746 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2747 SpecialTypes.push_back(getGlobalTypeID(F, Record[I]));
2748 break;
2749 }
2750
2751 if (SpecialTypes.size() != Record.size()) {
2752 Error("invalid special-types record");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002753 return Failure;
Douglas Gregorf5cfc892013-02-01 23:45:03 +00002754 }
2755
2756 for (unsigned I = 0, N = Record.size(); I != N; ++I) {
2757 serialization::TypeID ID = getGlobalTypeID(F, Record[I]);
2758 if (!SpecialTypes[I])
2759 SpecialTypes[I] = ID;
2760 // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate
2761 // merge step?
2762 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002763 break;
2764
2765 case STATISTICS:
2766 TotalNumStatements += Record[0];
2767 TotalNumMacros += Record[1];
2768 TotalLexicalDeclContexts += Record[2];
2769 TotalVisibleDeclContexts += Record[3];
2770 break;
2771
2772 case UNUSED_FILESCOPED_DECLS:
2773 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2774 UnusedFileScopedDecls.push_back(getGlobalDeclID(F, Record[I]));
2775 break;
2776
2777 case DELEGATING_CTORS:
2778 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2779 DelegatingCtorDecls.push_back(getGlobalDeclID(F, Record[I]));
2780 break;
2781
2782 case WEAK_UNDECLARED_IDENTIFIERS:
2783 if (Record.size() % 4 != 0) {
2784 Error("invalid weak identifiers record");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002785 return Failure;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002786 }
2787
2788 // FIXME: Ignore weak undeclared identifiers from non-original PCH
2789 // files. This isn't the way to do it :)
2790 WeakUndeclaredIdentifiers.clear();
2791
2792 // Translate the weak, undeclared identifiers into global IDs.
2793 for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) {
2794 WeakUndeclaredIdentifiers.push_back(
2795 getGlobalIdentifierID(F, Record[I++]));
2796 WeakUndeclaredIdentifiers.push_back(
2797 getGlobalIdentifierID(F, Record[I++]));
2798 WeakUndeclaredIdentifiers.push_back(
2799 ReadSourceLocation(F, Record, I).getRawEncoding());
2800 WeakUndeclaredIdentifiers.push_back(Record[I++]);
2801 }
2802 break;
2803
Richard Smith5ea6ef42013-01-10 23:43:47 +00002804 case LOCALLY_SCOPED_EXTERN_C_DECLS:
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002805 for (unsigned I = 0, N = Record.size(); I != N; ++I)
Richard Smith5ea6ef42013-01-10 23:43:47 +00002806 LocallyScopedExternCDecls.push_back(getGlobalDeclID(F, Record[I]));
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002807 break;
2808
2809 case SELECTOR_OFFSETS: {
Chris Lattnerb3ce3572013-01-20 02:38:54 +00002810 F.SelectorOffsets = (const uint32_t *)Blob.data();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002811 F.LocalNumSelectors = Record[0];
2812 unsigned LocalBaseSelectorID = Record[1];
2813 F.BaseSelectorID = getTotalNumSelectors();
2814
2815 if (F.LocalNumSelectors > 0) {
2816 // Introduce the global -> local mapping for selectors within this
2817 // module.
2818 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F));
2819
2820 // Introduce the local -> global mapping for selectors within this
2821 // module.
2822 F.SelectorRemap.insertOrReplace(
2823 std::make_pair(LocalBaseSelectorID,
2824 F.BaseSelectorID - LocalBaseSelectorID));
2825
2826 SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors);
2827 }
2828 break;
2829 }
2830
2831 case METHOD_POOL:
Chris Lattnerb3ce3572013-01-20 02:38:54 +00002832 F.SelectorLookupTableData = (const unsigned char *)Blob.data();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002833 if (Record[0])
2834 F.SelectorLookupTable
2835 = ASTSelectorLookupTable::Create(
2836 F.SelectorLookupTableData + Record[0],
2837 F.SelectorLookupTableData,
2838 ASTSelectorLookupTrait(*this, F));
2839 TotalNumMethodPoolEntries += Record[1];
2840 break;
2841
2842 case REFERENCED_SELECTOR_POOL:
2843 if (!Record.empty()) {
2844 for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) {
2845 ReferencedSelectorsData.push_back(getGlobalSelectorID(F,
2846 Record[Idx++]));
2847 ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx).
2848 getRawEncoding());
2849 }
2850 }
2851 break;
2852
2853 case PP_COUNTER_VALUE:
2854 if (!Record.empty() && Listener)
2855 Listener->ReadCounter(F, Record[0]);
2856 break;
2857
2858 case FILE_SORTED_DECLS:
Chris Lattnerb3ce3572013-01-20 02:38:54 +00002859 F.FileSortedDecls = (const DeclID *)Blob.data();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002860 F.NumFileSortedDecls = Record[0];
2861 break;
2862
2863 case SOURCE_LOCATION_OFFSETS: {
Chris Lattnerb3ce3572013-01-20 02:38:54 +00002864 F.SLocEntryOffsets = (const uint32_t *)Blob.data();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002865 F.LocalNumSLocEntries = Record[0];
2866 unsigned SLocSpaceSize = Record[1];
Stephen Hines651f13c2014-04-23 16:59:28 -07002867 std::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) =
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002868 SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries,
2869 SLocSpaceSize);
2870 // Make our entry in the range map. BaseID is negative and growing, so
2871 // we invert it. Because we invert it, though, we need the other end of
2872 // the range.
2873 unsigned RangeStart =
2874 unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1;
2875 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F));
2876 F.FirstLoc = SourceLocation::getFromRawEncoding(F.SLocEntryBaseOffset);
2877
2878 // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing.
2879 assert((F.SLocEntryBaseOffset & (1U << 31U)) == 0);
2880 GlobalSLocOffsetMap.insert(
2881 std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset
2882 - SLocSpaceSize,&F));
2883
2884 // Initialize the remapping table.
2885 // Invalid stays invalid.
Stephen Hines651f13c2014-04-23 16:59:28 -07002886 F.SLocRemap.insertOrReplace(std::make_pair(0U, 0));
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002887 // This module. Base was 2 when being compiled.
Stephen Hines651f13c2014-04-23 16:59:28 -07002888 F.SLocRemap.insertOrReplace(std::make_pair(2U,
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002889 static_cast<int>(F.SLocEntryBaseOffset - 2)));
2890
2891 TotalNumSLocEntries += F.LocalNumSLocEntries;
2892 break;
2893 }
2894
2895 case MODULE_OFFSET_MAP: {
2896 // Additional remapping information.
Chris Lattnerb3ce3572013-01-20 02:38:54 +00002897 const unsigned char *Data = (const unsigned char*)Blob.data();
2898 const unsigned char *DataEnd = Data + Blob.size();
Stephen Hines651f13c2014-04-23 16:59:28 -07002899
2900 // If we see this entry before SOURCE_LOCATION_OFFSETS, add placeholders.
2901 if (F.SLocRemap.find(0) == F.SLocRemap.end()) {
2902 F.SLocRemap.insert(std::make_pair(0U, 0));
2903 F.SLocRemap.insert(std::make_pair(2U, 1));
2904 }
2905
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002906 // Continuous range maps we may be updating in our module.
2907 ContinuousRangeMap<uint32_t, int, 2>::Builder SLocRemap(F.SLocRemap);
2908 ContinuousRangeMap<uint32_t, int, 2>::Builder
2909 IdentifierRemap(F.IdentifierRemap);
2910 ContinuousRangeMap<uint32_t, int, 2>::Builder
2911 MacroRemap(F.MacroRemap);
2912 ContinuousRangeMap<uint32_t, int, 2>::Builder
2913 PreprocessedEntityRemap(F.PreprocessedEntityRemap);
2914 ContinuousRangeMap<uint32_t, int, 2>::Builder
2915 SubmoduleRemap(F.SubmoduleRemap);
2916 ContinuousRangeMap<uint32_t, int, 2>::Builder
2917 SelectorRemap(F.SelectorRemap);
2918 ContinuousRangeMap<uint32_t, int, 2>::Builder DeclRemap(F.DeclRemap);
2919 ContinuousRangeMap<uint32_t, int, 2>::Builder TypeRemap(F.TypeRemap);
2920
2921 while(Data < DataEnd) {
Stephen Hines651f13c2014-04-23 16:59:28 -07002922 using namespace llvm::support;
2923 uint16_t Len = endian::readNext<uint16_t, little, unaligned>(Data);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002924 StringRef Name = StringRef((const char*)Data, Len);
2925 Data += Len;
2926 ModuleFile *OM = ModuleMgr.lookup(Name);
2927 if (!OM) {
2928 Error("SourceLocation remap refers to unknown module");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002929 return Failure;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002930 }
2931
Stephen Hines651f13c2014-04-23 16:59:28 -07002932 uint32_t SLocOffset =
2933 endian::readNext<uint32_t, little, unaligned>(Data);
2934 uint32_t IdentifierIDOffset =
2935 endian::readNext<uint32_t, little, unaligned>(Data);
2936 uint32_t MacroIDOffset =
2937 endian::readNext<uint32_t, little, unaligned>(Data);
2938 uint32_t PreprocessedEntityIDOffset =
2939 endian::readNext<uint32_t, little, unaligned>(Data);
2940 uint32_t SubmoduleIDOffset =
2941 endian::readNext<uint32_t, little, unaligned>(Data);
2942 uint32_t SelectorIDOffset =
2943 endian::readNext<uint32_t, little, unaligned>(Data);
2944 uint32_t DeclIDOffset =
2945 endian::readNext<uint32_t, little, unaligned>(Data);
2946 uint32_t TypeIndexOffset =
2947 endian::readNext<uint32_t, little, unaligned>(Data);
2948
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002949 // Source location offset is mapped to OM->SLocEntryBaseOffset.
2950 SLocRemap.insert(std::make_pair(SLocOffset,
2951 static_cast<int>(OM->SLocEntryBaseOffset - SLocOffset)));
2952 IdentifierRemap.insert(
2953 std::make_pair(IdentifierIDOffset,
2954 OM->BaseIdentifierID - IdentifierIDOffset));
2955 MacroRemap.insert(std::make_pair(MacroIDOffset,
2956 OM->BaseMacroID - MacroIDOffset));
2957 PreprocessedEntityRemap.insert(
2958 std::make_pair(PreprocessedEntityIDOffset,
2959 OM->BasePreprocessedEntityID - PreprocessedEntityIDOffset));
2960 SubmoduleRemap.insert(std::make_pair(SubmoduleIDOffset,
2961 OM->BaseSubmoduleID - SubmoduleIDOffset));
2962 SelectorRemap.insert(std::make_pair(SelectorIDOffset,
2963 OM->BaseSelectorID - SelectorIDOffset));
2964 DeclRemap.insert(std::make_pair(DeclIDOffset,
2965 OM->BaseDeclID - DeclIDOffset));
2966
2967 TypeRemap.insert(std::make_pair(TypeIndexOffset,
2968 OM->BaseTypeIndex - TypeIndexOffset));
2969
2970 // Global -> local mappings.
2971 F.GlobalToLocalDeclIDs[OM] = DeclIDOffset;
2972 }
2973 break;
2974 }
2975
2976 case SOURCE_MANAGER_LINE_TABLE:
2977 if (ParseLineTable(F, Record))
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002978 return Failure;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002979 break;
2980
2981 case SOURCE_LOCATION_PRELOADS: {
2982 // Need to transform from the local view (1-based IDs) to the global view,
2983 // which is based off F.SLocEntryBaseID.
2984 if (!F.PreloadSLocEntries.empty()) {
2985 Error("Multiple SOURCE_LOCATION_PRELOADS records in AST file");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002986 return Failure;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002987 }
2988
2989 F.PreloadSLocEntries.swap(Record);
2990 break;
2991 }
2992
2993 case EXT_VECTOR_DECLS:
2994 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2995 ExtVectorDecls.push_back(getGlobalDeclID(F, Record[I]));
2996 break;
2997
2998 case VTABLE_USES:
2999 if (Record.size() % 3 != 0) {
3000 Error("Invalid VTABLE_USES record");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003001 return Failure;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003002 }
3003
3004 // Later tables overwrite earlier ones.
3005 // FIXME: Modules will have some trouble with this. This is clearly not
3006 // the right way to do this.
3007 VTableUses.clear();
3008
3009 for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) {
3010 VTableUses.push_back(getGlobalDeclID(F, Record[Idx++]));
3011 VTableUses.push_back(
3012 ReadSourceLocation(F, Record, Idx).getRawEncoding());
3013 VTableUses.push_back(Record[Idx++]);
3014 }
3015 break;
3016
3017 case DYNAMIC_CLASSES:
3018 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3019 DynamicClasses.push_back(getGlobalDeclID(F, Record[I]));
3020 break;
3021
3022 case PENDING_IMPLICIT_INSTANTIATIONS:
3023 if (PendingInstantiations.size() % 2 != 0) {
3024 Error("Invalid existing PendingInstantiations");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003025 return Failure;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003026 }
3027
3028 if (Record.size() % 2 != 0) {
3029 Error("Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003030 return Failure;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003031 }
3032
3033 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
3034 PendingInstantiations.push_back(getGlobalDeclID(F, Record[I++]));
3035 PendingInstantiations.push_back(
3036 ReadSourceLocation(F, Record, I).getRawEncoding());
3037 }
3038 break;
3039
3040 case SEMA_DECL_REFS:
Richard Smith9b671182013-10-18 06:54:39 +00003041 if (Record.size() != 2) {
3042 Error("Invalid SEMA_DECL_REFS block");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003043 return Failure;
Richard Smith9b671182013-10-18 06:54:39 +00003044 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003045 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3046 SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
3047 break;
3048
3049 case PPD_ENTITIES_OFFSETS: {
Chris Lattnerb3ce3572013-01-20 02:38:54 +00003050 F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data();
3051 assert(Blob.size() % sizeof(PPEntityOffset) == 0);
3052 F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003053
3054 unsigned LocalBasePreprocessedEntityID = Record[0];
3055
3056 unsigned StartingID;
3057 if (!PP.getPreprocessingRecord())
3058 PP.createPreprocessingRecord();
3059 if (!PP.getPreprocessingRecord()->getExternalSource())
3060 PP.getPreprocessingRecord()->SetExternalSource(*this);
3061 StartingID
3062 = PP.getPreprocessingRecord()
3063 ->allocateLoadedEntities(F.NumPreprocessedEntities);
3064 F.BasePreprocessedEntityID = StartingID;
3065
3066 if (F.NumPreprocessedEntities > 0) {
3067 // Introduce the global -> local mapping for preprocessed entities in
3068 // this module.
3069 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
3070
3071 // Introduce the local -> global mapping for preprocessed entities in
3072 // this module.
3073 F.PreprocessedEntityRemap.insertOrReplace(
3074 std::make_pair(LocalBasePreprocessedEntityID,
3075 F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID));
3076 }
3077
3078 break;
3079 }
3080
3081 case DECL_UPDATE_OFFSETS: {
3082 if (Record.size() % 2 != 0) {
3083 Error("invalid DECL_UPDATE_OFFSETS block in AST file");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003084 return Failure;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003085 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003086 for (unsigned I = 0, N = Record.size(); I != N; I += 2) {
3087 GlobalDeclID ID = getGlobalDeclID(F, Record[I]);
3088 DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I + 1]));
3089
3090 // If we've already loaded the decl, perform the updates when we finish
3091 // loading this block.
3092 if (Decl *D = GetExistingDecl(ID))
3093 PendingUpdateRecords.push_back(std::make_pair(ID, D));
3094 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003095 break;
3096 }
3097
3098 case DECL_REPLACEMENTS: {
3099 if (Record.size() % 3 != 0) {
3100 Error("invalid DECL_REPLACEMENTS block in AST file");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003101 return Failure;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003102 }
3103 for (unsigned I = 0, N = Record.size(); I != N; I += 3)
3104 ReplacedDecls[getGlobalDeclID(F, Record[I])]
3105 = ReplacedDeclInfo(&F, Record[I+1], Record[I+2]);
3106 break;
3107 }
3108
3109 case OBJC_CATEGORIES_MAP: {
3110 if (F.LocalNumObjCCategoriesInMap != 0) {
3111 Error("duplicate OBJC_CATEGORIES_MAP record in AST file");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003112 return Failure;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003113 }
3114
3115 F.LocalNumObjCCategoriesInMap = Record[0];
Chris Lattnerb3ce3572013-01-20 02:38:54 +00003116 F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003117 break;
3118 }
3119
3120 case OBJC_CATEGORIES:
3121 F.ObjCCategories.swap(Record);
3122 break;
3123
3124 case CXX_BASE_SPECIFIER_OFFSETS: {
3125 if (F.LocalNumCXXBaseSpecifiers != 0) {
3126 Error("duplicate CXX_BASE_SPECIFIER_OFFSETS record in AST file");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003127 return Failure;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003128 }
3129
3130 F.LocalNumCXXBaseSpecifiers = Record[0];
Chris Lattnerb3ce3572013-01-20 02:38:54 +00003131 F.CXXBaseSpecifiersOffsets = (const uint32_t *)Blob.data();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003132 NumCXXBaseSpecifiersLoaded += F.LocalNumCXXBaseSpecifiers;
3133 break;
3134 }
3135
3136 case DIAG_PRAGMA_MAPPINGS:
3137 if (F.PragmaDiagMappings.empty())
3138 F.PragmaDiagMappings.swap(Record);
3139 else
3140 F.PragmaDiagMappings.insert(F.PragmaDiagMappings.end(),
3141 Record.begin(), Record.end());
3142 break;
3143
3144 case CUDA_SPECIAL_DECL_REFS:
3145 // Later tables overwrite earlier ones.
3146 // FIXME: Modules will have trouble with this.
3147 CUDASpecialDeclRefs.clear();
3148 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3149 CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
3150 break;
3151
3152 case HEADER_SEARCH_TABLE: {
Chris Lattnerb3ce3572013-01-20 02:38:54 +00003153 F.HeaderFileInfoTableData = Blob.data();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003154 F.LocalNumHeaderFileInfos = Record[1];
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003155 if (Record[0]) {
3156 F.HeaderFileInfoTable
3157 = HeaderFileInfoLookupTable::Create(
3158 (const unsigned char *)F.HeaderFileInfoTableData + Record[0],
3159 (const unsigned char *)F.HeaderFileInfoTableData,
3160 HeaderFileInfoTrait(*this, F,
3161 &PP.getHeaderSearchInfo(),
Chris Lattnerb3ce3572013-01-20 02:38:54 +00003162 Blob.data() + Record[2]));
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003163
3164 PP.getHeaderSearchInfo().SetExternalSource(this);
3165 if (!PP.getHeaderSearchInfo().getExternalLookup())
3166 PP.getHeaderSearchInfo().SetExternalLookup(this);
3167 }
3168 break;
3169 }
3170
3171 case FP_PRAGMA_OPTIONS:
3172 // Later tables overwrite earlier ones.
3173 FPPragmaOptions.swap(Record);
3174 break;
3175
3176 case OPENCL_EXTENSIONS:
3177 // Later tables overwrite earlier ones.
3178 OpenCLExtensions.swap(Record);
3179 break;
3180
3181 case TENTATIVE_DEFINITIONS:
3182 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3183 TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I]));
3184 break;
3185
3186 case KNOWN_NAMESPACES:
3187 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3188 KnownNamespaces.push_back(getGlobalDeclID(F, Record[I]));
3189 break;
Nick Lewycky01a41142013-01-26 00:35:08 +00003190
Nick Lewyckycd0655b2013-02-01 08:13:20 +00003191 case UNDEFINED_BUT_USED:
3192 if (UndefinedButUsed.size() % 2 != 0) {
3193 Error("Invalid existing UndefinedButUsed");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003194 return Failure;
Nick Lewycky01a41142013-01-26 00:35:08 +00003195 }
3196
3197 if (Record.size() % 2 != 0) {
Nick Lewyckycd0655b2013-02-01 08:13:20 +00003198 Error("invalid undefined-but-used record");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003199 return Failure;
Nick Lewycky01a41142013-01-26 00:35:08 +00003200 }
3201 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
Nick Lewyckycd0655b2013-02-01 08:13:20 +00003202 UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++]));
3203 UndefinedButUsed.push_back(
Nick Lewycky01a41142013-01-26 00:35:08 +00003204 ReadSourceLocation(F, Record, I).getRawEncoding());
3205 }
3206 break;
3207
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003208 case IMPORTED_MODULES: {
3209 if (F.Kind != MK_Module) {
3210 // If we aren't loading a module (which has its own exports), make
3211 // all of the imported modules visible.
3212 // FIXME: Deal with macros-only imports.
Stephen Hines651f13c2014-04-23 16:59:28 -07003213 for (unsigned I = 0, N = Record.size(); I != N; /**/) {
3214 unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]);
3215 SourceLocation Loc = ReadSourceLocation(F, Record, I);
3216 if (GlobalID)
3217 ImportedModules.push_back(ImportedSubmodule(GlobalID, Loc));
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003218 }
3219 }
3220 break;
3221 }
3222
3223 case LOCAL_REDECLARATIONS: {
3224 F.RedeclarationChains.swap(Record);
3225 break;
3226 }
3227
3228 case LOCAL_REDECLARATIONS_MAP: {
3229 if (F.LocalNumRedeclarationsInMap != 0) {
3230 Error("duplicate LOCAL_REDECLARATIONS_MAP record in AST file");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003231 return Failure;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003232 }
3233
3234 F.LocalNumRedeclarationsInMap = Record[0];
Chris Lattnerb3ce3572013-01-20 02:38:54 +00003235 F.RedeclarationsMap = (const LocalRedeclarationsInfo *)Blob.data();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003236 break;
3237 }
3238
3239 case MERGED_DECLARATIONS: {
3240 for (unsigned Idx = 0; Idx < Record.size(); /* increment in loop */) {
3241 GlobalDeclID CanonID = getGlobalDeclID(F, Record[Idx++]);
3242 SmallVectorImpl<GlobalDeclID> &Decls = StoredMergedDecls[CanonID];
3243 for (unsigned N = Record[Idx++]; N > 0; --N)
3244 Decls.push_back(getGlobalDeclID(F, Record[Idx++]));
3245 }
3246 break;
3247 }
3248
3249 case MACRO_OFFSET: {
3250 if (F.LocalNumMacros != 0) {
3251 Error("duplicate MACRO_OFFSET record in AST file");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003252 return Failure;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003253 }
Chris Lattnerb3ce3572013-01-20 02:38:54 +00003254 F.MacroOffsets = (const uint32_t *)Blob.data();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003255 F.LocalNumMacros = Record[0];
3256 unsigned LocalBaseMacroID = Record[1];
3257 F.BaseMacroID = getTotalNumMacros();
3258
3259 if (F.LocalNumMacros > 0) {
3260 // Introduce the global -> local mapping for macros within this module.
3261 GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F));
3262
3263 // Introduce the local -> global mapping for macros within this module.
3264 F.MacroRemap.insertOrReplace(
3265 std::make_pair(LocalBaseMacroID,
3266 F.BaseMacroID - LocalBaseMacroID));
3267
3268 MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros);
3269 }
3270 break;
3271 }
3272
Argyrios Kyrtzidis9317ab92013-03-22 21:12:57 +00003273 case MACRO_TABLE: {
3274 // FIXME: Not used yet.
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003275 break;
3276 }
Richard Smithac32d902013-08-07 21:41:30 +00003277
3278 case LATE_PARSED_TEMPLATE: {
3279 LateParsedTemplates.append(Record.begin(), Record.end());
3280 break;
3281 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003282
3283 case OPTIMIZE_PRAGMA_OPTIONS:
3284 if (Record.size() != 1) {
3285 Error("invalid pragma optimize record");
3286 return Failure;
3287 }
3288 OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]);
3289 break;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003290 }
3291 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003292}
3293
Douglas Gregor2cbd4272013-02-12 23:36:21 +00003294/// \brief Move the given method to the back of the global list of methods.
3295static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) {
3296 // Find the entry for this selector in the method pool.
3297 Sema::GlobalMethodPool::iterator Known
3298 = S.MethodPool.find(Method->getSelector());
3299 if (Known == S.MethodPool.end())
3300 return;
3301
3302 // Retrieve the appropriate method list.
3303 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
3304 : Known->second.second;
3305 bool Found = false;
Argyrios Kyrtzidis2e3d8c02013-04-17 00:08:58 +00003306 for (ObjCMethodList *List = &Start; List; List = List->getNext()) {
Douglas Gregor2cbd4272013-02-12 23:36:21 +00003307 if (!Found) {
3308 if (List->Method == Method) {
3309 Found = true;
3310 } else {
3311 // Keep searching.
3312 continue;
3313 }
3314 }
3315
Argyrios Kyrtzidis2e3d8c02013-04-17 00:08:58 +00003316 if (List->getNext())
3317 List->Method = List->getNext()->Method;
Douglas Gregor2cbd4272013-02-12 23:36:21 +00003318 else
3319 List->Method = Method;
3320 }
3321}
3322
Argyrios Kyrtzidis52151fd2013-03-27 01:25:34 +00003323void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner) {
Stephen Hines651f13c2014-04-23 16:59:28 -07003324 for (unsigned I = 0, N = Names.HiddenDecls.size(); I != N; ++I) {
3325 Decl *D = Names.HiddenDecls[I];
3326 bool wasHidden = D->Hidden;
3327 D->Hidden = false;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003328
Stephen Hines651f13c2014-04-23 16:59:28 -07003329 if (wasHidden && SemaObj) {
3330 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) {
3331 moveMethodToBackOfGlobalList(*SemaObj, Method);
Douglas Gregor2cbd4272013-02-12 23:36:21 +00003332 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003333 }
3334 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003335
3336 for (HiddenMacrosMap::const_iterator I = Names.HiddenMacros.begin(),
3337 E = Names.HiddenMacros.end();
3338 I != E; ++I)
3339 installImportedMacro(I->first, I->second, Owner);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003340}
3341
Stephen Hines651f13c2014-04-23 16:59:28 -07003342void ASTReader::makeModuleVisible(Module *Mod,
Argyrios Kyrtzidis5ebcb202013-02-01 16:36:12 +00003343 Module::NameVisibilityKind NameVisibility,
Douglas Gregor906d66a2013-03-20 21:10:35 +00003344 SourceLocation ImportLoc,
3345 bool Complain) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003346 llvm::SmallPtrSet<Module *, 4> Visited;
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00003347 SmallVector<Module *, 4> Stack;
Robert Wilhelm344472e2013-08-23 16:11:15 +00003348 Stack.push_back(Mod);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003349 while (!Stack.empty()) {
Robert Wilhelm344472e2013-08-23 16:11:15 +00003350 Mod = Stack.pop_back_val();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003351
3352 if (NameVisibility <= Mod->NameVisibility) {
Robert Wilhelm344472e2013-08-23 16:11:15 +00003353 // This module already has this level of visibility (or greater), so
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003354 // there is nothing more to do.
3355 continue;
3356 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003357
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003358 if (!Mod->isAvailable()) {
3359 // Modules that aren't available cannot be made visible.
3360 continue;
3361 }
3362
3363 // Update the module's name visibility.
Stephen Hines651f13c2014-04-23 16:59:28 -07003364 if (NameVisibility >= Module::MacrosVisible &&
3365 Mod->NameVisibility < Module::MacrosVisible)
3366 Mod->MacroVisibilityLoc = ImportLoc;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003367 Mod->NameVisibility = NameVisibility;
Stephen Hines651f13c2014-04-23 16:59:28 -07003368
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003369 // If we've already deserialized any names from this module,
3370 // mark them as visible.
3371 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
3372 if (Hidden != HiddenNamesMap.end()) {
Argyrios Kyrtzidis52151fd2013-03-27 01:25:34 +00003373 makeNamesVisible(Hidden->second, Hidden->first);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003374 HiddenNamesMap.erase(Hidden);
3375 }
Dmitri Gribenko86250892013-11-04 21:51:33 +00003376
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003377 // Push any exported modules onto the stack to be marked as visible.
Argyrios Kyrtzidis21a00042013-02-19 19:34:40 +00003378 SmallVector<Module *, 16> Exports;
3379 Mod->getExportedModules(Exports);
3380 for (SmallVectorImpl<Module *>::iterator
3381 I = Exports.begin(), E = Exports.end(); I != E; ++I) {
3382 Module *Exported = *I;
3383 if (Visited.insert(Exported))
3384 Stack.push_back(Exported);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003385 }
Douglas Gregor906d66a2013-03-20 21:10:35 +00003386
3387 // Detect any conflicts.
3388 if (Complain) {
3389 assert(ImportLoc.isValid() && "Missing import location");
3390 for (unsigned I = 0, N = Mod->Conflicts.size(); I != N; ++I) {
3391 if (Mod->Conflicts[I].Other->NameVisibility >= NameVisibility) {
3392 Diag(ImportLoc, diag::warn_module_conflict)
3393 << Mod->getFullModuleName()
3394 << Mod->Conflicts[I].Other->getFullModuleName()
3395 << Mod->Conflicts[I].Message;
3396 // FIXME: Need note where the other module was imported.
3397 }
3398 }
3399 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003400 }
3401}
3402
Douglas Gregor1a49d972013-01-25 01:03:03 +00003403bool ASTReader::loadGlobalIndex() {
3404 if (GlobalIndex)
3405 return false;
3406
3407 if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
3408 !Context.getLangOpts().Modules)
3409 return true;
3410
3411 // Try to load the global index.
3412 TriedLoadingGlobalIndex = true;
3413 StringRef ModuleCachePath
3414 = getPreprocessor().getHeaderSearchInfo().getModuleCachePath();
3415 std::pair<GlobalModuleIndex *, GlobalModuleIndex::ErrorCode> Result
Douglas Gregor677e15f2013-03-19 00:28:20 +00003416 = GlobalModuleIndex::readIndex(ModuleCachePath);
Douglas Gregor1a49d972013-01-25 01:03:03 +00003417 if (!Result.first)
3418 return true;
3419
3420 GlobalIndex.reset(Result.first);
Douglas Gregor188bdcd2013-01-25 23:32:03 +00003421 ModuleMgr.setGlobalIndex(GlobalIndex.get());
Douglas Gregor1a49d972013-01-25 01:03:03 +00003422 return false;
3423}
3424
3425bool ASTReader::isGlobalIndexUnavailable() const {
3426 return Context.getLangOpts().Modules && UseGlobalIndex &&
3427 !hasGlobalIndex() && TriedLoadingGlobalIndex;
3428}
3429
Stephen Hines651f13c2014-04-23 16:59:28 -07003430static void updateModuleTimestamp(ModuleFile &MF) {
3431 // Overwrite the timestamp file contents so that file's mtime changes.
3432 std::string TimestampFilename = MF.getTimestampFilename();
3433 std::string ErrorInfo;
3434 llvm::raw_fd_ostream OS(TimestampFilename.c_str(), ErrorInfo,
3435 llvm::sys::fs::F_Text);
3436 if (!ErrorInfo.empty())
3437 return;
3438 OS << "Timestamp file\n";
3439}
3440
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003441ASTReader::ASTReadResult ASTReader::ReadAST(const std::string &FileName,
3442 ModuleKind Type,
3443 SourceLocation ImportLoc,
3444 unsigned ClientLoadCapabilities) {
Argyrios Kyrtzidis3b7deda2013-05-24 05:44:08 +00003445 llvm::SaveAndRestore<SourceLocation>
3446 SetCurImportLocRAII(CurrentImportLoc, ImportLoc);
3447
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003448 // Defer any pending actions until we get to the end of reading the AST file.
3449 Deserializing AnASTFile(this);
3450
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003451 // Bump the generation number.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003452 unsigned PreviousGeneration = incrementGeneration(Context);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003453
3454 unsigned NumModules = ModuleMgr.size();
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00003455 SmallVector<ImportedModule, 4> Loaded;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003456 switch(ASTReadResult ReadResult = ReadASTCore(FileName, Type, ImportLoc,
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003457 /*ImportedBy=*/nullptr, Loaded,
Douglas Gregor677e15f2013-03-19 00:28:20 +00003458 0, 0,
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003459 ClientLoadCapabilities)) {
3460 case Failure:
Douglas Gregor677e15f2013-03-19 00:28:20 +00003461 case Missing:
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003462 case OutOfDate:
3463 case VersionMismatch:
3464 case ConfigurationMismatch:
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003465 case HadErrors: {
3466 llvm::SmallPtrSet<ModuleFile *, 4> LoadedSet;
3467 for (const ImportedModule &IM : Loaded)
3468 LoadedSet.insert(IM.Mod);
3469
Douglas Gregor677e15f2013-03-19 00:28:20 +00003470 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, ModuleMgr.end(),
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003471 LoadedSet,
Douglas Gregor677e15f2013-03-19 00:28:20 +00003472 Context.getLangOpts().Modules
3473 ? &PP.getHeaderSearchInfo().getModuleMap()
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003474 : nullptr);
Douglas Gregor1a49d972013-01-25 01:03:03 +00003475
3476 // If we find that any modules are unusable, the global index is going
3477 // to be out-of-date. Just remove it.
3478 GlobalIndex.reset();
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003479 ModuleMgr.setGlobalIndex(nullptr);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003480 return ReadResult;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003481 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003482 case Success:
3483 break;
3484 }
3485
3486 // Here comes stuff that we only do once the entire chain is loaded.
3487
3488 // Load the AST blocks of all of the modules that we loaded.
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00003489 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
3490 MEnd = Loaded.end();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003491 M != MEnd; ++M) {
3492 ModuleFile &F = *M->Mod;
3493
3494 // Read the AST block.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003495 if (ASTReadResult Result = ReadASTBlock(F, ClientLoadCapabilities))
3496 return Result;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003497
3498 // Once read, set the ModuleFile bit base offset and update the size in
3499 // bits of all files we've seen.
3500 F.GlobalBitOffset = TotalModulesSizeInBits;
3501 TotalModulesSizeInBits += F.SizeInBits;
3502 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F));
3503
3504 // Preload SLocEntries.
3505 for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) {
3506 int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID;
3507 // Load it through the SourceManager and don't call ReadSLocEntry()
3508 // directly because the entry may have already been loaded in which case
3509 // calling ReadSLocEntry() directly would trigger an assertion in
3510 // SourceManager.
3511 SourceMgr.getLoadedSLocEntryByID(Index);
3512 }
3513 }
3514
Douglas Gregorfa69fc12013-03-22 18:50:14 +00003515 // Setup the import locations and notify the module manager that we've
3516 // committed to these module files.
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00003517 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
3518 MEnd = Loaded.end();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003519 M != MEnd; ++M) {
3520 ModuleFile &F = *M->Mod;
Douglas Gregorfa69fc12013-03-22 18:50:14 +00003521
3522 ModuleMgr.moduleFileAccepted(&F);
3523
3524 // Set the import location.
Argyrios Kyrtzidis8b136d82013-02-01 16:36:14 +00003525 F.DirectImportLoc = ImportLoc;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003526 if (!M->ImportedBy)
3527 F.ImportLoc = M->ImportLoc;
3528 else
3529 F.ImportLoc = ReadSourceLocation(*M->ImportedBy,
3530 M->ImportLoc.getRawEncoding());
3531 }
3532
3533 // Mark all of the identifiers in the identifier table as being out of date,
3534 // so that various accessors know to check the loaded modules when the
3535 // identifier is used.
3536 for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(),
3537 IdEnd = PP.getIdentifierTable().end();
3538 Id != IdEnd; ++Id)
3539 Id->second->setOutOfDate(true);
3540
3541 // Resolve any unresolved module exports.
Douglas Gregor906d66a2013-03-20 21:10:35 +00003542 for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) {
3543 UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I];
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003544 SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID);
3545 Module *ResolvedMod = getSubmodule(GlobalID);
Douglas Gregor906d66a2013-03-20 21:10:35 +00003546
3547 switch (Unresolved.Kind) {
3548 case UnresolvedModuleRef::Conflict:
3549 if (ResolvedMod) {
3550 Module::Conflict Conflict;
3551 Conflict.Other = ResolvedMod;
3552 Conflict.Message = Unresolved.String.str();
3553 Unresolved.Mod->Conflicts.push_back(Conflict);
3554 }
3555 continue;
3556
3557 case UnresolvedModuleRef::Import:
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003558 if (ResolvedMod)
3559 Unresolved.Mod->Imports.push_back(ResolvedMod);
3560 continue;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003561
Douglas Gregor906d66a2013-03-20 21:10:35 +00003562 case UnresolvedModuleRef::Export:
3563 if (ResolvedMod || Unresolved.IsWildcard)
3564 Unresolved.Mod->Exports.push_back(
3565 Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard));
3566 continue;
3567 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003568 }
Douglas Gregor906d66a2013-03-20 21:10:35 +00003569 UnresolvedModuleRefs.clear();
Daniel Jasperddd2dfc2013-09-24 09:14:14 +00003570
3571 // FIXME: How do we load the 'use'd modules? They may not be submodules.
3572 // Might be unnecessary as use declarations are only used to build the
3573 // module itself.
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003574
3575 InitializeContext();
3576
Richard Smith9b671182013-10-18 06:54:39 +00003577 if (SemaObj)
3578 UpdateSema();
3579
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003580 if (DeserializationListener)
3581 DeserializationListener->ReaderInitialized(this);
3582
3583 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
3584 if (!PrimaryModule.OriginalSourceFileID.isInvalid()) {
3585 PrimaryModule.OriginalSourceFileID
3586 = FileID::get(PrimaryModule.SLocEntryBaseID
3587 + PrimaryModule.OriginalSourceFileID.getOpaqueValue() - 1);
3588
3589 // If this AST file is a precompiled preamble, then set the
3590 // preamble file ID of the source manager to the file source file
3591 // from which the preamble was built.
3592 if (Type == MK_Preamble) {
3593 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID);
3594 } else if (Type == MK_MainFile) {
3595 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID);
3596 }
3597 }
3598
3599 // For any Objective-C class definitions we have already loaded, make sure
3600 // that we load any additional categories.
3601 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
3602 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
3603 ObjCClassesLoaded[I],
3604 PreviousGeneration);
3605 }
Douglas Gregor1a49d972013-01-25 01:03:03 +00003606
Stephen Hines651f13c2014-04-23 16:59:28 -07003607 if (PP.getHeaderSearchInfo()
3608 .getHeaderSearchOpts()
3609 .ModulesValidateOncePerBuildSession) {
3610 // Now we are certain that the module and all modules it depends on are
3611 // up to date. Create or update timestamp files for modules that are
3612 // located in the module cache (not for PCH files that could be anywhere
3613 // in the filesystem).
3614 for (unsigned I = 0, N = Loaded.size(); I != N; ++I) {
3615 ImportedModule &M = Loaded[I];
3616 if (M.Mod->Kind == MK_Module) {
3617 updateModuleTimestamp(*M.Mod);
3618 }
3619 }
3620 }
3621
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003622 return Success;
3623}
3624
3625ASTReader::ASTReadResult
3626ASTReader::ReadASTCore(StringRef FileName,
3627 ModuleKind Type,
3628 SourceLocation ImportLoc,
3629 ModuleFile *ImportedBy,
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00003630 SmallVectorImpl<ImportedModule> &Loaded,
Douglas Gregor677e15f2013-03-19 00:28:20 +00003631 off_t ExpectedSize, time_t ExpectedModTime,
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003632 unsigned ClientLoadCapabilities) {
3633 ModuleFile *M;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003634 std::string ErrorStr;
Douglas Gregor677e15f2013-03-19 00:28:20 +00003635 ModuleManager::AddModuleResult AddResult
3636 = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy,
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003637 getGeneration(), ExpectedSize, ExpectedModTime,
Douglas Gregor677e15f2013-03-19 00:28:20 +00003638 M, ErrorStr);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003639
Douglas Gregor677e15f2013-03-19 00:28:20 +00003640 switch (AddResult) {
3641 case ModuleManager::AlreadyLoaded:
3642 return Success;
3643
3644 case ModuleManager::NewlyLoaded:
3645 // Load module file below.
3646 break;
3647
3648 case ModuleManager::Missing:
3649 // The module file was missing; if the client handle handle, that, return
3650 // it.
3651 if (ClientLoadCapabilities & ARR_Missing)
3652 return Missing;
3653
3654 // Otherwise, return an error.
3655 {
3656 std::string Msg = "Unable to load module \"" + FileName.str() + "\": "
3657 + ErrorStr;
3658 Error(Msg);
3659 }
3660 return Failure;
3661
3662 case ModuleManager::OutOfDate:
3663 // We couldn't load the module file because it is out-of-date. If the
3664 // client can handle out-of-date, return it.
3665 if (ClientLoadCapabilities & ARR_OutOfDate)
3666 return OutOfDate;
3667
3668 // Otherwise, return an error.
3669 {
3670 std::string Msg = "Unable to load module \"" + FileName.str() + "\": "
3671 + ErrorStr;
3672 Error(Msg);
3673 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003674 return Failure;
3675 }
3676
Douglas Gregor677e15f2013-03-19 00:28:20 +00003677 assert(M && "Missing module file");
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003678
3679 // FIXME: This seems rather a hack. Should CurrentDir be part of the
3680 // module?
3681 if (FileName != "-") {
3682 CurrentDir = llvm::sys::path::parent_path(FileName);
3683 if (CurrentDir.empty()) CurrentDir = ".";
3684 }
3685
3686 ModuleFile &F = *M;
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00003687 BitstreamCursor &Stream = F.Stream;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003688 Stream.init(F.StreamFile);
3689 F.SizeInBits = F.Buffer->getBufferSize() * 8;
3690
3691 // Sniff for the signature.
3692 if (Stream.Read(8) != 'C' ||
3693 Stream.Read(8) != 'P' ||
3694 Stream.Read(8) != 'C' ||
3695 Stream.Read(8) != 'H') {
3696 Diag(diag::err_not_a_pch_file) << FileName;
3697 return Failure;
3698 }
3699
3700 // This is used for compatibility with older PCH formats.
3701 bool HaveReadControlBlock = false;
3702
Chris Lattner99a5af02013-01-20 00:00:22 +00003703 while (1) {
3704 llvm::BitstreamEntry Entry = Stream.advance();
3705
3706 switch (Entry.Kind) {
3707 case llvm::BitstreamEntry::Error:
3708 case llvm::BitstreamEntry::EndBlock:
3709 case llvm::BitstreamEntry::Record:
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003710 Error("invalid record at top-level of AST file");
3711 return Failure;
Chris Lattner99a5af02013-01-20 00:00:22 +00003712
3713 case llvm::BitstreamEntry::SubBlock:
3714 break;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003715 }
3716
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003717 // We only know the control subblock ID.
Chris Lattner99a5af02013-01-20 00:00:22 +00003718 switch (Entry.ID) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003719 case llvm::bitc::BLOCKINFO_BLOCK_ID:
3720 if (Stream.ReadBlockInfoBlock()) {
3721 Error("malformed BlockInfoBlock in AST file");
3722 return Failure;
3723 }
3724 break;
3725 case CONTROL_BLOCK_ID:
3726 HaveReadControlBlock = true;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003727 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003728 case Success:
3729 break;
3730
3731 case Failure: return Failure;
Douglas Gregor677e15f2013-03-19 00:28:20 +00003732 case Missing: return Missing;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003733 case OutOfDate: return OutOfDate;
3734 case VersionMismatch: return VersionMismatch;
3735 case ConfigurationMismatch: return ConfigurationMismatch;
3736 case HadErrors: return HadErrors;
3737 }
3738 break;
3739 case AST_BLOCK_ID:
3740 if (!HaveReadControlBlock) {
3741 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
Stephen Hines651f13c2014-04-23 16:59:28 -07003742 Diag(diag::err_pch_version_too_old);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003743 return VersionMismatch;
3744 }
3745
3746 // Record that we've loaded this module.
3747 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc));
3748 return Success;
3749
3750 default:
3751 if (Stream.SkipBlock()) {
3752 Error("malformed block record in AST file");
3753 return Failure;
3754 }
3755 break;
3756 }
3757 }
3758
3759 return Success;
3760}
3761
3762void ASTReader::InitializeContext() {
3763 // If there's a listener, notify them that we "read" the translation unit.
3764 if (DeserializationListener)
3765 DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID,
3766 Context.getTranslationUnitDecl());
3767
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003768 // FIXME: Find a better way to deal with collisions between these
3769 // built-in types. Right now, we just ignore the problem.
3770
3771 // Load the special types.
3772 if (SpecialTypes.size() >= NumSpecialTypeIDs) {
3773 if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) {
3774 if (!Context.CFConstantStringTypeDecl)
3775 Context.setCFConstantStringType(GetType(String));
3776 }
3777
3778 if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) {
3779 QualType FileType = GetType(File);
3780 if (FileType.isNull()) {
3781 Error("FILE type is NULL");
3782 return;
3783 }
3784
3785 if (!Context.FILEDecl) {
3786 if (const TypedefType *Typedef = FileType->getAs<TypedefType>())
3787 Context.setFILEDecl(Typedef->getDecl());
3788 else {
3789 const TagType *Tag = FileType->getAs<TagType>();
3790 if (!Tag) {
3791 Error("Invalid FILE type in AST file");
3792 return;
3793 }
3794 Context.setFILEDecl(Tag->getDecl());
3795 }
3796 }
3797 }
3798
3799 if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) {
3800 QualType Jmp_bufType = GetType(Jmp_buf);
3801 if (Jmp_bufType.isNull()) {
3802 Error("jmp_buf type is NULL");
3803 return;
3804 }
3805
3806 if (!Context.jmp_bufDecl) {
3807 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>())
3808 Context.setjmp_bufDecl(Typedef->getDecl());
3809 else {
3810 const TagType *Tag = Jmp_bufType->getAs<TagType>();
3811 if (!Tag) {
3812 Error("Invalid jmp_buf type in AST file");
3813 return;
3814 }
3815 Context.setjmp_bufDecl(Tag->getDecl());
3816 }
3817 }
3818 }
3819
3820 if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) {
3821 QualType Sigjmp_bufType = GetType(Sigjmp_buf);
3822 if (Sigjmp_bufType.isNull()) {
3823 Error("sigjmp_buf type is NULL");
3824 return;
3825 }
3826
3827 if (!Context.sigjmp_bufDecl) {
3828 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>())
3829 Context.setsigjmp_bufDecl(Typedef->getDecl());
3830 else {
3831 const TagType *Tag = Sigjmp_bufType->getAs<TagType>();
3832 assert(Tag && "Invalid sigjmp_buf type in AST file");
3833 Context.setsigjmp_bufDecl(Tag->getDecl());
3834 }
3835 }
3836 }
3837
3838 if (unsigned ObjCIdRedef
3839 = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) {
3840 if (Context.ObjCIdRedefinitionType.isNull())
3841 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef);
3842 }
3843
3844 if (unsigned ObjCClassRedef
3845 = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) {
3846 if (Context.ObjCClassRedefinitionType.isNull())
3847 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef);
3848 }
3849
3850 if (unsigned ObjCSelRedef
3851 = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) {
3852 if (Context.ObjCSelRedefinitionType.isNull())
3853 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef);
3854 }
3855
3856 if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) {
3857 QualType Ucontext_tType = GetType(Ucontext_t);
3858 if (Ucontext_tType.isNull()) {
3859 Error("ucontext_t type is NULL");
3860 return;
3861 }
3862
3863 if (!Context.ucontext_tDecl) {
3864 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>())
3865 Context.setucontext_tDecl(Typedef->getDecl());
3866 else {
3867 const TagType *Tag = Ucontext_tType->getAs<TagType>();
3868 assert(Tag && "Invalid ucontext_t type in AST file");
3869 Context.setucontext_tDecl(Tag->getDecl());
3870 }
3871 }
3872 }
3873 }
3874
3875 ReadPragmaDiagnosticMappings(Context.getDiagnostics());
3876
3877 // If there were any CUDA special declarations, deserialize them.
3878 if (!CUDASpecialDeclRefs.empty()) {
3879 assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!");
3880 Context.setcudaConfigureCallDecl(
3881 cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0])));
3882 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003883
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003884 // Re-export any modules that were imported by a non-module AST file.
Stephen Hines651f13c2014-04-23 16:59:28 -07003885 // FIXME: This does not make macro-only imports visible again. It also doesn't
3886 // make #includes mapped to module imports visible.
3887 for (auto &Import : ImportedModules) {
3888 if (Module *Imported = getSubmodule(Import.ID))
Argyrios Kyrtzidis5ebcb202013-02-01 16:36:12 +00003889 makeModuleVisible(Imported, Module::AllVisible,
Stephen Hines651f13c2014-04-23 16:59:28 -07003890 /*ImportLoc=*/Import.ImportLoc,
Douglas Gregor906d66a2013-03-20 21:10:35 +00003891 /*Complain=*/false);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003892 }
3893 ImportedModules.clear();
3894}
3895
3896void ASTReader::finalizeForWriting() {
3897 for (HiddenNamesMapType::iterator Hidden = HiddenNamesMap.begin(),
3898 HiddenEnd = HiddenNamesMap.end();
3899 Hidden != HiddenEnd; ++Hidden) {
Argyrios Kyrtzidis52151fd2013-03-27 01:25:34 +00003900 makeNamesVisible(Hidden->second, Hidden->first);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003901 }
3902 HiddenNamesMap.clear();
3903}
3904
Argyrios Kyrtzidisbdfdb1d2013-05-06 19:23:40 +00003905/// \brief Given a cursor at the start of an AST file, scan ahead and drop the
3906/// cursor into the start of the given block ID, returning false on success and
3907/// true on failure.
3908static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) {
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00003909 while (1) {
3910 llvm::BitstreamEntry Entry = Cursor.advance();
3911 switch (Entry.Kind) {
3912 case llvm::BitstreamEntry::Error:
3913 case llvm::BitstreamEntry::EndBlock:
3914 return true;
3915
3916 case llvm::BitstreamEntry::Record:
3917 // Ignore top-level records.
3918 Cursor.skipRecord(Entry.ID);
3919 break;
3920
3921 case llvm::BitstreamEntry::SubBlock:
Argyrios Kyrtzidisbdfdb1d2013-05-06 19:23:40 +00003922 if (Entry.ID == BlockID) {
3923 if (Cursor.EnterSubBlock(BlockID))
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00003924 return true;
3925 // Found it!
3926 return false;
3927 }
3928
3929 if (Cursor.SkipBlock())
3930 return true;
3931 }
3932 }
3933}
3934
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003935/// \brief Retrieve the name of the original source file name
3936/// directly from the AST file, without actually loading the AST
3937/// file.
3938std::string ASTReader::getOriginalSourceFile(const std::string &ASTFileName,
3939 FileManager &FileMgr,
3940 DiagnosticsEngine &Diags) {
3941 // Open the AST file.
3942 std::string ErrStr;
Stephen Hines651f13c2014-04-23 16:59:28 -07003943 std::unique_ptr<llvm::MemoryBuffer> Buffer;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003944 Buffer.reset(FileMgr.getBufferForFile(ASTFileName, &ErrStr));
3945 if (!Buffer) {
3946 Diags.Report(diag::err_fe_unable_to_read_pch_file) << ASTFileName << ErrStr;
3947 return std::string();
3948 }
3949
3950 // Initialize the stream
3951 llvm::BitstreamReader StreamFile;
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00003952 BitstreamCursor Stream;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003953 StreamFile.init((const unsigned char *)Buffer->getBufferStart(),
3954 (const unsigned char *)Buffer->getBufferEnd());
3955 Stream.init(StreamFile);
3956
3957 // Sniff for the signature.
3958 if (Stream.Read(8) != 'C' ||
3959 Stream.Read(8) != 'P' ||
3960 Stream.Read(8) != 'C' ||
3961 Stream.Read(8) != 'H') {
3962 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName;
3963 return std::string();
3964 }
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00003965
Chris Lattner88bde502013-01-19 21:39:22 +00003966 // Scan for the CONTROL_BLOCK_ID block.
Argyrios Kyrtzidisbdfdb1d2013-05-06 19:23:40 +00003967 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) {
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00003968 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
3969 return std::string();
Chris Lattner88bde502013-01-19 21:39:22 +00003970 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003971
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00003972 // Scan for ORIGINAL_FILE inside the control block.
3973 RecordData Record;
Chris Lattner88bde502013-01-19 21:39:22 +00003974 while (1) {
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00003975 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
Chris Lattner88bde502013-01-19 21:39:22 +00003976 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
3977 return std::string();
3978
3979 if (Entry.Kind != llvm::BitstreamEntry::Record) {
3980 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
3981 return std::string();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003982 }
Chris Lattner88bde502013-01-19 21:39:22 +00003983
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003984 Record.clear();
Chris Lattnerb3ce3572013-01-20 02:38:54 +00003985 StringRef Blob;
3986 if (Stream.readRecord(Entry.ID, Record, &Blob) == ORIGINAL_FILE)
3987 return Blob.str();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003988 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003989}
3990
3991namespace {
3992 class SimplePCHValidator : public ASTReaderListener {
3993 const LangOptions &ExistingLangOpts;
3994 const TargetOptions &ExistingTargetOpts;
3995 const PreprocessorOptions &ExistingPPOpts;
3996 FileManager &FileMgr;
3997
3998 public:
3999 SimplePCHValidator(const LangOptions &ExistingLangOpts,
4000 const TargetOptions &ExistingTargetOpts,
4001 const PreprocessorOptions &ExistingPPOpts,
4002 FileManager &FileMgr)
4003 : ExistingLangOpts(ExistingLangOpts),
4004 ExistingTargetOpts(ExistingTargetOpts),
4005 ExistingPPOpts(ExistingPPOpts),
4006 FileMgr(FileMgr)
4007 {
4008 }
4009
Stephen Hines651f13c2014-04-23 16:59:28 -07004010 bool ReadLanguageOptions(const LangOptions &LangOpts,
4011 bool Complain) override {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004012 return checkLanguageOptions(ExistingLangOpts, LangOpts, nullptr);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004013 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004014 bool ReadTargetOptions(const TargetOptions &TargetOpts,
4015 bool Complain) override {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004016 return checkTargetOptions(ExistingTargetOpts, TargetOpts, nullptr);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004017 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004018 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
4019 bool Complain,
4020 std::string &SuggestedPredefines) override {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004021 return checkPreprocessorOptions(ExistingPPOpts, PPOpts, nullptr, FileMgr,
Argyrios Kyrtzidis65110ca2013-04-26 21:33:40 +00004022 SuggestedPredefines, ExistingLangOpts);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004023 }
4024 };
4025}
4026
4027bool ASTReader::readASTFileControlBlock(StringRef Filename,
4028 FileManager &FileMgr,
4029 ASTReaderListener &Listener) {
4030 // Open the AST file.
4031 std::string ErrStr;
Stephen Hines651f13c2014-04-23 16:59:28 -07004032 std::unique_ptr<llvm::MemoryBuffer> Buffer;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004033 Buffer.reset(FileMgr.getBufferForFile(Filename, &ErrStr));
4034 if (!Buffer) {
4035 return true;
4036 }
4037
4038 // Initialize the stream
4039 llvm::BitstreamReader StreamFile;
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00004040 BitstreamCursor Stream;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004041 StreamFile.init((const unsigned char *)Buffer->getBufferStart(),
4042 (const unsigned char *)Buffer->getBufferEnd());
4043 Stream.init(StreamFile);
4044
4045 // Sniff for the signature.
4046 if (Stream.Read(8) != 'C' ||
4047 Stream.Read(8) != 'P' ||
4048 Stream.Read(8) != 'C' ||
4049 Stream.Read(8) != 'H') {
4050 return true;
4051 }
4052
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00004053 // Scan for the CONTROL_BLOCK_ID block.
Argyrios Kyrtzidisbdfdb1d2013-05-06 19:23:40 +00004054 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID))
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00004055 return true;
Argyrios Kyrtzidisbdfdb1d2013-05-06 19:23:40 +00004056
4057 bool NeedsInputFiles = Listener.needsInputFileVisitation();
Stephen Hines651f13c2014-04-23 16:59:28 -07004058 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
Argyrios Kyrtzidisbdfdb1d2013-05-06 19:23:40 +00004059 BitstreamCursor InputFilesCursor;
4060 if (NeedsInputFiles) {
4061 InputFilesCursor = Stream;
4062 if (SkipCursorToBlock(InputFilesCursor, INPUT_FILES_BLOCK_ID))
4063 return true;
4064
4065 // Read the abbreviations
4066 while (true) {
4067 uint64_t Offset = InputFilesCursor.GetCurrentBitNo();
4068 unsigned Code = InputFilesCursor.ReadCode();
4069
4070 // We expect all abbrevs to be at the start of the block.
4071 if (Code != llvm::bitc::DEFINE_ABBREV) {
4072 InputFilesCursor.JumpToBit(Offset);
4073 break;
4074 }
4075 InputFilesCursor.ReadAbbrevRecord();
4076 }
4077 }
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00004078
4079 // Scan for ORIGINAL_FILE inside the control block.
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004080 RecordData Record;
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00004081 while (1) {
4082 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
4083 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
4084 return false;
4085
4086 if (Entry.Kind != llvm::BitstreamEntry::Record)
4087 return true;
4088
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004089 Record.clear();
Chris Lattnerb3ce3572013-01-20 02:38:54 +00004090 StringRef Blob;
4091 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob);
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00004092 switch ((ControlRecordTypes)RecCode) {
4093 case METADATA: {
4094 if (Record[0] != VERSION_MAJOR)
4095 return true;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004096
Douglas Gregorc544ba02013-03-27 16:47:18 +00004097 if (Listener.ReadFullVersionInformation(Blob))
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00004098 return true;
Douglas Gregorc544ba02013-03-27 16:47:18 +00004099
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00004100 break;
4101 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004102 case MODULE_NAME:
4103 Listener.ReadModuleName(Blob);
4104 break;
4105 case MODULE_MAP_FILE:
4106 Listener.ReadModuleMapFile(Blob);
4107 break;
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00004108 case LANGUAGE_OPTIONS:
4109 if (ParseLanguageOptions(Record, false, Listener))
4110 return true;
4111 break;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004112
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00004113 case TARGET_OPTIONS:
4114 if (ParseTargetOptions(Record, false, Listener))
4115 return true;
4116 break;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004117
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00004118 case DIAGNOSTIC_OPTIONS:
4119 if (ParseDiagnosticOptions(Record, false, Listener))
4120 return true;
4121 break;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004122
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00004123 case FILE_SYSTEM_OPTIONS:
4124 if (ParseFileSystemOptions(Record, false, Listener))
4125 return true;
4126 break;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004127
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00004128 case HEADER_SEARCH_OPTIONS:
4129 if (ParseHeaderSearchOptions(Record, false, Listener))
4130 return true;
4131 break;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004132
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00004133 case PREPROCESSOR_OPTIONS: {
4134 std::string IgnoredSuggestedPredefines;
4135 if (ParsePreprocessorOptions(Record, false, Listener,
4136 IgnoredSuggestedPredefines))
4137 return true;
4138 break;
4139 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004140
Argyrios Kyrtzidisbdfdb1d2013-05-06 19:23:40 +00004141 case INPUT_FILE_OFFSETS: {
4142 if (!NeedsInputFiles)
4143 break;
4144
4145 unsigned NumInputFiles = Record[0];
4146 unsigned NumUserFiles = Record[1];
4147 const uint32_t *InputFileOffs = (const uint32_t *)Blob.data();
4148 for (unsigned I = 0; I != NumInputFiles; ++I) {
4149 // Go find this input file.
4150 bool isSystemFile = I >= NumUserFiles;
Stephen Hines651f13c2014-04-23 16:59:28 -07004151
4152 if (isSystemFile && !NeedsSystemInputFiles)
4153 break; // the rest are system input files
4154
Argyrios Kyrtzidisbdfdb1d2013-05-06 19:23:40 +00004155 BitstreamCursor &Cursor = InputFilesCursor;
4156 SavedStreamPosition SavedPosition(Cursor);
4157 Cursor.JumpToBit(InputFileOffs[I]);
4158
4159 unsigned Code = Cursor.ReadCode();
4160 RecordData Record;
4161 StringRef Blob;
4162 bool shouldContinue = false;
4163 switch ((InputFileRecordTypes)Cursor.readRecord(Code, Record, &Blob)) {
4164 case INPUT_FILE:
Stephen Hines651f13c2014-04-23 16:59:28 -07004165 bool Overridden = static_cast<bool>(Record[3]);
4166 shouldContinue = Listener.visitInputFile(Blob, isSystemFile, Overridden);
Argyrios Kyrtzidisbdfdb1d2013-05-06 19:23:40 +00004167 break;
4168 }
4169 if (!shouldContinue)
4170 break;
4171 }
4172 break;
4173 }
4174
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00004175 default:
4176 // No other validation to perform.
4177 break;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004178 }
4179 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004180}
4181
4182
4183bool ASTReader::isAcceptableASTFile(StringRef Filename,
4184 FileManager &FileMgr,
4185 const LangOptions &LangOpts,
4186 const TargetOptions &TargetOpts,
4187 const PreprocessorOptions &PPOpts) {
4188 SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts, FileMgr);
4189 return !readASTFileControlBlock(Filename, FileMgr, validator);
4190}
4191
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004192ASTReader::ASTReadResult
4193ASTReader::ReadSubmoduleBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004194 // Enter the submodule block.
4195 if (F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) {
4196 Error("malformed submodule block record in AST file");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004197 return Failure;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004198 }
4199
4200 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
4201 bool First = true;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004202 Module *CurrentModule = nullptr;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004203 RecordData Record;
4204 while (true) {
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00004205 llvm::BitstreamEntry Entry = F.Stream.advanceSkippingSubblocks();
4206
4207 switch (Entry.Kind) {
4208 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
4209 case llvm::BitstreamEntry::Error:
4210 Error("malformed block record in AST file");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004211 return Failure;
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00004212 case llvm::BitstreamEntry::EndBlock:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004213 return Success;
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00004214 case llvm::BitstreamEntry::Record:
4215 // The interesting case.
4216 break;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004217 }
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00004218
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004219 // Read a record.
Chris Lattnerb3ce3572013-01-20 02:38:54 +00004220 StringRef Blob;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004221 Record.clear();
Chris Lattnerb3ce3572013-01-20 02:38:54 +00004222 switch (F.Stream.readRecord(Entry.ID, Record, &Blob)) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004223 default: // Default behavior: ignore.
4224 break;
4225
4226 case SUBMODULE_DEFINITION: {
4227 if (First) {
4228 Error("missing submodule metadata record at beginning of block");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004229 return Failure;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004230 }
4231
Douglas Gregor970e4412013-03-20 03:59:18 +00004232 if (Record.size() < 8) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004233 Error("malformed module definition");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004234 return Failure;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004235 }
4236
Chris Lattnerb3ce3572013-01-20 02:38:54 +00004237 StringRef Name = Blob;
Stephen Hines651f13c2014-04-23 16:59:28 -07004238 unsigned Idx = 0;
4239 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]);
4240 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]);
4241 bool IsFramework = Record[Idx++];
4242 bool IsExplicit = Record[Idx++];
4243 bool IsSystem = Record[Idx++];
4244 bool IsExternC = Record[Idx++];
4245 bool InferSubmodules = Record[Idx++];
4246 bool InferExplicitSubmodules = Record[Idx++];
4247 bool InferExportWildcard = Record[Idx++];
4248 bool ConfigMacrosExhaustive = Record[Idx++];
Douglas Gregor970e4412013-03-20 03:59:18 +00004249
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004250 Module *ParentModule = nullptr;
4251 const FileEntry *ModuleMap = nullptr;
4252 if (Parent) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004253 ParentModule = getSubmodule(Parent);
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004254 ModuleMap = ParentModule->ModuleMap;
4255 }
4256
4257 if (!F.ModuleMapPath.empty())
4258 ModuleMap = FileMgr.getFile(F.ModuleMapPath);
4259
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004260 // Retrieve this (sub)module from the module map, creating it if
4261 // necessary.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004262 CurrentModule = ModMap.findOrCreateModule(Name, ParentModule, ModuleMap,
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004263 IsFramework,
4264 IsExplicit).first;
4265 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS;
4266 if (GlobalIndex >= SubmodulesLoaded.size() ||
4267 SubmodulesLoaded[GlobalIndex]) {
4268 Error("too many submodules");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004269 return Failure;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004270 }
Douglas Gregor8bf778e2013-02-06 22:40:31 +00004271
Douglas Gregor677e15f2013-03-19 00:28:20 +00004272 if (!ParentModule) {
4273 if (const FileEntry *CurFile = CurrentModule->getASTFile()) {
4274 if (CurFile != F.File) {
4275 if (!Diags.isDiagnosticInFlight()) {
4276 Diag(diag::err_module_file_conflict)
4277 << CurrentModule->getTopLevelModuleName()
4278 << CurFile->getName()
4279 << F.File->getName();
4280 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004281 return Failure;
Douglas Gregor8bf778e2013-02-06 22:40:31 +00004282 }
Douglas Gregor8bf778e2013-02-06 22:40:31 +00004283 }
Douglas Gregor677e15f2013-03-19 00:28:20 +00004284
4285 CurrentModule->setASTFile(F.File);
Douglas Gregor8bf778e2013-02-06 22:40:31 +00004286 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004287
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004288 CurrentModule->IsFromModuleFile = true;
4289 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem;
Stephen Hines651f13c2014-04-23 16:59:28 -07004290 CurrentModule->IsExternC = IsExternC;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004291 CurrentModule->InferSubmodules = InferSubmodules;
4292 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules;
4293 CurrentModule->InferExportWildcard = InferExportWildcard;
Douglas Gregor970e4412013-03-20 03:59:18 +00004294 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004295 if (DeserializationListener)
4296 DeserializationListener->ModuleRead(GlobalID, CurrentModule);
4297
4298 SubmodulesLoaded[GlobalIndex] = CurrentModule;
Douglas Gregorb6cbe512013-01-14 17:21:00 +00004299
Douglas Gregor906d66a2013-03-20 21:10:35 +00004300 // Clear out data that will be replaced by what is the module file.
Douglas Gregorb6cbe512013-01-14 17:21:00 +00004301 CurrentModule->LinkLibraries.clear();
Douglas Gregor970e4412013-03-20 03:59:18 +00004302 CurrentModule->ConfigMacros.clear();
Douglas Gregor906d66a2013-03-20 21:10:35 +00004303 CurrentModule->UnresolvedConflicts.clear();
4304 CurrentModule->Conflicts.clear();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004305 break;
4306 }
4307
4308 case SUBMODULE_UMBRELLA_HEADER: {
4309 if (First) {
4310 Error("missing submodule metadata record at beginning of block");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004311 return Failure;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004312 }
4313
4314 if (!CurrentModule)
4315 break;
4316
Chris Lattnerb3ce3572013-01-20 02:38:54 +00004317 if (const FileEntry *Umbrella = PP.getFileManager().getFile(Blob)) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004318 if (!CurrentModule->getUmbrellaHeader())
4319 ModMap.setUmbrellaHeader(CurrentModule, Umbrella);
4320 else if (CurrentModule->getUmbrellaHeader() != Umbrella) {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004321 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
4322 Error("mismatched umbrella headers in submodule");
4323 return OutOfDate;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004324 }
4325 }
4326 break;
4327 }
4328
4329 case SUBMODULE_HEADER: {
4330 if (First) {
4331 Error("missing submodule metadata record at beginning of block");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004332 return Failure;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004333 }
4334
4335 if (!CurrentModule)
4336 break;
4337
Argyrios Kyrtzidis55ea75b2013-03-13 21:13:51 +00004338 // We lazily associate headers with their modules via the HeaderInfoTable.
4339 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
4340 // of complete filenames or remove it entirely.
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004341 break;
4342 }
4343
4344 case SUBMODULE_EXCLUDED_HEADER: {
4345 if (First) {
4346 Error("missing submodule metadata record at beginning of block");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004347 return Failure;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004348 }
4349
4350 if (!CurrentModule)
4351 break;
4352
Argyrios Kyrtzidis55ea75b2013-03-13 21:13:51 +00004353 // We lazily associate headers with their modules via the HeaderInfoTable.
4354 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
4355 // of complete filenames or remove it entirely.
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004356 break;
4357 }
4358
Lawrence Crowlbc3f6282013-06-20 21:14:14 +00004359 case SUBMODULE_PRIVATE_HEADER: {
4360 if (First) {
4361 Error("missing submodule metadata record at beginning of block");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004362 return Failure;
Lawrence Crowlbc3f6282013-06-20 21:14:14 +00004363 }
4364
4365 if (!CurrentModule)
4366 break;
4367
4368 // We lazily associate headers with their modules via the HeaderInfoTable.
4369 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
4370 // of complete filenames or remove it entirely.
4371 break;
4372 }
4373
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004374 case SUBMODULE_TOPHEADER: {
4375 if (First) {
4376 Error("missing submodule metadata record at beginning of block");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004377 return Failure;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004378 }
4379
4380 if (!CurrentModule)
4381 break;
4382
Argyrios Kyrtzidisc1d22392013-03-13 21:13:43 +00004383 CurrentModule->addTopHeaderFilename(Blob);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004384 break;
4385 }
4386
4387 case SUBMODULE_UMBRELLA_DIR: {
4388 if (First) {
4389 Error("missing submodule metadata record at beginning of block");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004390 return Failure;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004391 }
4392
4393 if (!CurrentModule)
4394 break;
4395
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004396 if (const DirectoryEntry *Umbrella
Chris Lattnerb3ce3572013-01-20 02:38:54 +00004397 = PP.getFileManager().getDirectory(Blob)) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004398 if (!CurrentModule->getUmbrellaDir())
4399 ModMap.setUmbrellaDir(CurrentModule, Umbrella);
4400 else if (CurrentModule->getUmbrellaDir() != Umbrella) {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004401 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
4402 Error("mismatched umbrella directories in submodule");
4403 return OutOfDate;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004404 }
4405 }
4406 break;
4407 }
4408
4409 case SUBMODULE_METADATA: {
4410 if (!First) {
4411 Error("submodule metadata record not at beginning of block");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004412 return Failure;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004413 }
4414 First = false;
4415
4416 F.BaseSubmoduleID = getTotalNumSubmodules();
4417 F.LocalNumSubmodules = Record[0];
4418 unsigned LocalBaseSubmoduleID = Record[1];
4419 if (F.LocalNumSubmodules > 0) {
4420 // Introduce the global -> local mapping for submodules within this
4421 // module.
4422 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F));
4423
4424 // Introduce the local -> global mapping for submodules within this
4425 // module.
4426 F.SubmoduleRemap.insertOrReplace(
4427 std::make_pair(LocalBaseSubmoduleID,
4428 F.BaseSubmoduleID - LocalBaseSubmoduleID));
4429
4430 SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules);
4431 }
4432 break;
4433 }
4434
4435 case SUBMODULE_IMPORTS: {
4436 if (First) {
4437 Error("missing submodule metadata record at beginning of block");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004438 return Failure;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004439 }
4440
4441 if (!CurrentModule)
4442 break;
4443
4444 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) {
Douglas Gregor906d66a2013-03-20 21:10:35 +00004445 UnresolvedModuleRef Unresolved;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004446 Unresolved.File = &F;
4447 Unresolved.Mod = CurrentModule;
4448 Unresolved.ID = Record[Idx];
Douglas Gregor906d66a2013-03-20 21:10:35 +00004449 Unresolved.Kind = UnresolvedModuleRef::Import;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004450 Unresolved.IsWildcard = false;
Douglas Gregor906d66a2013-03-20 21:10:35 +00004451 UnresolvedModuleRefs.push_back(Unresolved);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004452 }
4453 break;
4454 }
4455
4456 case SUBMODULE_EXPORTS: {
4457 if (First) {
4458 Error("missing submodule metadata record at beginning of block");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004459 return Failure;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004460 }
4461
4462 if (!CurrentModule)
4463 break;
4464
4465 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) {
Douglas Gregor906d66a2013-03-20 21:10:35 +00004466 UnresolvedModuleRef Unresolved;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004467 Unresolved.File = &F;
4468 Unresolved.Mod = CurrentModule;
4469 Unresolved.ID = Record[Idx];
Douglas Gregor906d66a2013-03-20 21:10:35 +00004470 Unresolved.Kind = UnresolvedModuleRef::Export;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004471 Unresolved.IsWildcard = Record[Idx + 1];
Douglas Gregor906d66a2013-03-20 21:10:35 +00004472 UnresolvedModuleRefs.push_back(Unresolved);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004473 }
4474
4475 // Once we've loaded the set of exports, there's no reason to keep
4476 // the parsed, unresolved exports around.
4477 CurrentModule->UnresolvedExports.clear();
4478 break;
4479 }
4480 case SUBMODULE_REQUIRES: {
4481 if (First) {
4482 Error("missing submodule metadata record at beginning of block");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004483 return Failure;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004484 }
4485
4486 if (!CurrentModule)
4487 break;
4488
Richard Smith5794b532013-10-28 22:18:19 +00004489 CurrentModule->addRequirement(Blob, Record[0], Context.getLangOpts(),
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004490 Context.getTargetInfo());
4491 break;
4492 }
Douglas Gregorb6cbe512013-01-14 17:21:00 +00004493
4494 case SUBMODULE_LINK_LIBRARY:
4495 if (First) {
4496 Error("missing submodule metadata record at beginning of block");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004497 return Failure;
Douglas Gregorb6cbe512013-01-14 17:21:00 +00004498 }
4499
4500 if (!CurrentModule)
4501 break;
4502
4503 CurrentModule->LinkLibraries.push_back(
Chris Lattnerb3ce3572013-01-20 02:38:54 +00004504 Module::LinkLibrary(Blob, Record[0]));
Douglas Gregorb6cbe512013-01-14 17:21:00 +00004505 break;
Douglas Gregor63a72682013-03-20 00:22:05 +00004506
4507 case SUBMODULE_CONFIG_MACRO:
4508 if (First) {
4509 Error("missing submodule metadata record at beginning of block");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004510 return Failure;
Douglas Gregor63a72682013-03-20 00:22:05 +00004511 }
4512
4513 if (!CurrentModule)
4514 break;
4515
4516 CurrentModule->ConfigMacros.push_back(Blob.str());
4517 break;
Douglas Gregor906d66a2013-03-20 21:10:35 +00004518
4519 case SUBMODULE_CONFLICT: {
4520 if (First) {
4521 Error("missing submodule metadata record at beginning of block");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004522 return Failure;
Douglas Gregor906d66a2013-03-20 21:10:35 +00004523 }
4524
4525 if (!CurrentModule)
4526 break;
4527
4528 UnresolvedModuleRef Unresolved;
4529 Unresolved.File = &F;
4530 Unresolved.Mod = CurrentModule;
4531 Unresolved.ID = Record[0];
4532 Unresolved.Kind = UnresolvedModuleRef::Conflict;
4533 Unresolved.IsWildcard = false;
4534 Unresolved.String = Blob;
4535 UnresolvedModuleRefs.push_back(Unresolved);
4536 break;
4537 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004538 }
4539 }
4540}
4541
4542/// \brief Parse the record that corresponds to a LangOptions data
4543/// structure.
4544///
4545/// This routine parses the language options from the AST file and then gives
4546/// them to the AST listener if one is set.
4547///
4548/// \returns true if the listener deems the file unacceptable, false otherwise.
4549bool ASTReader::ParseLanguageOptions(const RecordData &Record,
4550 bool Complain,
4551 ASTReaderListener &Listener) {
4552 LangOptions LangOpts;
4553 unsigned Idx = 0;
4554#define LANGOPT(Name, Bits, Default, Description) \
4555 LangOpts.Name = Record[Idx++];
4556#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
4557 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
4558#include "clang/Basic/LangOptions.def"
Will Dietz4f45bc02013-01-18 11:30:38 +00004559#define SANITIZER(NAME, ID) LangOpts.Sanitize.ID = Record[Idx++];
4560#include "clang/Basic/Sanitizers.def"
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004561
4562 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++];
4563 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx);
4564 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion);
4565
4566 unsigned Length = Record[Idx++];
4567 LangOpts.CurrentModule.assign(Record.begin() + Idx,
4568 Record.begin() + Idx + Length);
Dmitri Gribenko6ebf0912013-02-22 14:21:27 +00004569
4570 Idx += Length;
4571
4572 // Comment options.
4573 for (unsigned N = Record[Idx++]; N; --N) {
4574 LangOpts.CommentOpts.BlockCommandNames.push_back(
4575 ReadString(Record, Idx));
4576 }
Dmitri Gribenko6fd7d302013-04-10 15:35:17 +00004577 LangOpts.CommentOpts.ParseAllComments = Record[Idx++];
Dmitri Gribenko6ebf0912013-02-22 14:21:27 +00004578
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004579 return Listener.ReadLanguageOptions(LangOpts, Complain);
4580}
4581
4582bool ASTReader::ParseTargetOptions(const RecordData &Record,
4583 bool Complain,
4584 ASTReaderListener &Listener) {
4585 unsigned Idx = 0;
4586 TargetOptions TargetOpts;
4587 TargetOpts.Triple = ReadString(Record, Idx);
4588 TargetOpts.CPU = ReadString(Record, Idx);
4589 TargetOpts.ABI = ReadString(Record, Idx);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004590 for (unsigned N = Record[Idx++]; N; --N) {
4591 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx));
4592 }
4593 for (unsigned N = Record[Idx++]; N; --N) {
4594 TargetOpts.Features.push_back(ReadString(Record, Idx));
4595 }
4596
4597 return Listener.ReadTargetOptions(TargetOpts, Complain);
4598}
4599
4600bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain,
4601 ASTReaderListener &Listener) {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004602 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004603 unsigned Idx = 0;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004604#define DIAGOPT(Name, Bits, Default) DiagOpts->Name = Record[Idx++];
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004605#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004606 DiagOpts->set##Name(static_cast<Type>(Record[Idx++]));
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004607#include "clang/Basic/DiagnosticOptions.def"
4608
4609 for (unsigned N = Record[Idx++]; N; --N) {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004610 DiagOpts->Warnings.push_back(ReadString(Record, Idx));
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004611 }
4612
4613 return Listener.ReadDiagnosticOptions(DiagOpts, Complain);
4614}
4615
4616bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain,
4617 ASTReaderListener &Listener) {
4618 FileSystemOptions FSOpts;
4619 unsigned Idx = 0;
4620 FSOpts.WorkingDir = ReadString(Record, Idx);
4621 return Listener.ReadFileSystemOptions(FSOpts, Complain);
4622}
4623
4624bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record,
4625 bool Complain,
4626 ASTReaderListener &Listener) {
4627 HeaderSearchOptions HSOpts;
4628 unsigned Idx = 0;
4629 HSOpts.Sysroot = ReadString(Record, Idx);
4630
4631 // Include entries.
4632 for (unsigned N = Record[Idx++]; N; --N) {
4633 std::string Path = ReadString(Record, Idx);
4634 frontend::IncludeDirGroup Group
4635 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004636 bool IsFramework = Record[Idx++];
4637 bool IgnoreSysRoot = Record[Idx++];
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004638 HSOpts.UserEntries.push_back(
Daniel Dunbar59fd6352013-01-30 00:34:26 +00004639 HeaderSearchOptions::Entry(Path, Group, IsFramework, IgnoreSysRoot));
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004640 }
4641
4642 // System header prefixes.
4643 for (unsigned N = Record[Idx++]; N; --N) {
4644 std::string Prefix = ReadString(Record, Idx);
4645 bool IsSystemHeader = Record[Idx++];
4646 HSOpts.SystemHeaderPrefixes.push_back(
4647 HeaderSearchOptions::SystemHeaderPrefix(Prefix, IsSystemHeader));
4648 }
4649
4650 HSOpts.ResourceDir = ReadString(Record, Idx);
4651 HSOpts.ModuleCachePath = ReadString(Record, Idx);
Stephen Hines651f13c2014-04-23 16:59:28 -07004652 HSOpts.ModuleUserBuildPath = ReadString(Record, Idx);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004653 HSOpts.DisableModuleHash = Record[Idx++];
4654 HSOpts.UseBuiltinIncludes = Record[Idx++];
4655 HSOpts.UseStandardSystemIncludes = Record[Idx++];
4656 HSOpts.UseStandardCXXIncludes = Record[Idx++];
4657 HSOpts.UseLibcxx = Record[Idx++];
4658
4659 return Listener.ReadHeaderSearchOptions(HSOpts, Complain);
4660}
4661
4662bool ASTReader::ParsePreprocessorOptions(const RecordData &Record,
4663 bool Complain,
4664 ASTReaderListener &Listener,
4665 std::string &SuggestedPredefines) {
4666 PreprocessorOptions PPOpts;
4667 unsigned Idx = 0;
4668
4669 // Macro definitions/undefs
4670 for (unsigned N = Record[Idx++]; N; --N) {
4671 std::string Macro = ReadString(Record, Idx);
4672 bool IsUndef = Record[Idx++];
4673 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef));
4674 }
4675
4676 // Includes
4677 for (unsigned N = Record[Idx++]; N; --N) {
4678 PPOpts.Includes.push_back(ReadString(Record, Idx));
4679 }
4680
4681 // Macro Includes
4682 for (unsigned N = Record[Idx++]; N; --N) {
4683 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx));
4684 }
4685
4686 PPOpts.UsePredefines = Record[Idx++];
Argyrios Kyrtzidis65110ca2013-04-26 21:33:40 +00004687 PPOpts.DetailedRecord = Record[Idx++];
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004688 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx);
4689 PPOpts.ImplicitPTHInclude = ReadString(Record, Idx);
4690 PPOpts.ObjCXXARCStandardLibrary =
4691 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]);
4692 SuggestedPredefines.clear();
4693 return Listener.ReadPreprocessorOptions(PPOpts, Complain,
4694 SuggestedPredefines);
4695}
4696
4697std::pair<ModuleFile *, unsigned>
4698ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) {
4699 GlobalPreprocessedEntityMapType::iterator
4700 I = GlobalPreprocessedEntityMap.find(GlobalIndex);
4701 assert(I != GlobalPreprocessedEntityMap.end() &&
4702 "Corrupted global preprocessed entity map");
4703 ModuleFile *M = I->second;
4704 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID;
4705 return std::make_pair(M, LocalIndex);
4706}
4707
4708std::pair<PreprocessingRecord::iterator, PreprocessingRecord::iterator>
4709ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const {
4710 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
4711 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID,
4712 Mod.NumPreprocessedEntities);
4713
4714 return std::make_pair(PreprocessingRecord::iterator(),
4715 PreprocessingRecord::iterator());
4716}
4717
4718std::pair<ASTReader::ModuleDeclIterator, ASTReader::ModuleDeclIterator>
4719ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) {
4720 return std::make_pair(ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls),
4721 ModuleDeclIterator(this, &Mod,
4722 Mod.FileSortedDecls + Mod.NumFileSortedDecls));
4723}
4724
4725PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) {
4726 PreprocessedEntityID PPID = Index+1;
4727 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
4728 ModuleFile &M = *PPInfo.first;
4729 unsigned LocalIndex = PPInfo.second;
4730 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
4731
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004732 if (!PP.getPreprocessingRecord()) {
4733 Error("no preprocessing record");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004734 return nullptr;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004735 }
4736
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00004737 SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor);
4738 M.PreprocessorDetailCursor.JumpToBit(PPOffs.BitOffset);
4739
4740 llvm::BitstreamEntry Entry =
4741 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
4742 if (Entry.Kind != llvm::BitstreamEntry::Record)
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004743 return nullptr;
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00004744
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004745 // Read the record.
4746 SourceRange Range(ReadSourceLocation(M, PPOffs.Begin),
4747 ReadSourceLocation(M, PPOffs.End));
4748 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
Chris Lattnerb3ce3572013-01-20 02:38:54 +00004749 StringRef Blob;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004750 RecordData Record;
4751 PreprocessorDetailRecordTypes RecType =
Chris Lattnerb3ce3572013-01-20 02:38:54 +00004752 (PreprocessorDetailRecordTypes)M.PreprocessorDetailCursor.readRecord(
4753 Entry.ID, Record, &Blob);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004754 switch (RecType) {
4755 case PPD_MACRO_EXPANSION: {
4756 bool isBuiltin = Record[0];
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004757 IdentifierInfo *Name = nullptr;
4758 MacroDefinition *Def = nullptr;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004759 if (isBuiltin)
4760 Name = getLocalIdentifier(M, Record[1]);
4761 else {
4762 PreprocessedEntityID
4763 GlobalID = getGlobalPreprocessedEntityID(M, Record[1]);
4764 Def =cast<MacroDefinition>(PPRec.getLoadedPreprocessedEntity(GlobalID-1));
4765 }
4766
4767 MacroExpansion *ME;
4768 if (isBuiltin)
4769 ME = new (PPRec) MacroExpansion(Name, Range);
4770 else
4771 ME = new (PPRec) MacroExpansion(Def, Range);
4772
4773 return ME;
4774 }
4775
4776 case PPD_MACRO_DEFINITION: {
4777 // Decode the identifier info and then check again; if the macro is
4778 // still defined and associated with the identifier,
4779 IdentifierInfo *II = getLocalIdentifier(M, Record[0]);
4780 MacroDefinition *MD
4781 = new (PPRec) MacroDefinition(II, Range);
4782
4783 if (DeserializationListener)
4784 DeserializationListener->MacroDefinitionRead(PPID, MD);
4785
4786 return MD;
4787 }
4788
4789 case PPD_INCLUSION_DIRECTIVE: {
Chris Lattnerb3ce3572013-01-20 02:38:54 +00004790 const char *FullFileNameStart = Blob.data() + Record[0];
4791 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]);
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004792 const FileEntry *File = nullptr;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004793 if (!FullFileName.empty())
4794 File = PP.getFileManager().getFile(FullFileName);
4795
4796 // FIXME: Stable encoding
4797 InclusionDirective::InclusionKind Kind
4798 = static_cast<InclusionDirective::InclusionKind>(Record[2]);
4799 InclusionDirective *ID
4800 = new (PPRec) InclusionDirective(PPRec, Kind,
Chris Lattnerb3ce3572013-01-20 02:38:54 +00004801 StringRef(Blob.data(), Record[0]),
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004802 Record[1], Record[3],
4803 File,
4804 Range);
4805 return ID;
4806 }
4807 }
4808
4809 llvm_unreachable("Invalid PreprocessorDetailRecordTypes");
4810}
4811
4812/// \brief \arg SLocMapI points at a chunk of a module that contains no
4813/// preprocessed entities or the entities it contains are not the ones we are
4814/// looking for. Find the next module that contains entities and return the ID
4815/// of the first entry.
4816PreprocessedEntityID ASTReader::findNextPreprocessedEntity(
4817 GlobalSLocOffsetMapType::const_iterator SLocMapI) const {
4818 ++SLocMapI;
4819 for (GlobalSLocOffsetMapType::const_iterator
4820 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
4821 ModuleFile &M = *SLocMapI->second;
4822 if (M.NumPreprocessedEntities)
4823 return M.BasePreprocessedEntityID;
4824 }
4825
4826 return getTotalNumPreprocessedEntities();
4827}
4828
4829namespace {
4830
4831template <unsigned PPEntityOffset::*PPLoc>
4832struct PPEntityComp {
4833 const ASTReader &Reader;
4834 ModuleFile &M;
4835
4836 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) { }
4837
4838 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const {
4839 SourceLocation LHS = getLoc(L);
4840 SourceLocation RHS = getLoc(R);
4841 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
4842 }
4843
4844 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const {
4845 SourceLocation LHS = getLoc(L);
4846 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
4847 }
4848
4849 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const {
4850 SourceLocation RHS = getLoc(R);
4851 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
4852 }
4853
4854 SourceLocation getLoc(const PPEntityOffset &PPE) const {
4855 return Reader.ReadSourceLocation(M, PPE.*PPLoc);
4856 }
4857};
4858
4859}
4860
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004861PreprocessedEntityID ASTReader::findPreprocessedEntity(SourceLocation Loc,
4862 bool EndsAfter) const {
4863 if (SourceMgr.isLocalSourceLocation(Loc))
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004864 return getTotalNumPreprocessedEntities();
4865
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004866 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
4867 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004868 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
4869 "Corrupted global sloc offset map");
4870
4871 if (SLocMapI->second->NumPreprocessedEntities == 0)
4872 return findNextPreprocessedEntity(SLocMapI);
4873
4874 ModuleFile &M = *SLocMapI->second;
4875 typedef const PPEntityOffset *pp_iterator;
4876 pp_iterator pp_begin = M.PreprocessedEntityOffsets;
4877 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities;
4878
4879 size_t Count = M.NumPreprocessedEntities;
4880 size_t Half;
4881 pp_iterator First = pp_begin;
4882 pp_iterator PPI;
4883
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004884 if (EndsAfter) {
4885 PPI = std::upper_bound(pp_begin, pp_end, Loc,
4886 PPEntityComp<&PPEntityOffset::Begin>(*this, M));
4887 } else {
4888 // Do a binary search manually instead of using std::lower_bound because
4889 // The end locations of entities may be unordered (when a macro expansion
4890 // is inside another macro argument), but for this case it is not important
4891 // whether we get the first macro expansion or its containing macro.
4892 while (Count > 0) {
4893 Half = Count / 2;
4894 PPI = First;
4895 std::advance(PPI, Half);
4896 if (SourceMgr.isBeforeInTranslationUnit(ReadSourceLocation(M, PPI->End),
4897 Loc)) {
4898 First = PPI;
4899 ++First;
4900 Count = Count - Half - 1;
4901 } else
4902 Count = Half;
4903 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004904 }
4905
4906 if (PPI == pp_end)
4907 return findNextPreprocessedEntity(SLocMapI);
4908
4909 return M.BasePreprocessedEntityID + (PPI - pp_begin);
4910}
4911
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004912/// \brief Returns a pair of [Begin, End) indices of preallocated
4913/// preprocessed entities that \arg Range encompasses.
4914std::pair<unsigned, unsigned>
4915 ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) {
4916 if (Range.isInvalid())
4917 return std::make_pair(0,0);
4918 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
4919
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004920 PreprocessedEntityID BeginID =
4921 findPreprocessedEntity(Range.getBegin(), false);
4922 PreprocessedEntityID EndID = findPreprocessedEntity(Range.getEnd(), true);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004923 return std::make_pair(BeginID, EndID);
4924}
4925
4926/// \brief Optionally returns true or false if the preallocated preprocessed
4927/// entity with index \arg Index came from file \arg FID.
David Blaikiedc84cd52013-02-20 22:23:23 +00004928Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index,
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004929 FileID FID) {
4930 if (FID.isInvalid())
4931 return false;
4932
4933 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
4934 ModuleFile &M = *PPInfo.first;
4935 unsigned LocalIndex = PPInfo.second;
4936 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
4937
4938 SourceLocation Loc = ReadSourceLocation(M, PPOffs.Begin);
4939 if (Loc.isInvalid())
4940 return false;
4941
4942 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
4943 return true;
4944 else
4945 return false;
4946}
4947
4948namespace {
4949 /// \brief Visitor used to search for information about a header file.
4950 class HeaderFileInfoVisitor {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004951 const FileEntry *FE;
4952
David Blaikiedc84cd52013-02-20 22:23:23 +00004953 Optional<HeaderFileInfo> HFI;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004954
4955 public:
Argyrios Kyrtzidis36592b12013-03-06 18:12:44 +00004956 explicit HeaderFileInfoVisitor(const FileEntry *FE)
4957 : FE(FE) { }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004958
4959 static bool visit(ModuleFile &M, void *UserData) {
4960 HeaderFileInfoVisitor *This
4961 = static_cast<HeaderFileInfoVisitor *>(UserData);
4962
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004963 HeaderFileInfoLookupTable *Table
4964 = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable);
4965 if (!Table)
4966 return false;
4967
4968 // Look in the on-disk hash table for an entry for this file name.
Argyrios Kyrtzidised3802e2013-03-06 18:12:47 +00004969 HeaderFileInfoLookupTable::iterator Pos = Table->find(This->FE);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004970 if (Pos == Table->end())
4971 return false;
4972
4973 This->HFI = *Pos;
4974 return true;
4975 }
4976
David Blaikiedc84cd52013-02-20 22:23:23 +00004977 Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004978 };
4979}
4980
4981HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) {
Argyrios Kyrtzidis36592b12013-03-06 18:12:44 +00004982 HeaderFileInfoVisitor Visitor(FE);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004983 ModuleMgr.visit(&HeaderFileInfoVisitor::visit, &Visitor);
Argyrios Kyrtzidisf9ba8512013-05-08 23:46:55 +00004984 if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004985 return *HFI;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004986
4987 return HeaderFileInfo();
4988}
4989
4990void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) {
4991 // FIXME: Make it work properly with modules.
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00004992 SmallVector<DiagnosticsEngine::DiagState *, 32> DiagStates;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004993 for (ModuleIterator I = ModuleMgr.begin(), E = ModuleMgr.end(); I != E; ++I) {
4994 ModuleFile &F = *(*I);
4995 unsigned Idx = 0;
4996 DiagStates.clear();
4997 assert(!Diag.DiagStates.empty());
4998 DiagStates.push_back(&Diag.DiagStates.front()); // the command-line one.
4999 while (Idx < F.PragmaDiagMappings.size()) {
5000 SourceLocation Loc = ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]);
5001 unsigned DiagStateID = F.PragmaDiagMappings[Idx++];
5002 if (DiagStateID != 0) {
5003 Diag.DiagStatePoints.push_back(
5004 DiagnosticsEngine::DiagStatePoint(DiagStates[DiagStateID-1],
5005 FullSourceLoc(Loc, SourceMgr)));
5006 continue;
5007 }
5008
5009 assert(DiagStateID == 0);
5010 // A new DiagState was created here.
5011 Diag.DiagStates.push_back(*Diag.GetCurDiagState());
5012 DiagnosticsEngine::DiagState *NewState = &Diag.DiagStates.back();
5013 DiagStates.push_back(NewState);
5014 Diag.DiagStatePoints.push_back(
5015 DiagnosticsEngine::DiagStatePoint(NewState,
5016 FullSourceLoc(Loc, SourceMgr)));
5017 while (1) {
5018 assert(Idx < F.PragmaDiagMappings.size() &&
5019 "Invalid data, didn't find '-1' marking end of diag/map pairs");
5020 if (Idx >= F.PragmaDiagMappings.size()) {
5021 break; // Something is messed up but at least avoid infinite loop in
5022 // release build.
5023 }
5024 unsigned DiagID = F.PragmaDiagMappings[Idx++];
5025 if (DiagID == (unsigned)-1) {
5026 break; // no more diag/map pairs for this location.
5027 }
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005028 diag::Severity Map = (diag::Severity)F.PragmaDiagMappings[Idx++];
5029 DiagnosticMapping Mapping = Diag.makeUserMapping(Map, Loc);
5030 Diag.GetCurDiagState()->setMapping(DiagID, Mapping);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005031 }
5032 }
5033 }
5034}
5035
5036/// \brief Get the correct cursor and offset for loading a type.
5037ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) {
5038 GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index);
5039 assert(I != GlobalTypeMap.end() && "Corrupted global type map");
5040 ModuleFile *M = I->second;
5041 return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex]);
5042}
5043
5044/// \brief Read and return the type with the given index..
5045///
5046/// The index is the type ID, shifted and minus the number of predefs. This
5047/// routine actually reads the record corresponding to the type at the given
5048/// location. It is a helper routine for GetType, which deals with reading type
5049/// IDs.
5050QualType ASTReader::readTypeRecord(unsigned Index) {
5051 RecordLocation Loc = TypeCursorForIndex(Index);
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00005052 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005053
5054 // Keep track of where we are in the stream, then jump back there
5055 // after reading this type.
5056 SavedStreamPosition SavedPosition(DeclsCursor);
5057
5058 ReadingKindTracker ReadingKind(Read_Type, *this);
5059
5060 // Note that we are loading a type record.
5061 Deserializing AType(this);
5062
5063 unsigned Idx = 0;
5064 DeclsCursor.JumpToBit(Loc.Offset);
5065 RecordData Record;
5066 unsigned Code = DeclsCursor.ReadCode();
Chris Lattnerb3ce3572013-01-20 02:38:54 +00005067 switch ((TypeCode)DeclsCursor.readRecord(Code, Record)) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005068 case TYPE_EXT_QUAL: {
5069 if (Record.size() != 2) {
5070 Error("Incorrect encoding of extended qualifier type");
5071 return QualType();
5072 }
5073 QualType Base = readType(*Loc.F, Record, Idx);
5074 Qualifiers Quals = Qualifiers::fromOpaqueValue(Record[Idx++]);
5075 return Context.getQualifiedType(Base, Quals);
5076 }
5077
5078 case TYPE_COMPLEX: {
5079 if (Record.size() != 1) {
5080 Error("Incorrect encoding of complex type");
5081 return QualType();
5082 }
5083 QualType ElemType = readType(*Loc.F, Record, Idx);
5084 return Context.getComplexType(ElemType);
5085 }
5086
5087 case TYPE_POINTER: {
5088 if (Record.size() != 1) {
5089 Error("Incorrect encoding of pointer type");
5090 return QualType();
5091 }
5092 QualType PointeeType = readType(*Loc.F, Record, Idx);
5093 return Context.getPointerType(PointeeType);
5094 }
5095
Reid Kleckner12df2462013-06-24 17:51:48 +00005096 case TYPE_DECAYED: {
5097 if (Record.size() != 1) {
5098 Error("Incorrect encoding of decayed type");
5099 return QualType();
5100 }
5101 QualType OriginalType = readType(*Loc.F, Record, Idx);
5102 QualType DT = Context.getAdjustedParameterType(OriginalType);
5103 if (!isa<DecayedType>(DT))
5104 Error("Decayed type does not decay");
5105 return DT;
5106 }
5107
Stephen Hines651f13c2014-04-23 16:59:28 -07005108 case TYPE_ADJUSTED: {
5109 if (Record.size() != 2) {
5110 Error("Incorrect encoding of adjusted type");
5111 return QualType();
5112 }
5113 QualType OriginalTy = readType(*Loc.F, Record, Idx);
5114 QualType AdjustedTy = readType(*Loc.F, Record, Idx);
5115 return Context.getAdjustedType(OriginalTy, AdjustedTy);
5116 }
5117
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005118 case TYPE_BLOCK_POINTER: {
5119 if (Record.size() != 1) {
5120 Error("Incorrect encoding of block pointer type");
5121 return QualType();
5122 }
5123 QualType PointeeType = readType(*Loc.F, Record, Idx);
5124 return Context.getBlockPointerType(PointeeType);
5125 }
5126
5127 case TYPE_LVALUE_REFERENCE: {
5128 if (Record.size() != 2) {
5129 Error("Incorrect encoding of lvalue reference type");
5130 return QualType();
5131 }
5132 QualType PointeeType = readType(*Loc.F, Record, Idx);
5133 return Context.getLValueReferenceType(PointeeType, Record[1]);
5134 }
5135
5136 case TYPE_RVALUE_REFERENCE: {
5137 if (Record.size() != 1) {
5138 Error("Incorrect encoding of rvalue reference type");
5139 return QualType();
5140 }
5141 QualType PointeeType = readType(*Loc.F, Record, Idx);
5142 return Context.getRValueReferenceType(PointeeType);
5143 }
5144
5145 case TYPE_MEMBER_POINTER: {
5146 if (Record.size() != 2) {
5147 Error("Incorrect encoding of member pointer type");
5148 return QualType();
5149 }
5150 QualType PointeeType = readType(*Loc.F, Record, Idx);
5151 QualType ClassType = readType(*Loc.F, Record, Idx);
5152 if (PointeeType.isNull() || ClassType.isNull())
5153 return QualType();
5154
5155 return Context.getMemberPointerType(PointeeType, ClassType.getTypePtr());
5156 }
5157
5158 case TYPE_CONSTANT_ARRAY: {
5159 QualType ElementType = readType(*Loc.F, Record, Idx);
5160 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5161 unsigned IndexTypeQuals = Record[2];
5162 unsigned Idx = 3;
5163 llvm::APInt Size = ReadAPInt(Record, Idx);
5164 return Context.getConstantArrayType(ElementType, Size,
5165 ASM, IndexTypeQuals);
5166 }
5167
5168 case TYPE_INCOMPLETE_ARRAY: {
5169 QualType ElementType = readType(*Loc.F, Record, Idx);
5170 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5171 unsigned IndexTypeQuals = Record[2];
5172 return Context.getIncompleteArrayType(ElementType, ASM, IndexTypeQuals);
5173 }
5174
5175 case TYPE_VARIABLE_ARRAY: {
5176 QualType ElementType = readType(*Loc.F, Record, Idx);
5177 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5178 unsigned IndexTypeQuals = Record[2];
5179 SourceLocation LBLoc = ReadSourceLocation(*Loc.F, Record[3]);
5180 SourceLocation RBLoc = ReadSourceLocation(*Loc.F, Record[4]);
5181 return Context.getVariableArrayType(ElementType, ReadExpr(*Loc.F),
5182 ASM, IndexTypeQuals,
5183 SourceRange(LBLoc, RBLoc));
5184 }
5185
5186 case TYPE_VECTOR: {
5187 if (Record.size() != 3) {
5188 Error("incorrect encoding of vector type in AST file");
5189 return QualType();
5190 }
5191
5192 QualType ElementType = readType(*Loc.F, Record, Idx);
5193 unsigned NumElements = Record[1];
5194 unsigned VecKind = Record[2];
5195 return Context.getVectorType(ElementType, NumElements,
5196 (VectorType::VectorKind)VecKind);
5197 }
5198
5199 case TYPE_EXT_VECTOR: {
5200 if (Record.size() != 3) {
5201 Error("incorrect encoding of extended vector type in AST file");
5202 return QualType();
5203 }
5204
5205 QualType ElementType = readType(*Loc.F, Record, Idx);
5206 unsigned NumElements = Record[1];
5207 return Context.getExtVectorType(ElementType, NumElements);
5208 }
5209
5210 case TYPE_FUNCTION_NO_PROTO: {
5211 if (Record.size() != 6) {
5212 Error("incorrect encoding of no-proto function type");
5213 return QualType();
5214 }
5215 QualType ResultType = readType(*Loc.F, Record, Idx);
5216 FunctionType::ExtInfo Info(Record[1], Record[2], Record[3],
5217 (CallingConv)Record[4], Record[5]);
5218 return Context.getFunctionNoProtoType(ResultType, Info);
5219 }
5220
5221 case TYPE_FUNCTION_PROTO: {
5222 QualType ResultType = readType(*Loc.F, Record, Idx);
5223
5224 FunctionProtoType::ExtProtoInfo EPI;
5225 EPI.ExtInfo = FunctionType::ExtInfo(/*noreturn*/ Record[1],
5226 /*hasregparm*/ Record[2],
5227 /*regparm*/ Record[3],
5228 static_cast<CallingConv>(Record[4]),
5229 /*produces*/ Record[5]);
5230
5231 unsigned Idx = 6;
5232 unsigned NumParams = Record[Idx++];
5233 SmallVector<QualType, 16> ParamTypes;
5234 for (unsigned I = 0; I != NumParams; ++I)
5235 ParamTypes.push_back(readType(*Loc.F, Record, Idx));
5236
5237 EPI.Variadic = Record[Idx++];
5238 EPI.HasTrailingReturn = Record[Idx++];
5239 EPI.TypeQuals = Record[Idx++];
5240 EPI.RefQualifier = static_cast<RefQualifierKind>(Record[Idx++]);
Stephen Hines651f13c2014-04-23 16:59:28 -07005241 SmallVector<QualType, 8> ExceptionStorage;
5242 readExceptionSpec(*Loc.F, ExceptionStorage, EPI, Record, Idx);
Jordan Rosebea522f2013-03-08 21:51:21 +00005243 return Context.getFunctionType(ResultType, ParamTypes, EPI);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005244 }
5245
5246 case TYPE_UNRESOLVED_USING: {
5247 unsigned Idx = 0;
5248 return Context.getTypeDeclType(
5249 ReadDeclAs<UnresolvedUsingTypenameDecl>(*Loc.F, Record, Idx));
5250 }
5251
5252 case TYPE_TYPEDEF: {
5253 if (Record.size() != 2) {
5254 Error("incorrect encoding of typedef type");
5255 return QualType();
5256 }
5257 unsigned Idx = 0;
5258 TypedefNameDecl *Decl = ReadDeclAs<TypedefNameDecl>(*Loc.F, Record, Idx);
5259 QualType Canonical = readType(*Loc.F, Record, Idx);
5260 if (!Canonical.isNull())
5261 Canonical = Context.getCanonicalType(Canonical);
5262 return Context.getTypedefType(Decl, Canonical);
5263 }
5264
5265 case TYPE_TYPEOF_EXPR:
5266 return Context.getTypeOfExprType(ReadExpr(*Loc.F));
5267
5268 case TYPE_TYPEOF: {
5269 if (Record.size() != 1) {
5270 Error("incorrect encoding of typeof(type) in AST file");
5271 return QualType();
5272 }
5273 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5274 return Context.getTypeOfType(UnderlyingType);
5275 }
5276
5277 case TYPE_DECLTYPE: {
5278 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5279 return Context.getDecltypeType(ReadExpr(*Loc.F), UnderlyingType);
5280 }
5281
5282 case TYPE_UNARY_TRANSFORM: {
5283 QualType BaseType = readType(*Loc.F, Record, Idx);
5284 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5285 UnaryTransformType::UTTKind UKind = (UnaryTransformType::UTTKind)Record[2];
5286 return Context.getUnaryTransformType(BaseType, UnderlyingType, UKind);
5287 }
5288
Richard Smitha2c36462013-04-26 16:15:35 +00005289 case TYPE_AUTO: {
5290 QualType Deduced = readType(*Loc.F, Record, Idx);
5291 bool IsDecltypeAuto = Record[Idx++];
Richard Smithdc7a4f52013-04-30 13:56:41 +00005292 bool IsDependent = Deduced.isNull() ? Record[Idx++] : false;
Manuel Klimek152b4e42013-08-22 12:12:24 +00005293 return Context.getAutoType(Deduced, IsDecltypeAuto, IsDependent);
Richard Smitha2c36462013-04-26 16:15:35 +00005294 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005295
5296 case TYPE_RECORD: {
5297 if (Record.size() != 2) {
5298 Error("incorrect encoding of record type");
5299 return QualType();
5300 }
5301 unsigned Idx = 0;
5302 bool IsDependent = Record[Idx++];
5303 RecordDecl *RD = ReadDeclAs<RecordDecl>(*Loc.F, Record, Idx);
5304 RD = cast_or_null<RecordDecl>(RD->getCanonicalDecl());
5305 QualType T = Context.getRecordType(RD);
5306 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5307 return T;
5308 }
5309
5310 case TYPE_ENUM: {
5311 if (Record.size() != 2) {
5312 Error("incorrect encoding of enum type");
5313 return QualType();
5314 }
5315 unsigned Idx = 0;
5316 bool IsDependent = Record[Idx++];
5317 QualType T
5318 = Context.getEnumType(ReadDeclAs<EnumDecl>(*Loc.F, Record, Idx));
5319 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5320 return T;
5321 }
5322
5323 case TYPE_ATTRIBUTED: {
5324 if (Record.size() != 3) {
5325 Error("incorrect encoding of attributed type");
5326 return QualType();
5327 }
5328 QualType modifiedType = readType(*Loc.F, Record, Idx);
5329 QualType equivalentType = readType(*Loc.F, Record, Idx);
5330 AttributedType::Kind kind = static_cast<AttributedType::Kind>(Record[2]);
5331 return Context.getAttributedType(kind, modifiedType, equivalentType);
5332 }
5333
5334 case TYPE_PAREN: {
5335 if (Record.size() != 1) {
5336 Error("incorrect encoding of paren type");
5337 return QualType();
5338 }
5339 QualType InnerType = readType(*Loc.F, Record, Idx);
5340 return Context.getParenType(InnerType);
5341 }
5342
5343 case TYPE_PACK_EXPANSION: {
5344 if (Record.size() != 2) {
5345 Error("incorrect encoding of pack expansion type");
5346 return QualType();
5347 }
5348 QualType Pattern = readType(*Loc.F, Record, Idx);
5349 if (Pattern.isNull())
5350 return QualType();
David Blaikiedc84cd52013-02-20 22:23:23 +00005351 Optional<unsigned> NumExpansions;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005352 if (Record[1])
5353 NumExpansions = Record[1] - 1;
5354 return Context.getPackExpansionType(Pattern, NumExpansions);
5355 }
5356
5357 case TYPE_ELABORATED: {
5358 unsigned Idx = 0;
5359 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5360 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5361 QualType NamedType = readType(*Loc.F, Record, Idx);
5362 return Context.getElaboratedType(Keyword, NNS, NamedType);
5363 }
5364
5365 case TYPE_OBJC_INTERFACE: {
5366 unsigned Idx = 0;
5367 ObjCInterfaceDecl *ItfD
5368 = ReadDeclAs<ObjCInterfaceDecl>(*Loc.F, Record, Idx);
5369 return Context.getObjCInterfaceType(ItfD->getCanonicalDecl());
5370 }
5371
5372 case TYPE_OBJC_OBJECT: {
5373 unsigned Idx = 0;
5374 QualType Base = readType(*Loc.F, Record, Idx);
5375 unsigned NumProtos = Record[Idx++];
5376 SmallVector<ObjCProtocolDecl*, 4> Protos;
5377 for (unsigned I = 0; I != NumProtos; ++I)
5378 Protos.push_back(ReadDeclAs<ObjCProtocolDecl>(*Loc.F, Record, Idx));
5379 return Context.getObjCObjectType(Base, Protos.data(), NumProtos);
5380 }
5381
5382 case TYPE_OBJC_OBJECT_POINTER: {
5383 unsigned Idx = 0;
5384 QualType Pointee = readType(*Loc.F, Record, Idx);
5385 return Context.getObjCObjectPointerType(Pointee);
5386 }
5387
5388 case TYPE_SUBST_TEMPLATE_TYPE_PARM: {
5389 unsigned Idx = 0;
5390 QualType Parm = readType(*Loc.F, Record, Idx);
5391 QualType Replacement = readType(*Loc.F, Record, Idx);
Stephen Hines651f13c2014-04-23 16:59:28 -07005392 return Context.getSubstTemplateTypeParmType(
5393 cast<TemplateTypeParmType>(Parm),
5394 Context.getCanonicalType(Replacement));
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005395 }
5396
5397 case TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK: {
5398 unsigned Idx = 0;
5399 QualType Parm = readType(*Loc.F, Record, Idx);
5400 TemplateArgument ArgPack = ReadTemplateArgument(*Loc.F, Record, Idx);
5401 return Context.getSubstTemplateTypeParmPackType(
5402 cast<TemplateTypeParmType>(Parm),
5403 ArgPack);
5404 }
5405
5406 case TYPE_INJECTED_CLASS_NAME: {
5407 CXXRecordDecl *D = ReadDeclAs<CXXRecordDecl>(*Loc.F, Record, Idx);
5408 QualType TST = readType(*Loc.F, Record, Idx); // probably derivable
5409 // FIXME: ASTContext::getInjectedClassNameType is not currently suitable
5410 // for AST reading, too much interdependencies.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005411 const Type *T;
5412 if (const Type *Existing = D->getTypeForDecl())
5413 T = Existing;
5414 else if (auto *Prev = D->getPreviousDecl())
5415 T = Prev->getTypeForDecl();
5416 else
5417 T = new (Context, TypeAlignment) InjectedClassNameType(D, TST);
5418 return QualType(T, 0);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005419 }
5420
5421 case TYPE_TEMPLATE_TYPE_PARM: {
5422 unsigned Idx = 0;
5423 unsigned Depth = Record[Idx++];
5424 unsigned Index = Record[Idx++];
5425 bool Pack = Record[Idx++];
5426 TemplateTypeParmDecl *D
5427 = ReadDeclAs<TemplateTypeParmDecl>(*Loc.F, Record, Idx);
5428 return Context.getTemplateTypeParmType(Depth, Index, Pack, D);
5429 }
5430
5431 case TYPE_DEPENDENT_NAME: {
5432 unsigned Idx = 0;
5433 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5434 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5435 const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx);
5436 QualType Canon = readType(*Loc.F, Record, Idx);
5437 if (!Canon.isNull())
5438 Canon = Context.getCanonicalType(Canon);
5439 return Context.getDependentNameType(Keyword, NNS, Name, Canon);
5440 }
5441
5442 case TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION: {
5443 unsigned Idx = 0;
5444 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5445 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5446 const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx);
5447 unsigned NumArgs = Record[Idx++];
5448 SmallVector<TemplateArgument, 8> Args;
5449 Args.reserve(NumArgs);
5450 while (NumArgs--)
5451 Args.push_back(ReadTemplateArgument(*Loc.F, Record, Idx));
5452 return Context.getDependentTemplateSpecializationType(Keyword, NNS, Name,
5453 Args.size(), Args.data());
5454 }
5455
5456 case TYPE_DEPENDENT_SIZED_ARRAY: {
5457 unsigned Idx = 0;
5458
5459 // ArrayType
5460 QualType ElementType = readType(*Loc.F, Record, Idx);
5461 ArrayType::ArraySizeModifier ASM
5462 = (ArrayType::ArraySizeModifier)Record[Idx++];
5463 unsigned IndexTypeQuals = Record[Idx++];
5464
5465 // DependentSizedArrayType
5466 Expr *NumElts = ReadExpr(*Loc.F);
5467 SourceRange Brackets = ReadSourceRange(*Loc.F, Record, Idx);
5468
5469 return Context.getDependentSizedArrayType(ElementType, NumElts, ASM,
5470 IndexTypeQuals, Brackets);
5471 }
5472
5473 case TYPE_TEMPLATE_SPECIALIZATION: {
5474 unsigned Idx = 0;
5475 bool IsDependent = Record[Idx++];
5476 TemplateName Name = ReadTemplateName(*Loc.F, Record, Idx);
5477 SmallVector<TemplateArgument, 8> Args;
5478 ReadTemplateArgumentList(Args, *Loc.F, Record, Idx);
5479 QualType Underlying = readType(*Loc.F, Record, Idx);
5480 QualType T;
5481 if (Underlying.isNull())
5482 T = Context.getCanonicalTemplateSpecializationType(Name, Args.data(),
5483 Args.size());
5484 else
5485 T = Context.getTemplateSpecializationType(Name, Args.data(),
5486 Args.size(), Underlying);
5487 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5488 return T;
5489 }
5490
5491 case TYPE_ATOMIC: {
5492 if (Record.size() != 1) {
5493 Error("Incorrect encoding of atomic type");
5494 return QualType();
5495 }
5496 QualType ValueType = readType(*Loc.F, Record, Idx);
5497 return Context.getAtomicType(ValueType);
5498 }
5499 }
5500 llvm_unreachable("Invalid TypeCode!");
5501}
5502
Stephen Hines651f13c2014-04-23 16:59:28 -07005503void ASTReader::readExceptionSpec(ModuleFile &ModuleFile,
5504 SmallVectorImpl<QualType> &Exceptions,
5505 FunctionProtoType::ExtProtoInfo &EPI,
5506 const RecordData &Record, unsigned &Idx) {
5507 ExceptionSpecificationType EST =
5508 static_cast<ExceptionSpecificationType>(Record[Idx++]);
5509 EPI.ExceptionSpecType = EST;
5510 if (EST == EST_Dynamic) {
5511 EPI.NumExceptions = Record[Idx++];
5512 for (unsigned I = 0; I != EPI.NumExceptions; ++I)
5513 Exceptions.push_back(readType(ModuleFile, Record, Idx));
5514 EPI.Exceptions = Exceptions.data();
5515 } else if (EST == EST_ComputedNoexcept) {
5516 EPI.NoexceptExpr = ReadExpr(ModuleFile);
5517 } else if (EST == EST_Uninstantiated) {
5518 EPI.ExceptionSpecDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
5519 EPI.ExceptionSpecTemplate =
5520 ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
5521 } else if (EST == EST_Unevaluated) {
5522 EPI.ExceptionSpecDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
5523 }
5524}
5525
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005526class clang::TypeLocReader : public TypeLocVisitor<TypeLocReader> {
5527 ASTReader &Reader;
5528 ModuleFile &F;
5529 const ASTReader::RecordData &Record;
5530 unsigned &Idx;
5531
5532 SourceLocation ReadSourceLocation(const ASTReader::RecordData &R,
5533 unsigned &I) {
5534 return Reader.ReadSourceLocation(F, R, I);
5535 }
5536
5537 template<typename T>
5538 T *ReadDeclAs(const ASTReader::RecordData &Record, unsigned &Idx) {
5539 return Reader.ReadDeclAs<T>(F, Record, Idx);
5540 }
5541
5542public:
5543 TypeLocReader(ASTReader &Reader, ModuleFile &F,
5544 const ASTReader::RecordData &Record, unsigned &Idx)
5545 : Reader(Reader), F(F), Record(Record), Idx(Idx)
5546 { }
5547
5548 // We want compile-time assurance that we've enumerated all of
5549 // these, so unfortunately we have to declare them first, then
5550 // define them out-of-line.
5551#define ABSTRACT_TYPELOC(CLASS, PARENT)
5552#define TYPELOC(CLASS, PARENT) \
5553 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
5554#include "clang/AST/TypeLocNodes.def"
5555
5556 void VisitFunctionTypeLoc(FunctionTypeLoc);
5557 void VisitArrayTypeLoc(ArrayTypeLoc);
5558};
5559
5560void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
5561 // nothing to do
5562}
5563void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
5564 TL.setBuiltinLoc(ReadSourceLocation(Record, Idx));
5565 if (TL.needsExtraLocalData()) {
5566 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Record[Idx++]));
5567 TL.setWrittenSignSpec(static_cast<DeclSpec::TSS>(Record[Idx++]));
5568 TL.setWrittenWidthSpec(static_cast<DeclSpec::TSW>(Record[Idx++]));
5569 TL.setModeAttr(Record[Idx++]);
5570 }
5571}
5572void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
5573 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5574}
5575void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
5576 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5577}
Reid Kleckner12df2462013-06-24 17:51:48 +00005578void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
5579 // nothing to do
5580}
Stephen Hines651f13c2014-04-23 16:59:28 -07005581void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
5582 // nothing to do
5583}
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005584void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
5585 TL.setCaretLoc(ReadSourceLocation(Record, Idx));
5586}
5587void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
5588 TL.setAmpLoc(ReadSourceLocation(Record, Idx));
5589}
5590void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
5591 TL.setAmpAmpLoc(ReadSourceLocation(Record, Idx));
5592}
5593void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
5594 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5595 TL.setClassTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5596}
5597void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) {
5598 TL.setLBracketLoc(ReadSourceLocation(Record, Idx));
5599 TL.setRBracketLoc(ReadSourceLocation(Record, Idx));
5600 if (Record[Idx++])
5601 TL.setSizeExpr(Reader.ReadExpr(F));
5602 else
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005603 TL.setSizeExpr(nullptr);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005604}
5605void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) {
5606 VisitArrayTypeLoc(TL);
5607}
5608void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) {
5609 VisitArrayTypeLoc(TL);
5610}
5611void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
5612 VisitArrayTypeLoc(TL);
5613}
5614void TypeLocReader::VisitDependentSizedArrayTypeLoc(
5615 DependentSizedArrayTypeLoc TL) {
5616 VisitArrayTypeLoc(TL);
5617}
5618void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
5619 DependentSizedExtVectorTypeLoc TL) {
5620 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5621}
5622void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
5623 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5624}
5625void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
5626 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5627}
5628void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) {
5629 TL.setLocalRangeBegin(ReadSourceLocation(Record, Idx));
5630 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5631 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5632 TL.setLocalRangeEnd(ReadSourceLocation(Record, Idx));
Stephen Hines651f13c2014-04-23 16:59:28 -07005633 for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) {
5634 TL.setParam(i, ReadDeclAs<ParmVarDecl>(Record, Idx));
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005635 }
5636}
5637void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) {
5638 VisitFunctionTypeLoc(TL);
5639}
5640void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) {
5641 VisitFunctionTypeLoc(TL);
5642}
5643void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
5644 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5645}
5646void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
5647 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5648}
5649void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
5650 TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
5651 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5652 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5653}
5654void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
5655 TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
5656 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5657 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5658 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5659}
5660void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
5661 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5662}
5663void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
5664 TL.setKWLoc(ReadSourceLocation(Record, Idx));
5665 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5666 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5667 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5668}
5669void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) {
5670 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5671}
5672void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) {
5673 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5674}
5675void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) {
5676 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5677}
5678void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
5679 TL.setAttrNameLoc(ReadSourceLocation(Record, Idx));
5680 if (TL.hasAttrOperand()) {
5681 SourceRange range;
5682 range.setBegin(ReadSourceLocation(Record, Idx));
5683 range.setEnd(ReadSourceLocation(Record, Idx));
5684 TL.setAttrOperandParensRange(range);
5685 }
5686 if (TL.hasAttrExprOperand()) {
5687 if (Record[Idx++])
5688 TL.setAttrExprOperand(Reader.ReadExpr(F));
5689 else
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005690 TL.setAttrExprOperand(nullptr);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005691 } else if (TL.hasAttrEnumOperand())
5692 TL.setAttrEnumOperandLoc(ReadSourceLocation(Record, Idx));
5693}
5694void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
5695 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5696}
5697void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
5698 SubstTemplateTypeParmTypeLoc TL) {
5699 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5700}
5701void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
5702 SubstTemplateTypeParmPackTypeLoc TL) {
5703 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5704}
5705void TypeLocReader::VisitTemplateSpecializationTypeLoc(
5706 TemplateSpecializationTypeLoc TL) {
5707 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx));
5708 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx));
5709 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5710 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5711 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i)
5712 TL.setArgLocInfo(i,
5713 Reader.GetTemplateArgumentLocInfo(F,
5714 TL.getTypePtr()->getArg(i).getKind(),
5715 Record, Idx));
5716}
5717void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
5718 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5719 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5720}
5721void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
5722 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5723 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5724}
5725void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
5726 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5727}
5728void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
5729 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5730 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5731 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5732}
5733void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc(
5734 DependentTemplateSpecializationTypeLoc TL) {
5735 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5736 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5737 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx));
5738 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx));
5739 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5740 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5741 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
5742 TL.setArgLocInfo(I,
5743 Reader.GetTemplateArgumentLocInfo(F,
5744 TL.getTypePtr()->getArg(I).getKind(),
5745 Record, Idx));
5746}
5747void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
5748 TL.setEllipsisLoc(ReadSourceLocation(Record, Idx));
5749}
5750void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
5751 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5752}
5753void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
5754 TL.setHasBaseTypeAsWritten(Record[Idx++]);
5755 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5756 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5757 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
5758 TL.setProtocolLoc(i, ReadSourceLocation(Record, Idx));
5759}
5760void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
5761 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5762}
5763void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
5764 TL.setKWLoc(ReadSourceLocation(Record, Idx));
5765 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5766 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5767}
5768
5769TypeSourceInfo *ASTReader::GetTypeSourceInfo(ModuleFile &F,
5770 const RecordData &Record,
5771 unsigned &Idx) {
5772 QualType InfoTy = readType(F, Record, Idx);
5773 if (InfoTy.isNull())
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005774 return nullptr;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005775
5776 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy);
5777 TypeLocReader TLR(*this, F, Record, Idx);
5778 for (TypeLoc TL = TInfo->getTypeLoc(); !TL.isNull(); TL = TL.getNextTypeLoc())
5779 TLR.Visit(TL);
5780 return TInfo;
5781}
5782
5783QualType ASTReader::GetType(TypeID ID) {
5784 unsigned FastQuals = ID & Qualifiers::FastMask;
5785 unsigned Index = ID >> Qualifiers::FastWidth;
5786
5787 if (Index < NUM_PREDEF_TYPE_IDS) {
5788 QualType T;
5789 switch ((PredefinedTypeIDs)Index) {
5790 case PREDEF_TYPE_NULL_ID: return QualType();
5791 case PREDEF_TYPE_VOID_ID: T = Context.VoidTy; break;
5792 case PREDEF_TYPE_BOOL_ID: T = Context.BoolTy; break;
5793
5794 case PREDEF_TYPE_CHAR_U_ID:
5795 case PREDEF_TYPE_CHAR_S_ID:
5796 // FIXME: Check that the signedness of CharTy is correct!
5797 T = Context.CharTy;
5798 break;
5799
5800 case PREDEF_TYPE_UCHAR_ID: T = Context.UnsignedCharTy; break;
5801 case PREDEF_TYPE_USHORT_ID: T = Context.UnsignedShortTy; break;
5802 case PREDEF_TYPE_UINT_ID: T = Context.UnsignedIntTy; break;
5803 case PREDEF_TYPE_ULONG_ID: T = Context.UnsignedLongTy; break;
5804 case PREDEF_TYPE_ULONGLONG_ID: T = Context.UnsignedLongLongTy; break;
5805 case PREDEF_TYPE_UINT128_ID: T = Context.UnsignedInt128Ty; break;
5806 case PREDEF_TYPE_SCHAR_ID: T = Context.SignedCharTy; break;
5807 case PREDEF_TYPE_WCHAR_ID: T = Context.WCharTy; break;
5808 case PREDEF_TYPE_SHORT_ID: T = Context.ShortTy; break;
5809 case PREDEF_TYPE_INT_ID: T = Context.IntTy; break;
5810 case PREDEF_TYPE_LONG_ID: T = Context.LongTy; break;
5811 case PREDEF_TYPE_LONGLONG_ID: T = Context.LongLongTy; break;
5812 case PREDEF_TYPE_INT128_ID: T = Context.Int128Ty; break;
5813 case PREDEF_TYPE_HALF_ID: T = Context.HalfTy; break;
5814 case PREDEF_TYPE_FLOAT_ID: T = Context.FloatTy; break;
5815 case PREDEF_TYPE_DOUBLE_ID: T = Context.DoubleTy; break;
5816 case PREDEF_TYPE_LONGDOUBLE_ID: T = Context.LongDoubleTy; break;
5817 case PREDEF_TYPE_OVERLOAD_ID: T = Context.OverloadTy; break;
5818 case PREDEF_TYPE_BOUND_MEMBER: T = Context.BoundMemberTy; break;
5819 case PREDEF_TYPE_PSEUDO_OBJECT: T = Context.PseudoObjectTy; break;
5820 case PREDEF_TYPE_DEPENDENT_ID: T = Context.DependentTy; break;
5821 case PREDEF_TYPE_UNKNOWN_ANY: T = Context.UnknownAnyTy; break;
5822 case PREDEF_TYPE_NULLPTR_ID: T = Context.NullPtrTy; break;
5823 case PREDEF_TYPE_CHAR16_ID: T = Context.Char16Ty; break;
5824 case PREDEF_TYPE_CHAR32_ID: T = Context.Char32Ty; break;
5825 case PREDEF_TYPE_OBJC_ID: T = Context.ObjCBuiltinIdTy; break;
5826 case PREDEF_TYPE_OBJC_CLASS: T = Context.ObjCBuiltinClassTy; break;
5827 case PREDEF_TYPE_OBJC_SEL: T = Context.ObjCBuiltinSelTy; break;
Guy Benyeib13621d2012-12-18 14:38:23 +00005828 case PREDEF_TYPE_IMAGE1D_ID: T = Context.OCLImage1dTy; break;
5829 case PREDEF_TYPE_IMAGE1D_ARR_ID: T = Context.OCLImage1dArrayTy; break;
5830 case PREDEF_TYPE_IMAGE1D_BUFF_ID: T = Context.OCLImage1dBufferTy; break;
5831 case PREDEF_TYPE_IMAGE2D_ID: T = Context.OCLImage2dTy; break;
5832 case PREDEF_TYPE_IMAGE2D_ARR_ID: T = Context.OCLImage2dArrayTy; break;
5833 case PREDEF_TYPE_IMAGE3D_ID: T = Context.OCLImage3dTy; break;
Guy Benyei21f18c42013-02-07 10:55:47 +00005834 case PREDEF_TYPE_SAMPLER_ID: T = Context.OCLSamplerTy; break;
Guy Benyeie6b9d802013-01-20 12:31:11 +00005835 case PREDEF_TYPE_EVENT_ID: T = Context.OCLEventTy; break;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005836 case PREDEF_TYPE_AUTO_DEDUCT: T = Context.getAutoDeductType(); break;
5837
5838 case PREDEF_TYPE_AUTO_RREF_DEDUCT:
5839 T = Context.getAutoRRefDeductType();
5840 break;
5841
5842 case PREDEF_TYPE_ARC_UNBRIDGED_CAST:
5843 T = Context.ARCUnbridgedCastTy;
5844 break;
5845
5846 case PREDEF_TYPE_VA_LIST_TAG:
5847 T = Context.getVaListTagType();
5848 break;
5849
5850 case PREDEF_TYPE_BUILTIN_FN:
5851 T = Context.BuiltinFnTy;
5852 break;
5853 }
5854
5855 assert(!T.isNull() && "Unknown predefined type");
5856 return T.withFastQualifiers(FastQuals);
5857 }
5858
5859 Index -= NUM_PREDEF_TYPE_IDS;
5860 assert(Index < TypesLoaded.size() && "Type index out-of-range");
5861 if (TypesLoaded[Index].isNull()) {
5862 TypesLoaded[Index] = readTypeRecord(Index);
5863 if (TypesLoaded[Index].isNull())
5864 return QualType();
5865
5866 TypesLoaded[Index]->setFromAST();
5867 if (DeserializationListener)
5868 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID),
5869 TypesLoaded[Index]);
5870 }
5871
5872 return TypesLoaded[Index].withFastQualifiers(FastQuals);
5873}
5874
5875QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) {
5876 return GetType(getGlobalTypeID(F, LocalID));
5877}
5878
5879serialization::TypeID
5880ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const {
5881 unsigned FastQuals = LocalID & Qualifiers::FastMask;
5882 unsigned LocalIndex = LocalID >> Qualifiers::FastWidth;
5883
5884 if (LocalIndex < NUM_PREDEF_TYPE_IDS)
5885 return LocalID;
5886
5887 ContinuousRangeMap<uint32_t, int, 2>::iterator I
5888 = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS);
5889 assert(I != F.TypeRemap.end() && "Invalid index into type index remap");
5890
5891 unsigned GlobalIndex = LocalIndex + I->second;
5892 return (GlobalIndex << Qualifiers::FastWidth) | FastQuals;
5893}
5894
5895TemplateArgumentLocInfo
5896ASTReader::GetTemplateArgumentLocInfo(ModuleFile &F,
5897 TemplateArgument::ArgKind Kind,
5898 const RecordData &Record,
5899 unsigned &Index) {
5900 switch (Kind) {
5901 case TemplateArgument::Expression:
5902 return ReadExpr(F);
5903 case TemplateArgument::Type:
5904 return GetTypeSourceInfo(F, Record, Index);
5905 case TemplateArgument::Template: {
5906 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
5907 Index);
5908 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
5909 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
5910 SourceLocation());
5911 }
5912 case TemplateArgument::TemplateExpansion: {
5913 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
5914 Index);
5915 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
5916 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Index);
5917 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
5918 EllipsisLoc);
5919 }
5920 case TemplateArgument::Null:
5921 case TemplateArgument::Integral:
5922 case TemplateArgument::Declaration:
5923 case TemplateArgument::NullPtr:
5924 case TemplateArgument::Pack:
5925 // FIXME: Is this right?
5926 return TemplateArgumentLocInfo();
5927 }
5928 llvm_unreachable("unexpected template argument loc");
5929}
5930
5931TemplateArgumentLoc
5932ASTReader::ReadTemplateArgumentLoc(ModuleFile &F,
5933 const RecordData &Record, unsigned &Index) {
5934 TemplateArgument Arg = ReadTemplateArgument(F, Record, Index);
5935
5936 if (Arg.getKind() == TemplateArgument::Expression) {
5937 if (Record[Index++]) // bool InfoHasSameExpr.
5938 return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr()));
5939 }
5940 return TemplateArgumentLoc(Arg, GetTemplateArgumentLocInfo(F, Arg.getKind(),
5941 Record, Index));
5942}
5943
Enea Zaffanellac1cef082013-08-10 07:24:53 +00005944const ASTTemplateArgumentListInfo*
5945ASTReader::ReadASTTemplateArgumentListInfo(ModuleFile &F,
5946 const RecordData &Record,
5947 unsigned &Index) {
5948 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Index);
5949 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Index);
5950 unsigned NumArgsAsWritten = Record[Index++];
5951 TemplateArgumentListInfo TemplArgsInfo(LAngleLoc, RAngleLoc);
5952 for (unsigned i = 0; i != NumArgsAsWritten; ++i)
5953 TemplArgsInfo.addArgument(ReadTemplateArgumentLoc(F, Record, Index));
5954 return ASTTemplateArgumentListInfo::Create(getContext(), TemplArgsInfo);
5955}
5956
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005957Decl *ASTReader::GetExternalDecl(uint32_t ID) {
5958 return GetDecl(ID);
5959}
5960
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005961void ASTReader::CompleteRedeclChain(const Decl *D) {
5962 if (NumCurrentElementsDeserializing) {
5963 // We arrange to not care about the complete redeclaration chain while we're
5964 // deserializing. Just remember that the AST has marked this one as complete
5965 // but that it's not actually complete yet, so we know we still need to
5966 // complete it later.
5967 PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D));
5968 return;
5969 }
5970
5971 const DeclContext *DC = D->getDeclContext()->getRedeclContext();
5972
5973 // Recursively ensure that the decl context itself is complete
5974 // (in particular, this matters if the decl context is a namespace).
5975 //
5976 // FIXME: This should be performed by lookup instead of here.
5977 cast<Decl>(DC)->getMostRecentDecl();
5978
5979 // If this is a named declaration, complete it by looking it up
5980 // within its context.
5981 //
5982 // FIXME: We don't currently handle the cases where we can't do this;
5983 // merging a class definition that contains unnamed entities should merge
5984 // those entities. Likewise, merging a function definition should merge
5985 // all mergeable entities within it.
5986 if (isa<TranslationUnitDecl>(DC) || isa<NamespaceDecl>(DC) ||
5987 isa<CXXRecordDecl>(DC) || isa<EnumDecl>(DC)) {
5988 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) {
5989 auto *II = Name.getAsIdentifierInfo();
5990 if (isa<TranslationUnitDecl>(DC) && II) {
5991 // Outside of C++, we don't have a lookup table for the TU, so update
5992 // the identifier instead. In C++, either way should work fine.
5993 if (II->isOutOfDate())
5994 updateOutOfDateIdentifier(*II);
5995 } else
5996 DC->lookup(Name);
5997 }
5998 }
5999}
6000
6001uint64_t ASTReader::readCXXBaseSpecifiers(ModuleFile &M,
6002 const RecordData &Record,
6003 unsigned &Idx) {
6004 if (Idx >= Record.size() || Record[Idx] > M.LocalNumCXXBaseSpecifiers) {
6005 Error("malformed AST file: missing C++ base specifier");
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006006 return 0;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006007 }
6008
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006009 unsigned LocalID = Record[Idx++];
6010 return getGlobalBitOffset(M, M.CXXBaseSpecifiersOffsets[LocalID - 1]);
6011}
6012
6013CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) {
6014 RecordLocation Loc = getLocalBitOffset(Offset);
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00006015 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006016 SavedStreamPosition SavedPosition(Cursor);
6017 Cursor.JumpToBit(Loc.Offset);
6018 ReadingKindTracker ReadingKind(Read_Decl, *this);
6019 RecordData Record;
6020 unsigned Code = Cursor.ReadCode();
Chris Lattnerb3ce3572013-01-20 02:38:54 +00006021 unsigned RecCode = Cursor.readRecord(Code, Record);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006022 if (RecCode != DECL_CXX_BASE_SPECIFIERS) {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006023 Error("malformed AST file: missing C++ base specifiers");
6024 return nullptr;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006025 }
6026
6027 unsigned Idx = 0;
6028 unsigned NumBases = Record[Idx++];
6029 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases);
6030 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases];
6031 for (unsigned I = 0; I != NumBases; ++I)
6032 Bases[I] = ReadCXXBaseSpecifier(*Loc.F, Record, Idx);
6033 return Bases;
6034}
6035
6036serialization::DeclID
6037ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const {
6038 if (LocalID < NUM_PREDEF_DECL_IDS)
6039 return LocalID;
6040
6041 ContinuousRangeMap<uint32_t, int, 2>::iterator I
6042 = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS);
6043 assert(I != F.DeclRemap.end() && "Invalid index into decl index remap");
6044
6045 return LocalID + I->second;
6046}
6047
6048bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID,
6049 ModuleFile &M) const {
6050 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(ID);
6051 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6052 return &M == I->second;
6053}
6054
Douglas Gregor5a04f9f2013-01-21 15:25:38 +00006055ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006056 if (!D->isFromASTFile())
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006057 return nullptr;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006058 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID());
6059 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6060 return I->second;
6061}
6062
6063SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) {
6064 if (ID < NUM_PREDEF_DECL_IDS)
6065 return SourceLocation();
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006066
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006067 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6068
6069 if (Index > DeclsLoaded.size()) {
6070 Error("declaration ID out-of-range for AST file");
6071 return SourceLocation();
6072 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006073
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006074 if (Decl *D = DeclsLoaded[Index])
6075 return D->getLocation();
6076
6077 unsigned RawLocation = 0;
6078 RecordLocation Rec = DeclCursorForID(ID, RawLocation);
6079 return ReadSourceLocation(*Rec.F, RawLocation);
6080}
6081
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006082Decl *ASTReader::GetExistingDecl(DeclID ID) {
6083 if (ID < NUM_PREDEF_DECL_IDS) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006084 switch ((PredefinedDeclIDs)ID) {
6085 case PREDEF_DECL_NULL_ID:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006086 return nullptr;
6087
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006088 case PREDEF_DECL_TRANSLATION_UNIT_ID:
6089 return Context.getTranslationUnitDecl();
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006090
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006091 case PREDEF_DECL_OBJC_ID_ID:
6092 return Context.getObjCIdDecl();
6093
6094 case PREDEF_DECL_OBJC_SEL_ID:
6095 return Context.getObjCSelDecl();
6096
6097 case PREDEF_DECL_OBJC_CLASS_ID:
6098 return Context.getObjCClassDecl();
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006099
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006100 case PREDEF_DECL_OBJC_PROTOCOL_ID:
6101 return Context.getObjCProtocolDecl();
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006102
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006103 case PREDEF_DECL_INT_128_ID:
6104 return Context.getInt128Decl();
6105
6106 case PREDEF_DECL_UNSIGNED_INT_128_ID:
6107 return Context.getUInt128Decl();
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006108
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006109 case PREDEF_DECL_OBJC_INSTANCETYPE_ID:
6110 return Context.getObjCInstanceTypeDecl();
6111
6112 case PREDEF_DECL_BUILTIN_VA_LIST_ID:
6113 return Context.getBuiltinVaListDecl();
6114 }
6115 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006116
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006117 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6118
6119 if (Index >= DeclsLoaded.size()) {
6120 assert(0 && "declaration ID out-of-range for AST file");
6121 Error("declaration ID out-of-range for AST file");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006122 return nullptr;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006123 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006124
6125 return DeclsLoaded[Index];
6126}
6127
6128Decl *ASTReader::GetDecl(DeclID ID) {
6129 if (ID < NUM_PREDEF_DECL_IDS)
6130 return GetExistingDecl(ID);
6131
6132 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6133
6134 if (Index >= DeclsLoaded.size()) {
6135 assert(0 && "declaration ID out-of-range for AST file");
6136 Error("declaration ID out-of-range for AST file");
6137 return nullptr;
6138 }
6139
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006140 if (!DeclsLoaded[Index]) {
6141 ReadDeclRecord(ID);
6142 if (DeserializationListener)
6143 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
6144 }
6145
6146 return DeclsLoaded[Index];
6147}
6148
6149DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M,
6150 DeclID GlobalID) {
6151 if (GlobalID < NUM_PREDEF_DECL_IDS)
6152 return GlobalID;
6153
6154 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID);
6155 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6156 ModuleFile *Owner = I->second;
6157
6158 llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos
6159 = M.GlobalToLocalDeclIDs.find(Owner);
6160 if (Pos == M.GlobalToLocalDeclIDs.end())
6161 return 0;
6162
6163 return GlobalID - Owner->BaseDeclID + Pos->second;
6164}
6165
6166serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F,
6167 const RecordData &Record,
6168 unsigned &Idx) {
6169 if (Idx >= Record.size()) {
6170 Error("Corrupted AST file");
6171 return 0;
6172 }
6173
6174 return getGlobalDeclID(F, Record[Idx++]);
6175}
6176
6177/// \brief Resolve the offset of a statement into a statement.
6178///
6179/// This operation will read a new statement from the external
6180/// source each time it is called, and is meant to be used via a
6181/// LazyOffsetPtr (which is used by Decls for the body of functions, etc).
6182Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) {
6183 // Switch case IDs are per Decl.
6184 ClearSwitchCaseIDs();
6185
6186 // Offset here is a global offset across the entire chain.
6187 RecordLocation Loc = getLocalBitOffset(Offset);
6188 Loc.F->DeclsCursor.JumpToBit(Loc.Offset);
6189 return ReadStmtFromStream(*Loc.F);
6190}
6191
6192namespace {
6193 class FindExternalLexicalDeclsVisitor {
6194 ASTReader &Reader;
6195 const DeclContext *DC;
6196 bool (*isKindWeWant)(Decl::Kind);
6197
6198 SmallVectorImpl<Decl*> &Decls;
6199 bool PredefsVisited[NUM_PREDEF_DECL_IDS];
6200
6201 public:
6202 FindExternalLexicalDeclsVisitor(ASTReader &Reader, const DeclContext *DC,
6203 bool (*isKindWeWant)(Decl::Kind),
6204 SmallVectorImpl<Decl*> &Decls)
6205 : Reader(Reader), DC(DC), isKindWeWant(isKindWeWant), Decls(Decls)
6206 {
6207 for (unsigned I = 0; I != NUM_PREDEF_DECL_IDS; ++I)
6208 PredefsVisited[I] = false;
6209 }
6210
6211 static bool visit(ModuleFile &M, bool Preorder, void *UserData) {
6212 if (Preorder)
6213 return false;
6214
6215 FindExternalLexicalDeclsVisitor *This
6216 = static_cast<FindExternalLexicalDeclsVisitor *>(UserData);
6217
6218 ModuleFile::DeclContextInfosMap::iterator Info
6219 = M.DeclContextInfos.find(This->DC);
6220 if (Info == M.DeclContextInfos.end() || !Info->second.LexicalDecls)
6221 return false;
6222
6223 // Load all of the declaration IDs
6224 for (const KindDeclIDPair *ID = Info->second.LexicalDecls,
6225 *IDE = ID + Info->second.NumLexicalDecls;
6226 ID != IDE; ++ID) {
6227 if (This->isKindWeWant && !This->isKindWeWant((Decl::Kind)ID->first))
6228 continue;
6229
6230 // Don't add predefined declarations to the lexical context more
6231 // than once.
6232 if (ID->second < NUM_PREDEF_DECL_IDS) {
6233 if (This->PredefsVisited[ID->second])
6234 continue;
6235
6236 This->PredefsVisited[ID->second] = true;
6237 }
6238
6239 if (Decl *D = This->Reader.GetLocalDecl(M, ID->second)) {
6240 if (!This->DC->isDeclInLexicalTraversal(D))
6241 This->Decls.push_back(D);
6242 }
6243 }
6244
6245 return false;
6246 }
6247 };
6248}
6249
6250ExternalLoadResult ASTReader::FindExternalLexicalDecls(const DeclContext *DC,
6251 bool (*isKindWeWant)(Decl::Kind),
6252 SmallVectorImpl<Decl*> &Decls) {
6253 // There might be lexical decls in multiple modules, for the TU at
6254 // least. Walk all of the modules in the order they were loaded.
6255 FindExternalLexicalDeclsVisitor Visitor(*this, DC, isKindWeWant, Decls);
6256 ModuleMgr.visitDepthFirst(&FindExternalLexicalDeclsVisitor::visit, &Visitor);
6257 ++NumLexicalDeclContextsRead;
6258 return ELR_Success;
6259}
6260
6261namespace {
6262
6263class DeclIDComp {
6264 ASTReader &Reader;
6265 ModuleFile &Mod;
6266
6267public:
6268 DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {}
6269
6270 bool operator()(LocalDeclID L, LocalDeclID R) const {
6271 SourceLocation LHS = getLocation(L);
6272 SourceLocation RHS = getLocation(R);
6273 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6274 }
6275
6276 bool operator()(SourceLocation LHS, LocalDeclID R) const {
6277 SourceLocation RHS = getLocation(R);
6278 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6279 }
6280
6281 bool operator()(LocalDeclID L, SourceLocation RHS) const {
6282 SourceLocation LHS = getLocation(L);
6283 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6284 }
6285
6286 SourceLocation getLocation(LocalDeclID ID) const {
6287 return Reader.getSourceManager().getFileLoc(
6288 Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID)));
6289 }
6290};
6291
6292}
6293
6294void ASTReader::FindFileRegionDecls(FileID File,
6295 unsigned Offset, unsigned Length,
6296 SmallVectorImpl<Decl *> &Decls) {
6297 SourceManager &SM = getSourceManager();
6298
6299 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File);
6300 if (I == FileDeclIDs.end())
6301 return;
6302
6303 FileDeclsInfo &DInfo = I->second;
6304 if (DInfo.Decls.empty())
6305 return;
6306
6307 SourceLocation
6308 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset);
6309 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length);
6310
6311 DeclIDComp DIDComp(*this, *DInfo.Mod);
6312 ArrayRef<serialization::LocalDeclID>::iterator
6313 BeginIt = std::lower_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
6314 BeginLoc, DIDComp);
6315 if (BeginIt != DInfo.Decls.begin())
6316 --BeginIt;
6317
6318 // If we are pointing at a top-level decl inside an objc container, we need
6319 // to backtrack until we find it otherwise we will fail to report that the
6320 // region overlaps with an objc container.
6321 while (BeginIt != DInfo.Decls.begin() &&
6322 GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt))
6323 ->isTopLevelDeclInObjCContainer())
6324 --BeginIt;
6325
6326 ArrayRef<serialization::LocalDeclID>::iterator
6327 EndIt = std::upper_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
6328 EndLoc, DIDComp);
6329 if (EndIt != DInfo.Decls.end())
6330 ++EndIt;
6331
6332 for (ArrayRef<serialization::LocalDeclID>::iterator
6333 DIt = BeginIt; DIt != EndIt; ++DIt)
6334 Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt)));
6335}
6336
6337namespace {
6338 /// \brief ModuleFile visitor used to perform name lookup into a
6339 /// declaration context.
6340 class DeclContextNameLookupVisitor {
6341 ASTReader &Reader;
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00006342 SmallVectorImpl<const DeclContext *> &Contexts;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006343 DeclarationName Name;
6344 SmallVectorImpl<NamedDecl *> &Decls;
6345
6346 public:
6347 DeclContextNameLookupVisitor(ASTReader &Reader,
6348 SmallVectorImpl<const DeclContext *> &Contexts,
6349 DeclarationName Name,
6350 SmallVectorImpl<NamedDecl *> &Decls)
6351 : Reader(Reader), Contexts(Contexts), Name(Name), Decls(Decls) { }
6352
6353 static bool visit(ModuleFile &M, void *UserData) {
6354 DeclContextNameLookupVisitor *This
6355 = static_cast<DeclContextNameLookupVisitor *>(UserData);
6356
6357 // Check whether we have any visible declaration information for
6358 // this context in this module.
6359 ModuleFile::DeclContextInfosMap::iterator Info;
6360 bool FoundInfo = false;
6361 for (unsigned I = 0, N = This->Contexts.size(); I != N; ++I) {
6362 Info = M.DeclContextInfos.find(This->Contexts[I]);
6363 if (Info != M.DeclContextInfos.end() &&
6364 Info->second.NameLookupTableData) {
6365 FoundInfo = true;
6366 break;
6367 }
6368 }
6369
6370 if (!FoundInfo)
6371 return false;
6372
6373 // Look for this name within this module.
6374 ASTDeclContextNameLookupTable *LookupTable =
6375 Info->second.NameLookupTableData;
6376 ASTDeclContextNameLookupTable::iterator Pos
6377 = LookupTable->find(This->Name);
6378 if (Pos == LookupTable->end())
6379 return false;
6380
6381 bool FoundAnything = false;
6382 ASTDeclContextNameLookupTrait::data_type Data = *Pos;
6383 for (; Data.first != Data.second; ++Data.first) {
6384 NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M, *Data.first);
6385 if (!ND)
6386 continue;
6387
6388 if (ND->getDeclName() != This->Name) {
6389 // A name might be null because the decl's redeclarable part is
6390 // currently read before reading its name. The lookup is triggered by
6391 // building that decl (likely indirectly), and so it is later in the
6392 // sense of "already existing" and can be ignored here.
6393 continue;
6394 }
6395
6396 // Record this declaration.
6397 FoundAnything = true;
6398 This->Decls.push_back(ND);
6399 }
6400
6401 return FoundAnything;
6402 }
6403 };
6404}
6405
Douglas Gregor5a04f9f2013-01-21 15:25:38 +00006406/// \brief Retrieve the "definitive" module file for the definition of the
6407/// given declaration context, if there is one.
6408///
6409/// The "definitive" module file is the only place where we need to look to
6410/// find information about the declarations within the given declaration
6411/// context. For example, C++ and Objective-C classes, C structs/unions, and
6412/// Objective-C protocols, categories, and extensions are all defined in a
6413/// single place in the source code, so they have definitive module files
6414/// associated with them. C++ namespaces, on the other hand, can have
6415/// definitions in multiple different module files.
6416///
6417/// Note: this needs to be kept in sync with ASTWriter::AddedVisibleDecl's
6418/// NDEBUG checking.
6419static ModuleFile *getDefinitiveModuleFileFor(const DeclContext *DC,
6420 ASTReader &Reader) {
Douglas Gregore0d20662013-01-22 17:08:30 +00006421 if (const DeclContext *DefDC = getDefinitiveDeclContext(DC))
6422 return Reader.getOwningModuleFile(cast<Decl>(DefDC));
Douglas Gregor5a04f9f2013-01-21 15:25:38 +00006423
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006424 return nullptr;
Douglas Gregor5a04f9f2013-01-21 15:25:38 +00006425}
6426
Richard Smith3646c682013-02-07 03:30:24 +00006427bool
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006428ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC,
6429 DeclarationName Name) {
6430 assert(DC->hasExternalVisibleStorage() &&
6431 "DeclContext has no visible decls in storage");
6432 if (!Name)
Richard Smith3646c682013-02-07 03:30:24 +00006433 return false;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006434
6435 SmallVector<NamedDecl *, 64> Decls;
6436
6437 // Compute the declaration contexts we need to look into. Multiple such
6438 // declaration contexts occur when two declaration contexts from disjoint
6439 // modules get merged, e.g., when two namespaces with the same name are
6440 // independently defined in separate modules.
6441 SmallVector<const DeclContext *, 2> Contexts;
6442 Contexts.push_back(DC);
6443
6444 if (DC->isNamespace()) {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006445 auto Merged = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC)));
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006446 if (Merged != MergedDecls.end()) {
6447 for (unsigned I = 0, N = Merged->second.size(); I != N; ++I)
6448 Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I])));
6449 }
6450 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006451 if (isa<CXXRecordDecl>(DC)) {
6452 auto Merged = MergedLookups.find(DC);
6453 if (Merged != MergedLookups.end())
6454 Contexts.insert(Contexts.end(), Merged->second.begin(),
6455 Merged->second.end());
6456 }
6457
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006458 DeclContextNameLookupVisitor Visitor(*this, Contexts, Name, Decls);
Douglas Gregor5a04f9f2013-01-21 15:25:38 +00006459
6460 // If we can definitively determine which module file to look into,
6461 // only look there. Otherwise, look in all module files.
6462 ModuleFile *Definitive;
6463 if (Contexts.size() == 1 &&
6464 (Definitive = getDefinitiveModuleFileFor(DC, *this))) {
6465 DeclContextNameLookupVisitor::visit(*Definitive, &Visitor);
6466 } else {
6467 ModuleMgr.visit(&DeclContextNameLookupVisitor::visit, &Visitor);
6468 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006469 ++NumVisibleDeclContextsRead;
6470 SetExternalVisibleDeclsForName(DC, Name, Decls);
Richard Smith3646c682013-02-07 03:30:24 +00006471 return !Decls.empty();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006472}
6473
6474namespace {
6475 /// \brief ModuleFile visitor used to retrieve all visible names in a
6476 /// declaration context.
6477 class DeclContextAllNamesVisitor {
6478 ASTReader &Reader;
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00006479 SmallVectorImpl<const DeclContext *> &Contexts;
Craig Topper8ae63872013-07-05 04:43:31 +00006480 DeclsMap &Decls;
Argyrios Kyrtzidisca40f302012-12-19 22:21:18 +00006481 bool VisitAll;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006482
6483 public:
6484 DeclContextAllNamesVisitor(ASTReader &Reader,
6485 SmallVectorImpl<const DeclContext *> &Contexts,
Craig Topper8ae63872013-07-05 04:43:31 +00006486 DeclsMap &Decls, bool VisitAll)
Argyrios Kyrtzidisca40f302012-12-19 22:21:18 +00006487 : Reader(Reader), Contexts(Contexts), Decls(Decls), VisitAll(VisitAll) { }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006488
6489 static bool visit(ModuleFile &M, void *UserData) {
6490 DeclContextAllNamesVisitor *This
6491 = static_cast<DeclContextAllNamesVisitor *>(UserData);
6492
6493 // Check whether we have any visible declaration information for
6494 // this context in this module.
6495 ModuleFile::DeclContextInfosMap::iterator Info;
6496 bool FoundInfo = false;
6497 for (unsigned I = 0, N = This->Contexts.size(); I != N; ++I) {
6498 Info = M.DeclContextInfos.find(This->Contexts[I]);
6499 if (Info != M.DeclContextInfos.end() &&
6500 Info->second.NameLookupTableData) {
6501 FoundInfo = true;
6502 break;
6503 }
6504 }
6505
6506 if (!FoundInfo)
6507 return false;
6508
6509 ASTDeclContextNameLookupTable *LookupTable =
6510 Info->second.NameLookupTableData;
6511 bool FoundAnything = false;
6512 for (ASTDeclContextNameLookupTable::data_iterator
Douglas Gregora6b00fc2013-01-23 22:38:11 +00006513 I = LookupTable->data_begin(), E = LookupTable->data_end();
6514 I != E;
6515 ++I) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006516 ASTDeclContextNameLookupTrait::data_type Data = *I;
6517 for (; Data.first != Data.second; ++Data.first) {
6518 NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M,
6519 *Data.first);
6520 if (!ND)
6521 continue;
6522
6523 // Record this declaration.
6524 FoundAnything = true;
6525 This->Decls[ND->getDeclName()].push_back(ND);
6526 }
6527 }
6528
Argyrios Kyrtzidisca40f302012-12-19 22:21:18 +00006529 return FoundAnything && !This->VisitAll;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006530 }
6531 };
6532}
6533
6534void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) {
6535 if (!DC->hasExternalVisibleStorage())
6536 return;
Craig Topperee0a4792013-07-05 04:33:53 +00006537 DeclsMap Decls;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006538
6539 // Compute the declaration contexts we need to look into. Multiple such
6540 // declaration contexts occur when two declaration contexts from disjoint
6541 // modules get merged, e.g., when two namespaces with the same name are
6542 // independently defined in separate modules.
6543 SmallVector<const DeclContext *, 2> Contexts;
6544 Contexts.push_back(DC);
6545
6546 if (DC->isNamespace()) {
6547 MergedDeclsMap::iterator Merged
6548 = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC)));
6549 if (Merged != MergedDecls.end()) {
6550 for (unsigned I = 0, N = Merged->second.size(); I != N; ++I)
6551 Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I])));
6552 }
6553 }
6554
Argyrios Kyrtzidisca40f302012-12-19 22:21:18 +00006555 DeclContextAllNamesVisitor Visitor(*this, Contexts, Decls,
6556 /*VisitAll=*/DC->isFileContext());
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006557 ModuleMgr.visit(&DeclContextAllNamesVisitor::visit, &Visitor);
6558 ++NumVisibleDeclContextsRead;
6559
Craig Topperee0a4792013-07-05 04:33:53 +00006560 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006561 SetExternalVisibleDeclsForName(DC, I->first, I->second);
6562 }
6563 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false);
6564}
6565
6566/// \brief Under non-PCH compilation the consumer receives the objc methods
6567/// before receiving the implementation, and codegen depends on this.
6568/// We simulate this by deserializing and passing to consumer the methods of the
6569/// implementation before passing the deserialized implementation decl.
6570static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD,
6571 ASTConsumer *Consumer) {
6572 assert(ImplD && Consumer);
6573
Stephen Hines651f13c2014-04-23 16:59:28 -07006574 for (auto *I : ImplD->methods())
6575 Consumer->HandleInterestingDecl(DeclGroupRef(I));
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006576
6577 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD));
6578}
6579
6580void ASTReader::PassInterestingDeclsToConsumer() {
6581 assert(Consumer);
Stephen Hines651f13c2014-04-23 16:59:28 -07006582
6583 if (PassingDeclsToConsumer)
6584 return;
6585
6586 // Guard variable to avoid recursively redoing the process of passing
6587 // decls to consumer.
6588 SaveAndRestore<bool> GuardPassingDeclsToConsumer(PassingDeclsToConsumer,
6589 true);
6590
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006591 while (!InterestingDecls.empty()) {
6592 Decl *D = InterestingDecls.front();
6593 InterestingDecls.pop_front();
6594
6595 PassInterestingDeclToConsumer(D);
6596 }
6597}
6598
6599void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
6600 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
6601 PassObjCImplDeclToConsumer(ImplD, Consumer);
6602 else
6603 Consumer->HandleInterestingDecl(DeclGroupRef(D));
6604}
6605
6606void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) {
6607 this->Consumer = Consumer;
6608
6609 if (!Consumer)
6610 return;
6611
Stephen Hines651f13c2014-04-23 16:59:28 -07006612 for (unsigned I = 0, N = EagerlyDeserializedDecls.size(); I != N; ++I) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006613 // Force deserialization of this decl, which will cause it to be queued for
6614 // passing to the consumer.
Stephen Hines651f13c2014-04-23 16:59:28 -07006615 GetDecl(EagerlyDeserializedDecls[I]);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006616 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006617 EagerlyDeserializedDecls.clear();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006618
6619 PassInterestingDeclsToConsumer();
6620}
6621
6622void ASTReader::PrintStats() {
6623 std::fprintf(stderr, "*** AST File Statistics:\n");
6624
6625 unsigned NumTypesLoaded
6626 = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(),
6627 QualType());
6628 unsigned NumDeclsLoaded
6629 = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(),
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006630 (Decl *)nullptr);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006631 unsigned NumIdentifiersLoaded
6632 = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(),
6633 IdentifiersLoaded.end(),
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006634 (IdentifierInfo *)nullptr);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006635 unsigned NumMacrosLoaded
6636 = MacrosLoaded.size() - std::count(MacrosLoaded.begin(),
6637 MacrosLoaded.end(),
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006638 (MacroInfo *)nullptr);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006639 unsigned NumSelectorsLoaded
6640 = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(),
6641 SelectorsLoaded.end(),
6642 Selector());
6643
6644 if (unsigned TotalNumSLocEntries = getTotalNumSLocs())
6645 std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n",
6646 NumSLocEntriesRead, TotalNumSLocEntries,
6647 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
6648 if (!TypesLoaded.empty())
6649 std::fprintf(stderr, " %u/%u types read (%f%%)\n",
6650 NumTypesLoaded, (unsigned)TypesLoaded.size(),
6651 ((float)NumTypesLoaded/TypesLoaded.size() * 100));
6652 if (!DeclsLoaded.empty())
6653 std::fprintf(stderr, " %u/%u declarations read (%f%%)\n",
6654 NumDeclsLoaded, (unsigned)DeclsLoaded.size(),
6655 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100));
6656 if (!IdentifiersLoaded.empty())
6657 std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n",
6658 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(),
6659 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
6660 if (!MacrosLoaded.empty())
6661 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
6662 NumMacrosLoaded, (unsigned)MacrosLoaded.size(),
6663 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100));
6664 if (!SelectorsLoaded.empty())
6665 std::fprintf(stderr, " %u/%u selectors read (%f%%)\n",
6666 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(),
6667 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
6668 if (TotalNumStatements)
6669 std::fprintf(stderr, " %u/%u statements read (%f%%)\n",
6670 NumStatementsRead, TotalNumStatements,
6671 ((float)NumStatementsRead/TotalNumStatements * 100));
6672 if (TotalNumMacros)
6673 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
6674 NumMacrosRead, TotalNumMacros,
6675 ((float)NumMacrosRead/TotalNumMacros * 100));
6676 if (TotalLexicalDeclContexts)
6677 std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n",
6678 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
6679 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
6680 * 100));
6681 if (TotalVisibleDeclContexts)
6682 std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n",
6683 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
6684 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
6685 * 100));
6686 if (TotalNumMethodPoolEntries) {
6687 std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n",
6688 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
6689 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
6690 * 100));
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006691 }
Douglas Gregor95fb36e2013-01-28 17:54:36 +00006692 if (NumMethodPoolLookups) {
6693 std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n",
6694 NumMethodPoolHits, NumMethodPoolLookups,
6695 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
6696 }
6697 if (NumMethodPoolTableLookups) {
6698 std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n",
6699 NumMethodPoolTableHits, NumMethodPoolTableLookups,
6700 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups
6701 * 100.0));
6702 }
6703
Douglas Gregore1698072013-01-25 00:38:33 +00006704 if (NumIdentifierLookupHits) {
6705 std::fprintf(stderr,
6706 " %u / %u identifier table lookups succeeded (%f%%)\n",
6707 NumIdentifierLookupHits, NumIdentifierLookups,
6708 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
6709 }
6710
Douglas Gregor1a49d972013-01-25 01:03:03 +00006711 if (GlobalIndex) {
6712 std::fprintf(stderr, "\n");
6713 GlobalIndex->printStats();
6714 }
6715
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006716 std::fprintf(stderr, "\n");
6717 dump();
6718 std::fprintf(stderr, "\n");
6719}
6720
6721template<typename Key, typename ModuleFile, unsigned InitialCapacity>
6722static void
6723dumpModuleIDMap(StringRef Name,
6724 const ContinuousRangeMap<Key, ModuleFile *,
6725 InitialCapacity> &Map) {
6726 if (Map.begin() == Map.end())
6727 return;
6728
6729 typedef ContinuousRangeMap<Key, ModuleFile *, InitialCapacity> MapType;
6730 llvm::errs() << Name << ":\n";
6731 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
6732 I != IEnd; ++I) {
6733 llvm::errs() << " " << I->first << " -> " << I->second->FileName
6734 << "\n";
6735 }
6736}
6737
6738void ASTReader::dump() {
6739 llvm::errs() << "*** PCH/ModuleFile Remappings:\n";
6740 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap);
6741 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap);
6742 dumpModuleIDMap("Global type map", GlobalTypeMap);
6743 dumpModuleIDMap("Global declaration map", GlobalDeclMap);
6744 dumpModuleIDMap("Global identifier map", GlobalIdentifierMap);
6745 dumpModuleIDMap("Global macro map", GlobalMacroMap);
6746 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap);
6747 dumpModuleIDMap("Global selector map", GlobalSelectorMap);
6748 dumpModuleIDMap("Global preprocessed entity map",
6749 GlobalPreprocessedEntityMap);
6750
6751 llvm::errs() << "\n*** PCH/Modules Loaded:";
6752 for (ModuleManager::ModuleConstIterator M = ModuleMgr.begin(),
6753 MEnd = ModuleMgr.end();
6754 M != MEnd; ++M)
6755 (*M)->dump();
6756}
6757
6758/// Return the amount of memory used by memory buffers, breaking down
6759/// by heap-backed versus mmap'ed memory.
6760void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const {
6761 for (ModuleConstIterator I = ModuleMgr.begin(),
6762 E = ModuleMgr.end(); I != E; ++I) {
6763 if (llvm::MemoryBuffer *buf = (*I)->Buffer.get()) {
6764 size_t bytes = buf->getBufferSize();
6765 switch (buf->getBufferKind()) {
6766 case llvm::MemoryBuffer::MemoryBuffer_Malloc:
6767 sizes.malloc_bytes += bytes;
6768 break;
6769 case llvm::MemoryBuffer::MemoryBuffer_MMap:
6770 sizes.mmap_bytes += bytes;
6771 break;
6772 }
6773 }
6774 }
6775}
6776
6777void ASTReader::InitializeSema(Sema &S) {
6778 SemaObj = &S;
6779 S.addExternalSource(this);
6780
6781 // Makes sure any declarations that were deserialized "too early"
6782 // still get added to the identifier's declaration chains.
6783 for (unsigned I = 0, N = PreloadedDecls.size(); I != N; ++I) {
Argyrios Kyrtzidis0532df02013-04-26 21:33:35 +00006784 pushExternalDeclIntoScope(PreloadedDecls[I],
6785 PreloadedDecls[I]->getDeclName());
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006786 }
6787 PreloadedDecls.clear();
6788
Richard Smith9b671182013-10-18 06:54:39 +00006789 // FIXME: What happens if these are changed by a module import?
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006790 if (!FPPragmaOptions.empty()) {
6791 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS");
6792 SemaObj->FPFeatures.fp_contract = FPPragmaOptions[0];
6793 }
6794
Richard Smith9b671182013-10-18 06:54:39 +00006795 // FIXME: What happens if these are changed by a module import?
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006796 if (!OpenCLExtensions.empty()) {
6797 unsigned I = 0;
6798#define OPENCLEXT(nm) SemaObj->OpenCLFeatures.nm = OpenCLExtensions[I++];
6799#include "clang/Basic/OpenCLExtensions.def"
6800
6801 assert(OpenCLExtensions.size() == I && "Wrong number of OPENCL_EXTENSIONS");
6802 }
Richard Smith9b671182013-10-18 06:54:39 +00006803
6804 UpdateSema();
6805}
6806
6807void ASTReader::UpdateSema() {
6808 assert(SemaObj && "no Sema to update");
6809
6810 // Load the offsets of the declarations that Sema references.
6811 // They will be lazily deserialized when needed.
6812 if (!SemaDeclRefs.empty()) {
6813 assert(SemaDeclRefs.size() % 2 == 0);
6814 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 2) {
6815 if (!SemaObj->StdNamespace)
6816 SemaObj->StdNamespace = SemaDeclRefs[I];
6817 if (!SemaObj->StdBadAlloc)
6818 SemaObj->StdBadAlloc = SemaDeclRefs[I+1];
6819 }
6820 SemaDeclRefs.clear();
6821 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006822
6823 // Update the state of 'pragma clang optimize'. Use the same API as if we had
6824 // encountered the pragma in the source.
6825 if(OptimizeOffPragmaLocation.isValid())
6826 SemaObj->ActOnPragmaOptimize(/* IsOn = */ false, OptimizeOffPragmaLocation);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006827}
6828
6829IdentifierInfo* ASTReader::get(const char *NameStart, const char *NameEnd) {
6830 // Note that we are loading an identifier.
6831 Deserializing AnIdentifier(this);
Douglas Gregor1a49d972013-01-25 01:03:03 +00006832 StringRef Name(NameStart, NameEnd - NameStart);
6833
6834 // If there is a global index, look there first to determine which modules
6835 // provably do not have any results for this identifier.
Douglas Gregor188bdcd2013-01-25 23:32:03 +00006836 GlobalModuleIndex::HitSet Hits;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006837 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
Douglas Gregor1a49d972013-01-25 01:03:03 +00006838 if (!loadGlobalIndex()) {
Douglas Gregor188bdcd2013-01-25 23:32:03 +00006839 if (GlobalIndex->lookupIdentifier(Name, Hits)) {
6840 HitsPtr = &Hits;
Douglas Gregor1a49d972013-01-25 01:03:03 +00006841 }
6842 }
Douglas Gregor188bdcd2013-01-25 23:32:03 +00006843 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0,
Douglas Gregore1698072013-01-25 00:38:33 +00006844 NumIdentifierLookups,
6845 NumIdentifierLookupHits);
Douglas Gregor188bdcd2013-01-25 23:32:03 +00006846 ModuleMgr.visit(IdentifierLookupVisitor::visit, &Visitor, HitsPtr);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006847 IdentifierInfo *II = Visitor.getIdentifierInfo();
6848 markIdentifierUpToDate(II);
6849 return II;
6850}
6851
6852namespace clang {
6853 /// \brief An identifier-lookup iterator that enumerates all of the
6854 /// identifiers stored within a set of AST files.
6855 class ASTIdentifierIterator : public IdentifierIterator {
6856 /// \brief The AST reader whose identifiers are being enumerated.
6857 const ASTReader &Reader;
6858
6859 /// \brief The current index into the chain of AST files stored in
6860 /// the AST reader.
6861 unsigned Index;
6862
6863 /// \brief The current position within the identifier lookup table
6864 /// of the current AST file.
6865 ASTIdentifierLookupTable::key_iterator Current;
6866
6867 /// \brief The end position within the identifier lookup table of
6868 /// the current AST file.
6869 ASTIdentifierLookupTable::key_iterator End;
6870
6871 public:
6872 explicit ASTIdentifierIterator(const ASTReader &Reader);
6873
Stephen Hines651f13c2014-04-23 16:59:28 -07006874 StringRef Next() override;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006875 };
6876}
6877
6878ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader)
6879 : Reader(Reader), Index(Reader.ModuleMgr.size() - 1) {
6880 ASTIdentifierLookupTable *IdTable
6881 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].IdentifierLookupTable;
6882 Current = IdTable->key_begin();
6883 End = IdTable->key_end();
6884}
6885
6886StringRef ASTIdentifierIterator::Next() {
6887 while (Current == End) {
6888 // If we have exhausted all of our AST files, we're done.
6889 if (Index == 0)
6890 return StringRef();
6891
6892 --Index;
6893 ASTIdentifierLookupTable *IdTable
6894 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].
6895 IdentifierLookupTable;
6896 Current = IdTable->key_begin();
6897 End = IdTable->key_end();
6898 }
6899
6900 // We have any identifiers remaining in the current AST file; return
6901 // the next one.
Douglas Gregor479633c2013-01-23 18:53:14 +00006902 StringRef Result = *Current;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006903 ++Current;
Douglas Gregor479633c2013-01-23 18:53:14 +00006904 return Result;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006905}
6906
Argyrios Kyrtzidis87f9d812013-04-17 22:10:55 +00006907IdentifierIterator *ASTReader::getIdentifiers() {
6908 if (!loadGlobalIndex())
6909 return GlobalIndex->createIdentifierIterator();
6910
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006911 return new ASTIdentifierIterator(*this);
6912}
6913
6914namespace clang { namespace serialization {
6915 class ReadMethodPoolVisitor {
6916 ASTReader &Reader;
6917 Selector Sel;
6918 unsigned PriorGeneration;
Argyrios Kyrtzidis2e3d8c02013-04-17 00:08:58 +00006919 unsigned InstanceBits;
6920 unsigned FactoryBits;
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00006921 SmallVector<ObjCMethodDecl *, 4> InstanceMethods;
6922 SmallVector<ObjCMethodDecl *, 4> FactoryMethods;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006923
6924 public:
6925 ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel,
6926 unsigned PriorGeneration)
Argyrios Kyrtzidis2e3d8c02013-04-17 00:08:58 +00006927 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration),
6928 InstanceBits(0), FactoryBits(0) { }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006929
6930 static bool visit(ModuleFile &M, void *UserData) {
6931 ReadMethodPoolVisitor *This
6932 = static_cast<ReadMethodPoolVisitor *>(UserData);
6933
6934 if (!M.SelectorLookupTable)
6935 return false;
6936
6937 // If we've already searched this module file, skip it now.
6938 if (M.Generation <= This->PriorGeneration)
6939 return true;
6940
Douglas Gregor95fb36e2013-01-28 17:54:36 +00006941 ++This->Reader.NumMethodPoolTableLookups;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006942 ASTSelectorLookupTable *PoolTable
6943 = (ASTSelectorLookupTable*)M.SelectorLookupTable;
6944 ASTSelectorLookupTable::iterator Pos = PoolTable->find(This->Sel);
6945 if (Pos == PoolTable->end())
6946 return false;
Douglas Gregor95fb36e2013-01-28 17:54:36 +00006947
6948 ++This->Reader.NumMethodPoolTableHits;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006949 ++This->Reader.NumSelectorsRead;
6950 // FIXME: Not quite happy with the statistics here. We probably should
6951 // disable this tracking when called via LoadSelector.
6952 // Also, should entries without methods count as misses?
6953 ++This->Reader.NumMethodPoolEntriesRead;
6954 ASTSelectorLookupTrait::data_type Data = *Pos;
6955 if (This->Reader.DeserializationListener)
6956 This->Reader.DeserializationListener->SelectorRead(Data.ID,
6957 This->Sel);
6958
6959 This->InstanceMethods.append(Data.Instance.begin(), Data.Instance.end());
6960 This->FactoryMethods.append(Data.Factory.begin(), Data.Factory.end());
Argyrios Kyrtzidis2e3d8c02013-04-17 00:08:58 +00006961 This->InstanceBits = Data.InstanceBits;
6962 This->FactoryBits = Data.FactoryBits;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006963 return true;
6964 }
6965
6966 /// \brief Retrieve the instance methods found by this visitor.
6967 ArrayRef<ObjCMethodDecl *> getInstanceMethods() const {
6968 return InstanceMethods;
6969 }
6970
6971 /// \brief Retrieve the instance methods found by this visitor.
6972 ArrayRef<ObjCMethodDecl *> getFactoryMethods() const {
6973 return FactoryMethods;
6974 }
Argyrios Kyrtzidis2e3d8c02013-04-17 00:08:58 +00006975
6976 unsigned getInstanceBits() const { return InstanceBits; }
6977 unsigned getFactoryBits() const { return FactoryBits; }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006978 };
6979} } // end namespace clang::serialization
6980
6981/// \brief Add the given set of methods to the method list.
6982static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods,
6983 ObjCMethodList &List) {
6984 for (unsigned I = 0, N = Methods.size(); I != N; ++I) {
6985 S.addMethodToGlobalList(&List, Methods[I]);
6986 }
6987}
6988
6989void ASTReader::ReadMethodPool(Selector Sel) {
6990 // Get the selector generation and update it to the current generation.
6991 unsigned &Generation = SelectorGeneration[Sel];
6992 unsigned PriorGeneration = Generation;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006993 Generation = getGeneration();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006994
6995 // Search for methods defined with this selector.
Douglas Gregor95fb36e2013-01-28 17:54:36 +00006996 ++NumMethodPoolLookups;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006997 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration);
6998 ModuleMgr.visit(&ReadMethodPoolVisitor::visit, &Visitor);
6999
7000 if (Visitor.getInstanceMethods().empty() &&
Douglas Gregor95fb36e2013-01-28 17:54:36 +00007001 Visitor.getFactoryMethods().empty())
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007002 return;
Douglas Gregor95fb36e2013-01-28 17:54:36 +00007003
7004 ++NumMethodPoolHits;
7005
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007006 if (!getSema())
7007 return;
7008
7009 Sema &S = *getSema();
7010 Sema::GlobalMethodPool::iterator Pos
7011 = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first;
7012
7013 addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first);
7014 addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second);
Argyrios Kyrtzidis2e3d8c02013-04-17 00:08:58 +00007015 Pos->second.first.setBits(Visitor.getInstanceBits());
7016 Pos->second.second.setBits(Visitor.getFactoryBits());
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007017}
7018
7019void ASTReader::ReadKnownNamespaces(
7020 SmallVectorImpl<NamespaceDecl *> &Namespaces) {
7021 Namespaces.clear();
7022
7023 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
7024 if (NamespaceDecl *Namespace
7025 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I])))
7026 Namespaces.push_back(Namespace);
7027 }
7028}
7029
Nick Lewyckycd0655b2013-02-01 08:13:20 +00007030void ASTReader::ReadUndefinedButUsed(
Nick Lewycky995e26b2013-01-31 03:23:57 +00007031 llvm::DenseMap<NamedDecl*, SourceLocation> &Undefined) {
Nick Lewyckycd0655b2013-02-01 08:13:20 +00007032 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
7033 NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++]));
Nick Lewycky01a41142013-01-26 00:35:08 +00007034 SourceLocation Loc =
Nick Lewyckycd0655b2013-02-01 08:13:20 +00007035 SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]);
Nick Lewycky01a41142013-01-26 00:35:08 +00007036 Undefined.insert(std::make_pair(D, Loc));
7037 }
7038}
Nick Lewycky01a41142013-01-26 00:35:08 +00007039
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007040void ASTReader::ReadTentativeDefinitions(
7041 SmallVectorImpl<VarDecl *> &TentativeDefs) {
7042 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
7043 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I]));
7044 if (Var)
7045 TentativeDefs.push_back(Var);
7046 }
7047 TentativeDefinitions.clear();
7048}
7049
7050void ASTReader::ReadUnusedFileScopedDecls(
7051 SmallVectorImpl<const DeclaratorDecl *> &Decls) {
7052 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
7053 DeclaratorDecl *D
7054 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I]));
7055 if (D)
7056 Decls.push_back(D);
7057 }
7058 UnusedFileScopedDecls.clear();
7059}
7060
7061void ASTReader::ReadDelegatingConstructors(
7062 SmallVectorImpl<CXXConstructorDecl *> &Decls) {
7063 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
7064 CXXConstructorDecl *D
7065 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I]));
7066 if (D)
7067 Decls.push_back(D);
7068 }
7069 DelegatingCtorDecls.clear();
7070}
7071
7072void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) {
7073 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
7074 TypedefNameDecl *D
7075 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I]));
7076 if (D)
7077 Decls.push_back(D);
7078 }
7079 ExtVectorDecls.clear();
7080}
7081
7082void ASTReader::ReadDynamicClasses(SmallVectorImpl<CXXRecordDecl *> &Decls) {
7083 for (unsigned I = 0, N = DynamicClasses.size(); I != N; ++I) {
7084 CXXRecordDecl *D
7085 = dyn_cast_or_null<CXXRecordDecl>(GetDecl(DynamicClasses[I]));
7086 if (D)
7087 Decls.push_back(D);
7088 }
7089 DynamicClasses.clear();
7090}
7091
7092void
Richard Smith5ea6ef42013-01-10 23:43:47 +00007093ASTReader::ReadLocallyScopedExternCDecls(SmallVectorImpl<NamedDecl *> &Decls) {
7094 for (unsigned I = 0, N = LocallyScopedExternCDecls.size(); I != N; ++I) {
7095 NamedDecl *D
7096 = dyn_cast_or_null<NamedDecl>(GetDecl(LocallyScopedExternCDecls[I]));
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007097 if (D)
7098 Decls.push_back(D);
7099 }
Richard Smith5ea6ef42013-01-10 23:43:47 +00007100 LocallyScopedExternCDecls.clear();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007101}
7102
7103void ASTReader::ReadReferencedSelectors(
7104 SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) {
7105 if (ReferencedSelectorsData.empty())
7106 return;
7107
7108 // If there are @selector references added them to its pool. This is for
7109 // implementation of -Wselector.
7110 unsigned int DataSize = ReferencedSelectorsData.size()-1;
7111 unsigned I = 0;
7112 while (I < DataSize) {
7113 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]);
7114 SourceLocation SelLoc
7115 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]);
7116 Sels.push_back(std::make_pair(Sel, SelLoc));
7117 }
7118 ReferencedSelectorsData.clear();
7119}
7120
7121void ASTReader::ReadWeakUndeclaredIdentifiers(
7122 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo> > &WeakIDs) {
7123 if (WeakUndeclaredIdentifiers.empty())
7124 return;
7125
7126 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) {
7127 IdentifierInfo *WeakId
7128 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
7129 IdentifierInfo *AliasId
7130 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
7131 SourceLocation Loc
7132 = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]);
7133 bool Used = WeakUndeclaredIdentifiers[I++];
7134 WeakInfo WI(AliasId, Loc);
7135 WI.setUsed(Used);
7136 WeakIDs.push_back(std::make_pair(WeakId, WI));
7137 }
7138 WeakUndeclaredIdentifiers.clear();
7139}
7140
7141void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) {
7142 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) {
7143 ExternalVTableUse VT;
7144 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++]));
7145 VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]);
7146 VT.DefinitionRequired = VTableUses[Idx++];
7147 VTables.push_back(VT);
7148 }
7149
7150 VTableUses.clear();
7151}
7152
7153void ASTReader::ReadPendingInstantiations(
7154 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation> > &Pending) {
7155 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
7156 ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++]));
7157 SourceLocation Loc
7158 = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]);
7159
7160 Pending.push_back(std::make_pair(D, Loc));
7161 }
7162 PendingInstantiations.clear();
7163}
7164
Richard Smithac32d902013-08-07 21:41:30 +00007165void ASTReader::ReadLateParsedTemplates(
7166 llvm::DenseMap<const FunctionDecl *, LateParsedTemplate *> &LPTMap) {
7167 for (unsigned Idx = 0, N = LateParsedTemplates.size(); Idx < N;
7168 /* In loop */) {
7169 FunctionDecl *FD = cast<FunctionDecl>(GetDecl(LateParsedTemplates[Idx++]));
7170
7171 LateParsedTemplate *LT = new LateParsedTemplate;
7172 LT->D = GetDecl(LateParsedTemplates[Idx++]);
7173
7174 ModuleFile *F = getOwningModuleFile(LT->D);
7175 assert(F && "No module");
7176
7177 unsigned TokN = LateParsedTemplates[Idx++];
7178 LT->Toks.reserve(TokN);
7179 for (unsigned T = 0; T < TokN; ++T)
7180 LT->Toks.push_back(ReadToken(*F, LateParsedTemplates, Idx));
7181
7182 LPTMap[FD] = LT;
7183 }
7184
7185 LateParsedTemplates.clear();
7186}
7187
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007188void ASTReader::LoadSelector(Selector Sel) {
7189 // It would be complicated to avoid reading the methods anyway. So don't.
7190 ReadMethodPool(Sel);
7191}
7192
7193void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) {
7194 assert(ID && "Non-zero identifier ID required");
7195 assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range");
7196 IdentifiersLoaded[ID - 1] = II;
7197 if (DeserializationListener)
7198 DeserializationListener->IdentifierRead(ID, II);
7199}
7200
7201/// \brief Set the globally-visible declarations associated with the given
7202/// identifier.
7203///
7204/// If the AST reader is currently in a state where the given declaration IDs
7205/// cannot safely be resolved, they are queued until it is safe to resolve
7206/// them.
7207///
7208/// \param II an IdentifierInfo that refers to one or more globally-visible
7209/// declarations.
7210///
7211/// \param DeclIDs the set of declaration IDs with the name @p II that are
7212/// visible at global scope.
7213///
Douglas Gregoraa945902013-02-18 15:53:43 +00007214/// \param Decls if non-null, this vector will be populated with the set of
7215/// deserialized declarations. These declarations will not be pushed into
7216/// scope.
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007217void
7218ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II,
7219 const SmallVectorImpl<uint32_t> &DeclIDs,
Douglas Gregoraa945902013-02-18 15:53:43 +00007220 SmallVectorImpl<Decl *> *Decls) {
7221 if (NumCurrentElementsDeserializing && !Decls) {
7222 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007223 return;
7224 }
7225
7226 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
7227 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I]));
7228 if (SemaObj) {
Douglas Gregoraa945902013-02-18 15:53:43 +00007229 // If we're simply supposed to record the declarations, do so now.
7230 if (Decls) {
7231 Decls->push_back(D);
7232 continue;
7233 }
7234
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007235 // Introduce this declaration into the translation-unit scope
7236 // and add it to the declaration chain for this identifier, so
7237 // that (unqualified) name lookup will find it.
Argyrios Kyrtzidis0532df02013-04-26 21:33:35 +00007238 pushExternalDeclIntoScope(D, II);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007239 } else {
7240 // Queue this declaration so that it will be added to the
7241 // translation unit scope and identifier's declaration chain
7242 // once a Sema object is known.
7243 PreloadedDecls.push_back(D);
7244 }
7245 }
7246}
7247
Douglas Gregor8222b892013-01-21 16:52:34 +00007248IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007249 if (ID == 0)
Stephen Hines6bcf27b2014-05-29 04:14:42 -07007250 return nullptr;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007251
7252 if (IdentifiersLoaded.empty()) {
7253 Error("no identifier table in AST file");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07007254 return nullptr;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007255 }
7256
7257 ID -= 1;
7258 if (!IdentifiersLoaded[ID]) {
7259 GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1);
7260 assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map");
7261 ModuleFile *M = I->second;
7262 unsigned Index = ID - M->BaseIdentifierID;
7263 const char *Str = M->IdentifierTableData + M->IdentifierOffsets[Index];
7264
7265 // All of the strings in the AST file are preceded by a 16-bit length.
7266 // Extract that 16-bit length to avoid having to execute strlen().
7267 // NOTE: 'StrLenPtr' is an 'unsigned char*' so that we load bytes as
7268 // unsigned integers. This is important to avoid integer overflow when
7269 // we cast them to 'unsigned'.
7270 const unsigned char *StrLenPtr = (const unsigned char*) Str - 2;
7271 unsigned StrLen = (((unsigned) StrLenPtr[0])
7272 | (((unsigned) StrLenPtr[1]) << 8)) - 1;
Douglas Gregor8222b892013-01-21 16:52:34 +00007273 IdentifiersLoaded[ID]
7274 = &PP.getIdentifierTable().get(StringRef(Str, StrLen));
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007275 if (DeserializationListener)
7276 DeserializationListener->IdentifierRead(ID + 1, IdentifiersLoaded[ID]);
7277 }
7278
7279 return IdentifiersLoaded[ID];
7280}
7281
Douglas Gregor8222b892013-01-21 16:52:34 +00007282IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) {
7283 return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID));
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007284}
7285
7286IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) {
7287 if (LocalID < NUM_PREDEF_IDENT_IDS)
7288 return LocalID;
7289
7290 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7291 = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS);
7292 assert(I != M.IdentifierRemap.end()
7293 && "Invalid index into identifier index remap");
7294
7295 return LocalID + I->second;
7296}
7297
Argyrios Kyrtzidis9317ab92013-03-22 21:12:57 +00007298MacroInfo *ASTReader::getMacro(MacroID ID) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007299 if (ID == 0)
Stephen Hines6bcf27b2014-05-29 04:14:42 -07007300 return nullptr;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007301
7302 if (MacrosLoaded.empty()) {
7303 Error("no macro table in AST file");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07007304 return nullptr;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007305 }
7306
7307 ID -= NUM_PREDEF_MACRO_IDS;
7308 if (!MacrosLoaded[ID]) {
7309 GlobalMacroMapType::iterator I
7310 = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS);
7311 assert(I != GlobalMacroMap.end() && "Corrupted global macro map");
7312 ModuleFile *M = I->second;
7313 unsigned Index = ID - M->BaseMacroID;
Argyrios Kyrtzidis9317ab92013-03-22 21:12:57 +00007314 MacrosLoaded[ID] = ReadMacroRecord(*M, M->MacroOffsets[Index]);
7315
7316 if (DeserializationListener)
7317 DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS,
7318 MacrosLoaded[ID]);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007319 }
7320
7321 return MacrosLoaded[ID];
7322}
7323
7324MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) {
7325 if (LocalID < NUM_PREDEF_MACRO_IDS)
7326 return LocalID;
7327
7328 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7329 = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS);
7330 assert(I != M.MacroRemap.end() && "Invalid index into macro index remap");
7331
7332 return LocalID + I->second;
7333}
7334
7335serialization::SubmoduleID
7336ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) {
7337 if (LocalID < NUM_PREDEF_SUBMODULE_IDS)
7338 return LocalID;
7339
7340 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7341 = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS);
7342 assert(I != M.SubmoduleRemap.end()
7343 && "Invalid index into submodule index remap");
7344
7345 return LocalID + I->second;
7346}
7347
7348Module *ASTReader::getSubmodule(SubmoduleID GlobalID) {
7349 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) {
7350 assert(GlobalID == 0 && "Unhandled global submodule ID");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07007351 return nullptr;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007352 }
7353
7354 if (GlobalID > SubmodulesLoaded.size()) {
7355 Error("submodule ID out of range in AST file");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07007356 return nullptr;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007357 }
7358
7359 return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS];
7360}
Douglas Gregorca2ab452013-01-12 01:29:50 +00007361
7362Module *ASTReader::getModule(unsigned ID) {
7363 return getSubmodule(ID);
7364}
7365
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007366Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) {
7367 return DecodeSelector(getGlobalSelectorID(M, LocalID));
7368}
7369
7370Selector ASTReader::DecodeSelector(serialization::SelectorID ID) {
7371 if (ID == 0)
7372 return Selector();
7373
7374 if (ID > SelectorsLoaded.size()) {
7375 Error("selector ID out of range in AST file");
7376 return Selector();
7377 }
7378
Stephen Hines6bcf27b2014-05-29 04:14:42 -07007379 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007380 // Load this selector from the selector table.
7381 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID);
7382 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map");
7383 ModuleFile &M = *I->second;
7384 ASTSelectorLookupTrait Trait(*this, M);
7385 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS;
7386 SelectorsLoaded[ID - 1] =
7387 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0);
7388 if (DeserializationListener)
7389 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
7390 }
7391
7392 return SelectorsLoaded[ID - 1];
7393}
7394
7395Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) {
7396 return DecodeSelector(ID);
7397}
7398
7399uint32_t ASTReader::GetNumExternalSelectors() {
7400 // ID 0 (the null selector) is considered an external selector.
7401 return getTotalNumSelectors() + 1;
7402}
7403
7404serialization::SelectorID
7405ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const {
7406 if (LocalID < NUM_PREDEF_SELECTOR_IDS)
7407 return LocalID;
7408
7409 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7410 = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS);
7411 assert(I != M.SelectorRemap.end()
7412 && "Invalid index into selector index remap");
7413
7414 return LocalID + I->second;
7415}
7416
7417DeclarationName
7418ASTReader::ReadDeclarationName(ModuleFile &F,
7419 const RecordData &Record, unsigned &Idx) {
7420 DeclarationName::NameKind Kind = (DeclarationName::NameKind)Record[Idx++];
7421 switch (Kind) {
7422 case DeclarationName::Identifier:
Douglas Gregor8222b892013-01-21 16:52:34 +00007423 return DeclarationName(GetIdentifierInfo(F, Record, Idx));
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007424
7425 case DeclarationName::ObjCZeroArgSelector:
7426 case DeclarationName::ObjCOneArgSelector:
7427 case DeclarationName::ObjCMultiArgSelector:
7428 return DeclarationName(ReadSelector(F, Record, Idx));
7429
7430 case DeclarationName::CXXConstructorName:
7431 return Context.DeclarationNames.getCXXConstructorName(
7432 Context.getCanonicalType(readType(F, Record, Idx)));
7433
7434 case DeclarationName::CXXDestructorName:
7435 return Context.DeclarationNames.getCXXDestructorName(
7436 Context.getCanonicalType(readType(F, Record, Idx)));
7437
7438 case DeclarationName::CXXConversionFunctionName:
7439 return Context.DeclarationNames.getCXXConversionFunctionName(
7440 Context.getCanonicalType(readType(F, Record, Idx)));
7441
7442 case DeclarationName::CXXOperatorName:
7443 return Context.DeclarationNames.getCXXOperatorName(
7444 (OverloadedOperatorKind)Record[Idx++]);
7445
7446 case DeclarationName::CXXLiteralOperatorName:
7447 return Context.DeclarationNames.getCXXLiteralOperatorName(
7448 GetIdentifierInfo(F, Record, Idx));
7449
7450 case DeclarationName::CXXUsingDirective:
7451 return DeclarationName::getUsingDirectiveName();
7452 }
7453
7454 llvm_unreachable("Invalid NameKind!");
7455}
7456
7457void ASTReader::ReadDeclarationNameLoc(ModuleFile &F,
7458 DeclarationNameLoc &DNLoc,
7459 DeclarationName Name,
7460 const RecordData &Record, unsigned &Idx) {
7461 switch (Name.getNameKind()) {
7462 case DeclarationName::CXXConstructorName:
7463 case DeclarationName::CXXDestructorName:
7464 case DeclarationName::CXXConversionFunctionName:
7465 DNLoc.NamedType.TInfo = GetTypeSourceInfo(F, Record, Idx);
7466 break;
7467
7468 case DeclarationName::CXXOperatorName:
7469 DNLoc.CXXOperatorName.BeginOpNameLoc
7470 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7471 DNLoc.CXXOperatorName.EndOpNameLoc
7472 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7473 break;
7474
7475 case DeclarationName::CXXLiteralOperatorName:
7476 DNLoc.CXXLiteralOperatorName.OpNameLoc
7477 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7478 break;
7479
7480 case DeclarationName::Identifier:
7481 case DeclarationName::ObjCZeroArgSelector:
7482 case DeclarationName::ObjCOneArgSelector:
7483 case DeclarationName::ObjCMultiArgSelector:
7484 case DeclarationName::CXXUsingDirective:
7485 break;
7486 }
7487}
7488
7489void ASTReader::ReadDeclarationNameInfo(ModuleFile &F,
7490 DeclarationNameInfo &NameInfo,
7491 const RecordData &Record, unsigned &Idx) {
7492 NameInfo.setName(ReadDeclarationName(F, Record, Idx));
7493 NameInfo.setLoc(ReadSourceLocation(F, Record, Idx));
7494 DeclarationNameLoc DNLoc;
7495 ReadDeclarationNameLoc(F, DNLoc, NameInfo.getName(), Record, Idx);
7496 NameInfo.setInfo(DNLoc);
7497}
7498
7499void ASTReader::ReadQualifierInfo(ModuleFile &F, QualifierInfo &Info,
7500 const RecordData &Record, unsigned &Idx) {
7501 Info.QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx);
7502 unsigned NumTPLists = Record[Idx++];
7503 Info.NumTemplParamLists = NumTPLists;
7504 if (NumTPLists) {
7505 Info.TemplParamLists = new (Context) TemplateParameterList*[NumTPLists];
7506 for (unsigned i=0; i != NumTPLists; ++i)
7507 Info.TemplParamLists[i] = ReadTemplateParameterList(F, Record, Idx);
7508 }
7509}
7510
7511TemplateName
7512ASTReader::ReadTemplateName(ModuleFile &F, const RecordData &Record,
7513 unsigned &Idx) {
7514 TemplateName::NameKind Kind = (TemplateName::NameKind)Record[Idx++];
7515 switch (Kind) {
7516 case TemplateName::Template:
7517 return TemplateName(ReadDeclAs<TemplateDecl>(F, Record, Idx));
7518
7519 case TemplateName::OverloadedTemplate: {
7520 unsigned size = Record[Idx++];
7521 UnresolvedSet<8> Decls;
7522 while (size--)
7523 Decls.addDecl(ReadDeclAs<NamedDecl>(F, Record, Idx));
7524
7525 return Context.getOverloadedTemplateName(Decls.begin(), Decls.end());
7526 }
7527
7528 case TemplateName::QualifiedTemplate: {
7529 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
7530 bool hasTemplKeyword = Record[Idx++];
7531 TemplateDecl *Template = ReadDeclAs<TemplateDecl>(F, Record, Idx);
7532 return Context.getQualifiedTemplateName(NNS, hasTemplKeyword, Template);
7533 }
7534
7535 case TemplateName::DependentTemplate: {
7536 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
7537 if (Record[Idx++]) // isIdentifier
7538 return Context.getDependentTemplateName(NNS,
7539 GetIdentifierInfo(F, Record,
7540 Idx));
7541 return Context.getDependentTemplateName(NNS,
7542 (OverloadedOperatorKind)Record[Idx++]);
7543 }
7544
7545 case TemplateName::SubstTemplateTemplateParm: {
7546 TemplateTemplateParmDecl *param
7547 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
7548 if (!param) return TemplateName();
7549 TemplateName replacement = ReadTemplateName(F, Record, Idx);
7550 return Context.getSubstTemplateTemplateParm(param, replacement);
7551 }
7552
7553 case TemplateName::SubstTemplateTemplateParmPack: {
7554 TemplateTemplateParmDecl *Param
7555 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
7556 if (!Param)
7557 return TemplateName();
7558
7559 TemplateArgument ArgPack = ReadTemplateArgument(F, Record, Idx);
7560 if (ArgPack.getKind() != TemplateArgument::Pack)
7561 return TemplateName();
7562
7563 return Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
7564 }
7565 }
7566
7567 llvm_unreachable("Unhandled template name kind!");
7568}
7569
7570TemplateArgument
7571ASTReader::ReadTemplateArgument(ModuleFile &F,
7572 const RecordData &Record, unsigned &Idx) {
7573 TemplateArgument::ArgKind Kind = (TemplateArgument::ArgKind)Record[Idx++];
7574 switch (Kind) {
7575 case TemplateArgument::Null:
7576 return TemplateArgument();
7577 case TemplateArgument::Type:
7578 return TemplateArgument(readType(F, Record, Idx));
7579 case TemplateArgument::Declaration: {
7580 ValueDecl *D = ReadDeclAs<ValueDecl>(F, Record, Idx);
7581 bool ForReferenceParam = Record[Idx++];
7582 return TemplateArgument(D, ForReferenceParam);
7583 }
7584 case TemplateArgument::NullPtr:
7585 return TemplateArgument(readType(F, Record, Idx), /*isNullPtr*/true);
7586 case TemplateArgument::Integral: {
7587 llvm::APSInt Value = ReadAPSInt(Record, Idx);
7588 QualType T = readType(F, Record, Idx);
7589 return TemplateArgument(Context, Value, T);
7590 }
7591 case TemplateArgument::Template:
7592 return TemplateArgument(ReadTemplateName(F, Record, Idx));
7593 case TemplateArgument::TemplateExpansion: {
7594 TemplateName Name = ReadTemplateName(F, Record, Idx);
David Blaikiedc84cd52013-02-20 22:23:23 +00007595 Optional<unsigned> NumTemplateExpansions;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007596 if (unsigned NumExpansions = Record[Idx++])
7597 NumTemplateExpansions = NumExpansions - 1;
7598 return TemplateArgument(Name, NumTemplateExpansions);
7599 }
7600 case TemplateArgument::Expression:
7601 return TemplateArgument(ReadExpr(F));
7602 case TemplateArgument::Pack: {
7603 unsigned NumArgs = Record[Idx++];
7604 TemplateArgument *Args = new (Context) TemplateArgument[NumArgs];
7605 for (unsigned I = 0; I != NumArgs; ++I)
7606 Args[I] = ReadTemplateArgument(F, Record, Idx);
7607 return TemplateArgument(Args, NumArgs);
7608 }
7609 }
7610
7611 llvm_unreachable("Unhandled template argument kind!");
7612}
7613
7614TemplateParameterList *
7615ASTReader::ReadTemplateParameterList(ModuleFile &F,
7616 const RecordData &Record, unsigned &Idx) {
7617 SourceLocation TemplateLoc = ReadSourceLocation(F, Record, Idx);
7618 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Idx);
7619 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Idx);
7620
7621 unsigned NumParams = Record[Idx++];
7622 SmallVector<NamedDecl *, 16> Params;
7623 Params.reserve(NumParams);
7624 while (NumParams--)
7625 Params.push_back(ReadDeclAs<NamedDecl>(F, Record, Idx));
7626
7627 TemplateParameterList* TemplateParams =
7628 TemplateParameterList::Create(Context, TemplateLoc, LAngleLoc,
7629 Params.data(), Params.size(), RAngleLoc);
7630 return TemplateParams;
7631}
7632
7633void
7634ASTReader::
Craig Topper6b9240e2013-07-05 19:34:19 +00007635ReadTemplateArgumentList(SmallVectorImpl<TemplateArgument> &TemplArgs,
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007636 ModuleFile &F, const RecordData &Record,
7637 unsigned &Idx) {
7638 unsigned NumTemplateArgs = Record[Idx++];
7639 TemplArgs.reserve(NumTemplateArgs);
7640 while (NumTemplateArgs--)
7641 TemplArgs.push_back(ReadTemplateArgument(F, Record, Idx));
7642}
7643
7644/// \brief Read a UnresolvedSet structure.
Richard Smithc2d77572013-08-30 04:46:40 +00007645void ASTReader::ReadUnresolvedSet(ModuleFile &F, LazyASTUnresolvedSet &Set,
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007646 const RecordData &Record, unsigned &Idx) {
7647 unsigned NumDecls = Record[Idx++];
7648 Set.reserve(Context, NumDecls);
7649 while (NumDecls--) {
Richard Smithc2d77572013-08-30 04:46:40 +00007650 DeclID ID = ReadDeclID(F, Record, Idx);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007651 AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
Richard Smithc2d77572013-08-30 04:46:40 +00007652 Set.addLazyDecl(Context, ID, AS);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007653 }
7654}
7655
7656CXXBaseSpecifier
7657ASTReader::ReadCXXBaseSpecifier(ModuleFile &F,
7658 const RecordData &Record, unsigned &Idx) {
7659 bool isVirtual = static_cast<bool>(Record[Idx++]);
7660 bool isBaseOfClass = static_cast<bool>(Record[Idx++]);
7661 AccessSpecifier AS = static_cast<AccessSpecifier>(Record[Idx++]);
7662 bool inheritConstructors = static_cast<bool>(Record[Idx++]);
7663 TypeSourceInfo *TInfo = GetTypeSourceInfo(F, Record, Idx);
7664 SourceRange Range = ReadSourceRange(F, Record, Idx);
7665 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Idx);
7666 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo,
7667 EllipsisLoc);
7668 Result.setInheritConstructors(inheritConstructors);
7669 return Result;
7670}
7671
7672std::pair<CXXCtorInitializer **, unsigned>
7673ASTReader::ReadCXXCtorInitializers(ModuleFile &F, const RecordData &Record,
7674 unsigned &Idx) {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07007675 CXXCtorInitializer **CtorInitializers = nullptr;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007676 unsigned NumInitializers = Record[Idx++];
7677 if (NumInitializers) {
7678 CtorInitializers
7679 = new (Context) CXXCtorInitializer*[NumInitializers];
7680 for (unsigned i=0; i != NumInitializers; ++i) {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07007681 TypeSourceInfo *TInfo = nullptr;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007682 bool IsBaseVirtual = false;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07007683 FieldDecl *Member = nullptr;
7684 IndirectFieldDecl *IndirectMember = nullptr;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007685
7686 CtorInitializerType Type = (CtorInitializerType)Record[Idx++];
7687 switch (Type) {
7688 case CTOR_INITIALIZER_BASE:
7689 TInfo = GetTypeSourceInfo(F, Record, Idx);
7690 IsBaseVirtual = Record[Idx++];
7691 break;
7692
7693 case CTOR_INITIALIZER_DELEGATING:
7694 TInfo = GetTypeSourceInfo(F, Record, Idx);
7695 break;
7696
7697 case CTOR_INITIALIZER_MEMBER:
7698 Member = ReadDeclAs<FieldDecl>(F, Record, Idx);
7699 break;
7700
7701 case CTOR_INITIALIZER_INDIRECT_MEMBER:
7702 IndirectMember = ReadDeclAs<IndirectFieldDecl>(F, Record, Idx);
7703 break;
7704 }
7705
7706 SourceLocation MemberOrEllipsisLoc = ReadSourceLocation(F, Record, Idx);
7707 Expr *Init = ReadExpr(F);
7708 SourceLocation LParenLoc = ReadSourceLocation(F, Record, Idx);
7709 SourceLocation RParenLoc = ReadSourceLocation(F, Record, Idx);
7710 bool IsWritten = Record[Idx++];
7711 unsigned SourceOrderOrNumArrayIndices;
7712 SmallVector<VarDecl *, 8> Indices;
7713 if (IsWritten) {
7714 SourceOrderOrNumArrayIndices = Record[Idx++];
7715 } else {
7716 SourceOrderOrNumArrayIndices = Record[Idx++];
7717 Indices.reserve(SourceOrderOrNumArrayIndices);
7718 for (unsigned i=0; i != SourceOrderOrNumArrayIndices; ++i)
7719 Indices.push_back(ReadDeclAs<VarDecl>(F, Record, Idx));
7720 }
7721
7722 CXXCtorInitializer *BOMInit;
7723 if (Type == CTOR_INITIALIZER_BASE) {
7724 BOMInit = new (Context) CXXCtorInitializer(Context, TInfo, IsBaseVirtual,
7725 LParenLoc, Init, RParenLoc,
7726 MemberOrEllipsisLoc);
7727 } else if (Type == CTOR_INITIALIZER_DELEGATING) {
7728 BOMInit = new (Context) CXXCtorInitializer(Context, TInfo, LParenLoc,
7729 Init, RParenLoc);
7730 } else if (IsWritten) {
7731 if (Member)
7732 BOMInit = new (Context) CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc,
7733 LParenLoc, Init, RParenLoc);
7734 else
7735 BOMInit = new (Context) CXXCtorInitializer(Context, IndirectMember,
7736 MemberOrEllipsisLoc, LParenLoc,
7737 Init, RParenLoc);
7738 } else {
Argyrios Kyrtzidisf8f480f2013-05-30 23:59:46 +00007739 if (IndirectMember) {
7740 assert(Indices.empty() && "Indirect field improperly initialized");
7741 BOMInit = new (Context) CXXCtorInitializer(Context, IndirectMember,
7742 MemberOrEllipsisLoc, LParenLoc,
7743 Init, RParenLoc);
7744 } else {
7745 BOMInit = CXXCtorInitializer::Create(Context, Member, MemberOrEllipsisLoc,
7746 LParenLoc, Init, RParenLoc,
7747 Indices.data(), Indices.size());
7748 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007749 }
7750
7751 if (IsWritten)
7752 BOMInit->setSourceOrder(SourceOrderOrNumArrayIndices);
7753 CtorInitializers[i] = BOMInit;
7754 }
7755 }
7756
7757 return std::make_pair(CtorInitializers, NumInitializers);
7758}
7759
7760NestedNameSpecifier *
7761ASTReader::ReadNestedNameSpecifier(ModuleFile &F,
7762 const RecordData &Record, unsigned &Idx) {
7763 unsigned N = Record[Idx++];
Stephen Hines6bcf27b2014-05-29 04:14:42 -07007764 NestedNameSpecifier *NNS = nullptr, *Prev = nullptr;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007765 for (unsigned I = 0; I != N; ++I) {
7766 NestedNameSpecifier::SpecifierKind Kind
7767 = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
7768 switch (Kind) {
7769 case NestedNameSpecifier::Identifier: {
7770 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
7771 NNS = NestedNameSpecifier::Create(Context, Prev, II);
7772 break;
7773 }
7774
7775 case NestedNameSpecifier::Namespace: {
7776 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
7777 NNS = NestedNameSpecifier::Create(Context, Prev, NS);
7778 break;
7779 }
7780
7781 case NestedNameSpecifier::NamespaceAlias: {
7782 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
7783 NNS = NestedNameSpecifier::Create(Context, Prev, Alias);
7784 break;
7785 }
7786
7787 case NestedNameSpecifier::TypeSpec:
7788 case NestedNameSpecifier::TypeSpecWithTemplate: {
7789 const Type *T = readType(F, Record, Idx).getTypePtrOrNull();
7790 if (!T)
Stephen Hines6bcf27b2014-05-29 04:14:42 -07007791 return nullptr;
7792
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007793 bool Template = Record[Idx++];
7794 NNS = NestedNameSpecifier::Create(Context, Prev, Template, T);
7795 break;
7796 }
7797
7798 case NestedNameSpecifier::Global: {
7799 NNS = NestedNameSpecifier::GlobalSpecifier(Context);
7800 // No associated value, and there can't be a prefix.
7801 break;
7802 }
7803 }
7804 Prev = NNS;
7805 }
7806 return NNS;
7807}
7808
7809NestedNameSpecifierLoc
7810ASTReader::ReadNestedNameSpecifierLoc(ModuleFile &F, const RecordData &Record,
7811 unsigned &Idx) {
7812 unsigned N = Record[Idx++];
7813 NestedNameSpecifierLocBuilder Builder;
7814 for (unsigned I = 0; I != N; ++I) {
7815 NestedNameSpecifier::SpecifierKind Kind
7816 = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
7817 switch (Kind) {
7818 case NestedNameSpecifier::Identifier: {
7819 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
7820 SourceRange Range = ReadSourceRange(F, Record, Idx);
7821 Builder.Extend(Context, II, Range.getBegin(), Range.getEnd());
7822 break;
7823 }
7824
7825 case NestedNameSpecifier::Namespace: {
7826 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
7827 SourceRange Range = ReadSourceRange(F, Record, Idx);
7828 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
7829 break;
7830 }
7831
7832 case NestedNameSpecifier::NamespaceAlias: {
7833 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
7834 SourceRange Range = ReadSourceRange(F, Record, Idx);
7835 Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd());
7836 break;
7837 }
7838
7839 case NestedNameSpecifier::TypeSpec:
7840 case NestedNameSpecifier::TypeSpecWithTemplate: {
7841 bool Template = Record[Idx++];
7842 TypeSourceInfo *T = GetTypeSourceInfo(F, Record, Idx);
7843 if (!T)
7844 return NestedNameSpecifierLoc();
7845 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
7846
7847 // FIXME: 'template' keyword location not saved anywhere, so we fake it.
7848 Builder.Extend(Context,
7849 Template? T->getTypeLoc().getBeginLoc() : SourceLocation(),
7850 T->getTypeLoc(), ColonColonLoc);
7851 break;
7852 }
7853
7854 case NestedNameSpecifier::Global: {
7855 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
7856 Builder.MakeGlobal(Context, ColonColonLoc);
7857 break;
7858 }
7859 }
7860 }
7861
7862 return Builder.getWithLocInContext(Context);
7863}
7864
7865SourceRange
7866ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record,
7867 unsigned &Idx) {
7868 SourceLocation beg = ReadSourceLocation(F, Record, Idx);
7869 SourceLocation end = ReadSourceLocation(F, Record, Idx);
7870 return SourceRange(beg, end);
7871}
7872
7873/// \brief Read an integral value
7874llvm::APInt ASTReader::ReadAPInt(const RecordData &Record, unsigned &Idx) {
7875 unsigned BitWidth = Record[Idx++];
7876 unsigned NumWords = llvm::APInt::getNumWords(BitWidth);
7877 llvm::APInt Result(BitWidth, NumWords, &Record[Idx]);
7878 Idx += NumWords;
7879 return Result;
7880}
7881
7882/// \brief Read a signed integral value
7883llvm::APSInt ASTReader::ReadAPSInt(const RecordData &Record, unsigned &Idx) {
7884 bool isUnsigned = Record[Idx++];
7885 return llvm::APSInt(ReadAPInt(Record, Idx), isUnsigned);
7886}
7887
7888/// \brief Read a floating-point value
Tim Northover9ec55f22013-01-22 09:46:51 +00007889llvm::APFloat ASTReader::ReadAPFloat(const RecordData &Record,
7890 const llvm::fltSemantics &Sem,
7891 unsigned &Idx) {
7892 return llvm::APFloat(Sem, ReadAPInt(Record, Idx));
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007893}
7894
7895// \brief Read a string
7896std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) {
7897 unsigned Len = Record[Idx++];
7898 std::string Result(Record.data() + Idx, Record.data() + Idx + Len);
7899 Idx += Len;
7900 return Result;
7901}
7902
7903VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record,
7904 unsigned &Idx) {
7905 unsigned Major = Record[Idx++];
7906 unsigned Minor = Record[Idx++];
7907 unsigned Subminor = Record[Idx++];
7908 if (Minor == 0)
7909 return VersionTuple(Major);
7910 if (Subminor == 0)
7911 return VersionTuple(Major, Minor - 1);
7912 return VersionTuple(Major, Minor - 1, Subminor - 1);
7913}
7914
7915CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F,
7916 const RecordData &Record,
7917 unsigned &Idx) {
7918 CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx);
7919 return CXXTemporary::Create(Context, Decl);
7920}
7921
7922DiagnosticBuilder ASTReader::Diag(unsigned DiagID) {
Argyrios Kyrtzidis3b7deda2013-05-24 05:44:08 +00007923 return Diag(CurrentImportLoc, DiagID);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007924}
7925
7926DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) {
7927 return Diags.Report(Loc, DiagID);
7928}
7929
7930/// \brief Retrieve the identifier table associated with the
7931/// preprocessor.
7932IdentifierTable &ASTReader::getIdentifierTable() {
7933 return PP.getIdentifierTable();
7934}
7935
7936/// \brief Record that the given ID maps to the given switch-case
7937/// statement.
7938void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07007939 assert((*CurrSwitchCaseStmts)[ID] == nullptr &&
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007940 "Already have a SwitchCase with this ID");
7941 (*CurrSwitchCaseStmts)[ID] = SC;
7942}
7943
7944/// \brief Retrieve the switch-case statement with the given ID.
7945SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07007946 assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID");
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007947 return (*CurrSwitchCaseStmts)[ID];
7948}
7949
7950void ASTReader::ClearSwitchCaseIDs() {
7951 CurrSwitchCaseStmts->clear();
7952}
7953
7954void ASTReader::ReadComments() {
7955 std::vector<RawComment *> Comments;
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00007956 for (SmallVectorImpl<std::pair<BitstreamCursor,
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007957 serialization::ModuleFile *> >::iterator
7958 I = CommentsCursors.begin(),
7959 E = CommentsCursors.end();
7960 I != E; ++I) {
Stephen Hines651f13c2014-04-23 16:59:28 -07007961 Comments.clear();
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00007962 BitstreamCursor &Cursor = I->first;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007963 serialization::ModuleFile &F = *I->second;
7964 SavedStreamPosition SavedPosition(Cursor);
7965
7966 RecordData Record;
7967 while (true) {
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00007968 llvm::BitstreamEntry Entry =
7969 Cursor.advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd);
Stephen Hines651f13c2014-04-23 16:59:28 -07007970
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00007971 switch (Entry.Kind) {
7972 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
7973 case llvm::BitstreamEntry::Error:
7974 Error("malformed block record in AST file");
7975 return;
7976 case llvm::BitstreamEntry::EndBlock:
7977 goto NextCursor;
7978 case llvm::BitstreamEntry::Record:
7979 // The interesting case.
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007980 break;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007981 }
7982
7983 // Read a record.
7984 Record.clear();
Chris Lattnerb3ce3572013-01-20 02:38:54 +00007985 switch ((CommentRecordTypes)Cursor.readRecord(Entry.ID, Record)) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007986 case COMMENTS_RAW_COMMENT: {
7987 unsigned Idx = 0;
7988 SourceRange SR = ReadSourceRange(F, Record, Idx);
7989 RawComment::CommentKind Kind =
7990 (RawComment::CommentKind) Record[Idx++];
7991 bool IsTrailingComment = Record[Idx++];
7992 bool IsAlmostTrailingComment = Record[Idx++];
Dmitri Gribenko6fd7d302013-04-10 15:35:17 +00007993 Comments.push_back(new (Context) RawComment(
7994 SR, Kind, IsTrailingComment, IsAlmostTrailingComment,
7995 Context.getLangOpts().CommentOpts.ParseAllComments));
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007996 break;
7997 }
7998 }
7999 }
Stephen Hines651f13c2014-04-23 16:59:28 -07008000 NextCursor:
8001 Context.Comments.addDeserializedComments(Comments);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00008002 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00008003}
8004
Stephen Hines6bcf27b2014-05-29 04:14:42 -07008005std::string ASTReader::getOwningModuleNameForDiagnostic(const Decl *D) {
8006 // If we know the owning module, use it.
8007 if (Module *M = D->getOwningModule())
8008 return M->getFullModuleName();
8009
8010 // Otherwise, use the name of the top-level module the decl is within.
8011 if (ModuleFile *M = getOwningModuleFile(D))
8012 return M->ModuleName;
8013
8014 // Not from a module.
8015 return "";
8016}
8017
Guy Benyei7f92f2d2012-12-18 14:30:41 +00008018void ASTReader::finishPendingActions() {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07008019 while (!PendingIdentifierInfos.empty() ||
8020 !PendingIncompleteDeclChains.empty() || !PendingDeclChains.empty() ||
Richard Smith3c40a282013-10-18 06:05:18 +00008021 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() ||
Stephen Hines6bcf27b2014-05-29 04:14:42 -07008022 !PendingUpdateRecords.empty() || !PendingOdrMergeChecks.empty()) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00008023 // If any identifiers with corresponding top-level declarations have
8024 // been loaded, load those declarations now.
Craig Topperee0a4792013-07-05 04:33:53 +00008025 typedef llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2> >
8026 TopLevelDeclsMap;
8027 TopLevelDeclsMap TopLevelDecls;
8028
Guy Benyei7f92f2d2012-12-18 14:30:41 +00008029 while (!PendingIdentifierInfos.empty()) {
Douglas Gregoraa945902013-02-18 15:53:43 +00008030 IdentifierInfo *II = PendingIdentifierInfos.back().first;
Stephen Hines651f13c2014-04-23 16:59:28 -07008031 SmallVector<uint32_t, 4> DeclIDs =
8032 std::move(PendingIdentifierInfos.back().second);
Douglas Gregorcc9bdcb2013-02-19 18:26:28 +00008033 PendingIdentifierInfos.pop_back();
Douglas Gregoraa945902013-02-18 15:53:43 +00008034
8035 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00008036 }
Stephen Hines651f13c2014-04-23 16:59:28 -07008037
Stephen Hines6bcf27b2014-05-29 04:14:42 -07008038 // For each decl chain that we wanted to complete while deserializing, mark
8039 // it as "still needs to be completed".
8040 for (unsigned I = 0; I != PendingIncompleteDeclChains.size(); ++I) {
8041 markIncompleteDeclChain(PendingIncompleteDeclChains[I]);
8042 }
8043 PendingIncompleteDeclChains.clear();
8044
Guy Benyei7f92f2d2012-12-18 14:30:41 +00008045 // Load pending declaration chains.
8046 for (unsigned I = 0; I != PendingDeclChains.size(); ++I) {
8047 loadPendingDeclChain(PendingDeclChains[I]);
8048 PendingDeclChainsKnown.erase(PendingDeclChains[I]);
8049 }
8050 PendingDeclChains.clear();
8051
Douglas Gregoraa945902013-02-18 15:53:43 +00008052 // Make the most recent of the top-level declarations visible.
Craig Topperee0a4792013-07-05 04:33:53 +00008053 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
8054 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
Douglas Gregoraa945902013-02-18 15:53:43 +00008055 IdentifierInfo *II = TLD->first;
8056 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
Argyrios Kyrtzidis0532df02013-04-26 21:33:35 +00008057 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II);
Douglas Gregoraa945902013-02-18 15:53:43 +00008058 }
8059 }
8060
Guy Benyei7f92f2d2012-12-18 14:30:41 +00008061 // Load any pending macro definitions.
8062 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
Argyrios Kyrtzidis9317ab92013-03-22 21:12:57 +00008063 IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
8064 SmallVector<PendingMacroInfo, 2> GlobalIDs;
8065 GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
8066 // Initialize the macro history from chained-PCHs ahead of module imports.
Stephen Hines651f13c2014-04-23 16:59:28 -07008067 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
Argyrios Kyrtzidisdc1088f2013-01-19 03:14:56 +00008068 ++IDIdx) {
Argyrios Kyrtzidis9317ab92013-03-22 21:12:57 +00008069 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
8070 if (Info.M->Kind != MK_Module)
8071 resolvePendingMacro(II, Info);
8072 }
8073 // Handle module imports.
Stephen Hines651f13c2014-04-23 16:59:28 -07008074 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
Argyrios Kyrtzidis9317ab92013-03-22 21:12:57 +00008075 ++IDIdx) {
8076 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
8077 if (Info.M->Kind == MK_Module)
8078 resolvePendingMacro(II, Info);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00008079 }
8080 }
8081 PendingMacroIDs.clear();
Argyrios Kyrtzidis7640b022013-02-16 00:48:59 +00008082
8083 // Wire up the DeclContexts for Decls that we delayed setting until
8084 // recursive loading is completed.
8085 while (!PendingDeclContextInfos.empty()) {
8086 PendingDeclContextInfo Info = PendingDeclContextInfos.front();
8087 PendingDeclContextInfos.pop_front();
8088 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC));
8089 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC));
8090 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext());
8091 }
Richard Smith3c40a282013-10-18 06:05:18 +00008092
Stephen Hines6bcf27b2014-05-29 04:14:42 -07008093 // Perform any pending declaration updates.
Stephen Hinesc568f1e2014-07-21 00:47:37 -07008094 //
8095 // Don't do this if we have known-incomplete redecl chains: it relies on
8096 // being able to walk redeclaration chains.
8097 while (PendingDeclChains.empty() && !PendingUpdateRecords.empty()) {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07008098 auto Update = PendingUpdateRecords.pop_back_val();
8099 ReadingKindTracker ReadingKind(Read_Decl, *this);
8100 loadDeclUpdateRecords(Update.first, Update.second);
8101 }
8102
8103 // Trigger the import of the full definition of each class that had any
8104 // odr-merging problems, so we can produce better diagnostics for them.
8105 for (auto &Merge : PendingOdrMergeFailures) {
8106 Merge.first->buildLookup();
8107 Merge.first->decls_begin();
8108 Merge.first->bases_begin();
8109 Merge.first->vbases_begin();
8110 for (auto *RD : Merge.second) {
8111 RD->decls_begin();
8112 RD->bases_begin();
8113 RD->vbases_begin();
8114 }
8115 }
8116
Richard Smith3c40a282013-10-18 06:05:18 +00008117 // For each declaration from a merged context, check that the canonical
8118 // definition of that context also contains a declaration of the same
8119 // entity.
8120 while (!PendingOdrMergeChecks.empty()) {
8121 NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
8122
8123 // FIXME: Skip over implicit declarations for now. This matters for things
8124 // like implicitly-declared special member functions. This isn't entirely
8125 // correct; we can end up with multiple unmerged declarations of the same
8126 // implicit entity.
8127 if (D->isImplicit())
8128 continue;
8129
8130 DeclContext *CanonDef = D->getDeclContext();
8131 DeclContext::lookup_result R = CanonDef->lookup(D->getDeclName());
8132
8133 bool Found = false;
8134 const Decl *DCanon = D->getCanonicalDecl();
8135
8136 llvm::SmallVector<const NamedDecl*, 4> Candidates;
8137 for (DeclContext::lookup_iterator I = R.begin(), E = R.end();
8138 !Found && I != E; ++I) {
Stephen Hines651f13c2014-04-23 16:59:28 -07008139 for (auto RI : (*I)->redecls()) {
8140 if (RI->getLexicalDeclContext() == CanonDef) {
Richard Smith3c40a282013-10-18 06:05:18 +00008141 // This declaration is present in the canonical definition. If it's
8142 // in the same redecl chain, it's the one we're looking for.
Stephen Hines651f13c2014-04-23 16:59:28 -07008143 if (RI->getCanonicalDecl() == DCanon)
Richard Smith3c40a282013-10-18 06:05:18 +00008144 Found = true;
8145 else
Stephen Hines651f13c2014-04-23 16:59:28 -07008146 Candidates.push_back(cast<NamedDecl>(RI));
Richard Smith3c40a282013-10-18 06:05:18 +00008147 break;
8148 }
8149 }
8150 }
8151
8152 if (!Found) {
8153 D->setInvalidDecl();
8154
Stephen Hines6bcf27b2014-05-29 04:14:42 -07008155 std::string CanonDefModule =
8156 getOwningModuleNameForDiagnostic(cast<Decl>(CanonDef));
Richard Smith3c40a282013-10-18 06:05:18 +00008157 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl)
Stephen Hines6bcf27b2014-05-29 04:14:42 -07008158 << D << getOwningModuleNameForDiagnostic(D)
8159 << CanonDef << CanonDefModule.empty() << CanonDefModule;
Richard Smith3c40a282013-10-18 06:05:18 +00008160
8161 if (Candidates.empty())
8162 Diag(cast<Decl>(CanonDef)->getLocation(),
8163 diag::note_module_odr_violation_no_possible_decls) << D;
8164 else {
8165 for (unsigned I = 0, N = Candidates.size(); I != N; ++I)
8166 Diag(Candidates[I]->getLocation(),
8167 diag::note_module_odr_violation_possible_decl)
8168 << Candidates[I];
8169 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07008170
8171 DiagnosedOdrMergeFailures.insert(CanonDef);
Richard Smith3c40a282013-10-18 06:05:18 +00008172 }
8173 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00008174 }
8175
8176 // If we deserialized any C++ or Objective-C class definitions, any
8177 // Objective-C protocol definitions, or any redeclarable templates, make sure
8178 // that all redeclarations point to the definitions. Note that this can only
8179 // happen now, after the redeclaration chains have been fully wired.
8180 for (llvm::SmallPtrSet<Decl *, 4>::iterator D = PendingDefinitions.begin(),
8181 DEnd = PendingDefinitions.end();
8182 D != DEnd; ++D) {
8183 if (TagDecl *TD = dyn_cast<TagDecl>(*D)) {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07008184 if (const TagType *TagT = dyn_cast<TagType>(TD->getTypeForDecl())) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00008185 // Make sure that the TagType points at the definition.
8186 const_cast<TagType*>(TagT)->decl = TD;
8187 }
8188
Stephen Hines651f13c2014-04-23 16:59:28 -07008189 if (auto RD = dyn_cast<CXXRecordDecl>(*D)) {
8190 for (auto R : RD->redecls())
8191 cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00008192 }
8193
8194 continue;
8195 }
8196
Stephen Hines651f13c2014-04-23 16:59:28 -07008197 if (auto ID = dyn_cast<ObjCInterfaceDecl>(*D)) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00008198 // Make sure that the ObjCInterfaceType points at the definition.
8199 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl))
8200 ->Decl = ID;
8201
Stephen Hines651f13c2014-04-23 16:59:28 -07008202 for (auto R : ID->redecls())
Guy Benyei7f92f2d2012-12-18 14:30:41 +00008203 R->Data = ID->Data;
8204
8205 continue;
8206 }
8207
Stephen Hines651f13c2014-04-23 16:59:28 -07008208 if (auto PD = dyn_cast<ObjCProtocolDecl>(*D)) {
8209 for (auto R : PD->redecls())
Guy Benyei7f92f2d2012-12-18 14:30:41 +00008210 R->Data = PD->Data;
8211
8212 continue;
8213 }
8214
Stephen Hines651f13c2014-04-23 16:59:28 -07008215 auto RTD = cast<RedeclarableTemplateDecl>(*D)->getCanonicalDecl();
8216 for (auto R : RTD->redecls())
Guy Benyei7f92f2d2012-12-18 14:30:41 +00008217 R->Common = RTD->Common;
8218 }
8219 PendingDefinitions.clear();
8220
8221 // Load the bodies of any functions or methods we've encountered. We do
8222 // this now (delayed) so that we can be sure that the declaration chains
8223 // have been fully wired up.
8224 for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
8225 PBEnd = PendingBodies.end();
8226 PB != PBEnd; ++PB) {
8227 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
8228 // FIXME: Check for =delete/=default?
8229 // FIXME: Complain about ODR violations here?
8230 if (!getContext().getLangOpts().Modules || !FD->hasBody())
8231 FD->setLazyBody(PB->second);
8232 continue;
8233 }
8234
8235 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first);
8236 if (!getContext().getLangOpts().Modules || !MD->hasBody())
8237 MD->setLazyBody(PB->second);
8238 }
8239 PendingBodies.clear();
Stephen Hines6bcf27b2014-05-29 04:14:42 -07008240
8241 // Issue any pending ODR-failure diagnostics.
8242 for (auto &Merge : PendingOdrMergeFailures) {
8243 if (!DiagnosedOdrMergeFailures.insert(Merge.first))
8244 continue;
8245
8246 bool Diagnosed = false;
8247 for (auto *RD : Merge.second) {
8248 // Multiple different declarations got merged together; tell the user
8249 // where they came from.
8250 if (Merge.first != RD) {
8251 // FIXME: Walk the definition, figure out what's different,
8252 // and diagnose that.
8253 if (!Diagnosed) {
8254 std::string Module = getOwningModuleNameForDiagnostic(Merge.first);
8255 Diag(Merge.first->getLocation(),
8256 diag::err_module_odr_violation_different_definitions)
8257 << Merge.first << Module.empty() << Module;
8258 Diagnosed = true;
8259 }
8260
8261 Diag(RD->getLocation(),
8262 diag::note_module_odr_violation_different_definitions)
8263 << getOwningModuleNameForDiagnostic(RD);
8264 }
8265 }
8266
8267 if (!Diagnosed) {
8268 // All definitions are updates to the same declaration. This happens if a
8269 // module instantiates the declaration of a class template specialization
8270 // and two or more other modules instantiate its definition.
8271 //
8272 // FIXME: Indicate which modules had instantiations of this definition.
8273 // FIXME: How can this even happen?
8274 Diag(Merge.first->getLocation(),
8275 diag::err_module_odr_violation_different_instantiations)
8276 << Merge.first;
8277 }
8278 }
8279 PendingOdrMergeFailures.clear();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00008280}
8281
8282void ASTReader::FinishedDeserializing() {
8283 assert(NumCurrentElementsDeserializing &&
8284 "FinishedDeserializing not paired with StartedDeserializing");
8285 if (NumCurrentElementsDeserializing == 1) {
8286 // We decrease NumCurrentElementsDeserializing only after pending actions
8287 // are finished, to avoid recursively re-calling finishPendingActions().
8288 finishPendingActions();
8289 }
8290 --NumCurrentElementsDeserializing;
8291
Stephen Hines651f13c2014-04-23 16:59:28 -07008292 if (NumCurrentElementsDeserializing == 0 && Consumer) {
8293 // We are not in recursive loading, so it's safe to pass the "interesting"
8294 // decls to the consumer.
8295 PassInterestingDeclsToConsumer();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00008296 }
8297}
8298
Argyrios Kyrtzidis0532df02013-04-26 21:33:35 +00008299void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) {
Rafael Espindola87bcee82013-10-19 16:55:03 +00008300 D = D->getMostRecentDecl();
Argyrios Kyrtzidis0532df02013-04-26 21:33:35 +00008301
8302 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
8303 SemaObj->TUScope->AddDecl(D);
8304 } else if (SemaObj->TUScope) {
8305 // Adding the decl to IdResolver may have failed because it was already in
8306 // (even though it was not added in scope). If it is already in, make sure
8307 // it gets in the scope as well.
8308 if (std::find(SemaObj->IdResolver.begin(Name),
8309 SemaObj->IdResolver.end(), D) != SemaObj->IdResolver.end())
8310 SemaObj->TUScope->AddDecl(D);
8311 }
8312}
8313
Stephen Hines6bcf27b2014-05-29 04:14:42 -07008314ASTReader::ASTReader(Preprocessor &PP, ASTContext &Context, StringRef isysroot,
8315 bool DisableValidation, bool AllowASTWithCompilerErrors,
8316 bool AllowConfigurationMismatch, bool ValidateSystemInputs,
Stephen Hines651f13c2014-04-23 16:59:28 -07008317 bool UseGlobalIndex)
Stephen Hines6bcf27b2014-05-29 04:14:42 -07008318 : Listener(new PCHValidator(PP, *this)), DeserializationListener(nullptr),
8319 OwnsDeserializationListener(false), SourceMgr(PP.getSourceManager()),
8320 FileMgr(PP.getFileManager()), Diags(PP.getDiagnostics()),
8321 SemaObj(nullptr), PP(PP), Context(Context), Consumer(nullptr),
8322 ModuleMgr(PP.getFileManager()), isysroot(isysroot),
8323 DisableValidation(DisableValidation),
8324 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
8325 AllowConfigurationMismatch(AllowConfigurationMismatch),
8326 ValidateSystemInputs(ValidateSystemInputs),
8327 UseGlobalIndex(UseGlobalIndex), TriedLoadingGlobalIndex(false),
8328 CurrSwitchCaseStmts(&SwitchCaseStmts),
8329 NumSLocEntriesRead(0), TotalNumSLocEntries(0), NumStatementsRead(0),
8330 TotalNumStatements(0), NumMacrosRead(0), TotalNumMacros(0),
8331 NumIdentifierLookups(0), NumIdentifierLookupHits(0), NumSelectorsRead(0),
8332 NumMethodPoolEntriesRead(0), NumMethodPoolLookups(0),
8333 NumMethodPoolHits(0), NumMethodPoolTableLookups(0),
8334 NumMethodPoolTableHits(0), TotalNumMethodPoolEntries(0),
8335 NumLexicalDeclContextsRead(0), TotalLexicalDeclContexts(0),
8336 NumVisibleDeclContextsRead(0), TotalVisibleDeclContexts(0),
8337 TotalModulesSizeInBits(0), NumCurrentElementsDeserializing(0),
8338 PassingDeclsToConsumer(false), NumCXXBaseSpecifiersLoaded(0),
8339 ReadingKind(Read_None) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00008340 SourceMgr.setExternalSLocEntrySource(this);
8341}
8342
8343ASTReader::~ASTReader() {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07008344 if (OwnsDeserializationListener)
8345 delete DeserializationListener;
8346
Guy Benyei7f92f2d2012-12-18 14:30:41 +00008347 for (DeclContextVisibleUpdatesPending::iterator
8348 I = PendingVisibleUpdates.begin(),
8349 E = PendingVisibleUpdates.end();
8350 I != E; ++I) {
8351 for (DeclContextVisibleUpdates::iterator J = I->second.begin(),
8352 F = I->second.end();
8353 J != F; ++J)
8354 delete J->first;
8355 }
8356}