blob: d3d1e48ccbb1d374bd3e22e47c909082f58f55c1 [file] [log] [blame]
Nick Lewyckyf0f56162013-01-31 03:23:57 +00001//===--- ASTReader.cpp - AST File Reader ----------------------------------===//
Guy Benyei11169dd2012-12-18 14:30:41 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines the ASTReader class, which reads AST files.
11//
12//===----------------------------------------------------------------------===//
13
14#include "clang/Serialization/ASTReader.h"
15#include "ASTCommon.h"
16#include "ASTReaderInternals.h"
17#include "clang/AST/ASTConsumer.h"
18#include "clang/AST/ASTContext.h"
19#include "clang/AST/DeclTemplate.h"
20#include "clang/AST/Expr.h"
21#include "clang/AST/ExprCXX.h"
22#include "clang/AST/NestedNameSpecifier.h"
23#include "clang/AST/Type.h"
24#include "clang/AST/TypeLocVisitor.h"
Benjamin Kramerf3ca26982014-05-10 16:31:55 +000025#include "clang/Basic/DiagnosticOptions.h"
Guy Benyei11169dd2012-12-18 14:30:41 +000026#include "clang/Basic/FileManager.h"
Guy Benyei11169dd2012-12-18 14:30:41 +000027#include "clang/Basic/SourceManager.h"
28#include "clang/Basic/SourceManagerInternals.h"
29#include "clang/Basic/TargetInfo.h"
30#include "clang/Basic/TargetOptions.h"
31#include "clang/Basic/Version.h"
32#include "clang/Basic/VersionTuple.h"
Ben Langmuirb92de022014-04-29 16:25:26 +000033#include "clang/Frontend/Utils.h"
Guy Benyei11169dd2012-12-18 14:30:41 +000034#include "clang/Lex/HeaderSearch.h"
35#include "clang/Lex/HeaderSearchOptions.h"
36#include "clang/Lex/MacroInfo.h"
37#include "clang/Lex/PreprocessingRecord.h"
38#include "clang/Lex/Preprocessor.h"
39#include "clang/Lex/PreprocessorOptions.h"
40#include "clang/Sema/Scope.h"
41#include "clang/Sema/Sema.h"
42#include "clang/Serialization/ASTDeserializationListener.h"
Douglas Gregore060e572013-01-25 01:03:03 +000043#include "clang/Serialization/GlobalModuleIndex.h"
Guy Benyei11169dd2012-12-18 14:30:41 +000044#include "clang/Serialization/ModuleManager.h"
45#include "clang/Serialization/SerializationDiagnostic.h"
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +000046#include "llvm/ADT/Hashing.h"
Guy Benyei11169dd2012-12-18 14:30:41 +000047#include "llvm/ADT/StringExtras.h"
48#include "llvm/Bitcode/BitstreamReader.h"
49#include "llvm/Support/ErrorHandling.h"
50#include "llvm/Support/FileSystem.h"
51#include "llvm/Support/MemoryBuffer.h"
52#include "llvm/Support/Path.h"
53#include "llvm/Support/SaveAndRestore.h"
Dmitri Gribenkof430da42014-02-12 10:33:14 +000054#include "llvm/Support/raw_ostream.h"
Guy Benyei11169dd2012-12-18 14:30:41 +000055#include <algorithm>
Chris Lattner91f373e2013-01-20 00:57:52 +000056#include <cstdio>
Guy Benyei11169dd2012-12-18 14:30:41 +000057#include <iterator>
Rafael Espindola8a8e5542014-06-12 17:19:42 +000058#include <system_error>
Guy Benyei11169dd2012-12-18 14:30:41 +000059
60using namespace clang;
61using namespace clang::serialization;
62using namespace clang::serialization::reader;
Chris Lattner7fb3bef2013-01-20 00:56:42 +000063using llvm::BitstreamCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +000064
Ben Langmuircb69b572014-03-07 06:40:32 +000065
66//===----------------------------------------------------------------------===//
67// ChainedASTReaderListener implementation
68//===----------------------------------------------------------------------===//
69
70bool
71ChainedASTReaderListener::ReadFullVersionInformation(StringRef FullVersion) {
72 return First->ReadFullVersionInformation(FullVersion) ||
73 Second->ReadFullVersionInformation(FullVersion);
74}
Ben Langmuir4f5212a2014-04-14 22:12:44 +000075void ChainedASTReaderListener::ReadModuleName(StringRef ModuleName) {
76 First->ReadModuleName(ModuleName);
77 Second->ReadModuleName(ModuleName);
78}
79void ChainedASTReaderListener::ReadModuleMapFile(StringRef ModuleMapPath) {
80 First->ReadModuleMapFile(ModuleMapPath);
81 Second->ReadModuleMapFile(ModuleMapPath);
82}
Ben Langmuircb69b572014-03-07 06:40:32 +000083bool 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(
Ben Langmuirb92de022014-04-29 16:25:26 +000095 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) {
Ben Langmuircb69b572014-03-07 06:40:32 +000096 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}
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000131void ChainedASTReaderListener::visitModuleFile(StringRef Filename) {
132 First->visitModuleFile(Filename);
133 Second->visitModuleFile(Filename);
134}
Ben Langmuircb69b572014-03-07 06:40:32 +0000135bool ChainedASTReaderListener::visitInputFile(StringRef Filename,
Argyrios Kyrtzidis68ccbe02014-03-14 02:26:31 +0000136 bool isSystem,
137 bool isOverridden) {
Justin Bognerc65a66d2014-05-22 06:04:59 +0000138 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;
Ben Langmuircb69b572014-03-07 06:40:32 +0000146}
147
Guy Benyei11169dd2012-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 Gribenkoacf2e782013-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 Benyei11169dd2012-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 Benyei11169dd2012-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,
Craig Toppera13603a2014-05-22 05:54:18 +0000284 Complain? &Reader.Diags : nullptr);
Guy Benyei11169dd2012-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,
Craig Toppera13603a2014-05-22 05:54:18 +0000291 Complain? &Reader.Diags : nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +0000292}
293
294namespace {
295 typedef llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/> >
296 MacroDefinitionsMap;
Craig Topper3598eb72013-07-05 04:43:31 +0000297 typedef llvm::DenseMap<DeclarationName, SmallVector<NamedDecl *, 8> >
298 DeclsMap;
Guy Benyei11169dd2012-12-18 14:30:41 +0000299}
300
Ben Langmuirb92de022014-04-29 16:25:26 +0000301static 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
Alp Tokerac4e8e52014-06-22 21:58:33 +0000331static 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;
Ben Langmuirb92de022014-04-29 16:25:26 +0000336}
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(
Alp Tokerf994cef2014-07-05 03:08:06 +0000381 new DiagnosticsEngine(DiagIDs, DiagOpts.get()));
Ben Langmuirb92de022014-04-29 16:25:26 +0000382 // 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 Benyei11169dd2012-12-18 14:30:41 +0000413/// \brief Collect the macro definitions provided by the given preprocessor
414/// options.
Craig Toppera13603a2014-05-22 05:54:18 +0000415static void
416collectMacroDefinitions(const PreprocessorOptions &PPOpts,
417 MacroDefinitionsMap &Macros,
418 SmallVectorImpl<StringRef> *MacroNames = nullptr) {
Guy Benyei11169dd2012-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 Kyrtzidisd3afa0c2013-04-26 21:33:40 +0000459 std::string &SuggestedPredefines,
460 const LangOptions &LangOpts) {
Guy Benyei11169dd2012-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 Kyrtzidisd3afa0c2013-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 Benyei11169dd2012-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 \"";
Manuel Klimek9af34ae2014-08-12 08:25:57 +0000546 SuggestedPredefines += File;
Guy Benyei11169dd2012-12-18 14:30:41 +0000547 SuggestedPredefines += "\"\n";
548 }
549
550 for (unsigned I = 0, N = ExistingPPOpts.MacroIncludes.size(); I != N; ++I) {
551 StringRef File = ExistingPPOpts.MacroIncludes[I];
552 if (std::find(PPOpts.MacroIncludes.begin(), PPOpts.MacroIncludes.end(),
553 File)
554 != PPOpts.MacroIncludes.end())
555 continue;
556
557 SuggestedPredefines += "#__include_macros \"";
Manuel Klimek9af34ae2014-08-12 08:25:57 +0000558 SuggestedPredefines += File;
Guy Benyei11169dd2012-12-18 14:30:41 +0000559 SuggestedPredefines += "\"\n##\n";
560 }
561
562 return false;
563}
564
565bool PCHValidator::ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
566 bool Complain,
567 std::string &SuggestedPredefines) {
568 const PreprocessorOptions &ExistingPPOpts = PP.getPreprocessorOpts();
569
570 return checkPreprocessorOptions(PPOpts, ExistingPPOpts,
Craig Toppera13603a2014-05-22 05:54:18 +0000571 Complain? &Reader.Diags : nullptr,
Guy Benyei11169dd2012-12-18 14:30:41 +0000572 PP.getFileManager(),
Argyrios Kyrtzidisd3afa0c2013-04-26 21:33:40 +0000573 SuggestedPredefines,
574 PP.getLangOpts());
Guy Benyei11169dd2012-12-18 14:30:41 +0000575}
576
Guy Benyei11169dd2012-12-18 14:30:41 +0000577void PCHValidator::ReadCounter(const ModuleFile &M, unsigned Value) {
578 PP.setCounterValue(Value);
579}
580
581//===----------------------------------------------------------------------===//
582// AST reader implementation
583//===----------------------------------------------------------------------===//
584
Nico Weber824285e2014-05-08 04:26:47 +0000585void ASTReader::setDeserializationListener(ASTDeserializationListener *Listener,
586 bool TakeOwnership) {
Guy Benyei11169dd2012-12-18 14:30:41 +0000587 DeserializationListener = Listener;
Nico Weber824285e2014-05-08 04:26:47 +0000588 OwnsDeserializationListener = TakeOwnership;
Guy Benyei11169dd2012-12-18 14:30:41 +0000589}
590
591
592
593unsigned ASTSelectorLookupTrait::ComputeHash(Selector Sel) {
594 return serialization::ComputeHash(Sel);
595}
596
597
598std::pair<unsigned, unsigned>
599ASTSelectorLookupTrait::ReadKeyDataLength(const unsigned char*& d) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000600 using namespace llvm::support;
601 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
602 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
Guy Benyei11169dd2012-12-18 14:30:41 +0000603 return std::make_pair(KeyLen, DataLen);
604}
605
606ASTSelectorLookupTrait::internal_key_type
607ASTSelectorLookupTrait::ReadKey(const unsigned char* d, unsigned) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000608 using namespace llvm::support;
Guy Benyei11169dd2012-12-18 14:30:41 +0000609 SelectorTable &SelTable = Reader.getContext().Selectors;
Justin Bogner57ba0b22014-03-28 22:03:24 +0000610 unsigned N = endian::readNext<uint16_t, little, unaligned>(d);
611 IdentifierInfo *FirstII = Reader.getLocalIdentifier(
612 F, endian::readNext<uint32_t, little, unaligned>(d));
Guy Benyei11169dd2012-12-18 14:30:41 +0000613 if (N == 0)
614 return SelTable.getNullarySelector(FirstII);
615 else if (N == 1)
616 return SelTable.getUnarySelector(FirstII);
617
618 SmallVector<IdentifierInfo *, 16> Args;
619 Args.push_back(FirstII);
620 for (unsigned I = 1; I != N; ++I)
Justin Bogner57ba0b22014-03-28 22:03:24 +0000621 Args.push_back(Reader.getLocalIdentifier(
622 F, endian::readNext<uint32_t, little, unaligned>(d)));
Guy Benyei11169dd2012-12-18 14:30:41 +0000623
624 return SelTable.getSelector(N, Args.data());
625}
626
627ASTSelectorLookupTrait::data_type
628ASTSelectorLookupTrait::ReadData(Selector, const unsigned char* d,
629 unsigned DataLen) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000630 using namespace llvm::support;
Guy Benyei11169dd2012-12-18 14:30:41 +0000631
632 data_type Result;
633
Justin Bogner57ba0b22014-03-28 22:03:24 +0000634 Result.ID = Reader.getGlobalSelectorID(
635 F, endian::readNext<uint32_t, little, unaligned>(d));
636 unsigned NumInstanceMethodsAndBits =
637 endian::readNext<uint16_t, little, unaligned>(d);
638 unsigned NumFactoryMethodsAndBits =
639 endian::readNext<uint16_t, little, unaligned>(d);
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +0000640 Result.InstanceBits = NumInstanceMethodsAndBits & 0x3;
641 Result.FactoryBits = NumFactoryMethodsAndBits & 0x3;
642 unsigned NumInstanceMethods = NumInstanceMethodsAndBits >> 2;
643 unsigned NumFactoryMethods = NumFactoryMethodsAndBits >> 2;
Guy Benyei11169dd2012-12-18 14:30:41 +0000644
645 // Load instance methods
646 for (unsigned I = 0; I != NumInstanceMethods; ++I) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000647 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
648 F, endian::readNext<uint32_t, little, unaligned>(d)))
Guy Benyei11169dd2012-12-18 14:30:41 +0000649 Result.Instance.push_back(Method);
650 }
651
652 // Load factory methods
653 for (unsigned I = 0; I != NumFactoryMethods; ++I) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000654 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
655 F, endian::readNext<uint32_t, little, unaligned>(d)))
Guy Benyei11169dd2012-12-18 14:30:41 +0000656 Result.Factory.push_back(Method);
657 }
658
659 return Result;
660}
661
Douglas Gregorbfd73d72013-01-23 18:53:14 +0000662unsigned ASTIdentifierLookupTraitBase::ComputeHash(const internal_key_type& a) {
663 return llvm::HashString(a);
Guy Benyei11169dd2012-12-18 14:30:41 +0000664}
665
666std::pair<unsigned, unsigned>
Douglas Gregorbfd73d72013-01-23 18:53:14 +0000667ASTIdentifierLookupTraitBase::ReadKeyDataLength(const unsigned char*& d) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000668 using namespace llvm::support;
669 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
670 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
Guy Benyei11169dd2012-12-18 14:30:41 +0000671 return std::make_pair(KeyLen, DataLen);
672}
673
Douglas Gregorbfd73d72013-01-23 18:53:14 +0000674ASTIdentifierLookupTraitBase::internal_key_type
675ASTIdentifierLookupTraitBase::ReadKey(const unsigned char* d, unsigned n) {
Guy Benyei11169dd2012-12-18 14:30:41 +0000676 assert(n >= 2 && d[n-1] == '\0');
Douglas Gregorbfd73d72013-01-23 18:53:14 +0000677 return StringRef((const char*) d, n-1);
Guy Benyei11169dd2012-12-18 14:30:41 +0000678}
679
Douglas Gregordcf25082013-02-11 18:16:18 +0000680/// \brief Whether the given identifier is "interesting".
681static bool isInterestingIdentifier(IdentifierInfo &II) {
682 return II.isPoisoned() ||
683 II.isExtensionToken() ||
684 II.getObjCOrBuiltinID() ||
685 II.hasRevertedTokenIDToIdentifier() ||
686 II.hadMacroDefinition() ||
687 II.getFETokenInfo<void>();
688}
689
Guy Benyei11169dd2012-12-18 14:30:41 +0000690IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k,
691 const unsigned char* d,
692 unsigned DataLen) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000693 using namespace llvm::support;
694 unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d);
Guy Benyei11169dd2012-12-18 14:30:41 +0000695 bool IsInteresting = RawID & 0x01;
696
697 // Wipe out the "is interesting" bit.
698 RawID = RawID >> 1;
699
700 IdentID ID = Reader.getGlobalIdentifierID(F, RawID);
701 if (!IsInteresting) {
702 // For uninteresting identifiers, just build the IdentifierInfo
703 // and associate it with the persistent ID.
704 IdentifierInfo *II = KnownII;
705 if (!II) {
Douglas Gregorbfd73d72013-01-23 18:53:14 +0000706 II = &Reader.getIdentifierTable().getOwn(k);
Guy Benyei11169dd2012-12-18 14:30:41 +0000707 KnownII = II;
708 }
709 Reader.SetIdentifierInfo(ID, II);
Douglas Gregordcf25082013-02-11 18:16:18 +0000710 if (!II->isFromAST()) {
711 bool WasInteresting = isInterestingIdentifier(*II);
712 II->setIsFromAST();
713 if (WasInteresting)
714 II->setChangedSinceDeserialization();
715 }
716 Reader.markIdentifierUpToDate(II);
Guy Benyei11169dd2012-12-18 14:30:41 +0000717 return II;
718 }
719
Justin Bogner57ba0b22014-03-28 22:03:24 +0000720 unsigned ObjCOrBuiltinID = endian::readNext<uint16_t, little, unaligned>(d);
721 unsigned Bits = endian::readNext<uint16_t, little, unaligned>(d);
Guy Benyei11169dd2012-12-18 14:30:41 +0000722 bool CPlusPlusOperatorKeyword = Bits & 0x01;
723 Bits >>= 1;
724 bool HasRevertedTokenIDToIdentifier = Bits & 0x01;
725 Bits >>= 1;
726 bool Poisoned = Bits & 0x01;
727 Bits >>= 1;
728 bool ExtensionToken = Bits & 0x01;
729 Bits >>= 1;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +0000730 bool hasSubmoduleMacros = Bits & 0x01;
731 Bits >>= 1;
Guy Benyei11169dd2012-12-18 14:30:41 +0000732 bool hadMacroDefinition = Bits & 0x01;
733 Bits >>= 1;
734
735 assert(Bits == 0 && "Extra bits in the identifier?");
736 DataLen -= 8;
737
738 // Build the IdentifierInfo itself and link the identifier ID with
739 // the new IdentifierInfo.
740 IdentifierInfo *II = KnownII;
741 if (!II) {
Douglas Gregorbfd73d72013-01-23 18:53:14 +0000742 II = &Reader.getIdentifierTable().getOwn(StringRef(k));
Guy Benyei11169dd2012-12-18 14:30:41 +0000743 KnownII = II;
744 }
745 Reader.markIdentifierUpToDate(II);
Douglas Gregordcf25082013-02-11 18:16:18 +0000746 if (!II->isFromAST()) {
747 bool WasInteresting = isInterestingIdentifier(*II);
748 II->setIsFromAST();
749 if (WasInteresting)
750 II->setChangedSinceDeserialization();
751 }
Guy Benyei11169dd2012-12-18 14:30:41 +0000752
753 // Set or check the various bits in the IdentifierInfo structure.
754 // Token IDs are read-only.
Argyrios Kyrtzidisddee8c92013-02-27 01:13:51 +0000755 if (HasRevertedTokenIDToIdentifier && II->getTokenID() != tok::identifier)
Guy Benyei11169dd2012-12-18 14:30:41 +0000756 II->RevertTokenIDToIdentifier();
757 II->setObjCOrBuiltinID(ObjCOrBuiltinID);
758 assert(II->isExtensionToken() == ExtensionToken &&
759 "Incorrect extension token flag");
760 (void)ExtensionToken;
761 if (Poisoned)
762 II->setIsPoisoned(true);
763 assert(II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword &&
764 "Incorrect C++ operator keyword flag");
765 (void)CPlusPlusOperatorKeyword;
766
767 // If this identifier is a macro, deserialize the macro
768 // definition.
769 if (hadMacroDefinition) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000770 uint32_t MacroDirectivesOffset =
771 endian::readNext<uint32_t, little, unaligned>(d);
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +0000772 DataLen -= 4;
773 SmallVector<uint32_t, 8> LocalMacroIDs;
774 if (hasSubmoduleMacros) {
Richard Smithdaa69e02014-07-25 04:40:03 +0000775 while (true) {
776 uint32_t LocalMacroID =
777 endian::readNext<uint32_t, little, unaligned>(d);
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +0000778 DataLen -= 4;
Richard Smithdaa69e02014-07-25 04:40:03 +0000779 if (LocalMacroID == 0xdeadbeef) break;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +0000780 LocalMacroIDs.push_back(LocalMacroID);
781 }
Argyrios Kyrtzidis719736c2013-01-19 03:14:56 +0000782 }
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +0000783
784 if (F.Kind == MK_Module) {
Richard Smith49f906a2014-03-01 00:08:04 +0000785 // Macro definitions are stored from newest to oldest, so reverse them
786 // before registering them.
787 llvm::SmallVector<unsigned, 8> MacroSizes;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +0000788 for (SmallVectorImpl<uint32_t>::iterator
Richard Smith49f906a2014-03-01 00:08:04 +0000789 I = LocalMacroIDs.begin(), E = LocalMacroIDs.end(); I != E; /**/) {
790 unsigned Size = 1;
791
792 static const uint32_t HasOverridesFlag = 0x80000000U;
793 if (I + 1 != E && (I[1] & HasOverridesFlag))
794 Size += 1 + (I[1] & ~HasOverridesFlag);
795
796 MacroSizes.push_back(Size);
797 I += Size;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +0000798 }
Richard Smith49f906a2014-03-01 00:08:04 +0000799
800 SmallVectorImpl<uint32_t>::iterator I = LocalMacroIDs.end();
801 for (SmallVectorImpl<unsigned>::reverse_iterator SI = MacroSizes.rbegin(),
802 SE = MacroSizes.rend();
803 SI != SE; ++SI) {
804 I -= *SI;
805
806 uint32_t LocalMacroID = *I;
Craig Topper00bbdcf2014-06-28 23:22:23 +0000807 ArrayRef<uint32_t> Overrides;
Richard Smith49f906a2014-03-01 00:08:04 +0000808 if (*SI != 1)
809 Overrides = llvm::makeArrayRef(&I[2], *SI - 2);
810 Reader.addPendingMacroFromModule(II, &F, LocalMacroID, Overrides);
811 }
812 assert(I == LocalMacroIDs.begin());
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +0000813 } else {
814 Reader.addPendingMacroFromPCH(II, &F, MacroDirectivesOffset);
815 }
Guy Benyei11169dd2012-12-18 14:30:41 +0000816 }
817
818 Reader.SetIdentifierInfo(ID, II);
819
820 // Read all of the declarations visible at global scope with this
821 // name.
822 if (DataLen > 0) {
823 SmallVector<uint32_t, 4> DeclIDs;
824 for (; DataLen > 0; DataLen -= 4)
Justin Bogner57ba0b22014-03-28 22:03:24 +0000825 DeclIDs.push_back(Reader.getGlobalDeclID(
826 F, endian::readNext<uint32_t, little, unaligned>(d)));
Guy Benyei11169dd2012-12-18 14:30:41 +0000827 Reader.SetGloballyVisibleDecls(II, DeclIDs);
828 }
829
830 return II;
831}
832
833unsigned
834ASTDeclContextNameLookupTrait::ComputeHash(const DeclNameKey &Key) const {
835 llvm::FoldingSetNodeID ID;
836 ID.AddInteger(Key.Kind);
837
838 switch (Key.Kind) {
839 case DeclarationName::Identifier:
840 case DeclarationName::CXXLiteralOperatorName:
841 ID.AddString(((IdentifierInfo*)Key.Data)->getName());
842 break;
843 case DeclarationName::ObjCZeroArgSelector:
844 case DeclarationName::ObjCOneArgSelector:
845 case DeclarationName::ObjCMultiArgSelector:
846 ID.AddInteger(serialization::ComputeHash(Selector(Key.Data)));
847 break;
848 case DeclarationName::CXXOperatorName:
849 ID.AddInteger((OverloadedOperatorKind)Key.Data);
850 break;
851 case DeclarationName::CXXConstructorName:
852 case DeclarationName::CXXDestructorName:
853 case DeclarationName::CXXConversionFunctionName:
854 case DeclarationName::CXXUsingDirective:
855 break;
856 }
857
858 return ID.ComputeHash();
859}
860
861ASTDeclContextNameLookupTrait::internal_key_type
862ASTDeclContextNameLookupTrait::GetInternalKey(
863 const external_key_type& Name) const {
864 DeclNameKey Key;
865 Key.Kind = Name.getNameKind();
866 switch (Name.getNameKind()) {
867 case DeclarationName::Identifier:
868 Key.Data = (uint64_t)Name.getAsIdentifierInfo();
869 break;
870 case DeclarationName::ObjCZeroArgSelector:
871 case DeclarationName::ObjCOneArgSelector:
872 case DeclarationName::ObjCMultiArgSelector:
873 Key.Data = (uint64_t)Name.getObjCSelector().getAsOpaquePtr();
874 break;
875 case DeclarationName::CXXOperatorName:
876 Key.Data = Name.getCXXOverloadedOperator();
877 break;
878 case DeclarationName::CXXLiteralOperatorName:
879 Key.Data = (uint64_t)Name.getCXXLiteralIdentifier();
880 break;
881 case DeclarationName::CXXConstructorName:
882 case DeclarationName::CXXDestructorName:
883 case DeclarationName::CXXConversionFunctionName:
884 case DeclarationName::CXXUsingDirective:
885 Key.Data = 0;
886 break;
887 }
888
889 return Key;
890}
891
892std::pair<unsigned, unsigned>
893ASTDeclContextNameLookupTrait::ReadKeyDataLength(const unsigned char*& d) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000894 using namespace llvm::support;
895 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
896 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
Guy Benyei11169dd2012-12-18 14:30:41 +0000897 return std::make_pair(KeyLen, DataLen);
898}
899
900ASTDeclContextNameLookupTrait::internal_key_type
901ASTDeclContextNameLookupTrait::ReadKey(const unsigned char* d, unsigned) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000902 using namespace llvm::support;
Guy Benyei11169dd2012-12-18 14:30:41 +0000903
904 DeclNameKey Key;
905 Key.Kind = (DeclarationName::NameKind)*d++;
906 switch (Key.Kind) {
907 case DeclarationName::Identifier:
Justin Bogner57ba0b22014-03-28 22:03:24 +0000908 Key.Data = (uint64_t)Reader.getLocalIdentifier(
909 F, endian::readNext<uint32_t, little, unaligned>(d));
Guy Benyei11169dd2012-12-18 14:30:41 +0000910 break;
911 case DeclarationName::ObjCZeroArgSelector:
912 case DeclarationName::ObjCOneArgSelector:
913 case DeclarationName::ObjCMultiArgSelector:
914 Key.Data =
Justin Bogner57ba0b22014-03-28 22:03:24 +0000915 (uint64_t)Reader.getLocalSelector(
916 F, endian::readNext<uint32_t, little, unaligned>(
917 d)).getAsOpaquePtr();
Guy Benyei11169dd2012-12-18 14:30:41 +0000918 break;
919 case DeclarationName::CXXOperatorName:
920 Key.Data = *d++; // OverloadedOperatorKind
921 break;
922 case DeclarationName::CXXLiteralOperatorName:
Justin Bogner57ba0b22014-03-28 22:03:24 +0000923 Key.Data = (uint64_t)Reader.getLocalIdentifier(
924 F, endian::readNext<uint32_t, little, unaligned>(d));
Guy Benyei11169dd2012-12-18 14:30:41 +0000925 break;
926 case DeclarationName::CXXConstructorName:
927 case DeclarationName::CXXDestructorName:
928 case DeclarationName::CXXConversionFunctionName:
929 case DeclarationName::CXXUsingDirective:
930 Key.Data = 0;
931 break;
932 }
933
934 return Key;
935}
936
937ASTDeclContextNameLookupTrait::data_type
938ASTDeclContextNameLookupTrait::ReadData(internal_key_type,
939 const unsigned char* d,
940 unsigned DataLen) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000941 using namespace llvm::support;
942 unsigned NumDecls = endian::readNext<uint16_t, little, unaligned>(d);
Argyrios Kyrtzidisc57e5032013-01-11 22:29:49 +0000943 LE32DeclID *Start = reinterpret_cast<LE32DeclID *>(
944 const_cast<unsigned char *>(d));
Guy Benyei11169dd2012-12-18 14:30:41 +0000945 return std::make_pair(Start, Start + NumDecls);
946}
947
948bool ASTReader::ReadDeclContextStorage(ModuleFile &M,
Chris Lattner7fb3bef2013-01-20 00:56:42 +0000949 BitstreamCursor &Cursor,
Guy Benyei11169dd2012-12-18 14:30:41 +0000950 const std::pair<uint64_t, uint64_t> &Offsets,
951 DeclContextInfo &Info) {
952 SavedStreamPosition SavedPosition(Cursor);
953 // First the lexical decls.
954 if (Offsets.first != 0) {
955 Cursor.JumpToBit(Offsets.first);
956
957 RecordData Record;
Chris Lattner0e6c9402013-01-20 02:38:54 +0000958 StringRef Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +0000959 unsigned Code = Cursor.ReadCode();
Chris Lattner0e6c9402013-01-20 02:38:54 +0000960 unsigned RecCode = Cursor.readRecord(Code, Record, &Blob);
Guy Benyei11169dd2012-12-18 14:30:41 +0000961 if (RecCode != DECL_CONTEXT_LEXICAL) {
962 Error("Expected lexical block");
963 return true;
964 }
965
Chris Lattner0e6c9402013-01-20 02:38:54 +0000966 Info.LexicalDecls = reinterpret_cast<const KindDeclIDPair*>(Blob.data());
967 Info.NumLexicalDecls = Blob.size() / sizeof(KindDeclIDPair);
Guy Benyei11169dd2012-12-18 14:30:41 +0000968 }
969
970 // Now the lookup table.
971 if (Offsets.second != 0) {
972 Cursor.JumpToBit(Offsets.second);
973
974 RecordData Record;
Chris Lattner0e6c9402013-01-20 02:38:54 +0000975 StringRef Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +0000976 unsigned Code = Cursor.ReadCode();
Chris Lattner0e6c9402013-01-20 02:38:54 +0000977 unsigned RecCode = Cursor.readRecord(Code, Record, &Blob);
Guy Benyei11169dd2012-12-18 14:30:41 +0000978 if (RecCode != DECL_CONTEXT_VISIBLE) {
979 Error("Expected visible lookup table block");
980 return true;
981 }
Justin Bognerda4e6502014-04-14 16:34:29 +0000982 Info.NameLookupTableData = ASTDeclContextNameLookupTable::Create(
983 (const unsigned char *)Blob.data() + Record[0],
984 (const unsigned char *)Blob.data() + sizeof(uint32_t),
985 (const unsigned char *)Blob.data(),
986 ASTDeclContextNameLookupTrait(*this, M));
Guy Benyei11169dd2012-12-18 14:30:41 +0000987 }
988
989 return false;
990}
991
992void ASTReader::Error(StringRef Msg) {
993 Error(diag::err_fe_pch_malformed, Msg);
Douglas Gregor940e8052013-05-10 22:15:13 +0000994 if (Context.getLangOpts().Modules && !Diags.isDiagnosticInFlight()) {
995 Diag(diag::note_module_cache_path)
996 << PP.getHeaderSearchInfo().getModuleCachePath();
997 }
Guy Benyei11169dd2012-12-18 14:30:41 +0000998}
999
1000void ASTReader::Error(unsigned DiagID,
1001 StringRef Arg1, StringRef Arg2) {
1002 if (Diags.isDiagnosticInFlight())
1003 Diags.SetDelayedDiagnostic(DiagID, Arg1, Arg2);
1004 else
1005 Diag(DiagID) << Arg1 << Arg2;
1006}
1007
1008//===----------------------------------------------------------------------===//
1009// Source Manager Deserialization
1010//===----------------------------------------------------------------------===//
1011
1012/// \brief Read the line table in the source manager block.
1013/// \returns true if there was an error.
1014bool ASTReader::ParseLineTable(ModuleFile &F,
1015 SmallVectorImpl<uint64_t> &Record) {
1016 unsigned Idx = 0;
1017 LineTableInfo &LineTable = SourceMgr.getLineTable();
1018
1019 // Parse the file names
1020 std::map<int, int> FileIDs;
1021 for (int I = 0, N = Record[Idx++]; I != N; ++I) {
1022 // Extract the file name
1023 unsigned FilenameLen = Record[Idx++];
1024 std::string Filename(&Record[Idx], &Record[Idx] + FilenameLen);
1025 Idx += FilenameLen;
1026 MaybeAddSystemRootToFilename(F, Filename);
1027 FileIDs[I] = LineTable.getLineTableFilenameID(Filename);
1028 }
1029
1030 // Parse the line entries
1031 std::vector<LineEntry> Entries;
1032 while (Idx < Record.size()) {
1033 int FID = Record[Idx++];
1034 assert(FID >= 0 && "Serialized line entries for non-local file.");
1035 // Remap FileID from 1-based old view.
1036 FID += F.SLocEntryBaseID - 1;
1037
1038 // Extract the line entries
1039 unsigned NumEntries = Record[Idx++];
1040 assert(NumEntries && "Numentries is 00000");
1041 Entries.clear();
1042 Entries.reserve(NumEntries);
1043 for (unsigned I = 0; I != NumEntries; ++I) {
1044 unsigned FileOffset = Record[Idx++];
1045 unsigned LineNo = Record[Idx++];
1046 int FilenameID = FileIDs[Record[Idx++]];
1047 SrcMgr::CharacteristicKind FileKind
1048 = (SrcMgr::CharacteristicKind)Record[Idx++];
1049 unsigned IncludeOffset = Record[Idx++];
1050 Entries.push_back(LineEntry::get(FileOffset, LineNo, FilenameID,
1051 FileKind, IncludeOffset));
1052 }
1053 LineTable.AddEntry(FileID::get(FID), Entries);
1054 }
1055
1056 return false;
1057}
1058
1059/// \brief Read a source manager block
1060bool ASTReader::ReadSourceManagerBlock(ModuleFile &F) {
1061 using namespace SrcMgr;
1062
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001063 BitstreamCursor &SLocEntryCursor = F.SLocEntryCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00001064
1065 // Set the source-location entry cursor to the current position in
1066 // the stream. This cursor will be used to read the contents of the
1067 // source manager block initially, and then lazily read
1068 // source-location entries as needed.
1069 SLocEntryCursor = F.Stream;
1070
1071 // The stream itself is going to skip over the source manager block.
1072 if (F.Stream.SkipBlock()) {
1073 Error("malformed block record in AST file");
1074 return true;
1075 }
1076
1077 // Enter the source manager block.
1078 if (SLocEntryCursor.EnterSubBlock(SOURCE_MANAGER_BLOCK_ID)) {
1079 Error("malformed source manager block record in AST file");
1080 return true;
1081 }
1082
1083 RecordData Record;
1084 while (true) {
Chris Lattnere7b154b2013-01-19 21:39:22 +00001085 llvm::BitstreamEntry E = SLocEntryCursor.advanceSkippingSubblocks();
1086
1087 switch (E.Kind) {
1088 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1089 case llvm::BitstreamEntry::Error:
1090 Error("malformed block record in AST file");
1091 return true;
1092 case llvm::BitstreamEntry::EndBlock:
Guy Benyei11169dd2012-12-18 14:30:41 +00001093 return false;
Chris Lattnere7b154b2013-01-19 21:39:22 +00001094 case llvm::BitstreamEntry::Record:
1095 // The interesting case.
1096 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00001097 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00001098
Guy Benyei11169dd2012-12-18 14:30:41 +00001099 // Read a record.
Guy Benyei11169dd2012-12-18 14:30:41 +00001100 Record.clear();
Chris Lattner15c3e7d2013-01-21 18:28:26 +00001101 StringRef Blob;
1102 switch (SLocEntryCursor.readRecord(E.ID, Record, &Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001103 default: // Default behavior: ignore.
1104 break;
1105
1106 case SM_SLOC_FILE_ENTRY:
1107 case SM_SLOC_BUFFER_ENTRY:
1108 case SM_SLOC_EXPANSION_ENTRY:
1109 // Once we hit one of the source location entries, we're done.
1110 return false;
1111 }
1112 }
1113}
1114
1115/// \brief If a header file is not found at the path that we expect it to be
1116/// and the PCH file was moved from its original location, try to resolve the
1117/// file by assuming that header+PCH were moved together and the header is in
1118/// the same place relative to the PCH.
1119static std::string
1120resolveFileRelativeToOriginalDir(const std::string &Filename,
1121 const std::string &OriginalDir,
1122 const std::string &CurrDir) {
1123 assert(OriginalDir != CurrDir &&
1124 "No point trying to resolve the file if the PCH dir didn't change");
1125 using namespace llvm::sys;
1126 SmallString<128> filePath(Filename);
1127 fs::make_absolute(filePath);
1128 assert(path::is_absolute(OriginalDir));
1129 SmallString<128> currPCHPath(CurrDir);
1130
1131 path::const_iterator fileDirI = path::begin(path::parent_path(filePath)),
1132 fileDirE = path::end(path::parent_path(filePath));
1133 path::const_iterator origDirI = path::begin(OriginalDir),
1134 origDirE = path::end(OriginalDir);
1135 // Skip the common path components from filePath and OriginalDir.
1136 while (fileDirI != fileDirE && origDirI != origDirE &&
1137 *fileDirI == *origDirI) {
1138 ++fileDirI;
1139 ++origDirI;
1140 }
1141 for (; origDirI != origDirE; ++origDirI)
1142 path::append(currPCHPath, "..");
1143 path::append(currPCHPath, fileDirI, fileDirE);
1144 path::append(currPCHPath, path::filename(Filename));
1145 return currPCHPath.str();
1146}
1147
1148bool ASTReader::ReadSLocEntry(int ID) {
1149 if (ID == 0)
1150 return false;
1151
1152 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1153 Error("source location entry ID out-of-range for AST file");
1154 return true;
1155 }
1156
1157 ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second;
1158 F->SLocEntryCursor.JumpToBit(F->SLocEntryOffsets[ID - F->SLocEntryBaseID]);
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001159 BitstreamCursor &SLocEntryCursor = F->SLocEntryCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00001160 unsigned BaseOffset = F->SLocEntryBaseOffset;
1161
1162 ++NumSLocEntriesRead;
Chris Lattnere7b154b2013-01-19 21:39:22 +00001163 llvm::BitstreamEntry Entry = SLocEntryCursor.advance();
1164 if (Entry.Kind != llvm::BitstreamEntry::Record) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001165 Error("incorrectly-formatted source location entry in AST file");
1166 return true;
1167 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00001168
Guy Benyei11169dd2012-12-18 14:30:41 +00001169 RecordData Record;
Chris Lattner0e6c9402013-01-20 02:38:54 +00001170 StringRef Blob;
1171 switch (SLocEntryCursor.readRecord(Entry.ID, Record, &Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001172 default:
1173 Error("incorrectly-formatted source location entry in AST file");
1174 return true;
1175
1176 case SM_SLOC_FILE_ENTRY: {
1177 // We will detect whether a file changed and return 'Failure' for it, but
1178 // we will also try to fail gracefully by setting up the SLocEntry.
1179 unsigned InputID = Record[4];
1180 InputFile IF = getInputFile(*F, InputID);
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00001181 const FileEntry *File = IF.getFile();
1182 bool OverriddenBuffer = IF.isOverridden();
Guy Benyei11169dd2012-12-18 14:30:41 +00001183
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00001184 // Note that we only check if a File was returned. If it was out-of-date
1185 // we have complained but we will continue creating a FileID to recover
1186 // gracefully.
1187 if (!File)
Guy Benyei11169dd2012-12-18 14:30:41 +00001188 return true;
1189
1190 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
1191 if (IncludeLoc.isInvalid() && F->Kind != MK_MainFile) {
1192 // This is the module's main file.
1193 IncludeLoc = getImportLocation(F);
1194 }
1195 SrcMgr::CharacteristicKind
1196 FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
1197 FileID FID = SourceMgr.createFileID(File, IncludeLoc, FileCharacter,
1198 ID, BaseOffset + Record[0]);
1199 SrcMgr::FileInfo &FileInfo =
1200 const_cast<SrcMgr::FileInfo&>(SourceMgr.getSLocEntry(FID).getFile());
1201 FileInfo.NumCreatedFIDs = Record[5];
1202 if (Record[3])
1203 FileInfo.setHasLineDirectives();
1204
1205 const DeclID *FirstDecl = F->FileSortedDecls + Record[6];
1206 unsigned NumFileDecls = Record[7];
1207 if (NumFileDecls) {
1208 assert(F->FileSortedDecls && "FILE_SORTED_DECLS not encountered yet ?");
1209 FileDeclIDs[FID] = FileDeclsInfo(F, llvm::makeArrayRef(FirstDecl,
1210 NumFileDecls));
1211 }
1212
1213 const SrcMgr::ContentCache *ContentCache
1214 = SourceMgr.getOrCreateContentCache(File,
1215 /*isSystemFile=*/FileCharacter != SrcMgr::C_User);
1216 if (OverriddenBuffer && !ContentCache->BufferOverridden &&
1217 ContentCache->ContentsEntry == ContentCache->OrigEntry) {
1218 unsigned Code = SLocEntryCursor.ReadCode();
1219 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00001220 unsigned RecCode = SLocEntryCursor.readRecord(Code, Record, &Blob);
Guy Benyei11169dd2012-12-18 14:30:41 +00001221
1222 if (RecCode != SM_SLOC_BUFFER_BLOB) {
1223 Error("AST record has invalid code");
1224 return true;
1225 }
1226
1227 llvm::MemoryBuffer *Buffer
Chris Lattner0e6c9402013-01-20 02:38:54 +00001228 = llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), File->getName());
Guy Benyei11169dd2012-12-18 14:30:41 +00001229 SourceMgr.overrideFileContents(File, Buffer);
1230 }
1231
1232 break;
1233 }
1234
1235 case SM_SLOC_BUFFER_ENTRY: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00001236 const char *Name = Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00001237 unsigned Offset = Record[0];
1238 SrcMgr::CharacteristicKind
1239 FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
1240 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
1241 if (IncludeLoc.isInvalid() && F->Kind == MK_Module) {
1242 IncludeLoc = getImportLocation(F);
1243 }
1244 unsigned Code = SLocEntryCursor.ReadCode();
1245 Record.clear();
1246 unsigned RecCode
Chris Lattner0e6c9402013-01-20 02:38:54 +00001247 = SLocEntryCursor.readRecord(Code, Record, &Blob);
Guy Benyei11169dd2012-12-18 14:30:41 +00001248
1249 if (RecCode != SM_SLOC_BUFFER_BLOB) {
1250 Error("AST record has invalid code");
1251 return true;
1252 }
1253
1254 llvm::MemoryBuffer *Buffer
Chris Lattner0e6c9402013-01-20 02:38:54 +00001255 = llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name);
Alp Toker6ac2cd02014-05-16 17:23:01 +00001256 SourceMgr.createFileID(Buffer, FileCharacter, ID, BaseOffset + Offset,
1257 IncludeLoc);
Guy Benyei11169dd2012-12-18 14:30:41 +00001258 break;
1259 }
1260
1261 case SM_SLOC_EXPANSION_ENTRY: {
1262 SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1]);
1263 SourceMgr.createExpansionLoc(SpellingLoc,
1264 ReadSourceLocation(*F, Record[2]),
1265 ReadSourceLocation(*F, Record[3]),
1266 Record[4],
1267 ID,
1268 BaseOffset + Record[0]);
1269 break;
1270 }
1271 }
1272
1273 return false;
1274}
1275
1276std::pair<SourceLocation, StringRef> ASTReader::getModuleImportLoc(int ID) {
1277 if (ID == 0)
1278 return std::make_pair(SourceLocation(), "");
1279
1280 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1281 Error("source location entry ID out-of-range for AST file");
1282 return std::make_pair(SourceLocation(), "");
1283 }
1284
1285 // Find which module file this entry lands in.
1286 ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second;
1287 if (M->Kind != MK_Module)
1288 return std::make_pair(SourceLocation(), "");
1289
1290 // FIXME: Can we map this down to a particular submodule? That would be
1291 // ideal.
Ben Langmuirbeee15e2014-04-14 18:00:01 +00001292 return std::make_pair(M->ImportLoc, StringRef(M->ModuleName));
Guy Benyei11169dd2012-12-18 14:30:41 +00001293}
1294
1295/// \brief Find the location where the module F is imported.
1296SourceLocation ASTReader::getImportLocation(ModuleFile *F) {
1297 if (F->ImportLoc.isValid())
1298 return F->ImportLoc;
1299
1300 // Otherwise we have a PCH. It's considered to be "imported" at the first
1301 // location of its includer.
1302 if (F->ImportedBy.empty() || !F->ImportedBy[0]) {
Ben Langmuirbeee15e2014-04-14 18:00:01 +00001303 // Main file is the importer.
1304 assert(!SourceMgr.getMainFileID().isInvalid() && "missing main file");
1305 return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID());
Guy Benyei11169dd2012-12-18 14:30:41 +00001306 }
Guy Benyei11169dd2012-12-18 14:30:41 +00001307 return F->ImportedBy[0]->FirstLoc;
1308}
1309
1310/// ReadBlockAbbrevs - Enter a subblock of the specified BlockID with the
1311/// specified cursor. Read the abbreviations that are at the top of the block
1312/// and then leave the cursor pointing into the block.
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001313bool ASTReader::ReadBlockAbbrevs(BitstreamCursor &Cursor, unsigned BlockID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001314 if (Cursor.EnterSubBlock(BlockID)) {
1315 Error("malformed block record in AST file");
1316 return Failure;
1317 }
1318
1319 while (true) {
1320 uint64_t Offset = Cursor.GetCurrentBitNo();
1321 unsigned Code = Cursor.ReadCode();
1322
1323 // We expect all abbrevs to be at the start of the block.
1324 if (Code != llvm::bitc::DEFINE_ABBREV) {
1325 Cursor.JumpToBit(Offset);
1326 return false;
1327 }
1328 Cursor.ReadAbbrevRecord();
1329 }
1330}
1331
Richard Smithe40f2ba2013-08-07 21:41:30 +00001332Token ASTReader::ReadToken(ModuleFile &F, const RecordDataImpl &Record,
John McCallf413f5e2013-05-03 00:10:13 +00001333 unsigned &Idx) {
1334 Token Tok;
1335 Tok.startToken();
1336 Tok.setLocation(ReadSourceLocation(F, Record, Idx));
1337 Tok.setLength(Record[Idx++]);
1338 if (IdentifierInfo *II = getLocalIdentifier(F, Record[Idx++]))
1339 Tok.setIdentifierInfo(II);
1340 Tok.setKind((tok::TokenKind)Record[Idx++]);
1341 Tok.setFlag((Token::TokenFlags)Record[Idx++]);
1342 return Tok;
1343}
1344
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001345MacroInfo *ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001346 BitstreamCursor &Stream = F.MacroCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00001347
1348 // Keep track of where we are in the stream, then jump back there
1349 // after reading this macro.
1350 SavedStreamPosition SavedPosition(Stream);
1351
1352 Stream.JumpToBit(Offset);
1353 RecordData Record;
1354 SmallVector<IdentifierInfo*, 16> MacroArgs;
Craig Toppera13603a2014-05-22 05:54:18 +00001355 MacroInfo *Macro = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00001356
Guy Benyei11169dd2012-12-18 14:30:41 +00001357 while (true) {
Chris Lattnerefa77172013-01-20 00:00:22 +00001358 // Advance to the next record, but if we get to the end of the block, don't
1359 // pop it (removing all the abbreviations from the cursor) since we want to
1360 // be able to reseek within the block and read entries.
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001361 unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd;
Chris Lattnerefa77172013-01-20 00:00:22 +00001362 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks(Flags);
1363
1364 switch (Entry.Kind) {
1365 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1366 case llvm::BitstreamEntry::Error:
1367 Error("malformed block record in AST file");
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001368 return Macro;
Chris Lattnerefa77172013-01-20 00:00:22 +00001369 case llvm::BitstreamEntry::EndBlock:
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001370 return Macro;
Chris Lattnerefa77172013-01-20 00:00:22 +00001371 case llvm::BitstreamEntry::Record:
1372 // The interesting case.
1373 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00001374 }
1375
1376 // Read a record.
Guy Benyei11169dd2012-12-18 14:30:41 +00001377 Record.clear();
1378 PreprocessorRecordTypes RecType =
Chris Lattner0e6c9402013-01-20 02:38:54 +00001379 (PreprocessorRecordTypes)Stream.readRecord(Entry.ID, Record);
Guy Benyei11169dd2012-12-18 14:30:41 +00001380 switch (RecType) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001381 case PP_MACRO_DIRECTIVE_HISTORY:
1382 return Macro;
1383
Guy Benyei11169dd2012-12-18 14:30:41 +00001384 case PP_MACRO_OBJECT_LIKE:
1385 case PP_MACRO_FUNCTION_LIKE: {
1386 // If we already have a macro, that means that we've hit the end
1387 // of the definition of the macro we were looking for. We're
1388 // done.
1389 if (Macro)
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001390 return Macro;
Guy Benyei11169dd2012-12-18 14:30:41 +00001391
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001392 unsigned NextIndex = 1; // Skip identifier ID.
1393 SubmoduleID SubModID = getGlobalSubmoduleID(F, Record[NextIndex++]);
Guy Benyei11169dd2012-12-18 14:30:41 +00001394 SourceLocation Loc = ReadSourceLocation(F, Record, NextIndex);
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001395 MacroInfo *MI = PP.AllocateDeserializedMacroInfo(Loc, SubModID);
Argyrios Kyrtzidis7572be22013-01-07 19:16:23 +00001396 MI->setDefinitionEndLoc(ReadSourceLocation(F, Record, NextIndex));
Guy Benyei11169dd2012-12-18 14:30:41 +00001397 MI->setIsUsed(Record[NextIndex++]);
Argyrios Kyrtzidis9ef53ce2014-04-09 18:21:23 +00001398 MI->setUsedForHeaderGuard(Record[NextIndex++]);
Guy Benyei11169dd2012-12-18 14:30:41 +00001399
Guy Benyei11169dd2012-12-18 14:30:41 +00001400 if (RecType == PP_MACRO_FUNCTION_LIKE) {
1401 // Decode function-like macro info.
1402 bool isC99VarArgs = Record[NextIndex++];
1403 bool isGNUVarArgs = Record[NextIndex++];
1404 bool hasCommaPasting = Record[NextIndex++];
1405 MacroArgs.clear();
1406 unsigned NumArgs = Record[NextIndex++];
1407 for (unsigned i = 0; i != NumArgs; ++i)
1408 MacroArgs.push_back(getLocalIdentifier(F, Record[NextIndex++]));
1409
1410 // Install function-like macro info.
1411 MI->setIsFunctionLike();
1412 if (isC99VarArgs) MI->setIsC99Varargs();
1413 if (isGNUVarArgs) MI->setIsGNUVarargs();
1414 if (hasCommaPasting) MI->setHasCommaPasting();
1415 MI->setArgumentList(MacroArgs.data(), MacroArgs.size(),
1416 PP.getPreprocessorAllocator());
1417 }
1418
Guy Benyei11169dd2012-12-18 14:30:41 +00001419 // Remember that we saw this macro last so that we add the tokens that
1420 // form its body to it.
1421 Macro = MI;
1422
1423 if (NextIndex + 1 == Record.size() && PP.getPreprocessingRecord() &&
1424 Record[NextIndex]) {
1425 // We have a macro definition. Register the association
1426 PreprocessedEntityID
1427 GlobalID = getGlobalPreprocessedEntityID(F, Record[NextIndex]);
1428 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
Argyrios Kyrtzidis832de9f2013-02-22 18:35:59 +00001429 PreprocessingRecord::PPEntityID
1430 PPID = PPRec.getPPEntityID(GlobalID-1, /*isLoaded=*/true);
1431 MacroDefinition *PPDef =
1432 cast_or_null<MacroDefinition>(PPRec.getPreprocessedEntity(PPID));
1433 if (PPDef)
1434 PPRec.RegisterMacroDefinition(Macro, PPDef);
Guy Benyei11169dd2012-12-18 14:30:41 +00001435 }
1436
1437 ++NumMacrosRead;
1438 break;
1439 }
1440
1441 case PP_TOKEN: {
1442 // If we see a TOKEN before a PP_MACRO_*, then the file is
1443 // erroneous, just pretend we didn't see this.
Craig Toppera13603a2014-05-22 05:54:18 +00001444 if (!Macro) break;
Guy Benyei11169dd2012-12-18 14:30:41 +00001445
John McCallf413f5e2013-05-03 00:10:13 +00001446 unsigned Idx = 0;
1447 Token Tok = ReadToken(F, Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00001448 Macro->AddTokenToBody(Tok);
1449 break;
1450 }
1451 }
1452 }
1453}
1454
1455PreprocessedEntityID
1456ASTReader::getGlobalPreprocessedEntityID(ModuleFile &M, unsigned LocalID) const {
1457 ContinuousRangeMap<uint32_t, int, 2>::const_iterator
1458 I = M.PreprocessedEntityRemap.find(LocalID - NUM_PREDEF_PP_ENTITY_IDS);
1459 assert(I != M.PreprocessedEntityRemap.end()
1460 && "Invalid index into preprocessed entity index remap");
1461
1462 return LocalID + I->second;
1463}
1464
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001465unsigned HeaderFileInfoTrait::ComputeHash(internal_key_ref ikey) {
1466 return llvm::hash_combine(ikey.Size, ikey.ModTime);
Guy Benyei11169dd2012-12-18 14:30:41 +00001467}
1468
1469HeaderFileInfoTrait::internal_key_type
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001470HeaderFileInfoTrait::GetInternalKey(const FileEntry *FE) {
1471 internal_key_type ikey = { FE->getSize(), FE->getModificationTime(),
1472 FE->getName() };
1473 return ikey;
1474}
Guy Benyei11169dd2012-12-18 14:30:41 +00001475
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001476bool HeaderFileInfoTrait::EqualKey(internal_key_ref a, internal_key_ref b) {
1477 if (a.Size != b.Size || a.ModTime != b.ModTime)
Guy Benyei11169dd2012-12-18 14:30:41 +00001478 return false;
1479
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001480 if (strcmp(a.Filename, b.Filename) == 0)
1481 return true;
1482
Guy Benyei11169dd2012-12-18 14:30:41 +00001483 // Determine whether the actual files are equivalent.
Argyrios Kyrtzidis2a513e82013-03-04 20:33:40 +00001484 FileManager &FileMgr = Reader.getFileManager();
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001485 const FileEntry *FEA = FileMgr.getFile(a.Filename);
1486 const FileEntry *FEB = FileMgr.getFile(b.Filename);
Argyrios Kyrtzidis2a513e82013-03-04 20:33:40 +00001487 return (FEA && FEA == FEB);
Guy Benyei11169dd2012-12-18 14:30:41 +00001488}
1489
1490std::pair<unsigned, unsigned>
1491HeaderFileInfoTrait::ReadKeyDataLength(const unsigned char*& d) {
Justin Bogner57ba0b22014-03-28 22:03:24 +00001492 using namespace llvm::support;
1493 unsigned KeyLen = (unsigned) endian::readNext<uint16_t, little, unaligned>(d);
Guy Benyei11169dd2012-12-18 14:30:41 +00001494 unsigned DataLen = (unsigned) *d++;
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001495 return std::make_pair(KeyLen, DataLen);
Guy Benyei11169dd2012-12-18 14:30:41 +00001496}
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001497
1498HeaderFileInfoTrait::internal_key_type
1499HeaderFileInfoTrait::ReadKey(const unsigned char *d, unsigned) {
Justin Bogner57ba0b22014-03-28 22:03:24 +00001500 using namespace llvm::support;
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001501 internal_key_type ikey;
Justin Bogner57ba0b22014-03-28 22:03:24 +00001502 ikey.Size = off_t(endian::readNext<uint64_t, little, unaligned>(d));
1503 ikey.ModTime = time_t(endian::readNext<uint64_t, little, unaligned>(d));
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001504 ikey.Filename = (const char *)d;
1505 return ikey;
1506}
1507
Guy Benyei11169dd2012-12-18 14:30:41 +00001508HeaderFileInfoTrait::data_type
Argyrios Kyrtzidisb146baa2013-03-13 21:13:51 +00001509HeaderFileInfoTrait::ReadData(internal_key_ref key, const unsigned char *d,
Guy Benyei11169dd2012-12-18 14:30:41 +00001510 unsigned DataLen) {
1511 const unsigned char *End = d + DataLen;
Justin Bogner57ba0b22014-03-28 22:03:24 +00001512 using namespace llvm::support;
Guy Benyei11169dd2012-12-18 14:30:41 +00001513 HeaderFileInfo HFI;
1514 unsigned Flags = *d++;
Lawrence Crowlb53e5482013-06-20 21:14:14 +00001515 HFI.HeaderRole = static_cast<ModuleMap::ModuleHeaderRole>
1516 ((Flags >> 6) & 0x03);
Guy Benyei11169dd2012-12-18 14:30:41 +00001517 HFI.isImport = (Flags >> 5) & 0x01;
1518 HFI.isPragmaOnce = (Flags >> 4) & 0x01;
1519 HFI.DirInfo = (Flags >> 2) & 0x03;
1520 HFI.Resolved = (Flags >> 1) & 0x01;
1521 HFI.IndexHeaderMapHeader = Flags & 0x01;
Justin Bogner57ba0b22014-03-28 22:03:24 +00001522 HFI.NumIncludes = endian::readNext<uint16_t, little, unaligned>(d);
1523 HFI.ControllingMacroID = Reader.getGlobalIdentifierID(
1524 M, endian::readNext<uint32_t, little, unaligned>(d));
1525 if (unsigned FrameworkOffset =
1526 endian::readNext<uint32_t, little, unaligned>(d)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001527 // The framework offset is 1 greater than the actual offset,
1528 // since 0 is used as an indicator for "no framework name".
1529 StringRef FrameworkName(FrameworkStrings + FrameworkOffset - 1);
1530 HFI.Framework = HS->getUniqueFrameworkName(FrameworkName);
1531 }
1532
Argyrios Kyrtzidisb146baa2013-03-13 21:13:51 +00001533 if (d != End) {
Justin Bogner57ba0b22014-03-28 22:03:24 +00001534 uint32_t LocalSMID = endian::readNext<uint32_t, little, unaligned>(d);
Argyrios Kyrtzidisb146baa2013-03-13 21:13:51 +00001535 if (LocalSMID) {
1536 // This header is part of a module. Associate it with the module to enable
1537 // implicit module import.
1538 SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID);
1539 Module *Mod = Reader.getSubmodule(GlobalSMID);
1540 HFI.isModuleHeader = true;
1541 FileManager &FileMgr = Reader.getFileManager();
1542 ModuleMap &ModMap =
1543 Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap();
Lawrence Crowlb53e5482013-06-20 21:14:14 +00001544 ModMap.addHeader(Mod, FileMgr.getFile(key.Filename), HFI.getHeaderRole());
Argyrios Kyrtzidisb146baa2013-03-13 21:13:51 +00001545 }
1546 }
1547
Guy Benyei11169dd2012-12-18 14:30:41 +00001548 assert(End == d && "Wrong data length in HeaderFileInfo deserialization");
1549 (void)End;
1550
1551 // This HeaderFileInfo was externally loaded.
1552 HFI.External = true;
1553 return HFI;
1554}
1555
Richard Smith49f906a2014-03-01 00:08:04 +00001556void
1557ASTReader::addPendingMacroFromModule(IdentifierInfo *II, ModuleFile *M,
1558 GlobalMacroID GMacID,
Craig Topper00bbdcf2014-06-28 23:22:23 +00001559 ArrayRef<SubmoduleID> Overrides) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001560 assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard");
Craig Toppera13603a2014-05-22 05:54:18 +00001561 SubmoduleID *OverrideData = nullptr;
Richard Smith49f906a2014-03-01 00:08:04 +00001562 if (!Overrides.empty()) {
1563 OverrideData = new (Context) SubmoduleID[Overrides.size() + 1];
1564 OverrideData[0] = Overrides.size();
1565 for (unsigned I = 0; I != Overrides.size(); ++I)
1566 OverrideData[I + 1] = getGlobalSubmoduleID(*M, Overrides[I]);
1567 }
1568 PendingMacroIDs[II].push_back(PendingMacroInfo(M, GMacID, OverrideData));
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001569}
1570
1571void ASTReader::addPendingMacroFromPCH(IdentifierInfo *II,
1572 ModuleFile *M,
1573 uint64_t MacroDirectivesOffset) {
1574 assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard");
1575 PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset));
Guy Benyei11169dd2012-12-18 14:30:41 +00001576}
1577
1578void ASTReader::ReadDefinedMacros() {
1579 // Note that we are loading defined macros.
1580 Deserializing Macros(this);
1581
1582 for (ModuleReverseIterator I = ModuleMgr.rbegin(),
1583 E = ModuleMgr.rend(); I != E; ++I) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001584 BitstreamCursor &MacroCursor = (*I)->MacroCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00001585
1586 // If there was no preprocessor block, skip this file.
1587 if (!MacroCursor.getBitStreamReader())
1588 continue;
1589
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001590 BitstreamCursor Cursor = MacroCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00001591 Cursor.JumpToBit((*I)->MacroStartOffset);
1592
1593 RecordData Record;
1594 while (true) {
Chris Lattnere7b154b2013-01-19 21:39:22 +00001595 llvm::BitstreamEntry E = Cursor.advanceSkippingSubblocks();
1596
1597 switch (E.Kind) {
1598 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1599 case llvm::BitstreamEntry::Error:
1600 Error("malformed block record in AST file");
1601 return;
1602 case llvm::BitstreamEntry::EndBlock:
1603 goto NextCursor;
1604
1605 case llvm::BitstreamEntry::Record:
Chris Lattnere7b154b2013-01-19 21:39:22 +00001606 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00001607 switch (Cursor.readRecord(E.ID, Record)) {
Chris Lattnere7b154b2013-01-19 21:39:22 +00001608 default: // Default behavior: ignore.
1609 break;
1610
1611 case PP_MACRO_OBJECT_LIKE:
1612 case PP_MACRO_FUNCTION_LIKE:
1613 getLocalIdentifier(**I, Record[0]);
1614 break;
1615
1616 case PP_TOKEN:
1617 // Ignore tokens.
1618 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00001619 }
Guy Benyei11169dd2012-12-18 14:30:41 +00001620 break;
1621 }
1622 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00001623 NextCursor: ;
Guy Benyei11169dd2012-12-18 14:30:41 +00001624 }
1625}
1626
1627namespace {
1628 /// \brief Visitor class used to look up identifirs in an AST file.
1629 class IdentifierLookupVisitor {
1630 StringRef Name;
1631 unsigned PriorGeneration;
Douglas Gregor00a50f72013-01-25 00:38:33 +00001632 unsigned &NumIdentifierLookups;
1633 unsigned &NumIdentifierLookupHits;
Guy Benyei11169dd2012-12-18 14:30:41 +00001634 IdentifierInfo *Found;
Douglas Gregor00a50f72013-01-25 00:38:33 +00001635
Guy Benyei11169dd2012-12-18 14:30:41 +00001636 public:
Douglas Gregor00a50f72013-01-25 00:38:33 +00001637 IdentifierLookupVisitor(StringRef Name, unsigned PriorGeneration,
1638 unsigned &NumIdentifierLookups,
1639 unsigned &NumIdentifierLookupHits)
Douglas Gregor7211ac12013-01-25 23:32:03 +00001640 : Name(Name), PriorGeneration(PriorGeneration),
Douglas Gregor00a50f72013-01-25 00:38:33 +00001641 NumIdentifierLookups(NumIdentifierLookups),
1642 NumIdentifierLookupHits(NumIdentifierLookupHits),
1643 Found()
1644 {
1645 }
Guy Benyei11169dd2012-12-18 14:30:41 +00001646
1647 static bool visit(ModuleFile &M, void *UserData) {
1648 IdentifierLookupVisitor *This
1649 = static_cast<IdentifierLookupVisitor *>(UserData);
1650
1651 // If we've already searched this module file, skip it now.
1652 if (M.Generation <= This->PriorGeneration)
1653 return true;
Douglas Gregore060e572013-01-25 01:03:03 +00001654
Guy Benyei11169dd2012-12-18 14:30:41 +00001655 ASTIdentifierLookupTable *IdTable
1656 = (ASTIdentifierLookupTable *)M.IdentifierLookupTable;
1657 if (!IdTable)
1658 return false;
1659
1660 ASTIdentifierLookupTrait Trait(IdTable->getInfoObj().getReader(),
1661 M, This->Found);
Douglas Gregor00a50f72013-01-25 00:38:33 +00001662 ++This->NumIdentifierLookups;
1663 ASTIdentifierLookupTable::iterator Pos = IdTable->find(This->Name,&Trait);
Guy Benyei11169dd2012-12-18 14:30:41 +00001664 if (Pos == IdTable->end())
1665 return false;
1666
1667 // Dereferencing the iterator has the effect of building the
1668 // IdentifierInfo node and populating it with the various
1669 // declarations it needs.
Douglas Gregor00a50f72013-01-25 00:38:33 +00001670 ++This->NumIdentifierLookupHits;
Guy Benyei11169dd2012-12-18 14:30:41 +00001671 This->Found = *Pos;
1672 return true;
1673 }
1674
1675 // \brief Retrieve the identifier info found within the module
1676 // files.
1677 IdentifierInfo *getIdentifierInfo() const { return Found; }
1678 };
1679}
1680
1681void ASTReader::updateOutOfDateIdentifier(IdentifierInfo &II) {
1682 // Note that we are loading an identifier.
1683 Deserializing AnIdentifier(this);
1684
1685 unsigned PriorGeneration = 0;
1686 if (getContext().getLangOpts().Modules)
1687 PriorGeneration = IdentifierGeneration[&II];
Douglas Gregore060e572013-01-25 01:03:03 +00001688
1689 // If there is a global index, look there first to determine which modules
1690 // provably do not have any results for this identifier.
Douglas Gregor7211ac12013-01-25 23:32:03 +00001691 GlobalModuleIndex::HitSet Hits;
Craig Toppera13603a2014-05-22 05:54:18 +00001692 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
Douglas Gregore060e572013-01-25 01:03:03 +00001693 if (!loadGlobalIndex()) {
Douglas Gregor7211ac12013-01-25 23:32:03 +00001694 if (GlobalIndex->lookupIdentifier(II.getName(), Hits)) {
1695 HitsPtr = &Hits;
Douglas Gregore060e572013-01-25 01:03:03 +00001696 }
1697 }
1698
Douglas Gregor7211ac12013-01-25 23:32:03 +00001699 IdentifierLookupVisitor Visitor(II.getName(), PriorGeneration,
Douglas Gregor00a50f72013-01-25 00:38:33 +00001700 NumIdentifierLookups,
1701 NumIdentifierLookupHits);
Douglas Gregor7211ac12013-01-25 23:32:03 +00001702 ModuleMgr.visit(IdentifierLookupVisitor::visit, &Visitor, HitsPtr);
Guy Benyei11169dd2012-12-18 14:30:41 +00001703 markIdentifierUpToDate(&II);
1704}
1705
1706void ASTReader::markIdentifierUpToDate(IdentifierInfo *II) {
1707 if (!II)
1708 return;
1709
1710 II->setOutOfDate(false);
1711
1712 // Update the generation for this identifier.
1713 if (getContext().getLangOpts().Modules)
Richard Smith053f6c62014-05-16 23:01:30 +00001714 IdentifierGeneration[II] = getGeneration();
Guy Benyei11169dd2012-12-18 14:30:41 +00001715}
1716
Richard Smith49f906a2014-03-01 00:08:04 +00001717struct ASTReader::ModuleMacroInfo {
1718 SubmoduleID SubModID;
1719 MacroInfo *MI;
1720 SubmoduleID *Overrides;
1721 // FIXME: Remove this.
1722 ModuleFile *F;
1723
1724 bool isDefine() const { return MI; }
1725
1726 SubmoduleID getSubmoduleID() const { return SubModID; }
1727
Craig Topper00bbdcf2014-06-28 23:22:23 +00001728 ArrayRef<SubmoduleID> getOverriddenSubmodules() const {
Richard Smith49f906a2014-03-01 00:08:04 +00001729 if (!Overrides)
Craig Topper00bbdcf2014-06-28 23:22:23 +00001730 return None;
Richard Smith49f906a2014-03-01 00:08:04 +00001731 return llvm::makeArrayRef(Overrides + 1, *Overrides);
1732 }
1733
Richard Smithdaa69e02014-07-25 04:40:03 +00001734 MacroDirective *import(Preprocessor &PP, SourceLocation ImportLoc) const {
Richard Smith49f906a2014-03-01 00:08:04 +00001735 if (!MI)
Richard Smithdaa69e02014-07-25 04:40:03 +00001736 return PP.AllocateUndefMacroDirective(ImportLoc, SubModID,
1737 getOverriddenSubmodules());
1738 return PP.AllocateDefMacroDirective(MI, ImportLoc, SubModID,
1739 getOverriddenSubmodules());
Richard Smith49f906a2014-03-01 00:08:04 +00001740 }
1741};
1742
1743ASTReader::ModuleMacroInfo *
1744ASTReader::getModuleMacro(const PendingMacroInfo &PMInfo) {
1745 ModuleMacroInfo Info;
1746
1747 uint32_t ID = PMInfo.ModuleMacroData.MacID;
1748 if (ID & 1) {
1749 // Macro undefinition.
1750 Info.SubModID = getGlobalSubmoduleID(*PMInfo.M, ID >> 1);
Craig Toppera13603a2014-05-22 05:54:18 +00001751 Info.MI = nullptr;
Richard Smith49f906a2014-03-01 00:08:04 +00001752 } else {
1753 // Macro definition.
1754 GlobalMacroID GMacID = getGlobalMacroID(*PMInfo.M, ID >> 1);
1755 assert(GMacID);
1756
1757 // If this macro has already been loaded, don't do so again.
1758 // FIXME: This is highly dubious. Multiple macro definitions can have the
1759 // same MacroInfo (and hence the same GMacID) due to #pragma push_macro etc.
1760 if (MacrosLoaded[GMacID - NUM_PREDEF_MACRO_IDS])
Craig Toppera13603a2014-05-22 05:54:18 +00001761 return nullptr;
Richard Smith49f906a2014-03-01 00:08:04 +00001762
1763 Info.MI = getMacro(GMacID);
1764 Info.SubModID = Info.MI->getOwningModuleID();
1765 }
1766 Info.Overrides = PMInfo.ModuleMacroData.Overrides;
1767 Info.F = PMInfo.M;
1768
1769 return new (Context) ModuleMacroInfo(Info);
1770}
1771
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001772void ASTReader::resolvePendingMacro(IdentifierInfo *II,
1773 const PendingMacroInfo &PMInfo) {
1774 assert(II);
1775
1776 if (PMInfo.M->Kind != MK_Module) {
1777 installPCHMacroDirectives(II, *PMInfo.M,
1778 PMInfo.PCHMacroData.MacroDirectivesOffset);
1779 return;
1780 }
Richard Smith49f906a2014-03-01 00:08:04 +00001781
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001782 // Module Macro.
1783
Richard Smith49f906a2014-03-01 00:08:04 +00001784 ModuleMacroInfo *MMI = getModuleMacro(PMInfo);
1785 if (!MMI)
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001786 return;
1787
Richard Smith49f906a2014-03-01 00:08:04 +00001788 Module *Owner = getSubmodule(MMI->getSubmoduleID());
1789 if (Owner && Owner->NameVisibility == Module::Hidden) {
1790 // Macros in the owning module are hidden. Just remember this macro to
1791 // install if we make this module visible.
1792 HiddenNamesMap[Owner].HiddenMacros.insert(std::make_pair(II, MMI));
1793 } else {
Richard Smithdaa69e02014-07-25 04:40:03 +00001794 installImportedMacro(II, MMI, Owner);
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001795 }
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001796}
1797
1798void ASTReader::installPCHMacroDirectives(IdentifierInfo *II,
1799 ModuleFile &M, uint64_t Offset) {
1800 assert(M.Kind != MK_Module);
1801
1802 BitstreamCursor &Cursor = M.MacroCursor;
1803 SavedStreamPosition SavedPosition(Cursor);
1804 Cursor.JumpToBit(Offset);
1805
1806 llvm::BitstreamEntry Entry =
1807 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
1808 if (Entry.Kind != llvm::BitstreamEntry::Record) {
1809 Error("malformed block record in AST file");
1810 return;
1811 }
1812
1813 RecordData Record;
1814 PreprocessorRecordTypes RecType =
1815 (PreprocessorRecordTypes)Cursor.readRecord(Entry.ID, Record);
1816 if (RecType != PP_MACRO_DIRECTIVE_HISTORY) {
1817 Error("malformed block record in AST file");
1818 return;
1819 }
1820
1821 // Deserialize the macro directives history in reverse source-order.
Craig Toppera13603a2014-05-22 05:54:18 +00001822 MacroDirective *Latest = nullptr, *Earliest = nullptr;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001823 unsigned Idx = 0, N = Record.size();
1824 while (Idx < N) {
Craig Toppera13603a2014-05-22 05:54:18 +00001825 MacroDirective *MD = nullptr;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001826 SourceLocation Loc = ReadSourceLocation(M, Record, Idx);
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00001827 MacroDirective::Kind K = (MacroDirective::Kind)Record[Idx++];
1828 switch (K) {
1829 case MacroDirective::MD_Define: {
1830 GlobalMacroID GMacID = getGlobalMacroID(M, Record[Idx++]);
1831 MacroInfo *MI = getMacro(GMacID);
Richard Smithdaa69e02014-07-25 04:40:03 +00001832 SubmoduleID ImportedFrom = Record[Idx++];
1833 bool IsAmbiguous = Record[Idx++];
1834 llvm::SmallVector<unsigned, 4> Overrides;
1835 if (ImportedFrom) {
1836 Overrides.insert(Overrides.end(),
1837 &Record[Idx] + 1, &Record[Idx] + 1 + Record[Idx]);
1838 Idx += Overrides.size() + 1;
1839 }
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00001840 DefMacroDirective *DefMD =
Richard Smithdaa69e02014-07-25 04:40:03 +00001841 PP.AllocateDefMacroDirective(MI, Loc, ImportedFrom, Overrides);
1842 DefMD->setAmbiguous(IsAmbiguous);
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00001843 MD = DefMD;
1844 break;
1845 }
Richard Smithdaa69e02014-07-25 04:40:03 +00001846 case MacroDirective::MD_Undefine: {
1847 SubmoduleID ImportedFrom = Record[Idx++];
1848 llvm::SmallVector<unsigned, 4> Overrides;
1849 if (ImportedFrom) {
1850 Overrides.insert(Overrides.end(),
1851 &Record[Idx] + 1, &Record[Idx] + 1 + Record[Idx]);
1852 Idx += Overrides.size() + 1;
1853 }
1854 MD = PP.AllocateUndefMacroDirective(Loc, ImportedFrom, Overrides);
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00001855 break;
Richard Smithdaa69e02014-07-25 04:40:03 +00001856 }
1857 case MacroDirective::MD_Visibility:
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00001858 bool isPublic = Record[Idx++];
1859 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic);
1860 break;
1861 }
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001862
1863 if (!Latest)
1864 Latest = MD;
1865 if (Earliest)
1866 Earliest->setPrevious(MD);
1867 Earliest = MD;
1868 }
1869
1870 PP.setLoadedMacroDirective(II, Latest);
1871}
1872
Argyrios Kyrtzidis3a9c42c2013-03-27 01:25:34 +00001873/// \brief For the given macro definitions, check if they are both in system
Douglas Gregor0b202052013-04-12 21:00:54 +00001874/// modules.
1875static bool areDefinedInSystemModules(MacroInfo *PrevMI, MacroInfo *NewMI,
Douglas Gregor5e461192013-06-07 22:56:11 +00001876 Module *NewOwner, ASTReader &Reader) {
Argyrios Kyrtzidis3a9c42c2013-03-27 01:25:34 +00001877 assert(PrevMI && NewMI);
Craig Toppera13603a2014-05-22 05:54:18 +00001878 Module *PrevOwner = nullptr;
Argyrios Kyrtzidis3a9c42c2013-03-27 01:25:34 +00001879 if (SubmoduleID PrevModID = PrevMI->getOwningModuleID())
1880 PrevOwner = Reader.getSubmodule(PrevModID);
Douglas Gregor5e461192013-06-07 22:56:11 +00001881 SourceManager &SrcMgr = Reader.getSourceManager();
1882 bool PrevInSystem
1883 = PrevOwner? PrevOwner->IsSystem
1884 : SrcMgr.isInSystemHeader(PrevMI->getDefinitionLoc());
1885 bool NewInSystem
1886 = NewOwner? NewOwner->IsSystem
1887 : SrcMgr.isInSystemHeader(NewMI->getDefinitionLoc());
1888 if (PrevOwner && PrevOwner == NewOwner)
Argyrios Kyrtzidis3a9c42c2013-03-27 01:25:34 +00001889 return false;
Douglas Gregor5e461192013-06-07 22:56:11 +00001890 return PrevInSystem && NewInSystem;
Argyrios Kyrtzidis3a9c42c2013-03-27 01:25:34 +00001891}
1892
Richard Smith49f906a2014-03-01 00:08:04 +00001893void ASTReader::removeOverriddenMacros(IdentifierInfo *II,
Richard Smithdaa69e02014-07-25 04:40:03 +00001894 SourceLocation ImportLoc,
Richard Smith49f906a2014-03-01 00:08:04 +00001895 AmbiguousMacros &Ambig,
Craig Topper00bbdcf2014-06-28 23:22:23 +00001896 ArrayRef<SubmoduleID> Overrides) {
Richard Smith49f906a2014-03-01 00:08:04 +00001897 for (unsigned OI = 0, ON = Overrides.size(); OI != ON; ++OI) {
1898 SubmoduleID OwnerID = Overrides[OI];
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001899
Richard Smith49f906a2014-03-01 00:08:04 +00001900 // If this macro is not yet visible, remove it from the hidden names list.
Richard Smithbb853c72014-08-13 01:23:33 +00001901 // It won't be there if we're in the middle of making the owner visible.
Richard Smith49f906a2014-03-01 00:08:04 +00001902 Module *Owner = getSubmodule(OwnerID);
Richard Smithbb853c72014-08-13 01:23:33 +00001903 auto HiddenIt = HiddenNamesMap.find(Owner);
1904 if (HiddenIt != HiddenNamesMap.end()) {
1905 HiddenNames &Hidden = HiddenIt->second;
1906 HiddenMacrosMap::iterator HI = Hidden.HiddenMacros.find(II);
1907 if (HI != Hidden.HiddenMacros.end()) {
1908 // Register the macro now so we don't lose it when we re-export.
1909 PP.appendMacroDirective(II, HI->second->import(PP, ImportLoc));
Richard Smithdaa69e02014-07-25 04:40:03 +00001910
Richard Smithbb853c72014-08-13 01:23:33 +00001911 auto SubOverrides = HI->second->getOverriddenSubmodules();
1912 Hidden.HiddenMacros.erase(HI);
1913 removeOverriddenMacros(II, ImportLoc, Ambig, SubOverrides);
1914 }
Richard Smith49f906a2014-03-01 00:08:04 +00001915 }
1916
1917 // If this macro is already in our list of conflicts, remove it from there.
Richard Smithbb29e512014-03-06 00:33:23 +00001918 Ambig.erase(
1919 std::remove_if(Ambig.begin(), Ambig.end(), [&](DefMacroDirective *MD) {
1920 return MD->getInfo()->getOwningModuleID() == OwnerID;
1921 }),
1922 Ambig.end());
Richard Smith49f906a2014-03-01 00:08:04 +00001923 }
1924}
1925
1926ASTReader::AmbiguousMacros *
1927ASTReader::removeOverriddenMacros(IdentifierInfo *II,
Richard Smithdaa69e02014-07-25 04:40:03 +00001928 SourceLocation ImportLoc,
Craig Topper00bbdcf2014-06-28 23:22:23 +00001929 ArrayRef<SubmoduleID> Overrides) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001930 MacroDirective *Prev = PP.getMacroDirective(II);
Richard Smith49f906a2014-03-01 00:08:04 +00001931 if (!Prev && Overrides.empty())
Craig Toppera13603a2014-05-22 05:54:18 +00001932 return nullptr;
Richard Smith49f906a2014-03-01 00:08:04 +00001933
Craig Toppera13603a2014-05-22 05:54:18 +00001934 DefMacroDirective *PrevDef = Prev ? Prev->getDefinition().getDirective()
1935 : nullptr;
Richard Smith49f906a2014-03-01 00:08:04 +00001936 if (PrevDef && PrevDef->isAmbiguous()) {
1937 // We had a prior ambiguity. Check whether we resolve it (or make it worse).
1938 AmbiguousMacros &Ambig = AmbiguousMacroDefs[II];
1939 Ambig.push_back(PrevDef);
1940
Richard Smithdaa69e02014-07-25 04:40:03 +00001941 removeOverriddenMacros(II, ImportLoc, Ambig, Overrides);
Richard Smith49f906a2014-03-01 00:08:04 +00001942
1943 if (!Ambig.empty())
1944 return &Ambig;
1945
1946 AmbiguousMacroDefs.erase(II);
1947 } else {
1948 // There's no ambiguity yet. Maybe we're introducing one.
Benjamin Kramer834652a2014-05-03 18:44:26 +00001949 AmbiguousMacros Ambig;
Richard Smith49f906a2014-03-01 00:08:04 +00001950 if (PrevDef)
1951 Ambig.push_back(PrevDef);
1952
Richard Smithdaa69e02014-07-25 04:40:03 +00001953 removeOverriddenMacros(II, ImportLoc, Ambig, Overrides);
Richard Smith49f906a2014-03-01 00:08:04 +00001954
1955 if (!Ambig.empty()) {
1956 AmbiguousMacros &Result = AmbiguousMacroDefs[II];
Benjamin Kramer834652a2014-05-03 18:44:26 +00001957 std::swap(Result, Ambig);
Richard Smith49f906a2014-03-01 00:08:04 +00001958 return &Result;
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00001959 }
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001960 }
Richard Smith49f906a2014-03-01 00:08:04 +00001961
1962 // We ended up with no ambiguity.
Craig Toppera13603a2014-05-22 05:54:18 +00001963 return nullptr;
Richard Smith49f906a2014-03-01 00:08:04 +00001964}
1965
1966void ASTReader::installImportedMacro(IdentifierInfo *II, ModuleMacroInfo *MMI,
Richard Smithdaa69e02014-07-25 04:40:03 +00001967 Module *Owner) {
Richard Smith49f906a2014-03-01 00:08:04 +00001968 assert(II && Owner);
1969
1970 SourceLocation ImportLoc = Owner->MacroVisibilityLoc;
Richard Smithdaa69e02014-07-25 04:40:03 +00001971 if (ImportLoc.isInvalid()) {
Richard Smith49f906a2014-03-01 00:08:04 +00001972 // FIXME: If we made macros from this module visible but didn't provide a
1973 // source location for the import, we don't have a location for the macro.
1974 // Use the location at which the containing module file was first imported
1975 // for now.
1976 ImportLoc = MMI->F->DirectImportLoc;
Richard Smith56be7542014-03-21 00:33:59 +00001977 assert(ImportLoc.isValid() && "no import location for a visible macro?");
Richard Smith49f906a2014-03-01 00:08:04 +00001978 }
1979
Benjamin Kramer834652a2014-05-03 18:44:26 +00001980 AmbiguousMacros *Prev =
Richard Smithdaa69e02014-07-25 04:40:03 +00001981 removeOverriddenMacros(II, ImportLoc, MMI->getOverriddenSubmodules());
Richard Smith49f906a2014-03-01 00:08:04 +00001982
Richard Smith49f906a2014-03-01 00:08:04 +00001983 // Create a synthetic macro definition corresponding to the import (or null
1984 // if this was an undefinition of the macro).
Richard Smithdaa69e02014-07-25 04:40:03 +00001985 MacroDirective *Imported = MMI->import(PP, ImportLoc);
1986 DefMacroDirective *MD = dyn_cast<DefMacroDirective>(Imported);
Richard Smith49f906a2014-03-01 00:08:04 +00001987
1988 // If there's no ambiguity, just install the macro.
1989 if (!Prev) {
Richard Smithdaa69e02014-07-25 04:40:03 +00001990 PP.appendMacroDirective(II, Imported);
Richard Smith49f906a2014-03-01 00:08:04 +00001991 return;
1992 }
1993 assert(!Prev->empty());
1994
1995 if (!MD) {
1996 // We imported a #undef that didn't remove all prior definitions. The most
1997 // recent prior definition remains, and we install it in the place of the
Richard Smithdaa69e02014-07-25 04:40:03 +00001998 // imported directive, as if by a local #pragma pop_macro.
Richard Smith49f906a2014-03-01 00:08:04 +00001999 MacroInfo *NewMI = Prev->back()->getInfo();
2000 Prev->pop_back();
Richard Smithdaa69e02014-07-25 04:40:03 +00002001 MD = PP.AllocateDefMacroDirective(NewMI, ImportLoc);
2002
2003 // Install our #undef first so that we don't lose track of it. We'll replace
2004 // this with whichever macro definition ends up winning.
2005 PP.appendMacroDirective(II, Imported);
Richard Smith49f906a2014-03-01 00:08:04 +00002006 }
2007
2008 // We're introducing a macro definition that creates or adds to an ambiguity.
2009 // We can resolve that ambiguity if this macro is token-for-token identical to
2010 // all of the existing definitions.
2011 MacroInfo *NewMI = MD->getInfo();
2012 assert(NewMI && "macro definition with no MacroInfo?");
2013 while (!Prev->empty()) {
2014 MacroInfo *PrevMI = Prev->back()->getInfo();
2015 assert(PrevMI && "macro definition with no MacroInfo?");
2016
2017 // Before marking the macros as ambiguous, check if this is a case where
2018 // both macros are in system headers. If so, we trust that the system
2019 // did not get it wrong. This also handles cases where Clang's own
2020 // headers have a different spelling of certain system macros:
2021 // #define LONG_MAX __LONG_MAX__ (clang's limits.h)
2022 // #define LONG_MAX 0x7fffffffffffffffL (system's limits.h)
2023 //
2024 // FIXME: Remove the defined-in-system-headers check. clang's limits.h
2025 // overrides the system limits.h's macros, so there's no conflict here.
2026 if (NewMI != PrevMI &&
2027 !PrevMI->isIdenticalTo(*NewMI, PP, /*Syntactically=*/true) &&
2028 !areDefinedInSystemModules(PrevMI, NewMI, Owner, *this))
2029 break;
2030
2031 // The previous definition is the same as this one (or both are defined in
2032 // system modules so we can assume they're equivalent); we don't need to
2033 // track it any more.
2034 Prev->pop_back();
2035 }
2036
2037 if (!Prev->empty())
2038 MD->setAmbiguous(true);
2039
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00002040 PP.appendMacroDirective(II, MD);
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00002041}
2042
Argyrios Kyrtzidisce9b49e2014-03-14 02:26:27 +00002043ASTReader::InputFileInfo
2044ASTReader::readInputFileInfo(ModuleFile &F, unsigned ID) {
Ben Langmuir198c1682014-03-07 07:27:49 +00002045 // Go find this input file.
2046 BitstreamCursor &Cursor = F.InputFilesCursor;
2047 SavedStreamPosition SavedPosition(Cursor);
2048 Cursor.JumpToBit(F.InputFileOffsets[ID-1]);
2049
2050 unsigned Code = Cursor.ReadCode();
2051 RecordData Record;
2052 StringRef Blob;
2053
2054 unsigned Result = Cursor.readRecord(Code, Record, &Blob);
2055 assert(static_cast<InputFileRecordTypes>(Result) == INPUT_FILE &&
2056 "invalid record type for input file");
2057 (void)Result;
2058
Argyrios Kyrtzidisce9b49e2014-03-14 02:26:27 +00002059 std::string Filename;
2060 off_t StoredSize;
2061 time_t StoredTime;
2062 bool Overridden;
2063
Ben Langmuir198c1682014-03-07 07:27:49 +00002064 assert(Record[0] == ID && "Bogus stored ID or offset");
2065 StoredSize = static_cast<off_t>(Record[1]);
2066 StoredTime = static_cast<time_t>(Record[2]);
2067 Overridden = static_cast<bool>(Record[3]);
2068 Filename = Blob;
2069 MaybeAddSystemRootToFilename(F, Filename);
Argyrios Kyrtzidisce9b49e2014-03-14 02:26:27 +00002070
Hans Wennborg73945142014-03-14 17:45:06 +00002071 InputFileInfo R = { std::move(Filename), StoredSize, StoredTime, Overridden };
2072 return R;
Ben Langmuir198c1682014-03-07 07:27:49 +00002073}
2074
2075std::string ASTReader::getInputFileName(ModuleFile &F, unsigned int ID) {
Argyrios Kyrtzidisce9b49e2014-03-14 02:26:27 +00002076 return readInputFileInfo(F, ID).Filename;
Ben Langmuir198c1682014-03-07 07:27:49 +00002077}
2078
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00002079InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002080 // If this ID is bogus, just return an empty input file.
2081 if (ID == 0 || ID > F.InputFilesLoaded.size())
2082 return InputFile();
2083
2084 // If we've already loaded this input file, return it.
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00002085 if (F.InputFilesLoaded[ID-1].getFile())
Guy Benyei11169dd2012-12-18 14:30:41 +00002086 return F.InputFilesLoaded[ID-1];
2087
Argyrios Kyrtzidis9308f0a2014-01-08 19:13:34 +00002088 if (F.InputFilesLoaded[ID-1].isNotFound())
2089 return InputFile();
2090
Guy Benyei11169dd2012-12-18 14:30:41 +00002091 // Go find this input file.
Chris Lattner7fb3bef2013-01-20 00:56:42 +00002092 BitstreamCursor &Cursor = F.InputFilesCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00002093 SavedStreamPosition SavedPosition(Cursor);
2094 Cursor.JumpToBit(F.InputFileOffsets[ID-1]);
2095
Argyrios Kyrtzidisce9b49e2014-03-14 02:26:27 +00002096 InputFileInfo FI = readInputFileInfo(F, ID);
2097 off_t StoredSize = FI.StoredSize;
2098 time_t StoredTime = FI.StoredTime;
2099 bool Overridden = FI.Overridden;
2100 StringRef Filename = FI.Filename;
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00002101
Ben Langmuir198c1682014-03-07 07:27:49 +00002102 const FileEntry *File
2103 = Overridden? FileMgr.getVirtualFile(Filename, StoredSize, StoredTime)
2104 : FileMgr.getFile(Filename, /*OpenFile=*/false);
2105
2106 // If we didn't find the file, resolve it relative to the
2107 // original directory from which this AST file was created.
Craig Toppera13603a2014-05-22 05:54:18 +00002108 if (File == nullptr && !F.OriginalDir.empty() && !CurrentDir.empty() &&
Ben Langmuir198c1682014-03-07 07:27:49 +00002109 F.OriginalDir != CurrentDir) {
2110 std::string Resolved = resolveFileRelativeToOriginalDir(Filename,
2111 F.OriginalDir,
2112 CurrentDir);
2113 if (!Resolved.empty())
2114 File = FileMgr.getFile(Resolved);
2115 }
2116
2117 // For an overridden file, create a virtual file with the stored
2118 // size/timestamp.
Craig Toppera13603a2014-05-22 05:54:18 +00002119 if (Overridden && File == nullptr) {
Ben Langmuir198c1682014-03-07 07:27:49 +00002120 File = FileMgr.getVirtualFile(Filename, StoredSize, StoredTime);
2121 }
2122
Craig Toppera13603a2014-05-22 05:54:18 +00002123 if (File == nullptr) {
Ben Langmuir198c1682014-03-07 07:27:49 +00002124 if (Complain) {
2125 std::string ErrorStr = "could not find file '";
2126 ErrorStr += Filename;
2127 ErrorStr += "' referenced by AST file";
2128 Error(ErrorStr.c_str());
Guy Benyei11169dd2012-12-18 14:30:41 +00002129 }
Ben Langmuir198c1682014-03-07 07:27:49 +00002130 // Record that we didn't find the file.
2131 F.InputFilesLoaded[ID-1] = InputFile::getNotFound();
2132 return InputFile();
2133 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002134
Ben Langmuir198c1682014-03-07 07:27:49 +00002135 // Check if there was a request to override the contents of the file
2136 // that was part of the precompiled header. Overridding such a file
2137 // can lead to problems when lexing using the source locations from the
2138 // PCH.
2139 SourceManager &SM = getSourceManager();
2140 if (!Overridden && SM.isFileOverridden(File)) {
2141 if (Complain)
2142 Error(diag::err_fe_pch_file_overridden, Filename);
2143 // After emitting the diagnostic, recover by disabling the override so
2144 // that the original file will be used.
2145 SM.disableFileContentsOverride(File);
2146 // The FileEntry is a virtual file entry with the size of the contents
2147 // that would override the original contents. Set it to the original's
2148 // size/time.
2149 FileMgr.modifyFileEntry(const_cast<FileEntry*>(File),
2150 StoredSize, StoredTime);
2151 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002152
Ben Langmuir198c1682014-03-07 07:27:49 +00002153 bool IsOutOfDate = false;
2154
2155 // For an overridden file, there is nothing to validate.
2156 if (!Overridden && (StoredSize != File->getSize()
Guy Benyei11169dd2012-12-18 14:30:41 +00002157#if !defined(LLVM_ON_WIN32)
Ben Langmuir198c1682014-03-07 07:27:49 +00002158 // In our regression testing, the Windows file system seems to
2159 // have inconsistent modification times that sometimes
2160 // erroneously trigger this error-handling path.
2161 || StoredTime != File->getModificationTime()
Guy Benyei11169dd2012-12-18 14:30:41 +00002162#endif
Ben Langmuir198c1682014-03-07 07:27:49 +00002163 )) {
2164 if (Complain) {
2165 // Build a list of the PCH imports that got us here (in reverse).
2166 SmallVector<ModuleFile *, 4> ImportStack(1, &F);
2167 while (ImportStack.back()->ImportedBy.size() > 0)
2168 ImportStack.push_back(ImportStack.back()->ImportedBy[0]);
Ben Langmuire82630d2014-01-17 00:19:09 +00002169
Ben Langmuir198c1682014-03-07 07:27:49 +00002170 // The top-level PCH is stale.
2171 StringRef TopLevelPCHName(ImportStack.back()->FileName);
2172 Error(diag::err_fe_pch_file_modified, Filename, TopLevelPCHName);
Ben Langmuire82630d2014-01-17 00:19:09 +00002173
Ben Langmuir198c1682014-03-07 07:27:49 +00002174 // Print the import stack.
2175 if (ImportStack.size() > 1 && !Diags.isDiagnosticInFlight()) {
2176 Diag(diag::note_pch_required_by)
2177 << Filename << ImportStack[0]->FileName;
2178 for (unsigned I = 1; I < ImportStack.size(); ++I)
Ben Langmuire82630d2014-01-17 00:19:09 +00002179 Diag(diag::note_pch_required_by)
Ben Langmuir198c1682014-03-07 07:27:49 +00002180 << ImportStack[I-1]->FileName << ImportStack[I]->FileName;
Douglas Gregor7029ce12013-03-19 00:28:20 +00002181 }
2182
Ben Langmuir198c1682014-03-07 07:27:49 +00002183 if (!Diags.isDiagnosticInFlight())
2184 Diag(diag::note_pch_rebuild_required) << TopLevelPCHName;
Guy Benyei11169dd2012-12-18 14:30:41 +00002185 }
2186
Ben Langmuir198c1682014-03-07 07:27:49 +00002187 IsOutOfDate = true;
Guy Benyei11169dd2012-12-18 14:30:41 +00002188 }
2189
Ben Langmuir198c1682014-03-07 07:27:49 +00002190 InputFile IF = InputFile(File, Overridden, IsOutOfDate);
2191
2192 // Note that we've loaded this input file.
2193 F.InputFilesLoaded[ID-1] = IF;
2194 return IF;
Guy Benyei11169dd2012-12-18 14:30:41 +00002195}
2196
2197const FileEntry *ASTReader::getFileEntry(StringRef filenameStrRef) {
2198 ModuleFile &M = ModuleMgr.getPrimaryModule();
2199 std::string Filename = filenameStrRef;
2200 MaybeAddSystemRootToFilename(M, Filename);
2201 const FileEntry *File = FileMgr.getFile(Filename);
Craig Toppera13603a2014-05-22 05:54:18 +00002202 if (File == nullptr && !M.OriginalDir.empty() && !CurrentDir.empty() &&
Guy Benyei11169dd2012-12-18 14:30:41 +00002203 M.OriginalDir != CurrentDir) {
2204 std::string resolved = resolveFileRelativeToOriginalDir(Filename,
2205 M.OriginalDir,
2206 CurrentDir);
2207 if (!resolved.empty())
2208 File = FileMgr.getFile(resolved);
2209 }
2210
2211 return File;
2212}
2213
2214/// \brief If we are loading a relocatable PCH file, and the filename is
2215/// not an absolute path, add the system root to the beginning of the file
2216/// name.
2217void ASTReader::MaybeAddSystemRootToFilename(ModuleFile &M,
2218 std::string &Filename) {
2219 // If this is not a relocatable PCH file, there's nothing to do.
2220 if (!M.RelocatablePCH)
2221 return;
2222
2223 if (Filename.empty() || llvm::sys::path::is_absolute(Filename))
2224 return;
2225
2226 if (isysroot.empty()) {
2227 // If no system root was given, default to '/'
2228 Filename.insert(Filename.begin(), '/');
2229 return;
2230 }
2231
2232 unsigned Length = isysroot.size();
2233 if (isysroot[Length - 1] != '/')
2234 Filename.insert(Filename.begin(), '/');
2235
2236 Filename.insert(Filename.begin(), isysroot.begin(), isysroot.end());
2237}
2238
2239ASTReader::ASTReadResult
2240ASTReader::ReadControlBlock(ModuleFile &F,
Dmitri Gribenkof8579502013-01-12 19:30:44 +00002241 SmallVectorImpl<ImportedModule> &Loaded,
Ben Langmuirbeee15e2014-04-14 18:00:01 +00002242 const ModuleFile *ImportedBy,
Guy Benyei11169dd2012-12-18 14:30:41 +00002243 unsigned ClientLoadCapabilities) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00002244 BitstreamCursor &Stream = F.Stream;
Guy Benyei11169dd2012-12-18 14:30:41 +00002245
2246 if (Stream.EnterSubBlock(CONTROL_BLOCK_ID)) {
2247 Error("malformed block record in AST file");
2248 return Failure;
2249 }
2250
2251 // Read all of the records and blocks in the control block.
2252 RecordData Record;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002253 while (1) {
2254 llvm::BitstreamEntry Entry = Stream.advance();
2255
2256 switch (Entry.Kind) {
2257 case llvm::BitstreamEntry::Error:
2258 Error("malformed block record in AST file");
2259 return Failure;
Dmitri Gribenkof430da42014-02-12 10:33:14 +00002260 case llvm::BitstreamEntry::EndBlock: {
2261 // Validate input files.
2262 const HeaderSearchOptions &HSOpts =
2263 PP.getHeaderSearchInfo().getHeaderSearchOpts();
Ben Langmuircb69b572014-03-07 06:40:32 +00002264
2265 // All user input files reside at the index range [0, Record[1]), and
2266 // system input files reside at [Record[1], Record[0]).
2267 // Record is the one from INPUT_FILE_OFFSETS.
2268 unsigned NumInputs = Record[0];
2269 unsigned NumUserInputs = Record[1];
2270
Dmitri Gribenkof430da42014-02-12 10:33:14 +00002271 if (!DisableValidation &&
Ben Langmuir1e258222014-04-08 15:36:28 +00002272 (ValidateSystemInputs || !HSOpts.ModulesValidateOncePerBuildSession ||
Dmitri Gribenkof430da42014-02-12 10:33:14 +00002273 F.InputFilesValidationTimestamp <= HSOpts.BuildSessionTimestamp)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002274 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
Ben Langmuircb69b572014-03-07 06:40:32 +00002275
Dmitri Gribenkof430da42014-02-12 10:33:14 +00002276 // If we are reading a module, we will create a verification timestamp,
2277 // so we verify all input files. Otherwise, verify only user input
2278 // files.
Ben Langmuircb69b572014-03-07 06:40:32 +00002279
2280 unsigned N = NumUserInputs;
2281 if (ValidateSystemInputs ||
Ben Langmuircb69b572014-03-07 06:40:32 +00002282 (HSOpts.ModulesValidateOncePerBuildSession && F.Kind == MK_Module))
2283 N = NumInputs;
2284
Ben Langmuir3d4417c2014-02-07 17:31:11 +00002285 for (unsigned I = 0; I < N; ++I) {
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00002286 InputFile IF = getInputFile(F, I+1, Complain);
2287 if (!IF.getFile() || IF.isOutOfDate())
Guy Benyei11169dd2012-12-18 14:30:41 +00002288 return OutOfDate;
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00002289 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002290 }
Ben Langmuircb69b572014-03-07 06:40:32 +00002291
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +00002292 if (Listener)
2293 Listener->visitModuleFile(F.FileName);
2294
Ben Langmuircb69b572014-03-07 06:40:32 +00002295 if (Listener && Listener->needsInputFileVisitation()) {
2296 unsigned N = Listener->needsSystemInputFileVisitation() ? NumInputs
2297 : NumUserInputs;
Argyrios Kyrtzidis68ccbe02014-03-14 02:26:31 +00002298 for (unsigned I = 0; I < N; ++I) {
2299 bool IsSystem = I >= NumUserInputs;
2300 InputFileInfo FI = readInputFileInfo(F, I+1);
2301 Listener->visitInputFile(FI.Filename, IsSystem, FI.Overridden);
2302 }
Ben Langmuircb69b572014-03-07 06:40:32 +00002303 }
2304
Guy Benyei11169dd2012-12-18 14:30:41 +00002305 return Success;
Dmitri Gribenkof430da42014-02-12 10:33:14 +00002306 }
2307
Chris Lattnere7b154b2013-01-19 21:39:22 +00002308 case llvm::BitstreamEntry::SubBlock:
2309 switch (Entry.ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002310 case INPUT_FILES_BLOCK_ID:
2311 F.InputFilesCursor = Stream;
2312 if (Stream.SkipBlock() || // Skip with the main cursor
2313 // Read the abbreviations
2314 ReadBlockAbbrevs(F.InputFilesCursor, INPUT_FILES_BLOCK_ID)) {
2315 Error("malformed block record in AST file");
2316 return Failure;
2317 }
2318 continue;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002319
Guy Benyei11169dd2012-12-18 14:30:41 +00002320 default:
Chris Lattnere7b154b2013-01-19 21:39:22 +00002321 if (Stream.SkipBlock()) {
2322 Error("malformed block record in AST file");
2323 return Failure;
2324 }
2325 continue;
Guy Benyei11169dd2012-12-18 14:30:41 +00002326 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00002327
2328 case llvm::BitstreamEntry::Record:
2329 // The interesting case.
2330 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00002331 }
2332
2333 // Read and process a record.
2334 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00002335 StringRef Blob;
2336 switch ((ControlRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002337 case METADATA: {
2338 if (Record[0] != VERSION_MAJOR && !DisableValidation) {
2339 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
Dmitri Gribenko2228cd32014-02-11 15:40:09 +00002340 Diag(Record[0] < VERSION_MAJOR? diag::err_pch_version_too_old
2341 : diag::err_pch_version_too_new);
Guy Benyei11169dd2012-12-18 14:30:41 +00002342 return VersionMismatch;
2343 }
2344
2345 bool hasErrors = Record[5];
2346 if (hasErrors && !DisableValidation && !AllowASTWithCompilerErrors) {
2347 Diag(diag::err_pch_with_compiler_errors);
2348 return HadErrors;
2349 }
2350
2351 F.RelocatablePCH = Record[4];
2352
2353 const std::string &CurBranch = getClangFullRepositoryVersion();
Chris Lattner0e6c9402013-01-20 02:38:54 +00002354 StringRef ASTBranch = Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00002355 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) {
2356 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
Dmitri Gribenko2228cd32014-02-11 15:40:09 +00002357 Diag(diag::err_pch_different_branch) << ASTBranch << CurBranch;
Guy Benyei11169dd2012-12-18 14:30:41 +00002358 return VersionMismatch;
2359 }
2360 break;
2361 }
2362
2363 case IMPORTS: {
2364 // Load each of the imported PCH files.
2365 unsigned Idx = 0, N = Record.size();
2366 while (Idx < N) {
2367 // Read information about the AST file.
2368 ModuleKind ImportedKind = (ModuleKind)Record[Idx++];
2369 // The import location will be the local one for now; we will adjust
2370 // all import locations of module imports after the global source
2371 // location info are setup.
2372 SourceLocation ImportLoc =
2373 SourceLocation::getFromRawEncoding(Record[Idx++]);
Douglas Gregor7029ce12013-03-19 00:28:20 +00002374 off_t StoredSize = (off_t)Record[Idx++];
2375 time_t StoredModTime = (time_t)Record[Idx++];
Guy Benyei11169dd2012-12-18 14:30:41 +00002376 unsigned Length = Record[Idx++];
2377 SmallString<128> ImportedFile(Record.begin() + Idx,
2378 Record.begin() + Idx + Length);
2379 Idx += Length;
2380
2381 // Load the AST file.
2382 switch(ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F, Loaded,
Douglas Gregor7029ce12013-03-19 00:28:20 +00002383 StoredSize, StoredModTime,
Guy Benyei11169dd2012-12-18 14:30:41 +00002384 ClientLoadCapabilities)) {
2385 case Failure: return Failure;
2386 // If we have to ignore the dependency, we'll have to ignore this too.
Douglas Gregor2f1806e2013-03-19 00:38:50 +00002387 case Missing:
Guy Benyei11169dd2012-12-18 14:30:41 +00002388 case OutOfDate: return OutOfDate;
2389 case VersionMismatch: return VersionMismatch;
2390 case ConfigurationMismatch: return ConfigurationMismatch;
2391 case HadErrors: return HadErrors;
2392 case Success: break;
2393 }
2394 }
2395 break;
2396 }
2397
2398 case LANGUAGE_OPTIONS: {
2399 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2400 if (Listener && &F == *ModuleMgr.begin() &&
2401 ParseLanguageOptions(Record, Complain, *Listener) &&
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002402 !DisableValidation && !AllowConfigurationMismatch)
Guy Benyei11169dd2012-12-18 14:30:41 +00002403 return ConfigurationMismatch;
2404 break;
2405 }
2406
2407 case TARGET_OPTIONS: {
2408 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
2409 if (Listener && &F == *ModuleMgr.begin() &&
2410 ParseTargetOptions(Record, Complain, *Listener) &&
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002411 !DisableValidation && !AllowConfigurationMismatch)
Guy Benyei11169dd2012-12-18 14:30:41 +00002412 return ConfigurationMismatch;
2413 break;
2414 }
2415
2416 case DIAGNOSTIC_OPTIONS: {
Ben Langmuirb92de022014-04-29 16:25:26 +00002417 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate)==0;
Guy Benyei11169dd2012-12-18 14:30:41 +00002418 if (Listener && &F == *ModuleMgr.begin() &&
2419 ParseDiagnosticOptions(Record, Complain, *Listener) &&
Ben Langmuirb92de022014-04-29 16:25:26 +00002420 !DisableValidation)
2421 return OutOfDate;
Guy Benyei11169dd2012-12-18 14:30:41 +00002422 break;
2423 }
2424
2425 case FILE_SYSTEM_OPTIONS: {
2426 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
2427 if (Listener && &F == *ModuleMgr.begin() &&
2428 ParseFileSystemOptions(Record, Complain, *Listener) &&
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002429 !DisableValidation && !AllowConfigurationMismatch)
Guy Benyei11169dd2012-12-18 14:30:41 +00002430 return ConfigurationMismatch;
2431 break;
2432 }
2433
2434 case HEADER_SEARCH_OPTIONS: {
2435 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
2436 if (Listener && &F == *ModuleMgr.begin() &&
2437 ParseHeaderSearchOptions(Record, Complain, *Listener) &&
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002438 !DisableValidation && !AllowConfigurationMismatch)
Guy Benyei11169dd2012-12-18 14:30:41 +00002439 return ConfigurationMismatch;
2440 break;
2441 }
2442
2443 case PREPROCESSOR_OPTIONS: {
2444 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
2445 if (Listener && &F == *ModuleMgr.begin() &&
2446 ParsePreprocessorOptions(Record, Complain, *Listener,
2447 SuggestedPredefines) &&
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002448 !DisableValidation && !AllowConfigurationMismatch)
Guy Benyei11169dd2012-12-18 14:30:41 +00002449 return ConfigurationMismatch;
2450 break;
2451 }
2452
2453 case ORIGINAL_FILE:
2454 F.OriginalSourceFileID = FileID::get(Record[0]);
Chris Lattner0e6c9402013-01-20 02:38:54 +00002455 F.ActualOriginalSourceFileName = Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00002456 F.OriginalSourceFileName = F.ActualOriginalSourceFileName;
2457 MaybeAddSystemRootToFilename(F, F.OriginalSourceFileName);
2458 break;
2459
2460 case ORIGINAL_FILE_ID:
2461 F.OriginalSourceFileID = FileID::get(Record[0]);
2462 break;
2463
2464 case ORIGINAL_PCH_DIR:
Chris Lattner0e6c9402013-01-20 02:38:54 +00002465 F.OriginalDir = Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00002466 break;
2467
Ben Langmuirbeee15e2014-04-14 18:00:01 +00002468 case MODULE_NAME:
2469 F.ModuleName = Blob;
Ben Langmuir4f5212a2014-04-14 22:12:44 +00002470 if (Listener)
2471 Listener->ReadModuleName(F.ModuleName);
Ben Langmuirbeee15e2014-04-14 18:00:01 +00002472 break;
2473
2474 case MODULE_MAP_FILE:
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00002475 if (ASTReadResult Result =
2476 ReadModuleMapFileBlock(Record, F, ImportedBy, ClientLoadCapabilities))
2477 return Result;
Guy Benyei11169dd2012-12-18 14:30:41 +00002478 case INPUT_FILE_OFFSETS:
Chris Lattner0e6c9402013-01-20 02:38:54 +00002479 F.InputFileOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002480 F.InputFilesLoaded.resize(Record[0]);
2481 break;
2482 }
2483 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002484}
2485
Ben Langmuir2c9af442014-04-10 17:57:43 +00002486ASTReader::ASTReadResult
2487ASTReader::ReadASTBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00002488 BitstreamCursor &Stream = F.Stream;
Guy Benyei11169dd2012-12-18 14:30:41 +00002489
2490 if (Stream.EnterSubBlock(AST_BLOCK_ID)) {
2491 Error("malformed block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002492 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002493 }
2494
2495 // Read all of the records and blocks for the AST file.
2496 RecordData Record;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002497 while (1) {
2498 llvm::BitstreamEntry Entry = Stream.advance();
2499
2500 switch (Entry.Kind) {
2501 case llvm::BitstreamEntry::Error:
2502 Error("error at end of module block in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002503 return Failure;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002504 case llvm::BitstreamEntry::EndBlock: {
Richard Smithc0fbba72013-04-03 22:49:41 +00002505 // Outside of C++, we do not store a lookup map for the translation unit.
2506 // Instead, mark it as needing a lookup map to be built if this module
2507 // contains any declarations lexically within it (which it always does!).
2508 // This usually has no cost, since we very rarely need the lookup map for
2509 // the translation unit outside C++.
Guy Benyei11169dd2012-12-18 14:30:41 +00002510 DeclContext *DC = Context.getTranslationUnitDecl();
Richard Smithc0fbba72013-04-03 22:49:41 +00002511 if (DC->hasExternalLexicalStorage() &&
2512 !getContext().getLangOpts().CPlusPlus)
Guy Benyei11169dd2012-12-18 14:30:41 +00002513 DC->setMustBuildLookupTable();
Chris Lattnere7b154b2013-01-19 21:39:22 +00002514
Ben Langmuir2c9af442014-04-10 17:57:43 +00002515 return Success;
Guy Benyei11169dd2012-12-18 14:30:41 +00002516 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00002517 case llvm::BitstreamEntry::SubBlock:
2518 switch (Entry.ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002519 case DECLTYPES_BLOCK_ID:
2520 // We lazily load the decls block, but we want to set up the
2521 // DeclsCursor cursor to point into it. Clone our current bitcode
2522 // cursor to it, enter the block and read the abbrevs in that block.
2523 // With the main cursor, we just skip over it.
2524 F.DeclsCursor = Stream;
2525 if (Stream.SkipBlock() || // Skip with the main cursor.
2526 // Read the abbrevs.
2527 ReadBlockAbbrevs(F.DeclsCursor, DECLTYPES_BLOCK_ID)) {
2528 Error("malformed block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002529 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002530 }
2531 break;
Richard Smithb9eab6d2014-03-20 19:44:17 +00002532
Guy Benyei11169dd2012-12-18 14:30:41 +00002533 case PREPROCESSOR_BLOCK_ID:
2534 F.MacroCursor = Stream;
2535 if (!PP.getExternalSource())
2536 PP.setExternalSource(this);
Chris Lattnere7b154b2013-01-19 21:39:22 +00002537
Guy Benyei11169dd2012-12-18 14:30:41 +00002538 if (Stream.SkipBlock() ||
2539 ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID)) {
2540 Error("malformed block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002541 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002542 }
2543 F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo();
2544 break;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002545
Guy Benyei11169dd2012-12-18 14:30:41 +00002546 case PREPROCESSOR_DETAIL_BLOCK_ID:
2547 F.PreprocessorDetailCursor = Stream;
2548 if (Stream.SkipBlock() ||
Chris Lattnere7b154b2013-01-19 21:39:22 +00002549 ReadBlockAbbrevs(F.PreprocessorDetailCursor,
Guy Benyei11169dd2012-12-18 14:30:41 +00002550 PREPROCESSOR_DETAIL_BLOCK_ID)) {
Chris Lattnere7b154b2013-01-19 21:39:22 +00002551 Error("malformed preprocessor detail record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002552 return Failure;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002553 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002554 F.PreprocessorDetailStartOffset
Chris Lattnere7b154b2013-01-19 21:39:22 +00002555 = F.PreprocessorDetailCursor.GetCurrentBitNo();
2556
Guy Benyei11169dd2012-12-18 14:30:41 +00002557 if (!PP.getPreprocessingRecord())
2558 PP.createPreprocessingRecord();
2559 if (!PP.getPreprocessingRecord()->getExternalSource())
2560 PP.getPreprocessingRecord()->SetExternalSource(*this);
2561 break;
2562
2563 case SOURCE_MANAGER_BLOCK_ID:
2564 if (ReadSourceManagerBlock(F))
Ben Langmuir2c9af442014-04-10 17:57:43 +00002565 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002566 break;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002567
Guy Benyei11169dd2012-12-18 14:30:41 +00002568 case SUBMODULE_BLOCK_ID:
Ben Langmuir2c9af442014-04-10 17:57:43 +00002569 if (ASTReadResult Result = ReadSubmoduleBlock(F, ClientLoadCapabilities))
2570 return Result;
Guy Benyei11169dd2012-12-18 14:30:41 +00002571 break;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002572
Guy Benyei11169dd2012-12-18 14:30:41 +00002573 case COMMENTS_BLOCK_ID: {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00002574 BitstreamCursor C = Stream;
Guy Benyei11169dd2012-12-18 14:30:41 +00002575 if (Stream.SkipBlock() ||
2576 ReadBlockAbbrevs(C, COMMENTS_BLOCK_ID)) {
2577 Error("malformed comments block in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002578 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002579 }
2580 CommentsCursors.push_back(std::make_pair(C, &F));
2581 break;
2582 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00002583
Guy Benyei11169dd2012-12-18 14:30:41 +00002584 default:
Chris Lattnere7b154b2013-01-19 21:39:22 +00002585 if (Stream.SkipBlock()) {
2586 Error("malformed block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002587 return Failure;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002588 }
2589 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00002590 }
2591 continue;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002592
2593 case llvm::BitstreamEntry::Record:
2594 // The interesting case.
2595 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00002596 }
2597
2598 // Read and process a record.
2599 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00002600 StringRef Blob;
2601 switch ((ASTRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002602 default: // Default behavior: ignore.
2603 break;
2604
2605 case TYPE_OFFSET: {
2606 if (F.LocalNumTypes != 0) {
2607 Error("duplicate TYPE_OFFSET record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002608 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002609 }
Chris Lattner0e6c9402013-01-20 02:38:54 +00002610 F.TypeOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002611 F.LocalNumTypes = Record[0];
2612 unsigned LocalBaseTypeIndex = Record[1];
2613 F.BaseTypeIndex = getTotalNumTypes();
2614
2615 if (F.LocalNumTypes > 0) {
2616 // Introduce the global -> local mapping for types within this module.
2617 GlobalTypeMap.insert(std::make_pair(getTotalNumTypes(), &F));
2618
2619 // Introduce the local -> global mapping for types within this module.
2620 F.TypeRemap.insertOrReplace(
2621 std::make_pair(LocalBaseTypeIndex,
2622 F.BaseTypeIndex - LocalBaseTypeIndex));
2623
2624 TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes);
2625 }
2626 break;
2627 }
2628
2629 case DECL_OFFSET: {
2630 if (F.LocalNumDecls != 0) {
2631 Error("duplicate DECL_OFFSET record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002632 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002633 }
Chris Lattner0e6c9402013-01-20 02:38:54 +00002634 F.DeclOffsets = (const DeclOffset *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002635 F.LocalNumDecls = Record[0];
2636 unsigned LocalBaseDeclID = Record[1];
2637 F.BaseDeclID = getTotalNumDecls();
2638
2639 if (F.LocalNumDecls > 0) {
2640 // Introduce the global -> local mapping for declarations within this
2641 // module.
2642 GlobalDeclMap.insert(
2643 std::make_pair(getTotalNumDecls() + NUM_PREDEF_DECL_IDS, &F));
2644
2645 // Introduce the local -> global mapping for declarations within this
2646 // module.
2647 F.DeclRemap.insertOrReplace(
2648 std::make_pair(LocalBaseDeclID, F.BaseDeclID - LocalBaseDeclID));
2649
2650 // Introduce the global -> local mapping for declarations within this
2651 // module.
2652 F.GlobalToLocalDeclIDs[&F] = LocalBaseDeclID;
2653
2654 DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls);
2655 }
2656 break;
2657 }
2658
2659 case TU_UPDATE_LEXICAL: {
2660 DeclContext *TU = Context.getTranslationUnitDecl();
2661 DeclContextInfo &Info = F.DeclContextInfos[TU];
Chris Lattner0e6c9402013-01-20 02:38:54 +00002662 Info.LexicalDecls = reinterpret_cast<const KindDeclIDPair *>(Blob.data());
Guy Benyei11169dd2012-12-18 14:30:41 +00002663 Info.NumLexicalDecls
Chris Lattner0e6c9402013-01-20 02:38:54 +00002664 = static_cast<unsigned int>(Blob.size() / sizeof(KindDeclIDPair));
Guy Benyei11169dd2012-12-18 14:30:41 +00002665 TU->setHasExternalLexicalStorage(true);
2666 break;
2667 }
2668
2669 case UPDATE_VISIBLE: {
2670 unsigned Idx = 0;
2671 serialization::DeclID ID = ReadDeclID(F, Record, Idx);
2672 ASTDeclContextNameLookupTable *Table =
Justin Bognerda4e6502014-04-14 16:34:29 +00002673 ASTDeclContextNameLookupTable::Create(
2674 (const unsigned char *)Blob.data() + Record[Idx++],
2675 (const unsigned char *)Blob.data() + sizeof(uint32_t),
2676 (const unsigned char *)Blob.data(),
2677 ASTDeclContextNameLookupTrait(*this, F));
Richard Smithcd45dbc2014-04-19 03:48:30 +00002678 if (Decl *D = GetExistingDecl(ID)) {
Richard Smithd9174792014-03-11 03:10:46 +00002679 auto *DC = cast<DeclContext>(D);
2680 DC->getPrimaryContext()->setHasExternalVisibleStorage(true);
Richard Smith52e3fba2014-03-11 07:17:35 +00002681 auto *&LookupTable = F.DeclContextInfos[DC].NameLookupTableData;
2682 delete LookupTable;
2683 LookupTable = Table;
Guy Benyei11169dd2012-12-18 14:30:41 +00002684 } else
2685 PendingVisibleUpdates[ID].push_back(std::make_pair(Table, &F));
2686 break;
2687 }
2688
2689 case IDENTIFIER_TABLE:
Chris Lattner0e6c9402013-01-20 02:38:54 +00002690 F.IdentifierTableData = Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002691 if (Record[0]) {
Justin Bognerda4e6502014-04-14 16:34:29 +00002692 F.IdentifierLookupTable = ASTIdentifierLookupTable::Create(
2693 (const unsigned char *)F.IdentifierTableData + Record[0],
2694 (const unsigned char *)F.IdentifierTableData + sizeof(uint32_t),
2695 (const unsigned char *)F.IdentifierTableData,
2696 ASTIdentifierLookupTrait(*this, F));
Guy Benyei11169dd2012-12-18 14:30:41 +00002697
2698 PP.getIdentifierTable().setExternalIdentifierLookup(this);
2699 }
2700 break;
2701
2702 case IDENTIFIER_OFFSET: {
2703 if (F.LocalNumIdentifiers != 0) {
2704 Error("duplicate IDENTIFIER_OFFSET record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002705 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002706 }
Chris Lattner0e6c9402013-01-20 02:38:54 +00002707 F.IdentifierOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002708 F.LocalNumIdentifiers = Record[0];
2709 unsigned LocalBaseIdentifierID = Record[1];
2710 F.BaseIdentifierID = getTotalNumIdentifiers();
2711
2712 if (F.LocalNumIdentifiers > 0) {
2713 // Introduce the global -> local mapping for identifiers within this
2714 // module.
2715 GlobalIdentifierMap.insert(std::make_pair(getTotalNumIdentifiers() + 1,
2716 &F));
2717
2718 // Introduce the local -> global mapping for identifiers within this
2719 // module.
2720 F.IdentifierRemap.insertOrReplace(
2721 std::make_pair(LocalBaseIdentifierID,
2722 F.BaseIdentifierID - LocalBaseIdentifierID));
2723
2724 IdentifiersLoaded.resize(IdentifiersLoaded.size()
2725 + F.LocalNumIdentifiers);
2726 }
2727 break;
2728 }
2729
Ben Langmuir332aafe2014-01-31 01:06:56 +00002730 case EAGERLY_DESERIALIZED_DECLS:
Guy Benyei11169dd2012-12-18 14:30:41 +00002731 for (unsigned I = 0, N = Record.size(); I != N; ++I)
Ben Langmuir332aafe2014-01-31 01:06:56 +00002732 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I]));
Guy Benyei11169dd2012-12-18 14:30:41 +00002733 break;
2734
2735 case SPECIAL_TYPES:
Douglas Gregor44180f82013-02-01 23:45:03 +00002736 if (SpecialTypes.empty()) {
2737 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2738 SpecialTypes.push_back(getGlobalTypeID(F, Record[I]));
2739 break;
2740 }
2741
2742 if (SpecialTypes.size() != Record.size()) {
2743 Error("invalid special-types record");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002744 return Failure;
Douglas Gregor44180f82013-02-01 23:45:03 +00002745 }
2746
2747 for (unsigned I = 0, N = Record.size(); I != N; ++I) {
2748 serialization::TypeID ID = getGlobalTypeID(F, Record[I]);
2749 if (!SpecialTypes[I])
2750 SpecialTypes[I] = ID;
2751 // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate
2752 // merge step?
2753 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002754 break;
2755
2756 case STATISTICS:
2757 TotalNumStatements += Record[0];
2758 TotalNumMacros += Record[1];
2759 TotalLexicalDeclContexts += Record[2];
2760 TotalVisibleDeclContexts += Record[3];
2761 break;
2762
2763 case UNUSED_FILESCOPED_DECLS:
2764 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2765 UnusedFileScopedDecls.push_back(getGlobalDeclID(F, Record[I]));
2766 break;
2767
2768 case DELEGATING_CTORS:
2769 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2770 DelegatingCtorDecls.push_back(getGlobalDeclID(F, Record[I]));
2771 break;
2772
2773 case WEAK_UNDECLARED_IDENTIFIERS:
2774 if (Record.size() % 4 != 0) {
2775 Error("invalid weak identifiers record");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002776 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002777 }
2778
2779 // FIXME: Ignore weak undeclared identifiers from non-original PCH
2780 // files. This isn't the way to do it :)
2781 WeakUndeclaredIdentifiers.clear();
2782
2783 // Translate the weak, undeclared identifiers into global IDs.
2784 for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) {
2785 WeakUndeclaredIdentifiers.push_back(
2786 getGlobalIdentifierID(F, Record[I++]));
2787 WeakUndeclaredIdentifiers.push_back(
2788 getGlobalIdentifierID(F, Record[I++]));
2789 WeakUndeclaredIdentifiers.push_back(
2790 ReadSourceLocation(F, Record, I).getRawEncoding());
2791 WeakUndeclaredIdentifiers.push_back(Record[I++]);
2792 }
2793 break;
2794
Richard Smith78165b52013-01-10 23:43:47 +00002795 case LOCALLY_SCOPED_EXTERN_C_DECLS:
Guy Benyei11169dd2012-12-18 14:30:41 +00002796 for (unsigned I = 0, N = Record.size(); I != N; ++I)
Richard Smith78165b52013-01-10 23:43:47 +00002797 LocallyScopedExternCDecls.push_back(getGlobalDeclID(F, Record[I]));
Guy Benyei11169dd2012-12-18 14:30:41 +00002798 break;
2799
2800 case SELECTOR_OFFSETS: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00002801 F.SelectorOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002802 F.LocalNumSelectors = Record[0];
2803 unsigned LocalBaseSelectorID = Record[1];
2804 F.BaseSelectorID = getTotalNumSelectors();
2805
2806 if (F.LocalNumSelectors > 0) {
2807 // Introduce the global -> local mapping for selectors within this
2808 // module.
2809 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F));
2810
2811 // Introduce the local -> global mapping for selectors within this
2812 // module.
2813 F.SelectorRemap.insertOrReplace(
2814 std::make_pair(LocalBaseSelectorID,
2815 F.BaseSelectorID - LocalBaseSelectorID));
2816
2817 SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors);
2818 }
2819 break;
2820 }
2821
2822 case METHOD_POOL:
Chris Lattner0e6c9402013-01-20 02:38:54 +00002823 F.SelectorLookupTableData = (const unsigned char *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002824 if (Record[0])
2825 F.SelectorLookupTable
2826 = ASTSelectorLookupTable::Create(
2827 F.SelectorLookupTableData + Record[0],
2828 F.SelectorLookupTableData,
2829 ASTSelectorLookupTrait(*this, F));
2830 TotalNumMethodPoolEntries += Record[1];
2831 break;
2832
2833 case REFERENCED_SELECTOR_POOL:
2834 if (!Record.empty()) {
2835 for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) {
2836 ReferencedSelectorsData.push_back(getGlobalSelectorID(F,
2837 Record[Idx++]));
2838 ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx).
2839 getRawEncoding());
2840 }
2841 }
2842 break;
2843
2844 case PP_COUNTER_VALUE:
2845 if (!Record.empty() && Listener)
2846 Listener->ReadCounter(F, Record[0]);
2847 break;
2848
2849 case FILE_SORTED_DECLS:
Chris Lattner0e6c9402013-01-20 02:38:54 +00002850 F.FileSortedDecls = (const DeclID *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002851 F.NumFileSortedDecls = Record[0];
2852 break;
2853
2854 case SOURCE_LOCATION_OFFSETS: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00002855 F.SLocEntryOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002856 F.LocalNumSLocEntries = Record[0];
2857 unsigned SLocSpaceSize = Record[1];
Benjamin Kramer867ea1d2014-03-02 13:01:17 +00002858 std::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) =
Guy Benyei11169dd2012-12-18 14:30:41 +00002859 SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries,
2860 SLocSpaceSize);
2861 // Make our entry in the range map. BaseID is negative and growing, so
2862 // we invert it. Because we invert it, though, we need the other end of
2863 // the range.
2864 unsigned RangeStart =
2865 unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1;
2866 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F));
2867 F.FirstLoc = SourceLocation::getFromRawEncoding(F.SLocEntryBaseOffset);
2868
2869 // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing.
2870 assert((F.SLocEntryBaseOffset & (1U << 31U)) == 0);
2871 GlobalSLocOffsetMap.insert(
2872 std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset
2873 - SLocSpaceSize,&F));
2874
2875 // Initialize the remapping table.
2876 // Invalid stays invalid.
Richard Smithb9eab6d2014-03-20 19:44:17 +00002877 F.SLocRemap.insertOrReplace(std::make_pair(0U, 0));
Guy Benyei11169dd2012-12-18 14:30:41 +00002878 // This module. Base was 2 when being compiled.
Richard Smithb9eab6d2014-03-20 19:44:17 +00002879 F.SLocRemap.insertOrReplace(std::make_pair(2U,
Guy Benyei11169dd2012-12-18 14:30:41 +00002880 static_cast<int>(F.SLocEntryBaseOffset - 2)));
2881
2882 TotalNumSLocEntries += F.LocalNumSLocEntries;
2883 break;
2884 }
2885
2886 case MODULE_OFFSET_MAP: {
2887 // Additional remapping information.
Chris Lattner0e6c9402013-01-20 02:38:54 +00002888 const unsigned char *Data = (const unsigned char*)Blob.data();
2889 const unsigned char *DataEnd = Data + Blob.size();
Richard Smithb9eab6d2014-03-20 19:44:17 +00002890
2891 // If we see this entry before SOURCE_LOCATION_OFFSETS, add placeholders.
2892 if (F.SLocRemap.find(0) == F.SLocRemap.end()) {
2893 F.SLocRemap.insert(std::make_pair(0U, 0));
2894 F.SLocRemap.insert(std::make_pair(2U, 1));
2895 }
2896
Guy Benyei11169dd2012-12-18 14:30:41 +00002897 // Continuous range maps we may be updating in our module.
2898 ContinuousRangeMap<uint32_t, int, 2>::Builder SLocRemap(F.SLocRemap);
2899 ContinuousRangeMap<uint32_t, int, 2>::Builder
2900 IdentifierRemap(F.IdentifierRemap);
2901 ContinuousRangeMap<uint32_t, int, 2>::Builder
2902 MacroRemap(F.MacroRemap);
2903 ContinuousRangeMap<uint32_t, int, 2>::Builder
2904 PreprocessedEntityRemap(F.PreprocessedEntityRemap);
2905 ContinuousRangeMap<uint32_t, int, 2>::Builder
2906 SubmoduleRemap(F.SubmoduleRemap);
2907 ContinuousRangeMap<uint32_t, int, 2>::Builder
2908 SelectorRemap(F.SelectorRemap);
2909 ContinuousRangeMap<uint32_t, int, 2>::Builder DeclRemap(F.DeclRemap);
2910 ContinuousRangeMap<uint32_t, int, 2>::Builder TypeRemap(F.TypeRemap);
2911
2912 while(Data < DataEnd) {
Justin Bogner57ba0b22014-03-28 22:03:24 +00002913 using namespace llvm::support;
2914 uint16_t Len = endian::readNext<uint16_t, little, unaligned>(Data);
Guy Benyei11169dd2012-12-18 14:30:41 +00002915 StringRef Name = StringRef((const char*)Data, Len);
2916 Data += Len;
2917 ModuleFile *OM = ModuleMgr.lookup(Name);
2918 if (!OM) {
2919 Error("SourceLocation remap refers to unknown module");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002920 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002921 }
2922
Justin Bogner57ba0b22014-03-28 22:03:24 +00002923 uint32_t SLocOffset =
2924 endian::readNext<uint32_t, little, unaligned>(Data);
2925 uint32_t IdentifierIDOffset =
2926 endian::readNext<uint32_t, little, unaligned>(Data);
2927 uint32_t MacroIDOffset =
2928 endian::readNext<uint32_t, little, unaligned>(Data);
2929 uint32_t PreprocessedEntityIDOffset =
2930 endian::readNext<uint32_t, little, unaligned>(Data);
2931 uint32_t SubmoduleIDOffset =
2932 endian::readNext<uint32_t, little, unaligned>(Data);
2933 uint32_t SelectorIDOffset =
2934 endian::readNext<uint32_t, little, unaligned>(Data);
2935 uint32_t DeclIDOffset =
2936 endian::readNext<uint32_t, little, unaligned>(Data);
2937 uint32_t TypeIndexOffset =
2938 endian::readNext<uint32_t, little, unaligned>(Data);
2939
Guy Benyei11169dd2012-12-18 14:30:41 +00002940 // Source location offset is mapped to OM->SLocEntryBaseOffset.
2941 SLocRemap.insert(std::make_pair(SLocOffset,
2942 static_cast<int>(OM->SLocEntryBaseOffset - SLocOffset)));
2943 IdentifierRemap.insert(
2944 std::make_pair(IdentifierIDOffset,
2945 OM->BaseIdentifierID - IdentifierIDOffset));
2946 MacroRemap.insert(std::make_pair(MacroIDOffset,
2947 OM->BaseMacroID - MacroIDOffset));
2948 PreprocessedEntityRemap.insert(
2949 std::make_pair(PreprocessedEntityIDOffset,
2950 OM->BasePreprocessedEntityID - PreprocessedEntityIDOffset));
2951 SubmoduleRemap.insert(std::make_pair(SubmoduleIDOffset,
2952 OM->BaseSubmoduleID - SubmoduleIDOffset));
2953 SelectorRemap.insert(std::make_pair(SelectorIDOffset,
2954 OM->BaseSelectorID - SelectorIDOffset));
2955 DeclRemap.insert(std::make_pair(DeclIDOffset,
2956 OM->BaseDeclID - DeclIDOffset));
2957
2958 TypeRemap.insert(std::make_pair(TypeIndexOffset,
2959 OM->BaseTypeIndex - TypeIndexOffset));
2960
2961 // Global -> local mappings.
2962 F.GlobalToLocalDeclIDs[OM] = DeclIDOffset;
2963 }
2964 break;
2965 }
2966
2967 case SOURCE_MANAGER_LINE_TABLE:
2968 if (ParseLineTable(F, Record))
Ben Langmuir2c9af442014-04-10 17:57:43 +00002969 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002970 break;
2971
2972 case SOURCE_LOCATION_PRELOADS: {
2973 // Need to transform from the local view (1-based IDs) to the global view,
2974 // which is based off F.SLocEntryBaseID.
2975 if (!F.PreloadSLocEntries.empty()) {
2976 Error("Multiple SOURCE_LOCATION_PRELOADS records in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002977 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002978 }
2979
2980 F.PreloadSLocEntries.swap(Record);
2981 break;
2982 }
2983
2984 case EXT_VECTOR_DECLS:
2985 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2986 ExtVectorDecls.push_back(getGlobalDeclID(F, Record[I]));
2987 break;
2988
2989 case VTABLE_USES:
2990 if (Record.size() % 3 != 0) {
2991 Error("Invalid VTABLE_USES record");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002992 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002993 }
2994
2995 // Later tables overwrite earlier ones.
2996 // FIXME: Modules will have some trouble with this. This is clearly not
2997 // the right way to do this.
2998 VTableUses.clear();
2999
3000 for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) {
3001 VTableUses.push_back(getGlobalDeclID(F, Record[Idx++]));
3002 VTableUses.push_back(
3003 ReadSourceLocation(F, Record, Idx).getRawEncoding());
3004 VTableUses.push_back(Record[Idx++]);
3005 }
3006 break;
3007
3008 case DYNAMIC_CLASSES:
3009 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3010 DynamicClasses.push_back(getGlobalDeclID(F, Record[I]));
3011 break;
3012
3013 case PENDING_IMPLICIT_INSTANTIATIONS:
3014 if (PendingInstantiations.size() % 2 != 0) {
3015 Error("Invalid existing PendingInstantiations");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003016 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003017 }
3018
3019 if (Record.size() % 2 != 0) {
3020 Error("Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003021 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003022 }
3023
3024 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
3025 PendingInstantiations.push_back(getGlobalDeclID(F, Record[I++]));
3026 PendingInstantiations.push_back(
3027 ReadSourceLocation(F, Record, I).getRawEncoding());
3028 }
3029 break;
3030
3031 case SEMA_DECL_REFS:
Richard Smith3d8e97e2013-10-18 06:54:39 +00003032 if (Record.size() != 2) {
3033 Error("Invalid SEMA_DECL_REFS block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003034 return Failure;
Richard Smith3d8e97e2013-10-18 06:54:39 +00003035 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003036 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3037 SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
3038 break;
3039
3040 case PPD_ENTITIES_OFFSETS: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00003041 F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data();
3042 assert(Blob.size() % sizeof(PPEntityOffset) == 0);
3043 F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset);
Guy Benyei11169dd2012-12-18 14:30:41 +00003044
3045 unsigned LocalBasePreprocessedEntityID = Record[0];
3046
3047 unsigned StartingID;
3048 if (!PP.getPreprocessingRecord())
3049 PP.createPreprocessingRecord();
3050 if (!PP.getPreprocessingRecord()->getExternalSource())
3051 PP.getPreprocessingRecord()->SetExternalSource(*this);
3052 StartingID
3053 = PP.getPreprocessingRecord()
3054 ->allocateLoadedEntities(F.NumPreprocessedEntities);
3055 F.BasePreprocessedEntityID = StartingID;
3056
3057 if (F.NumPreprocessedEntities > 0) {
3058 // Introduce the global -> local mapping for preprocessed entities in
3059 // this module.
3060 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
3061
3062 // Introduce the local -> global mapping for preprocessed entities in
3063 // this module.
3064 F.PreprocessedEntityRemap.insertOrReplace(
3065 std::make_pair(LocalBasePreprocessedEntityID,
3066 F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID));
3067 }
3068
3069 break;
3070 }
3071
3072 case DECL_UPDATE_OFFSETS: {
3073 if (Record.size() % 2 != 0) {
3074 Error("invalid DECL_UPDATE_OFFSETS block in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003075 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003076 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00003077 for (unsigned I = 0, N = Record.size(); I != N; I += 2) {
3078 GlobalDeclID ID = getGlobalDeclID(F, Record[I]);
3079 DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I + 1]));
3080
3081 // If we've already loaded the decl, perform the updates when we finish
3082 // loading this block.
3083 if (Decl *D = GetExistingDecl(ID))
3084 PendingUpdateRecords.push_back(std::make_pair(ID, D));
3085 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003086 break;
3087 }
3088
3089 case DECL_REPLACEMENTS: {
3090 if (Record.size() % 3 != 0) {
3091 Error("invalid DECL_REPLACEMENTS block in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003092 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003093 }
3094 for (unsigned I = 0, N = Record.size(); I != N; I += 3)
3095 ReplacedDecls[getGlobalDeclID(F, Record[I])]
3096 = ReplacedDeclInfo(&F, Record[I+1], Record[I+2]);
3097 break;
3098 }
3099
3100 case OBJC_CATEGORIES_MAP: {
3101 if (F.LocalNumObjCCategoriesInMap != 0) {
3102 Error("duplicate OBJC_CATEGORIES_MAP record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003103 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003104 }
3105
3106 F.LocalNumObjCCategoriesInMap = Record[0];
Chris Lattner0e6c9402013-01-20 02:38:54 +00003107 F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003108 break;
3109 }
3110
3111 case OBJC_CATEGORIES:
3112 F.ObjCCategories.swap(Record);
3113 break;
3114
3115 case CXX_BASE_SPECIFIER_OFFSETS: {
3116 if (F.LocalNumCXXBaseSpecifiers != 0) {
3117 Error("duplicate CXX_BASE_SPECIFIER_OFFSETS record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003118 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003119 }
3120
3121 F.LocalNumCXXBaseSpecifiers = Record[0];
Chris Lattner0e6c9402013-01-20 02:38:54 +00003122 F.CXXBaseSpecifiersOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003123 NumCXXBaseSpecifiersLoaded += F.LocalNumCXXBaseSpecifiers;
3124 break;
3125 }
3126
3127 case DIAG_PRAGMA_MAPPINGS:
3128 if (F.PragmaDiagMappings.empty())
3129 F.PragmaDiagMappings.swap(Record);
3130 else
3131 F.PragmaDiagMappings.insert(F.PragmaDiagMappings.end(),
3132 Record.begin(), Record.end());
3133 break;
3134
3135 case CUDA_SPECIAL_DECL_REFS:
3136 // Later tables overwrite earlier ones.
3137 // FIXME: Modules will have trouble with this.
3138 CUDASpecialDeclRefs.clear();
3139 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3140 CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
3141 break;
3142
3143 case HEADER_SEARCH_TABLE: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00003144 F.HeaderFileInfoTableData = Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003145 F.LocalNumHeaderFileInfos = Record[1];
Guy Benyei11169dd2012-12-18 14:30:41 +00003146 if (Record[0]) {
3147 F.HeaderFileInfoTable
3148 = HeaderFileInfoLookupTable::Create(
3149 (const unsigned char *)F.HeaderFileInfoTableData + Record[0],
3150 (const unsigned char *)F.HeaderFileInfoTableData,
3151 HeaderFileInfoTrait(*this, F,
3152 &PP.getHeaderSearchInfo(),
Chris Lattner0e6c9402013-01-20 02:38:54 +00003153 Blob.data() + Record[2]));
Guy Benyei11169dd2012-12-18 14:30:41 +00003154
3155 PP.getHeaderSearchInfo().SetExternalSource(this);
3156 if (!PP.getHeaderSearchInfo().getExternalLookup())
3157 PP.getHeaderSearchInfo().SetExternalLookup(this);
3158 }
3159 break;
3160 }
3161
3162 case FP_PRAGMA_OPTIONS:
3163 // Later tables overwrite earlier ones.
3164 FPPragmaOptions.swap(Record);
3165 break;
3166
3167 case OPENCL_EXTENSIONS:
3168 // Later tables overwrite earlier ones.
3169 OpenCLExtensions.swap(Record);
3170 break;
3171
3172 case TENTATIVE_DEFINITIONS:
3173 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3174 TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I]));
3175 break;
3176
3177 case KNOWN_NAMESPACES:
3178 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3179 KnownNamespaces.push_back(getGlobalDeclID(F, Record[I]));
3180 break;
Nick Lewycky8334af82013-01-26 00:35:08 +00003181
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00003182 case UNDEFINED_BUT_USED:
3183 if (UndefinedButUsed.size() % 2 != 0) {
3184 Error("Invalid existing UndefinedButUsed");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003185 return Failure;
Nick Lewycky8334af82013-01-26 00:35:08 +00003186 }
3187
3188 if (Record.size() % 2 != 0) {
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00003189 Error("invalid undefined-but-used record");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003190 return Failure;
Nick Lewycky8334af82013-01-26 00:35:08 +00003191 }
3192 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00003193 UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++]));
3194 UndefinedButUsed.push_back(
Nick Lewycky8334af82013-01-26 00:35:08 +00003195 ReadSourceLocation(F, Record, I).getRawEncoding());
3196 }
3197 break;
3198
Guy Benyei11169dd2012-12-18 14:30:41 +00003199 case IMPORTED_MODULES: {
3200 if (F.Kind != MK_Module) {
3201 // If we aren't loading a module (which has its own exports), make
3202 // all of the imported modules visible.
3203 // FIXME: Deal with macros-only imports.
Richard Smith56be7542014-03-21 00:33:59 +00003204 for (unsigned I = 0, N = Record.size(); I != N; /**/) {
3205 unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]);
3206 SourceLocation Loc = ReadSourceLocation(F, Record, I);
3207 if (GlobalID)
Aaron Ballman4f45b712014-03-21 15:22:56 +00003208 ImportedModules.push_back(ImportedSubmodule(GlobalID, Loc));
Guy Benyei11169dd2012-12-18 14:30:41 +00003209 }
3210 }
3211 break;
3212 }
3213
3214 case LOCAL_REDECLARATIONS: {
3215 F.RedeclarationChains.swap(Record);
3216 break;
3217 }
3218
3219 case LOCAL_REDECLARATIONS_MAP: {
3220 if (F.LocalNumRedeclarationsInMap != 0) {
3221 Error("duplicate LOCAL_REDECLARATIONS_MAP record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003222 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003223 }
3224
3225 F.LocalNumRedeclarationsInMap = Record[0];
Chris Lattner0e6c9402013-01-20 02:38:54 +00003226 F.RedeclarationsMap = (const LocalRedeclarationsInfo *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003227 break;
3228 }
3229
3230 case MERGED_DECLARATIONS: {
3231 for (unsigned Idx = 0; Idx < Record.size(); /* increment in loop */) {
3232 GlobalDeclID CanonID = getGlobalDeclID(F, Record[Idx++]);
3233 SmallVectorImpl<GlobalDeclID> &Decls = StoredMergedDecls[CanonID];
3234 for (unsigned N = Record[Idx++]; N > 0; --N)
3235 Decls.push_back(getGlobalDeclID(F, Record[Idx++]));
3236 }
3237 break;
3238 }
3239
3240 case MACRO_OFFSET: {
3241 if (F.LocalNumMacros != 0) {
3242 Error("duplicate MACRO_OFFSET record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003243 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003244 }
Chris Lattner0e6c9402013-01-20 02:38:54 +00003245 F.MacroOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003246 F.LocalNumMacros = Record[0];
3247 unsigned LocalBaseMacroID = Record[1];
3248 F.BaseMacroID = getTotalNumMacros();
3249
3250 if (F.LocalNumMacros > 0) {
3251 // Introduce the global -> local mapping for macros within this module.
3252 GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F));
3253
3254 // Introduce the local -> global mapping for macros within this module.
3255 F.MacroRemap.insertOrReplace(
3256 std::make_pair(LocalBaseMacroID,
3257 F.BaseMacroID - LocalBaseMacroID));
3258
3259 MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros);
3260 }
3261 break;
3262 }
3263
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00003264 case MACRO_TABLE: {
3265 // FIXME: Not used yet.
Guy Benyei11169dd2012-12-18 14:30:41 +00003266 break;
3267 }
Richard Smithe40f2ba2013-08-07 21:41:30 +00003268
3269 case LATE_PARSED_TEMPLATE: {
3270 LateParsedTemplates.append(Record.begin(), Record.end());
3271 break;
3272 }
Dario Domizioli13a0a382014-05-23 12:13:25 +00003273
3274 case OPTIMIZE_PRAGMA_OPTIONS:
3275 if (Record.size() != 1) {
3276 Error("invalid pragma optimize record");
3277 return Failure;
3278 }
3279 OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]);
3280 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00003281 }
3282 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003283}
3284
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003285ASTReader::ASTReadResult
3286ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F,
3287 const ModuleFile *ImportedBy,
3288 unsigned ClientLoadCapabilities) {
3289 unsigned Idx = 0;
3290 F.ModuleMapPath = ReadString(Record, Idx);
3291
3292 // Try to resolve ModuleName in the current header search context and
3293 // verify that it is found in the same module map file as we saved. If the
3294 // top-level AST file is a main file, skip this check because there is no
3295 // usable header search context.
3296 assert(!F.ModuleName.empty() &&
3297 "MODULE_NAME should come before MOUDLE_MAP_FILE");
3298 if (F.Kind == MK_Module && (*ModuleMgr.begin())->Kind != MK_MainFile) {
3299 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName);
3300 if (!M) {
3301 assert(ImportedBy && "top-level import should be verified");
3302 if ((ClientLoadCapabilities & ARR_Missing) == 0)
3303 Diag(diag::err_imported_module_not_found)
3304 << F.ModuleName << ImportedBy->FileName;
3305 return Missing;
3306 }
3307
3308 // Check the primary module map file.
3309 auto &Map = PP.getHeaderSearchInfo().getModuleMap();
3310 const FileEntry *StoredModMap = FileMgr.getFile(F.ModuleMapPath);
3311 const FileEntry *ModMap = Map.getModuleMapFileForUniquing(M);
3312 if (StoredModMap == nullptr || StoredModMap != ModMap) {
3313 assert(ModMap && "found module is missing module map file");
3314 assert(M->Name == F.ModuleName && "found module with different name");
3315 assert(ImportedBy && "top-level import should be verified");
3316 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3317 Diag(diag::err_imported_module_modmap_changed)
3318 << F.ModuleName << ImportedBy->FileName
3319 << ModMap->getName() << F.ModuleMapPath;
3320 return OutOfDate;
3321 }
3322
3323 llvm::SmallPtrSet<const FileEntry *, 1> AdditionalStoredMaps;
3324 for (unsigned I = 0, N = Record[Idx++]; I < N; ++I) {
3325 // FIXME: we should use input files rather than storing names.
3326 std::string Filename = ReadString(Record, Idx);
3327 const FileEntry *F =
3328 FileMgr.getFile(Filename, false, false);
3329 if (F == nullptr) {
3330 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3331 Error("could not find file '" + Filename +"' referenced by AST file");
3332 return OutOfDate;
3333 }
3334 AdditionalStoredMaps.insert(F);
3335 }
3336
3337 // Check any additional module map files (e.g. module.private.modulemap)
3338 // that are not in the pcm.
3339 if (auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) {
3340 for (const FileEntry *ModMap : *AdditionalModuleMaps) {
3341 // Remove files that match
3342 // Note: SmallPtrSet::erase is really remove
3343 if (!AdditionalStoredMaps.erase(ModMap)) {
3344 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3345 Diag(diag::err_module_different_modmap)
3346 << F.ModuleName << /*new*/0 << ModMap->getName();
3347 return OutOfDate;
3348 }
3349 }
3350 }
3351
3352 // Check any additional module map files that are in the pcm, but not
3353 // found in header search. Cases that match are already removed.
3354 for (const FileEntry *ModMap : AdditionalStoredMaps) {
3355 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3356 Diag(diag::err_module_different_modmap)
3357 << F.ModuleName << /*not new*/1 << ModMap->getName();
3358 return OutOfDate;
3359 }
3360 }
3361
3362 if (Listener)
3363 Listener->ReadModuleMapFile(F.ModuleMapPath);
3364 return Success;
3365}
3366
3367
Douglas Gregorc1489562013-02-12 23:36:21 +00003368/// \brief Move the given method to the back of the global list of methods.
3369static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) {
3370 // Find the entry for this selector in the method pool.
3371 Sema::GlobalMethodPool::iterator Known
3372 = S.MethodPool.find(Method->getSelector());
3373 if (Known == S.MethodPool.end())
3374 return;
3375
3376 // Retrieve the appropriate method list.
3377 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
3378 : Known->second.second;
3379 bool Found = false;
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00003380 for (ObjCMethodList *List = &Start; List; List = List->getNext()) {
Douglas Gregorc1489562013-02-12 23:36:21 +00003381 if (!Found) {
3382 if (List->Method == Method) {
3383 Found = true;
3384 } else {
3385 // Keep searching.
3386 continue;
3387 }
3388 }
3389
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00003390 if (List->getNext())
3391 List->Method = List->getNext()->Method;
Douglas Gregorc1489562013-02-12 23:36:21 +00003392 else
3393 List->Method = Method;
3394 }
3395}
3396
Richard Smithe657bbd2014-07-18 22:13:40 +00003397void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner,
3398 bool FromFinalization) {
3399 // FIXME: Only do this if Owner->NameVisibility == AllVisible.
Richard Smith57721ac2014-07-21 04:10:40 +00003400 for (Decl *D : Names.HiddenDecls) {
Richard Smith49f906a2014-03-01 00:08:04 +00003401 bool wasHidden = D->Hidden;
3402 D->Hidden = false;
Guy Benyei11169dd2012-12-18 14:30:41 +00003403
Richard Smith49f906a2014-03-01 00:08:04 +00003404 if (wasHidden && SemaObj) {
3405 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) {
3406 moveMethodToBackOfGlobalList(*SemaObj, Method);
Douglas Gregorc1489562013-02-12 23:36:21 +00003407 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003408 }
3409 }
Richard Smith49f906a2014-03-01 00:08:04 +00003410
Richard Smithe657bbd2014-07-18 22:13:40 +00003411 assert((FromFinalization || Owner->NameVisibility >= Module::MacrosVisible) &&
3412 "nothing to make visible?");
Richard Smithdaa69e02014-07-25 04:40:03 +00003413 for (const auto &Macro : Names.HiddenMacros) {
3414 if (FromFinalization)
3415 PP.appendMacroDirective(Macro.first,
3416 Macro.second->import(PP, SourceLocation()));
3417 else
3418 installImportedMacro(Macro.first, Macro.second, Owner);
3419 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003420}
3421
Richard Smith49f906a2014-03-01 00:08:04 +00003422void ASTReader::makeModuleVisible(Module *Mod,
Argyrios Kyrtzidis125df052013-02-01 16:36:12 +00003423 Module::NameVisibilityKind NameVisibility,
Douglas Gregorfb912652013-03-20 21:10:35 +00003424 SourceLocation ImportLoc,
3425 bool Complain) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003426 llvm::SmallPtrSet<Module *, 4> Visited;
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003427 SmallVector<Module *, 4> Stack;
Robert Wilhelm25284cc2013-08-23 16:11:15 +00003428 Stack.push_back(Mod);
Guy Benyei11169dd2012-12-18 14:30:41 +00003429 while (!Stack.empty()) {
Robert Wilhelm25284cc2013-08-23 16:11:15 +00003430 Mod = Stack.pop_back_val();
Guy Benyei11169dd2012-12-18 14:30:41 +00003431
3432 if (NameVisibility <= Mod->NameVisibility) {
Robert Wilhelm25284cc2013-08-23 16:11:15 +00003433 // This module already has this level of visibility (or greater), so
Guy Benyei11169dd2012-12-18 14:30:41 +00003434 // there is nothing more to do.
3435 continue;
3436 }
Richard Smith49f906a2014-03-01 00:08:04 +00003437
Guy Benyei11169dd2012-12-18 14:30:41 +00003438 if (!Mod->isAvailable()) {
3439 // Modules that aren't available cannot be made visible.
3440 continue;
3441 }
3442
3443 // Update the module's name visibility.
Richard Smith49f906a2014-03-01 00:08:04 +00003444 if (NameVisibility >= Module::MacrosVisible &&
3445 Mod->NameVisibility < Module::MacrosVisible)
3446 Mod->MacroVisibilityLoc = ImportLoc;
Guy Benyei11169dd2012-12-18 14:30:41 +00003447 Mod->NameVisibility = NameVisibility;
Richard Smith49f906a2014-03-01 00:08:04 +00003448
Guy Benyei11169dd2012-12-18 14:30:41 +00003449 // If we've already deserialized any names from this module,
3450 // mark them as visible.
3451 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
3452 if (Hidden != HiddenNamesMap.end()) {
Richard Smith57721ac2014-07-21 04:10:40 +00003453 auto HiddenNames = std::move(*Hidden);
Guy Benyei11169dd2012-12-18 14:30:41 +00003454 HiddenNamesMap.erase(Hidden);
Richard Smith57721ac2014-07-21 04:10:40 +00003455 makeNamesVisible(HiddenNames.second, HiddenNames.first,
3456 /*FromFinalization*/false);
3457 assert(HiddenNamesMap.find(Mod) == HiddenNamesMap.end() &&
3458 "making names visible added hidden names");
Guy Benyei11169dd2012-12-18 14:30:41 +00003459 }
Dmitri Gribenkoe9bcf5b2013-11-04 21:51:33 +00003460
Guy Benyei11169dd2012-12-18 14:30:41 +00003461 // Push any exported modules onto the stack to be marked as visible.
Argyrios Kyrtzidis8739f7b2013-02-19 19:34:40 +00003462 SmallVector<Module *, 16> Exports;
3463 Mod->getExportedModules(Exports);
3464 for (SmallVectorImpl<Module *>::iterator
3465 I = Exports.begin(), E = Exports.end(); I != E; ++I) {
3466 Module *Exported = *I;
3467 if (Visited.insert(Exported))
3468 Stack.push_back(Exported);
Guy Benyei11169dd2012-12-18 14:30:41 +00003469 }
Douglas Gregorfb912652013-03-20 21:10:35 +00003470
3471 // Detect any conflicts.
3472 if (Complain) {
3473 assert(ImportLoc.isValid() && "Missing import location");
3474 for (unsigned I = 0, N = Mod->Conflicts.size(); I != N; ++I) {
3475 if (Mod->Conflicts[I].Other->NameVisibility >= NameVisibility) {
3476 Diag(ImportLoc, diag::warn_module_conflict)
3477 << Mod->getFullModuleName()
3478 << Mod->Conflicts[I].Other->getFullModuleName()
3479 << Mod->Conflicts[I].Message;
3480 // FIXME: Need note where the other module was imported.
3481 }
3482 }
3483 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003484 }
3485}
3486
Douglas Gregore060e572013-01-25 01:03:03 +00003487bool ASTReader::loadGlobalIndex() {
3488 if (GlobalIndex)
3489 return false;
3490
3491 if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
3492 !Context.getLangOpts().Modules)
3493 return true;
3494
3495 // Try to load the global index.
3496 TriedLoadingGlobalIndex = true;
3497 StringRef ModuleCachePath
3498 = getPreprocessor().getHeaderSearchInfo().getModuleCachePath();
3499 std::pair<GlobalModuleIndex *, GlobalModuleIndex::ErrorCode> Result
Douglas Gregor7029ce12013-03-19 00:28:20 +00003500 = GlobalModuleIndex::readIndex(ModuleCachePath);
Douglas Gregore060e572013-01-25 01:03:03 +00003501 if (!Result.first)
3502 return true;
3503
3504 GlobalIndex.reset(Result.first);
Douglas Gregor7211ac12013-01-25 23:32:03 +00003505 ModuleMgr.setGlobalIndex(GlobalIndex.get());
Douglas Gregore060e572013-01-25 01:03:03 +00003506 return false;
3507}
3508
3509bool ASTReader::isGlobalIndexUnavailable() const {
3510 return Context.getLangOpts().Modules && UseGlobalIndex &&
3511 !hasGlobalIndex() && TriedLoadingGlobalIndex;
3512}
3513
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003514static void updateModuleTimestamp(ModuleFile &MF) {
3515 // Overwrite the timestamp file contents so that file's mtime changes.
3516 std::string TimestampFilename = MF.getTimestampFilename();
3517 std::string ErrorInfo;
Rafael Espindola04a13be2014-02-24 15:06:52 +00003518 llvm::raw_fd_ostream OS(TimestampFilename.c_str(), ErrorInfo,
Rafael Espindola4fbd3732014-02-24 18:20:21 +00003519 llvm::sys::fs::F_Text);
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003520 if (!ErrorInfo.empty())
3521 return;
3522 OS << "Timestamp file\n";
3523}
3524
Guy Benyei11169dd2012-12-18 14:30:41 +00003525ASTReader::ASTReadResult ASTReader::ReadAST(const std::string &FileName,
3526 ModuleKind Type,
3527 SourceLocation ImportLoc,
3528 unsigned ClientLoadCapabilities) {
Argyrios Kyrtzidisdc9fdaf2013-05-24 05:44:08 +00003529 llvm::SaveAndRestore<SourceLocation>
3530 SetCurImportLocRAII(CurrentImportLoc, ImportLoc);
3531
Richard Smithd1c46742014-04-30 02:24:17 +00003532 // Defer any pending actions until we get to the end of reading the AST file.
3533 Deserializing AnASTFile(this);
3534
Guy Benyei11169dd2012-12-18 14:30:41 +00003535 // Bump the generation number.
Richard Smith053f6c62014-05-16 23:01:30 +00003536 unsigned PreviousGeneration = incrementGeneration(Context);
Guy Benyei11169dd2012-12-18 14:30:41 +00003537
3538 unsigned NumModules = ModuleMgr.size();
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003539 SmallVector<ImportedModule, 4> Loaded;
Guy Benyei11169dd2012-12-18 14:30:41 +00003540 switch(ASTReadResult ReadResult = ReadASTCore(FileName, Type, ImportLoc,
Craig Toppera13603a2014-05-22 05:54:18 +00003541 /*ImportedBy=*/nullptr, Loaded,
Douglas Gregor7029ce12013-03-19 00:28:20 +00003542 0, 0,
Guy Benyei11169dd2012-12-18 14:30:41 +00003543 ClientLoadCapabilities)) {
3544 case Failure:
Douglas Gregor7029ce12013-03-19 00:28:20 +00003545 case Missing:
Guy Benyei11169dd2012-12-18 14:30:41 +00003546 case OutOfDate:
3547 case VersionMismatch:
3548 case ConfigurationMismatch:
Ben Langmuir9801b252014-06-20 00:24:56 +00003549 case HadErrors: {
3550 llvm::SmallPtrSet<ModuleFile *, 4> LoadedSet;
3551 for (const ImportedModule &IM : Loaded)
3552 LoadedSet.insert(IM.Mod);
3553
Douglas Gregor7029ce12013-03-19 00:28:20 +00003554 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, ModuleMgr.end(),
Ben Langmuir9801b252014-06-20 00:24:56 +00003555 LoadedSet,
Douglas Gregor7029ce12013-03-19 00:28:20 +00003556 Context.getLangOpts().Modules
3557 ? &PP.getHeaderSearchInfo().getModuleMap()
Craig Toppera13603a2014-05-22 05:54:18 +00003558 : nullptr);
Douglas Gregore060e572013-01-25 01:03:03 +00003559
3560 // If we find that any modules are unusable, the global index is going
3561 // to be out-of-date. Just remove it.
3562 GlobalIndex.reset();
Craig Toppera13603a2014-05-22 05:54:18 +00003563 ModuleMgr.setGlobalIndex(nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00003564 return ReadResult;
Ben Langmuir9801b252014-06-20 00:24:56 +00003565 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003566 case Success:
3567 break;
3568 }
3569
3570 // Here comes stuff that we only do once the entire chain is loaded.
3571
3572 // Load the AST blocks of all of the modules that we loaded.
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003573 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
3574 MEnd = Loaded.end();
Guy Benyei11169dd2012-12-18 14:30:41 +00003575 M != MEnd; ++M) {
3576 ModuleFile &F = *M->Mod;
3577
3578 // Read the AST block.
Ben Langmuir2c9af442014-04-10 17:57:43 +00003579 if (ASTReadResult Result = ReadASTBlock(F, ClientLoadCapabilities))
3580 return Result;
Guy Benyei11169dd2012-12-18 14:30:41 +00003581
3582 // Once read, set the ModuleFile bit base offset and update the size in
3583 // bits of all files we've seen.
3584 F.GlobalBitOffset = TotalModulesSizeInBits;
3585 TotalModulesSizeInBits += F.SizeInBits;
3586 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F));
3587
3588 // Preload SLocEntries.
3589 for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) {
3590 int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID;
3591 // Load it through the SourceManager and don't call ReadSLocEntry()
3592 // directly because the entry may have already been loaded in which case
3593 // calling ReadSLocEntry() directly would trigger an assertion in
3594 // SourceManager.
3595 SourceMgr.getLoadedSLocEntryByID(Index);
3596 }
3597 }
3598
Douglas Gregor603cd862013-03-22 18:50:14 +00003599 // Setup the import locations and notify the module manager that we've
3600 // committed to these module files.
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003601 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
3602 MEnd = Loaded.end();
Guy Benyei11169dd2012-12-18 14:30:41 +00003603 M != MEnd; ++M) {
3604 ModuleFile &F = *M->Mod;
Douglas Gregor603cd862013-03-22 18:50:14 +00003605
3606 ModuleMgr.moduleFileAccepted(&F);
3607
3608 // Set the import location.
Argyrios Kyrtzidis71c1af82013-02-01 16:36:14 +00003609 F.DirectImportLoc = ImportLoc;
Guy Benyei11169dd2012-12-18 14:30:41 +00003610 if (!M->ImportedBy)
3611 F.ImportLoc = M->ImportLoc;
3612 else
3613 F.ImportLoc = ReadSourceLocation(*M->ImportedBy,
3614 M->ImportLoc.getRawEncoding());
3615 }
3616
3617 // Mark all of the identifiers in the identifier table as being out of date,
3618 // so that various accessors know to check the loaded modules when the
3619 // identifier is used.
3620 for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(),
3621 IdEnd = PP.getIdentifierTable().end();
3622 Id != IdEnd; ++Id)
3623 Id->second->setOutOfDate(true);
3624
3625 // Resolve any unresolved module exports.
Douglas Gregorfb912652013-03-20 21:10:35 +00003626 for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) {
3627 UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I];
Guy Benyei11169dd2012-12-18 14:30:41 +00003628 SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID);
3629 Module *ResolvedMod = getSubmodule(GlobalID);
Douglas Gregorfb912652013-03-20 21:10:35 +00003630
3631 switch (Unresolved.Kind) {
3632 case UnresolvedModuleRef::Conflict:
3633 if (ResolvedMod) {
3634 Module::Conflict Conflict;
3635 Conflict.Other = ResolvedMod;
3636 Conflict.Message = Unresolved.String.str();
3637 Unresolved.Mod->Conflicts.push_back(Conflict);
3638 }
3639 continue;
3640
3641 case UnresolvedModuleRef::Import:
Guy Benyei11169dd2012-12-18 14:30:41 +00003642 if (ResolvedMod)
3643 Unresolved.Mod->Imports.push_back(ResolvedMod);
3644 continue;
Guy Benyei11169dd2012-12-18 14:30:41 +00003645
Douglas Gregorfb912652013-03-20 21:10:35 +00003646 case UnresolvedModuleRef::Export:
3647 if (ResolvedMod || Unresolved.IsWildcard)
3648 Unresolved.Mod->Exports.push_back(
3649 Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard));
3650 continue;
3651 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003652 }
Douglas Gregorfb912652013-03-20 21:10:35 +00003653 UnresolvedModuleRefs.clear();
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003654
3655 // FIXME: How do we load the 'use'd modules? They may not be submodules.
3656 // Might be unnecessary as use declarations are only used to build the
3657 // module itself.
Guy Benyei11169dd2012-12-18 14:30:41 +00003658
3659 InitializeContext();
3660
Richard Smith3d8e97e2013-10-18 06:54:39 +00003661 if (SemaObj)
3662 UpdateSema();
3663
Guy Benyei11169dd2012-12-18 14:30:41 +00003664 if (DeserializationListener)
3665 DeserializationListener->ReaderInitialized(this);
3666
3667 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
3668 if (!PrimaryModule.OriginalSourceFileID.isInvalid()) {
3669 PrimaryModule.OriginalSourceFileID
3670 = FileID::get(PrimaryModule.SLocEntryBaseID
3671 + PrimaryModule.OriginalSourceFileID.getOpaqueValue() - 1);
3672
3673 // If this AST file is a precompiled preamble, then set the
3674 // preamble file ID of the source manager to the file source file
3675 // from which the preamble was built.
3676 if (Type == MK_Preamble) {
3677 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID);
3678 } else if (Type == MK_MainFile) {
3679 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID);
3680 }
3681 }
3682
3683 // For any Objective-C class definitions we have already loaded, make sure
3684 // that we load any additional categories.
3685 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
3686 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
3687 ObjCClassesLoaded[I],
3688 PreviousGeneration);
3689 }
Douglas Gregore060e572013-01-25 01:03:03 +00003690
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003691 if (PP.getHeaderSearchInfo()
3692 .getHeaderSearchOpts()
3693 .ModulesValidateOncePerBuildSession) {
3694 // Now we are certain that the module and all modules it depends on are
3695 // up to date. Create or update timestamp files for modules that are
3696 // located in the module cache (not for PCH files that could be anywhere
3697 // in the filesystem).
3698 for (unsigned I = 0, N = Loaded.size(); I != N; ++I) {
3699 ImportedModule &M = Loaded[I];
3700 if (M.Mod->Kind == MK_Module) {
3701 updateModuleTimestamp(*M.Mod);
3702 }
3703 }
3704 }
3705
Guy Benyei11169dd2012-12-18 14:30:41 +00003706 return Success;
3707}
3708
3709ASTReader::ASTReadResult
3710ASTReader::ReadASTCore(StringRef FileName,
3711 ModuleKind Type,
3712 SourceLocation ImportLoc,
3713 ModuleFile *ImportedBy,
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003714 SmallVectorImpl<ImportedModule> &Loaded,
Douglas Gregor7029ce12013-03-19 00:28:20 +00003715 off_t ExpectedSize, time_t ExpectedModTime,
Guy Benyei11169dd2012-12-18 14:30:41 +00003716 unsigned ClientLoadCapabilities) {
3717 ModuleFile *M;
Guy Benyei11169dd2012-12-18 14:30:41 +00003718 std::string ErrorStr;
Douglas Gregor7029ce12013-03-19 00:28:20 +00003719 ModuleManager::AddModuleResult AddResult
3720 = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy,
Richard Smith053f6c62014-05-16 23:01:30 +00003721 getGeneration(), ExpectedSize, ExpectedModTime,
Douglas Gregor7029ce12013-03-19 00:28:20 +00003722 M, ErrorStr);
Guy Benyei11169dd2012-12-18 14:30:41 +00003723
Douglas Gregor7029ce12013-03-19 00:28:20 +00003724 switch (AddResult) {
3725 case ModuleManager::AlreadyLoaded:
3726 return Success;
3727
3728 case ModuleManager::NewlyLoaded:
3729 // Load module file below.
3730 break;
3731
3732 case ModuleManager::Missing:
3733 // The module file was missing; if the client handle handle, that, return
3734 // it.
3735 if (ClientLoadCapabilities & ARR_Missing)
3736 return Missing;
3737
3738 // Otherwise, return an error.
3739 {
3740 std::string Msg = "Unable to load module \"" + FileName.str() + "\": "
3741 + ErrorStr;
3742 Error(Msg);
3743 }
3744 return Failure;
3745
3746 case ModuleManager::OutOfDate:
3747 // We couldn't load the module file because it is out-of-date. If the
3748 // client can handle out-of-date, return it.
3749 if (ClientLoadCapabilities & ARR_OutOfDate)
3750 return OutOfDate;
3751
3752 // Otherwise, return an error.
3753 {
3754 std::string Msg = "Unable to load module \"" + FileName.str() + "\": "
3755 + ErrorStr;
3756 Error(Msg);
3757 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003758 return Failure;
3759 }
3760
Douglas Gregor7029ce12013-03-19 00:28:20 +00003761 assert(M && "Missing module file");
Guy Benyei11169dd2012-12-18 14:30:41 +00003762
3763 // FIXME: This seems rather a hack. Should CurrentDir be part of the
3764 // module?
3765 if (FileName != "-") {
3766 CurrentDir = llvm::sys::path::parent_path(FileName);
3767 if (CurrentDir.empty()) CurrentDir = ".";
3768 }
3769
3770 ModuleFile &F = *M;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00003771 BitstreamCursor &Stream = F.Stream;
Guy Benyei11169dd2012-12-18 14:30:41 +00003772 Stream.init(F.StreamFile);
3773 F.SizeInBits = F.Buffer->getBufferSize() * 8;
3774
3775 // Sniff for the signature.
3776 if (Stream.Read(8) != 'C' ||
3777 Stream.Read(8) != 'P' ||
3778 Stream.Read(8) != 'C' ||
3779 Stream.Read(8) != 'H') {
3780 Diag(diag::err_not_a_pch_file) << FileName;
3781 return Failure;
3782 }
3783
3784 // This is used for compatibility with older PCH formats.
3785 bool HaveReadControlBlock = false;
3786
Chris Lattnerefa77172013-01-20 00:00:22 +00003787 while (1) {
3788 llvm::BitstreamEntry Entry = Stream.advance();
3789
3790 switch (Entry.Kind) {
3791 case llvm::BitstreamEntry::Error:
3792 case llvm::BitstreamEntry::EndBlock:
3793 case llvm::BitstreamEntry::Record:
Guy Benyei11169dd2012-12-18 14:30:41 +00003794 Error("invalid record at top-level of AST file");
3795 return Failure;
Chris Lattnerefa77172013-01-20 00:00:22 +00003796
3797 case llvm::BitstreamEntry::SubBlock:
3798 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00003799 }
3800
Guy Benyei11169dd2012-12-18 14:30:41 +00003801 // We only know the control subblock ID.
Chris Lattnerefa77172013-01-20 00:00:22 +00003802 switch (Entry.ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003803 case llvm::bitc::BLOCKINFO_BLOCK_ID:
3804 if (Stream.ReadBlockInfoBlock()) {
3805 Error("malformed BlockInfoBlock in AST file");
3806 return Failure;
3807 }
3808 break;
3809 case CONTROL_BLOCK_ID:
3810 HaveReadControlBlock = true;
Ben Langmuirbeee15e2014-04-14 18:00:01 +00003811 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003812 case Success:
3813 break;
3814
3815 case Failure: return Failure;
Douglas Gregor7029ce12013-03-19 00:28:20 +00003816 case Missing: return Missing;
Guy Benyei11169dd2012-12-18 14:30:41 +00003817 case OutOfDate: return OutOfDate;
3818 case VersionMismatch: return VersionMismatch;
3819 case ConfigurationMismatch: return ConfigurationMismatch;
3820 case HadErrors: return HadErrors;
3821 }
3822 break;
3823 case AST_BLOCK_ID:
3824 if (!HaveReadControlBlock) {
3825 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
Dmitri Gribenko2228cd32014-02-11 15:40:09 +00003826 Diag(diag::err_pch_version_too_old);
Guy Benyei11169dd2012-12-18 14:30:41 +00003827 return VersionMismatch;
3828 }
3829
3830 // Record that we've loaded this module.
3831 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc));
3832 return Success;
3833
3834 default:
3835 if (Stream.SkipBlock()) {
3836 Error("malformed block record in AST file");
3837 return Failure;
3838 }
3839 break;
3840 }
3841 }
3842
3843 return Success;
3844}
3845
3846void ASTReader::InitializeContext() {
3847 // If there's a listener, notify them that we "read" the translation unit.
3848 if (DeserializationListener)
3849 DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID,
3850 Context.getTranslationUnitDecl());
3851
Guy Benyei11169dd2012-12-18 14:30:41 +00003852 // FIXME: Find a better way to deal with collisions between these
3853 // built-in types. Right now, we just ignore the problem.
3854
3855 // Load the special types.
3856 if (SpecialTypes.size() >= NumSpecialTypeIDs) {
3857 if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) {
3858 if (!Context.CFConstantStringTypeDecl)
3859 Context.setCFConstantStringType(GetType(String));
3860 }
3861
3862 if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) {
3863 QualType FileType = GetType(File);
3864 if (FileType.isNull()) {
3865 Error("FILE type is NULL");
3866 return;
3867 }
3868
3869 if (!Context.FILEDecl) {
3870 if (const TypedefType *Typedef = FileType->getAs<TypedefType>())
3871 Context.setFILEDecl(Typedef->getDecl());
3872 else {
3873 const TagType *Tag = FileType->getAs<TagType>();
3874 if (!Tag) {
3875 Error("Invalid FILE type in AST file");
3876 return;
3877 }
3878 Context.setFILEDecl(Tag->getDecl());
3879 }
3880 }
3881 }
3882
3883 if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) {
3884 QualType Jmp_bufType = GetType(Jmp_buf);
3885 if (Jmp_bufType.isNull()) {
3886 Error("jmp_buf type is NULL");
3887 return;
3888 }
3889
3890 if (!Context.jmp_bufDecl) {
3891 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>())
3892 Context.setjmp_bufDecl(Typedef->getDecl());
3893 else {
3894 const TagType *Tag = Jmp_bufType->getAs<TagType>();
3895 if (!Tag) {
3896 Error("Invalid jmp_buf type in AST file");
3897 return;
3898 }
3899 Context.setjmp_bufDecl(Tag->getDecl());
3900 }
3901 }
3902 }
3903
3904 if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) {
3905 QualType Sigjmp_bufType = GetType(Sigjmp_buf);
3906 if (Sigjmp_bufType.isNull()) {
3907 Error("sigjmp_buf type is NULL");
3908 return;
3909 }
3910
3911 if (!Context.sigjmp_bufDecl) {
3912 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>())
3913 Context.setsigjmp_bufDecl(Typedef->getDecl());
3914 else {
3915 const TagType *Tag = Sigjmp_bufType->getAs<TagType>();
3916 assert(Tag && "Invalid sigjmp_buf type in AST file");
3917 Context.setsigjmp_bufDecl(Tag->getDecl());
3918 }
3919 }
3920 }
3921
3922 if (unsigned ObjCIdRedef
3923 = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) {
3924 if (Context.ObjCIdRedefinitionType.isNull())
3925 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef);
3926 }
3927
3928 if (unsigned ObjCClassRedef
3929 = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) {
3930 if (Context.ObjCClassRedefinitionType.isNull())
3931 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef);
3932 }
3933
3934 if (unsigned ObjCSelRedef
3935 = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) {
3936 if (Context.ObjCSelRedefinitionType.isNull())
3937 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef);
3938 }
3939
3940 if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) {
3941 QualType Ucontext_tType = GetType(Ucontext_t);
3942 if (Ucontext_tType.isNull()) {
3943 Error("ucontext_t type is NULL");
3944 return;
3945 }
3946
3947 if (!Context.ucontext_tDecl) {
3948 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>())
3949 Context.setucontext_tDecl(Typedef->getDecl());
3950 else {
3951 const TagType *Tag = Ucontext_tType->getAs<TagType>();
3952 assert(Tag && "Invalid ucontext_t type in AST file");
3953 Context.setucontext_tDecl(Tag->getDecl());
3954 }
3955 }
3956 }
3957 }
3958
3959 ReadPragmaDiagnosticMappings(Context.getDiagnostics());
3960
3961 // If there were any CUDA special declarations, deserialize them.
3962 if (!CUDASpecialDeclRefs.empty()) {
3963 assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!");
3964 Context.setcudaConfigureCallDecl(
3965 cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0])));
3966 }
Richard Smith56be7542014-03-21 00:33:59 +00003967
Guy Benyei11169dd2012-12-18 14:30:41 +00003968 // Re-export any modules that were imported by a non-module AST file.
Richard Smith56be7542014-03-21 00:33:59 +00003969 // FIXME: This does not make macro-only imports visible again. It also doesn't
3970 // make #includes mapped to module imports visible.
3971 for (auto &Import : ImportedModules) {
3972 if (Module *Imported = getSubmodule(Import.ID))
Argyrios Kyrtzidis125df052013-02-01 16:36:12 +00003973 makeModuleVisible(Imported, Module::AllVisible,
Richard Smith56be7542014-03-21 00:33:59 +00003974 /*ImportLoc=*/Import.ImportLoc,
Douglas Gregorfb912652013-03-20 21:10:35 +00003975 /*Complain=*/false);
Guy Benyei11169dd2012-12-18 14:30:41 +00003976 }
3977 ImportedModules.clear();
3978}
3979
3980void ASTReader::finalizeForWriting() {
Richard Smith57721ac2014-07-21 04:10:40 +00003981 while (!HiddenNamesMap.empty()) {
3982 auto HiddenNames = std::move(*HiddenNamesMap.begin());
3983 HiddenNamesMap.erase(HiddenNamesMap.begin());
3984 makeNamesVisible(HiddenNames.second, HiddenNames.first,
3985 /*FromFinalization*/true);
Guy Benyei11169dd2012-12-18 14:30:41 +00003986 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003987}
3988
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00003989/// \brief Given a cursor at the start of an AST file, scan ahead and drop the
3990/// cursor into the start of the given block ID, returning false on success and
3991/// true on failure.
3992static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00003993 while (1) {
3994 llvm::BitstreamEntry Entry = Cursor.advance();
3995 switch (Entry.Kind) {
3996 case llvm::BitstreamEntry::Error:
3997 case llvm::BitstreamEntry::EndBlock:
3998 return true;
3999
4000 case llvm::BitstreamEntry::Record:
4001 // Ignore top-level records.
4002 Cursor.skipRecord(Entry.ID);
4003 break;
4004
4005 case llvm::BitstreamEntry::SubBlock:
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004006 if (Entry.ID == BlockID) {
4007 if (Cursor.EnterSubBlock(BlockID))
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004008 return true;
4009 // Found it!
4010 return false;
4011 }
4012
4013 if (Cursor.SkipBlock())
4014 return true;
4015 }
4016 }
4017}
4018
Guy Benyei11169dd2012-12-18 14:30:41 +00004019/// \brief Retrieve the name of the original source file name
4020/// directly from the AST file, without actually loading the AST
4021/// file.
4022std::string ASTReader::getOriginalSourceFile(const std::string &ASTFileName,
4023 FileManager &FileMgr,
4024 DiagnosticsEngine &Diags) {
4025 // Open the AST file.
4026 std::string ErrStr;
Ahmed Charlesb8984322014-03-07 20:03:18 +00004027 std::unique_ptr<llvm::MemoryBuffer> Buffer;
Guy Benyei11169dd2012-12-18 14:30:41 +00004028 Buffer.reset(FileMgr.getBufferForFile(ASTFileName, &ErrStr));
4029 if (!Buffer) {
4030 Diags.Report(diag::err_fe_unable_to_read_pch_file) << ASTFileName << ErrStr;
4031 return std::string();
4032 }
4033
4034 // Initialize the stream
4035 llvm::BitstreamReader StreamFile;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004036 BitstreamCursor Stream;
Guy Benyei11169dd2012-12-18 14:30:41 +00004037 StreamFile.init((const unsigned char *)Buffer->getBufferStart(),
4038 (const unsigned char *)Buffer->getBufferEnd());
4039 Stream.init(StreamFile);
4040
4041 // Sniff for the signature.
4042 if (Stream.Read(8) != 'C' ||
4043 Stream.Read(8) != 'P' ||
4044 Stream.Read(8) != 'C' ||
4045 Stream.Read(8) != 'H') {
4046 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName;
4047 return std::string();
4048 }
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004049
Chris Lattnere7b154b2013-01-19 21:39:22 +00004050 // Scan for the CONTROL_BLOCK_ID block.
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004051 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004052 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
4053 return std::string();
Chris Lattnere7b154b2013-01-19 21:39:22 +00004054 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004055
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004056 // Scan for ORIGINAL_FILE inside the control block.
4057 RecordData Record;
Chris Lattnere7b154b2013-01-19 21:39:22 +00004058 while (1) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004059 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
Chris Lattnere7b154b2013-01-19 21:39:22 +00004060 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
4061 return std::string();
4062
4063 if (Entry.Kind != llvm::BitstreamEntry::Record) {
4064 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
4065 return std::string();
Guy Benyei11169dd2012-12-18 14:30:41 +00004066 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00004067
Guy Benyei11169dd2012-12-18 14:30:41 +00004068 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00004069 StringRef Blob;
4070 if (Stream.readRecord(Entry.ID, Record, &Blob) == ORIGINAL_FILE)
4071 return Blob.str();
Guy Benyei11169dd2012-12-18 14:30:41 +00004072 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004073}
4074
4075namespace {
4076 class SimplePCHValidator : public ASTReaderListener {
4077 const LangOptions &ExistingLangOpts;
4078 const TargetOptions &ExistingTargetOpts;
4079 const PreprocessorOptions &ExistingPPOpts;
4080 FileManager &FileMgr;
4081
4082 public:
4083 SimplePCHValidator(const LangOptions &ExistingLangOpts,
4084 const TargetOptions &ExistingTargetOpts,
4085 const PreprocessorOptions &ExistingPPOpts,
4086 FileManager &FileMgr)
4087 : ExistingLangOpts(ExistingLangOpts),
4088 ExistingTargetOpts(ExistingTargetOpts),
4089 ExistingPPOpts(ExistingPPOpts),
4090 FileMgr(FileMgr)
4091 {
4092 }
4093
Craig Topper3e89dfe2014-03-13 02:13:41 +00004094 bool ReadLanguageOptions(const LangOptions &LangOpts,
4095 bool Complain) override {
Craig Toppera13603a2014-05-22 05:54:18 +00004096 return checkLanguageOptions(ExistingLangOpts, LangOpts, nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00004097 }
Craig Topper3e89dfe2014-03-13 02:13:41 +00004098 bool ReadTargetOptions(const TargetOptions &TargetOpts,
4099 bool Complain) override {
Craig Toppera13603a2014-05-22 05:54:18 +00004100 return checkTargetOptions(ExistingTargetOpts, TargetOpts, nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00004101 }
Craig Topper3e89dfe2014-03-13 02:13:41 +00004102 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
4103 bool Complain,
4104 std::string &SuggestedPredefines) override {
Craig Toppera13603a2014-05-22 05:54:18 +00004105 return checkPreprocessorOptions(ExistingPPOpts, PPOpts, nullptr, FileMgr,
Argyrios Kyrtzidisd3afa0c2013-04-26 21:33:40 +00004106 SuggestedPredefines, ExistingLangOpts);
Guy Benyei11169dd2012-12-18 14:30:41 +00004107 }
4108 };
4109}
4110
4111bool ASTReader::readASTFileControlBlock(StringRef Filename,
4112 FileManager &FileMgr,
4113 ASTReaderListener &Listener) {
4114 // Open the AST file.
4115 std::string ErrStr;
Ahmed Charlesb8984322014-03-07 20:03:18 +00004116 std::unique_ptr<llvm::MemoryBuffer> Buffer;
Guy Benyei11169dd2012-12-18 14:30:41 +00004117 Buffer.reset(FileMgr.getBufferForFile(Filename, &ErrStr));
4118 if (!Buffer) {
4119 return true;
4120 }
4121
4122 // Initialize the stream
4123 llvm::BitstreamReader StreamFile;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004124 BitstreamCursor Stream;
Guy Benyei11169dd2012-12-18 14:30:41 +00004125 StreamFile.init((const unsigned char *)Buffer->getBufferStart(),
4126 (const unsigned char *)Buffer->getBufferEnd());
4127 Stream.init(StreamFile);
4128
4129 // Sniff for the signature.
4130 if (Stream.Read(8) != 'C' ||
4131 Stream.Read(8) != 'P' ||
4132 Stream.Read(8) != 'C' ||
4133 Stream.Read(8) != 'H') {
4134 return true;
4135 }
4136
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004137 // Scan for the CONTROL_BLOCK_ID block.
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004138 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID))
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004139 return true;
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004140
4141 bool NeedsInputFiles = Listener.needsInputFileVisitation();
Ben Langmuircb69b572014-03-07 06:40:32 +00004142 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004143 BitstreamCursor InputFilesCursor;
4144 if (NeedsInputFiles) {
4145 InputFilesCursor = Stream;
4146 if (SkipCursorToBlock(InputFilesCursor, INPUT_FILES_BLOCK_ID))
4147 return true;
4148
4149 // Read the abbreviations
4150 while (true) {
4151 uint64_t Offset = InputFilesCursor.GetCurrentBitNo();
4152 unsigned Code = InputFilesCursor.ReadCode();
4153
4154 // We expect all abbrevs to be at the start of the block.
4155 if (Code != llvm::bitc::DEFINE_ABBREV) {
4156 InputFilesCursor.JumpToBit(Offset);
4157 break;
4158 }
4159 InputFilesCursor.ReadAbbrevRecord();
4160 }
4161 }
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004162
4163 // Scan for ORIGINAL_FILE inside the control block.
Guy Benyei11169dd2012-12-18 14:30:41 +00004164 RecordData Record;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004165 while (1) {
4166 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
4167 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
4168 return false;
4169
4170 if (Entry.Kind != llvm::BitstreamEntry::Record)
4171 return true;
4172
Guy Benyei11169dd2012-12-18 14:30:41 +00004173 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00004174 StringRef Blob;
4175 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob);
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004176 switch ((ControlRecordTypes)RecCode) {
4177 case METADATA: {
4178 if (Record[0] != VERSION_MAJOR)
4179 return true;
Guy Benyei11169dd2012-12-18 14:30:41 +00004180
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004181 if (Listener.ReadFullVersionInformation(Blob))
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004182 return true;
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004183
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004184 break;
4185 }
Ben Langmuir4f5212a2014-04-14 22:12:44 +00004186 case MODULE_NAME:
4187 Listener.ReadModuleName(Blob);
4188 break;
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00004189 case MODULE_MAP_FILE: {
4190 unsigned Idx = 0;
4191 Listener.ReadModuleMapFile(ReadString(Record, Idx));
Ben Langmuir4f5212a2014-04-14 22:12:44 +00004192 break;
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00004193 }
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004194 case LANGUAGE_OPTIONS:
4195 if (ParseLanguageOptions(Record, false, Listener))
4196 return true;
4197 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004198
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004199 case TARGET_OPTIONS:
4200 if (ParseTargetOptions(Record, false, Listener))
4201 return true;
4202 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004203
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004204 case DIAGNOSTIC_OPTIONS:
4205 if (ParseDiagnosticOptions(Record, false, Listener))
4206 return true;
4207 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004208
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004209 case FILE_SYSTEM_OPTIONS:
4210 if (ParseFileSystemOptions(Record, false, Listener))
4211 return true;
4212 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004213
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004214 case HEADER_SEARCH_OPTIONS:
4215 if (ParseHeaderSearchOptions(Record, false, Listener))
4216 return true;
4217 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004218
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004219 case PREPROCESSOR_OPTIONS: {
4220 std::string IgnoredSuggestedPredefines;
4221 if (ParsePreprocessorOptions(Record, false, Listener,
4222 IgnoredSuggestedPredefines))
4223 return true;
4224 break;
4225 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004226
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004227 case INPUT_FILE_OFFSETS: {
4228 if (!NeedsInputFiles)
4229 break;
4230
4231 unsigned NumInputFiles = Record[0];
4232 unsigned NumUserFiles = Record[1];
4233 const uint32_t *InputFileOffs = (const uint32_t *)Blob.data();
4234 for (unsigned I = 0; I != NumInputFiles; ++I) {
4235 // Go find this input file.
4236 bool isSystemFile = I >= NumUserFiles;
Ben Langmuircb69b572014-03-07 06:40:32 +00004237
4238 if (isSystemFile && !NeedsSystemInputFiles)
4239 break; // the rest are system input files
4240
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004241 BitstreamCursor &Cursor = InputFilesCursor;
4242 SavedStreamPosition SavedPosition(Cursor);
4243 Cursor.JumpToBit(InputFileOffs[I]);
4244
4245 unsigned Code = Cursor.ReadCode();
4246 RecordData Record;
4247 StringRef Blob;
4248 bool shouldContinue = false;
4249 switch ((InputFileRecordTypes)Cursor.readRecord(Code, Record, &Blob)) {
4250 case INPUT_FILE:
Argyrios Kyrtzidis68ccbe02014-03-14 02:26:31 +00004251 bool Overridden = static_cast<bool>(Record[3]);
4252 shouldContinue = Listener.visitInputFile(Blob, isSystemFile, Overridden);
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004253 break;
4254 }
4255 if (!shouldContinue)
4256 break;
4257 }
4258 break;
4259 }
4260
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004261 default:
4262 // No other validation to perform.
4263 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004264 }
4265 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004266}
4267
4268
4269bool ASTReader::isAcceptableASTFile(StringRef Filename,
4270 FileManager &FileMgr,
4271 const LangOptions &LangOpts,
4272 const TargetOptions &TargetOpts,
4273 const PreprocessorOptions &PPOpts) {
4274 SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts, FileMgr);
4275 return !readASTFileControlBlock(Filename, FileMgr, validator);
4276}
4277
Ben Langmuir2c9af442014-04-10 17:57:43 +00004278ASTReader::ASTReadResult
4279ASTReader::ReadSubmoduleBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004280 // Enter the submodule block.
4281 if (F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) {
4282 Error("malformed submodule block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004283 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004284 }
4285
4286 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
4287 bool First = true;
Craig Toppera13603a2014-05-22 05:54:18 +00004288 Module *CurrentModule = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00004289 RecordData Record;
4290 while (true) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004291 llvm::BitstreamEntry Entry = F.Stream.advanceSkippingSubblocks();
4292
4293 switch (Entry.Kind) {
4294 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
4295 case llvm::BitstreamEntry::Error:
4296 Error("malformed block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004297 return Failure;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004298 case llvm::BitstreamEntry::EndBlock:
Ben Langmuir2c9af442014-04-10 17:57:43 +00004299 return Success;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004300 case llvm::BitstreamEntry::Record:
4301 // The interesting case.
4302 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004303 }
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004304
Guy Benyei11169dd2012-12-18 14:30:41 +00004305 // Read a record.
Chris Lattner0e6c9402013-01-20 02:38:54 +00004306 StringRef Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00004307 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00004308 switch (F.Stream.readRecord(Entry.ID, Record, &Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004309 default: // Default behavior: ignore.
4310 break;
4311
4312 case SUBMODULE_DEFINITION: {
4313 if (First) {
4314 Error("missing submodule metadata record at beginning of block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004315 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004316 }
4317
Douglas Gregor8d932422013-03-20 03:59:18 +00004318 if (Record.size() < 8) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004319 Error("malformed module definition");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004320 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004321 }
4322
Chris Lattner0e6c9402013-01-20 02:38:54 +00004323 StringRef Name = Blob;
Richard Smith9bca2982014-03-08 00:03:56 +00004324 unsigned Idx = 0;
4325 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]);
4326 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]);
4327 bool IsFramework = Record[Idx++];
4328 bool IsExplicit = Record[Idx++];
4329 bool IsSystem = Record[Idx++];
4330 bool IsExternC = Record[Idx++];
4331 bool InferSubmodules = Record[Idx++];
4332 bool InferExplicitSubmodules = Record[Idx++];
4333 bool InferExportWildcard = Record[Idx++];
4334 bool ConfigMacrosExhaustive = Record[Idx++];
Douglas Gregor8d932422013-03-20 03:59:18 +00004335
Ben Langmuirbeee15e2014-04-14 18:00:01 +00004336 Module *ParentModule = nullptr;
Ben Langmuir9d6448b2014-08-09 00:57:23 +00004337 if (Parent)
Guy Benyei11169dd2012-12-18 14:30:41 +00004338 ParentModule = getSubmodule(Parent);
Ben Langmuirbeee15e2014-04-14 18:00:01 +00004339
Guy Benyei11169dd2012-12-18 14:30:41 +00004340 // Retrieve this (sub)module from the module map, creating it if
4341 // necessary.
Ben Langmuir9d6448b2014-08-09 00:57:23 +00004342 CurrentModule = ModMap.findOrCreateModule(Name, ParentModule, IsFramework,
Guy Benyei11169dd2012-12-18 14:30:41 +00004343 IsExplicit).first;
Ben Langmuir9d6448b2014-08-09 00:57:23 +00004344
4345 // FIXME: set the definition loc for CurrentModule, or call
4346 // ModMap.setInferredModuleAllowedBy()
4347
Guy Benyei11169dd2012-12-18 14:30:41 +00004348 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS;
4349 if (GlobalIndex >= SubmodulesLoaded.size() ||
4350 SubmodulesLoaded[GlobalIndex]) {
4351 Error("too many submodules");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004352 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004353 }
Douglas Gregor8a114ab2013-02-06 22:40:31 +00004354
Douglas Gregor7029ce12013-03-19 00:28:20 +00004355 if (!ParentModule) {
4356 if (const FileEntry *CurFile = CurrentModule->getASTFile()) {
4357 if (CurFile != F.File) {
4358 if (!Diags.isDiagnosticInFlight()) {
4359 Diag(diag::err_module_file_conflict)
4360 << CurrentModule->getTopLevelModuleName()
4361 << CurFile->getName()
4362 << F.File->getName();
4363 }
Ben Langmuir2c9af442014-04-10 17:57:43 +00004364 return Failure;
Douglas Gregor8a114ab2013-02-06 22:40:31 +00004365 }
Douglas Gregor8a114ab2013-02-06 22:40:31 +00004366 }
Douglas Gregor7029ce12013-03-19 00:28:20 +00004367
4368 CurrentModule->setASTFile(F.File);
Douglas Gregor8a114ab2013-02-06 22:40:31 +00004369 }
Ben Langmuirbeee15e2014-04-14 18:00:01 +00004370
Guy Benyei11169dd2012-12-18 14:30:41 +00004371 CurrentModule->IsFromModuleFile = true;
4372 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem;
Richard Smith9bca2982014-03-08 00:03:56 +00004373 CurrentModule->IsExternC = IsExternC;
Guy Benyei11169dd2012-12-18 14:30:41 +00004374 CurrentModule->InferSubmodules = InferSubmodules;
4375 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules;
4376 CurrentModule->InferExportWildcard = InferExportWildcard;
Douglas Gregor8d932422013-03-20 03:59:18 +00004377 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive;
Guy Benyei11169dd2012-12-18 14:30:41 +00004378 if (DeserializationListener)
4379 DeserializationListener->ModuleRead(GlobalID, CurrentModule);
4380
4381 SubmodulesLoaded[GlobalIndex] = CurrentModule;
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004382
Douglas Gregorfb912652013-03-20 21:10:35 +00004383 // Clear out data that will be replaced by what is the module file.
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004384 CurrentModule->LinkLibraries.clear();
Douglas Gregor8d932422013-03-20 03:59:18 +00004385 CurrentModule->ConfigMacros.clear();
Douglas Gregorfb912652013-03-20 21:10:35 +00004386 CurrentModule->UnresolvedConflicts.clear();
4387 CurrentModule->Conflicts.clear();
Guy Benyei11169dd2012-12-18 14:30:41 +00004388 break;
4389 }
4390
4391 case SUBMODULE_UMBRELLA_HEADER: {
4392 if (First) {
4393 Error("missing submodule metadata record at beginning of block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004394 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004395 }
4396
4397 if (!CurrentModule)
4398 break;
4399
Chris Lattner0e6c9402013-01-20 02:38:54 +00004400 if (const FileEntry *Umbrella = PP.getFileManager().getFile(Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004401 if (!CurrentModule->getUmbrellaHeader())
4402 ModMap.setUmbrellaHeader(CurrentModule, Umbrella);
4403 else if (CurrentModule->getUmbrellaHeader() != Umbrella) {
Ben Langmuir2c9af442014-04-10 17:57:43 +00004404 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
4405 Error("mismatched umbrella headers in submodule");
4406 return OutOfDate;
Guy Benyei11169dd2012-12-18 14:30:41 +00004407 }
4408 }
4409 break;
4410 }
4411
4412 case SUBMODULE_HEADER: {
4413 if (First) {
4414 Error("missing submodule metadata record at beginning of block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004415 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004416 }
4417
4418 if (!CurrentModule)
4419 break;
4420
Argyrios Kyrtzidisb146baa2013-03-13 21:13:51 +00004421 // We lazily associate headers with their modules via the HeaderInfoTable.
4422 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
4423 // of complete filenames or remove it entirely.
Guy Benyei11169dd2012-12-18 14:30:41 +00004424 break;
4425 }
4426
4427 case SUBMODULE_EXCLUDED_HEADER: {
4428 if (First) {
4429 Error("missing submodule metadata record at beginning of block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004430 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004431 }
4432
4433 if (!CurrentModule)
4434 break;
4435
Argyrios Kyrtzidisb146baa2013-03-13 21:13:51 +00004436 // We lazily associate headers with their modules via the HeaderInfoTable.
4437 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
4438 // of complete filenames or remove it entirely.
Guy Benyei11169dd2012-12-18 14:30:41 +00004439 break;
4440 }
4441
Lawrence Crowlb53e5482013-06-20 21:14:14 +00004442 case SUBMODULE_PRIVATE_HEADER: {
4443 if (First) {
4444 Error("missing submodule metadata record at beginning of block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004445 return Failure;
Lawrence Crowlb53e5482013-06-20 21:14:14 +00004446 }
4447
4448 if (!CurrentModule)
4449 break;
4450
4451 // We lazily associate headers with their modules via the HeaderInfoTable.
4452 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
4453 // of complete filenames or remove it entirely.
4454 break;
4455 }
4456
Guy Benyei11169dd2012-12-18 14:30:41 +00004457 case SUBMODULE_TOPHEADER: {
4458 if (First) {
4459 Error("missing submodule metadata record at beginning of block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004460 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004461 }
4462
4463 if (!CurrentModule)
4464 break;
4465
Argyrios Kyrtzidis3c5305c2013-03-13 21:13:43 +00004466 CurrentModule->addTopHeaderFilename(Blob);
Guy Benyei11169dd2012-12-18 14:30:41 +00004467 break;
4468 }
4469
4470 case SUBMODULE_UMBRELLA_DIR: {
4471 if (First) {
4472 Error("missing submodule metadata record at beginning of block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004473 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004474 }
4475
4476 if (!CurrentModule)
4477 break;
4478
Guy Benyei11169dd2012-12-18 14:30:41 +00004479 if (const DirectoryEntry *Umbrella
Chris Lattner0e6c9402013-01-20 02:38:54 +00004480 = PP.getFileManager().getDirectory(Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004481 if (!CurrentModule->getUmbrellaDir())
4482 ModMap.setUmbrellaDir(CurrentModule, Umbrella);
4483 else if (CurrentModule->getUmbrellaDir() != Umbrella) {
Ben Langmuir2c9af442014-04-10 17:57:43 +00004484 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
4485 Error("mismatched umbrella directories in submodule");
4486 return OutOfDate;
Guy Benyei11169dd2012-12-18 14:30:41 +00004487 }
4488 }
4489 break;
4490 }
4491
4492 case SUBMODULE_METADATA: {
4493 if (!First) {
4494 Error("submodule metadata record not at beginning of block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004495 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004496 }
4497 First = false;
4498
4499 F.BaseSubmoduleID = getTotalNumSubmodules();
4500 F.LocalNumSubmodules = Record[0];
4501 unsigned LocalBaseSubmoduleID = Record[1];
4502 if (F.LocalNumSubmodules > 0) {
4503 // Introduce the global -> local mapping for submodules within this
4504 // module.
4505 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F));
4506
4507 // Introduce the local -> global mapping for submodules within this
4508 // module.
4509 F.SubmoduleRemap.insertOrReplace(
4510 std::make_pair(LocalBaseSubmoduleID,
4511 F.BaseSubmoduleID - LocalBaseSubmoduleID));
4512
4513 SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules);
4514 }
4515 break;
4516 }
4517
4518 case SUBMODULE_IMPORTS: {
4519 if (First) {
4520 Error("missing submodule metadata record at beginning of block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004521 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004522 }
4523
4524 if (!CurrentModule)
4525 break;
4526
4527 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) {
Douglas Gregorfb912652013-03-20 21:10:35 +00004528 UnresolvedModuleRef Unresolved;
Guy Benyei11169dd2012-12-18 14:30:41 +00004529 Unresolved.File = &F;
4530 Unresolved.Mod = CurrentModule;
4531 Unresolved.ID = Record[Idx];
Douglas Gregorfb912652013-03-20 21:10:35 +00004532 Unresolved.Kind = UnresolvedModuleRef::Import;
Guy Benyei11169dd2012-12-18 14:30:41 +00004533 Unresolved.IsWildcard = false;
Douglas Gregorfb912652013-03-20 21:10:35 +00004534 UnresolvedModuleRefs.push_back(Unresolved);
Guy Benyei11169dd2012-12-18 14:30:41 +00004535 }
4536 break;
4537 }
4538
4539 case SUBMODULE_EXPORTS: {
4540 if (First) {
4541 Error("missing submodule metadata record at beginning of block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004542 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004543 }
4544
4545 if (!CurrentModule)
4546 break;
4547
4548 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) {
Douglas Gregorfb912652013-03-20 21:10:35 +00004549 UnresolvedModuleRef Unresolved;
Guy Benyei11169dd2012-12-18 14:30:41 +00004550 Unresolved.File = &F;
4551 Unresolved.Mod = CurrentModule;
4552 Unresolved.ID = Record[Idx];
Douglas Gregorfb912652013-03-20 21:10:35 +00004553 Unresolved.Kind = UnresolvedModuleRef::Export;
Guy Benyei11169dd2012-12-18 14:30:41 +00004554 Unresolved.IsWildcard = Record[Idx + 1];
Douglas Gregorfb912652013-03-20 21:10:35 +00004555 UnresolvedModuleRefs.push_back(Unresolved);
Guy Benyei11169dd2012-12-18 14:30:41 +00004556 }
4557
4558 // Once we've loaded the set of exports, there's no reason to keep
4559 // the parsed, unresolved exports around.
4560 CurrentModule->UnresolvedExports.clear();
4561 break;
4562 }
4563 case SUBMODULE_REQUIRES: {
4564 if (First) {
4565 Error("missing submodule metadata record at beginning of block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004566 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004567 }
4568
4569 if (!CurrentModule)
4570 break;
4571
Richard Smitha3feee22013-10-28 22:18:19 +00004572 CurrentModule->addRequirement(Blob, Record[0], Context.getLangOpts(),
Guy Benyei11169dd2012-12-18 14:30:41 +00004573 Context.getTargetInfo());
4574 break;
4575 }
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004576
4577 case SUBMODULE_LINK_LIBRARY:
4578 if (First) {
4579 Error("missing submodule metadata record at beginning of block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004580 return Failure;
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004581 }
4582
4583 if (!CurrentModule)
4584 break;
4585
4586 CurrentModule->LinkLibraries.push_back(
Chris Lattner0e6c9402013-01-20 02:38:54 +00004587 Module::LinkLibrary(Blob, Record[0]));
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004588 break;
Douglas Gregor35b13ec2013-03-20 00:22:05 +00004589
4590 case SUBMODULE_CONFIG_MACRO:
4591 if (First) {
4592 Error("missing submodule metadata record at beginning of block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004593 return Failure;
Douglas Gregor35b13ec2013-03-20 00:22:05 +00004594 }
4595
4596 if (!CurrentModule)
4597 break;
4598
4599 CurrentModule->ConfigMacros.push_back(Blob.str());
4600 break;
Douglas Gregorfb912652013-03-20 21:10:35 +00004601
4602 case SUBMODULE_CONFLICT: {
4603 if (First) {
4604 Error("missing submodule metadata record at beginning of block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004605 return Failure;
Douglas Gregorfb912652013-03-20 21:10:35 +00004606 }
4607
4608 if (!CurrentModule)
4609 break;
4610
4611 UnresolvedModuleRef Unresolved;
4612 Unresolved.File = &F;
4613 Unresolved.Mod = CurrentModule;
4614 Unresolved.ID = Record[0];
4615 Unresolved.Kind = UnresolvedModuleRef::Conflict;
4616 Unresolved.IsWildcard = false;
4617 Unresolved.String = Blob;
4618 UnresolvedModuleRefs.push_back(Unresolved);
4619 break;
4620 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004621 }
4622 }
4623}
4624
4625/// \brief Parse the record that corresponds to a LangOptions data
4626/// structure.
4627///
4628/// This routine parses the language options from the AST file and then gives
4629/// them to the AST listener if one is set.
4630///
4631/// \returns true if the listener deems the file unacceptable, false otherwise.
4632bool ASTReader::ParseLanguageOptions(const RecordData &Record,
4633 bool Complain,
4634 ASTReaderListener &Listener) {
4635 LangOptions LangOpts;
4636 unsigned Idx = 0;
4637#define LANGOPT(Name, Bits, Default, Description) \
4638 LangOpts.Name = Record[Idx++];
4639#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
4640 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
4641#include "clang/Basic/LangOptions.def"
Will Dietzf54319c2013-01-18 11:30:38 +00004642#define SANITIZER(NAME, ID) LangOpts.Sanitize.ID = Record[Idx++];
4643#include "clang/Basic/Sanitizers.def"
Guy Benyei11169dd2012-12-18 14:30:41 +00004644
4645 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++];
4646 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx);
4647 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion);
4648
4649 unsigned Length = Record[Idx++];
4650 LangOpts.CurrentModule.assign(Record.begin() + Idx,
4651 Record.begin() + Idx + Length);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004652
4653 Idx += Length;
4654
4655 // Comment options.
4656 for (unsigned N = Record[Idx++]; N; --N) {
4657 LangOpts.CommentOpts.BlockCommandNames.push_back(
4658 ReadString(Record, Idx));
4659 }
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004660 LangOpts.CommentOpts.ParseAllComments = Record[Idx++];
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004661
Guy Benyei11169dd2012-12-18 14:30:41 +00004662 return Listener.ReadLanguageOptions(LangOpts, Complain);
4663}
4664
4665bool ASTReader::ParseTargetOptions(const RecordData &Record,
4666 bool Complain,
4667 ASTReaderListener &Listener) {
4668 unsigned Idx = 0;
4669 TargetOptions TargetOpts;
4670 TargetOpts.Triple = ReadString(Record, Idx);
4671 TargetOpts.CPU = ReadString(Record, Idx);
4672 TargetOpts.ABI = ReadString(Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00004673 for (unsigned N = Record[Idx++]; N; --N) {
4674 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx));
4675 }
4676 for (unsigned N = Record[Idx++]; N; --N) {
4677 TargetOpts.Features.push_back(ReadString(Record, Idx));
4678 }
4679
4680 return Listener.ReadTargetOptions(TargetOpts, Complain);
4681}
4682
4683bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain,
4684 ASTReaderListener &Listener) {
Ben Langmuirb92de022014-04-29 16:25:26 +00004685 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions);
Guy Benyei11169dd2012-12-18 14:30:41 +00004686 unsigned Idx = 0;
Ben Langmuirb92de022014-04-29 16:25:26 +00004687#define DIAGOPT(Name, Bits, Default) DiagOpts->Name = Record[Idx++];
Guy Benyei11169dd2012-12-18 14:30:41 +00004688#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
Ben Langmuirb92de022014-04-29 16:25:26 +00004689 DiagOpts->set##Name(static_cast<Type>(Record[Idx++]));
Guy Benyei11169dd2012-12-18 14:30:41 +00004690#include "clang/Basic/DiagnosticOptions.def"
4691
Richard Smith3be1cb22014-08-07 00:24:21 +00004692 for (unsigned N = Record[Idx++]; N; --N)
Ben Langmuirb92de022014-04-29 16:25:26 +00004693 DiagOpts->Warnings.push_back(ReadString(Record, Idx));
Richard Smith3be1cb22014-08-07 00:24:21 +00004694 for (unsigned N = Record[Idx++]; N; --N)
4695 DiagOpts->Remarks.push_back(ReadString(Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00004696
4697 return Listener.ReadDiagnosticOptions(DiagOpts, Complain);
4698}
4699
4700bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain,
4701 ASTReaderListener &Listener) {
4702 FileSystemOptions FSOpts;
4703 unsigned Idx = 0;
4704 FSOpts.WorkingDir = ReadString(Record, Idx);
4705 return Listener.ReadFileSystemOptions(FSOpts, Complain);
4706}
4707
4708bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record,
4709 bool Complain,
4710 ASTReaderListener &Listener) {
4711 HeaderSearchOptions HSOpts;
4712 unsigned Idx = 0;
4713 HSOpts.Sysroot = ReadString(Record, Idx);
4714
4715 // Include entries.
4716 for (unsigned N = Record[Idx++]; N; --N) {
4717 std::string Path = ReadString(Record, Idx);
4718 frontend::IncludeDirGroup Group
4719 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]);
Guy Benyei11169dd2012-12-18 14:30:41 +00004720 bool IsFramework = Record[Idx++];
4721 bool IgnoreSysRoot = Record[Idx++];
Guy Benyei11169dd2012-12-18 14:30:41 +00004722 HSOpts.UserEntries.push_back(
Daniel Dunbar53681732013-01-30 00:34:26 +00004723 HeaderSearchOptions::Entry(Path, Group, IsFramework, IgnoreSysRoot));
Guy Benyei11169dd2012-12-18 14:30:41 +00004724 }
4725
4726 // System header prefixes.
4727 for (unsigned N = Record[Idx++]; N; --N) {
4728 std::string Prefix = ReadString(Record, Idx);
4729 bool IsSystemHeader = Record[Idx++];
4730 HSOpts.SystemHeaderPrefixes.push_back(
4731 HeaderSearchOptions::SystemHeaderPrefix(Prefix, IsSystemHeader));
4732 }
4733
4734 HSOpts.ResourceDir = ReadString(Record, Idx);
4735 HSOpts.ModuleCachePath = ReadString(Record, Idx);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004736 HSOpts.ModuleUserBuildPath = ReadString(Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00004737 HSOpts.DisableModuleHash = Record[Idx++];
4738 HSOpts.UseBuiltinIncludes = Record[Idx++];
4739 HSOpts.UseStandardSystemIncludes = Record[Idx++];
4740 HSOpts.UseStandardCXXIncludes = Record[Idx++];
4741 HSOpts.UseLibcxx = Record[Idx++];
4742
4743 return Listener.ReadHeaderSearchOptions(HSOpts, Complain);
4744}
4745
4746bool ASTReader::ParsePreprocessorOptions(const RecordData &Record,
4747 bool Complain,
4748 ASTReaderListener &Listener,
4749 std::string &SuggestedPredefines) {
4750 PreprocessorOptions PPOpts;
4751 unsigned Idx = 0;
4752
4753 // Macro definitions/undefs
4754 for (unsigned N = Record[Idx++]; N; --N) {
4755 std::string Macro = ReadString(Record, Idx);
4756 bool IsUndef = Record[Idx++];
4757 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef));
4758 }
4759
4760 // Includes
4761 for (unsigned N = Record[Idx++]; N; --N) {
4762 PPOpts.Includes.push_back(ReadString(Record, Idx));
4763 }
4764
4765 // Macro Includes
4766 for (unsigned N = Record[Idx++]; N; --N) {
4767 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx));
4768 }
4769
4770 PPOpts.UsePredefines = Record[Idx++];
Argyrios Kyrtzidisd3afa0c2013-04-26 21:33:40 +00004771 PPOpts.DetailedRecord = Record[Idx++];
Guy Benyei11169dd2012-12-18 14:30:41 +00004772 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx);
4773 PPOpts.ImplicitPTHInclude = ReadString(Record, Idx);
4774 PPOpts.ObjCXXARCStandardLibrary =
4775 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]);
4776 SuggestedPredefines.clear();
4777 return Listener.ReadPreprocessorOptions(PPOpts, Complain,
4778 SuggestedPredefines);
4779}
4780
4781std::pair<ModuleFile *, unsigned>
4782ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) {
4783 GlobalPreprocessedEntityMapType::iterator
4784 I = GlobalPreprocessedEntityMap.find(GlobalIndex);
4785 assert(I != GlobalPreprocessedEntityMap.end() &&
4786 "Corrupted global preprocessed entity map");
4787 ModuleFile *M = I->second;
4788 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID;
4789 return std::make_pair(M, LocalIndex);
4790}
4791
4792std::pair<PreprocessingRecord::iterator, PreprocessingRecord::iterator>
4793ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const {
4794 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
4795 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID,
4796 Mod.NumPreprocessedEntities);
4797
4798 return std::make_pair(PreprocessingRecord::iterator(),
4799 PreprocessingRecord::iterator());
4800}
4801
4802std::pair<ASTReader::ModuleDeclIterator, ASTReader::ModuleDeclIterator>
4803ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) {
4804 return std::make_pair(ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls),
4805 ModuleDeclIterator(this, &Mod,
4806 Mod.FileSortedDecls + Mod.NumFileSortedDecls));
4807}
4808
4809PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) {
4810 PreprocessedEntityID PPID = Index+1;
4811 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
4812 ModuleFile &M = *PPInfo.first;
4813 unsigned LocalIndex = PPInfo.second;
4814 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
4815
Guy Benyei11169dd2012-12-18 14:30:41 +00004816 if (!PP.getPreprocessingRecord()) {
4817 Error("no preprocessing record");
Craig Toppera13603a2014-05-22 05:54:18 +00004818 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00004819 }
4820
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004821 SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor);
4822 M.PreprocessorDetailCursor.JumpToBit(PPOffs.BitOffset);
4823
4824 llvm::BitstreamEntry Entry =
4825 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
4826 if (Entry.Kind != llvm::BitstreamEntry::Record)
Craig Toppera13603a2014-05-22 05:54:18 +00004827 return nullptr;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004828
Guy Benyei11169dd2012-12-18 14:30:41 +00004829 // Read the record.
4830 SourceRange Range(ReadSourceLocation(M, PPOffs.Begin),
4831 ReadSourceLocation(M, PPOffs.End));
4832 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
Chris Lattner0e6c9402013-01-20 02:38:54 +00004833 StringRef Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00004834 RecordData Record;
4835 PreprocessorDetailRecordTypes RecType =
Chris Lattner0e6c9402013-01-20 02:38:54 +00004836 (PreprocessorDetailRecordTypes)M.PreprocessorDetailCursor.readRecord(
4837 Entry.ID, Record, &Blob);
Guy Benyei11169dd2012-12-18 14:30:41 +00004838 switch (RecType) {
4839 case PPD_MACRO_EXPANSION: {
4840 bool isBuiltin = Record[0];
Craig Toppera13603a2014-05-22 05:54:18 +00004841 IdentifierInfo *Name = nullptr;
4842 MacroDefinition *Def = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00004843 if (isBuiltin)
4844 Name = getLocalIdentifier(M, Record[1]);
4845 else {
4846 PreprocessedEntityID
4847 GlobalID = getGlobalPreprocessedEntityID(M, Record[1]);
4848 Def =cast<MacroDefinition>(PPRec.getLoadedPreprocessedEntity(GlobalID-1));
4849 }
4850
4851 MacroExpansion *ME;
4852 if (isBuiltin)
4853 ME = new (PPRec) MacroExpansion(Name, Range);
4854 else
4855 ME = new (PPRec) MacroExpansion(Def, Range);
4856
4857 return ME;
4858 }
4859
4860 case PPD_MACRO_DEFINITION: {
4861 // Decode the identifier info and then check again; if the macro is
4862 // still defined and associated with the identifier,
4863 IdentifierInfo *II = getLocalIdentifier(M, Record[0]);
4864 MacroDefinition *MD
4865 = new (PPRec) MacroDefinition(II, Range);
4866
4867 if (DeserializationListener)
4868 DeserializationListener->MacroDefinitionRead(PPID, MD);
4869
4870 return MD;
4871 }
4872
4873 case PPD_INCLUSION_DIRECTIVE: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00004874 const char *FullFileNameStart = Blob.data() + Record[0];
4875 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]);
Craig Toppera13603a2014-05-22 05:54:18 +00004876 const FileEntry *File = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00004877 if (!FullFileName.empty())
4878 File = PP.getFileManager().getFile(FullFileName);
4879
4880 // FIXME: Stable encoding
4881 InclusionDirective::InclusionKind Kind
4882 = static_cast<InclusionDirective::InclusionKind>(Record[2]);
4883 InclusionDirective *ID
4884 = new (PPRec) InclusionDirective(PPRec, Kind,
Chris Lattner0e6c9402013-01-20 02:38:54 +00004885 StringRef(Blob.data(), Record[0]),
Guy Benyei11169dd2012-12-18 14:30:41 +00004886 Record[1], Record[3],
4887 File,
4888 Range);
4889 return ID;
4890 }
4891 }
4892
4893 llvm_unreachable("Invalid PreprocessorDetailRecordTypes");
4894}
4895
4896/// \brief \arg SLocMapI points at a chunk of a module that contains no
4897/// preprocessed entities or the entities it contains are not the ones we are
4898/// looking for. Find the next module that contains entities and return the ID
4899/// of the first entry.
4900PreprocessedEntityID ASTReader::findNextPreprocessedEntity(
4901 GlobalSLocOffsetMapType::const_iterator SLocMapI) const {
4902 ++SLocMapI;
4903 for (GlobalSLocOffsetMapType::const_iterator
4904 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
4905 ModuleFile &M = *SLocMapI->second;
4906 if (M.NumPreprocessedEntities)
4907 return M.BasePreprocessedEntityID;
4908 }
4909
4910 return getTotalNumPreprocessedEntities();
4911}
4912
4913namespace {
4914
4915template <unsigned PPEntityOffset::*PPLoc>
4916struct PPEntityComp {
4917 const ASTReader &Reader;
4918 ModuleFile &M;
4919
4920 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) { }
4921
4922 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const {
4923 SourceLocation LHS = getLoc(L);
4924 SourceLocation RHS = getLoc(R);
4925 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
4926 }
4927
4928 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const {
4929 SourceLocation LHS = getLoc(L);
4930 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
4931 }
4932
4933 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const {
4934 SourceLocation RHS = getLoc(R);
4935 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
4936 }
4937
4938 SourceLocation getLoc(const PPEntityOffset &PPE) const {
4939 return Reader.ReadSourceLocation(M, PPE.*PPLoc);
4940 }
4941};
4942
4943}
4944
Alp Toker2e9ce4c2014-05-16 18:59:21 +00004945PreprocessedEntityID ASTReader::findPreprocessedEntity(SourceLocation Loc,
4946 bool EndsAfter) const {
4947 if (SourceMgr.isLocalSourceLocation(Loc))
Guy Benyei11169dd2012-12-18 14:30:41 +00004948 return getTotalNumPreprocessedEntities();
4949
Alp Toker2e9ce4c2014-05-16 18:59:21 +00004950 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
4951 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
Guy Benyei11169dd2012-12-18 14:30:41 +00004952 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
4953 "Corrupted global sloc offset map");
4954
4955 if (SLocMapI->second->NumPreprocessedEntities == 0)
4956 return findNextPreprocessedEntity(SLocMapI);
4957
4958 ModuleFile &M = *SLocMapI->second;
4959 typedef const PPEntityOffset *pp_iterator;
4960 pp_iterator pp_begin = M.PreprocessedEntityOffsets;
4961 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities;
4962
4963 size_t Count = M.NumPreprocessedEntities;
4964 size_t Half;
4965 pp_iterator First = pp_begin;
4966 pp_iterator PPI;
4967
Alp Toker2e9ce4c2014-05-16 18:59:21 +00004968 if (EndsAfter) {
4969 PPI = std::upper_bound(pp_begin, pp_end, Loc,
4970 PPEntityComp<&PPEntityOffset::Begin>(*this, M));
4971 } else {
4972 // Do a binary search manually instead of using std::lower_bound because
4973 // The end locations of entities may be unordered (when a macro expansion
4974 // is inside another macro argument), but for this case it is not important
4975 // whether we get the first macro expansion or its containing macro.
4976 while (Count > 0) {
4977 Half = Count / 2;
4978 PPI = First;
4979 std::advance(PPI, Half);
4980 if (SourceMgr.isBeforeInTranslationUnit(ReadSourceLocation(M, PPI->End),
4981 Loc)) {
4982 First = PPI;
4983 ++First;
4984 Count = Count - Half - 1;
4985 } else
4986 Count = Half;
4987 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004988 }
4989
4990 if (PPI == pp_end)
4991 return findNextPreprocessedEntity(SLocMapI);
4992
4993 return M.BasePreprocessedEntityID + (PPI - pp_begin);
4994}
4995
Guy Benyei11169dd2012-12-18 14:30:41 +00004996/// \brief Returns a pair of [Begin, End) indices of preallocated
4997/// preprocessed entities that \arg Range encompasses.
4998std::pair<unsigned, unsigned>
4999 ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) {
5000 if (Range.isInvalid())
5001 return std::make_pair(0,0);
5002 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
5003
Alp Toker2e9ce4c2014-05-16 18:59:21 +00005004 PreprocessedEntityID BeginID =
5005 findPreprocessedEntity(Range.getBegin(), false);
5006 PreprocessedEntityID EndID = findPreprocessedEntity(Range.getEnd(), true);
Guy Benyei11169dd2012-12-18 14:30:41 +00005007 return std::make_pair(BeginID, EndID);
5008}
5009
5010/// \brief Optionally returns true or false if the preallocated preprocessed
5011/// entity with index \arg Index came from file \arg FID.
David Blaikie05785d12013-02-20 22:23:23 +00005012Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index,
Guy Benyei11169dd2012-12-18 14:30:41 +00005013 FileID FID) {
5014 if (FID.isInvalid())
5015 return false;
5016
5017 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
5018 ModuleFile &M = *PPInfo.first;
5019 unsigned LocalIndex = PPInfo.second;
5020 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
5021
5022 SourceLocation Loc = ReadSourceLocation(M, PPOffs.Begin);
5023 if (Loc.isInvalid())
5024 return false;
5025
5026 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
5027 return true;
5028 else
5029 return false;
5030}
5031
5032namespace {
5033 /// \brief Visitor used to search for information about a header file.
5034 class HeaderFileInfoVisitor {
Guy Benyei11169dd2012-12-18 14:30:41 +00005035 const FileEntry *FE;
5036
David Blaikie05785d12013-02-20 22:23:23 +00005037 Optional<HeaderFileInfo> HFI;
Guy Benyei11169dd2012-12-18 14:30:41 +00005038
5039 public:
Argyrios Kyrtzidis61a38962013-03-06 18:12:44 +00005040 explicit HeaderFileInfoVisitor(const FileEntry *FE)
5041 : FE(FE) { }
Guy Benyei11169dd2012-12-18 14:30:41 +00005042
5043 static bool visit(ModuleFile &M, void *UserData) {
5044 HeaderFileInfoVisitor *This
5045 = static_cast<HeaderFileInfoVisitor *>(UserData);
5046
Guy Benyei11169dd2012-12-18 14:30:41 +00005047 HeaderFileInfoLookupTable *Table
5048 = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable);
5049 if (!Table)
5050 return false;
5051
5052 // Look in the on-disk hash table for an entry for this file name.
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00005053 HeaderFileInfoLookupTable::iterator Pos = Table->find(This->FE);
Guy Benyei11169dd2012-12-18 14:30:41 +00005054 if (Pos == Table->end())
5055 return false;
5056
5057 This->HFI = *Pos;
5058 return true;
5059 }
5060
David Blaikie05785d12013-02-20 22:23:23 +00005061 Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; }
Guy Benyei11169dd2012-12-18 14:30:41 +00005062 };
5063}
5064
5065HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) {
Argyrios Kyrtzidis61a38962013-03-06 18:12:44 +00005066 HeaderFileInfoVisitor Visitor(FE);
Guy Benyei11169dd2012-12-18 14:30:41 +00005067 ModuleMgr.visit(&HeaderFileInfoVisitor::visit, &Visitor);
Argyrios Kyrtzidis1054bbf2013-05-08 23:46:55 +00005068 if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
Guy Benyei11169dd2012-12-18 14:30:41 +00005069 return *HFI;
Guy Benyei11169dd2012-12-18 14:30:41 +00005070
5071 return HeaderFileInfo();
5072}
5073
5074void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) {
5075 // FIXME: Make it work properly with modules.
Dmitri Gribenkof8579502013-01-12 19:30:44 +00005076 SmallVector<DiagnosticsEngine::DiagState *, 32> DiagStates;
Guy Benyei11169dd2012-12-18 14:30:41 +00005077 for (ModuleIterator I = ModuleMgr.begin(), E = ModuleMgr.end(); I != E; ++I) {
5078 ModuleFile &F = *(*I);
5079 unsigned Idx = 0;
5080 DiagStates.clear();
5081 assert(!Diag.DiagStates.empty());
5082 DiagStates.push_back(&Diag.DiagStates.front()); // the command-line one.
5083 while (Idx < F.PragmaDiagMappings.size()) {
5084 SourceLocation Loc = ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]);
5085 unsigned DiagStateID = F.PragmaDiagMappings[Idx++];
5086 if (DiagStateID != 0) {
5087 Diag.DiagStatePoints.push_back(
5088 DiagnosticsEngine::DiagStatePoint(DiagStates[DiagStateID-1],
5089 FullSourceLoc(Loc, SourceMgr)));
5090 continue;
5091 }
5092
5093 assert(DiagStateID == 0);
5094 // A new DiagState was created here.
5095 Diag.DiagStates.push_back(*Diag.GetCurDiagState());
5096 DiagnosticsEngine::DiagState *NewState = &Diag.DiagStates.back();
5097 DiagStates.push_back(NewState);
5098 Diag.DiagStatePoints.push_back(
5099 DiagnosticsEngine::DiagStatePoint(NewState,
5100 FullSourceLoc(Loc, SourceMgr)));
5101 while (1) {
5102 assert(Idx < F.PragmaDiagMappings.size() &&
5103 "Invalid data, didn't find '-1' marking end of diag/map pairs");
5104 if (Idx >= F.PragmaDiagMappings.size()) {
5105 break; // Something is messed up but at least avoid infinite loop in
5106 // release build.
5107 }
5108 unsigned DiagID = F.PragmaDiagMappings[Idx++];
5109 if (DiagID == (unsigned)-1) {
5110 break; // no more diag/map pairs for this location.
5111 }
Alp Tokerc726c362014-06-10 09:31:37 +00005112 diag::Severity Map = (diag::Severity)F.PragmaDiagMappings[Idx++];
5113 DiagnosticMapping Mapping = Diag.makeUserMapping(Map, Loc);
5114 Diag.GetCurDiagState()->setMapping(DiagID, Mapping);
Guy Benyei11169dd2012-12-18 14:30:41 +00005115 }
5116 }
5117 }
5118}
5119
5120/// \brief Get the correct cursor and offset for loading a type.
5121ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) {
5122 GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index);
5123 assert(I != GlobalTypeMap.end() && "Corrupted global type map");
5124 ModuleFile *M = I->second;
5125 return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex]);
5126}
5127
5128/// \brief Read and return the type with the given index..
5129///
5130/// The index is the type ID, shifted and minus the number of predefs. This
5131/// routine actually reads the record corresponding to the type at the given
5132/// location. It is a helper routine for GetType, which deals with reading type
5133/// IDs.
5134QualType ASTReader::readTypeRecord(unsigned Index) {
5135 RecordLocation Loc = TypeCursorForIndex(Index);
Chris Lattner7fb3bef2013-01-20 00:56:42 +00005136 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00005137
5138 // Keep track of where we are in the stream, then jump back there
5139 // after reading this type.
5140 SavedStreamPosition SavedPosition(DeclsCursor);
5141
5142 ReadingKindTracker ReadingKind(Read_Type, *this);
5143
5144 // Note that we are loading a type record.
5145 Deserializing AType(this);
5146
5147 unsigned Idx = 0;
5148 DeclsCursor.JumpToBit(Loc.Offset);
5149 RecordData Record;
5150 unsigned Code = DeclsCursor.ReadCode();
Chris Lattner0e6c9402013-01-20 02:38:54 +00005151 switch ((TypeCode)DeclsCursor.readRecord(Code, Record)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00005152 case TYPE_EXT_QUAL: {
5153 if (Record.size() != 2) {
5154 Error("Incorrect encoding of extended qualifier type");
5155 return QualType();
5156 }
5157 QualType Base = readType(*Loc.F, Record, Idx);
5158 Qualifiers Quals = Qualifiers::fromOpaqueValue(Record[Idx++]);
5159 return Context.getQualifiedType(Base, Quals);
5160 }
5161
5162 case TYPE_COMPLEX: {
5163 if (Record.size() != 1) {
5164 Error("Incorrect encoding of complex type");
5165 return QualType();
5166 }
5167 QualType ElemType = readType(*Loc.F, Record, Idx);
5168 return Context.getComplexType(ElemType);
5169 }
5170
5171 case TYPE_POINTER: {
5172 if (Record.size() != 1) {
5173 Error("Incorrect encoding of pointer type");
5174 return QualType();
5175 }
5176 QualType PointeeType = readType(*Loc.F, Record, Idx);
5177 return Context.getPointerType(PointeeType);
5178 }
5179
Reid Kleckner8a365022013-06-24 17:51:48 +00005180 case TYPE_DECAYED: {
5181 if (Record.size() != 1) {
5182 Error("Incorrect encoding of decayed type");
5183 return QualType();
5184 }
5185 QualType OriginalType = readType(*Loc.F, Record, Idx);
5186 QualType DT = Context.getAdjustedParameterType(OriginalType);
5187 if (!isa<DecayedType>(DT))
5188 Error("Decayed type does not decay");
5189 return DT;
5190 }
5191
Reid Kleckner0503a872013-12-05 01:23:43 +00005192 case TYPE_ADJUSTED: {
5193 if (Record.size() != 2) {
5194 Error("Incorrect encoding of adjusted type");
5195 return QualType();
5196 }
5197 QualType OriginalTy = readType(*Loc.F, Record, Idx);
5198 QualType AdjustedTy = readType(*Loc.F, Record, Idx);
5199 return Context.getAdjustedType(OriginalTy, AdjustedTy);
5200 }
5201
Guy Benyei11169dd2012-12-18 14:30:41 +00005202 case TYPE_BLOCK_POINTER: {
5203 if (Record.size() != 1) {
5204 Error("Incorrect encoding of block pointer type");
5205 return QualType();
5206 }
5207 QualType PointeeType = readType(*Loc.F, Record, Idx);
5208 return Context.getBlockPointerType(PointeeType);
5209 }
5210
5211 case TYPE_LVALUE_REFERENCE: {
5212 if (Record.size() != 2) {
5213 Error("Incorrect encoding of lvalue reference type");
5214 return QualType();
5215 }
5216 QualType PointeeType = readType(*Loc.F, Record, Idx);
5217 return Context.getLValueReferenceType(PointeeType, Record[1]);
5218 }
5219
5220 case TYPE_RVALUE_REFERENCE: {
5221 if (Record.size() != 1) {
5222 Error("Incorrect encoding of rvalue reference type");
5223 return QualType();
5224 }
5225 QualType PointeeType = readType(*Loc.F, Record, Idx);
5226 return Context.getRValueReferenceType(PointeeType);
5227 }
5228
5229 case TYPE_MEMBER_POINTER: {
5230 if (Record.size() != 2) {
5231 Error("Incorrect encoding of member pointer type");
5232 return QualType();
5233 }
5234 QualType PointeeType = readType(*Loc.F, Record, Idx);
5235 QualType ClassType = readType(*Loc.F, Record, Idx);
5236 if (PointeeType.isNull() || ClassType.isNull())
5237 return QualType();
5238
5239 return Context.getMemberPointerType(PointeeType, ClassType.getTypePtr());
5240 }
5241
5242 case TYPE_CONSTANT_ARRAY: {
5243 QualType ElementType = readType(*Loc.F, Record, Idx);
5244 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5245 unsigned IndexTypeQuals = Record[2];
5246 unsigned Idx = 3;
5247 llvm::APInt Size = ReadAPInt(Record, Idx);
5248 return Context.getConstantArrayType(ElementType, Size,
5249 ASM, IndexTypeQuals);
5250 }
5251
5252 case TYPE_INCOMPLETE_ARRAY: {
5253 QualType ElementType = readType(*Loc.F, Record, Idx);
5254 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5255 unsigned IndexTypeQuals = Record[2];
5256 return Context.getIncompleteArrayType(ElementType, ASM, IndexTypeQuals);
5257 }
5258
5259 case TYPE_VARIABLE_ARRAY: {
5260 QualType ElementType = readType(*Loc.F, Record, Idx);
5261 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5262 unsigned IndexTypeQuals = Record[2];
5263 SourceLocation LBLoc = ReadSourceLocation(*Loc.F, Record[3]);
5264 SourceLocation RBLoc = ReadSourceLocation(*Loc.F, Record[4]);
5265 return Context.getVariableArrayType(ElementType, ReadExpr(*Loc.F),
5266 ASM, IndexTypeQuals,
5267 SourceRange(LBLoc, RBLoc));
5268 }
5269
5270 case TYPE_VECTOR: {
5271 if (Record.size() != 3) {
5272 Error("incorrect encoding of vector type in AST file");
5273 return QualType();
5274 }
5275
5276 QualType ElementType = readType(*Loc.F, Record, Idx);
5277 unsigned NumElements = Record[1];
5278 unsigned VecKind = Record[2];
5279 return Context.getVectorType(ElementType, NumElements,
5280 (VectorType::VectorKind)VecKind);
5281 }
5282
5283 case TYPE_EXT_VECTOR: {
5284 if (Record.size() != 3) {
5285 Error("incorrect encoding of extended vector type in AST file");
5286 return QualType();
5287 }
5288
5289 QualType ElementType = readType(*Loc.F, Record, Idx);
5290 unsigned NumElements = Record[1];
5291 return Context.getExtVectorType(ElementType, NumElements);
5292 }
5293
5294 case TYPE_FUNCTION_NO_PROTO: {
5295 if (Record.size() != 6) {
5296 Error("incorrect encoding of no-proto function type");
5297 return QualType();
5298 }
5299 QualType ResultType = readType(*Loc.F, Record, Idx);
5300 FunctionType::ExtInfo Info(Record[1], Record[2], Record[3],
5301 (CallingConv)Record[4], Record[5]);
5302 return Context.getFunctionNoProtoType(ResultType, Info);
5303 }
5304
5305 case TYPE_FUNCTION_PROTO: {
5306 QualType ResultType = readType(*Loc.F, Record, Idx);
5307
5308 FunctionProtoType::ExtProtoInfo EPI;
5309 EPI.ExtInfo = FunctionType::ExtInfo(/*noreturn*/ Record[1],
5310 /*hasregparm*/ Record[2],
5311 /*regparm*/ Record[3],
5312 static_cast<CallingConv>(Record[4]),
5313 /*produces*/ Record[5]);
5314
5315 unsigned Idx = 6;
Guy Benyei11169dd2012-12-18 14:30:41 +00005316
5317 EPI.Variadic = Record[Idx++];
5318 EPI.HasTrailingReturn = Record[Idx++];
5319 EPI.TypeQuals = Record[Idx++];
5320 EPI.RefQualifier = static_cast<RefQualifierKind>(Record[Idx++]);
Richard Smith564417a2014-03-20 21:47:22 +00005321 SmallVector<QualType, 8> ExceptionStorage;
Richard Smith8acb4282014-07-31 21:57:55 +00005322 readExceptionSpec(*Loc.F, ExceptionStorage, EPI.ExceptionSpec, Record, Idx);
Richard Smith01b2cb42014-07-26 06:37:51 +00005323
5324 unsigned NumParams = Record[Idx++];
5325 SmallVector<QualType, 16> ParamTypes;
5326 for (unsigned I = 0; I != NumParams; ++I)
5327 ParamTypes.push_back(readType(*Loc.F, Record, Idx));
5328
Jordan Rose5c382722013-03-08 21:51:21 +00005329 return Context.getFunctionType(ResultType, ParamTypes, EPI);
Guy Benyei11169dd2012-12-18 14:30:41 +00005330 }
5331
5332 case TYPE_UNRESOLVED_USING: {
5333 unsigned Idx = 0;
5334 return Context.getTypeDeclType(
5335 ReadDeclAs<UnresolvedUsingTypenameDecl>(*Loc.F, Record, Idx));
5336 }
5337
5338 case TYPE_TYPEDEF: {
5339 if (Record.size() != 2) {
5340 Error("incorrect encoding of typedef type");
5341 return QualType();
5342 }
5343 unsigned Idx = 0;
5344 TypedefNameDecl *Decl = ReadDeclAs<TypedefNameDecl>(*Loc.F, Record, Idx);
5345 QualType Canonical = readType(*Loc.F, Record, Idx);
5346 if (!Canonical.isNull())
5347 Canonical = Context.getCanonicalType(Canonical);
5348 return Context.getTypedefType(Decl, Canonical);
5349 }
5350
5351 case TYPE_TYPEOF_EXPR:
5352 return Context.getTypeOfExprType(ReadExpr(*Loc.F));
5353
5354 case TYPE_TYPEOF: {
5355 if (Record.size() != 1) {
5356 Error("incorrect encoding of typeof(type) in AST file");
5357 return QualType();
5358 }
5359 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5360 return Context.getTypeOfType(UnderlyingType);
5361 }
5362
5363 case TYPE_DECLTYPE: {
5364 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5365 return Context.getDecltypeType(ReadExpr(*Loc.F), UnderlyingType);
5366 }
5367
5368 case TYPE_UNARY_TRANSFORM: {
5369 QualType BaseType = readType(*Loc.F, Record, Idx);
5370 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5371 UnaryTransformType::UTTKind UKind = (UnaryTransformType::UTTKind)Record[2];
5372 return Context.getUnaryTransformType(BaseType, UnderlyingType, UKind);
5373 }
5374
Richard Smith74aeef52013-04-26 16:15:35 +00005375 case TYPE_AUTO: {
5376 QualType Deduced = readType(*Loc.F, Record, Idx);
5377 bool IsDecltypeAuto = Record[Idx++];
Richard Smith27d807c2013-04-30 13:56:41 +00005378 bool IsDependent = Deduced.isNull() ? Record[Idx++] : false;
Manuel Klimek2fdbea22013-08-22 12:12:24 +00005379 return Context.getAutoType(Deduced, IsDecltypeAuto, IsDependent);
Richard Smith74aeef52013-04-26 16:15:35 +00005380 }
Guy Benyei11169dd2012-12-18 14:30:41 +00005381
5382 case TYPE_RECORD: {
5383 if (Record.size() != 2) {
5384 Error("incorrect encoding of record type");
5385 return QualType();
5386 }
5387 unsigned Idx = 0;
5388 bool IsDependent = Record[Idx++];
5389 RecordDecl *RD = ReadDeclAs<RecordDecl>(*Loc.F, Record, Idx);
5390 RD = cast_or_null<RecordDecl>(RD->getCanonicalDecl());
5391 QualType T = Context.getRecordType(RD);
5392 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5393 return T;
5394 }
5395
5396 case TYPE_ENUM: {
5397 if (Record.size() != 2) {
5398 Error("incorrect encoding of enum type");
5399 return QualType();
5400 }
5401 unsigned Idx = 0;
5402 bool IsDependent = Record[Idx++];
5403 QualType T
5404 = Context.getEnumType(ReadDeclAs<EnumDecl>(*Loc.F, Record, Idx));
5405 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5406 return T;
5407 }
5408
5409 case TYPE_ATTRIBUTED: {
5410 if (Record.size() != 3) {
5411 Error("incorrect encoding of attributed type");
5412 return QualType();
5413 }
5414 QualType modifiedType = readType(*Loc.F, Record, Idx);
5415 QualType equivalentType = readType(*Loc.F, Record, Idx);
5416 AttributedType::Kind kind = static_cast<AttributedType::Kind>(Record[2]);
5417 return Context.getAttributedType(kind, modifiedType, equivalentType);
5418 }
5419
5420 case TYPE_PAREN: {
5421 if (Record.size() != 1) {
5422 Error("incorrect encoding of paren type");
5423 return QualType();
5424 }
5425 QualType InnerType = readType(*Loc.F, Record, Idx);
5426 return Context.getParenType(InnerType);
5427 }
5428
5429 case TYPE_PACK_EXPANSION: {
5430 if (Record.size() != 2) {
5431 Error("incorrect encoding of pack expansion type");
5432 return QualType();
5433 }
5434 QualType Pattern = readType(*Loc.F, Record, Idx);
5435 if (Pattern.isNull())
5436 return QualType();
David Blaikie05785d12013-02-20 22:23:23 +00005437 Optional<unsigned> NumExpansions;
Guy Benyei11169dd2012-12-18 14:30:41 +00005438 if (Record[1])
5439 NumExpansions = Record[1] - 1;
5440 return Context.getPackExpansionType(Pattern, NumExpansions);
5441 }
5442
5443 case TYPE_ELABORATED: {
5444 unsigned Idx = 0;
5445 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5446 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5447 QualType NamedType = readType(*Loc.F, Record, Idx);
5448 return Context.getElaboratedType(Keyword, NNS, NamedType);
5449 }
5450
5451 case TYPE_OBJC_INTERFACE: {
5452 unsigned Idx = 0;
5453 ObjCInterfaceDecl *ItfD
5454 = ReadDeclAs<ObjCInterfaceDecl>(*Loc.F, Record, Idx);
5455 return Context.getObjCInterfaceType(ItfD->getCanonicalDecl());
5456 }
5457
5458 case TYPE_OBJC_OBJECT: {
5459 unsigned Idx = 0;
5460 QualType Base = readType(*Loc.F, Record, Idx);
5461 unsigned NumProtos = Record[Idx++];
5462 SmallVector<ObjCProtocolDecl*, 4> Protos;
5463 for (unsigned I = 0; I != NumProtos; ++I)
5464 Protos.push_back(ReadDeclAs<ObjCProtocolDecl>(*Loc.F, Record, Idx));
5465 return Context.getObjCObjectType(Base, Protos.data(), NumProtos);
5466 }
5467
5468 case TYPE_OBJC_OBJECT_POINTER: {
5469 unsigned Idx = 0;
5470 QualType Pointee = readType(*Loc.F, Record, Idx);
5471 return Context.getObjCObjectPointerType(Pointee);
5472 }
5473
5474 case TYPE_SUBST_TEMPLATE_TYPE_PARM: {
5475 unsigned Idx = 0;
5476 QualType Parm = readType(*Loc.F, Record, Idx);
5477 QualType Replacement = readType(*Loc.F, Record, Idx);
Stephan Tolksdorfe96f8b32014-03-15 10:23:27 +00005478 return Context.getSubstTemplateTypeParmType(
5479 cast<TemplateTypeParmType>(Parm),
5480 Context.getCanonicalType(Replacement));
Guy Benyei11169dd2012-12-18 14:30:41 +00005481 }
5482
5483 case TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK: {
5484 unsigned Idx = 0;
5485 QualType Parm = readType(*Loc.F, Record, Idx);
5486 TemplateArgument ArgPack = ReadTemplateArgument(*Loc.F, Record, Idx);
5487 return Context.getSubstTemplateTypeParmPackType(
5488 cast<TemplateTypeParmType>(Parm),
5489 ArgPack);
5490 }
5491
5492 case TYPE_INJECTED_CLASS_NAME: {
5493 CXXRecordDecl *D = ReadDeclAs<CXXRecordDecl>(*Loc.F, Record, Idx);
5494 QualType TST = readType(*Loc.F, Record, Idx); // probably derivable
5495 // FIXME: ASTContext::getInjectedClassNameType is not currently suitable
5496 // for AST reading, too much interdependencies.
Richard Smithf17fdbd2014-04-24 02:25:27 +00005497 const Type *T;
5498 if (const Type *Existing = D->getTypeForDecl())
5499 T = Existing;
5500 else if (auto *Prev = D->getPreviousDecl())
5501 T = Prev->getTypeForDecl();
5502 else
5503 T = new (Context, TypeAlignment) InjectedClassNameType(D, TST);
5504 return QualType(T, 0);
Guy Benyei11169dd2012-12-18 14:30:41 +00005505 }
5506
5507 case TYPE_TEMPLATE_TYPE_PARM: {
5508 unsigned Idx = 0;
5509 unsigned Depth = Record[Idx++];
5510 unsigned Index = Record[Idx++];
5511 bool Pack = Record[Idx++];
5512 TemplateTypeParmDecl *D
5513 = ReadDeclAs<TemplateTypeParmDecl>(*Loc.F, Record, Idx);
5514 return Context.getTemplateTypeParmType(Depth, Index, Pack, D);
5515 }
5516
5517 case TYPE_DEPENDENT_NAME: {
5518 unsigned Idx = 0;
5519 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5520 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5521 const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx);
5522 QualType Canon = readType(*Loc.F, Record, Idx);
5523 if (!Canon.isNull())
5524 Canon = Context.getCanonicalType(Canon);
5525 return Context.getDependentNameType(Keyword, NNS, Name, Canon);
5526 }
5527
5528 case TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION: {
5529 unsigned Idx = 0;
5530 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5531 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5532 const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx);
5533 unsigned NumArgs = Record[Idx++];
5534 SmallVector<TemplateArgument, 8> Args;
5535 Args.reserve(NumArgs);
5536 while (NumArgs--)
5537 Args.push_back(ReadTemplateArgument(*Loc.F, Record, Idx));
5538 return Context.getDependentTemplateSpecializationType(Keyword, NNS, Name,
5539 Args.size(), Args.data());
5540 }
5541
5542 case TYPE_DEPENDENT_SIZED_ARRAY: {
5543 unsigned Idx = 0;
5544
5545 // ArrayType
5546 QualType ElementType = readType(*Loc.F, Record, Idx);
5547 ArrayType::ArraySizeModifier ASM
5548 = (ArrayType::ArraySizeModifier)Record[Idx++];
5549 unsigned IndexTypeQuals = Record[Idx++];
5550
5551 // DependentSizedArrayType
5552 Expr *NumElts = ReadExpr(*Loc.F);
5553 SourceRange Brackets = ReadSourceRange(*Loc.F, Record, Idx);
5554
5555 return Context.getDependentSizedArrayType(ElementType, NumElts, ASM,
5556 IndexTypeQuals, Brackets);
5557 }
5558
5559 case TYPE_TEMPLATE_SPECIALIZATION: {
5560 unsigned Idx = 0;
5561 bool IsDependent = Record[Idx++];
5562 TemplateName Name = ReadTemplateName(*Loc.F, Record, Idx);
5563 SmallVector<TemplateArgument, 8> Args;
5564 ReadTemplateArgumentList(Args, *Loc.F, Record, Idx);
5565 QualType Underlying = readType(*Loc.F, Record, Idx);
5566 QualType T;
5567 if (Underlying.isNull())
5568 T = Context.getCanonicalTemplateSpecializationType(Name, Args.data(),
5569 Args.size());
5570 else
5571 T = Context.getTemplateSpecializationType(Name, Args.data(),
5572 Args.size(), Underlying);
5573 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5574 return T;
5575 }
5576
5577 case TYPE_ATOMIC: {
5578 if (Record.size() != 1) {
5579 Error("Incorrect encoding of atomic type");
5580 return QualType();
5581 }
5582 QualType ValueType = readType(*Loc.F, Record, Idx);
5583 return Context.getAtomicType(ValueType);
5584 }
5585 }
5586 llvm_unreachable("Invalid TypeCode!");
5587}
5588
Richard Smith564417a2014-03-20 21:47:22 +00005589void ASTReader::readExceptionSpec(ModuleFile &ModuleFile,
5590 SmallVectorImpl<QualType> &Exceptions,
Richard Smith8acb4282014-07-31 21:57:55 +00005591 FunctionProtoType::ExceptionSpecInfo &ESI,
Richard Smith564417a2014-03-20 21:47:22 +00005592 const RecordData &Record, unsigned &Idx) {
5593 ExceptionSpecificationType EST =
5594 static_cast<ExceptionSpecificationType>(Record[Idx++]);
Richard Smith8acb4282014-07-31 21:57:55 +00005595 ESI.Type = EST;
Richard Smith564417a2014-03-20 21:47:22 +00005596 if (EST == EST_Dynamic) {
Richard Smith8acb4282014-07-31 21:57:55 +00005597 for (unsigned I = 0, N = Record[Idx++]; I != N; ++I)
Richard Smith564417a2014-03-20 21:47:22 +00005598 Exceptions.push_back(readType(ModuleFile, Record, Idx));
Richard Smith8acb4282014-07-31 21:57:55 +00005599 ESI.Exceptions = Exceptions;
Richard Smith564417a2014-03-20 21:47:22 +00005600 } else if (EST == EST_ComputedNoexcept) {
Richard Smith8acb4282014-07-31 21:57:55 +00005601 ESI.NoexceptExpr = ReadExpr(ModuleFile);
Richard Smith564417a2014-03-20 21:47:22 +00005602 } else if (EST == EST_Uninstantiated) {
Richard Smith8acb4282014-07-31 21:57:55 +00005603 ESI.SourceDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
5604 ESI.SourceTemplate = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
Richard Smith564417a2014-03-20 21:47:22 +00005605 } else if (EST == EST_Unevaluated) {
Richard Smith8acb4282014-07-31 21:57:55 +00005606 ESI.SourceDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
Richard Smith564417a2014-03-20 21:47:22 +00005607 }
5608}
5609
Guy Benyei11169dd2012-12-18 14:30:41 +00005610class clang::TypeLocReader : public TypeLocVisitor<TypeLocReader> {
5611 ASTReader &Reader;
5612 ModuleFile &F;
5613 const ASTReader::RecordData &Record;
5614 unsigned &Idx;
5615
5616 SourceLocation ReadSourceLocation(const ASTReader::RecordData &R,
5617 unsigned &I) {
5618 return Reader.ReadSourceLocation(F, R, I);
5619 }
5620
5621 template<typename T>
5622 T *ReadDeclAs(const ASTReader::RecordData &Record, unsigned &Idx) {
5623 return Reader.ReadDeclAs<T>(F, Record, Idx);
5624 }
5625
5626public:
5627 TypeLocReader(ASTReader &Reader, ModuleFile &F,
5628 const ASTReader::RecordData &Record, unsigned &Idx)
5629 : Reader(Reader), F(F), Record(Record), Idx(Idx)
5630 { }
5631
5632 // We want compile-time assurance that we've enumerated all of
5633 // these, so unfortunately we have to declare them first, then
5634 // define them out-of-line.
5635#define ABSTRACT_TYPELOC(CLASS, PARENT)
5636#define TYPELOC(CLASS, PARENT) \
5637 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
5638#include "clang/AST/TypeLocNodes.def"
5639
5640 void VisitFunctionTypeLoc(FunctionTypeLoc);
5641 void VisitArrayTypeLoc(ArrayTypeLoc);
5642};
5643
5644void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
5645 // nothing to do
5646}
5647void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
5648 TL.setBuiltinLoc(ReadSourceLocation(Record, Idx));
5649 if (TL.needsExtraLocalData()) {
5650 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Record[Idx++]));
5651 TL.setWrittenSignSpec(static_cast<DeclSpec::TSS>(Record[Idx++]));
5652 TL.setWrittenWidthSpec(static_cast<DeclSpec::TSW>(Record[Idx++]));
5653 TL.setModeAttr(Record[Idx++]);
5654 }
5655}
5656void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
5657 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5658}
5659void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
5660 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5661}
Reid Kleckner8a365022013-06-24 17:51:48 +00005662void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
5663 // nothing to do
5664}
Reid Kleckner0503a872013-12-05 01:23:43 +00005665void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
5666 // nothing to do
5667}
Guy Benyei11169dd2012-12-18 14:30:41 +00005668void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
5669 TL.setCaretLoc(ReadSourceLocation(Record, Idx));
5670}
5671void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
5672 TL.setAmpLoc(ReadSourceLocation(Record, Idx));
5673}
5674void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
5675 TL.setAmpAmpLoc(ReadSourceLocation(Record, Idx));
5676}
5677void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
5678 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5679 TL.setClassTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5680}
5681void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) {
5682 TL.setLBracketLoc(ReadSourceLocation(Record, Idx));
5683 TL.setRBracketLoc(ReadSourceLocation(Record, Idx));
5684 if (Record[Idx++])
5685 TL.setSizeExpr(Reader.ReadExpr(F));
5686 else
Craig Toppera13603a2014-05-22 05:54:18 +00005687 TL.setSizeExpr(nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00005688}
5689void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) {
5690 VisitArrayTypeLoc(TL);
5691}
5692void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) {
5693 VisitArrayTypeLoc(TL);
5694}
5695void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
5696 VisitArrayTypeLoc(TL);
5697}
5698void TypeLocReader::VisitDependentSizedArrayTypeLoc(
5699 DependentSizedArrayTypeLoc TL) {
5700 VisitArrayTypeLoc(TL);
5701}
5702void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
5703 DependentSizedExtVectorTypeLoc TL) {
5704 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5705}
5706void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
5707 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5708}
5709void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
5710 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5711}
5712void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) {
5713 TL.setLocalRangeBegin(ReadSourceLocation(Record, Idx));
5714 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5715 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5716 TL.setLocalRangeEnd(ReadSourceLocation(Record, Idx));
Alp Tokerb3fd5cf2014-01-21 00:32:38 +00005717 for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) {
5718 TL.setParam(i, ReadDeclAs<ParmVarDecl>(Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00005719 }
5720}
5721void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) {
5722 VisitFunctionTypeLoc(TL);
5723}
5724void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) {
5725 VisitFunctionTypeLoc(TL);
5726}
5727void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
5728 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5729}
5730void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
5731 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5732}
5733void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
5734 TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
5735 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5736 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5737}
5738void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
5739 TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
5740 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5741 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5742 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5743}
5744void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
5745 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5746}
5747void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
5748 TL.setKWLoc(ReadSourceLocation(Record, Idx));
5749 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5750 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5751 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5752}
5753void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) {
5754 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5755}
5756void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) {
5757 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5758}
5759void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) {
5760 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5761}
5762void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
5763 TL.setAttrNameLoc(ReadSourceLocation(Record, Idx));
5764 if (TL.hasAttrOperand()) {
5765 SourceRange range;
5766 range.setBegin(ReadSourceLocation(Record, Idx));
5767 range.setEnd(ReadSourceLocation(Record, Idx));
5768 TL.setAttrOperandParensRange(range);
5769 }
5770 if (TL.hasAttrExprOperand()) {
5771 if (Record[Idx++])
5772 TL.setAttrExprOperand(Reader.ReadExpr(F));
5773 else
Craig Toppera13603a2014-05-22 05:54:18 +00005774 TL.setAttrExprOperand(nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00005775 } else if (TL.hasAttrEnumOperand())
5776 TL.setAttrEnumOperandLoc(ReadSourceLocation(Record, Idx));
5777}
5778void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
5779 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5780}
5781void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
5782 SubstTemplateTypeParmTypeLoc TL) {
5783 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5784}
5785void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
5786 SubstTemplateTypeParmPackTypeLoc TL) {
5787 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5788}
5789void TypeLocReader::VisitTemplateSpecializationTypeLoc(
5790 TemplateSpecializationTypeLoc TL) {
5791 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx));
5792 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx));
5793 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5794 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5795 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i)
5796 TL.setArgLocInfo(i,
5797 Reader.GetTemplateArgumentLocInfo(F,
5798 TL.getTypePtr()->getArg(i).getKind(),
5799 Record, Idx));
5800}
5801void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
5802 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5803 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5804}
5805void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
5806 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5807 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5808}
5809void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
5810 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5811}
5812void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
5813 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5814 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5815 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5816}
5817void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc(
5818 DependentTemplateSpecializationTypeLoc TL) {
5819 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5820 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5821 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx));
5822 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx));
5823 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5824 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5825 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
5826 TL.setArgLocInfo(I,
5827 Reader.GetTemplateArgumentLocInfo(F,
5828 TL.getTypePtr()->getArg(I).getKind(),
5829 Record, Idx));
5830}
5831void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
5832 TL.setEllipsisLoc(ReadSourceLocation(Record, Idx));
5833}
5834void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
5835 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5836}
5837void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
5838 TL.setHasBaseTypeAsWritten(Record[Idx++]);
5839 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5840 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5841 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
5842 TL.setProtocolLoc(i, ReadSourceLocation(Record, Idx));
5843}
5844void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
5845 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5846}
5847void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
5848 TL.setKWLoc(ReadSourceLocation(Record, Idx));
5849 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5850 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5851}
5852
5853TypeSourceInfo *ASTReader::GetTypeSourceInfo(ModuleFile &F,
5854 const RecordData &Record,
5855 unsigned &Idx) {
5856 QualType InfoTy = readType(F, Record, Idx);
5857 if (InfoTy.isNull())
Craig Toppera13603a2014-05-22 05:54:18 +00005858 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00005859
5860 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy);
5861 TypeLocReader TLR(*this, F, Record, Idx);
5862 for (TypeLoc TL = TInfo->getTypeLoc(); !TL.isNull(); TL = TL.getNextTypeLoc())
5863 TLR.Visit(TL);
5864 return TInfo;
5865}
5866
5867QualType ASTReader::GetType(TypeID ID) {
5868 unsigned FastQuals = ID & Qualifiers::FastMask;
5869 unsigned Index = ID >> Qualifiers::FastWidth;
5870
5871 if (Index < NUM_PREDEF_TYPE_IDS) {
5872 QualType T;
5873 switch ((PredefinedTypeIDs)Index) {
5874 case PREDEF_TYPE_NULL_ID: return QualType();
5875 case PREDEF_TYPE_VOID_ID: T = Context.VoidTy; break;
5876 case PREDEF_TYPE_BOOL_ID: T = Context.BoolTy; break;
5877
5878 case PREDEF_TYPE_CHAR_U_ID:
5879 case PREDEF_TYPE_CHAR_S_ID:
5880 // FIXME: Check that the signedness of CharTy is correct!
5881 T = Context.CharTy;
5882 break;
5883
5884 case PREDEF_TYPE_UCHAR_ID: T = Context.UnsignedCharTy; break;
5885 case PREDEF_TYPE_USHORT_ID: T = Context.UnsignedShortTy; break;
5886 case PREDEF_TYPE_UINT_ID: T = Context.UnsignedIntTy; break;
5887 case PREDEF_TYPE_ULONG_ID: T = Context.UnsignedLongTy; break;
5888 case PREDEF_TYPE_ULONGLONG_ID: T = Context.UnsignedLongLongTy; break;
5889 case PREDEF_TYPE_UINT128_ID: T = Context.UnsignedInt128Ty; break;
5890 case PREDEF_TYPE_SCHAR_ID: T = Context.SignedCharTy; break;
5891 case PREDEF_TYPE_WCHAR_ID: T = Context.WCharTy; break;
5892 case PREDEF_TYPE_SHORT_ID: T = Context.ShortTy; break;
5893 case PREDEF_TYPE_INT_ID: T = Context.IntTy; break;
5894 case PREDEF_TYPE_LONG_ID: T = Context.LongTy; break;
5895 case PREDEF_TYPE_LONGLONG_ID: T = Context.LongLongTy; break;
5896 case PREDEF_TYPE_INT128_ID: T = Context.Int128Ty; break;
5897 case PREDEF_TYPE_HALF_ID: T = Context.HalfTy; break;
5898 case PREDEF_TYPE_FLOAT_ID: T = Context.FloatTy; break;
5899 case PREDEF_TYPE_DOUBLE_ID: T = Context.DoubleTy; break;
5900 case PREDEF_TYPE_LONGDOUBLE_ID: T = Context.LongDoubleTy; break;
5901 case PREDEF_TYPE_OVERLOAD_ID: T = Context.OverloadTy; break;
5902 case PREDEF_TYPE_BOUND_MEMBER: T = Context.BoundMemberTy; break;
5903 case PREDEF_TYPE_PSEUDO_OBJECT: T = Context.PseudoObjectTy; break;
5904 case PREDEF_TYPE_DEPENDENT_ID: T = Context.DependentTy; break;
5905 case PREDEF_TYPE_UNKNOWN_ANY: T = Context.UnknownAnyTy; break;
5906 case PREDEF_TYPE_NULLPTR_ID: T = Context.NullPtrTy; break;
5907 case PREDEF_TYPE_CHAR16_ID: T = Context.Char16Ty; break;
5908 case PREDEF_TYPE_CHAR32_ID: T = Context.Char32Ty; break;
5909 case PREDEF_TYPE_OBJC_ID: T = Context.ObjCBuiltinIdTy; break;
5910 case PREDEF_TYPE_OBJC_CLASS: T = Context.ObjCBuiltinClassTy; break;
5911 case PREDEF_TYPE_OBJC_SEL: T = Context.ObjCBuiltinSelTy; break;
Guy Benyeid8a08ea2012-12-18 14:38:23 +00005912 case PREDEF_TYPE_IMAGE1D_ID: T = Context.OCLImage1dTy; break;
5913 case PREDEF_TYPE_IMAGE1D_ARR_ID: T = Context.OCLImage1dArrayTy; break;
5914 case PREDEF_TYPE_IMAGE1D_BUFF_ID: T = Context.OCLImage1dBufferTy; break;
5915 case PREDEF_TYPE_IMAGE2D_ID: T = Context.OCLImage2dTy; break;
5916 case PREDEF_TYPE_IMAGE2D_ARR_ID: T = Context.OCLImage2dArrayTy; break;
5917 case PREDEF_TYPE_IMAGE3D_ID: T = Context.OCLImage3dTy; break;
Guy Benyei61054192013-02-07 10:55:47 +00005918 case PREDEF_TYPE_SAMPLER_ID: T = Context.OCLSamplerTy; break;
Guy Benyei1b4fb3e2013-01-20 12:31:11 +00005919 case PREDEF_TYPE_EVENT_ID: T = Context.OCLEventTy; break;
Guy Benyei11169dd2012-12-18 14:30:41 +00005920 case PREDEF_TYPE_AUTO_DEDUCT: T = Context.getAutoDeductType(); break;
5921
5922 case PREDEF_TYPE_AUTO_RREF_DEDUCT:
5923 T = Context.getAutoRRefDeductType();
5924 break;
5925
5926 case PREDEF_TYPE_ARC_UNBRIDGED_CAST:
5927 T = Context.ARCUnbridgedCastTy;
5928 break;
5929
5930 case PREDEF_TYPE_VA_LIST_TAG:
5931 T = Context.getVaListTagType();
5932 break;
5933
5934 case PREDEF_TYPE_BUILTIN_FN:
5935 T = Context.BuiltinFnTy;
5936 break;
5937 }
5938
5939 assert(!T.isNull() && "Unknown predefined type");
5940 return T.withFastQualifiers(FastQuals);
5941 }
5942
5943 Index -= NUM_PREDEF_TYPE_IDS;
5944 assert(Index < TypesLoaded.size() && "Type index out-of-range");
5945 if (TypesLoaded[Index].isNull()) {
5946 TypesLoaded[Index] = readTypeRecord(Index);
5947 if (TypesLoaded[Index].isNull())
5948 return QualType();
5949
5950 TypesLoaded[Index]->setFromAST();
5951 if (DeserializationListener)
5952 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID),
5953 TypesLoaded[Index]);
5954 }
5955
5956 return TypesLoaded[Index].withFastQualifiers(FastQuals);
5957}
5958
5959QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) {
5960 return GetType(getGlobalTypeID(F, LocalID));
5961}
5962
5963serialization::TypeID
5964ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const {
5965 unsigned FastQuals = LocalID & Qualifiers::FastMask;
5966 unsigned LocalIndex = LocalID >> Qualifiers::FastWidth;
5967
5968 if (LocalIndex < NUM_PREDEF_TYPE_IDS)
5969 return LocalID;
5970
5971 ContinuousRangeMap<uint32_t, int, 2>::iterator I
5972 = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS);
5973 assert(I != F.TypeRemap.end() && "Invalid index into type index remap");
5974
5975 unsigned GlobalIndex = LocalIndex + I->second;
5976 return (GlobalIndex << Qualifiers::FastWidth) | FastQuals;
5977}
5978
5979TemplateArgumentLocInfo
5980ASTReader::GetTemplateArgumentLocInfo(ModuleFile &F,
5981 TemplateArgument::ArgKind Kind,
5982 const RecordData &Record,
5983 unsigned &Index) {
5984 switch (Kind) {
5985 case TemplateArgument::Expression:
5986 return ReadExpr(F);
5987 case TemplateArgument::Type:
5988 return GetTypeSourceInfo(F, Record, Index);
5989 case TemplateArgument::Template: {
5990 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
5991 Index);
5992 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
5993 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
5994 SourceLocation());
5995 }
5996 case TemplateArgument::TemplateExpansion: {
5997 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
5998 Index);
5999 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
6000 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Index);
6001 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
6002 EllipsisLoc);
6003 }
6004 case TemplateArgument::Null:
6005 case TemplateArgument::Integral:
6006 case TemplateArgument::Declaration:
6007 case TemplateArgument::NullPtr:
6008 case TemplateArgument::Pack:
6009 // FIXME: Is this right?
6010 return TemplateArgumentLocInfo();
6011 }
6012 llvm_unreachable("unexpected template argument loc");
6013}
6014
6015TemplateArgumentLoc
6016ASTReader::ReadTemplateArgumentLoc(ModuleFile &F,
6017 const RecordData &Record, unsigned &Index) {
6018 TemplateArgument Arg = ReadTemplateArgument(F, Record, Index);
6019
6020 if (Arg.getKind() == TemplateArgument::Expression) {
6021 if (Record[Index++]) // bool InfoHasSameExpr.
6022 return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr()));
6023 }
6024 return TemplateArgumentLoc(Arg, GetTemplateArgumentLocInfo(F, Arg.getKind(),
6025 Record, Index));
6026}
6027
Enea Zaffanella6dbe1872013-08-10 07:24:53 +00006028const ASTTemplateArgumentListInfo*
6029ASTReader::ReadASTTemplateArgumentListInfo(ModuleFile &F,
6030 const RecordData &Record,
6031 unsigned &Index) {
6032 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Index);
6033 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Index);
6034 unsigned NumArgsAsWritten = Record[Index++];
6035 TemplateArgumentListInfo TemplArgsInfo(LAngleLoc, RAngleLoc);
6036 for (unsigned i = 0; i != NumArgsAsWritten; ++i)
6037 TemplArgsInfo.addArgument(ReadTemplateArgumentLoc(F, Record, Index));
6038 return ASTTemplateArgumentListInfo::Create(getContext(), TemplArgsInfo);
6039}
6040
Guy Benyei11169dd2012-12-18 14:30:41 +00006041Decl *ASTReader::GetExternalDecl(uint32_t ID) {
6042 return GetDecl(ID);
6043}
6044
Richard Smith053f6c62014-05-16 23:01:30 +00006045void ASTReader::CompleteRedeclChain(const Decl *D) {
Richard Smith851072e2014-05-19 20:59:20 +00006046 if (NumCurrentElementsDeserializing) {
6047 // We arrange to not care about the complete redeclaration chain while we're
6048 // deserializing. Just remember that the AST has marked this one as complete
6049 // but that it's not actually complete yet, so we know we still need to
6050 // complete it later.
6051 PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D));
6052 return;
6053 }
6054
Richard Smith053f6c62014-05-16 23:01:30 +00006055 const DeclContext *DC = D->getDeclContext()->getRedeclContext();
6056
Richard Smith053f6c62014-05-16 23:01:30 +00006057 // If this is a named declaration, complete it by looking it up
6058 // within its context.
6059 //
6060 // FIXME: We don't currently handle the cases where we can't do this;
6061 // merging a class definition that contains unnamed entities should merge
6062 // those entities. Likewise, merging a function definition should merge
6063 // all mergeable entities within it.
6064 if (isa<TranslationUnitDecl>(DC) || isa<NamespaceDecl>(DC) ||
6065 isa<CXXRecordDecl>(DC) || isa<EnumDecl>(DC)) {
6066 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) {
6067 auto *II = Name.getAsIdentifierInfo();
6068 if (isa<TranslationUnitDecl>(DC) && II) {
6069 // Outside of C++, we don't have a lookup table for the TU, so update
6070 // the identifier instead. In C++, either way should work fine.
6071 if (II->isOutOfDate())
6072 updateOutOfDateIdentifier(*II);
6073 } else
6074 DC->lookup(Name);
6075 }
6076 }
6077}
6078
Richard Smithcd45dbc2014-04-19 03:48:30 +00006079uint64_t ASTReader::readCXXBaseSpecifiers(ModuleFile &M,
6080 const RecordData &Record,
6081 unsigned &Idx) {
6082 if (Idx >= Record.size() || Record[Idx] > M.LocalNumCXXBaseSpecifiers) {
6083 Error("malformed AST file: missing C++ base specifier");
Guy Benyei11169dd2012-12-18 14:30:41 +00006084 return 0;
Richard Smithcd45dbc2014-04-19 03:48:30 +00006085 }
6086
Guy Benyei11169dd2012-12-18 14:30:41 +00006087 unsigned LocalID = Record[Idx++];
6088 return getGlobalBitOffset(M, M.CXXBaseSpecifiersOffsets[LocalID - 1]);
6089}
6090
6091CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) {
6092 RecordLocation Loc = getLocalBitOffset(Offset);
Chris Lattner7fb3bef2013-01-20 00:56:42 +00006093 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00006094 SavedStreamPosition SavedPosition(Cursor);
6095 Cursor.JumpToBit(Loc.Offset);
6096 ReadingKindTracker ReadingKind(Read_Decl, *this);
6097 RecordData Record;
6098 unsigned Code = Cursor.ReadCode();
Chris Lattner0e6c9402013-01-20 02:38:54 +00006099 unsigned RecCode = Cursor.readRecord(Code, Record);
Guy Benyei11169dd2012-12-18 14:30:41 +00006100 if (RecCode != DECL_CXX_BASE_SPECIFIERS) {
Richard Smithcd45dbc2014-04-19 03:48:30 +00006101 Error("malformed AST file: missing C++ base specifiers");
Craig Toppera13603a2014-05-22 05:54:18 +00006102 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00006103 }
6104
6105 unsigned Idx = 0;
6106 unsigned NumBases = Record[Idx++];
6107 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases);
6108 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases];
6109 for (unsigned I = 0; I != NumBases; ++I)
6110 Bases[I] = ReadCXXBaseSpecifier(*Loc.F, Record, Idx);
6111 return Bases;
6112}
6113
6114serialization::DeclID
6115ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const {
6116 if (LocalID < NUM_PREDEF_DECL_IDS)
6117 return LocalID;
6118
6119 ContinuousRangeMap<uint32_t, int, 2>::iterator I
6120 = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS);
6121 assert(I != F.DeclRemap.end() && "Invalid index into decl index remap");
6122
6123 return LocalID + I->second;
6124}
6125
6126bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID,
6127 ModuleFile &M) const {
6128 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(ID);
6129 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6130 return &M == I->second;
6131}
6132
Douglas Gregor9f782892013-01-21 15:25:38 +00006133ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) {
Guy Benyei11169dd2012-12-18 14:30:41 +00006134 if (!D->isFromASTFile())
Craig Toppera13603a2014-05-22 05:54:18 +00006135 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00006136 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID());
6137 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6138 return I->second;
6139}
6140
6141SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) {
6142 if (ID < NUM_PREDEF_DECL_IDS)
6143 return SourceLocation();
Richard Smithcd45dbc2014-04-19 03:48:30 +00006144
Guy Benyei11169dd2012-12-18 14:30:41 +00006145 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6146
6147 if (Index > DeclsLoaded.size()) {
6148 Error("declaration ID out-of-range for AST file");
6149 return SourceLocation();
6150 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00006151
Guy Benyei11169dd2012-12-18 14:30:41 +00006152 if (Decl *D = DeclsLoaded[Index])
6153 return D->getLocation();
6154
6155 unsigned RawLocation = 0;
6156 RecordLocation Rec = DeclCursorForID(ID, RawLocation);
6157 return ReadSourceLocation(*Rec.F, RawLocation);
6158}
6159
Richard Smithcd45dbc2014-04-19 03:48:30 +00006160Decl *ASTReader::GetExistingDecl(DeclID ID) {
6161 if (ID < NUM_PREDEF_DECL_IDS) {
Guy Benyei11169dd2012-12-18 14:30:41 +00006162 switch ((PredefinedDeclIDs)ID) {
6163 case PREDEF_DECL_NULL_ID:
Craig Toppera13603a2014-05-22 05:54:18 +00006164 return nullptr;
Richard Smithcd45dbc2014-04-19 03:48:30 +00006165
Guy Benyei11169dd2012-12-18 14:30:41 +00006166 case PREDEF_DECL_TRANSLATION_UNIT_ID:
6167 return Context.getTranslationUnitDecl();
Richard Smithcd45dbc2014-04-19 03:48:30 +00006168
Guy Benyei11169dd2012-12-18 14:30:41 +00006169 case PREDEF_DECL_OBJC_ID_ID:
6170 return Context.getObjCIdDecl();
6171
6172 case PREDEF_DECL_OBJC_SEL_ID:
6173 return Context.getObjCSelDecl();
6174
6175 case PREDEF_DECL_OBJC_CLASS_ID:
6176 return Context.getObjCClassDecl();
Richard Smithcd45dbc2014-04-19 03:48:30 +00006177
Guy Benyei11169dd2012-12-18 14:30:41 +00006178 case PREDEF_DECL_OBJC_PROTOCOL_ID:
6179 return Context.getObjCProtocolDecl();
Richard Smithcd45dbc2014-04-19 03:48:30 +00006180
Guy Benyei11169dd2012-12-18 14:30:41 +00006181 case PREDEF_DECL_INT_128_ID:
6182 return Context.getInt128Decl();
6183
6184 case PREDEF_DECL_UNSIGNED_INT_128_ID:
6185 return Context.getUInt128Decl();
Richard Smithcd45dbc2014-04-19 03:48:30 +00006186
Guy Benyei11169dd2012-12-18 14:30:41 +00006187 case PREDEF_DECL_OBJC_INSTANCETYPE_ID:
6188 return Context.getObjCInstanceTypeDecl();
6189
6190 case PREDEF_DECL_BUILTIN_VA_LIST_ID:
6191 return Context.getBuiltinVaListDecl();
6192 }
6193 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00006194
Guy Benyei11169dd2012-12-18 14:30:41 +00006195 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6196
6197 if (Index >= DeclsLoaded.size()) {
6198 assert(0 && "declaration ID out-of-range for AST file");
6199 Error("declaration ID out-of-range for AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00006200 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00006201 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00006202
6203 return DeclsLoaded[Index];
6204}
6205
6206Decl *ASTReader::GetDecl(DeclID ID) {
6207 if (ID < NUM_PREDEF_DECL_IDS)
6208 return GetExistingDecl(ID);
6209
6210 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6211
6212 if (Index >= DeclsLoaded.size()) {
6213 assert(0 && "declaration ID out-of-range for AST file");
6214 Error("declaration ID out-of-range for AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00006215 return nullptr;
Richard Smithcd45dbc2014-04-19 03:48:30 +00006216 }
6217
Guy Benyei11169dd2012-12-18 14:30:41 +00006218 if (!DeclsLoaded[Index]) {
6219 ReadDeclRecord(ID);
6220 if (DeserializationListener)
6221 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
6222 }
6223
6224 return DeclsLoaded[Index];
6225}
6226
6227DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M,
6228 DeclID GlobalID) {
6229 if (GlobalID < NUM_PREDEF_DECL_IDS)
6230 return GlobalID;
6231
6232 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID);
6233 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6234 ModuleFile *Owner = I->second;
6235
6236 llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos
6237 = M.GlobalToLocalDeclIDs.find(Owner);
6238 if (Pos == M.GlobalToLocalDeclIDs.end())
6239 return 0;
6240
6241 return GlobalID - Owner->BaseDeclID + Pos->second;
6242}
6243
6244serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F,
6245 const RecordData &Record,
6246 unsigned &Idx) {
6247 if (Idx >= Record.size()) {
6248 Error("Corrupted AST file");
6249 return 0;
6250 }
6251
6252 return getGlobalDeclID(F, Record[Idx++]);
6253}
6254
6255/// \brief Resolve the offset of a statement into a statement.
6256///
6257/// This operation will read a new statement from the external
6258/// source each time it is called, and is meant to be used via a
6259/// LazyOffsetPtr (which is used by Decls for the body of functions, etc).
6260Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) {
6261 // Switch case IDs are per Decl.
6262 ClearSwitchCaseIDs();
6263
6264 // Offset here is a global offset across the entire chain.
6265 RecordLocation Loc = getLocalBitOffset(Offset);
6266 Loc.F->DeclsCursor.JumpToBit(Loc.Offset);
6267 return ReadStmtFromStream(*Loc.F);
6268}
6269
6270namespace {
6271 class FindExternalLexicalDeclsVisitor {
6272 ASTReader &Reader;
6273 const DeclContext *DC;
6274 bool (*isKindWeWant)(Decl::Kind);
6275
6276 SmallVectorImpl<Decl*> &Decls;
6277 bool PredefsVisited[NUM_PREDEF_DECL_IDS];
6278
6279 public:
6280 FindExternalLexicalDeclsVisitor(ASTReader &Reader, const DeclContext *DC,
6281 bool (*isKindWeWant)(Decl::Kind),
6282 SmallVectorImpl<Decl*> &Decls)
6283 : Reader(Reader), DC(DC), isKindWeWant(isKindWeWant), Decls(Decls)
6284 {
6285 for (unsigned I = 0; I != NUM_PREDEF_DECL_IDS; ++I)
6286 PredefsVisited[I] = false;
6287 }
6288
6289 static bool visit(ModuleFile &M, bool Preorder, void *UserData) {
6290 if (Preorder)
6291 return false;
6292
6293 FindExternalLexicalDeclsVisitor *This
6294 = static_cast<FindExternalLexicalDeclsVisitor *>(UserData);
6295
6296 ModuleFile::DeclContextInfosMap::iterator Info
6297 = M.DeclContextInfos.find(This->DC);
6298 if (Info == M.DeclContextInfos.end() || !Info->second.LexicalDecls)
6299 return false;
6300
6301 // Load all of the declaration IDs
6302 for (const KindDeclIDPair *ID = Info->second.LexicalDecls,
6303 *IDE = ID + Info->second.NumLexicalDecls;
6304 ID != IDE; ++ID) {
6305 if (This->isKindWeWant && !This->isKindWeWant((Decl::Kind)ID->first))
6306 continue;
6307
6308 // Don't add predefined declarations to the lexical context more
6309 // than once.
6310 if (ID->second < NUM_PREDEF_DECL_IDS) {
6311 if (This->PredefsVisited[ID->second])
6312 continue;
6313
6314 This->PredefsVisited[ID->second] = true;
6315 }
6316
6317 if (Decl *D = This->Reader.GetLocalDecl(M, ID->second)) {
6318 if (!This->DC->isDeclInLexicalTraversal(D))
6319 This->Decls.push_back(D);
6320 }
6321 }
6322
6323 return false;
6324 }
6325 };
6326}
6327
6328ExternalLoadResult ASTReader::FindExternalLexicalDecls(const DeclContext *DC,
6329 bool (*isKindWeWant)(Decl::Kind),
6330 SmallVectorImpl<Decl*> &Decls) {
6331 // There might be lexical decls in multiple modules, for the TU at
6332 // least. Walk all of the modules in the order they were loaded.
6333 FindExternalLexicalDeclsVisitor Visitor(*this, DC, isKindWeWant, Decls);
6334 ModuleMgr.visitDepthFirst(&FindExternalLexicalDeclsVisitor::visit, &Visitor);
6335 ++NumLexicalDeclContextsRead;
6336 return ELR_Success;
6337}
6338
6339namespace {
6340
6341class DeclIDComp {
6342 ASTReader &Reader;
6343 ModuleFile &Mod;
6344
6345public:
6346 DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {}
6347
6348 bool operator()(LocalDeclID L, LocalDeclID R) const {
6349 SourceLocation LHS = getLocation(L);
6350 SourceLocation RHS = getLocation(R);
6351 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6352 }
6353
6354 bool operator()(SourceLocation LHS, LocalDeclID R) const {
6355 SourceLocation RHS = getLocation(R);
6356 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6357 }
6358
6359 bool operator()(LocalDeclID L, SourceLocation RHS) const {
6360 SourceLocation LHS = getLocation(L);
6361 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6362 }
6363
6364 SourceLocation getLocation(LocalDeclID ID) const {
6365 return Reader.getSourceManager().getFileLoc(
6366 Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID)));
6367 }
6368};
6369
6370}
6371
6372void ASTReader::FindFileRegionDecls(FileID File,
6373 unsigned Offset, unsigned Length,
6374 SmallVectorImpl<Decl *> &Decls) {
6375 SourceManager &SM = getSourceManager();
6376
6377 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File);
6378 if (I == FileDeclIDs.end())
6379 return;
6380
6381 FileDeclsInfo &DInfo = I->second;
6382 if (DInfo.Decls.empty())
6383 return;
6384
6385 SourceLocation
6386 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset);
6387 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length);
6388
6389 DeclIDComp DIDComp(*this, *DInfo.Mod);
6390 ArrayRef<serialization::LocalDeclID>::iterator
6391 BeginIt = std::lower_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
6392 BeginLoc, DIDComp);
6393 if (BeginIt != DInfo.Decls.begin())
6394 --BeginIt;
6395
6396 // If we are pointing at a top-level decl inside an objc container, we need
6397 // to backtrack until we find it otherwise we will fail to report that the
6398 // region overlaps with an objc container.
6399 while (BeginIt != DInfo.Decls.begin() &&
6400 GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt))
6401 ->isTopLevelDeclInObjCContainer())
6402 --BeginIt;
6403
6404 ArrayRef<serialization::LocalDeclID>::iterator
6405 EndIt = std::upper_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
6406 EndLoc, DIDComp);
6407 if (EndIt != DInfo.Decls.end())
6408 ++EndIt;
6409
6410 for (ArrayRef<serialization::LocalDeclID>::iterator
6411 DIt = BeginIt; DIt != EndIt; ++DIt)
6412 Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt)));
6413}
6414
6415namespace {
6416 /// \brief ModuleFile visitor used to perform name lookup into a
6417 /// declaration context.
6418 class DeclContextNameLookupVisitor {
6419 ASTReader &Reader;
Dmitri Gribenkof8579502013-01-12 19:30:44 +00006420 SmallVectorImpl<const DeclContext *> &Contexts;
Guy Benyei11169dd2012-12-18 14:30:41 +00006421 DeclarationName Name;
6422 SmallVectorImpl<NamedDecl *> &Decls;
6423
6424 public:
6425 DeclContextNameLookupVisitor(ASTReader &Reader,
6426 SmallVectorImpl<const DeclContext *> &Contexts,
6427 DeclarationName Name,
6428 SmallVectorImpl<NamedDecl *> &Decls)
6429 : Reader(Reader), Contexts(Contexts), Name(Name), Decls(Decls) { }
6430
6431 static bool visit(ModuleFile &M, void *UserData) {
6432 DeclContextNameLookupVisitor *This
6433 = static_cast<DeclContextNameLookupVisitor *>(UserData);
6434
6435 // Check whether we have any visible declaration information for
6436 // this context in this module.
6437 ModuleFile::DeclContextInfosMap::iterator Info;
6438 bool FoundInfo = false;
6439 for (unsigned I = 0, N = This->Contexts.size(); I != N; ++I) {
6440 Info = M.DeclContextInfos.find(This->Contexts[I]);
6441 if (Info != M.DeclContextInfos.end() &&
6442 Info->second.NameLookupTableData) {
6443 FoundInfo = true;
6444 break;
6445 }
6446 }
6447
6448 if (!FoundInfo)
6449 return false;
6450
6451 // Look for this name within this module.
Richard Smith52e3fba2014-03-11 07:17:35 +00006452 ASTDeclContextNameLookupTable *LookupTable =
Guy Benyei11169dd2012-12-18 14:30:41 +00006453 Info->second.NameLookupTableData;
6454 ASTDeclContextNameLookupTable::iterator Pos
6455 = LookupTable->find(This->Name);
6456 if (Pos == LookupTable->end())
6457 return false;
6458
6459 bool FoundAnything = false;
6460 ASTDeclContextNameLookupTrait::data_type Data = *Pos;
6461 for (; Data.first != Data.second; ++Data.first) {
6462 NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M, *Data.first);
6463 if (!ND)
6464 continue;
6465
6466 if (ND->getDeclName() != This->Name) {
6467 // A name might be null because the decl's redeclarable part is
6468 // currently read before reading its name. The lookup is triggered by
6469 // building that decl (likely indirectly), and so it is later in the
6470 // sense of "already existing" and can be ignored here.
6471 continue;
6472 }
6473
6474 // Record this declaration.
6475 FoundAnything = true;
6476 This->Decls.push_back(ND);
6477 }
6478
6479 return FoundAnything;
6480 }
6481 };
6482}
6483
Douglas Gregor9f782892013-01-21 15:25:38 +00006484/// \brief Retrieve the "definitive" module file for the definition of the
6485/// given declaration context, if there is one.
6486///
6487/// The "definitive" module file is the only place where we need to look to
6488/// find information about the declarations within the given declaration
6489/// context. For example, C++ and Objective-C classes, C structs/unions, and
6490/// Objective-C protocols, categories, and extensions are all defined in a
6491/// single place in the source code, so they have definitive module files
6492/// associated with them. C++ namespaces, on the other hand, can have
6493/// definitions in multiple different module files.
6494///
6495/// Note: this needs to be kept in sync with ASTWriter::AddedVisibleDecl's
6496/// NDEBUG checking.
6497static ModuleFile *getDefinitiveModuleFileFor(const DeclContext *DC,
6498 ASTReader &Reader) {
Douglas Gregor7a6e2002013-01-22 17:08:30 +00006499 if (const DeclContext *DefDC = getDefinitiveDeclContext(DC))
6500 return Reader.getOwningModuleFile(cast<Decl>(DefDC));
Douglas Gregor9f782892013-01-21 15:25:38 +00006501
Craig Toppera13603a2014-05-22 05:54:18 +00006502 return nullptr;
Douglas Gregor9f782892013-01-21 15:25:38 +00006503}
6504
Richard Smith9ce12e32013-02-07 03:30:24 +00006505bool
Guy Benyei11169dd2012-12-18 14:30:41 +00006506ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC,
6507 DeclarationName Name) {
6508 assert(DC->hasExternalVisibleStorage() &&
6509 "DeclContext has no visible decls in storage");
6510 if (!Name)
Richard Smith9ce12e32013-02-07 03:30:24 +00006511 return false;
Guy Benyei11169dd2012-12-18 14:30:41 +00006512
6513 SmallVector<NamedDecl *, 64> Decls;
6514
6515 // Compute the declaration contexts we need to look into. Multiple such
6516 // declaration contexts occur when two declaration contexts from disjoint
6517 // modules get merged, e.g., when two namespaces with the same name are
6518 // independently defined in separate modules.
6519 SmallVector<const DeclContext *, 2> Contexts;
6520 Contexts.push_back(DC);
6521
6522 if (DC->isNamespace()) {
Richard Smithcd45dbc2014-04-19 03:48:30 +00006523 auto Merged = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC)));
Guy Benyei11169dd2012-12-18 14:30:41 +00006524 if (Merged != MergedDecls.end()) {
6525 for (unsigned I = 0, N = Merged->second.size(); I != N; ++I)
6526 Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I])));
6527 }
6528 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00006529 if (isa<CXXRecordDecl>(DC)) {
6530 auto Merged = MergedLookups.find(DC);
6531 if (Merged != MergedLookups.end())
6532 Contexts.insert(Contexts.end(), Merged->second.begin(),
6533 Merged->second.end());
6534 }
6535
Guy Benyei11169dd2012-12-18 14:30:41 +00006536 DeclContextNameLookupVisitor Visitor(*this, Contexts, Name, Decls);
Douglas Gregor9f782892013-01-21 15:25:38 +00006537
6538 // If we can definitively determine which module file to look into,
6539 // only look there. Otherwise, look in all module files.
6540 ModuleFile *Definitive;
6541 if (Contexts.size() == 1 &&
6542 (Definitive = getDefinitiveModuleFileFor(DC, *this))) {
6543 DeclContextNameLookupVisitor::visit(*Definitive, &Visitor);
6544 } else {
6545 ModuleMgr.visit(&DeclContextNameLookupVisitor::visit, &Visitor);
6546 }
Guy Benyei11169dd2012-12-18 14:30:41 +00006547 ++NumVisibleDeclContextsRead;
6548 SetExternalVisibleDeclsForName(DC, Name, Decls);
Richard Smith9ce12e32013-02-07 03:30:24 +00006549 return !Decls.empty();
Guy Benyei11169dd2012-12-18 14:30:41 +00006550}
6551
6552namespace {
6553 /// \brief ModuleFile visitor used to retrieve all visible names in a
6554 /// declaration context.
6555 class DeclContextAllNamesVisitor {
6556 ASTReader &Reader;
Dmitri Gribenkof8579502013-01-12 19:30:44 +00006557 SmallVectorImpl<const DeclContext *> &Contexts;
Craig Topper3598eb72013-07-05 04:43:31 +00006558 DeclsMap &Decls;
Argyrios Kyrtzidis2810e9d2012-12-19 22:21:18 +00006559 bool VisitAll;
Guy Benyei11169dd2012-12-18 14:30:41 +00006560
6561 public:
6562 DeclContextAllNamesVisitor(ASTReader &Reader,
6563 SmallVectorImpl<const DeclContext *> &Contexts,
Craig Topper3598eb72013-07-05 04:43:31 +00006564 DeclsMap &Decls, bool VisitAll)
Argyrios Kyrtzidis2810e9d2012-12-19 22:21:18 +00006565 : Reader(Reader), Contexts(Contexts), Decls(Decls), VisitAll(VisitAll) { }
Guy Benyei11169dd2012-12-18 14:30:41 +00006566
6567 static bool visit(ModuleFile &M, void *UserData) {
6568 DeclContextAllNamesVisitor *This
6569 = static_cast<DeclContextAllNamesVisitor *>(UserData);
6570
6571 // Check whether we have any visible declaration information for
6572 // this context in this module.
6573 ModuleFile::DeclContextInfosMap::iterator Info;
6574 bool FoundInfo = false;
6575 for (unsigned I = 0, N = This->Contexts.size(); I != N; ++I) {
6576 Info = M.DeclContextInfos.find(This->Contexts[I]);
6577 if (Info != M.DeclContextInfos.end() &&
6578 Info->second.NameLookupTableData) {
6579 FoundInfo = true;
6580 break;
6581 }
6582 }
6583
6584 if (!FoundInfo)
6585 return false;
6586
Richard Smith52e3fba2014-03-11 07:17:35 +00006587 ASTDeclContextNameLookupTable *LookupTable =
Guy Benyei11169dd2012-12-18 14:30:41 +00006588 Info->second.NameLookupTableData;
6589 bool FoundAnything = false;
6590 for (ASTDeclContextNameLookupTable::data_iterator
Douglas Gregor5e306b12013-01-23 22:38:11 +00006591 I = LookupTable->data_begin(), E = LookupTable->data_end();
6592 I != E;
6593 ++I) {
Guy Benyei11169dd2012-12-18 14:30:41 +00006594 ASTDeclContextNameLookupTrait::data_type Data = *I;
6595 for (; Data.first != Data.second; ++Data.first) {
6596 NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M,
6597 *Data.first);
6598 if (!ND)
6599 continue;
6600
6601 // Record this declaration.
6602 FoundAnything = true;
6603 This->Decls[ND->getDeclName()].push_back(ND);
6604 }
6605 }
6606
Argyrios Kyrtzidis2810e9d2012-12-19 22:21:18 +00006607 return FoundAnything && !This->VisitAll;
Guy Benyei11169dd2012-12-18 14:30:41 +00006608 }
6609 };
6610}
6611
6612void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) {
6613 if (!DC->hasExternalVisibleStorage())
6614 return;
Craig Topper79be4cd2013-07-05 04:33:53 +00006615 DeclsMap Decls;
Guy Benyei11169dd2012-12-18 14:30:41 +00006616
6617 // Compute the declaration contexts we need to look into. Multiple such
6618 // declaration contexts occur when two declaration contexts from disjoint
6619 // modules get merged, e.g., when two namespaces with the same name are
6620 // independently defined in separate modules.
6621 SmallVector<const DeclContext *, 2> Contexts;
6622 Contexts.push_back(DC);
6623
6624 if (DC->isNamespace()) {
6625 MergedDeclsMap::iterator Merged
6626 = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC)));
6627 if (Merged != MergedDecls.end()) {
6628 for (unsigned I = 0, N = Merged->second.size(); I != N; ++I)
6629 Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I])));
6630 }
6631 }
6632
Argyrios Kyrtzidis2810e9d2012-12-19 22:21:18 +00006633 DeclContextAllNamesVisitor Visitor(*this, Contexts, Decls,
6634 /*VisitAll=*/DC->isFileContext());
Guy Benyei11169dd2012-12-18 14:30:41 +00006635 ModuleMgr.visit(&DeclContextAllNamesVisitor::visit, &Visitor);
6636 ++NumVisibleDeclContextsRead;
6637
Craig Topper79be4cd2013-07-05 04:33:53 +00006638 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) {
Guy Benyei11169dd2012-12-18 14:30:41 +00006639 SetExternalVisibleDeclsForName(DC, I->first, I->second);
6640 }
6641 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false);
6642}
6643
6644/// \brief Under non-PCH compilation the consumer receives the objc methods
6645/// before receiving the implementation, and codegen depends on this.
6646/// We simulate this by deserializing and passing to consumer the methods of the
6647/// implementation before passing the deserialized implementation decl.
6648static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD,
6649 ASTConsumer *Consumer) {
6650 assert(ImplD && Consumer);
6651
Aaron Ballmanaff18c02014-03-13 19:03:34 +00006652 for (auto *I : ImplD->methods())
6653 Consumer->HandleInterestingDecl(DeclGroupRef(I));
Guy Benyei11169dd2012-12-18 14:30:41 +00006654
6655 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD));
6656}
6657
6658void ASTReader::PassInterestingDeclsToConsumer() {
6659 assert(Consumer);
Richard Smith04d05b52014-03-23 00:27:18 +00006660
6661 if (PassingDeclsToConsumer)
6662 return;
6663
6664 // Guard variable to avoid recursively redoing the process of passing
6665 // decls to consumer.
6666 SaveAndRestore<bool> GuardPassingDeclsToConsumer(PassingDeclsToConsumer,
6667 true);
6668
Guy Benyei11169dd2012-12-18 14:30:41 +00006669 while (!InterestingDecls.empty()) {
6670 Decl *D = InterestingDecls.front();
6671 InterestingDecls.pop_front();
6672
6673 PassInterestingDeclToConsumer(D);
6674 }
6675}
6676
6677void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
6678 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
6679 PassObjCImplDeclToConsumer(ImplD, Consumer);
6680 else
6681 Consumer->HandleInterestingDecl(DeclGroupRef(D));
6682}
6683
6684void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) {
6685 this->Consumer = Consumer;
6686
6687 if (!Consumer)
6688 return;
6689
Ben Langmuir332aafe2014-01-31 01:06:56 +00006690 for (unsigned I = 0, N = EagerlyDeserializedDecls.size(); I != N; ++I) {
Guy Benyei11169dd2012-12-18 14:30:41 +00006691 // Force deserialization of this decl, which will cause it to be queued for
6692 // passing to the consumer.
Ben Langmuir332aafe2014-01-31 01:06:56 +00006693 GetDecl(EagerlyDeserializedDecls[I]);
Guy Benyei11169dd2012-12-18 14:30:41 +00006694 }
Ben Langmuir332aafe2014-01-31 01:06:56 +00006695 EagerlyDeserializedDecls.clear();
Guy Benyei11169dd2012-12-18 14:30:41 +00006696
6697 PassInterestingDeclsToConsumer();
6698}
6699
6700void ASTReader::PrintStats() {
6701 std::fprintf(stderr, "*** AST File Statistics:\n");
6702
6703 unsigned NumTypesLoaded
6704 = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(),
6705 QualType());
6706 unsigned NumDeclsLoaded
6707 = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(),
Craig Toppera13603a2014-05-22 05:54:18 +00006708 (Decl *)nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00006709 unsigned NumIdentifiersLoaded
6710 = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(),
6711 IdentifiersLoaded.end(),
Craig Toppera13603a2014-05-22 05:54:18 +00006712 (IdentifierInfo *)nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00006713 unsigned NumMacrosLoaded
6714 = MacrosLoaded.size() - std::count(MacrosLoaded.begin(),
6715 MacrosLoaded.end(),
Craig Toppera13603a2014-05-22 05:54:18 +00006716 (MacroInfo *)nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00006717 unsigned NumSelectorsLoaded
6718 = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(),
6719 SelectorsLoaded.end(),
6720 Selector());
6721
6722 if (unsigned TotalNumSLocEntries = getTotalNumSLocs())
6723 std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n",
6724 NumSLocEntriesRead, TotalNumSLocEntries,
6725 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
6726 if (!TypesLoaded.empty())
6727 std::fprintf(stderr, " %u/%u types read (%f%%)\n",
6728 NumTypesLoaded, (unsigned)TypesLoaded.size(),
6729 ((float)NumTypesLoaded/TypesLoaded.size() * 100));
6730 if (!DeclsLoaded.empty())
6731 std::fprintf(stderr, " %u/%u declarations read (%f%%)\n",
6732 NumDeclsLoaded, (unsigned)DeclsLoaded.size(),
6733 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100));
6734 if (!IdentifiersLoaded.empty())
6735 std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n",
6736 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(),
6737 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
6738 if (!MacrosLoaded.empty())
6739 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
6740 NumMacrosLoaded, (unsigned)MacrosLoaded.size(),
6741 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100));
6742 if (!SelectorsLoaded.empty())
6743 std::fprintf(stderr, " %u/%u selectors read (%f%%)\n",
6744 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(),
6745 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
6746 if (TotalNumStatements)
6747 std::fprintf(stderr, " %u/%u statements read (%f%%)\n",
6748 NumStatementsRead, TotalNumStatements,
6749 ((float)NumStatementsRead/TotalNumStatements * 100));
6750 if (TotalNumMacros)
6751 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
6752 NumMacrosRead, TotalNumMacros,
6753 ((float)NumMacrosRead/TotalNumMacros * 100));
6754 if (TotalLexicalDeclContexts)
6755 std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n",
6756 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
6757 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
6758 * 100));
6759 if (TotalVisibleDeclContexts)
6760 std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n",
6761 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
6762 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
6763 * 100));
6764 if (TotalNumMethodPoolEntries) {
6765 std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n",
6766 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
6767 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
6768 * 100));
Guy Benyei11169dd2012-12-18 14:30:41 +00006769 }
Douglas Gregorad2f7a52013-01-28 17:54:36 +00006770 if (NumMethodPoolLookups) {
6771 std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n",
6772 NumMethodPoolHits, NumMethodPoolLookups,
6773 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
6774 }
6775 if (NumMethodPoolTableLookups) {
6776 std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n",
6777 NumMethodPoolTableHits, NumMethodPoolTableLookups,
6778 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups
6779 * 100.0));
6780 }
6781
Douglas Gregor00a50f72013-01-25 00:38:33 +00006782 if (NumIdentifierLookupHits) {
6783 std::fprintf(stderr,
6784 " %u / %u identifier table lookups succeeded (%f%%)\n",
6785 NumIdentifierLookupHits, NumIdentifierLookups,
6786 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
6787 }
6788
Douglas Gregore060e572013-01-25 01:03:03 +00006789 if (GlobalIndex) {
6790 std::fprintf(stderr, "\n");
6791 GlobalIndex->printStats();
6792 }
6793
Guy Benyei11169dd2012-12-18 14:30:41 +00006794 std::fprintf(stderr, "\n");
6795 dump();
6796 std::fprintf(stderr, "\n");
6797}
6798
6799template<typename Key, typename ModuleFile, unsigned InitialCapacity>
6800static void
6801dumpModuleIDMap(StringRef Name,
6802 const ContinuousRangeMap<Key, ModuleFile *,
6803 InitialCapacity> &Map) {
6804 if (Map.begin() == Map.end())
6805 return;
6806
6807 typedef ContinuousRangeMap<Key, ModuleFile *, InitialCapacity> MapType;
6808 llvm::errs() << Name << ":\n";
6809 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
6810 I != IEnd; ++I) {
6811 llvm::errs() << " " << I->first << " -> " << I->second->FileName
6812 << "\n";
6813 }
6814}
6815
6816void ASTReader::dump() {
6817 llvm::errs() << "*** PCH/ModuleFile Remappings:\n";
6818 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap);
6819 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap);
6820 dumpModuleIDMap("Global type map", GlobalTypeMap);
6821 dumpModuleIDMap("Global declaration map", GlobalDeclMap);
6822 dumpModuleIDMap("Global identifier map", GlobalIdentifierMap);
6823 dumpModuleIDMap("Global macro map", GlobalMacroMap);
6824 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap);
6825 dumpModuleIDMap("Global selector map", GlobalSelectorMap);
6826 dumpModuleIDMap("Global preprocessed entity map",
6827 GlobalPreprocessedEntityMap);
6828
6829 llvm::errs() << "\n*** PCH/Modules Loaded:";
6830 for (ModuleManager::ModuleConstIterator M = ModuleMgr.begin(),
6831 MEnd = ModuleMgr.end();
6832 M != MEnd; ++M)
6833 (*M)->dump();
6834}
6835
6836/// Return the amount of memory used by memory buffers, breaking down
6837/// by heap-backed versus mmap'ed memory.
6838void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const {
6839 for (ModuleConstIterator I = ModuleMgr.begin(),
6840 E = ModuleMgr.end(); I != E; ++I) {
6841 if (llvm::MemoryBuffer *buf = (*I)->Buffer.get()) {
6842 size_t bytes = buf->getBufferSize();
6843 switch (buf->getBufferKind()) {
6844 case llvm::MemoryBuffer::MemoryBuffer_Malloc:
6845 sizes.malloc_bytes += bytes;
6846 break;
6847 case llvm::MemoryBuffer::MemoryBuffer_MMap:
6848 sizes.mmap_bytes += bytes;
6849 break;
6850 }
6851 }
6852 }
6853}
6854
6855void ASTReader::InitializeSema(Sema &S) {
6856 SemaObj = &S;
6857 S.addExternalSource(this);
6858
6859 // Makes sure any declarations that were deserialized "too early"
6860 // still get added to the identifier's declaration chains.
6861 for (unsigned I = 0, N = PreloadedDecls.size(); I != N; ++I) {
Argyrios Kyrtzidise5edbf92013-04-26 21:33:35 +00006862 pushExternalDeclIntoScope(PreloadedDecls[I],
6863 PreloadedDecls[I]->getDeclName());
Guy Benyei11169dd2012-12-18 14:30:41 +00006864 }
6865 PreloadedDecls.clear();
6866
Richard Smith3d8e97e2013-10-18 06:54:39 +00006867 // FIXME: What happens if these are changed by a module import?
Guy Benyei11169dd2012-12-18 14:30:41 +00006868 if (!FPPragmaOptions.empty()) {
6869 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS");
6870 SemaObj->FPFeatures.fp_contract = FPPragmaOptions[0];
6871 }
6872
Richard Smith3d8e97e2013-10-18 06:54:39 +00006873 // FIXME: What happens if these are changed by a module import?
Guy Benyei11169dd2012-12-18 14:30:41 +00006874 if (!OpenCLExtensions.empty()) {
6875 unsigned I = 0;
6876#define OPENCLEXT(nm) SemaObj->OpenCLFeatures.nm = OpenCLExtensions[I++];
6877#include "clang/Basic/OpenCLExtensions.def"
6878
6879 assert(OpenCLExtensions.size() == I && "Wrong number of OPENCL_EXTENSIONS");
6880 }
Richard Smith3d8e97e2013-10-18 06:54:39 +00006881
6882 UpdateSema();
6883}
6884
6885void ASTReader::UpdateSema() {
6886 assert(SemaObj && "no Sema to update");
6887
6888 // Load the offsets of the declarations that Sema references.
6889 // They will be lazily deserialized when needed.
6890 if (!SemaDeclRefs.empty()) {
6891 assert(SemaDeclRefs.size() % 2 == 0);
6892 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 2) {
6893 if (!SemaObj->StdNamespace)
6894 SemaObj->StdNamespace = SemaDeclRefs[I];
6895 if (!SemaObj->StdBadAlloc)
6896 SemaObj->StdBadAlloc = SemaDeclRefs[I+1];
6897 }
6898 SemaDeclRefs.clear();
6899 }
Dario Domizioli13a0a382014-05-23 12:13:25 +00006900
6901 // Update the state of 'pragma clang optimize'. Use the same API as if we had
6902 // encountered the pragma in the source.
6903 if(OptimizeOffPragmaLocation.isValid())
6904 SemaObj->ActOnPragmaOptimize(/* IsOn = */ false, OptimizeOffPragmaLocation);
Guy Benyei11169dd2012-12-18 14:30:41 +00006905}
6906
6907IdentifierInfo* ASTReader::get(const char *NameStart, const char *NameEnd) {
6908 // Note that we are loading an identifier.
6909 Deserializing AnIdentifier(this);
Douglas Gregore060e572013-01-25 01:03:03 +00006910 StringRef Name(NameStart, NameEnd - NameStart);
6911
6912 // If there is a global index, look there first to determine which modules
6913 // provably do not have any results for this identifier.
Douglas Gregor7211ac12013-01-25 23:32:03 +00006914 GlobalModuleIndex::HitSet Hits;
Craig Toppera13603a2014-05-22 05:54:18 +00006915 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
Douglas Gregore060e572013-01-25 01:03:03 +00006916 if (!loadGlobalIndex()) {
Douglas Gregor7211ac12013-01-25 23:32:03 +00006917 if (GlobalIndex->lookupIdentifier(Name, Hits)) {
6918 HitsPtr = &Hits;
Douglas Gregore060e572013-01-25 01:03:03 +00006919 }
6920 }
Douglas Gregor7211ac12013-01-25 23:32:03 +00006921 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0,
Douglas Gregor00a50f72013-01-25 00:38:33 +00006922 NumIdentifierLookups,
6923 NumIdentifierLookupHits);
Douglas Gregor7211ac12013-01-25 23:32:03 +00006924 ModuleMgr.visit(IdentifierLookupVisitor::visit, &Visitor, HitsPtr);
Guy Benyei11169dd2012-12-18 14:30:41 +00006925 IdentifierInfo *II = Visitor.getIdentifierInfo();
6926 markIdentifierUpToDate(II);
6927 return II;
6928}
6929
6930namespace clang {
6931 /// \brief An identifier-lookup iterator that enumerates all of the
6932 /// identifiers stored within a set of AST files.
6933 class ASTIdentifierIterator : public IdentifierIterator {
6934 /// \brief The AST reader whose identifiers are being enumerated.
6935 const ASTReader &Reader;
6936
6937 /// \brief The current index into the chain of AST files stored in
6938 /// the AST reader.
6939 unsigned Index;
6940
6941 /// \brief The current position within the identifier lookup table
6942 /// of the current AST file.
6943 ASTIdentifierLookupTable::key_iterator Current;
6944
6945 /// \brief The end position within the identifier lookup table of
6946 /// the current AST file.
6947 ASTIdentifierLookupTable::key_iterator End;
6948
6949 public:
6950 explicit ASTIdentifierIterator(const ASTReader &Reader);
6951
Craig Topper3e89dfe2014-03-13 02:13:41 +00006952 StringRef Next() override;
Guy Benyei11169dd2012-12-18 14:30:41 +00006953 };
6954}
6955
6956ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader)
6957 : Reader(Reader), Index(Reader.ModuleMgr.size() - 1) {
6958 ASTIdentifierLookupTable *IdTable
6959 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].IdentifierLookupTable;
6960 Current = IdTable->key_begin();
6961 End = IdTable->key_end();
6962}
6963
6964StringRef ASTIdentifierIterator::Next() {
6965 while (Current == End) {
6966 // If we have exhausted all of our AST files, we're done.
6967 if (Index == 0)
6968 return StringRef();
6969
6970 --Index;
6971 ASTIdentifierLookupTable *IdTable
6972 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].
6973 IdentifierLookupTable;
6974 Current = IdTable->key_begin();
6975 End = IdTable->key_end();
6976 }
6977
6978 // We have any identifiers remaining in the current AST file; return
6979 // the next one.
Douglas Gregorbfd73d72013-01-23 18:53:14 +00006980 StringRef Result = *Current;
Guy Benyei11169dd2012-12-18 14:30:41 +00006981 ++Current;
Douglas Gregorbfd73d72013-01-23 18:53:14 +00006982 return Result;
Guy Benyei11169dd2012-12-18 14:30:41 +00006983}
6984
Argyrios Kyrtzidis9aca3c62013-04-17 22:10:55 +00006985IdentifierIterator *ASTReader::getIdentifiers() {
6986 if (!loadGlobalIndex())
6987 return GlobalIndex->createIdentifierIterator();
6988
Guy Benyei11169dd2012-12-18 14:30:41 +00006989 return new ASTIdentifierIterator(*this);
6990}
6991
6992namespace clang { namespace serialization {
6993 class ReadMethodPoolVisitor {
6994 ASTReader &Reader;
6995 Selector Sel;
6996 unsigned PriorGeneration;
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00006997 unsigned InstanceBits;
6998 unsigned FactoryBits;
Dmitri Gribenkof8579502013-01-12 19:30:44 +00006999 SmallVector<ObjCMethodDecl *, 4> InstanceMethods;
7000 SmallVector<ObjCMethodDecl *, 4> FactoryMethods;
Guy Benyei11169dd2012-12-18 14:30:41 +00007001
7002 public:
7003 ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel,
7004 unsigned PriorGeneration)
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00007005 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration),
7006 InstanceBits(0), FactoryBits(0) { }
Guy Benyei11169dd2012-12-18 14:30:41 +00007007
7008 static bool visit(ModuleFile &M, void *UserData) {
7009 ReadMethodPoolVisitor *This
7010 = static_cast<ReadMethodPoolVisitor *>(UserData);
7011
7012 if (!M.SelectorLookupTable)
7013 return false;
7014
7015 // If we've already searched this module file, skip it now.
7016 if (M.Generation <= This->PriorGeneration)
7017 return true;
7018
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007019 ++This->Reader.NumMethodPoolTableLookups;
Guy Benyei11169dd2012-12-18 14:30:41 +00007020 ASTSelectorLookupTable *PoolTable
7021 = (ASTSelectorLookupTable*)M.SelectorLookupTable;
7022 ASTSelectorLookupTable::iterator Pos = PoolTable->find(This->Sel);
7023 if (Pos == PoolTable->end())
7024 return false;
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007025
7026 ++This->Reader.NumMethodPoolTableHits;
Guy Benyei11169dd2012-12-18 14:30:41 +00007027 ++This->Reader.NumSelectorsRead;
7028 // FIXME: Not quite happy with the statistics here. We probably should
7029 // disable this tracking when called via LoadSelector.
7030 // Also, should entries without methods count as misses?
7031 ++This->Reader.NumMethodPoolEntriesRead;
7032 ASTSelectorLookupTrait::data_type Data = *Pos;
7033 if (This->Reader.DeserializationListener)
7034 This->Reader.DeserializationListener->SelectorRead(Data.ID,
7035 This->Sel);
7036
7037 This->InstanceMethods.append(Data.Instance.begin(), Data.Instance.end());
7038 This->FactoryMethods.append(Data.Factory.begin(), Data.Factory.end());
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00007039 This->InstanceBits = Data.InstanceBits;
7040 This->FactoryBits = Data.FactoryBits;
Guy Benyei11169dd2012-12-18 14:30:41 +00007041 return true;
7042 }
7043
7044 /// \brief Retrieve the instance methods found by this visitor.
7045 ArrayRef<ObjCMethodDecl *> getInstanceMethods() const {
7046 return InstanceMethods;
7047 }
7048
7049 /// \brief Retrieve the instance methods found by this visitor.
7050 ArrayRef<ObjCMethodDecl *> getFactoryMethods() const {
7051 return FactoryMethods;
7052 }
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00007053
7054 unsigned getInstanceBits() const { return InstanceBits; }
7055 unsigned getFactoryBits() const { return FactoryBits; }
Guy Benyei11169dd2012-12-18 14:30:41 +00007056 };
7057} } // end namespace clang::serialization
7058
7059/// \brief Add the given set of methods to the method list.
7060static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods,
7061 ObjCMethodList &List) {
7062 for (unsigned I = 0, N = Methods.size(); I != N; ++I) {
7063 S.addMethodToGlobalList(&List, Methods[I]);
7064 }
7065}
7066
7067void ASTReader::ReadMethodPool(Selector Sel) {
7068 // Get the selector generation and update it to the current generation.
7069 unsigned &Generation = SelectorGeneration[Sel];
7070 unsigned PriorGeneration = Generation;
Richard Smith053f6c62014-05-16 23:01:30 +00007071 Generation = getGeneration();
Guy Benyei11169dd2012-12-18 14:30:41 +00007072
7073 // Search for methods defined with this selector.
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007074 ++NumMethodPoolLookups;
Guy Benyei11169dd2012-12-18 14:30:41 +00007075 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration);
7076 ModuleMgr.visit(&ReadMethodPoolVisitor::visit, &Visitor);
7077
7078 if (Visitor.getInstanceMethods().empty() &&
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007079 Visitor.getFactoryMethods().empty())
Guy Benyei11169dd2012-12-18 14:30:41 +00007080 return;
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007081
7082 ++NumMethodPoolHits;
7083
Guy Benyei11169dd2012-12-18 14:30:41 +00007084 if (!getSema())
7085 return;
7086
7087 Sema &S = *getSema();
7088 Sema::GlobalMethodPool::iterator Pos
7089 = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first;
7090
7091 addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first);
7092 addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second);
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00007093 Pos->second.first.setBits(Visitor.getInstanceBits());
7094 Pos->second.second.setBits(Visitor.getFactoryBits());
Guy Benyei11169dd2012-12-18 14:30:41 +00007095}
7096
7097void ASTReader::ReadKnownNamespaces(
7098 SmallVectorImpl<NamespaceDecl *> &Namespaces) {
7099 Namespaces.clear();
7100
7101 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
7102 if (NamespaceDecl *Namespace
7103 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I])))
7104 Namespaces.push_back(Namespace);
7105 }
7106}
7107
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00007108void ASTReader::ReadUndefinedButUsed(
Nick Lewyckyf0f56162013-01-31 03:23:57 +00007109 llvm::DenseMap<NamedDecl*, SourceLocation> &Undefined) {
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00007110 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
7111 NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++]));
Nick Lewycky8334af82013-01-26 00:35:08 +00007112 SourceLocation Loc =
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00007113 SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]);
Nick Lewycky8334af82013-01-26 00:35:08 +00007114 Undefined.insert(std::make_pair(D, Loc));
7115 }
7116}
Nick Lewycky8334af82013-01-26 00:35:08 +00007117
Guy Benyei11169dd2012-12-18 14:30:41 +00007118void ASTReader::ReadTentativeDefinitions(
7119 SmallVectorImpl<VarDecl *> &TentativeDefs) {
7120 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
7121 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I]));
7122 if (Var)
7123 TentativeDefs.push_back(Var);
7124 }
7125 TentativeDefinitions.clear();
7126}
7127
7128void ASTReader::ReadUnusedFileScopedDecls(
7129 SmallVectorImpl<const DeclaratorDecl *> &Decls) {
7130 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
7131 DeclaratorDecl *D
7132 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I]));
7133 if (D)
7134 Decls.push_back(D);
7135 }
7136 UnusedFileScopedDecls.clear();
7137}
7138
7139void ASTReader::ReadDelegatingConstructors(
7140 SmallVectorImpl<CXXConstructorDecl *> &Decls) {
7141 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
7142 CXXConstructorDecl *D
7143 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I]));
7144 if (D)
7145 Decls.push_back(D);
7146 }
7147 DelegatingCtorDecls.clear();
7148}
7149
7150void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) {
7151 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
7152 TypedefNameDecl *D
7153 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I]));
7154 if (D)
7155 Decls.push_back(D);
7156 }
7157 ExtVectorDecls.clear();
7158}
7159
7160void ASTReader::ReadDynamicClasses(SmallVectorImpl<CXXRecordDecl *> &Decls) {
7161 for (unsigned I = 0, N = DynamicClasses.size(); I != N; ++I) {
7162 CXXRecordDecl *D
7163 = dyn_cast_or_null<CXXRecordDecl>(GetDecl(DynamicClasses[I]));
7164 if (D)
7165 Decls.push_back(D);
7166 }
7167 DynamicClasses.clear();
7168}
7169
7170void
Richard Smith78165b52013-01-10 23:43:47 +00007171ASTReader::ReadLocallyScopedExternCDecls(SmallVectorImpl<NamedDecl *> &Decls) {
7172 for (unsigned I = 0, N = LocallyScopedExternCDecls.size(); I != N; ++I) {
7173 NamedDecl *D
7174 = dyn_cast_or_null<NamedDecl>(GetDecl(LocallyScopedExternCDecls[I]));
Guy Benyei11169dd2012-12-18 14:30:41 +00007175 if (D)
7176 Decls.push_back(D);
7177 }
Richard Smith78165b52013-01-10 23:43:47 +00007178 LocallyScopedExternCDecls.clear();
Guy Benyei11169dd2012-12-18 14:30:41 +00007179}
7180
7181void ASTReader::ReadReferencedSelectors(
7182 SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) {
7183 if (ReferencedSelectorsData.empty())
7184 return;
7185
7186 // If there are @selector references added them to its pool. This is for
7187 // implementation of -Wselector.
7188 unsigned int DataSize = ReferencedSelectorsData.size()-1;
7189 unsigned I = 0;
7190 while (I < DataSize) {
7191 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]);
7192 SourceLocation SelLoc
7193 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]);
7194 Sels.push_back(std::make_pair(Sel, SelLoc));
7195 }
7196 ReferencedSelectorsData.clear();
7197}
7198
7199void ASTReader::ReadWeakUndeclaredIdentifiers(
7200 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo> > &WeakIDs) {
7201 if (WeakUndeclaredIdentifiers.empty())
7202 return;
7203
7204 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) {
7205 IdentifierInfo *WeakId
7206 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
7207 IdentifierInfo *AliasId
7208 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
7209 SourceLocation Loc
7210 = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]);
7211 bool Used = WeakUndeclaredIdentifiers[I++];
7212 WeakInfo WI(AliasId, Loc);
7213 WI.setUsed(Used);
7214 WeakIDs.push_back(std::make_pair(WeakId, WI));
7215 }
7216 WeakUndeclaredIdentifiers.clear();
7217}
7218
7219void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) {
7220 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) {
7221 ExternalVTableUse VT;
7222 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++]));
7223 VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]);
7224 VT.DefinitionRequired = VTableUses[Idx++];
7225 VTables.push_back(VT);
7226 }
7227
7228 VTableUses.clear();
7229}
7230
7231void ASTReader::ReadPendingInstantiations(
7232 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation> > &Pending) {
7233 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
7234 ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++]));
7235 SourceLocation Loc
7236 = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]);
7237
7238 Pending.push_back(std::make_pair(D, Loc));
7239 }
7240 PendingInstantiations.clear();
7241}
7242
Richard Smithe40f2ba2013-08-07 21:41:30 +00007243void ASTReader::ReadLateParsedTemplates(
7244 llvm::DenseMap<const FunctionDecl *, LateParsedTemplate *> &LPTMap) {
7245 for (unsigned Idx = 0, N = LateParsedTemplates.size(); Idx < N;
7246 /* In loop */) {
7247 FunctionDecl *FD = cast<FunctionDecl>(GetDecl(LateParsedTemplates[Idx++]));
7248
7249 LateParsedTemplate *LT = new LateParsedTemplate;
7250 LT->D = GetDecl(LateParsedTemplates[Idx++]);
7251
7252 ModuleFile *F = getOwningModuleFile(LT->D);
7253 assert(F && "No module");
7254
7255 unsigned TokN = LateParsedTemplates[Idx++];
7256 LT->Toks.reserve(TokN);
7257 for (unsigned T = 0; T < TokN; ++T)
7258 LT->Toks.push_back(ReadToken(*F, LateParsedTemplates, Idx));
7259
7260 LPTMap[FD] = LT;
7261 }
7262
7263 LateParsedTemplates.clear();
7264}
7265
Guy Benyei11169dd2012-12-18 14:30:41 +00007266void ASTReader::LoadSelector(Selector Sel) {
7267 // It would be complicated to avoid reading the methods anyway. So don't.
7268 ReadMethodPool(Sel);
7269}
7270
7271void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) {
7272 assert(ID && "Non-zero identifier ID required");
7273 assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range");
7274 IdentifiersLoaded[ID - 1] = II;
7275 if (DeserializationListener)
7276 DeserializationListener->IdentifierRead(ID, II);
7277}
7278
7279/// \brief Set the globally-visible declarations associated with the given
7280/// identifier.
7281///
7282/// If the AST reader is currently in a state where the given declaration IDs
7283/// cannot safely be resolved, they are queued until it is safe to resolve
7284/// them.
7285///
7286/// \param II an IdentifierInfo that refers to one or more globally-visible
7287/// declarations.
7288///
7289/// \param DeclIDs the set of declaration IDs with the name @p II that are
7290/// visible at global scope.
7291///
Douglas Gregor6168bd22013-02-18 15:53:43 +00007292/// \param Decls if non-null, this vector will be populated with the set of
7293/// deserialized declarations. These declarations will not be pushed into
7294/// scope.
Guy Benyei11169dd2012-12-18 14:30:41 +00007295void
7296ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II,
7297 const SmallVectorImpl<uint32_t> &DeclIDs,
Douglas Gregor6168bd22013-02-18 15:53:43 +00007298 SmallVectorImpl<Decl *> *Decls) {
7299 if (NumCurrentElementsDeserializing && !Decls) {
7300 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
Guy Benyei11169dd2012-12-18 14:30:41 +00007301 return;
7302 }
7303
7304 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
7305 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I]));
7306 if (SemaObj) {
Douglas Gregor6168bd22013-02-18 15:53:43 +00007307 // If we're simply supposed to record the declarations, do so now.
7308 if (Decls) {
7309 Decls->push_back(D);
7310 continue;
7311 }
7312
Guy Benyei11169dd2012-12-18 14:30:41 +00007313 // Introduce this declaration into the translation-unit scope
7314 // and add it to the declaration chain for this identifier, so
7315 // that (unqualified) name lookup will find it.
Argyrios Kyrtzidise5edbf92013-04-26 21:33:35 +00007316 pushExternalDeclIntoScope(D, II);
Guy Benyei11169dd2012-12-18 14:30:41 +00007317 } else {
7318 // Queue this declaration so that it will be added to the
7319 // translation unit scope and identifier's declaration chain
7320 // once a Sema object is known.
7321 PreloadedDecls.push_back(D);
7322 }
7323 }
7324}
7325
Douglas Gregorc8a992f2013-01-21 16:52:34 +00007326IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007327 if (ID == 0)
Craig Toppera13603a2014-05-22 05:54:18 +00007328 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007329
7330 if (IdentifiersLoaded.empty()) {
7331 Error("no identifier table in AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00007332 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007333 }
7334
7335 ID -= 1;
7336 if (!IdentifiersLoaded[ID]) {
7337 GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1);
7338 assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map");
7339 ModuleFile *M = I->second;
7340 unsigned Index = ID - M->BaseIdentifierID;
7341 const char *Str = M->IdentifierTableData + M->IdentifierOffsets[Index];
7342
7343 // All of the strings in the AST file are preceded by a 16-bit length.
7344 // Extract that 16-bit length to avoid having to execute strlen().
7345 // NOTE: 'StrLenPtr' is an 'unsigned char*' so that we load bytes as
7346 // unsigned integers. This is important to avoid integer overflow when
7347 // we cast them to 'unsigned'.
7348 const unsigned char *StrLenPtr = (const unsigned char*) Str - 2;
7349 unsigned StrLen = (((unsigned) StrLenPtr[0])
7350 | (((unsigned) StrLenPtr[1]) << 8)) - 1;
Douglas Gregorc8a992f2013-01-21 16:52:34 +00007351 IdentifiersLoaded[ID]
7352 = &PP.getIdentifierTable().get(StringRef(Str, StrLen));
Guy Benyei11169dd2012-12-18 14:30:41 +00007353 if (DeserializationListener)
7354 DeserializationListener->IdentifierRead(ID + 1, IdentifiersLoaded[ID]);
7355 }
7356
7357 return IdentifiersLoaded[ID];
7358}
7359
Douglas Gregorc8a992f2013-01-21 16:52:34 +00007360IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) {
7361 return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID));
Guy Benyei11169dd2012-12-18 14:30:41 +00007362}
7363
7364IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) {
7365 if (LocalID < NUM_PREDEF_IDENT_IDS)
7366 return LocalID;
7367
7368 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7369 = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS);
7370 assert(I != M.IdentifierRemap.end()
7371 && "Invalid index into identifier index remap");
7372
7373 return LocalID + I->second;
7374}
7375
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00007376MacroInfo *ASTReader::getMacro(MacroID ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007377 if (ID == 0)
Craig Toppera13603a2014-05-22 05:54:18 +00007378 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007379
7380 if (MacrosLoaded.empty()) {
7381 Error("no macro table in AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00007382 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007383 }
7384
7385 ID -= NUM_PREDEF_MACRO_IDS;
7386 if (!MacrosLoaded[ID]) {
7387 GlobalMacroMapType::iterator I
7388 = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS);
7389 assert(I != GlobalMacroMap.end() && "Corrupted global macro map");
7390 ModuleFile *M = I->second;
7391 unsigned Index = ID - M->BaseMacroID;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00007392 MacrosLoaded[ID] = ReadMacroRecord(*M, M->MacroOffsets[Index]);
7393
7394 if (DeserializationListener)
7395 DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS,
7396 MacrosLoaded[ID]);
Guy Benyei11169dd2012-12-18 14:30:41 +00007397 }
7398
7399 return MacrosLoaded[ID];
7400}
7401
7402MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) {
7403 if (LocalID < NUM_PREDEF_MACRO_IDS)
7404 return LocalID;
7405
7406 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7407 = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS);
7408 assert(I != M.MacroRemap.end() && "Invalid index into macro index remap");
7409
7410 return LocalID + I->second;
7411}
7412
7413serialization::SubmoduleID
7414ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) {
7415 if (LocalID < NUM_PREDEF_SUBMODULE_IDS)
7416 return LocalID;
7417
7418 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7419 = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS);
7420 assert(I != M.SubmoduleRemap.end()
7421 && "Invalid index into submodule index remap");
7422
7423 return LocalID + I->second;
7424}
7425
7426Module *ASTReader::getSubmodule(SubmoduleID GlobalID) {
7427 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) {
7428 assert(GlobalID == 0 && "Unhandled global submodule ID");
Craig Toppera13603a2014-05-22 05:54:18 +00007429 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007430 }
7431
7432 if (GlobalID > SubmodulesLoaded.size()) {
7433 Error("submodule ID out of range in AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00007434 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007435 }
7436
7437 return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS];
7438}
Douglas Gregorc147b0b2013-01-12 01:29:50 +00007439
7440Module *ASTReader::getModule(unsigned ID) {
7441 return getSubmodule(ID);
7442}
7443
Guy Benyei11169dd2012-12-18 14:30:41 +00007444Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) {
7445 return DecodeSelector(getGlobalSelectorID(M, LocalID));
7446}
7447
7448Selector ASTReader::DecodeSelector(serialization::SelectorID ID) {
7449 if (ID == 0)
7450 return Selector();
7451
7452 if (ID > SelectorsLoaded.size()) {
7453 Error("selector ID out of range in AST file");
7454 return Selector();
7455 }
7456
Craig Toppera13603a2014-05-22 05:54:18 +00007457 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007458 // Load this selector from the selector table.
7459 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID);
7460 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map");
7461 ModuleFile &M = *I->second;
7462 ASTSelectorLookupTrait Trait(*this, M);
7463 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS;
7464 SelectorsLoaded[ID - 1] =
7465 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0);
7466 if (DeserializationListener)
7467 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
7468 }
7469
7470 return SelectorsLoaded[ID - 1];
7471}
7472
7473Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) {
7474 return DecodeSelector(ID);
7475}
7476
7477uint32_t ASTReader::GetNumExternalSelectors() {
7478 // ID 0 (the null selector) is considered an external selector.
7479 return getTotalNumSelectors() + 1;
7480}
7481
7482serialization::SelectorID
7483ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const {
7484 if (LocalID < NUM_PREDEF_SELECTOR_IDS)
7485 return LocalID;
7486
7487 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7488 = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS);
7489 assert(I != M.SelectorRemap.end()
7490 && "Invalid index into selector index remap");
7491
7492 return LocalID + I->second;
7493}
7494
7495DeclarationName
7496ASTReader::ReadDeclarationName(ModuleFile &F,
7497 const RecordData &Record, unsigned &Idx) {
7498 DeclarationName::NameKind Kind = (DeclarationName::NameKind)Record[Idx++];
7499 switch (Kind) {
7500 case DeclarationName::Identifier:
Douglas Gregorc8a992f2013-01-21 16:52:34 +00007501 return DeclarationName(GetIdentifierInfo(F, Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00007502
7503 case DeclarationName::ObjCZeroArgSelector:
7504 case DeclarationName::ObjCOneArgSelector:
7505 case DeclarationName::ObjCMultiArgSelector:
7506 return DeclarationName(ReadSelector(F, Record, Idx));
7507
7508 case DeclarationName::CXXConstructorName:
7509 return Context.DeclarationNames.getCXXConstructorName(
7510 Context.getCanonicalType(readType(F, Record, Idx)));
7511
7512 case DeclarationName::CXXDestructorName:
7513 return Context.DeclarationNames.getCXXDestructorName(
7514 Context.getCanonicalType(readType(F, Record, Idx)));
7515
7516 case DeclarationName::CXXConversionFunctionName:
7517 return Context.DeclarationNames.getCXXConversionFunctionName(
7518 Context.getCanonicalType(readType(F, Record, Idx)));
7519
7520 case DeclarationName::CXXOperatorName:
7521 return Context.DeclarationNames.getCXXOperatorName(
7522 (OverloadedOperatorKind)Record[Idx++]);
7523
7524 case DeclarationName::CXXLiteralOperatorName:
7525 return Context.DeclarationNames.getCXXLiteralOperatorName(
7526 GetIdentifierInfo(F, Record, Idx));
7527
7528 case DeclarationName::CXXUsingDirective:
7529 return DeclarationName::getUsingDirectiveName();
7530 }
7531
7532 llvm_unreachable("Invalid NameKind!");
7533}
7534
7535void ASTReader::ReadDeclarationNameLoc(ModuleFile &F,
7536 DeclarationNameLoc &DNLoc,
7537 DeclarationName Name,
7538 const RecordData &Record, unsigned &Idx) {
7539 switch (Name.getNameKind()) {
7540 case DeclarationName::CXXConstructorName:
7541 case DeclarationName::CXXDestructorName:
7542 case DeclarationName::CXXConversionFunctionName:
7543 DNLoc.NamedType.TInfo = GetTypeSourceInfo(F, Record, Idx);
7544 break;
7545
7546 case DeclarationName::CXXOperatorName:
7547 DNLoc.CXXOperatorName.BeginOpNameLoc
7548 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7549 DNLoc.CXXOperatorName.EndOpNameLoc
7550 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7551 break;
7552
7553 case DeclarationName::CXXLiteralOperatorName:
7554 DNLoc.CXXLiteralOperatorName.OpNameLoc
7555 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7556 break;
7557
7558 case DeclarationName::Identifier:
7559 case DeclarationName::ObjCZeroArgSelector:
7560 case DeclarationName::ObjCOneArgSelector:
7561 case DeclarationName::ObjCMultiArgSelector:
7562 case DeclarationName::CXXUsingDirective:
7563 break;
7564 }
7565}
7566
7567void ASTReader::ReadDeclarationNameInfo(ModuleFile &F,
7568 DeclarationNameInfo &NameInfo,
7569 const RecordData &Record, unsigned &Idx) {
7570 NameInfo.setName(ReadDeclarationName(F, Record, Idx));
7571 NameInfo.setLoc(ReadSourceLocation(F, Record, Idx));
7572 DeclarationNameLoc DNLoc;
7573 ReadDeclarationNameLoc(F, DNLoc, NameInfo.getName(), Record, Idx);
7574 NameInfo.setInfo(DNLoc);
7575}
7576
7577void ASTReader::ReadQualifierInfo(ModuleFile &F, QualifierInfo &Info,
7578 const RecordData &Record, unsigned &Idx) {
7579 Info.QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx);
7580 unsigned NumTPLists = Record[Idx++];
7581 Info.NumTemplParamLists = NumTPLists;
7582 if (NumTPLists) {
7583 Info.TemplParamLists = new (Context) TemplateParameterList*[NumTPLists];
7584 for (unsigned i=0; i != NumTPLists; ++i)
7585 Info.TemplParamLists[i] = ReadTemplateParameterList(F, Record, Idx);
7586 }
7587}
7588
7589TemplateName
7590ASTReader::ReadTemplateName(ModuleFile &F, const RecordData &Record,
7591 unsigned &Idx) {
7592 TemplateName::NameKind Kind = (TemplateName::NameKind)Record[Idx++];
7593 switch (Kind) {
7594 case TemplateName::Template:
7595 return TemplateName(ReadDeclAs<TemplateDecl>(F, Record, Idx));
7596
7597 case TemplateName::OverloadedTemplate: {
7598 unsigned size = Record[Idx++];
7599 UnresolvedSet<8> Decls;
7600 while (size--)
7601 Decls.addDecl(ReadDeclAs<NamedDecl>(F, Record, Idx));
7602
7603 return Context.getOverloadedTemplateName(Decls.begin(), Decls.end());
7604 }
7605
7606 case TemplateName::QualifiedTemplate: {
7607 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
7608 bool hasTemplKeyword = Record[Idx++];
7609 TemplateDecl *Template = ReadDeclAs<TemplateDecl>(F, Record, Idx);
7610 return Context.getQualifiedTemplateName(NNS, hasTemplKeyword, Template);
7611 }
7612
7613 case TemplateName::DependentTemplate: {
7614 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
7615 if (Record[Idx++]) // isIdentifier
7616 return Context.getDependentTemplateName(NNS,
7617 GetIdentifierInfo(F, Record,
7618 Idx));
7619 return Context.getDependentTemplateName(NNS,
7620 (OverloadedOperatorKind)Record[Idx++]);
7621 }
7622
7623 case TemplateName::SubstTemplateTemplateParm: {
7624 TemplateTemplateParmDecl *param
7625 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
7626 if (!param) return TemplateName();
7627 TemplateName replacement = ReadTemplateName(F, Record, Idx);
7628 return Context.getSubstTemplateTemplateParm(param, replacement);
7629 }
7630
7631 case TemplateName::SubstTemplateTemplateParmPack: {
7632 TemplateTemplateParmDecl *Param
7633 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
7634 if (!Param)
7635 return TemplateName();
7636
7637 TemplateArgument ArgPack = ReadTemplateArgument(F, Record, Idx);
7638 if (ArgPack.getKind() != TemplateArgument::Pack)
7639 return TemplateName();
7640
7641 return Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
7642 }
7643 }
7644
7645 llvm_unreachable("Unhandled template name kind!");
7646}
7647
7648TemplateArgument
7649ASTReader::ReadTemplateArgument(ModuleFile &F,
7650 const RecordData &Record, unsigned &Idx) {
7651 TemplateArgument::ArgKind Kind = (TemplateArgument::ArgKind)Record[Idx++];
7652 switch (Kind) {
7653 case TemplateArgument::Null:
7654 return TemplateArgument();
7655 case TemplateArgument::Type:
7656 return TemplateArgument(readType(F, Record, Idx));
7657 case TemplateArgument::Declaration: {
7658 ValueDecl *D = ReadDeclAs<ValueDecl>(F, Record, Idx);
7659 bool ForReferenceParam = Record[Idx++];
7660 return TemplateArgument(D, ForReferenceParam);
7661 }
7662 case TemplateArgument::NullPtr:
7663 return TemplateArgument(readType(F, Record, Idx), /*isNullPtr*/true);
7664 case TemplateArgument::Integral: {
7665 llvm::APSInt Value = ReadAPSInt(Record, Idx);
7666 QualType T = readType(F, Record, Idx);
7667 return TemplateArgument(Context, Value, T);
7668 }
7669 case TemplateArgument::Template:
7670 return TemplateArgument(ReadTemplateName(F, Record, Idx));
7671 case TemplateArgument::TemplateExpansion: {
7672 TemplateName Name = ReadTemplateName(F, Record, Idx);
David Blaikie05785d12013-02-20 22:23:23 +00007673 Optional<unsigned> NumTemplateExpansions;
Guy Benyei11169dd2012-12-18 14:30:41 +00007674 if (unsigned NumExpansions = Record[Idx++])
7675 NumTemplateExpansions = NumExpansions - 1;
7676 return TemplateArgument(Name, NumTemplateExpansions);
7677 }
7678 case TemplateArgument::Expression:
7679 return TemplateArgument(ReadExpr(F));
7680 case TemplateArgument::Pack: {
7681 unsigned NumArgs = Record[Idx++];
7682 TemplateArgument *Args = new (Context) TemplateArgument[NumArgs];
7683 for (unsigned I = 0; I != NumArgs; ++I)
7684 Args[I] = ReadTemplateArgument(F, Record, Idx);
7685 return TemplateArgument(Args, NumArgs);
7686 }
7687 }
7688
7689 llvm_unreachable("Unhandled template argument kind!");
7690}
7691
7692TemplateParameterList *
7693ASTReader::ReadTemplateParameterList(ModuleFile &F,
7694 const RecordData &Record, unsigned &Idx) {
7695 SourceLocation TemplateLoc = ReadSourceLocation(F, Record, Idx);
7696 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Idx);
7697 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Idx);
7698
7699 unsigned NumParams = Record[Idx++];
7700 SmallVector<NamedDecl *, 16> Params;
7701 Params.reserve(NumParams);
7702 while (NumParams--)
7703 Params.push_back(ReadDeclAs<NamedDecl>(F, Record, Idx));
7704
7705 TemplateParameterList* TemplateParams =
7706 TemplateParameterList::Create(Context, TemplateLoc, LAngleLoc,
7707 Params.data(), Params.size(), RAngleLoc);
7708 return TemplateParams;
7709}
7710
7711void
7712ASTReader::
Craig Topper5603df42013-07-05 19:34:19 +00007713ReadTemplateArgumentList(SmallVectorImpl<TemplateArgument> &TemplArgs,
Guy Benyei11169dd2012-12-18 14:30:41 +00007714 ModuleFile &F, const RecordData &Record,
7715 unsigned &Idx) {
7716 unsigned NumTemplateArgs = Record[Idx++];
7717 TemplArgs.reserve(NumTemplateArgs);
7718 while (NumTemplateArgs--)
7719 TemplArgs.push_back(ReadTemplateArgument(F, Record, Idx));
7720}
7721
7722/// \brief Read a UnresolvedSet structure.
Richard Smitha4ba74c2013-08-30 04:46:40 +00007723void ASTReader::ReadUnresolvedSet(ModuleFile &F, LazyASTUnresolvedSet &Set,
Guy Benyei11169dd2012-12-18 14:30:41 +00007724 const RecordData &Record, unsigned &Idx) {
7725 unsigned NumDecls = Record[Idx++];
7726 Set.reserve(Context, NumDecls);
7727 while (NumDecls--) {
Richard Smitha4ba74c2013-08-30 04:46:40 +00007728 DeclID ID = ReadDeclID(F, Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00007729 AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
Richard Smitha4ba74c2013-08-30 04:46:40 +00007730 Set.addLazyDecl(Context, ID, AS);
Guy Benyei11169dd2012-12-18 14:30:41 +00007731 }
7732}
7733
7734CXXBaseSpecifier
7735ASTReader::ReadCXXBaseSpecifier(ModuleFile &F,
7736 const RecordData &Record, unsigned &Idx) {
7737 bool isVirtual = static_cast<bool>(Record[Idx++]);
7738 bool isBaseOfClass = static_cast<bool>(Record[Idx++]);
7739 AccessSpecifier AS = static_cast<AccessSpecifier>(Record[Idx++]);
7740 bool inheritConstructors = static_cast<bool>(Record[Idx++]);
7741 TypeSourceInfo *TInfo = GetTypeSourceInfo(F, Record, Idx);
7742 SourceRange Range = ReadSourceRange(F, Record, Idx);
7743 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Idx);
7744 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo,
7745 EllipsisLoc);
7746 Result.setInheritConstructors(inheritConstructors);
7747 return Result;
7748}
7749
7750std::pair<CXXCtorInitializer **, unsigned>
7751ASTReader::ReadCXXCtorInitializers(ModuleFile &F, const RecordData &Record,
7752 unsigned &Idx) {
Craig Toppera13603a2014-05-22 05:54:18 +00007753 CXXCtorInitializer **CtorInitializers = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007754 unsigned NumInitializers = Record[Idx++];
7755 if (NumInitializers) {
7756 CtorInitializers
7757 = new (Context) CXXCtorInitializer*[NumInitializers];
7758 for (unsigned i=0; i != NumInitializers; ++i) {
Craig Toppera13603a2014-05-22 05:54:18 +00007759 TypeSourceInfo *TInfo = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007760 bool IsBaseVirtual = false;
Craig Toppera13603a2014-05-22 05:54:18 +00007761 FieldDecl *Member = nullptr;
7762 IndirectFieldDecl *IndirectMember = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007763
7764 CtorInitializerType Type = (CtorInitializerType)Record[Idx++];
7765 switch (Type) {
7766 case CTOR_INITIALIZER_BASE:
7767 TInfo = GetTypeSourceInfo(F, Record, Idx);
7768 IsBaseVirtual = Record[Idx++];
7769 break;
7770
7771 case CTOR_INITIALIZER_DELEGATING:
7772 TInfo = GetTypeSourceInfo(F, Record, Idx);
7773 break;
7774
7775 case CTOR_INITIALIZER_MEMBER:
7776 Member = ReadDeclAs<FieldDecl>(F, Record, Idx);
7777 break;
7778
7779 case CTOR_INITIALIZER_INDIRECT_MEMBER:
7780 IndirectMember = ReadDeclAs<IndirectFieldDecl>(F, Record, Idx);
7781 break;
7782 }
7783
7784 SourceLocation MemberOrEllipsisLoc = ReadSourceLocation(F, Record, Idx);
7785 Expr *Init = ReadExpr(F);
7786 SourceLocation LParenLoc = ReadSourceLocation(F, Record, Idx);
7787 SourceLocation RParenLoc = ReadSourceLocation(F, Record, Idx);
7788 bool IsWritten = Record[Idx++];
7789 unsigned SourceOrderOrNumArrayIndices;
7790 SmallVector<VarDecl *, 8> Indices;
7791 if (IsWritten) {
7792 SourceOrderOrNumArrayIndices = Record[Idx++];
7793 } else {
7794 SourceOrderOrNumArrayIndices = Record[Idx++];
7795 Indices.reserve(SourceOrderOrNumArrayIndices);
7796 for (unsigned i=0; i != SourceOrderOrNumArrayIndices; ++i)
7797 Indices.push_back(ReadDeclAs<VarDecl>(F, Record, Idx));
7798 }
7799
7800 CXXCtorInitializer *BOMInit;
7801 if (Type == CTOR_INITIALIZER_BASE) {
7802 BOMInit = new (Context) CXXCtorInitializer(Context, TInfo, IsBaseVirtual,
7803 LParenLoc, Init, RParenLoc,
7804 MemberOrEllipsisLoc);
7805 } else if (Type == CTOR_INITIALIZER_DELEGATING) {
7806 BOMInit = new (Context) CXXCtorInitializer(Context, TInfo, LParenLoc,
7807 Init, RParenLoc);
7808 } else if (IsWritten) {
7809 if (Member)
7810 BOMInit = new (Context) CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc,
7811 LParenLoc, Init, RParenLoc);
7812 else
7813 BOMInit = new (Context) CXXCtorInitializer(Context, IndirectMember,
7814 MemberOrEllipsisLoc, LParenLoc,
7815 Init, RParenLoc);
7816 } else {
Argyrios Kyrtzidis794671d2013-05-30 23:59:46 +00007817 if (IndirectMember) {
7818 assert(Indices.empty() && "Indirect field improperly initialized");
7819 BOMInit = new (Context) CXXCtorInitializer(Context, IndirectMember,
7820 MemberOrEllipsisLoc, LParenLoc,
7821 Init, RParenLoc);
7822 } else {
7823 BOMInit = CXXCtorInitializer::Create(Context, Member, MemberOrEllipsisLoc,
7824 LParenLoc, Init, RParenLoc,
7825 Indices.data(), Indices.size());
7826 }
Guy Benyei11169dd2012-12-18 14:30:41 +00007827 }
7828
7829 if (IsWritten)
7830 BOMInit->setSourceOrder(SourceOrderOrNumArrayIndices);
7831 CtorInitializers[i] = BOMInit;
7832 }
7833 }
7834
7835 return std::make_pair(CtorInitializers, NumInitializers);
7836}
7837
7838NestedNameSpecifier *
7839ASTReader::ReadNestedNameSpecifier(ModuleFile &F,
7840 const RecordData &Record, unsigned &Idx) {
7841 unsigned N = Record[Idx++];
Craig Toppera13603a2014-05-22 05:54:18 +00007842 NestedNameSpecifier *NNS = nullptr, *Prev = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007843 for (unsigned I = 0; I != N; ++I) {
7844 NestedNameSpecifier::SpecifierKind Kind
7845 = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
7846 switch (Kind) {
7847 case NestedNameSpecifier::Identifier: {
7848 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
7849 NNS = NestedNameSpecifier::Create(Context, Prev, II);
7850 break;
7851 }
7852
7853 case NestedNameSpecifier::Namespace: {
7854 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
7855 NNS = NestedNameSpecifier::Create(Context, Prev, NS);
7856 break;
7857 }
7858
7859 case NestedNameSpecifier::NamespaceAlias: {
7860 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
7861 NNS = NestedNameSpecifier::Create(Context, Prev, Alias);
7862 break;
7863 }
7864
7865 case NestedNameSpecifier::TypeSpec:
7866 case NestedNameSpecifier::TypeSpecWithTemplate: {
7867 const Type *T = readType(F, Record, Idx).getTypePtrOrNull();
7868 if (!T)
Craig Toppera13603a2014-05-22 05:54:18 +00007869 return nullptr;
7870
Guy Benyei11169dd2012-12-18 14:30:41 +00007871 bool Template = Record[Idx++];
7872 NNS = NestedNameSpecifier::Create(Context, Prev, Template, T);
7873 break;
7874 }
7875
7876 case NestedNameSpecifier::Global: {
7877 NNS = NestedNameSpecifier::GlobalSpecifier(Context);
7878 // No associated value, and there can't be a prefix.
7879 break;
7880 }
7881 }
7882 Prev = NNS;
7883 }
7884 return NNS;
7885}
7886
7887NestedNameSpecifierLoc
7888ASTReader::ReadNestedNameSpecifierLoc(ModuleFile &F, const RecordData &Record,
7889 unsigned &Idx) {
7890 unsigned N = Record[Idx++];
7891 NestedNameSpecifierLocBuilder Builder;
7892 for (unsigned I = 0; I != N; ++I) {
7893 NestedNameSpecifier::SpecifierKind Kind
7894 = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
7895 switch (Kind) {
7896 case NestedNameSpecifier::Identifier: {
7897 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
7898 SourceRange Range = ReadSourceRange(F, Record, Idx);
7899 Builder.Extend(Context, II, Range.getBegin(), Range.getEnd());
7900 break;
7901 }
7902
7903 case NestedNameSpecifier::Namespace: {
7904 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
7905 SourceRange Range = ReadSourceRange(F, Record, Idx);
7906 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
7907 break;
7908 }
7909
7910 case NestedNameSpecifier::NamespaceAlias: {
7911 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
7912 SourceRange Range = ReadSourceRange(F, Record, Idx);
7913 Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd());
7914 break;
7915 }
7916
7917 case NestedNameSpecifier::TypeSpec:
7918 case NestedNameSpecifier::TypeSpecWithTemplate: {
7919 bool Template = Record[Idx++];
7920 TypeSourceInfo *T = GetTypeSourceInfo(F, Record, Idx);
7921 if (!T)
7922 return NestedNameSpecifierLoc();
7923 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
7924
7925 // FIXME: 'template' keyword location not saved anywhere, so we fake it.
7926 Builder.Extend(Context,
7927 Template? T->getTypeLoc().getBeginLoc() : SourceLocation(),
7928 T->getTypeLoc(), ColonColonLoc);
7929 break;
7930 }
7931
7932 case NestedNameSpecifier::Global: {
7933 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
7934 Builder.MakeGlobal(Context, ColonColonLoc);
7935 break;
7936 }
7937 }
7938 }
7939
7940 return Builder.getWithLocInContext(Context);
7941}
7942
7943SourceRange
7944ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record,
7945 unsigned &Idx) {
7946 SourceLocation beg = ReadSourceLocation(F, Record, Idx);
7947 SourceLocation end = ReadSourceLocation(F, Record, Idx);
7948 return SourceRange(beg, end);
7949}
7950
7951/// \brief Read an integral value
7952llvm::APInt ASTReader::ReadAPInt(const RecordData &Record, unsigned &Idx) {
7953 unsigned BitWidth = Record[Idx++];
7954 unsigned NumWords = llvm::APInt::getNumWords(BitWidth);
7955 llvm::APInt Result(BitWidth, NumWords, &Record[Idx]);
7956 Idx += NumWords;
7957 return Result;
7958}
7959
7960/// \brief Read a signed integral value
7961llvm::APSInt ASTReader::ReadAPSInt(const RecordData &Record, unsigned &Idx) {
7962 bool isUnsigned = Record[Idx++];
7963 return llvm::APSInt(ReadAPInt(Record, Idx), isUnsigned);
7964}
7965
7966/// \brief Read a floating-point value
Tim Northover178723a2013-01-22 09:46:51 +00007967llvm::APFloat ASTReader::ReadAPFloat(const RecordData &Record,
7968 const llvm::fltSemantics &Sem,
7969 unsigned &Idx) {
7970 return llvm::APFloat(Sem, ReadAPInt(Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00007971}
7972
7973// \brief Read a string
7974std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) {
7975 unsigned Len = Record[Idx++];
7976 std::string Result(Record.data() + Idx, Record.data() + Idx + Len);
7977 Idx += Len;
7978 return Result;
7979}
7980
7981VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record,
7982 unsigned &Idx) {
7983 unsigned Major = Record[Idx++];
7984 unsigned Minor = Record[Idx++];
7985 unsigned Subminor = Record[Idx++];
7986 if (Minor == 0)
7987 return VersionTuple(Major);
7988 if (Subminor == 0)
7989 return VersionTuple(Major, Minor - 1);
7990 return VersionTuple(Major, Minor - 1, Subminor - 1);
7991}
7992
7993CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F,
7994 const RecordData &Record,
7995 unsigned &Idx) {
7996 CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx);
7997 return CXXTemporary::Create(Context, Decl);
7998}
7999
8000DiagnosticBuilder ASTReader::Diag(unsigned DiagID) {
Argyrios Kyrtzidisdc9fdaf2013-05-24 05:44:08 +00008001 return Diag(CurrentImportLoc, DiagID);
Guy Benyei11169dd2012-12-18 14:30:41 +00008002}
8003
8004DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) {
8005 return Diags.Report(Loc, DiagID);
8006}
8007
8008/// \brief Retrieve the identifier table associated with the
8009/// preprocessor.
8010IdentifierTable &ASTReader::getIdentifierTable() {
8011 return PP.getIdentifierTable();
8012}
8013
8014/// \brief Record that the given ID maps to the given switch-case
8015/// statement.
8016void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) {
Craig Toppera13603a2014-05-22 05:54:18 +00008017 assert((*CurrSwitchCaseStmts)[ID] == nullptr &&
Guy Benyei11169dd2012-12-18 14:30:41 +00008018 "Already have a SwitchCase with this ID");
8019 (*CurrSwitchCaseStmts)[ID] = SC;
8020}
8021
8022/// \brief Retrieve the switch-case statement with the given ID.
8023SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) {
Craig Toppera13603a2014-05-22 05:54:18 +00008024 assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID");
Guy Benyei11169dd2012-12-18 14:30:41 +00008025 return (*CurrSwitchCaseStmts)[ID];
8026}
8027
8028void ASTReader::ClearSwitchCaseIDs() {
8029 CurrSwitchCaseStmts->clear();
8030}
8031
8032void ASTReader::ReadComments() {
8033 std::vector<RawComment *> Comments;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00008034 for (SmallVectorImpl<std::pair<BitstreamCursor,
Guy Benyei11169dd2012-12-18 14:30:41 +00008035 serialization::ModuleFile *> >::iterator
8036 I = CommentsCursors.begin(),
8037 E = CommentsCursors.end();
8038 I != E; ++I) {
Dmitri Gribenko9ee0e302014-03-27 15:40:39 +00008039 Comments.clear();
Chris Lattner7fb3bef2013-01-20 00:56:42 +00008040 BitstreamCursor &Cursor = I->first;
Guy Benyei11169dd2012-12-18 14:30:41 +00008041 serialization::ModuleFile &F = *I->second;
8042 SavedStreamPosition SavedPosition(Cursor);
8043
8044 RecordData Record;
8045 while (true) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00008046 llvm::BitstreamEntry Entry =
8047 Cursor.advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd);
Dmitri Gribenko9ee0e302014-03-27 15:40:39 +00008048
Chris Lattner7fb3bef2013-01-20 00:56:42 +00008049 switch (Entry.Kind) {
8050 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
8051 case llvm::BitstreamEntry::Error:
8052 Error("malformed block record in AST file");
8053 return;
8054 case llvm::BitstreamEntry::EndBlock:
8055 goto NextCursor;
8056 case llvm::BitstreamEntry::Record:
8057 // The interesting case.
Guy Benyei11169dd2012-12-18 14:30:41 +00008058 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00008059 }
8060
8061 // Read a record.
8062 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00008063 switch ((CommentRecordTypes)Cursor.readRecord(Entry.ID, Record)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008064 case COMMENTS_RAW_COMMENT: {
8065 unsigned Idx = 0;
8066 SourceRange SR = ReadSourceRange(F, Record, Idx);
8067 RawComment::CommentKind Kind =
8068 (RawComment::CommentKind) Record[Idx++];
8069 bool IsTrailingComment = Record[Idx++];
8070 bool IsAlmostTrailingComment = Record[Idx++];
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00008071 Comments.push_back(new (Context) RawComment(
8072 SR, Kind, IsTrailingComment, IsAlmostTrailingComment,
8073 Context.getLangOpts().CommentOpts.ParseAllComments));
Guy Benyei11169dd2012-12-18 14:30:41 +00008074 break;
8075 }
8076 }
8077 }
Dmitri Gribenko9ee0e302014-03-27 15:40:39 +00008078 NextCursor:
8079 Context.Comments.addDeserializedComments(Comments);
Guy Benyei11169dd2012-12-18 14:30:41 +00008080 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008081}
8082
Richard Smithcd45dbc2014-04-19 03:48:30 +00008083std::string ASTReader::getOwningModuleNameForDiagnostic(const Decl *D) {
8084 // If we know the owning module, use it.
8085 if (Module *M = D->getOwningModule())
8086 return M->getFullModuleName();
8087
8088 // Otherwise, use the name of the top-level module the decl is within.
8089 if (ModuleFile *M = getOwningModuleFile(D))
8090 return M->ModuleName;
8091
8092 // Not from a module.
8093 return "";
8094}
8095
Guy Benyei11169dd2012-12-18 14:30:41 +00008096void ASTReader::finishPendingActions() {
Richard Smith851072e2014-05-19 20:59:20 +00008097 while (!PendingIdentifierInfos.empty() ||
8098 !PendingIncompleteDeclChains.empty() || !PendingDeclChains.empty() ||
Richard Smith2b9e3e32013-10-18 06:05:18 +00008099 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() ||
Richard Smitha0ce9c42014-07-29 23:23:27 +00008100 !PendingUpdateRecords.empty()) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008101 // If any identifiers with corresponding top-level declarations have
8102 // been loaded, load those declarations now.
Craig Topper79be4cd2013-07-05 04:33:53 +00008103 typedef llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2> >
8104 TopLevelDeclsMap;
8105 TopLevelDeclsMap TopLevelDecls;
8106
Guy Benyei11169dd2012-12-18 14:30:41 +00008107 while (!PendingIdentifierInfos.empty()) {
Douglas Gregor6168bd22013-02-18 15:53:43 +00008108 IdentifierInfo *II = PendingIdentifierInfos.back().first;
Richard Smithf0ae3c2d2014-03-28 17:31:23 +00008109 SmallVector<uint32_t, 4> DeclIDs =
8110 std::move(PendingIdentifierInfos.back().second);
Douglas Gregorcb15f082013-02-19 18:26:28 +00008111 PendingIdentifierInfos.pop_back();
Douglas Gregor6168bd22013-02-18 15:53:43 +00008112
8113 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]);
Guy Benyei11169dd2012-12-18 14:30:41 +00008114 }
Richard Smithf0ae3c2d2014-03-28 17:31:23 +00008115
Richard Smith851072e2014-05-19 20:59:20 +00008116 // For each decl chain that we wanted to complete while deserializing, mark
8117 // it as "still needs to be completed".
8118 for (unsigned I = 0; I != PendingIncompleteDeclChains.size(); ++I) {
8119 markIncompleteDeclChain(PendingIncompleteDeclChains[I]);
8120 }
8121 PendingIncompleteDeclChains.clear();
8122
Guy Benyei11169dd2012-12-18 14:30:41 +00008123 // Load pending declaration chains.
8124 for (unsigned I = 0; I != PendingDeclChains.size(); ++I) {
8125 loadPendingDeclChain(PendingDeclChains[I]);
8126 PendingDeclChainsKnown.erase(PendingDeclChains[I]);
8127 }
8128 PendingDeclChains.clear();
8129
Douglas Gregor6168bd22013-02-18 15:53:43 +00008130 // Make the most recent of the top-level declarations visible.
Craig Topper79be4cd2013-07-05 04:33:53 +00008131 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
8132 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
Douglas Gregor6168bd22013-02-18 15:53:43 +00008133 IdentifierInfo *II = TLD->first;
8134 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
Argyrios Kyrtzidise5edbf92013-04-26 21:33:35 +00008135 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II);
Douglas Gregor6168bd22013-02-18 15:53:43 +00008136 }
8137 }
8138
Guy Benyei11169dd2012-12-18 14:30:41 +00008139 // Load any pending macro definitions.
8140 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008141 IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
8142 SmallVector<PendingMacroInfo, 2> GlobalIDs;
8143 GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
8144 // Initialize the macro history from chained-PCHs ahead of module imports.
Richard Smith49f906a2014-03-01 00:08:04 +00008145 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
Argyrios Kyrtzidis719736c2013-01-19 03:14:56 +00008146 ++IDIdx) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008147 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
8148 if (Info.M->Kind != MK_Module)
8149 resolvePendingMacro(II, Info);
8150 }
8151 // Handle module imports.
Richard Smith49f906a2014-03-01 00:08:04 +00008152 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008153 ++IDIdx) {
8154 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
8155 if (Info.M->Kind == MK_Module)
8156 resolvePendingMacro(II, Info);
Guy Benyei11169dd2012-12-18 14:30:41 +00008157 }
8158 }
8159 PendingMacroIDs.clear();
Argyrios Kyrtzidis83a6e3b2013-02-16 00:48:59 +00008160
8161 // Wire up the DeclContexts for Decls that we delayed setting until
8162 // recursive loading is completed.
8163 while (!PendingDeclContextInfos.empty()) {
8164 PendingDeclContextInfo Info = PendingDeclContextInfos.front();
8165 PendingDeclContextInfos.pop_front();
8166 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC));
8167 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC));
8168 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext());
8169 }
Richard Smith2b9e3e32013-10-18 06:05:18 +00008170
Richard Smithd1c46742014-04-30 02:24:17 +00008171 // Perform any pending declaration updates.
Richard Smithd6db68c2014-08-07 20:58:41 +00008172 while (!PendingUpdateRecords.empty()) {
Richard Smithd1c46742014-04-30 02:24:17 +00008173 auto Update = PendingUpdateRecords.pop_back_val();
8174 ReadingKindTracker ReadingKind(Read_Decl, *this);
8175 loadDeclUpdateRecords(Update.first, Update.second);
8176 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008177 }
8178
8179 // If we deserialized any C++ or Objective-C class definitions, any
8180 // Objective-C protocol definitions, or any redeclarable templates, make sure
8181 // that all redeclarations point to the definitions. Note that this can only
8182 // happen now, after the redeclaration chains have been fully wired.
8183 for (llvm::SmallPtrSet<Decl *, 4>::iterator D = PendingDefinitions.begin(),
8184 DEnd = PendingDefinitions.end();
8185 D != DEnd; ++D) {
8186 if (TagDecl *TD = dyn_cast<TagDecl>(*D)) {
Richard Smith5b21db82014-04-23 18:20:42 +00008187 if (const TagType *TagT = dyn_cast<TagType>(TD->getTypeForDecl())) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008188 // Make sure that the TagType points at the definition.
8189 const_cast<TagType*>(TagT)->decl = TD;
8190 }
8191
Aaron Ballman86c93902014-03-06 23:45:36 +00008192 if (auto RD = dyn_cast<CXXRecordDecl>(*D)) {
8193 for (auto R : RD->redecls())
8194 cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData;
Guy Benyei11169dd2012-12-18 14:30:41 +00008195 }
8196
8197 continue;
8198 }
8199
Aaron Ballman86c93902014-03-06 23:45:36 +00008200 if (auto ID = dyn_cast<ObjCInterfaceDecl>(*D)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008201 // Make sure that the ObjCInterfaceType points at the definition.
8202 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl))
8203 ->Decl = ID;
8204
Aaron Ballman86c93902014-03-06 23:45:36 +00008205 for (auto R : ID->redecls())
Guy Benyei11169dd2012-12-18 14:30:41 +00008206 R->Data = ID->Data;
8207
8208 continue;
8209 }
8210
Aaron Ballman86c93902014-03-06 23:45:36 +00008211 if (auto PD = dyn_cast<ObjCProtocolDecl>(*D)) {
8212 for (auto R : PD->redecls())
Guy Benyei11169dd2012-12-18 14:30:41 +00008213 R->Data = PD->Data;
8214
8215 continue;
8216 }
8217
Aaron Ballman86c93902014-03-06 23:45:36 +00008218 auto RTD = cast<RedeclarableTemplateDecl>(*D)->getCanonicalDecl();
8219 for (auto R : RTD->redecls())
Guy Benyei11169dd2012-12-18 14:30:41 +00008220 R->Common = RTD->Common;
8221 }
8222 PendingDefinitions.clear();
8223
8224 // Load the bodies of any functions or methods we've encountered. We do
8225 // this now (delayed) so that we can be sure that the declaration chains
8226 // have been fully wired up.
8227 for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
8228 PBEnd = PendingBodies.end();
8229 PB != PBEnd; ++PB) {
8230 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
8231 // FIXME: Check for =delete/=default?
8232 // FIXME: Complain about ODR violations here?
8233 if (!getContext().getLangOpts().Modules || !FD->hasBody())
8234 FD->setLazyBody(PB->second);
8235 continue;
8236 }
8237
8238 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first);
8239 if (!getContext().getLangOpts().Modules || !MD->hasBody())
8240 MD->setLazyBody(PB->second);
8241 }
8242 PendingBodies.clear();
Richard Smitha0ce9c42014-07-29 23:23:27 +00008243}
8244
8245void ASTReader::diagnoseOdrViolations() {
Richard Smithbb853c72014-08-13 01:23:33 +00008246 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty())
8247 return;
8248
Richard Smitha0ce9c42014-07-29 23:23:27 +00008249 // Trigger the import of the full definition of each class that had any
8250 // odr-merging problems, so we can produce better diagnostics for them.
Richard Smithbb853c72014-08-13 01:23:33 +00008251 // These updates may in turn find and diagnose some ODR failures, so take
8252 // ownership of the set first.
8253 auto OdrMergeFailures = std::move(PendingOdrMergeFailures);
8254 PendingOdrMergeFailures.clear();
8255 for (auto &Merge : OdrMergeFailures) {
Richard Smitha0ce9c42014-07-29 23:23:27 +00008256 Merge.first->buildLookup();
8257 Merge.first->decls_begin();
8258 Merge.first->bases_begin();
8259 Merge.first->vbases_begin();
8260 for (auto *RD : Merge.second) {
8261 RD->decls_begin();
8262 RD->bases_begin();
8263 RD->vbases_begin();
8264 }
8265 }
8266
8267 // For each declaration from a merged context, check that the canonical
8268 // definition of that context also contains a declaration of the same
8269 // entity.
8270 //
8271 // Caution: this loop does things that might invalidate iterators into
8272 // PendingOdrMergeChecks. Don't turn this into a range-based for loop!
8273 while (!PendingOdrMergeChecks.empty()) {
8274 NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
8275
8276 // FIXME: Skip over implicit declarations for now. This matters for things
8277 // like implicitly-declared special member functions. This isn't entirely
8278 // correct; we can end up with multiple unmerged declarations of the same
8279 // implicit entity.
8280 if (D->isImplicit())
8281 continue;
8282
8283 DeclContext *CanonDef = D->getDeclContext();
8284 DeclContext::lookup_result R = CanonDef->lookup(D->getDeclName());
8285
8286 bool Found = false;
8287 const Decl *DCanon = D->getCanonicalDecl();
8288
8289 llvm::SmallVector<const NamedDecl*, 4> Candidates;
8290 for (DeclContext::lookup_iterator I = R.begin(), E = R.end();
8291 !Found && I != E; ++I) {
8292 for (auto RI : (*I)->redecls()) {
8293 if (RI->getLexicalDeclContext() == CanonDef) {
8294 // This declaration is present in the canonical definition. If it's
8295 // in the same redecl chain, it's the one we're looking for.
8296 if (RI->getCanonicalDecl() == DCanon)
8297 Found = true;
8298 else
8299 Candidates.push_back(cast<NamedDecl>(RI));
8300 break;
8301 }
8302 }
8303 }
8304
8305 if (!Found) {
8306 D->setInvalidDecl();
8307
8308 std::string CanonDefModule =
8309 getOwningModuleNameForDiagnostic(cast<Decl>(CanonDef));
8310 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl)
8311 << D << getOwningModuleNameForDiagnostic(D)
8312 << CanonDef << CanonDefModule.empty() << CanonDefModule;
8313
8314 if (Candidates.empty())
8315 Diag(cast<Decl>(CanonDef)->getLocation(),
8316 diag::note_module_odr_violation_no_possible_decls) << D;
8317 else {
8318 for (unsigned I = 0, N = Candidates.size(); I != N; ++I)
8319 Diag(Candidates[I]->getLocation(),
8320 diag::note_module_odr_violation_possible_decl)
8321 << Candidates[I];
8322 }
8323
8324 DiagnosedOdrMergeFailures.insert(CanonDef);
8325 }
8326 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00008327
8328 // Issue any pending ODR-failure diagnostics.
Richard Smithbb853c72014-08-13 01:23:33 +00008329 for (auto &Merge : OdrMergeFailures) {
Richard Smitha0ce9c42014-07-29 23:23:27 +00008330 // If we've already pointed out a specific problem with this class, don't
8331 // bother issuing a general "something's different" diagnostic.
Richard Smithcd45dbc2014-04-19 03:48:30 +00008332 if (!DiagnosedOdrMergeFailures.insert(Merge.first))
8333 continue;
8334
8335 bool Diagnosed = false;
8336 for (auto *RD : Merge.second) {
8337 // Multiple different declarations got merged together; tell the user
8338 // where they came from.
8339 if (Merge.first != RD) {
8340 // FIXME: Walk the definition, figure out what's different,
8341 // and diagnose that.
8342 if (!Diagnosed) {
8343 std::string Module = getOwningModuleNameForDiagnostic(Merge.first);
8344 Diag(Merge.first->getLocation(),
8345 diag::err_module_odr_violation_different_definitions)
8346 << Merge.first << Module.empty() << Module;
8347 Diagnosed = true;
8348 }
8349
8350 Diag(RD->getLocation(),
8351 diag::note_module_odr_violation_different_definitions)
8352 << getOwningModuleNameForDiagnostic(RD);
8353 }
8354 }
8355
8356 if (!Diagnosed) {
8357 // All definitions are updates to the same declaration. This happens if a
8358 // module instantiates the declaration of a class template specialization
8359 // and two or more other modules instantiate its definition.
8360 //
8361 // FIXME: Indicate which modules had instantiations of this definition.
8362 // FIXME: How can this even happen?
8363 Diag(Merge.first->getLocation(),
8364 diag::err_module_odr_violation_different_instantiations)
8365 << Merge.first;
8366 }
8367 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008368}
8369
8370void ASTReader::FinishedDeserializing() {
8371 assert(NumCurrentElementsDeserializing &&
8372 "FinishedDeserializing not paired with StartedDeserializing");
8373 if (NumCurrentElementsDeserializing == 1) {
8374 // We decrease NumCurrentElementsDeserializing only after pending actions
8375 // are finished, to avoid recursively re-calling finishPendingActions().
8376 finishPendingActions();
8377 }
8378 --NumCurrentElementsDeserializing;
8379
Richard Smitha0ce9c42014-07-29 23:23:27 +00008380 if (NumCurrentElementsDeserializing == 0) {
8381 diagnoseOdrViolations();
8382
Richard Smith04d05b52014-03-23 00:27:18 +00008383 // We are not in recursive loading, so it's safe to pass the "interesting"
8384 // decls to the consumer.
Richard Smitha0ce9c42014-07-29 23:23:27 +00008385 if (Consumer)
8386 PassInterestingDeclsToConsumer();
Guy Benyei11169dd2012-12-18 14:30:41 +00008387 }
8388}
8389
Argyrios Kyrtzidise5edbf92013-04-26 21:33:35 +00008390void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) {
Rafael Espindola7b56f6c2013-10-19 16:55:03 +00008391 D = D->getMostRecentDecl();
Argyrios Kyrtzidise5edbf92013-04-26 21:33:35 +00008392
8393 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
8394 SemaObj->TUScope->AddDecl(D);
8395 } else if (SemaObj->TUScope) {
8396 // Adding the decl to IdResolver may have failed because it was already in
8397 // (even though it was not added in scope). If it is already in, make sure
8398 // it gets in the scope as well.
8399 if (std::find(SemaObj->IdResolver.begin(Name),
8400 SemaObj->IdResolver.end(), D) != SemaObj->IdResolver.end())
8401 SemaObj->TUScope->AddDecl(D);
8402 }
8403}
8404
Nico Weber824285e2014-05-08 04:26:47 +00008405ASTReader::ASTReader(Preprocessor &PP, ASTContext &Context, StringRef isysroot,
8406 bool DisableValidation, bool AllowASTWithCompilerErrors,
8407 bool AllowConfigurationMismatch, bool ValidateSystemInputs,
Ben Langmuir2cb4a782014-02-05 22:21:15 +00008408 bool UseGlobalIndex)
Craig Toppera13603a2014-05-22 05:54:18 +00008409 : Listener(new PCHValidator(PP, *this)), DeserializationListener(nullptr),
Nico Weber824285e2014-05-08 04:26:47 +00008410 OwnsDeserializationListener(false), SourceMgr(PP.getSourceManager()),
Craig Toppera13603a2014-05-22 05:54:18 +00008411 FileMgr(PP.getFileManager()), Diags(PP.getDiagnostics()),
8412 SemaObj(nullptr), PP(PP), Context(Context), Consumer(nullptr),
8413 ModuleMgr(PP.getFileManager()), isysroot(isysroot),
8414 DisableValidation(DisableValidation),
Nico Weber824285e2014-05-08 04:26:47 +00008415 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
8416 AllowConfigurationMismatch(AllowConfigurationMismatch),
8417 ValidateSystemInputs(ValidateSystemInputs),
8418 UseGlobalIndex(UseGlobalIndex), TriedLoadingGlobalIndex(false),
Richard Smith053f6c62014-05-16 23:01:30 +00008419 CurrSwitchCaseStmts(&SwitchCaseStmts),
Nico Weber824285e2014-05-08 04:26:47 +00008420 NumSLocEntriesRead(0), TotalNumSLocEntries(0), NumStatementsRead(0),
8421 TotalNumStatements(0), NumMacrosRead(0), TotalNumMacros(0),
8422 NumIdentifierLookups(0), NumIdentifierLookupHits(0), NumSelectorsRead(0),
8423 NumMethodPoolEntriesRead(0), NumMethodPoolLookups(0),
8424 NumMethodPoolHits(0), NumMethodPoolTableLookups(0),
8425 NumMethodPoolTableHits(0), TotalNumMethodPoolEntries(0),
8426 NumLexicalDeclContextsRead(0), TotalLexicalDeclContexts(0),
8427 NumVisibleDeclContextsRead(0), TotalVisibleDeclContexts(0),
8428 TotalModulesSizeInBits(0), NumCurrentElementsDeserializing(0),
8429 PassingDeclsToConsumer(false), NumCXXBaseSpecifiersLoaded(0),
8430 ReadingKind(Read_None) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008431 SourceMgr.setExternalSLocEntrySource(this);
8432}
8433
8434ASTReader::~ASTReader() {
Nico Weber824285e2014-05-08 04:26:47 +00008435 if (OwnsDeserializationListener)
8436 delete DeserializationListener;
8437
Guy Benyei11169dd2012-12-18 14:30:41 +00008438 for (DeclContextVisibleUpdatesPending::iterator
8439 I = PendingVisibleUpdates.begin(),
8440 E = PendingVisibleUpdates.end();
8441 I != E; ++I) {
8442 for (DeclContextVisibleUpdates::iterator J = I->second.begin(),
8443 F = I->second.end();
8444 J != F; ++J)
8445 delete J->first;
8446 }
8447}