blob: 93c01cb1e128735b14df43d01741f7460fdb575d [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
Rafael Espindolad87f8d72014-08-27 20:03:29 +00001227 std::unique_ptr<llvm::MemoryBuffer> Buffer
Chris Lattner0e6c9402013-01-20 02:38:54 +00001228 = llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), File->getName());
David Blaikie49cc3182014-08-27 20:54:45 +00001229 SourceMgr.overrideFileContents(File, std::move(Buffer));
Guy Benyei11169dd2012-12-18 14:30:41 +00001230 }
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
Rafael Espindolad87f8d72014-08-27 20:03:29 +00001254 std::unique_ptr<llvm::MemoryBuffer> Buffer =
1255 llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name);
David Blaikie50a5f972014-08-29 07:59:55 +00001256 SourceMgr.createFileID(std::move(Buffer), FileCharacter, ID,
Rafael Espindolad87f8d72014-08-27 20:03:29 +00001257 BaseOffset + Offset, 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));
Guy Benyei11169dd2012-12-18 14:30:41 +00002623 }
Ben Langmuirfe971d92014-08-16 04:54:18 +00002624 // Increase size by >= 1 so we get a unique base index in the next module.
2625 TypesLoaded.resize(TypesLoaded.size() + std::max(F.LocalNumTypes, 1U));
Guy Benyei11169dd2012-12-18 14:30:41 +00002626 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;
Guy Benyei11169dd2012-12-18 14:30:41 +00002653 }
Ben Langmuirfe971d92014-08-16 04:54:18 +00002654
2655 // Increase size by >= 1 so we get a unique base index in the next module.
2656 DeclsLoaded.resize(DeclsLoaded.size() + std::max(F.LocalNumDecls, 1U));
Guy Benyei11169dd2012-12-18 14:30:41 +00002657 break;
2658 }
2659
2660 case TU_UPDATE_LEXICAL: {
2661 DeclContext *TU = Context.getTranslationUnitDecl();
2662 DeclContextInfo &Info = F.DeclContextInfos[TU];
Chris Lattner0e6c9402013-01-20 02:38:54 +00002663 Info.LexicalDecls = reinterpret_cast<const KindDeclIDPair *>(Blob.data());
Guy Benyei11169dd2012-12-18 14:30:41 +00002664 Info.NumLexicalDecls
Chris Lattner0e6c9402013-01-20 02:38:54 +00002665 = static_cast<unsigned int>(Blob.size() / sizeof(KindDeclIDPair));
Guy Benyei11169dd2012-12-18 14:30:41 +00002666 TU->setHasExternalLexicalStorage(true);
2667 break;
2668 }
2669
2670 case UPDATE_VISIBLE: {
2671 unsigned Idx = 0;
2672 serialization::DeclID ID = ReadDeclID(F, Record, Idx);
2673 ASTDeclContextNameLookupTable *Table =
Justin Bognerda4e6502014-04-14 16:34:29 +00002674 ASTDeclContextNameLookupTable::Create(
2675 (const unsigned char *)Blob.data() + Record[Idx++],
2676 (const unsigned char *)Blob.data() + sizeof(uint32_t),
2677 (const unsigned char *)Blob.data(),
2678 ASTDeclContextNameLookupTrait(*this, F));
Richard Smithcd45dbc2014-04-19 03:48:30 +00002679 if (Decl *D = GetExistingDecl(ID)) {
Richard Smithd9174792014-03-11 03:10:46 +00002680 auto *DC = cast<DeclContext>(D);
2681 DC->getPrimaryContext()->setHasExternalVisibleStorage(true);
Richard Smith52e3fba2014-03-11 07:17:35 +00002682 auto *&LookupTable = F.DeclContextInfos[DC].NameLookupTableData;
2683 delete LookupTable;
2684 LookupTable = Table;
Guy Benyei11169dd2012-12-18 14:30:41 +00002685 } else
2686 PendingVisibleUpdates[ID].push_back(std::make_pair(Table, &F));
2687 break;
2688 }
2689
2690 case IDENTIFIER_TABLE:
Chris Lattner0e6c9402013-01-20 02:38:54 +00002691 F.IdentifierTableData = Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002692 if (Record[0]) {
Justin Bognerda4e6502014-04-14 16:34:29 +00002693 F.IdentifierLookupTable = ASTIdentifierLookupTable::Create(
2694 (const unsigned char *)F.IdentifierTableData + Record[0],
2695 (const unsigned char *)F.IdentifierTableData + sizeof(uint32_t),
2696 (const unsigned char *)F.IdentifierTableData,
2697 ASTIdentifierLookupTrait(*this, F));
Guy Benyei11169dd2012-12-18 14:30:41 +00002698
2699 PP.getIdentifierTable().setExternalIdentifierLookup(this);
2700 }
2701 break;
2702
2703 case IDENTIFIER_OFFSET: {
2704 if (F.LocalNumIdentifiers != 0) {
2705 Error("duplicate IDENTIFIER_OFFSET record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002706 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002707 }
Chris Lattner0e6c9402013-01-20 02:38:54 +00002708 F.IdentifierOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002709 F.LocalNumIdentifiers = Record[0];
2710 unsigned LocalBaseIdentifierID = Record[1];
2711 F.BaseIdentifierID = getTotalNumIdentifiers();
2712
2713 if (F.LocalNumIdentifiers > 0) {
2714 // Introduce the global -> local mapping for identifiers within this
2715 // module.
2716 GlobalIdentifierMap.insert(std::make_pair(getTotalNumIdentifiers() + 1,
2717 &F));
2718
2719 // Introduce the local -> global mapping for identifiers within this
2720 // module.
2721 F.IdentifierRemap.insertOrReplace(
2722 std::make_pair(LocalBaseIdentifierID,
2723 F.BaseIdentifierID - LocalBaseIdentifierID));
Guy Benyei11169dd2012-12-18 14:30:41 +00002724 }
Ben Langmuirfe971d92014-08-16 04:54:18 +00002725
2726 // Increase size by >= 1 so we get a unique base index in the next module.
2727 IdentifiersLoaded.resize(IdentifiersLoaded.size() +
2728 std::max(F.LocalNumIdentifiers, 1U));
Guy Benyei11169dd2012-12-18 14:30:41 +00002729 break;
2730 }
2731
Ben Langmuir332aafe2014-01-31 01:06:56 +00002732 case EAGERLY_DESERIALIZED_DECLS:
Guy Benyei11169dd2012-12-18 14:30:41 +00002733 for (unsigned I = 0, N = Record.size(); I != N; ++I)
Ben Langmuir332aafe2014-01-31 01:06:56 +00002734 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I]));
Guy Benyei11169dd2012-12-18 14:30:41 +00002735 break;
2736
2737 case SPECIAL_TYPES:
Douglas Gregor44180f82013-02-01 23:45:03 +00002738 if (SpecialTypes.empty()) {
2739 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2740 SpecialTypes.push_back(getGlobalTypeID(F, Record[I]));
2741 break;
2742 }
2743
2744 if (SpecialTypes.size() != Record.size()) {
2745 Error("invalid special-types record");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002746 return Failure;
Douglas Gregor44180f82013-02-01 23:45:03 +00002747 }
2748
2749 for (unsigned I = 0, N = Record.size(); I != N; ++I) {
2750 serialization::TypeID ID = getGlobalTypeID(F, Record[I]);
2751 if (!SpecialTypes[I])
2752 SpecialTypes[I] = ID;
2753 // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate
2754 // merge step?
2755 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002756 break;
2757
2758 case STATISTICS:
2759 TotalNumStatements += Record[0];
2760 TotalNumMacros += Record[1];
2761 TotalLexicalDeclContexts += Record[2];
2762 TotalVisibleDeclContexts += Record[3];
2763 break;
2764
2765 case UNUSED_FILESCOPED_DECLS:
2766 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2767 UnusedFileScopedDecls.push_back(getGlobalDeclID(F, Record[I]));
2768 break;
2769
2770 case DELEGATING_CTORS:
2771 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2772 DelegatingCtorDecls.push_back(getGlobalDeclID(F, Record[I]));
2773 break;
2774
2775 case WEAK_UNDECLARED_IDENTIFIERS:
2776 if (Record.size() % 4 != 0) {
2777 Error("invalid weak identifiers record");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002778 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002779 }
2780
2781 // FIXME: Ignore weak undeclared identifiers from non-original PCH
2782 // files. This isn't the way to do it :)
2783 WeakUndeclaredIdentifiers.clear();
2784
2785 // Translate the weak, undeclared identifiers into global IDs.
2786 for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) {
2787 WeakUndeclaredIdentifiers.push_back(
2788 getGlobalIdentifierID(F, Record[I++]));
2789 WeakUndeclaredIdentifiers.push_back(
2790 getGlobalIdentifierID(F, Record[I++]));
2791 WeakUndeclaredIdentifiers.push_back(
2792 ReadSourceLocation(F, Record, I).getRawEncoding());
2793 WeakUndeclaredIdentifiers.push_back(Record[I++]);
2794 }
2795 break;
2796
Richard Smith78165b52013-01-10 23:43:47 +00002797 case LOCALLY_SCOPED_EXTERN_C_DECLS:
Guy Benyei11169dd2012-12-18 14:30:41 +00002798 for (unsigned I = 0, N = Record.size(); I != N; ++I)
Richard Smith78165b52013-01-10 23:43:47 +00002799 LocallyScopedExternCDecls.push_back(getGlobalDeclID(F, Record[I]));
Guy Benyei11169dd2012-12-18 14:30:41 +00002800 break;
2801
2802 case SELECTOR_OFFSETS: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00002803 F.SelectorOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002804 F.LocalNumSelectors = Record[0];
2805 unsigned LocalBaseSelectorID = Record[1];
2806 F.BaseSelectorID = getTotalNumSelectors();
2807
2808 if (F.LocalNumSelectors > 0) {
2809 // Introduce the global -> local mapping for selectors within this
2810 // module.
2811 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F));
2812
2813 // Introduce the local -> global mapping for selectors within this
2814 // module.
2815 F.SelectorRemap.insertOrReplace(
2816 std::make_pair(LocalBaseSelectorID,
2817 F.BaseSelectorID - LocalBaseSelectorID));
Guy Benyei11169dd2012-12-18 14:30:41 +00002818 }
Ben Langmuirfe971d92014-08-16 04:54:18 +00002819 // Increase size by >= 1 so we get a unique base index in the next module.
2820 SelectorsLoaded.resize(SelectorsLoaded.size() +
2821 std::max(F.LocalNumSelectors, 1U));
Guy Benyei11169dd2012-12-18 14:30:41 +00002822 break;
2823 }
2824
2825 case METHOD_POOL:
Chris Lattner0e6c9402013-01-20 02:38:54 +00002826 F.SelectorLookupTableData = (const unsigned char *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002827 if (Record[0])
2828 F.SelectorLookupTable
2829 = ASTSelectorLookupTable::Create(
2830 F.SelectorLookupTableData + Record[0],
2831 F.SelectorLookupTableData,
2832 ASTSelectorLookupTrait(*this, F));
2833 TotalNumMethodPoolEntries += Record[1];
2834 break;
2835
2836 case REFERENCED_SELECTOR_POOL:
2837 if (!Record.empty()) {
2838 for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) {
2839 ReferencedSelectorsData.push_back(getGlobalSelectorID(F,
2840 Record[Idx++]));
2841 ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx).
2842 getRawEncoding());
2843 }
2844 }
2845 break;
2846
2847 case PP_COUNTER_VALUE:
2848 if (!Record.empty() && Listener)
2849 Listener->ReadCounter(F, Record[0]);
2850 break;
2851
2852 case FILE_SORTED_DECLS:
Chris Lattner0e6c9402013-01-20 02:38:54 +00002853 F.FileSortedDecls = (const DeclID *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002854 F.NumFileSortedDecls = Record[0];
2855 break;
2856
2857 case SOURCE_LOCATION_OFFSETS: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00002858 F.SLocEntryOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002859 F.LocalNumSLocEntries = Record[0];
2860 unsigned SLocSpaceSize = Record[1];
Ben Langmuirfe971d92014-08-16 04:54:18 +00002861
2862 // Increase size by >= 1 so we get a unique base index in the next module.
Benjamin Kramer867ea1d2014-03-02 13:01:17 +00002863 std::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) =
Ben Langmuirfe971d92014-08-16 04:54:18 +00002864 SourceMgr.AllocateLoadedSLocEntries(std::max(F.LocalNumSLocEntries, 1U),
Guy Benyei11169dd2012-12-18 14:30:41 +00002865 SLocSpaceSize);
2866 // Make our entry in the range map. BaseID is negative and growing, so
2867 // we invert it. Because we invert it, though, we need the other end of
2868 // the range.
2869 unsigned RangeStart =
2870 unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1;
2871 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F));
2872 F.FirstLoc = SourceLocation::getFromRawEncoding(F.SLocEntryBaseOffset);
2873
2874 // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing.
2875 assert((F.SLocEntryBaseOffset & (1U << 31U)) == 0);
2876 GlobalSLocOffsetMap.insert(
2877 std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset
2878 - SLocSpaceSize,&F));
2879
2880 // Initialize the remapping table.
2881 // Invalid stays invalid.
Richard Smithb9eab6d2014-03-20 19:44:17 +00002882 F.SLocRemap.insertOrReplace(std::make_pair(0U, 0));
Guy Benyei11169dd2012-12-18 14:30:41 +00002883 // This module. Base was 2 when being compiled.
Richard Smithb9eab6d2014-03-20 19:44:17 +00002884 F.SLocRemap.insertOrReplace(std::make_pair(2U,
Guy Benyei11169dd2012-12-18 14:30:41 +00002885 static_cast<int>(F.SLocEntryBaseOffset - 2)));
2886
2887 TotalNumSLocEntries += F.LocalNumSLocEntries;
2888 break;
2889 }
2890
2891 case MODULE_OFFSET_MAP: {
2892 // Additional remapping information.
Chris Lattner0e6c9402013-01-20 02:38:54 +00002893 const unsigned char *Data = (const unsigned char*)Blob.data();
2894 const unsigned char *DataEnd = Data + Blob.size();
Richard Smithb9eab6d2014-03-20 19:44:17 +00002895
2896 // If we see this entry before SOURCE_LOCATION_OFFSETS, add placeholders.
2897 if (F.SLocRemap.find(0) == F.SLocRemap.end()) {
2898 F.SLocRemap.insert(std::make_pair(0U, 0));
2899 F.SLocRemap.insert(std::make_pair(2U, 1));
2900 }
2901
Guy Benyei11169dd2012-12-18 14:30:41 +00002902 // Continuous range maps we may be updating in our module.
2903 ContinuousRangeMap<uint32_t, int, 2>::Builder SLocRemap(F.SLocRemap);
2904 ContinuousRangeMap<uint32_t, int, 2>::Builder
2905 IdentifierRemap(F.IdentifierRemap);
2906 ContinuousRangeMap<uint32_t, int, 2>::Builder
2907 MacroRemap(F.MacroRemap);
2908 ContinuousRangeMap<uint32_t, int, 2>::Builder
2909 PreprocessedEntityRemap(F.PreprocessedEntityRemap);
2910 ContinuousRangeMap<uint32_t, int, 2>::Builder
2911 SubmoduleRemap(F.SubmoduleRemap);
2912 ContinuousRangeMap<uint32_t, int, 2>::Builder
2913 SelectorRemap(F.SelectorRemap);
2914 ContinuousRangeMap<uint32_t, int, 2>::Builder DeclRemap(F.DeclRemap);
2915 ContinuousRangeMap<uint32_t, int, 2>::Builder TypeRemap(F.TypeRemap);
2916
2917 while(Data < DataEnd) {
Justin Bogner57ba0b22014-03-28 22:03:24 +00002918 using namespace llvm::support;
2919 uint16_t Len = endian::readNext<uint16_t, little, unaligned>(Data);
Guy Benyei11169dd2012-12-18 14:30:41 +00002920 StringRef Name = StringRef((const char*)Data, Len);
2921 Data += Len;
2922 ModuleFile *OM = ModuleMgr.lookup(Name);
2923 if (!OM) {
2924 Error("SourceLocation remap refers to unknown module");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002925 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002926 }
2927
Justin Bogner57ba0b22014-03-28 22:03:24 +00002928 uint32_t SLocOffset =
2929 endian::readNext<uint32_t, little, unaligned>(Data);
2930 uint32_t IdentifierIDOffset =
2931 endian::readNext<uint32_t, little, unaligned>(Data);
2932 uint32_t MacroIDOffset =
2933 endian::readNext<uint32_t, little, unaligned>(Data);
2934 uint32_t PreprocessedEntityIDOffset =
2935 endian::readNext<uint32_t, little, unaligned>(Data);
2936 uint32_t SubmoduleIDOffset =
2937 endian::readNext<uint32_t, little, unaligned>(Data);
2938 uint32_t SelectorIDOffset =
2939 endian::readNext<uint32_t, little, unaligned>(Data);
2940 uint32_t DeclIDOffset =
2941 endian::readNext<uint32_t, little, unaligned>(Data);
2942 uint32_t TypeIndexOffset =
2943 endian::readNext<uint32_t, little, unaligned>(Data);
2944
Guy Benyei11169dd2012-12-18 14:30:41 +00002945 // Source location offset is mapped to OM->SLocEntryBaseOffset.
2946 SLocRemap.insert(std::make_pair(SLocOffset,
2947 static_cast<int>(OM->SLocEntryBaseOffset - SLocOffset)));
2948 IdentifierRemap.insert(
2949 std::make_pair(IdentifierIDOffset,
2950 OM->BaseIdentifierID - IdentifierIDOffset));
2951 MacroRemap.insert(std::make_pair(MacroIDOffset,
2952 OM->BaseMacroID - MacroIDOffset));
2953 PreprocessedEntityRemap.insert(
2954 std::make_pair(PreprocessedEntityIDOffset,
2955 OM->BasePreprocessedEntityID - PreprocessedEntityIDOffset));
2956 SubmoduleRemap.insert(std::make_pair(SubmoduleIDOffset,
2957 OM->BaseSubmoduleID - SubmoduleIDOffset));
2958 SelectorRemap.insert(std::make_pair(SelectorIDOffset,
2959 OM->BaseSelectorID - SelectorIDOffset));
2960 DeclRemap.insert(std::make_pair(DeclIDOffset,
2961 OM->BaseDeclID - DeclIDOffset));
2962
2963 TypeRemap.insert(std::make_pair(TypeIndexOffset,
2964 OM->BaseTypeIndex - TypeIndexOffset));
2965
2966 // Global -> local mappings.
2967 F.GlobalToLocalDeclIDs[OM] = DeclIDOffset;
2968 }
2969 break;
2970 }
2971
2972 case SOURCE_MANAGER_LINE_TABLE:
2973 if (ParseLineTable(F, Record))
Ben Langmuir2c9af442014-04-10 17:57:43 +00002974 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002975 break;
2976
2977 case SOURCE_LOCATION_PRELOADS: {
2978 // Need to transform from the local view (1-based IDs) to the global view,
2979 // which is based off F.SLocEntryBaseID.
2980 if (!F.PreloadSLocEntries.empty()) {
2981 Error("Multiple SOURCE_LOCATION_PRELOADS records in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002982 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002983 }
2984
2985 F.PreloadSLocEntries.swap(Record);
2986 break;
2987 }
2988
2989 case EXT_VECTOR_DECLS:
2990 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2991 ExtVectorDecls.push_back(getGlobalDeclID(F, Record[I]));
2992 break;
2993
2994 case VTABLE_USES:
2995 if (Record.size() % 3 != 0) {
2996 Error("Invalid VTABLE_USES record");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002997 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002998 }
2999
3000 // Later tables overwrite earlier ones.
3001 // FIXME: Modules will have some trouble with this. This is clearly not
3002 // the right way to do this.
3003 VTableUses.clear();
3004
3005 for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) {
3006 VTableUses.push_back(getGlobalDeclID(F, Record[Idx++]));
3007 VTableUses.push_back(
3008 ReadSourceLocation(F, Record, Idx).getRawEncoding());
3009 VTableUses.push_back(Record[Idx++]);
3010 }
3011 break;
3012
3013 case DYNAMIC_CLASSES:
3014 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3015 DynamicClasses.push_back(getGlobalDeclID(F, Record[I]));
3016 break;
3017
3018 case PENDING_IMPLICIT_INSTANTIATIONS:
3019 if (PendingInstantiations.size() % 2 != 0) {
3020 Error("Invalid existing PendingInstantiations");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003021 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003022 }
3023
3024 if (Record.size() % 2 != 0) {
3025 Error("Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003026 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003027 }
3028
3029 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
3030 PendingInstantiations.push_back(getGlobalDeclID(F, Record[I++]));
3031 PendingInstantiations.push_back(
3032 ReadSourceLocation(F, Record, I).getRawEncoding());
3033 }
3034 break;
3035
3036 case SEMA_DECL_REFS:
Richard Smith3d8e97e2013-10-18 06:54:39 +00003037 if (Record.size() != 2) {
3038 Error("Invalid SEMA_DECL_REFS block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003039 return Failure;
Richard Smith3d8e97e2013-10-18 06:54:39 +00003040 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003041 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3042 SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
3043 break;
3044
3045 case PPD_ENTITIES_OFFSETS: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00003046 F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data();
3047 assert(Blob.size() % sizeof(PPEntityOffset) == 0);
3048 F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset);
Guy Benyei11169dd2012-12-18 14:30:41 +00003049
3050 unsigned LocalBasePreprocessedEntityID = Record[0];
3051
3052 unsigned StartingID;
3053 if (!PP.getPreprocessingRecord())
3054 PP.createPreprocessingRecord();
3055 if (!PP.getPreprocessingRecord()->getExternalSource())
3056 PP.getPreprocessingRecord()->SetExternalSource(*this);
Ben Langmuirfe971d92014-08-16 04:54:18 +00003057
3058 // Increase size by >= 1 so we get a unique base index in the next module.
Guy Benyei11169dd2012-12-18 14:30:41 +00003059 StartingID
3060 = PP.getPreprocessingRecord()
Ben Langmuirfe971d92014-08-16 04:54:18 +00003061 ->allocateLoadedEntities(std::max(F.NumPreprocessedEntities, 1U));
Guy Benyei11169dd2012-12-18 14:30:41 +00003062 F.BasePreprocessedEntityID = StartingID;
3063
3064 if (F.NumPreprocessedEntities > 0) {
3065 // Introduce the global -> local mapping for preprocessed entities in
3066 // this module.
3067 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
3068
3069 // Introduce the local -> global mapping for preprocessed entities in
3070 // this module.
3071 F.PreprocessedEntityRemap.insertOrReplace(
3072 std::make_pair(LocalBasePreprocessedEntityID,
3073 F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID));
3074 }
3075
3076 break;
3077 }
3078
3079 case DECL_UPDATE_OFFSETS: {
3080 if (Record.size() % 2 != 0) {
3081 Error("invalid DECL_UPDATE_OFFSETS block in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003082 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003083 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00003084 for (unsigned I = 0, N = Record.size(); I != N; I += 2) {
3085 GlobalDeclID ID = getGlobalDeclID(F, Record[I]);
3086 DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I + 1]));
3087
3088 // If we've already loaded the decl, perform the updates when we finish
3089 // loading this block.
3090 if (Decl *D = GetExistingDecl(ID))
3091 PendingUpdateRecords.push_back(std::make_pair(ID, D));
3092 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003093 break;
3094 }
3095
3096 case DECL_REPLACEMENTS: {
3097 if (Record.size() % 3 != 0) {
3098 Error("invalid DECL_REPLACEMENTS block in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003099 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003100 }
3101 for (unsigned I = 0, N = Record.size(); I != N; I += 3)
3102 ReplacedDecls[getGlobalDeclID(F, Record[I])]
3103 = ReplacedDeclInfo(&F, Record[I+1], Record[I+2]);
3104 break;
3105 }
3106
3107 case OBJC_CATEGORIES_MAP: {
3108 if (F.LocalNumObjCCategoriesInMap != 0) {
3109 Error("duplicate OBJC_CATEGORIES_MAP record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003110 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003111 }
3112
3113 F.LocalNumObjCCategoriesInMap = Record[0];
Chris Lattner0e6c9402013-01-20 02:38:54 +00003114 F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003115 break;
3116 }
3117
3118 case OBJC_CATEGORIES:
3119 F.ObjCCategories.swap(Record);
3120 break;
3121
3122 case CXX_BASE_SPECIFIER_OFFSETS: {
3123 if (F.LocalNumCXXBaseSpecifiers != 0) {
3124 Error("duplicate CXX_BASE_SPECIFIER_OFFSETS record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003125 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003126 }
3127
3128 F.LocalNumCXXBaseSpecifiers = Record[0];
Chris Lattner0e6c9402013-01-20 02:38:54 +00003129 F.CXXBaseSpecifiersOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003130 NumCXXBaseSpecifiersLoaded += F.LocalNumCXXBaseSpecifiers;
3131 break;
3132 }
3133
3134 case DIAG_PRAGMA_MAPPINGS:
3135 if (F.PragmaDiagMappings.empty())
3136 F.PragmaDiagMappings.swap(Record);
3137 else
3138 F.PragmaDiagMappings.insert(F.PragmaDiagMappings.end(),
3139 Record.begin(), Record.end());
3140 break;
3141
3142 case CUDA_SPECIAL_DECL_REFS:
3143 // Later tables overwrite earlier ones.
3144 // FIXME: Modules will have trouble with this.
3145 CUDASpecialDeclRefs.clear();
3146 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3147 CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
3148 break;
3149
3150 case HEADER_SEARCH_TABLE: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00003151 F.HeaderFileInfoTableData = Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003152 F.LocalNumHeaderFileInfos = Record[1];
Guy Benyei11169dd2012-12-18 14:30:41 +00003153 if (Record[0]) {
3154 F.HeaderFileInfoTable
3155 = HeaderFileInfoLookupTable::Create(
3156 (const unsigned char *)F.HeaderFileInfoTableData + Record[0],
3157 (const unsigned char *)F.HeaderFileInfoTableData,
3158 HeaderFileInfoTrait(*this, F,
3159 &PP.getHeaderSearchInfo(),
Chris Lattner0e6c9402013-01-20 02:38:54 +00003160 Blob.data() + Record[2]));
Guy Benyei11169dd2012-12-18 14:30:41 +00003161
3162 PP.getHeaderSearchInfo().SetExternalSource(this);
3163 if (!PP.getHeaderSearchInfo().getExternalLookup())
3164 PP.getHeaderSearchInfo().SetExternalLookup(this);
3165 }
3166 break;
3167 }
3168
3169 case FP_PRAGMA_OPTIONS:
3170 // Later tables overwrite earlier ones.
3171 FPPragmaOptions.swap(Record);
3172 break;
3173
3174 case OPENCL_EXTENSIONS:
3175 // Later tables overwrite earlier ones.
3176 OpenCLExtensions.swap(Record);
3177 break;
3178
3179 case TENTATIVE_DEFINITIONS:
3180 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3181 TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I]));
3182 break;
3183
3184 case KNOWN_NAMESPACES:
3185 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3186 KnownNamespaces.push_back(getGlobalDeclID(F, Record[I]));
3187 break;
Nick Lewycky8334af82013-01-26 00:35:08 +00003188
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00003189 case UNDEFINED_BUT_USED:
3190 if (UndefinedButUsed.size() % 2 != 0) {
3191 Error("Invalid existing UndefinedButUsed");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003192 return Failure;
Nick Lewycky8334af82013-01-26 00:35:08 +00003193 }
3194
3195 if (Record.size() % 2 != 0) {
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00003196 Error("invalid undefined-but-used record");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003197 return Failure;
Nick Lewycky8334af82013-01-26 00:35:08 +00003198 }
3199 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00003200 UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++]));
3201 UndefinedButUsed.push_back(
Nick Lewycky8334af82013-01-26 00:35:08 +00003202 ReadSourceLocation(F, Record, I).getRawEncoding());
3203 }
3204 break;
3205
Guy Benyei11169dd2012-12-18 14:30:41 +00003206 case IMPORTED_MODULES: {
3207 if (F.Kind != MK_Module) {
3208 // If we aren't loading a module (which has its own exports), make
3209 // all of the imported modules visible.
3210 // FIXME: Deal with macros-only imports.
Richard Smith56be7542014-03-21 00:33:59 +00003211 for (unsigned I = 0, N = Record.size(); I != N; /**/) {
3212 unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]);
3213 SourceLocation Loc = ReadSourceLocation(F, Record, I);
3214 if (GlobalID)
Aaron Ballman4f45b712014-03-21 15:22:56 +00003215 ImportedModules.push_back(ImportedSubmodule(GlobalID, Loc));
Guy Benyei11169dd2012-12-18 14:30:41 +00003216 }
3217 }
3218 break;
3219 }
3220
3221 case LOCAL_REDECLARATIONS: {
3222 F.RedeclarationChains.swap(Record);
3223 break;
3224 }
3225
3226 case LOCAL_REDECLARATIONS_MAP: {
3227 if (F.LocalNumRedeclarationsInMap != 0) {
3228 Error("duplicate LOCAL_REDECLARATIONS_MAP record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003229 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003230 }
3231
3232 F.LocalNumRedeclarationsInMap = Record[0];
Chris Lattner0e6c9402013-01-20 02:38:54 +00003233 F.RedeclarationsMap = (const LocalRedeclarationsInfo *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003234 break;
3235 }
3236
3237 case MERGED_DECLARATIONS: {
3238 for (unsigned Idx = 0; Idx < Record.size(); /* increment in loop */) {
3239 GlobalDeclID CanonID = getGlobalDeclID(F, Record[Idx++]);
3240 SmallVectorImpl<GlobalDeclID> &Decls = StoredMergedDecls[CanonID];
3241 for (unsigned N = Record[Idx++]; N > 0; --N)
3242 Decls.push_back(getGlobalDeclID(F, Record[Idx++]));
3243 }
3244 break;
3245 }
3246
3247 case MACRO_OFFSET: {
3248 if (F.LocalNumMacros != 0) {
3249 Error("duplicate MACRO_OFFSET record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003250 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003251 }
Chris Lattner0e6c9402013-01-20 02:38:54 +00003252 F.MacroOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003253 F.LocalNumMacros = Record[0];
3254 unsigned LocalBaseMacroID = Record[1];
3255 F.BaseMacroID = getTotalNumMacros();
3256
3257 if (F.LocalNumMacros > 0) {
3258 // Introduce the global -> local mapping for macros within this module.
3259 GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F));
3260
3261 // Introduce the local -> global mapping for macros within this module.
3262 F.MacroRemap.insertOrReplace(
3263 std::make_pair(LocalBaseMacroID,
3264 F.BaseMacroID - LocalBaseMacroID));
Guy Benyei11169dd2012-12-18 14:30:41 +00003265 }
Ben Langmuirfe971d92014-08-16 04:54:18 +00003266 // Increase size by >= 1 so we get a unique base index in the next module.
3267 MacrosLoaded.resize(MacrosLoaded.size() + std::max(F.LocalNumMacros, 1U));
Guy Benyei11169dd2012-12-18 14:30:41 +00003268 break;
3269 }
3270
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00003271 case MACRO_TABLE: {
3272 // FIXME: Not used yet.
Guy Benyei11169dd2012-12-18 14:30:41 +00003273 break;
3274 }
Richard Smithe40f2ba2013-08-07 21:41:30 +00003275
3276 case LATE_PARSED_TEMPLATE: {
3277 LateParsedTemplates.append(Record.begin(), Record.end());
3278 break;
3279 }
Dario Domizioli13a0a382014-05-23 12:13:25 +00003280
3281 case OPTIMIZE_PRAGMA_OPTIONS:
3282 if (Record.size() != 1) {
3283 Error("invalid pragma optimize record");
3284 return Failure;
3285 }
3286 OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]);
3287 break;
Nico Weber72889432014-09-06 01:25:55 +00003288
3289 case UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES:
3290 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3291 UnusedLocalTypedefNameCandidates.push_back(
3292 getGlobalDeclID(F, Record[I]));
3293 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00003294 }
3295 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003296}
3297
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003298ASTReader::ASTReadResult
3299ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F,
3300 const ModuleFile *ImportedBy,
3301 unsigned ClientLoadCapabilities) {
3302 unsigned Idx = 0;
3303 F.ModuleMapPath = ReadString(Record, Idx);
3304
3305 // Try to resolve ModuleName in the current header search context and
3306 // verify that it is found in the same module map file as we saved. If the
3307 // top-level AST file is a main file, skip this check because there is no
3308 // usable header search context.
3309 assert(!F.ModuleName.empty() &&
3310 "MODULE_NAME should come before MOUDLE_MAP_FILE");
3311 if (F.Kind == MK_Module && (*ModuleMgr.begin())->Kind != MK_MainFile) {
3312 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName);
3313 if (!M) {
3314 assert(ImportedBy && "top-level import should be verified");
3315 if ((ClientLoadCapabilities & ARR_Missing) == 0)
3316 Diag(diag::err_imported_module_not_found)
3317 << F.ModuleName << ImportedBy->FileName;
3318 return Missing;
3319 }
3320
3321 // Check the primary module map file.
3322 auto &Map = PP.getHeaderSearchInfo().getModuleMap();
3323 const FileEntry *StoredModMap = FileMgr.getFile(F.ModuleMapPath);
3324 const FileEntry *ModMap = Map.getModuleMapFileForUniquing(M);
3325 if (StoredModMap == nullptr || StoredModMap != ModMap) {
3326 assert(ModMap && "found module is missing module map file");
3327 assert(M->Name == F.ModuleName && "found module with different name");
3328 assert(ImportedBy && "top-level import should be verified");
3329 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3330 Diag(diag::err_imported_module_modmap_changed)
3331 << F.ModuleName << ImportedBy->FileName
3332 << ModMap->getName() << F.ModuleMapPath;
3333 return OutOfDate;
3334 }
3335
3336 llvm::SmallPtrSet<const FileEntry *, 1> AdditionalStoredMaps;
3337 for (unsigned I = 0, N = Record[Idx++]; I < N; ++I) {
3338 // FIXME: we should use input files rather than storing names.
3339 std::string Filename = ReadString(Record, Idx);
3340 const FileEntry *F =
3341 FileMgr.getFile(Filename, false, false);
3342 if (F == nullptr) {
3343 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3344 Error("could not find file '" + Filename +"' referenced by AST file");
3345 return OutOfDate;
3346 }
3347 AdditionalStoredMaps.insert(F);
3348 }
3349
3350 // Check any additional module map files (e.g. module.private.modulemap)
3351 // that are not in the pcm.
3352 if (auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) {
3353 for (const FileEntry *ModMap : *AdditionalModuleMaps) {
3354 // Remove files that match
3355 // Note: SmallPtrSet::erase is really remove
3356 if (!AdditionalStoredMaps.erase(ModMap)) {
3357 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3358 Diag(diag::err_module_different_modmap)
3359 << F.ModuleName << /*new*/0 << ModMap->getName();
3360 return OutOfDate;
3361 }
3362 }
3363 }
3364
3365 // Check any additional module map files that are in the pcm, but not
3366 // found in header search. Cases that match are already removed.
3367 for (const FileEntry *ModMap : AdditionalStoredMaps) {
3368 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3369 Diag(diag::err_module_different_modmap)
3370 << F.ModuleName << /*not new*/1 << ModMap->getName();
3371 return OutOfDate;
3372 }
3373 }
3374
3375 if (Listener)
3376 Listener->ReadModuleMapFile(F.ModuleMapPath);
3377 return Success;
3378}
3379
3380
Douglas Gregorc1489562013-02-12 23:36:21 +00003381/// \brief Move the given method to the back of the global list of methods.
3382static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) {
3383 // Find the entry for this selector in the method pool.
3384 Sema::GlobalMethodPool::iterator Known
3385 = S.MethodPool.find(Method->getSelector());
3386 if (Known == S.MethodPool.end())
3387 return;
3388
3389 // Retrieve the appropriate method list.
3390 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
3391 : Known->second.second;
3392 bool Found = false;
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00003393 for (ObjCMethodList *List = &Start; List; List = List->getNext()) {
Douglas Gregorc1489562013-02-12 23:36:21 +00003394 if (!Found) {
3395 if (List->Method == Method) {
3396 Found = true;
3397 } else {
3398 // Keep searching.
3399 continue;
3400 }
3401 }
3402
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00003403 if (List->getNext())
3404 List->Method = List->getNext()->Method;
Douglas Gregorc1489562013-02-12 23:36:21 +00003405 else
3406 List->Method = Method;
3407 }
3408}
3409
Richard Smithe657bbd2014-07-18 22:13:40 +00003410void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner,
3411 bool FromFinalization) {
3412 // FIXME: Only do this if Owner->NameVisibility == AllVisible.
Richard Smith57721ac2014-07-21 04:10:40 +00003413 for (Decl *D : Names.HiddenDecls) {
Richard Smith49f906a2014-03-01 00:08:04 +00003414 bool wasHidden = D->Hidden;
3415 D->Hidden = false;
Guy Benyei11169dd2012-12-18 14:30:41 +00003416
Richard Smith49f906a2014-03-01 00:08:04 +00003417 if (wasHidden && SemaObj) {
3418 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) {
3419 moveMethodToBackOfGlobalList(*SemaObj, Method);
Douglas Gregorc1489562013-02-12 23:36:21 +00003420 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003421 }
3422 }
Richard Smith49f906a2014-03-01 00:08:04 +00003423
Richard Smithe657bbd2014-07-18 22:13:40 +00003424 assert((FromFinalization || Owner->NameVisibility >= Module::MacrosVisible) &&
3425 "nothing to make visible?");
Richard Smithdaa69e02014-07-25 04:40:03 +00003426 for (const auto &Macro : Names.HiddenMacros) {
3427 if (FromFinalization)
3428 PP.appendMacroDirective(Macro.first,
3429 Macro.second->import(PP, SourceLocation()));
3430 else
3431 installImportedMacro(Macro.first, Macro.second, Owner);
3432 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003433}
3434
Richard Smith49f906a2014-03-01 00:08:04 +00003435void ASTReader::makeModuleVisible(Module *Mod,
Argyrios Kyrtzidis125df052013-02-01 16:36:12 +00003436 Module::NameVisibilityKind NameVisibility,
Douglas Gregorfb912652013-03-20 21:10:35 +00003437 SourceLocation ImportLoc,
3438 bool Complain) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003439 llvm::SmallPtrSet<Module *, 4> Visited;
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003440 SmallVector<Module *, 4> Stack;
Robert Wilhelm25284cc2013-08-23 16:11:15 +00003441 Stack.push_back(Mod);
Guy Benyei11169dd2012-12-18 14:30:41 +00003442 while (!Stack.empty()) {
Robert Wilhelm25284cc2013-08-23 16:11:15 +00003443 Mod = Stack.pop_back_val();
Guy Benyei11169dd2012-12-18 14:30:41 +00003444
3445 if (NameVisibility <= Mod->NameVisibility) {
Robert Wilhelm25284cc2013-08-23 16:11:15 +00003446 // This module already has this level of visibility (or greater), so
Guy Benyei11169dd2012-12-18 14:30:41 +00003447 // there is nothing more to do.
3448 continue;
3449 }
Richard Smith49f906a2014-03-01 00:08:04 +00003450
Guy Benyei11169dd2012-12-18 14:30:41 +00003451 if (!Mod->isAvailable()) {
3452 // Modules that aren't available cannot be made visible.
3453 continue;
3454 }
3455
3456 // Update the module's name visibility.
Richard Smith49f906a2014-03-01 00:08:04 +00003457 if (NameVisibility >= Module::MacrosVisible &&
3458 Mod->NameVisibility < Module::MacrosVisible)
3459 Mod->MacroVisibilityLoc = ImportLoc;
Guy Benyei11169dd2012-12-18 14:30:41 +00003460 Mod->NameVisibility = NameVisibility;
Richard Smith49f906a2014-03-01 00:08:04 +00003461
Guy Benyei11169dd2012-12-18 14:30:41 +00003462 // If we've already deserialized any names from this module,
3463 // mark them as visible.
3464 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
3465 if (Hidden != HiddenNamesMap.end()) {
Richard Smith57721ac2014-07-21 04:10:40 +00003466 auto HiddenNames = std::move(*Hidden);
Guy Benyei11169dd2012-12-18 14:30:41 +00003467 HiddenNamesMap.erase(Hidden);
Richard Smith57721ac2014-07-21 04:10:40 +00003468 makeNamesVisible(HiddenNames.second, HiddenNames.first,
3469 /*FromFinalization*/false);
3470 assert(HiddenNamesMap.find(Mod) == HiddenNamesMap.end() &&
3471 "making names visible added hidden names");
Guy Benyei11169dd2012-12-18 14:30:41 +00003472 }
Dmitri Gribenkoe9bcf5b2013-11-04 21:51:33 +00003473
Guy Benyei11169dd2012-12-18 14:30:41 +00003474 // Push any exported modules onto the stack to be marked as visible.
Argyrios Kyrtzidis8739f7b2013-02-19 19:34:40 +00003475 SmallVector<Module *, 16> Exports;
3476 Mod->getExportedModules(Exports);
3477 for (SmallVectorImpl<Module *>::iterator
3478 I = Exports.begin(), E = Exports.end(); I != E; ++I) {
3479 Module *Exported = *I;
3480 if (Visited.insert(Exported))
3481 Stack.push_back(Exported);
Guy Benyei11169dd2012-12-18 14:30:41 +00003482 }
Douglas Gregorfb912652013-03-20 21:10:35 +00003483
3484 // Detect any conflicts.
3485 if (Complain) {
3486 assert(ImportLoc.isValid() && "Missing import location");
3487 for (unsigned I = 0, N = Mod->Conflicts.size(); I != N; ++I) {
3488 if (Mod->Conflicts[I].Other->NameVisibility >= NameVisibility) {
3489 Diag(ImportLoc, diag::warn_module_conflict)
3490 << Mod->getFullModuleName()
3491 << Mod->Conflicts[I].Other->getFullModuleName()
3492 << Mod->Conflicts[I].Message;
3493 // FIXME: Need note where the other module was imported.
3494 }
3495 }
3496 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003497 }
3498}
3499
Douglas Gregore060e572013-01-25 01:03:03 +00003500bool ASTReader::loadGlobalIndex() {
3501 if (GlobalIndex)
3502 return false;
3503
3504 if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
3505 !Context.getLangOpts().Modules)
3506 return true;
3507
3508 // Try to load the global index.
3509 TriedLoadingGlobalIndex = true;
3510 StringRef ModuleCachePath
3511 = getPreprocessor().getHeaderSearchInfo().getModuleCachePath();
3512 std::pair<GlobalModuleIndex *, GlobalModuleIndex::ErrorCode> Result
Douglas Gregor7029ce12013-03-19 00:28:20 +00003513 = GlobalModuleIndex::readIndex(ModuleCachePath);
Douglas Gregore060e572013-01-25 01:03:03 +00003514 if (!Result.first)
3515 return true;
3516
3517 GlobalIndex.reset(Result.first);
Douglas Gregor7211ac12013-01-25 23:32:03 +00003518 ModuleMgr.setGlobalIndex(GlobalIndex.get());
Douglas Gregore060e572013-01-25 01:03:03 +00003519 return false;
3520}
3521
3522bool ASTReader::isGlobalIndexUnavailable() const {
3523 return Context.getLangOpts().Modules && UseGlobalIndex &&
3524 !hasGlobalIndex() && TriedLoadingGlobalIndex;
3525}
3526
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003527static void updateModuleTimestamp(ModuleFile &MF) {
3528 // Overwrite the timestamp file contents so that file's mtime changes.
3529 std::string TimestampFilename = MF.getTimestampFilename();
Rafael Espindoladae941a2014-08-25 18:17:04 +00003530 std::error_code EC;
3531 llvm::raw_fd_ostream OS(TimestampFilename, EC, llvm::sys::fs::F_Text);
3532 if (EC)
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003533 return;
3534 OS << "Timestamp file\n";
3535}
3536
Guy Benyei11169dd2012-12-18 14:30:41 +00003537ASTReader::ASTReadResult ASTReader::ReadAST(const std::string &FileName,
3538 ModuleKind Type,
3539 SourceLocation ImportLoc,
3540 unsigned ClientLoadCapabilities) {
Argyrios Kyrtzidisdc9fdaf2013-05-24 05:44:08 +00003541 llvm::SaveAndRestore<SourceLocation>
3542 SetCurImportLocRAII(CurrentImportLoc, ImportLoc);
3543
Richard Smithd1c46742014-04-30 02:24:17 +00003544 // Defer any pending actions until we get to the end of reading the AST file.
3545 Deserializing AnASTFile(this);
3546
Guy Benyei11169dd2012-12-18 14:30:41 +00003547 // Bump the generation number.
Richard Smith053f6c62014-05-16 23:01:30 +00003548 unsigned PreviousGeneration = incrementGeneration(Context);
Guy Benyei11169dd2012-12-18 14:30:41 +00003549
3550 unsigned NumModules = ModuleMgr.size();
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003551 SmallVector<ImportedModule, 4> Loaded;
Guy Benyei11169dd2012-12-18 14:30:41 +00003552 switch(ASTReadResult ReadResult = ReadASTCore(FileName, Type, ImportLoc,
Craig Toppera13603a2014-05-22 05:54:18 +00003553 /*ImportedBy=*/nullptr, Loaded,
Douglas Gregor7029ce12013-03-19 00:28:20 +00003554 0, 0,
Guy Benyei11169dd2012-12-18 14:30:41 +00003555 ClientLoadCapabilities)) {
3556 case Failure:
Douglas Gregor7029ce12013-03-19 00:28:20 +00003557 case Missing:
Guy Benyei11169dd2012-12-18 14:30:41 +00003558 case OutOfDate:
3559 case VersionMismatch:
3560 case ConfigurationMismatch:
Ben Langmuir9801b252014-06-20 00:24:56 +00003561 case HadErrors: {
3562 llvm::SmallPtrSet<ModuleFile *, 4> LoadedSet;
3563 for (const ImportedModule &IM : Loaded)
3564 LoadedSet.insert(IM.Mod);
3565
Douglas Gregor7029ce12013-03-19 00:28:20 +00003566 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, ModuleMgr.end(),
Ben Langmuir9801b252014-06-20 00:24:56 +00003567 LoadedSet,
Douglas Gregor7029ce12013-03-19 00:28:20 +00003568 Context.getLangOpts().Modules
3569 ? &PP.getHeaderSearchInfo().getModuleMap()
Craig Toppera13603a2014-05-22 05:54:18 +00003570 : nullptr);
Douglas Gregore060e572013-01-25 01:03:03 +00003571
3572 // If we find that any modules are unusable, the global index is going
3573 // to be out-of-date. Just remove it.
3574 GlobalIndex.reset();
Craig Toppera13603a2014-05-22 05:54:18 +00003575 ModuleMgr.setGlobalIndex(nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00003576 return ReadResult;
Ben Langmuir9801b252014-06-20 00:24:56 +00003577 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003578 case Success:
3579 break;
3580 }
3581
3582 // Here comes stuff that we only do once the entire chain is loaded.
3583
3584 // Load the AST blocks of all of the modules that we loaded.
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003585 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
3586 MEnd = Loaded.end();
Guy Benyei11169dd2012-12-18 14:30:41 +00003587 M != MEnd; ++M) {
3588 ModuleFile &F = *M->Mod;
3589
3590 // Read the AST block.
Ben Langmuir2c9af442014-04-10 17:57:43 +00003591 if (ASTReadResult Result = ReadASTBlock(F, ClientLoadCapabilities))
3592 return Result;
Guy Benyei11169dd2012-12-18 14:30:41 +00003593
3594 // Once read, set the ModuleFile bit base offset and update the size in
3595 // bits of all files we've seen.
3596 F.GlobalBitOffset = TotalModulesSizeInBits;
3597 TotalModulesSizeInBits += F.SizeInBits;
3598 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F));
3599
3600 // Preload SLocEntries.
3601 for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) {
3602 int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID;
3603 // Load it through the SourceManager and don't call ReadSLocEntry()
3604 // directly because the entry may have already been loaded in which case
3605 // calling ReadSLocEntry() directly would trigger an assertion in
3606 // SourceManager.
3607 SourceMgr.getLoadedSLocEntryByID(Index);
3608 }
3609 }
3610
Douglas Gregor603cd862013-03-22 18:50:14 +00003611 // Setup the import locations and notify the module manager that we've
3612 // committed to these module files.
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003613 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
3614 MEnd = Loaded.end();
Guy Benyei11169dd2012-12-18 14:30:41 +00003615 M != MEnd; ++M) {
3616 ModuleFile &F = *M->Mod;
Douglas Gregor603cd862013-03-22 18:50:14 +00003617
3618 ModuleMgr.moduleFileAccepted(&F);
3619
3620 // Set the import location.
Argyrios Kyrtzidis71c1af82013-02-01 16:36:14 +00003621 F.DirectImportLoc = ImportLoc;
Guy Benyei11169dd2012-12-18 14:30:41 +00003622 if (!M->ImportedBy)
3623 F.ImportLoc = M->ImportLoc;
3624 else
3625 F.ImportLoc = ReadSourceLocation(*M->ImportedBy,
3626 M->ImportLoc.getRawEncoding());
3627 }
3628
3629 // Mark all of the identifiers in the identifier table as being out of date,
3630 // so that various accessors know to check the loaded modules when the
3631 // identifier is used.
3632 for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(),
3633 IdEnd = PP.getIdentifierTable().end();
3634 Id != IdEnd; ++Id)
3635 Id->second->setOutOfDate(true);
3636
3637 // Resolve any unresolved module exports.
Douglas Gregorfb912652013-03-20 21:10:35 +00003638 for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) {
3639 UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I];
Guy Benyei11169dd2012-12-18 14:30:41 +00003640 SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID);
3641 Module *ResolvedMod = getSubmodule(GlobalID);
Douglas Gregorfb912652013-03-20 21:10:35 +00003642
3643 switch (Unresolved.Kind) {
3644 case UnresolvedModuleRef::Conflict:
3645 if (ResolvedMod) {
3646 Module::Conflict Conflict;
3647 Conflict.Other = ResolvedMod;
3648 Conflict.Message = Unresolved.String.str();
3649 Unresolved.Mod->Conflicts.push_back(Conflict);
3650 }
3651 continue;
3652
3653 case UnresolvedModuleRef::Import:
Guy Benyei11169dd2012-12-18 14:30:41 +00003654 if (ResolvedMod)
3655 Unresolved.Mod->Imports.push_back(ResolvedMod);
3656 continue;
Guy Benyei11169dd2012-12-18 14:30:41 +00003657
Douglas Gregorfb912652013-03-20 21:10:35 +00003658 case UnresolvedModuleRef::Export:
3659 if (ResolvedMod || Unresolved.IsWildcard)
3660 Unresolved.Mod->Exports.push_back(
3661 Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard));
3662 continue;
3663 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003664 }
Douglas Gregorfb912652013-03-20 21:10:35 +00003665 UnresolvedModuleRefs.clear();
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003666
3667 // FIXME: How do we load the 'use'd modules? They may not be submodules.
3668 // Might be unnecessary as use declarations are only used to build the
3669 // module itself.
Guy Benyei11169dd2012-12-18 14:30:41 +00003670
3671 InitializeContext();
3672
Richard Smith3d8e97e2013-10-18 06:54:39 +00003673 if (SemaObj)
3674 UpdateSema();
3675
Guy Benyei11169dd2012-12-18 14:30:41 +00003676 if (DeserializationListener)
3677 DeserializationListener->ReaderInitialized(this);
3678
3679 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
3680 if (!PrimaryModule.OriginalSourceFileID.isInvalid()) {
3681 PrimaryModule.OriginalSourceFileID
3682 = FileID::get(PrimaryModule.SLocEntryBaseID
3683 + PrimaryModule.OriginalSourceFileID.getOpaqueValue() - 1);
3684
3685 // If this AST file is a precompiled preamble, then set the
3686 // preamble file ID of the source manager to the file source file
3687 // from which the preamble was built.
3688 if (Type == MK_Preamble) {
3689 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID);
3690 } else if (Type == MK_MainFile) {
3691 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID);
3692 }
3693 }
3694
3695 // For any Objective-C class definitions we have already loaded, make sure
3696 // that we load any additional categories.
3697 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
3698 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
3699 ObjCClassesLoaded[I],
3700 PreviousGeneration);
3701 }
Douglas Gregore060e572013-01-25 01:03:03 +00003702
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003703 if (PP.getHeaderSearchInfo()
3704 .getHeaderSearchOpts()
3705 .ModulesValidateOncePerBuildSession) {
3706 // Now we are certain that the module and all modules it depends on are
3707 // up to date. Create or update timestamp files for modules that are
3708 // located in the module cache (not for PCH files that could be anywhere
3709 // in the filesystem).
3710 for (unsigned I = 0, N = Loaded.size(); I != N; ++I) {
3711 ImportedModule &M = Loaded[I];
3712 if (M.Mod->Kind == MK_Module) {
3713 updateModuleTimestamp(*M.Mod);
3714 }
3715 }
3716 }
3717
Guy Benyei11169dd2012-12-18 14:30:41 +00003718 return Success;
3719}
3720
3721ASTReader::ASTReadResult
3722ASTReader::ReadASTCore(StringRef FileName,
3723 ModuleKind Type,
3724 SourceLocation ImportLoc,
3725 ModuleFile *ImportedBy,
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003726 SmallVectorImpl<ImportedModule> &Loaded,
Douglas Gregor7029ce12013-03-19 00:28:20 +00003727 off_t ExpectedSize, time_t ExpectedModTime,
Guy Benyei11169dd2012-12-18 14:30:41 +00003728 unsigned ClientLoadCapabilities) {
3729 ModuleFile *M;
Guy Benyei11169dd2012-12-18 14:30:41 +00003730 std::string ErrorStr;
Douglas Gregor7029ce12013-03-19 00:28:20 +00003731 ModuleManager::AddModuleResult AddResult
3732 = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy,
Richard Smith053f6c62014-05-16 23:01:30 +00003733 getGeneration(), ExpectedSize, ExpectedModTime,
Douglas Gregor7029ce12013-03-19 00:28:20 +00003734 M, ErrorStr);
Guy Benyei11169dd2012-12-18 14:30:41 +00003735
Douglas Gregor7029ce12013-03-19 00:28:20 +00003736 switch (AddResult) {
3737 case ModuleManager::AlreadyLoaded:
3738 return Success;
3739
3740 case ModuleManager::NewlyLoaded:
3741 // Load module file below.
3742 break;
3743
3744 case ModuleManager::Missing:
3745 // The module file was missing; if the client handle handle, that, return
3746 // it.
3747 if (ClientLoadCapabilities & ARR_Missing)
3748 return Missing;
3749
3750 // Otherwise, return an error.
3751 {
3752 std::string Msg = "Unable to load module \"" + FileName.str() + "\": "
3753 + ErrorStr;
3754 Error(Msg);
3755 }
3756 return Failure;
3757
3758 case ModuleManager::OutOfDate:
3759 // We couldn't load the module file because it is out-of-date. If the
3760 // client can handle out-of-date, return it.
3761 if (ClientLoadCapabilities & ARR_OutOfDate)
3762 return OutOfDate;
3763
3764 // Otherwise, return an error.
3765 {
3766 std::string Msg = "Unable to load module \"" + FileName.str() + "\": "
3767 + ErrorStr;
3768 Error(Msg);
3769 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003770 return Failure;
3771 }
3772
Douglas Gregor7029ce12013-03-19 00:28:20 +00003773 assert(M && "Missing module file");
Guy Benyei11169dd2012-12-18 14:30:41 +00003774
3775 // FIXME: This seems rather a hack. Should CurrentDir be part of the
3776 // module?
3777 if (FileName != "-") {
3778 CurrentDir = llvm::sys::path::parent_path(FileName);
3779 if (CurrentDir.empty()) CurrentDir = ".";
3780 }
3781
3782 ModuleFile &F = *M;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00003783 BitstreamCursor &Stream = F.Stream;
Guy Benyei11169dd2012-12-18 14:30:41 +00003784 Stream.init(F.StreamFile);
3785 F.SizeInBits = F.Buffer->getBufferSize() * 8;
3786
3787 // Sniff for the signature.
3788 if (Stream.Read(8) != 'C' ||
3789 Stream.Read(8) != 'P' ||
3790 Stream.Read(8) != 'C' ||
3791 Stream.Read(8) != 'H') {
3792 Diag(diag::err_not_a_pch_file) << FileName;
3793 return Failure;
3794 }
3795
3796 // This is used for compatibility with older PCH formats.
3797 bool HaveReadControlBlock = false;
3798
Chris Lattnerefa77172013-01-20 00:00:22 +00003799 while (1) {
3800 llvm::BitstreamEntry Entry = Stream.advance();
3801
3802 switch (Entry.Kind) {
3803 case llvm::BitstreamEntry::Error:
3804 case llvm::BitstreamEntry::EndBlock:
3805 case llvm::BitstreamEntry::Record:
Guy Benyei11169dd2012-12-18 14:30:41 +00003806 Error("invalid record at top-level of AST file");
3807 return Failure;
Chris Lattnerefa77172013-01-20 00:00:22 +00003808
3809 case llvm::BitstreamEntry::SubBlock:
3810 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00003811 }
3812
Guy Benyei11169dd2012-12-18 14:30:41 +00003813 // We only know the control subblock ID.
Chris Lattnerefa77172013-01-20 00:00:22 +00003814 switch (Entry.ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003815 case llvm::bitc::BLOCKINFO_BLOCK_ID:
3816 if (Stream.ReadBlockInfoBlock()) {
3817 Error("malformed BlockInfoBlock in AST file");
3818 return Failure;
3819 }
3820 break;
3821 case CONTROL_BLOCK_ID:
3822 HaveReadControlBlock = true;
Ben Langmuirbeee15e2014-04-14 18:00:01 +00003823 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003824 case Success:
3825 break;
3826
3827 case Failure: return Failure;
Douglas Gregor7029ce12013-03-19 00:28:20 +00003828 case Missing: return Missing;
Guy Benyei11169dd2012-12-18 14:30:41 +00003829 case OutOfDate: return OutOfDate;
3830 case VersionMismatch: return VersionMismatch;
3831 case ConfigurationMismatch: return ConfigurationMismatch;
3832 case HadErrors: return HadErrors;
3833 }
3834 break;
3835 case AST_BLOCK_ID:
3836 if (!HaveReadControlBlock) {
3837 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
Dmitri Gribenko2228cd32014-02-11 15:40:09 +00003838 Diag(diag::err_pch_version_too_old);
Guy Benyei11169dd2012-12-18 14:30:41 +00003839 return VersionMismatch;
3840 }
3841
3842 // Record that we've loaded this module.
3843 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc));
3844 return Success;
3845
3846 default:
3847 if (Stream.SkipBlock()) {
3848 Error("malformed block record in AST file");
3849 return Failure;
3850 }
3851 break;
3852 }
3853 }
3854
3855 return Success;
3856}
3857
3858void ASTReader::InitializeContext() {
3859 // If there's a listener, notify them that we "read" the translation unit.
3860 if (DeserializationListener)
3861 DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID,
3862 Context.getTranslationUnitDecl());
3863
Guy Benyei11169dd2012-12-18 14:30:41 +00003864 // FIXME: Find a better way to deal with collisions between these
3865 // built-in types. Right now, we just ignore the problem.
3866
3867 // Load the special types.
3868 if (SpecialTypes.size() >= NumSpecialTypeIDs) {
3869 if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) {
3870 if (!Context.CFConstantStringTypeDecl)
3871 Context.setCFConstantStringType(GetType(String));
3872 }
3873
3874 if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) {
3875 QualType FileType = GetType(File);
3876 if (FileType.isNull()) {
3877 Error("FILE type is NULL");
3878 return;
3879 }
3880
3881 if (!Context.FILEDecl) {
3882 if (const TypedefType *Typedef = FileType->getAs<TypedefType>())
3883 Context.setFILEDecl(Typedef->getDecl());
3884 else {
3885 const TagType *Tag = FileType->getAs<TagType>();
3886 if (!Tag) {
3887 Error("Invalid FILE type in AST file");
3888 return;
3889 }
3890 Context.setFILEDecl(Tag->getDecl());
3891 }
3892 }
3893 }
3894
3895 if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) {
3896 QualType Jmp_bufType = GetType(Jmp_buf);
3897 if (Jmp_bufType.isNull()) {
3898 Error("jmp_buf type is NULL");
3899 return;
3900 }
3901
3902 if (!Context.jmp_bufDecl) {
3903 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>())
3904 Context.setjmp_bufDecl(Typedef->getDecl());
3905 else {
3906 const TagType *Tag = Jmp_bufType->getAs<TagType>();
3907 if (!Tag) {
3908 Error("Invalid jmp_buf type in AST file");
3909 return;
3910 }
3911 Context.setjmp_bufDecl(Tag->getDecl());
3912 }
3913 }
3914 }
3915
3916 if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) {
3917 QualType Sigjmp_bufType = GetType(Sigjmp_buf);
3918 if (Sigjmp_bufType.isNull()) {
3919 Error("sigjmp_buf type is NULL");
3920 return;
3921 }
3922
3923 if (!Context.sigjmp_bufDecl) {
3924 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>())
3925 Context.setsigjmp_bufDecl(Typedef->getDecl());
3926 else {
3927 const TagType *Tag = Sigjmp_bufType->getAs<TagType>();
3928 assert(Tag && "Invalid sigjmp_buf type in AST file");
3929 Context.setsigjmp_bufDecl(Tag->getDecl());
3930 }
3931 }
3932 }
3933
3934 if (unsigned ObjCIdRedef
3935 = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) {
3936 if (Context.ObjCIdRedefinitionType.isNull())
3937 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef);
3938 }
3939
3940 if (unsigned ObjCClassRedef
3941 = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) {
3942 if (Context.ObjCClassRedefinitionType.isNull())
3943 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef);
3944 }
3945
3946 if (unsigned ObjCSelRedef
3947 = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) {
3948 if (Context.ObjCSelRedefinitionType.isNull())
3949 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef);
3950 }
3951
3952 if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) {
3953 QualType Ucontext_tType = GetType(Ucontext_t);
3954 if (Ucontext_tType.isNull()) {
3955 Error("ucontext_t type is NULL");
3956 return;
3957 }
3958
3959 if (!Context.ucontext_tDecl) {
3960 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>())
3961 Context.setucontext_tDecl(Typedef->getDecl());
3962 else {
3963 const TagType *Tag = Ucontext_tType->getAs<TagType>();
3964 assert(Tag && "Invalid ucontext_t type in AST file");
3965 Context.setucontext_tDecl(Tag->getDecl());
3966 }
3967 }
3968 }
3969 }
3970
3971 ReadPragmaDiagnosticMappings(Context.getDiagnostics());
3972
3973 // If there were any CUDA special declarations, deserialize them.
3974 if (!CUDASpecialDeclRefs.empty()) {
3975 assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!");
3976 Context.setcudaConfigureCallDecl(
3977 cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0])));
3978 }
Richard Smith56be7542014-03-21 00:33:59 +00003979
Guy Benyei11169dd2012-12-18 14:30:41 +00003980 // Re-export any modules that were imported by a non-module AST file.
Richard Smith56be7542014-03-21 00:33:59 +00003981 // FIXME: This does not make macro-only imports visible again. It also doesn't
3982 // make #includes mapped to module imports visible.
3983 for (auto &Import : ImportedModules) {
3984 if (Module *Imported = getSubmodule(Import.ID))
Argyrios Kyrtzidis125df052013-02-01 16:36:12 +00003985 makeModuleVisible(Imported, Module::AllVisible,
Richard Smith56be7542014-03-21 00:33:59 +00003986 /*ImportLoc=*/Import.ImportLoc,
Douglas Gregorfb912652013-03-20 21:10:35 +00003987 /*Complain=*/false);
Guy Benyei11169dd2012-12-18 14:30:41 +00003988 }
3989 ImportedModules.clear();
3990}
3991
3992void ASTReader::finalizeForWriting() {
Richard Smith57721ac2014-07-21 04:10:40 +00003993 while (!HiddenNamesMap.empty()) {
3994 auto HiddenNames = std::move(*HiddenNamesMap.begin());
3995 HiddenNamesMap.erase(HiddenNamesMap.begin());
3996 makeNamesVisible(HiddenNames.second, HiddenNames.first,
3997 /*FromFinalization*/true);
Guy Benyei11169dd2012-12-18 14:30:41 +00003998 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003999}
4000
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004001/// \brief Given a cursor at the start of an AST file, scan ahead and drop the
4002/// cursor into the start of the given block ID, returning false on success and
4003/// true on failure.
4004static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004005 while (1) {
4006 llvm::BitstreamEntry Entry = Cursor.advance();
4007 switch (Entry.Kind) {
4008 case llvm::BitstreamEntry::Error:
4009 case llvm::BitstreamEntry::EndBlock:
4010 return true;
4011
4012 case llvm::BitstreamEntry::Record:
4013 // Ignore top-level records.
4014 Cursor.skipRecord(Entry.ID);
4015 break;
4016
4017 case llvm::BitstreamEntry::SubBlock:
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004018 if (Entry.ID == BlockID) {
4019 if (Cursor.EnterSubBlock(BlockID))
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004020 return true;
4021 // Found it!
4022 return false;
4023 }
4024
4025 if (Cursor.SkipBlock())
4026 return true;
4027 }
4028 }
4029}
4030
Guy Benyei11169dd2012-12-18 14:30:41 +00004031/// \brief Retrieve the name of the original source file name
4032/// directly from the AST file, without actually loading the AST
4033/// file.
4034std::string ASTReader::getOriginalSourceFile(const std::string &ASTFileName,
4035 FileManager &FileMgr,
4036 DiagnosticsEngine &Diags) {
4037 // Open the AST file.
4038 std::string ErrStr;
Rafael Espindola6406f7b2014-08-26 19:54:40 +00004039 std::unique_ptr<llvm::MemoryBuffer> Buffer =
4040 FileMgr.getBufferForFile(ASTFileName, &ErrStr);
Guy Benyei11169dd2012-12-18 14:30:41 +00004041 if (!Buffer) {
4042 Diags.Report(diag::err_fe_unable_to_read_pch_file) << ASTFileName << ErrStr;
4043 return std::string();
4044 }
4045
4046 // Initialize the stream
4047 llvm::BitstreamReader StreamFile;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004048 BitstreamCursor Stream;
Guy Benyei11169dd2012-12-18 14:30:41 +00004049 StreamFile.init((const unsigned char *)Buffer->getBufferStart(),
4050 (const unsigned char *)Buffer->getBufferEnd());
4051 Stream.init(StreamFile);
4052
4053 // Sniff for the signature.
4054 if (Stream.Read(8) != 'C' ||
4055 Stream.Read(8) != 'P' ||
4056 Stream.Read(8) != 'C' ||
4057 Stream.Read(8) != 'H') {
4058 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName;
4059 return std::string();
4060 }
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004061
Chris Lattnere7b154b2013-01-19 21:39:22 +00004062 // Scan for the CONTROL_BLOCK_ID block.
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004063 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004064 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
4065 return std::string();
Chris Lattnere7b154b2013-01-19 21:39:22 +00004066 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004067
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004068 // Scan for ORIGINAL_FILE inside the control block.
4069 RecordData Record;
Chris Lattnere7b154b2013-01-19 21:39:22 +00004070 while (1) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004071 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
Chris Lattnere7b154b2013-01-19 21:39:22 +00004072 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
4073 return std::string();
4074
4075 if (Entry.Kind != llvm::BitstreamEntry::Record) {
4076 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
4077 return std::string();
Guy Benyei11169dd2012-12-18 14:30:41 +00004078 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00004079
Guy Benyei11169dd2012-12-18 14:30:41 +00004080 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00004081 StringRef Blob;
4082 if (Stream.readRecord(Entry.ID, Record, &Blob) == ORIGINAL_FILE)
4083 return Blob.str();
Guy Benyei11169dd2012-12-18 14:30:41 +00004084 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004085}
4086
4087namespace {
4088 class SimplePCHValidator : public ASTReaderListener {
4089 const LangOptions &ExistingLangOpts;
4090 const TargetOptions &ExistingTargetOpts;
4091 const PreprocessorOptions &ExistingPPOpts;
4092 FileManager &FileMgr;
4093
4094 public:
4095 SimplePCHValidator(const LangOptions &ExistingLangOpts,
4096 const TargetOptions &ExistingTargetOpts,
4097 const PreprocessorOptions &ExistingPPOpts,
4098 FileManager &FileMgr)
4099 : ExistingLangOpts(ExistingLangOpts),
4100 ExistingTargetOpts(ExistingTargetOpts),
4101 ExistingPPOpts(ExistingPPOpts),
4102 FileMgr(FileMgr)
4103 {
4104 }
4105
Craig Topper3e89dfe2014-03-13 02:13:41 +00004106 bool ReadLanguageOptions(const LangOptions &LangOpts,
4107 bool Complain) override {
Craig Toppera13603a2014-05-22 05:54:18 +00004108 return checkLanguageOptions(ExistingLangOpts, LangOpts, nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00004109 }
Craig Topper3e89dfe2014-03-13 02:13:41 +00004110 bool ReadTargetOptions(const TargetOptions &TargetOpts,
4111 bool Complain) override {
Craig Toppera13603a2014-05-22 05:54:18 +00004112 return checkTargetOptions(ExistingTargetOpts, TargetOpts, nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00004113 }
Craig Topper3e89dfe2014-03-13 02:13:41 +00004114 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
4115 bool Complain,
4116 std::string &SuggestedPredefines) override {
Craig Toppera13603a2014-05-22 05:54:18 +00004117 return checkPreprocessorOptions(ExistingPPOpts, PPOpts, nullptr, FileMgr,
Argyrios Kyrtzidisd3afa0c2013-04-26 21:33:40 +00004118 SuggestedPredefines, ExistingLangOpts);
Guy Benyei11169dd2012-12-18 14:30:41 +00004119 }
4120 };
4121}
4122
4123bool ASTReader::readASTFileControlBlock(StringRef Filename,
4124 FileManager &FileMgr,
4125 ASTReaderListener &Listener) {
4126 // Open the AST file.
4127 std::string ErrStr;
Rafael Espindola6406f7b2014-08-26 19:54:40 +00004128 std::unique_ptr<llvm::MemoryBuffer> Buffer =
4129 FileMgr.getBufferForFile(Filename, &ErrStr);
Guy Benyei11169dd2012-12-18 14:30:41 +00004130 if (!Buffer) {
4131 return true;
4132 }
4133
4134 // Initialize the stream
4135 llvm::BitstreamReader StreamFile;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004136 BitstreamCursor Stream;
Guy Benyei11169dd2012-12-18 14:30:41 +00004137 StreamFile.init((const unsigned char *)Buffer->getBufferStart(),
4138 (const unsigned char *)Buffer->getBufferEnd());
4139 Stream.init(StreamFile);
4140
4141 // Sniff for the signature.
4142 if (Stream.Read(8) != 'C' ||
4143 Stream.Read(8) != 'P' ||
4144 Stream.Read(8) != 'C' ||
4145 Stream.Read(8) != 'H') {
4146 return true;
4147 }
4148
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004149 // Scan for the CONTROL_BLOCK_ID block.
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004150 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID))
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004151 return true;
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004152
4153 bool NeedsInputFiles = Listener.needsInputFileVisitation();
Ben Langmuircb69b572014-03-07 06:40:32 +00004154 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004155 BitstreamCursor InputFilesCursor;
4156 if (NeedsInputFiles) {
4157 InputFilesCursor = Stream;
4158 if (SkipCursorToBlock(InputFilesCursor, INPUT_FILES_BLOCK_ID))
4159 return true;
4160
4161 // Read the abbreviations
4162 while (true) {
4163 uint64_t Offset = InputFilesCursor.GetCurrentBitNo();
4164 unsigned Code = InputFilesCursor.ReadCode();
4165
4166 // We expect all abbrevs to be at the start of the block.
4167 if (Code != llvm::bitc::DEFINE_ABBREV) {
4168 InputFilesCursor.JumpToBit(Offset);
4169 break;
4170 }
4171 InputFilesCursor.ReadAbbrevRecord();
4172 }
4173 }
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004174
4175 // Scan for ORIGINAL_FILE inside the control block.
Guy Benyei11169dd2012-12-18 14:30:41 +00004176 RecordData Record;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004177 while (1) {
4178 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
4179 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
4180 return false;
4181
4182 if (Entry.Kind != llvm::BitstreamEntry::Record)
4183 return true;
4184
Guy Benyei11169dd2012-12-18 14:30:41 +00004185 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00004186 StringRef Blob;
4187 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob);
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004188 switch ((ControlRecordTypes)RecCode) {
4189 case METADATA: {
4190 if (Record[0] != VERSION_MAJOR)
4191 return true;
Guy Benyei11169dd2012-12-18 14:30:41 +00004192
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004193 if (Listener.ReadFullVersionInformation(Blob))
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004194 return true;
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004195
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004196 break;
4197 }
Ben Langmuir4f5212a2014-04-14 22:12:44 +00004198 case MODULE_NAME:
4199 Listener.ReadModuleName(Blob);
4200 break;
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00004201 case MODULE_MAP_FILE: {
4202 unsigned Idx = 0;
4203 Listener.ReadModuleMapFile(ReadString(Record, Idx));
Ben Langmuir4f5212a2014-04-14 22:12:44 +00004204 break;
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00004205 }
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004206 case LANGUAGE_OPTIONS:
4207 if (ParseLanguageOptions(Record, false, Listener))
4208 return true;
4209 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004210
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004211 case TARGET_OPTIONS:
4212 if (ParseTargetOptions(Record, false, Listener))
4213 return true;
4214 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004215
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004216 case DIAGNOSTIC_OPTIONS:
4217 if (ParseDiagnosticOptions(Record, false, Listener))
4218 return true;
4219 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004220
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004221 case FILE_SYSTEM_OPTIONS:
4222 if (ParseFileSystemOptions(Record, false, Listener))
4223 return true;
4224 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004225
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004226 case HEADER_SEARCH_OPTIONS:
4227 if (ParseHeaderSearchOptions(Record, false, Listener))
4228 return true;
4229 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004230
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004231 case PREPROCESSOR_OPTIONS: {
4232 std::string IgnoredSuggestedPredefines;
4233 if (ParsePreprocessorOptions(Record, false, Listener,
4234 IgnoredSuggestedPredefines))
4235 return true;
4236 break;
4237 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004238
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004239 case INPUT_FILE_OFFSETS: {
4240 if (!NeedsInputFiles)
4241 break;
4242
4243 unsigned NumInputFiles = Record[0];
4244 unsigned NumUserFiles = Record[1];
4245 const uint32_t *InputFileOffs = (const uint32_t *)Blob.data();
4246 for (unsigned I = 0; I != NumInputFiles; ++I) {
4247 // Go find this input file.
4248 bool isSystemFile = I >= NumUserFiles;
Ben Langmuircb69b572014-03-07 06:40:32 +00004249
4250 if (isSystemFile && !NeedsSystemInputFiles)
4251 break; // the rest are system input files
4252
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004253 BitstreamCursor &Cursor = InputFilesCursor;
4254 SavedStreamPosition SavedPosition(Cursor);
4255 Cursor.JumpToBit(InputFileOffs[I]);
4256
4257 unsigned Code = Cursor.ReadCode();
4258 RecordData Record;
4259 StringRef Blob;
4260 bool shouldContinue = false;
4261 switch ((InputFileRecordTypes)Cursor.readRecord(Code, Record, &Blob)) {
4262 case INPUT_FILE:
Argyrios Kyrtzidis68ccbe02014-03-14 02:26:31 +00004263 bool Overridden = static_cast<bool>(Record[3]);
4264 shouldContinue = Listener.visitInputFile(Blob, isSystemFile, Overridden);
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004265 break;
4266 }
4267 if (!shouldContinue)
4268 break;
4269 }
4270 break;
4271 }
4272
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004273 default:
4274 // No other validation to perform.
4275 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004276 }
4277 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004278}
4279
4280
4281bool ASTReader::isAcceptableASTFile(StringRef Filename,
4282 FileManager &FileMgr,
4283 const LangOptions &LangOpts,
4284 const TargetOptions &TargetOpts,
4285 const PreprocessorOptions &PPOpts) {
4286 SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts, FileMgr);
4287 return !readASTFileControlBlock(Filename, FileMgr, validator);
4288}
4289
Ben Langmuir2c9af442014-04-10 17:57:43 +00004290ASTReader::ASTReadResult
4291ASTReader::ReadSubmoduleBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004292 // Enter the submodule block.
4293 if (F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) {
4294 Error("malformed submodule block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004295 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004296 }
4297
4298 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
4299 bool First = true;
Craig Toppera13603a2014-05-22 05:54:18 +00004300 Module *CurrentModule = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00004301 RecordData Record;
4302 while (true) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004303 llvm::BitstreamEntry Entry = F.Stream.advanceSkippingSubblocks();
4304
4305 switch (Entry.Kind) {
4306 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
4307 case llvm::BitstreamEntry::Error:
4308 Error("malformed block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004309 return Failure;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004310 case llvm::BitstreamEntry::EndBlock:
Ben Langmuir2c9af442014-04-10 17:57:43 +00004311 return Success;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004312 case llvm::BitstreamEntry::Record:
4313 // The interesting case.
4314 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004315 }
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004316
Guy Benyei11169dd2012-12-18 14:30:41 +00004317 // Read a record.
Chris Lattner0e6c9402013-01-20 02:38:54 +00004318 StringRef Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00004319 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00004320 switch (F.Stream.readRecord(Entry.ID, Record, &Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004321 default: // Default behavior: ignore.
4322 break;
4323
4324 case SUBMODULE_DEFINITION: {
4325 if (First) {
4326 Error("missing submodule metadata record at beginning of block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004327 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004328 }
4329
Douglas Gregor8d932422013-03-20 03:59:18 +00004330 if (Record.size() < 8) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004331 Error("malformed module definition");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004332 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004333 }
4334
Chris Lattner0e6c9402013-01-20 02:38:54 +00004335 StringRef Name = Blob;
Richard Smith9bca2982014-03-08 00:03:56 +00004336 unsigned Idx = 0;
4337 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]);
4338 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]);
4339 bool IsFramework = Record[Idx++];
4340 bool IsExplicit = Record[Idx++];
4341 bool IsSystem = Record[Idx++];
4342 bool IsExternC = Record[Idx++];
4343 bool InferSubmodules = Record[Idx++];
4344 bool InferExplicitSubmodules = Record[Idx++];
4345 bool InferExportWildcard = Record[Idx++];
4346 bool ConfigMacrosExhaustive = Record[Idx++];
Douglas Gregor8d932422013-03-20 03:59:18 +00004347
Ben Langmuirbeee15e2014-04-14 18:00:01 +00004348 Module *ParentModule = nullptr;
Ben Langmuir9d6448b2014-08-09 00:57:23 +00004349 if (Parent)
Guy Benyei11169dd2012-12-18 14:30:41 +00004350 ParentModule = getSubmodule(Parent);
Ben Langmuirbeee15e2014-04-14 18:00:01 +00004351
Guy Benyei11169dd2012-12-18 14:30:41 +00004352 // Retrieve this (sub)module from the module map, creating it if
4353 // necessary.
Ben Langmuir9d6448b2014-08-09 00:57:23 +00004354 CurrentModule = ModMap.findOrCreateModule(Name, ParentModule, IsFramework,
Guy Benyei11169dd2012-12-18 14:30:41 +00004355 IsExplicit).first;
Ben Langmuir9d6448b2014-08-09 00:57:23 +00004356
4357 // FIXME: set the definition loc for CurrentModule, or call
4358 // ModMap.setInferredModuleAllowedBy()
4359
Guy Benyei11169dd2012-12-18 14:30:41 +00004360 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS;
4361 if (GlobalIndex >= SubmodulesLoaded.size() ||
4362 SubmodulesLoaded[GlobalIndex]) {
4363 Error("too many submodules");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004364 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004365 }
Douglas Gregor8a114ab2013-02-06 22:40:31 +00004366
Douglas Gregor7029ce12013-03-19 00:28:20 +00004367 if (!ParentModule) {
4368 if (const FileEntry *CurFile = CurrentModule->getASTFile()) {
4369 if (CurFile != F.File) {
4370 if (!Diags.isDiagnosticInFlight()) {
4371 Diag(diag::err_module_file_conflict)
4372 << CurrentModule->getTopLevelModuleName()
4373 << CurFile->getName()
4374 << F.File->getName();
4375 }
Ben Langmuir2c9af442014-04-10 17:57:43 +00004376 return Failure;
Douglas Gregor8a114ab2013-02-06 22:40:31 +00004377 }
Douglas Gregor8a114ab2013-02-06 22:40:31 +00004378 }
Douglas Gregor7029ce12013-03-19 00:28:20 +00004379
4380 CurrentModule->setASTFile(F.File);
Douglas Gregor8a114ab2013-02-06 22:40:31 +00004381 }
Ben Langmuirbeee15e2014-04-14 18:00:01 +00004382
Guy Benyei11169dd2012-12-18 14:30:41 +00004383 CurrentModule->IsFromModuleFile = true;
4384 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem;
Richard Smith9bca2982014-03-08 00:03:56 +00004385 CurrentModule->IsExternC = IsExternC;
Guy Benyei11169dd2012-12-18 14:30:41 +00004386 CurrentModule->InferSubmodules = InferSubmodules;
4387 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules;
4388 CurrentModule->InferExportWildcard = InferExportWildcard;
Douglas Gregor8d932422013-03-20 03:59:18 +00004389 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive;
Guy Benyei11169dd2012-12-18 14:30:41 +00004390 if (DeserializationListener)
4391 DeserializationListener->ModuleRead(GlobalID, CurrentModule);
4392
4393 SubmodulesLoaded[GlobalIndex] = CurrentModule;
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004394
Douglas Gregorfb912652013-03-20 21:10:35 +00004395 // Clear out data that will be replaced by what is the module file.
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004396 CurrentModule->LinkLibraries.clear();
Douglas Gregor8d932422013-03-20 03:59:18 +00004397 CurrentModule->ConfigMacros.clear();
Douglas Gregorfb912652013-03-20 21:10:35 +00004398 CurrentModule->UnresolvedConflicts.clear();
4399 CurrentModule->Conflicts.clear();
Guy Benyei11169dd2012-12-18 14:30:41 +00004400 break;
4401 }
4402
4403 case SUBMODULE_UMBRELLA_HEADER: {
4404 if (First) {
4405 Error("missing submodule metadata record at beginning of block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004406 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004407 }
4408
4409 if (!CurrentModule)
4410 break;
4411
Chris Lattner0e6c9402013-01-20 02:38:54 +00004412 if (const FileEntry *Umbrella = PP.getFileManager().getFile(Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004413 if (!CurrentModule->getUmbrellaHeader())
4414 ModMap.setUmbrellaHeader(CurrentModule, Umbrella);
4415 else if (CurrentModule->getUmbrellaHeader() != Umbrella) {
Ben Langmuir2c9af442014-04-10 17:57:43 +00004416 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
4417 Error("mismatched umbrella headers in submodule");
4418 return OutOfDate;
Guy Benyei11169dd2012-12-18 14:30:41 +00004419 }
4420 }
4421 break;
4422 }
4423
4424 case SUBMODULE_HEADER: {
4425 if (First) {
4426 Error("missing submodule metadata record at beginning of block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004427 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004428 }
4429
4430 if (!CurrentModule)
4431 break;
4432
Argyrios Kyrtzidisb146baa2013-03-13 21:13:51 +00004433 // We lazily associate headers with their modules via the HeaderInfoTable.
4434 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
4435 // of complete filenames or remove it entirely.
Guy Benyei11169dd2012-12-18 14:30:41 +00004436 break;
4437 }
4438
4439 case SUBMODULE_EXCLUDED_HEADER: {
4440 if (First) {
4441 Error("missing submodule metadata record at beginning of block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004442 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004443 }
4444
4445 if (!CurrentModule)
4446 break;
4447
Argyrios Kyrtzidisb146baa2013-03-13 21:13:51 +00004448 // We lazily associate headers with their modules via the HeaderInfoTable.
4449 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
4450 // of complete filenames or remove it entirely.
Guy Benyei11169dd2012-12-18 14:30:41 +00004451 break;
4452 }
4453
Lawrence Crowlb53e5482013-06-20 21:14:14 +00004454 case SUBMODULE_PRIVATE_HEADER: {
4455 if (First) {
4456 Error("missing submodule metadata record at beginning of block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004457 return Failure;
Lawrence Crowlb53e5482013-06-20 21:14:14 +00004458 }
4459
4460 if (!CurrentModule)
4461 break;
4462
4463 // We lazily associate headers with their modules via the HeaderInfoTable.
4464 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
4465 // of complete filenames or remove it entirely.
4466 break;
4467 }
4468
Guy Benyei11169dd2012-12-18 14:30:41 +00004469 case SUBMODULE_TOPHEADER: {
4470 if (First) {
4471 Error("missing submodule metadata record at beginning of block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004472 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004473 }
4474
4475 if (!CurrentModule)
4476 break;
4477
Argyrios Kyrtzidis3c5305c2013-03-13 21:13:43 +00004478 CurrentModule->addTopHeaderFilename(Blob);
Guy Benyei11169dd2012-12-18 14:30:41 +00004479 break;
4480 }
4481
4482 case SUBMODULE_UMBRELLA_DIR: {
4483 if (First) {
4484 Error("missing submodule metadata record at beginning of block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004485 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004486 }
4487
4488 if (!CurrentModule)
4489 break;
4490
Guy Benyei11169dd2012-12-18 14:30:41 +00004491 if (const DirectoryEntry *Umbrella
Chris Lattner0e6c9402013-01-20 02:38:54 +00004492 = PP.getFileManager().getDirectory(Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004493 if (!CurrentModule->getUmbrellaDir())
4494 ModMap.setUmbrellaDir(CurrentModule, Umbrella);
4495 else if (CurrentModule->getUmbrellaDir() != Umbrella) {
Ben Langmuir2c9af442014-04-10 17:57:43 +00004496 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
4497 Error("mismatched umbrella directories in submodule");
4498 return OutOfDate;
Guy Benyei11169dd2012-12-18 14:30:41 +00004499 }
4500 }
4501 break;
4502 }
4503
4504 case SUBMODULE_METADATA: {
4505 if (!First) {
4506 Error("submodule metadata record not at beginning of block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004507 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004508 }
4509 First = false;
4510
4511 F.BaseSubmoduleID = getTotalNumSubmodules();
4512 F.LocalNumSubmodules = Record[0];
4513 unsigned LocalBaseSubmoduleID = Record[1];
4514 if (F.LocalNumSubmodules > 0) {
4515 // Introduce the global -> local mapping for submodules within this
4516 // module.
4517 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F));
4518
4519 // Introduce the local -> global mapping for submodules within this
4520 // module.
4521 F.SubmoduleRemap.insertOrReplace(
4522 std::make_pair(LocalBaseSubmoduleID,
4523 F.BaseSubmoduleID - LocalBaseSubmoduleID));
Ben Langmuirfe971d92014-08-16 04:54:18 +00004524 }
4525
4526 // Increase size by >= 1 so we get a unique base index in the next module.
4527 SubmodulesLoaded.resize(SubmodulesLoaded.size() +
4528 std::max(F.LocalNumSubmodules, 1U));
Guy Benyei11169dd2012-12-18 14:30:41 +00004529 break;
4530 }
4531
4532 case SUBMODULE_IMPORTS: {
4533 if (First) {
4534 Error("missing submodule metadata record at beginning of block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004535 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004536 }
4537
4538 if (!CurrentModule)
4539 break;
4540
4541 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) {
Douglas Gregorfb912652013-03-20 21:10:35 +00004542 UnresolvedModuleRef Unresolved;
Guy Benyei11169dd2012-12-18 14:30:41 +00004543 Unresolved.File = &F;
4544 Unresolved.Mod = CurrentModule;
4545 Unresolved.ID = Record[Idx];
Douglas Gregorfb912652013-03-20 21:10:35 +00004546 Unresolved.Kind = UnresolvedModuleRef::Import;
Guy Benyei11169dd2012-12-18 14:30:41 +00004547 Unresolved.IsWildcard = false;
Douglas Gregorfb912652013-03-20 21:10:35 +00004548 UnresolvedModuleRefs.push_back(Unresolved);
Guy Benyei11169dd2012-12-18 14:30:41 +00004549 }
4550 break;
4551 }
4552
4553 case SUBMODULE_EXPORTS: {
4554 if (First) {
4555 Error("missing submodule metadata record at beginning of block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004556 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004557 }
4558
4559 if (!CurrentModule)
4560 break;
4561
4562 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) {
Douglas Gregorfb912652013-03-20 21:10:35 +00004563 UnresolvedModuleRef Unresolved;
Guy Benyei11169dd2012-12-18 14:30:41 +00004564 Unresolved.File = &F;
4565 Unresolved.Mod = CurrentModule;
4566 Unresolved.ID = Record[Idx];
Douglas Gregorfb912652013-03-20 21:10:35 +00004567 Unresolved.Kind = UnresolvedModuleRef::Export;
Guy Benyei11169dd2012-12-18 14:30:41 +00004568 Unresolved.IsWildcard = Record[Idx + 1];
Douglas Gregorfb912652013-03-20 21:10:35 +00004569 UnresolvedModuleRefs.push_back(Unresolved);
Guy Benyei11169dd2012-12-18 14:30:41 +00004570 }
4571
4572 // Once we've loaded the set of exports, there's no reason to keep
4573 // the parsed, unresolved exports around.
4574 CurrentModule->UnresolvedExports.clear();
4575 break;
4576 }
4577 case SUBMODULE_REQUIRES: {
4578 if (First) {
4579 Error("missing submodule metadata record at beginning of block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004580 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004581 }
4582
4583 if (!CurrentModule)
4584 break;
4585
Richard Smitha3feee22013-10-28 22:18:19 +00004586 CurrentModule->addRequirement(Blob, Record[0], Context.getLangOpts(),
Guy Benyei11169dd2012-12-18 14:30:41 +00004587 Context.getTargetInfo());
4588 break;
4589 }
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004590
4591 case SUBMODULE_LINK_LIBRARY:
4592 if (First) {
4593 Error("missing submodule metadata record at beginning of block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004594 return Failure;
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004595 }
4596
4597 if (!CurrentModule)
4598 break;
4599
4600 CurrentModule->LinkLibraries.push_back(
Chris Lattner0e6c9402013-01-20 02:38:54 +00004601 Module::LinkLibrary(Blob, Record[0]));
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004602 break;
Douglas Gregor35b13ec2013-03-20 00:22:05 +00004603
4604 case SUBMODULE_CONFIG_MACRO:
4605 if (First) {
4606 Error("missing submodule metadata record at beginning of block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004607 return Failure;
Douglas Gregor35b13ec2013-03-20 00:22:05 +00004608 }
4609
4610 if (!CurrentModule)
4611 break;
4612
4613 CurrentModule->ConfigMacros.push_back(Blob.str());
4614 break;
Douglas Gregorfb912652013-03-20 21:10:35 +00004615
4616 case SUBMODULE_CONFLICT: {
4617 if (First) {
4618 Error("missing submodule metadata record at beginning of block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004619 return Failure;
Douglas Gregorfb912652013-03-20 21:10:35 +00004620 }
4621
4622 if (!CurrentModule)
4623 break;
4624
4625 UnresolvedModuleRef Unresolved;
4626 Unresolved.File = &F;
4627 Unresolved.Mod = CurrentModule;
4628 Unresolved.ID = Record[0];
4629 Unresolved.Kind = UnresolvedModuleRef::Conflict;
4630 Unresolved.IsWildcard = false;
4631 Unresolved.String = Blob;
4632 UnresolvedModuleRefs.push_back(Unresolved);
4633 break;
4634 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004635 }
4636 }
4637}
4638
4639/// \brief Parse the record that corresponds to a LangOptions data
4640/// structure.
4641///
4642/// This routine parses the language options from the AST file and then gives
4643/// them to the AST listener if one is set.
4644///
4645/// \returns true if the listener deems the file unacceptable, false otherwise.
4646bool ASTReader::ParseLanguageOptions(const RecordData &Record,
4647 bool Complain,
4648 ASTReaderListener &Listener) {
4649 LangOptions LangOpts;
4650 unsigned Idx = 0;
4651#define LANGOPT(Name, Bits, Default, Description) \
4652 LangOpts.Name = Record[Idx++];
4653#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
4654 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
4655#include "clang/Basic/LangOptions.def"
Will Dietzf54319c2013-01-18 11:30:38 +00004656#define SANITIZER(NAME, ID) LangOpts.Sanitize.ID = Record[Idx++];
4657#include "clang/Basic/Sanitizers.def"
Guy Benyei11169dd2012-12-18 14:30:41 +00004658
4659 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++];
4660 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx);
4661 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion);
4662
4663 unsigned Length = Record[Idx++];
4664 LangOpts.CurrentModule.assign(Record.begin() + Idx,
4665 Record.begin() + Idx + Length);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004666
4667 Idx += Length;
4668
4669 // Comment options.
4670 for (unsigned N = Record[Idx++]; N; --N) {
4671 LangOpts.CommentOpts.BlockCommandNames.push_back(
4672 ReadString(Record, Idx));
4673 }
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004674 LangOpts.CommentOpts.ParseAllComments = Record[Idx++];
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004675
Guy Benyei11169dd2012-12-18 14:30:41 +00004676 return Listener.ReadLanguageOptions(LangOpts, Complain);
4677}
4678
4679bool ASTReader::ParseTargetOptions(const RecordData &Record,
4680 bool Complain,
4681 ASTReaderListener &Listener) {
4682 unsigned Idx = 0;
4683 TargetOptions TargetOpts;
4684 TargetOpts.Triple = ReadString(Record, Idx);
4685 TargetOpts.CPU = ReadString(Record, Idx);
4686 TargetOpts.ABI = ReadString(Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00004687 for (unsigned N = Record[Idx++]; N; --N) {
4688 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx));
4689 }
4690 for (unsigned N = Record[Idx++]; N; --N) {
4691 TargetOpts.Features.push_back(ReadString(Record, Idx));
4692 }
4693
4694 return Listener.ReadTargetOptions(TargetOpts, Complain);
4695}
4696
4697bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain,
4698 ASTReaderListener &Listener) {
Ben Langmuirb92de022014-04-29 16:25:26 +00004699 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions);
Guy Benyei11169dd2012-12-18 14:30:41 +00004700 unsigned Idx = 0;
Ben Langmuirb92de022014-04-29 16:25:26 +00004701#define DIAGOPT(Name, Bits, Default) DiagOpts->Name = Record[Idx++];
Guy Benyei11169dd2012-12-18 14:30:41 +00004702#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
Ben Langmuirb92de022014-04-29 16:25:26 +00004703 DiagOpts->set##Name(static_cast<Type>(Record[Idx++]));
Guy Benyei11169dd2012-12-18 14:30:41 +00004704#include "clang/Basic/DiagnosticOptions.def"
4705
Richard Smith3be1cb22014-08-07 00:24:21 +00004706 for (unsigned N = Record[Idx++]; N; --N)
Ben Langmuirb92de022014-04-29 16:25:26 +00004707 DiagOpts->Warnings.push_back(ReadString(Record, Idx));
Richard Smith3be1cb22014-08-07 00:24:21 +00004708 for (unsigned N = Record[Idx++]; N; --N)
4709 DiagOpts->Remarks.push_back(ReadString(Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00004710
4711 return Listener.ReadDiagnosticOptions(DiagOpts, Complain);
4712}
4713
4714bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain,
4715 ASTReaderListener &Listener) {
4716 FileSystemOptions FSOpts;
4717 unsigned Idx = 0;
4718 FSOpts.WorkingDir = ReadString(Record, Idx);
4719 return Listener.ReadFileSystemOptions(FSOpts, Complain);
4720}
4721
4722bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record,
4723 bool Complain,
4724 ASTReaderListener &Listener) {
4725 HeaderSearchOptions HSOpts;
4726 unsigned Idx = 0;
4727 HSOpts.Sysroot = ReadString(Record, Idx);
4728
4729 // Include entries.
4730 for (unsigned N = Record[Idx++]; N; --N) {
4731 std::string Path = ReadString(Record, Idx);
4732 frontend::IncludeDirGroup Group
4733 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]);
Guy Benyei11169dd2012-12-18 14:30:41 +00004734 bool IsFramework = Record[Idx++];
4735 bool IgnoreSysRoot = Record[Idx++];
Guy Benyei11169dd2012-12-18 14:30:41 +00004736 HSOpts.UserEntries.push_back(
Daniel Dunbar53681732013-01-30 00:34:26 +00004737 HeaderSearchOptions::Entry(Path, Group, IsFramework, IgnoreSysRoot));
Guy Benyei11169dd2012-12-18 14:30:41 +00004738 }
4739
4740 // System header prefixes.
4741 for (unsigned N = Record[Idx++]; N; --N) {
4742 std::string Prefix = ReadString(Record, Idx);
4743 bool IsSystemHeader = Record[Idx++];
4744 HSOpts.SystemHeaderPrefixes.push_back(
4745 HeaderSearchOptions::SystemHeaderPrefix(Prefix, IsSystemHeader));
4746 }
4747
4748 HSOpts.ResourceDir = ReadString(Record, Idx);
4749 HSOpts.ModuleCachePath = ReadString(Record, Idx);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004750 HSOpts.ModuleUserBuildPath = ReadString(Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00004751 HSOpts.DisableModuleHash = Record[Idx++];
4752 HSOpts.UseBuiltinIncludes = Record[Idx++];
4753 HSOpts.UseStandardSystemIncludes = Record[Idx++];
4754 HSOpts.UseStandardCXXIncludes = Record[Idx++];
4755 HSOpts.UseLibcxx = Record[Idx++];
4756
4757 return Listener.ReadHeaderSearchOptions(HSOpts, Complain);
4758}
4759
4760bool ASTReader::ParsePreprocessorOptions(const RecordData &Record,
4761 bool Complain,
4762 ASTReaderListener &Listener,
4763 std::string &SuggestedPredefines) {
4764 PreprocessorOptions PPOpts;
4765 unsigned Idx = 0;
4766
4767 // Macro definitions/undefs
4768 for (unsigned N = Record[Idx++]; N; --N) {
4769 std::string Macro = ReadString(Record, Idx);
4770 bool IsUndef = Record[Idx++];
4771 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef));
4772 }
4773
4774 // Includes
4775 for (unsigned N = Record[Idx++]; N; --N) {
4776 PPOpts.Includes.push_back(ReadString(Record, Idx));
4777 }
4778
4779 // Macro Includes
4780 for (unsigned N = Record[Idx++]; N; --N) {
4781 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx));
4782 }
4783
4784 PPOpts.UsePredefines = Record[Idx++];
Argyrios Kyrtzidisd3afa0c2013-04-26 21:33:40 +00004785 PPOpts.DetailedRecord = Record[Idx++];
Guy Benyei11169dd2012-12-18 14:30:41 +00004786 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx);
4787 PPOpts.ImplicitPTHInclude = ReadString(Record, Idx);
4788 PPOpts.ObjCXXARCStandardLibrary =
4789 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]);
4790 SuggestedPredefines.clear();
4791 return Listener.ReadPreprocessorOptions(PPOpts, Complain,
4792 SuggestedPredefines);
4793}
4794
4795std::pair<ModuleFile *, unsigned>
4796ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) {
4797 GlobalPreprocessedEntityMapType::iterator
4798 I = GlobalPreprocessedEntityMap.find(GlobalIndex);
4799 assert(I != GlobalPreprocessedEntityMap.end() &&
4800 "Corrupted global preprocessed entity map");
4801 ModuleFile *M = I->second;
4802 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID;
4803 return std::make_pair(M, LocalIndex);
4804}
4805
4806std::pair<PreprocessingRecord::iterator, PreprocessingRecord::iterator>
4807ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const {
4808 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
4809 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID,
4810 Mod.NumPreprocessedEntities);
4811
4812 return std::make_pair(PreprocessingRecord::iterator(),
4813 PreprocessingRecord::iterator());
4814}
4815
4816std::pair<ASTReader::ModuleDeclIterator, ASTReader::ModuleDeclIterator>
4817ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) {
4818 return std::make_pair(ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls),
4819 ModuleDeclIterator(this, &Mod,
4820 Mod.FileSortedDecls + Mod.NumFileSortedDecls));
4821}
4822
4823PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) {
4824 PreprocessedEntityID PPID = Index+1;
4825 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
4826 ModuleFile &M = *PPInfo.first;
4827 unsigned LocalIndex = PPInfo.second;
4828 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
4829
Guy Benyei11169dd2012-12-18 14:30:41 +00004830 if (!PP.getPreprocessingRecord()) {
4831 Error("no preprocessing record");
Craig Toppera13603a2014-05-22 05:54:18 +00004832 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00004833 }
4834
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004835 SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor);
4836 M.PreprocessorDetailCursor.JumpToBit(PPOffs.BitOffset);
4837
4838 llvm::BitstreamEntry Entry =
4839 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
4840 if (Entry.Kind != llvm::BitstreamEntry::Record)
Craig Toppera13603a2014-05-22 05:54:18 +00004841 return nullptr;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004842
Guy Benyei11169dd2012-12-18 14:30:41 +00004843 // Read the record.
4844 SourceRange Range(ReadSourceLocation(M, PPOffs.Begin),
4845 ReadSourceLocation(M, PPOffs.End));
4846 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
Chris Lattner0e6c9402013-01-20 02:38:54 +00004847 StringRef Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00004848 RecordData Record;
4849 PreprocessorDetailRecordTypes RecType =
Chris Lattner0e6c9402013-01-20 02:38:54 +00004850 (PreprocessorDetailRecordTypes)M.PreprocessorDetailCursor.readRecord(
4851 Entry.ID, Record, &Blob);
Guy Benyei11169dd2012-12-18 14:30:41 +00004852 switch (RecType) {
4853 case PPD_MACRO_EXPANSION: {
4854 bool isBuiltin = Record[0];
Craig Toppera13603a2014-05-22 05:54:18 +00004855 IdentifierInfo *Name = nullptr;
4856 MacroDefinition *Def = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00004857 if (isBuiltin)
4858 Name = getLocalIdentifier(M, Record[1]);
4859 else {
4860 PreprocessedEntityID
4861 GlobalID = getGlobalPreprocessedEntityID(M, Record[1]);
4862 Def =cast<MacroDefinition>(PPRec.getLoadedPreprocessedEntity(GlobalID-1));
4863 }
4864
4865 MacroExpansion *ME;
4866 if (isBuiltin)
4867 ME = new (PPRec) MacroExpansion(Name, Range);
4868 else
4869 ME = new (PPRec) MacroExpansion(Def, Range);
4870
4871 return ME;
4872 }
4873
4874 case PPD_MACRO_DEFINITION: {
4875 // Decode the identifier info and then check again; if the macro is
4876 // still defined and associated with the identifier,
4877 IdentifierInfo *II = getLocalIdentifier(M, Record[0]);
4878 MacroDefinition *MD
4879 = new (PPRec) MacroDefinition(II, Range);
4880
4881 if (DeserializationListener)
4882 DeserializationListener->MacroDefinitionRead(PPID, MD);
4883
4884 return MD;
4885 }
4886
4887 case PPD_INCLUSION_DIRECTIVE: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00004888 const char *FullFileNameStart = Blob.data() + Record[0];
4889 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]);
Craig Toppera13603a2014-05-22 05:54:18 +00004890 const FileEntry *File = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00004891 if (!FullFileName.empty())
4892 File = PP.getFileManager().getFile(FullFileName);
4893
4894 // FIXME: Stable encoding
4895 InclusionDirective::InclusionKind Kind
4896 = static_cast<InclusionDirective::InclusionKind>(Record[2]);
4897 InclusionDirective *ID
4898 = new (PPRec) InclusionDirective(PPRec, Kind,
Chris Lattner0e6c9402013-01-20 02:38:54 +00004899 StringRef(Blob.data(), Record[0]),
Guy Benyei11169dd2012-12-18 14:30:41 +00004900 Record[1], Record[3],
4901 File,
4902 Range);
4903 return ID;
4904 }
4905 }
4906
4907 llvm_unreachable("Invalid PreprocessorDetailRecordTypes");
4908}
4909
4910/// \brief \arg SLocMapI points at a chunk of a module that contains no
4911/// preprocessed entities or the entities it contains are not the ones we are
4912/// looking for. Find the next module that contains entities and return the ID
4913/// of the first entry.
4914PreprocessedEntityID ASTReader::findNextPreprocessedEntity(
4915 GlobalSLocOffsetMapType::const_iterator SLocMapI) const {
4916 ++SLocMapI;
4917 for (GlobalSLocOffsetMapType::const_iterator
4918 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
4919 ModuleFile &M = *SLocMapI->second;
4920 if (M.NumPreprocessedEntities)
4921 return M.BasePreprocessedEntityID;
4922 }
4923
4924 return getTotalNumPreprocessedEntities();
4925}
4926
4927namespace {
4928
4929template <unsigned PPEntityOffset::*PPLoc>
4930struct PPEntityComp {
4931 const ASTReader &Reader;
4932 ModuleFile &M;
4933
4934 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) { }
4935
4936 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const {
4937 SourceLocation LHS = getLoc(L);
4938 SourceLocation RHS = getLoc(R);
4939 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
4940 }
4941
4942 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const {
4943 SourceLocation LHS = getLoc(L);
4944 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
4945 }
4946
4947 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const {
4948 SourceLocation RHS = getLoc(R);
4949 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
4950 }
4951
4952 SourceLocation getLoc(const PPEntityOffset &PPE) const {
4953 return Reader.ReadSourceLocation(M, PPE.*PPLoc);
4954 }
4955};
4956
4957}
4958
Alp Toker2e9ce4c2014-05-16 18:59:21 +00004959PreprocessedEntityID ASTReader::findPreprocessedEntity(SourceLocation Loc,
4960 bool EndsAfter) const {
4961 if (SourceMgr.isLocalSourceLocation(Loc))
Guy Benyei11169dd2012-12-18 14:30:41 +00004962 return getTotalNumPreprocessedEntities();
4963
Alp Toker2e9ce4c2014-05-16 18:59:21 +00004964 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
4965 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
Guy Benyei11169dd2012-12-18 14:30:41 +00004966 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
4967 "Corrupted global sloc offset map");
4968
4969 if (SLocMapI->second->NumPreprocessedEntities == 0)
4970 return findNextPreprocessedEntity(SLocMapI);
4971
4972 ModuleFile &M = *SLocMapI->second;
4973 typedef const PPEntityOffset *pp_iterator;
4974 pp_iterator pp_begin = M.PreprocessedEntityOffsets;
4975 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities;
4976
4977 size_t Count = M.NumPreprocessedEntities;
4978 size_t Half;
4979 pp_iterator First = pp_begin;
4980 pp_iterator PPI;
4981
Alp Toker2e9ce4c2014-05-16 18:59:21 +00004982 if (EndsAfter) {
4983 PPI = std::upper_bound(pp_begin, pp_end, Loc,
4984 PPEntityComp<&PPEntityOffset::Begin>(*this, M));
4985 } else {
4986 // Do a binary search manually instead of using std::lower_bound because
4987 // The end locations of entities may be unordered (when a macro expansion
4988 // is inside another macro argument), but for this case it is not important
4989 // whether we get the first macro expansion or its containing macro.
4990 while (Count > 0) {
4991 Half = Count / 2;
4992 PPI = First;
4993 std::advance(PPI, Half);
4994 if (SourceMgr.isBeforeInTranslationUnit(ReadSourceLocation(M, PPI->End),
4995 Loc)) {
4996 First = PPI;
4997 ++First;
4998 Count = Count - Half - 1;
4999 } else
5000 Count = Half;
5001 }
Guy Benyei11169dd2012-12-18 14:30:41 +00005002 }
5003
5004 if (PPI == pp_end)
5005 return findNextPreprocessedEntity(SLocMapI);
5006
5007 return M.BasePreprocessedEntityID + (PPI - pp_begin);
5008}
5009
Guy Benyei11169dd2012-12-18 14:30:41 +00005010/// \brief Returns a pair of [Begin, End) indices of preallocated
5011/// preprocessed entities that \arg Range encompasses.
5012std::pair<unsigned, unsigned>
5013 ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) {
5014 if (Range.isInvalid())
5015 return std::make_pair(0,0);
5016 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
5017
Alp Toker2e9ce4c2014-05-16 18:59:21 +00005018 PreprocessedEntityID BeginID =
5019 findPreprocessedEntity(Range.getBegin(), false);
5020 PreprocessedEntityID EndID = findPreprocessedEntity(Range.getEnd(), true);
Guy Benyei11169dd2012-12-18 14:30:41 +00005021 return std::make_pair(BeginID, EndID);
5022}
5023
5024/// \brief Optionally returns true or false if the preallocated preprocessed
5025/// entity with index \arg Index came from file \arg FID.
David Blaikie05785d12013-02-20 22:23:23 +00005026Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index,
Guy Benyei11169dd2012-12-18 14:30:41 +00005027 FileID FID) {
5028 if (FID.isInvalid())
5029 return false;
5030
5031 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
5032 ModuleFile &M = *PPInfo.first;
5033 unsigned LocalIndex = PPInfo.second;
5034 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
5035
5036 SourceLocation Loc = ReadSourceLocation(M, PPOffs.Begin);
5037 if (Loc.isInvalid())
5038 return false;
5039
5040 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
5041 return true;
5042 else
5043 return false;
5044}
5045
5046namespace {
5047 /// \brief Visitor used to search for information about a header file.
5048 class HeaderFileInfoVisitor {
Guy Benyei11169dd2012-12-18 14:30:41 +00005049 const FileEntry *FE;
5050
David Blaikie05785d12013-02-20 22:23:23 +00005051 Optional<HeaderFileInfo> HFI;
Guy Benyei11169dd2012-12-18 14:30:41 +00005052
5053 public:
Argyrios Kyrtzidis61a38962013-03-06 18:12:44 +00005054 explicit HeaderFileInfoVisitor(const FileEntry *FE)
5055 : FE(FE) { }
Guy Benyei11169dd2012-12-18 14:30:41 +00005056
5057 static bool visit(ModuleFile &M, void *UserData) {
5058 HeaderFileInfoVisitor *This
5059 = static_cast<HeaderFileInfoVisitor *>(UserData);
5060
Guy Benyei11169dd2012-12-18 14:30:41 +00005061 HeaderFileInfoLookupTable *Table
5062 = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable);
5063 if (!Table)
5064 return false;
5065
5066 // Look in the on-disk hash table for an entry for this file name.
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00005067 HeaderFileInfoLookupTable::iterator Pos = Table->find(This->FE);
Guy Benyei11169dd2012-12-18 14:30:41 +00005068 if (Pos == Table->end())
5069 return false;
5070
5071 This->HFI = *Pos;
5072 return true;
5073 }
5074
David Blaikie05785d12013-02-20 22:23:23 +00005075 Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; }
Guy Benyei11169dd2012-12-18 14:30:41 +00005076 };
5077}
5078
5079HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) {
Argyrios Kyrtzidis61a38962013-03-06 18:12:44 +00005080 HeaderFileInfoVisitor Visitor(FE);
Guy Benyei11169dd2012-12-18 14:30:41 +00005081 ModuleMgr.visit(&HeaderFileInfoVisitor::visit, &Visitor);
Argyrios Kyrtzidis1054bbf2013-05-08 23:46:55 +00005082 if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
Guy Benyei11169dd2012-12-18 14:30:41 +00005083 return *HFI;
Guy Benyei11169dd2012-12-18 14:30:41 +00005084
5085 return HeaderFileInfo();
5086}
5087
5088void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) {
5089 // FIXME: Make it work properly with modules.
Dmitri Gribenkof8579502013-01-12 19:30:44 +00005090 SmallVector<DiagnosticsEngine::DiagState *, 32> DiagStates;
Guy Benyei11169dd2012-12-18 14:30:41 +00005091 for (ModuleIterator I = ModuleMgr.begin(), E = ModuleMgr.end(); I != E; ++I) {
5092 ModuleFile &F = *(*I);
5093 unsigned Idx = 0;
5094 DiagStates.clear();
5095 assert(!Diag.DiagStates.empty());
5096 DiagStates.push_back(&Diag.DiagStates.front()); // the command-line one.
5097 while (Idx < F.PragmaDiagMappings.size()) {
5098 SourceLocation Loc = ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]);
5099 unsigned DiagStateID = F.PragmaDiagMappings[Idx++];
5100 if (DiagStateID != 0) {
5101 Diag.DiagStatePoints.push_back(
5102 DiagnosticsEngine::DiagStatePoint(DiagStates[DiagStateID-1],
5103 FullSourceLoc(Loc, SourceMgr)));
5104 continue;
5105 }
5106
5107 assert(DiagStateID == 0);
5108 // A new DiagState was created here.
5109 Diag.DiagStates.push_back(*Diag.GetCurDiagState());
5110 DiagnosticsEngine::DiagState *NewState = &Diag.DiagStates.back();
5111 DiagStates.push_back(NewState);
5112 Diag.DiagStatePoints.push_back(
5113 DiagnosticsEngine::DiagStatePoint(NewState,
5114 FullSourceLoc(Loc, SourceMgr)));
5115 while (1) {
5116 assert(Idx < F.PragmaDiagMappings.size() &&
5117 "Invalid data, didn't find '-1' marking end of diag/map pairs");
5118 if (Idx >= F.PragmaDiagMappings.size()) {
5119 break; // Something is messed up but at least avoid infinite loop in
5120 // release build.
5121 }
5122 unsigned DiagID = F.PragmaDiagMappings[Idx++];
5123 if (DiagID == (unsigned)-1) {
5124 break; // no more diag/map pairs for this location.
5125 }
Alp Tokerc726c362014-06-10 09:31:37 +00005126 diag::Severity Map = (diag::Severity)F.PragmaDiagMappings[Idx++];
5127 DiagnosticMapping Mapping = Diag.makeUserMapping(Map, Loc);
5128 Diag.GetCurDiagState()->setMapping(DiagID, Mapping);
Guy Benyei11169dd2012-12-18 14:30:41 +00005129 }
5130 }
5131 }
5132}
5133
5134/// \brief Get the correct cursor and offset for loading a type.
5135ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) {
5136 GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index);
5137 assert(I != GlobalTypeMap.end() && "Corrupted global type map");
5138 ModuleFile *M = I->second;
5139 return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex]);
5140}
5141
5142/// \brief Read and return the type with the given index..
5143///
5144/// The index is the type ID, shifted and minus the number of predefs. This
5145/// routine actually reads the record corresponding to the type at the given
5146/// location. It is a helper routine for GetType, which deals with reading type
5147/// IDs.
5148QualType ASTReader::readTypeRecord(unsigned Index) {
5149 RecordLocation Loc = TypeCursorForIndex(Index);
Chris Lattner7fb3bef2013-01-20 00:56:42 +00005150 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00005151
5152 // Keep track of where we are in the stream, then jump back there
5153 // after reading this type.
5154 SavedStreamPosition SavedPosition(DeclsCursor);
5155
5156 ReadingKindTracker ReadingKind(Read_Type, *this);
5157
5158 // Note that we are loading a type record.
5159 Deserializing AType(this);
5160
5161 unsigned Idx = 0;
5162 DeclsCursor.JumpToBit(Loc.Offset);
5163 RecordData Record;
5164 unsigned Code = DeclsCursor.ReadCode();
Chris Lattner0e6c9402013-01-20 02:38:54 +00005165 switch ((TypeCode)DeclsCursor.readRecord(Code, Record)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00005166 case TYPE_EXT_QUAL: {
5167 if (Record.size() != 2) {
5168 Error("Incorrect encoding of extended qualifier type");
5169 return QualType();
5170 }
5171 QualType Base = readType(*Loc.F, Record, Idx);
5172 Qualifiers Quals = Qualifiers::fromOpaqueValue(Record[Idx++]);
5173 return Context.getQualifiedType(Base, Quals);
5174 }
5175
5176 case TYPE_COMPLEX: {
5177 if (Record.size() != 1) {
5178 Error("Incorrect encoding of complex type");
5179 return QualType();
5180 }
5181 QualType ElemType = readType(*Loc.F, Record, Idx);
5182 return Context.getComplexType(ElemType);
5183 }
5184
5185 case TYPE_POINTER: {
5186 if (Record.size() != 1) {
5187 Error("Incorrect encoding of pointer type");
5188 return QualType();
5189 }
5190 QualType PointeeType = readType(*Loc.F, Record, Idx);
5191 return Context.getPointerType(PointeeType);
5192 }
5193
Reid Kleckner8a365022013-06-24 17:51:48 +00005194 case TYPE_DECAYED: {
5195 if (Record.size() != 1) {
5196 Error("Incorrect encoding of decayed type");
5197 return QualType();
5198 }
5199 QualType OriginalType = readType(*Loc.F, Record, Idx);
5200 QualType DT = Context.getAdjustedParameterType(OriginalType);
5201 if (!isa<DecayedType>(DT))
5202 Error("Decayed type does not decay");
5203 return DT;
5204 }
5205
Reid Kleckner0503a872013-12-05 01:23:43 +00005206 case TYPE_ADJUSTED: {
5207 if (Record.size() != 2) {
5208 Error("Incorrect encoding of adjusted type");
5209 return QualType();
5210 }
5211 QualType OriginalTy = readType(*Loc.F, Record, Idx);
5212 QualType AdjustedTy = readType(*Loc.F, Record, Idx);
5213 return Context.getAdjustedType(OriginalTy, AdjustedTy);
5214 }
5215
Guy Benyei11169dd2012-12-18 14:30:41 +00005216 case TYPE_BLOCK_POINTER: {
5217 if (Record.size() != 1) {
5218 Error("Incorrect encoding of block pointer type");
5219 return QualType();
5220 }
5221 QualType PointeeType = readType(*Loc.F, Record, Idx);
5222 return Context.getBlockPointerType(PointeeType);
5223 }
5224
5225 case TYPE_LVALUE_REFERENCE: {
5226 if (Record.size() != 2) {
5227 Error("Incorrect encoding of lvalue reference type");
5228 return QualType();
5229 }
5230 QualType PointeeType = readType(*Loc.F, Record, Idx);
5231 return Context.getLValueReferenceType(PointeeType, Record[1]);
5232 }
5233
5234 case TYPE_RVALUE_REFERENCE: {
5235 if (Record.size() != 1) {
5236 Error("Incorrect encoding of rvalue reference type");
5237 return QualType();
5238 }
5239 QualType PointeeType = readType(*Loc.F, Record, Idx);
5240 return Context.getRValueReferenceType(PointeeType);
5241 }
5242
5243 case TYPE_MEMBER_POINTER: {
5244 if (Record.size() != 2) {
5245 Error("Incorrect encoding of member pointer type");
5246 return QualType();
5247 }
5248 QualType PointeeType = readType(*Loc.F, Record, Idx);
5249 QualType ClassType = readType(*Loc.F, Record, Idx);
5250 if (PointeeType.isNull() || ClassType.isNull())
5251 return QualType();
5252
5253 return Context.getMemberPointerType(PointeeType, ClassType.getTypePtr());
5254 }
5255
5256 case TYPE_CONSTANT_ARRAY: {
5257 QualType ElementType = readType(*Loc.F, Record, Idx);
5258 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5259 unsigned IndexTypeQuals = Record[2];
5260 unsigned Idx = 3;
5261 llvm::APInt Size = ReadAPInt(Record, Idx);
5262 return Context.getConstantArrayType(ElementType, Size,
5263 ASM, IndexTypeQuals);
5264 }
5265
5266 case TYPE_INCOMPLETE_ARRAY: {
5267 QualType ElementType = readType(*Loc.F, Record, Idx);
5268 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5269 unsigned IndexTypeQuals = Record[2];
5270 return Context.getIncompleteArrayType(ElementType, ASM, IndexTypeQuals);
5271 }
5272
5273 case TYPE_VARIABLE_ARRAY: {
5274 QualType ElementType = readType(*Loc.F, Record, Idx);
5275 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5276 unsigned IndexTypeQuals = Record[2];
5277 SourceLocation LBLoc = ReadSourceLocation(*Loc.F, Record[3]);
5278 SourceLocation RBLoc = ReadSourceLocation(*Loc.F, Record[4]);
5279 return Context.getVariableArrayType(ElementType, ReadExpr(*Loc.F),
5280 ASM, IndexTypeQuals,
5281 SourceRange(LBLoc, RBLoc));
5282 }
5283
5284 case TYPE_VECTOR: {
5285 if (Record.size() != 3) {
5286 Error("incorrect encoding of vector type in AST file");
5287 return QualType();
5288 }
5289
5290 QualType ElementType = readType(*Loc.F, Record, Idx);
5291 unsigned NumElements = Record[1];
5292 unsigned VecKind = Record[2];
5293 return Context.getVectorType(ElementType, NumElements,
5294 (VectorType::VectorKind)VecKind);
5295 }
5296
5297 case TYPE_EXT_VECTOR: {
5298 if (Record.size() != 3) {
5299 Error("incorrect encoding of extended vector type in AST file");
5300 return QualType();
5301 }
5302
5303 QualType ElementType = readType(*Loc.F, Record, Idx);
5304 unsigned NumElements = Record[1];
5305 return Context.getExtVectorType(ElementType, NumElements);
5306 }
5307
5308 case TYPE_FUNCTION_NO_PROTO: {
5309 if (Record.size() != 6) {
5310 Error("incorrect encoding of no-proto function type");
5311 return QualType();
5312 }
5313 QualType ResultType = readType(*Loc.F, Record, Idx);
5314 FunctionType::ExtInfo Info(Record[1], Record[2], Record[3],
5315 (CallingConv)Record[4], Record[5]);
5316 return Context.getFunctionNoProtoType(ResultType, Info);
5317 }
5318
5319 case TYPE_FUNCTION_PROTO: {
5320 QualType ResultType = readType(*Loc.F, Record, Idx);
5321
5322 FunctionProtoType::ExtProtoInfo EPI;
5323 EPI.ExtInfo = FunctionType::ExtInfo(/*noreturn*/ Record[1],
5324 /*hasregparm*/ Record[2],
5325 /*regparm*/ Record[3],
5326 static_cast<CallingConv>(Record[4]),
5327 /*produces*/ Record[5]);
5328
5329 unsigned Idx = 6;
Guy Benyei11169dd2012-12-18 14:30:41 +00005330
5331 EPI.Variadic = Record[Idx++];
5332 EPI.HasTrailingReturn = Record[Idx++];
5333 EPI.TypeQuals = Record[Idx++];
5334 EPI.RefQualifier = static_cast<RefQualifierKind>(Record[Idx++]);
Richard Smith564417a2014-03-20 21:47:22 +00005335 SmallVector<QualType, 8> ExceptionStorage;
Richard Smith8acb4282014-07-31 21:57:55 +00005336 readExceptionSpec(*Loc.F, ExceptionStorage, EPI.ExceptionSpec, Record, Idx);
Richard Smith01b2cb42014-07-26 06:37:51 +00005337
5338 unsigned NumParams = Record[Idx++];
5339 SmallVector<QualType, 16> ParamTypes;
5340 for (unsigned I = 0; I != NumParams; ++I)
5341 ParamTypes.push_back(readType(*Loc.F, Record, Idx));
5342
Jordan Rose5c382722013-03-08 21:51:21 +00005343 return Context.getFunctionType(ResultType, ParamTypes, EPI);
Guy Benyei11169dd2012-12-18 14:30:41 +00005344 }
5345
5346 case TYPE_UNRESOLVED_USING: {
5347 unsigned Idx = 0;
5348 return Context.getTypeDeclType(
5349 ReadDeclAs<UnresolvedUsingTypenameDecl>(*Loc.F, Record, Idx));
5350 }
5351
5352 case TYPE_TYPEDEF: {
5353 if (Record.size() != 2) {
5354 Error("incorrect encoding of typedef type");
5355 return QualType();
5356 }
5357 unsigned Idx = 0;
5358 TypedefNameDecl *Decl = ReadDeclAs<TypedefNameDecl>(*Loc.F, Record, Idx);
5359 QualType Canonical = readType(*Loc.F, Record, Idx);
5360 if (!Canonical.isNull())
5361 Canonical = Context.getCanonicalType(Canonical);
5362 return Context.getTypedefType(Decl, Canonical);
5363 }
5364
5365 case TYPE_TYPEOF_EXPR:
5366 return Context.getTypeOfExprType(ReadExpr(*Loc.F));
5367
5368 case TYPE_TYPEOF: {
5369 if (Record.size() != 1) {
5370 Error("incorrect encoding of typeof(type) in AST file");
5371 return QualType();
5372 }
5373 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5374 return Context.getTypeOfType(UnderlyingType);
5375 }
5376
5377 case TYPE_DECLTYPE: {
5378 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5379 return Context.getDecltypeType(ReadExpr(*Loc.F), UnderlyingType);
5380 }
5381
5382 case TYPE_UNARY_TRANSFORM: {
5383 QualType BaseType = readType(*Loc.F, Record, Idx);
5384 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5385 UnaryTransformType::UTTKind UKind = (UnaryTransformType::UTTKind)Record[2];
5386 return Context.getUnaryTransformType(BaseType, UnderlyingType, UKind);
5387 }
5388
Richard Smith74aeef52013-04-26 16:15:35 +00005389 case TYPE_AUTO: {
5390 QualType Deduced = readType(*Loc.F, Record, Idx);
5391 bool IsDecltypeAuto = Record[Idx++];
Richard Smith27d807c2013-04-30 13:56:41 +00005392 bool IsDependent = Deduced.isNull() ? Record[Idx++] : false;
Manuel Klimek2fdbea22013-08-22 12:12:24 +00005393 return Context.getAutoType(Deduced, IsDecltypeAuto, IsDependent);
Richard Smith74aeef52013-04-26 16:15:35 +00005394 }
Guy Benyei11169dd2012-12-18 14:30:41 +00005395
5396 case TYPE_RECORD: {
5397 if (Record.size() != 2) {
5398 Error("incorrect encoding of record type");
5399 return QualType();
5400 }
5401 unsigned Idx = 0;
5402 bool IsDependent = Record[Idx++];
5403 RecordDecl *RD = ReadDeclAs<RecordDecl>(*Loc.F, Record, Idx);
5404 RD = cast_or_null<RecordDecl>(RD->getCanonicalDecl());
5405 QualType T = Context.getRecordType(RD);
5406 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5407 return T;
5408 }
5409
5410 case TYPE_ENUM: {
5411 if (Record.size() != 2) {
5412 Error("incorrect encoding of enum type");
5413 return QualType();
5414 }
5415 unsigned Idx = 0;
5416 bool IsDependent = Record[Idx++];
5417 QualType T
5418 = Context.getEnumType(ReadDeclAs<EnumDecl>(*Loc.F, Record, Idx));
5419 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5420 return T;
5421 }
5422
5423 case TYPE_ATTRIBUTED: {
5424 if (Record.size() != 3) {
5425 Error("incorrect encoding of attributed type");
5426 return QualType();
5427 }
5428 QualType modifiedType = readType(*Loc.F, Record, Idx);
5429 QualType equivalentType = readType(*Loc.F, Record, Idx);
5430 AttributedType::Kind kind = static_cast<AttributedType::Kind>(Record[2]);
5431 return Context.getAttributedType(kind, modifiedType, equivalentType);
5432 }
5433
5434 case TYPE_PAREN: {
5435 if (Record.size() != 1) {
5436 Error("incorrect encoding of paren type");
5437 return QualType();
5438 }
5439 QualType InnerType = readType(*Loc.F, Record, Idx);
5440 return Context.getParenType(InnerType);
5441 }
5442
5443 case TYPE_PACK_EXPANSION: {
5444 if (Record.size() != 2) {
5445 Error("incorrect encoding of pack expansion type");
5446 return QualType();
5447 }
5448 QualType Pattern = readType(*Loc.F, Record, Idx);
5449 if (Pattern.isNull())
5450 return QualType();
David Blaikie05785d12013-02-20 22:23:23 +00005451 Optional<unsigned> NumExpansions;
Guy Benyei11169dd2012-12-18 14:30:41 +00005452 if (Record[1])
5453 NumExpansions = Record[1] - 1;
5454 return Context.getPackExpansionType(Pattern, NumExpansions);
5455 }
5456
5457 case TYPE_ELABORATED: {
5458 unsigned Idx = 0;
5459 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5460 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5461 QualType NamedType = readType(*Loc.F, Record, Idx);
5462 return Context.getElaboratedType(Keyword, NNS, NamedType);
5463 }
5464
5465 case TYPE_OBJC_INTERFACE: {
5466 unsigned Idx = 0;
5467 ObjCInterfaceDecl *ItfD
5468 = ReadDeclAs<ObjCInterfaceDecl>(*Loc.F, Record, Idx);
5469 return Context.getObjCInterfaceType(ItfD->getCanonicalDecl());
5470 }
5471
5472 case TYPE_OBJC_OBJECT: {
5473 unsigned Idx = 0;
5474 QualType Base = readType(*Loc.F, Record, Idx);
5475 unsigned NumProtos = Record[Idx++];
5476 SmallVector<ObjCProtocolDecl*, 4> Protos;
5477 for (unsigned I = 0; I != NumProtos; ++I)
5478 Protos.push_back(ReadDeclAs<ObjCProtocolDecl>(*Loc.F, Record, Idx));
5479 return Context.getObjCObjectType(Base, Protos.data(), NumProtos);
5480 }
5481
5482 case TYPE_OBJC_OBJECT_POINTER: {
5483 unsigned Idx = 0;
5484 QualType Pointee = readType(*Loc.F, Record, Idx);
5485 return Context.getObjCObjectPointerType(Pointee);
5486 }
5487
5488 case TYPE_SUBST_TEMPLATE_TYPE_PARM: {
5489 unsigned Idx = 0;
5490 QualType Parm = readType(*Loc.F, Record, Idx);
5491 QualType Replacement = readType(*Loc.F, Record, Idx);
Stephan Tolksdorfe96f8b32014-03-15 10:23:27 +00005492 return Context.getSubstTemplateTypeParmType(
5493 cast<TemplateTypeParmType>(Parm),
5494 Context.getCanonicalType(Replacement));
Guy Benyei11169dd2012-12-18 14:30:41 +00005495 }
5496
5497 case TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK: {
5498 unsigned Idx = 0;
5499 QualType Parm = readType(*Loc.F, Record, Idx);
5500 TemplateArgument ArgPack = ReadTemplateArgument(*Loc.F, Record, Idx);
5501 return Context.getSubstTemplateTypeParmPackType(
5502 cast<TemplateTypeParmType>(Parm),
5503 ArgPack);
5504 }
5505
5506 case TYPE_INJECTED_CLASS_NAME: {
5507 CXXRecordDecl *D = ReadDeclAs<CXXRecordDecl>(*Loc.F, Record, Idx);
5508 QualType TST = readType(*Loc.F, Record, Idx); // probably derivable
5509 // FIXME: ASTContext::getInjectedClassNameType is not currently suitable
5510 // for AST reading, too much interdependencies.
Richard Smithf17fdbd2014-04-24 02:25:27 +00005511 const Type *T;
5512 if (const Type *Existing = D->getTypeForDecl())
5513 T = Existing;
5514 else if (auto *Prev = D->getPreviousDecl())
5515 T = Prev->getTypeForDecl();
5516 else
5517 T = new (Context, TypeAlignment) InjectedClassNameType(D, TST);
5518 return QualType(T, 0);
Guy Benyei11169dd2012-12-18 14:30:41 +00005519 }
5520
5521 case TYPE_TEMPLATE_TYPE_PARM: {
5522 unsigned Idx = 0;
5523 unsigned Depth = Record[Idx++];
5524 unsigned Index = Record[Idx++];
5525 bool Pack = Record[Idx++];
5526 TemplateTypeParmDecl *D
5527 = ReadDeclAs<TemplateTypeParmDecl>(*Loc.F, Record, Idx);
5528 return Context.getTemplateTypeParmType(Depth, Index, Pack, D);
5529 }
5530
5531 case TYPE_DEPENDENT_NAME: {
5532 unsigned Idx = 0;
5533 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5534 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5535 const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx);
5536 QualType Canon = readType(*Loc.F, Record, Idx);
5537 if (!Canon.isNull())
5538 Canon = Context.getCanonicalType(Canon);
5539 return Context.getDependentNameType(Keyword, NNS, Name, Canon);
5540 }
5541
5542 case TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION: {
5543 unsigned Idx = 0;
5544 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5545 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5546 const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx);
5547 unsigned NumArgs = Record[Idx++];
5548 SmallVector<TemplateArgument, 8> Args;
5549 Args.reserve(NumArgs);
5550 while (NumArgs--)
5551 Args.push_back(ReadTemplateArgument(*Loc.F, Record, Idx));
5552 return Context.getDependentTemplateSpecializationType(Keyword, NNS, Name,
5553 Args.size(), Args.data());
5554 }
5555
5556 case TYPE_DEPENDENT_SIZED_ARRAY: {
5557 unsigned Idx = 0;
5558
5559 // ArrayType
5560 QualType ElementType = readType(*Loc.F, Record, Idx);
5561 ArrayType::ArraySizeModifier ASM
5562 = (ArrayType::ArraySizeModifier)Record[Idx++];
5563 unsigned IndexTypeQuals = Record[Idx++];
5564
5565 // DependentSizedArrayType
5566 Expr *NumElts = ReadExpr(*Loc.F);
5567 SourceRange Brackets = ReadSourceRange(*Loc.F, Record, Idx);
5568
5569 return Context.getDependentSizedArrayType(ElementType, NumElts, ASM,
5570 IndexTypeQuals, Brackets);
5571 }
5572
5573 case TYPE_TEMPLATE_SPECIALIZATION: {
5574 unsigned Idx = 0;
5575 bool IsDependent = Record[Idx++];
5576 TemplateName Name = ReadTemplateName(*Loc.F, Record, Idx);
5577 SmallVector<TemplateArgument, 8> Args;
5578 ReadTemplateArgumentList(Args, *Loc.F, Record, Idx);
5579 QualType Underlying = readType(*Loc.F, Record, Idx);
5580 QualType T;
5581 if (Underlying.isNull())
5582 T = Context.getCanonicalTemplateSpecializationType(Name, Args.data(),
5583 Args.size());
5584 else
5585 T = Context.getTemplateSpecializationType(Name, Args.data(),
5586 Args.size(), Underlying);
5587 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5588 return T;
5589 }
5590
5591 case TYPE_ATOMIC: {
5592 if (Record.size() != 1) {
5593 Error("Incorrect encoding of atomic type");
5594 return QualType();
5595 }
5596 QualType ValueType = readType(*Loc.F, Record, Idx);
5597 return Context.getAtomicType(ValueType);
5598 }
5599 }
5600 llvm_unreachable("Invalid TypeCode!");
5601}
5602
Richard Smith564417a2014-03-20 21:47:22 +00005603void ASTReader::readExceptionSpec(ModuleFile &ModuleFile,
5604 SmallVectorImpl<QualType> &Exceptions,
Richard Smith8acb4282014-07-31 21:57:55 +00005605 FunctionProtoType::ExceptionSpecInfo &ESI,
Richard Smith564417a2014-03-20 21:47:22 +00005606 const RecordData &Record, unsigned &Idx) {
5607 ExceptionSpecificationType EST =
5608 static_cast<ExceptionSpecificationType>(Record[Idx++]);
Richard Smith8acb4282014-07-31 21:57:55 +00005609 ESI.Type = EST;
Richard Smith564417a2014-03-20 21:47:22 +00005610 if (EST == EST_Dynamic) {
Richard Smith8acb4282014-07-31 21:57:55 +00005611 for (unsigned I = 0, N = Record[Idx++]; I != N; ++I)
Richard Smith564417a2014-03-20 21:47:22 +00005612 Exceptions.push_back(readType(ModuleFile, Record, Idx));
Richard Smith8acb4282014-07-31 21:57:55 +00005613 ESI.Exceptions = Exceptions;
Richard Smith564417a2014-03-20 21:47:22 +00005614 } else if (EST == EST_ComputedNoexcept) {
Richard Smith8acb4282014-07-31 21:57:55 +00005615 ESI.NoexceptExpr = ReadExpr(ModuleFile);
Richard Smith564417a2014-03-20 21:47:22 +00005616 } else if (EST == EST_Uninstantiated) {
Richard Smith8acb4282014-07-31 21:57:55 +00005617 ESI.SourceDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
5618 ESI.SourceTemplate = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
Richard Smith564417a2014-03-20 21:47:22 +00005619 } else if (EST == EST_Unevaluated) {
Richard Smith8acb4282014-07-31 21:57:55 +00005620 ESI.SourceDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
Richard Smith564417a2014-03-20 21:47:22 +00005621 }
5622}
5623
Guy Benyei11169dd2012-12-18 14:30:41 +00005624class clang::TypeLocReader : public TypeLocVisitor<TypeLocReader> {
5625 ASTReader &Reader;
5626 ModuleFile &F;
5627 const ASTReader::RecordData &Record;
5628 unsigned &Idx;
5629
5630 SourceLocation ReadSourceLocation(const ASTReader::RecordData &R,
5631 unsigned &I) {
5632 return Reader.ReadSourceLocation(F, R, I);
5633 }
5634
5635 template<typename T>
5636 T *ReadDeclAs(const ASTReader::RecordData &Record, unsigned &Idx) {
5637 return Reader.ReadDeclAs<T>(F, Record, Idx);
5638 }
5639
5640public:
5641 TypeLocReader(ASTReader &Reader, ModuleFile &F,
5642 const ASTReader::RecordData &Record, unsigned &Idx)
5643 : Reader(Reader), F(F), Record(Record), Idx(Idx)
5644 { }
5645
5646 // We want compile-time assurance that we've enumerated all of
5647 // these, so unfortunately we have to declare them first, then
5648 // define them out-of-line.
5649#define ABSTRACT_TYPELOC(CLASS, PARENT)
5650#define TYPELOC(CLASS, PARENT) \
5651 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
5652#include "clang/AST/TypeLocNodes.def"
5653
5654 void VisitFunctionTypeLoc(FunctionTypeLoc);
5655 void VisitArrayTypeLoc(ArrayTypeLoc);
5656};
5657
5658void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
5659 // nothing to do
5660}
5661void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
5662 TL.setBuiltinLoc(ReadSourceLocation(Record, Idx));
5663 if (TL.needsExtraLocalData()) {
5664 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Record[Idx++]));
5665 TL.setWrittenSignSpec(static_cast<DeclSpec::TSS>(Record[Idx++]));
5666 TL.setWrittenWidthSpec(static_cast<DeclSpec::TSW>(Record[Idx++]));
5667 TL.setModeAttr(Record[Idx++]);
5668 }
5669}
5670void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
5671 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5672}
5673void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
5674 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5675}
Reid Kleckner8a365022013-06-24 17:51:48 +00005676void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
5677 // nothing to do
5678}
Reid Kleckner0503a872013-12-05 01:23:43 +00005679void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
5680 // nothing to do
5681}
Guy Benyei11169dd2012-12-18 14:30:41 +00005682void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
5683 TL.setCaretLoc(ReadSourceLocation(Record, Idx));
5684}
5685void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
5686 TL.setAmpLoc(ReadSourceLocation(Record, Idx));
5687}
5688void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
5689 TL.setAmpAmpLoc(ReadSourceLocation(Record, Idx));
5690}
5691void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
5692 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5693 TL.setClassTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5694}
5695void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) {
5696 TL.setLBracketLoc(ReadSourceLocation(Record, Idx));
5697 TL.setRBracketLoc(ReadSourceLocation(Record, Idx));
5698 if (Record[Idx++])
5699 TL.setSizeExpr(Reader.ReadExpr(F));
5700 else
Craig Toppera13603a2014-05-22 05:54:18 +00005701 TL.setSizeExpr(nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00005702}
5703void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) {
5704 VisitArrayTypeLoc(TL);
5705}
5706void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) {
5707 VisitArrayTypeLoc(TL);
5708}
5709void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
5710 VisitArrayTypeLoc(TL);
5711}
5712void TypeLocReader::VisitDependentSizedArrayTypeLoc(
5713 DependentSizedArrayTypeLoc TL) {
5714 VisitArrayTypeLoc(TL);
5715}
5716void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
5717 DependentSizedExtVectorTypeLoc TL) {
5718 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5719}
5720void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
5721 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5722}
5723void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
5724 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5725}
5726void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) {
5727 TL.setLocalRangeBegin(ReadSourceLocation(Record, Idx));
5728 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5729 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5730 TL.setLocalRangeEnd(ReadSourceLocation(Record, Idx));
Alp Tokerb3fd5cf2014-01-21 00:32:38 +00005731 for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) {
5732 TL.setParam(i, ReadDeclAs<ParmVarDecl>(Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00005733 }
5734}
5735void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) {
5736 VisitFunctionTypeLoc(TL);
5737}
5738void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) {
5739 VisitFunctionTypeLoc(TL);
5740}
5741void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
5742 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5743}
5744void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
5745 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5746}
5747void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
5748 TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
5749 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5750 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5751}
5752void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
5753 TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
5754 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5755 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5756 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5757}
5758void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
5759 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5760}
5761void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
5762 TL.setKWLoc(ReadSourceLocation(Record, Idx));
5763 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5764 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5765 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5766}
5767void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) {
5768 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5769}
5770void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) {
5771 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5772}
5773void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) {
5774 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5775}
5776void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
5777 TL.setAttrNameLoc(ReadSourceLocation(Record, Idx));
5778 if (TL.hasAttrOperand()) {
5779 SourceRange range;
5780 range.setBegin(ReadSourceLocation(Record, Idx));
5781 range.setEnd(ReadSourceLocation(Record, Idx));
5782 TL.setAttrOperandParensRange(range);
5783 }
5784 if (TL.hasAttrExprOperand()) {
5785 if (Record[Idx++])
5786 TL.setAttrExprOperand(Reader.ReadExpr(F));
5787 else
Craig Toppera13603a2014-05-22 05:54:18 +00005788 TL.setAttrExprOperand(nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00005789 } else if (TL.hasAttrEnumOperand())
5790 TL.setAttrEnumOperandLoc(ReadSourceLocation(Record, Idx));
5791}
5792void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
5793 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5794}
5795void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
5796 SubstTemplateTypeParmTypeLoc TL) {
5797 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5798}
5799void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
5800 SubstTemplateTypeParmPackTypeLoc TL) {
5801 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5802}
5803void TypeLocReader::VisitTemplateSpecializationTypeLoc(
5804 TemplateSpecializationTypeLoc TL) {
5805 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx));
5806 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx));
5807 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5808 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5809 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i)
5810 TL.setArgLocInfo(i,
5811 Reader.GetTemplateArgumentLocInfo(F,
5812 TL.getTypePtr()->getArg(i).getKind(),
5813 Record, Idx));
5814}
5815void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
5816 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5817 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5818}
5819void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
5820 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5821 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5822}
5823void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
5824 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5825}
5826void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
5827 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5828 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5829 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5830}
5831void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc(
5832 DependentTemplateSpecializationTypeLoc TL) {
5833 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5834 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5835 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx));
5836 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx));
5837 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5838 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5839 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
5840 TL.setArgLocInfo(I,
5841 Reader.GetTemplateArgumentLocInfo(F,
5842 TL.getTypePtr()->getArg(I).getKind(),
5843 Record, Idx));
5844}
5845void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
5846 TL.setEllipsisLoc(ReadSourceLocation(Record, Idx));
5847}
5848void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
5849 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5850}
5851void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
5852 TL.setHasBaseTypeAsWritten(Record[Idx++]);
5853 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5854 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5855 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
5856 TL.setProtocolLoc(i, ReadSourceLocation(Record, Idx));
5857}
5858void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
5859 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5860}
5861void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
5862 TL.setKWLoc(ReadSourceLocation(Record, Idx));
5863 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5864 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5865}
5866
5867TypeSourceInfo *ASTReader::GetTypeSourceInfo(ModuleFile &F,
5868 const RecordData &Record,
5869 unsigned &Idx) {
5870 QualType InfoTy = readType(F, Record, Idx);
5871 if (InfoTy.isNull())
Craig Toppera13603a2014-05-22 05:54:18 +00005872 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00005873
5874 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy);
5875 TypeLocReader TLR(*this, F, Record, Idx);
5876 for (TypeLoc TL = TInfo->getTypeLoc(); !TL.isNull(); TL = TL.getNextTypeLoc())
5877 TLR.Visit(TL);
5878 return TInfo;
5879}
5880
5881QualType ASTReader::GetType(TypeID ID) {
5882 unsigned FastQuals = ID & Qualifiers::FastMask;
5883 unsigned Index = ID >> Qualifiers::FastWidth;
5884
5885 if (Index < NUM_PREDEF_TYPE_IDS) {
5886 QualType T;
5887 switch ((PredefinedTypeIDs)Index) {
5888 case PREDEF_TYPE_NULL_ID: return QualType();
5889 case PREDEF_TYPE_VOID_ID: T = Context.VoidTy; break;
5890 case PREDEF_TYPE_BOOL_ID: T = Context.BoolTy; break;
5891
5892 case PREDEF_TYPE_CHAR_U_ID:
5893 case PREDEF_TYPE_CHAR_S_ID:
5894 // FIXME: Check that the signedness of CharTy is correct!
5895 T = Context.CharTy;
5896 break;
5897
5898 case PREDEF_TYPE_UCHAR_ID: T = Context.UnsignedCharTy; break;
5899 case PREDEF_TYPE_USHORT_ID: T = Context.UnsignedShortTy; break;
5900 case PREDEF_TYPE_UINT_ID: T = Context.UnsignedIntTy; break;
5901 case PREDEF_TYPE_ULONG_ID: T = Context.UnsignedLongTy; break;
5902 case PREDEF_TYPE_ULONGLONG_ID: T = Context.UnsignedLongLongTy; break;
5903 case PREDEF_TYPE_UINT128_ID: T = Context.UnsignedInt128Ty; break;
5904 case PREDEF_TYPE_SCHAR_ID: T = Context.SignedCharTy; break;
5905 case PREDEF_TYPE_WCHAR_ID: T = Context.WCharTy; break;
5906 case PREDEF_TYPE_SHORT_ID: T = Context.ShortTy; break;
5907 case PREDEF_TYPE_INT_ID: T = Context.IntTy; break;
5908 case PREDEF_TYPE_LONG_ID: T = Context.LongTy; break;
5909 case PREDEF_TYPE_LONGLONG_ID: T = Context.LongLongTy; break;
5910 case PREDEF_TYPE_INT128_ID: T = Context.Int128Ty; break;
5911 case PREDEF_TYPE_HALF_ID: T = Context.HalfTy; break;
5912 case PREDEF_TYPE_FLOAT_ID: T = Context.FloatTy; break;
5913 case PREDEF_TYPE_DOUBLE_ID: T = Context.DoubleTy; break;
5914 case PREDEF_TYPE_LONGDOUBLE_ID: T = Context.LongDoubleTy; break;
5915 case PREDEF_TYPE_OVERLOAD_ID: T = Context.OverloadTy; break;
5916 case PREDEF_TYPE_BOUND_MEMBER: T = Context.BoundMemberTy; break;
5917 case PREDEF_TYPE_PSEUDO_OBJECT: T = Context.PseudoObjectTy; break;
5918 case PREDEF_TYPE_DEPENDENT_ID: T = Context.DependentTy; break;
5919 case PREDEF_TYPE_UNKNOWN_ANY: T = Context.UnknownAnyTy; break;
5920 case PREDEF_TYPE_NULLPTR_ID: T = Context.NullPtrTy; break;
5921 case PREDEF_TYPE_CHAR16_ID: T = Context.Char16Ty; break;
5922 case PREDEF_TYPE_CHAR32_ID: T = Context.Char32Ty; break;
5923 case PREDEF_TYPE_OBJC_ID: T = Context.ObjCBuiltinIdTy; break;
5924 case PREDEF_TYPE_OBJC_CLASS: T = Context.ObjCBuiltinClassTy; break;
5925 case PREDEF_TYPE_OBJC_SEL: T = Context.ObjCBuiltinSelTy; break;
Guy Benyeid8a08ea2012-12-18 14:38:23 +00005926 case PREDEF_TYPE_IMAGE1D_ID: T = Context.OCLImage1dTy; break;
5927 case PREDEF_TYPE_IMAGE1D_ARR_ID: T = Context.OCLImage1dArrayTy; break;
5928 case PREDEF_TYPE_IMAGE1D_BUFF_ID: T = Context.OCLImage1dBufferTy; break;
5929 case PREDEF_TYPE_IMAGE2D_ID: T = Context.OCLImage2dTy; break;
5930 case PREDEF_TYPE_IMAGE2D_ARR_ID: T = Context.OCLImage2dArrayTy; break;
5931 case PREDEF_TYPE_IMAGE3D_ID: T = Context.OCLImage3dTy; break;
Guy Benyei61054192013-02-07 10:55:47 +00005932 case PREDEF_TYPE_SAMPLER_ID: T = Context.OCLSamplerTy; break;
Guy Benyei1b4fb3e2013-01-20 12:31:11 +00005933 case PREDEF_TYPE_EVENT_ID: T = Context.OCLEventTy; break;
Guy Benyei11169dd2012-12-18 14:30:41 +00005934 case PREDEF_TYPE_AUTO_DEDUCT: T = Context.getAutoDeductType(); break;
5935
5936 case PREDEF_TYPE_AUTO_RREF_DEDUCT:
5937 T = Context.getAutoRRefDeductType();
5938 break;
5939
5940 case PREDEF_TYPE_ARC_UNBRIDGED_CAST:
5941 T = Context.ARCUnbridgedCastTy;
5942 break;
5943
5944 case PREDEF_TYPE_VA_LIST_TAG:
5945 T = Context.getVaListTagType();
5946 break;
5947
5948 case PREDEF_TYPE_BUILTIN_FN:
5949 T = Context.BuiltinFnTy;
5950 break;
5951 }
5952
5953 assert(!T.isNull() && "Unknown predefined type");
5954 return T.withFastQualifiers(FastQuals);
5955 }
5956
5957 Index -= NUM_PREDEF_TYPE_IDS;
5958 assert(Index < TypesLoaded.size() && "Type index out-of-range");
5959 if (TypesLoaded[Index].isNull()) {
5960 TypesLoaded[Index] = readTypeRecord(Index);
5961 if (TypesLoaded[Index].isNull())
5962 return QualType();
5963
5964 TypesLoaded[Index]->setFromAST();
5965 if (DeserializationListener)
5966 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID),
5967 TypesLoaded[Index]);
5968 }
5969
5970 return TypesLoaded[Index].withFastQualifiers(FastQuals);
5971}
5972
5973QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) {
5974 return GetType(getGlobalTypeID(F, LocalID));
5975}
5976
5977serialization::TypeID
5978ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const {
5979 unsigned FastQuals = LocalID & Qualifiers::FastMask;
5980 unsigned LocalIndex = LocalID >> Qualifiers::FastWidth;
5981
5982 if (LocalIndex < NUM_PREDEF_TYPE_IDS)
5983 return LocalID;
5984
5985 ContinuousRangeMap<uint32_t, int, 2>::iterator I
5986 = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS);
5987 assert(I != F.TypeRemap.end() && "Invalid index into type index remap");
5988
5989 unsigned GlobalIndex = LocalIndex + I->second;
5990 return (GlobalIndex << Qualifiers::FastWidth) | FastQuals;
5991}
5992
5993TemplateArgumentLocInfo
5994ASTReader::GetTemplateArgumentLocInfo(ModuleFile &F,
5995 TemplateArgument::ArgKind Kind,
5996 const RecordData &Record,
5997 unsigned &Index) {
5998 switch (Kind) {
5999 case TemplateArgument::Expression:
6000 return ReadExpr(F);
6001 case TemplateArgument::Type:
6002 return GetTypeSourceInfo(F, Record, Index);
6003 case TemplateArgument::Template: {
6004 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
6005 Index);
6006 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
6007 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
6008 SourceLocation());
6009 }
6010 case TemplateArgument::TemplateExpansion: {
6011 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
6012 Index);
6013 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
6014 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Index);
6015 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
6016 EllipsisLoc);
6017 }
6018 case TemplateArgument::Null:
6019 case TemplateArgument::Integral:
6020 case TemplateArgument::Declaration:
6021 case TemplateArgument::NullPtr:
6022 case TemplateArgument::Pack:
6023 // FIXME: Is this right?
6024 return TemplateArgumentLocInfo();
6025 }
6026 llvm_unreachable("unexpected template argument loc");
6027}
6028
6029TemplateArgumentLoc
6030ASTReader::ReadTemplateArgumentLoc(ModuleFile &F,
6031 const RecordData &Record, unsigned &Index) {
6032 TemplateArgument Arg = ReadTemplateArgument(F, Record, Index);
6033
6034 if (Arg.getKind() == TemplateArgument::Expression) {
6035 if (Record[Index++]) // bool InfoHasSameExpr.
6036 return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr()));
6037 }
6038 return TemplateArgumentLoc(Arg, GetTemplateArgumentLocInfo(F, Arg.getKind(),
6039 Record, Index));
6040}
6041
Enea Zaffanella6dbe1872013-08-10 07:24:53 +00006042const ASTTemplateArgumentListInfo*
6043ASTReader::ReadASTTemplateArgumentListInfo(ModuleFile &F,
6044 const RecordData &Record,
6045 unsigned &Index) {
6046 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Index);
6047 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Index);
6048 unsigned NumArgsAsWritten = Record[Index++];
6049 TemplateArgumentListInfo TemplArgsInfo(LAngleLoc, RAngleLoc);
6050 for (unsigned i = 0; i != NumArgsAsWritten; ++i)
6051 TemplArgsInfo.addArgument(ReadTemplateArgumentLoc(F, Record, Index));
6052 return ASTTemplateArgumentListInfo::Create(getContext(), TemplArgsInfo);
6053}
6054
Guy Benyei11169dd2012-12-18 14:30:41 +00006055Decl *ASTReader::GetExternalDecl(uint32_t ID) {
6056 return GetDecl(ID);
6057}
6058
Richard Smith053f6c62014-05-16 23:01:30 +00006059void ASTReader::CompleteRedeclChain(const Decl *D) {
Richard Smith851072e2014-05-19 20:59:20 +00006060 if (NumCurrentElementsDeserializing) {
6061 // We arrange to not care about the complete redeclaration chain while we're
6062 // deserializing. Just remember that the AST has marked this one as complete
6063 // but that it's not actually complete yet, so we know we still need to
6064 // complete it later.
6065 PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D));
6066 return;
6067 }
6068
Richard Smith053f6c62014-05-16 23:01:30 +00006069 const DeclContext *DC = D->getDeclContext()->getRedeclContext();
6070
Richard Smith053f6c62014-05-16 23:01:30 +00006071 // If this is a named declaration, complete it by looking it up
6072 // within its context.
6073 //
Richard Smith01bdb7a2014-08-28 05:44:07 +00006074 // FIXME: Merging a function definition should merge
Richard Smith053f6c62014-05-16 23:01:30 +00006075 // all mergeable entities within it.
6076 if (isa<TranslationUnitDecl>(DC) || isa<NamespaceDecl>(DC) ||
6077 isa<CXXRecordDecl>(DC) || isa<EnumDecl>(DC)) {
6078 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) {
6079 auto *II = Name.getAsIdentifierInfo();
6080 if (isa<TranslationUnitDecl>(DC) && II) {
6081 // Outside of C++, we don't have a lookup table for the TU, so update
6082 // the identifier instead. In C++, either way should work fine.
6083 if (II->isOutOfDate())
6084 updateOutOfDateIdentifier(*II);
6085 } else
6086 DC->lookup(Name);
Richard Smith01bdb7a2014-08-28 05:44:07 +00006087 } else if (needsAnonymousDeclarationNumber(cast<NamedDecl>(D))) {
6088 // FIXME: It'd be nice to do something a bit more targeted here.
6089 D->getDeclContext()->decls_begin();
Richard Smith053f6c62014-05-16 23:01:30 +00006090 }
6091 }
6092}
6093
Richard Smithcd45dbc2014-04-19 03:48:30 +00006094uint64_t ASTReader::readCXXBaseSpecifiers(ModuleFile &M,
6095 const RecordData &Record,
6096 unsigned &Idx) {
6097 if (Idx >= Record.size() || Record[Idx] > M.LocalNumCXXBaseSpecifiers) {
6098 Error("malformed AST file: missing C++ base specifier");
Guy Benyei11169dd2012-12-18 14:30:41 +00006099 return 0;
Richard Smithcd45dbc2014-04-19 03:48:30 +00006100 }
6101
Guy Benyei11169dd2012-12-18 14:30:41 +00006102 unsigned LocalID = Record[Idx++];
6103 return getGlobalBitOffset(M, M.CXXBaseSpecifiersOffsets[LocalID - 1]);
6104}
6105
6106CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) {
6107 RecordLocation Loc = getLocalBitOffset(Offset);
Chris Lattner7fb3bef2013-01-20 00:56:42 +00006108 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00006109 SavedStreamPosition SavedPosition(Cursor);
6110 Cursor.JumpToBit(Loc.Offset);
6111 ReadingKindTracker ReadingKind(Read_Decl, *this);
6112 RecordData Record;
6113 unsigned Code = Cursor.ReadCode();
Chris Lattner0e6c9402013-01-20 02:38:54 +00006114 unsigned RecCode = Cursor.readRecord(Code, Record);
Guy Benyei11169dd2012-12-18 14:30:41 +00006115 if (RecCode != DECL_CXX_BASE_SPECIFIERS) {
Richard Smithcd45dbc2014-04-19 03:48:30 +00006116 Error("malformed AST file: missing C++ base specifiers");
Craig Toppera13603a2014-05-22 05:54:18 +00006117 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00006118 }
6119
6120 unsigned Idx = 0;
6121 unsigned NumBases = Record[Idx++];
6122 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases);
6123 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases];
6124 for (unsigned I = 0; I != NumBases; ++I)
6125 Bases[I] = ReadCXXBaseSpecifier(*Loc.F, Record, Idx);
6126 return Bases;
6127}
6128
6129serialization::DeclID
6130ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const {
6131 if (LocalID < NUM_PREDEF_DECL_IDS)
6132 return LocalID;
6133
6134 ContinuousRangeMap<uint32_t, int, 2>::iterator I
6135 = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS);
6136 assert(I != F.DeclRemap.end() && "Invalid index into decl index remap");
6137
6138 return LocalID + I->second;
6139}
6140
6141bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID,
6142 ModuleFile &M) const {
6143 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(ID);
6144 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6145 return &M == I->second;
6146}
6147
Douglas Gregor9f782892013-01-21 15:25:38 +00006148ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) {
Guy Benyei11169dd2012-12-18 14:30:41 +00006149 if (!D->isFromASTFile())
Craig Toppera13603a2014-05-22 05:54:18 +00006150 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00006151 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID());
6152 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6153 return I->second;
6154}
6155
6156SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) {
6157 if (ID < NUM_PREDEF_DECL_IDS)
6158 return SourceLocation();
Richard Smithcd45dbc2014-04-19 03:48:30 +00006159
Guy Benyei11169dd2012-12-18 14:30:41 +00006160 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6161
6162 if (Index > DeclsLoaded.size()) {
6163 Error("declaration ID out-of-range for AST file");
6164 return SourceLocation();
6165 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00006166
Guy Benyei11169dd2012-12-18 14:30:41 +00006167 if (Decl *D = DeclsLoaded[Index])
6168 return D->getLocation();
6169
6170 unsigned RawLocation = 0;
6171 RecordLocation Rec = DeclCursorForID(ID, RawLocation);
6172 return ReadSourceLocation(*Rec.F, RawLocation);
6173}
6174
Richard Smithcd45dbc2014-04-19 03:48:30 +00006175Decl *ASTReader::GetExistingDecl(DeclID ID) {
6176 if (ID < NUM_PREDEF_DECL_IDS) {
Guy Benyei11169dd2012-12-18 14:30:41 +00006177 switch ((PredefinedDeclIDs)ID) {
6178 case PREDEF_DECL_NULL_ID:
Craig Toppera13603a2014-05-22 05:54:18 +00006179 return nullptr;
Richard Smithcd45dbc2014-04-19 03:48:30 +00006180
Guy Benyei11169dd2012-12-18 14:30:41 +00006181 case PREDEF_DECL_TRANSLATION_UNIT_ID:
6182 return Context.getTranslationUnitDecl();
Richard Smithcd45dbc2014-04-19 03:48:30 +00006183
Guy Benyei11169dd2012-12-18 14:30:41 +00006184 case PREDEF_DECL_OBJC_ID_ID:
6185 return Context.getObjCIdDecl();
6186
6187 case PREDEF_DECL_OBJC_SEL_ID:
6188 return Context.getObjCSelDecl();
6189
6190 case PREDEF_DECL_OBJC_CLASS_ID:
6191 return Context.getObjCClassDecl();
Richard Smithcd45dbc2014-04-19 03:48:30 +00006192
Guy Benyei11169dd2012-12-18 14:30:41 +00006193 case PREDEF_DECL_OBJC_PROTOCOL_ID:
6194 return Context.getObjCProtocolDecl();
Richard Smithcd45dbc2014-04-19 03:48:30 +00006195
Guy Benyei11169dd2012-12-18 14:30:41 +00006196 case PREDEF_DECL_INT_128_ID:
6197 return Context.getInt128Decl();
6198
6199 case PREDEF_DECL_UNSIGNED_INT_128_ID:
6200 return Context.getUInt128Decl();
Richard Smithcd45dbc2014-04-19 03:48:30 +00006201
Guy Benyei11169dd2012-12-18 14:30:41 +00006202 case PREDEF_DECL_OBJC_INSTANCETYPE_ID:
6203 return Context.getObjCInstanceTypeDecl();
6204
6205 case PREDEF_DECL_BUILTIN_VA_LIST_ID:
6206 return Context.getBuiltinVaListDecl();
6207 }
6208 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00006209
Guy Benyei11169dd2012-12-18 14:30:41 +00006210 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;
Guy Benyei11169dd2012-12-18 14:30:41 +00006216 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00006217
6218 return DeclsLoaded[Index];
6219}
6220
6221Decl *ASTReader::GetDecl(DeclID ID) {
6222 if (ID < NUM_PREDEF_DECL_IDS)
6223 return GetExistingDecl(ID);
6224
6225 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6226
6227 if (Index >= DeclsLoaded.size()) {
6228 assert(0 && "declaration ID out-of-range for AST file");
6229 Error("declaration ID out-of-range for AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00006230 return nullptr;
Richard Smithcd45dbc2014-04-19 03:48:30 +00006231 }
6232
Guy Benyei11169dd2012-12-18 14:30:41 +00006233 if (!DeclsLoaded[Index]) {
6234 ReadDeclRecord(ID);
6235 if (DeserializationListener)
6236 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
6237 }
6238
6239 return DeclsLoaded[Index];
6240}
6241
6242DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M,
6243 DeclID GlobalID) {
6244 if (GlobalID < NUM_PREDEF_DECL_IDS)
6245 return GlobalID;
6246
6247 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID);
6248 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6249 ModuleFile *Owner = I->second;
6250
6251 llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos
6252 = M.GlobalToLocalDeclIDs.find(Owner);
6253 if (Pos == M.GlobalToLocalDeclIDs.end())
6254 return 0;
6255
6256 return GlobalID - Owner->BaseDeclID + Pos->second;
6257}
6258
6259serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F,
6260 const RecordData &Record,
6261 unsigned &Idx) {
6262 if (Idx >= Record.size()) {
6263 Error("Corrupted AST file");
6264 return 0;
6265 }
6266
6267 return getGlobalDeclID(F, Record[Idx++]);
6268}
6269
6270/// \brief Resolve the offset of a statement into a statement.
6271///
6272/// This operation will read a new statement from the external
6273/// source each time it is called, and is meant to be used via a
6274/// LazyOffsetPtr (which is used by Decls for the body of functions, etc).
6275Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) {
6276 // Switch case IDs are per Decl.
6277 ClearSwitchCaseIDs();
6278
6279 // Offset here is a global offset across the entire chain.
6280 RecordLocation Loc = getLocalBitOffset(Offset);
6281 Loc.F->DeclsCursor.JumpToBit(Loc.Offset);
6282 return ReadStmtFromStream(*Loc.F);
6283}
6284
6285namespace {
6286 class FindExternalLexicalDeclsVisitor {
6287 ASTReader &Reader;
6288 const DeclContext *DC;
6289 bool (*isKindWeWant)(Decl::Kind);
6290
6291 SmallVectorImpl<Decl*> &Decls;
6292 bool PredefsVisited[NUM_PREDEF_DECL_IDS];
6293
6294 public:
6295 FindExternalLexicalDeclsVisitor(ASTReader &Reader, const DeclContext *DC,
6296 bool (*isKindWeWant)(Decl::Kind),
6297 SmallVectorImpl<Decl*> &Decls)
6298 : Reader(Reader), DC(DC), isKindWeWant(isKindWeWant), Decls(Decls)
6299 {
6300 for (unsigned I = 0; I != NUM_PREDEF_DECL_IDS; ++I)
6301 PredefsVisited[I] = false;
6302 }
6303
6304 static bool visit(ModuleFile &M, bool Preorder, void *UserData) {
6305 if (Preorder)
6306 return false;
6307
6308 FindExternalLexicalDeclsVisitor *This
6309 = static_cast<FindExternalLexicalDeclsVisitor *>(UserData);
6310
6311 ModuleFile::DeclContextInfosMap::iterator Info
6312 = M.DeclContextInfos.find(This->DC);
6313 if (Info == M.DeclContextInfos.end() || !Info->second.LexicalDecls)
6314 return false;
6315
6316 // Load all of the declaration IDs
6317 for (const KindDeclIDPair *ID = Info->second.LexicalDecls,
6318 *IDE = ID + Info->second.NumLexicalDecls;
6319 ID != IDE; ++ID) {
6320 if (This->isKindWeWant && !This->isKindWeWant((Decl::Kind)ID->first))
6321 continue;
6322
6323 // Don't add predefined declarations to the lexical context more
6324 // than once.
6325 if (ID->second < NUM_PREDEF_DECL_IDS) {
6326 if (This->PredefsVisited[ID->second])
6327 continue;
6328
6329 This->PredefsVisited[ID->second] = true;
6330 }
6331
6332 if (Decl *D = This->Reader.GetLocalDecl(M, ID->second)) {
6333 if (!This->DC->isDeclInLexicalTraversal(D))
6334 This->Decls.push_back(D);
6335 }
6336 }
6337
6338 return false;
6339 }
6340 };
6341}
6342
6343ExternalLoadResult ASTReader::FindExternalLexicalDecls(const DeclContext *DC,
6344 bool (*isKindWeWant)(Decl::Kind),
6345 SmallVectorImpl<Decl*> &Decls) {
6346 // There might be lexical decls in multiple modules, for the TU at
6347 // least. Walk all of the modules in the order they were loaded.
6348 FindExternalLexicalDeclsVisitor Visitor(*this, DC, isKindWeWant, Decls);
6349 ModuleMgr.visitDepthFirst(&FindExternalLexicalDeclsVisitor::visit, &Visitor);
6350 ++NumLexicalDeclContextsRead;
6351 return ELR_Success;
6352}
6353
6354namespace {
6355
6356class DeclIDComp {
6357 ASTReader &Reader;
6358 ModuleFile &Mod;
6359
6360public:
6361 DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {}
6362
6363 bool operator()(LocalDeclID L, LocalDeclID R) const {
6364 SourceLocation LHS = getLocation(L);
6365 SourceLocation RHS = getLocation(R);
6366 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6367 }
6368
6369 bool operator()(SourceLocation LHS, LocalDeclID R) const {
6370 SourceLocation RHS = getLocation(R);
6371 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6372 }
6373
6374 bool operator()(LocalDeclID L, SourceLocation RHS) const {
6375 SourceLocation LHS = getLocation(L);
6376 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6377 }
6378
6379 SourceLocation getLocation(LocalDeclID ID) const {
6380 return Reader.getSourceManager().getFileLoc(
6381 Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID)));
6382 }
6383};
6384
6385}
6386
6387void ASTReader::FindFileRegionDecls(FileID File,
6388 unsigned Offset, unsigned Length,
6389 SmallVectorImpl<Decl *> &Decls) {
6390 SourceManager &SM = getSourceManager();
6391
6392 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File);
6393 if (I == FileDeclIDs.end())
6394 return;
6395
6396 FileDeclsInfo &DInfo = I->second;
6397 if (DInfo.Decls.empty())
6398 return;
6399
6400 SourceLocation
6401 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset);
6402 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length);
6403
6404 DeclIDComp DIDComp(*this, *DInfo.Mod);
6405 ArrayRef<serialization::LocalDeclID>::iterator
6406 BeginIt = std::lower_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
6407 BeginLoc, DIDComp);
6408 if (BeginIt != DInfo.Decls.begin())
6409 --BeginIt;
6410
6411 // If we are pointing at a top-level decl inside an objc container, we need
6412 // to backtrack until we find it otherwise we will fail to report that the
6413 // region overlaps with an objc container.
6414 while (BeginIt != DInfo.Decls.begin() &&
6415 GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt))
6416 ->isTopLevelDeclInObjCContainer())
6417 --BeginIt;
6418
6419 ArrayRef<serialization::LocalDeclID>::iterator
6420 EndIt = std::upper_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
6421 EndLoc, DIDComp);
6422 if (EndIt != DInfo.Decls.end())
6423 ++EndIt;
6424
6425 for (ArrayRef<serialization::LocalDeclID>::iterator
6426 DIt = BeginIt; DIt != EndIt; ++DIt)
6427 Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt)));
6428}
6429
6430namespace {
6431 /// \brief ModuleFile visitor used to perform name lookup into a
6432 /// declaration context.
6433 class DeclContextNameLookupVisitor {
6434 ASTReader &Reader;
Richard Smith8c913ec2014-08-14 02:21:01 +00006435 ArrayRef<const DeclContext *> Contexts;
Guy Benyei11169dd2012-12-18 14:30:41 +00006436 DeclarationName Name;
6437 SmallVectorImpl<NamedDecl *> &Decls;
6438
6439 public:
Richard Smith8c913ec2014-08-14 02:21:01 +00006440 DeclContextNameLookupVisitor(ASTReader &Reader,
6441 ArrayRef<const DeclContext *> Contexts,
Guy Benyei11169dd2012-12-18 14:30:41 +00006442 DeclarationName Name,
6443 SmallVectorImpl<NamedDecl *> &Decls)
6444 : Reader(Reader), Contexts(Contexts), Name(Name), Decls(Decls) { }
6445
6446 static bool visit(ModuleFile &M, void *UserData) {
6447 DeclContextNameLookupVisitor *This
6448 = static_cast<DeclContextNameLookupVisitor *>(UserData);
6449
6450 // Check whether we have any visible declaration information for
6451 // this context in this module.
6452 ModuleFile::DeclContextInfosMap::iterator Info;
6453 bool FoundInfo = false;
Richard Smith8c913ec2014-08-14 02:21:01 +00006454 for (auto *DC : This->Contexts) {
6455 Info = M.DeclContextInfos.find(DC);
6456 if (Info != M.DeclContextInfos.end() &&
Guy Benyei11169dd2012-12-18 14:30:41 +00006457 Info->second.NameLookupTableData) {
6458 FoundInfo = true;
6459 break;
6460 }
6461 }
6462
6463 if (!FoundInfo)
6464 return false;
Richard Smith8c913ec2014-08-14 02:21:01 +00006465
Guy Benyei11169dd2012-12-18 14:30:41 +00006466 // Look for this name within this module.
Richard Smith52e3fba2014-03-11 07:17:35 +00006467 ASTDeclContextNameLookupTable *LookupTable =
Guy Benyei11169dd2012-12-18 14:30:41 +00006468 Info->second.NameLookupTableData;
6469 ASTDeclContextNameLookupTable::iterator Pos
6470 = LookupTable->find(This->Name);
6471 if (Pos == LookupTable->end())
6472 return false;
6473
6474 bool FoundAnything = false;
6475 ASTDeclContextNameLookupTrait::data_type Data = *Pos;
6476 for (; Data.first != Data.second; ++Data.first) {
6477 NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M, *Data.first);
6478 if (!ND)
6479 continue;
6480
6481 if (ND->getDeclName() != This->Name) {
6482 // A name might be null because the decl's redeclarable part is
6483 // currently read before reading its name. The lookup is triggered by
6484 // building that decl (likely indirectly), and so it is later in the
6485 // sense of "already existing" and can be ignored here.
Richard Smith8c913ec2014-08-14 02:21:01 +00006486 // FIXME: This should not happen; deserializing declarations should
6487 // not perform lookups since that can lead to deserialization cycles.
Guy Benyei11169dd2012-12-18 14:30:41 +00006488 continue;
6489 }
Richard Smith8c913ec2014-08-14 02:21:01 +00006490
Guy Benyei11169dd2012-12-18 14:30:41 +00006491 // Record this declaration.
6492 FoundAnything = true;
6493 This->Decls.push_back(ND);
6494 }
6495
6496 return FoundAnything;
6497 }
6498 };
6499}
6500
Douglas Gregor9f782892013-01-21 15:25:38 +00006501/// \brief Retrieve the "definitive" module file for the definition of the
6502/// given declaration context, if there is one.
6503///
6504/// The "definitive" module file is the only place where we need to look to
6505/// find information about the declarations within the given declaration
6506/// context. For example, C++ and Objective-C classes, C structs/unions, and
6507/// Objective-C protocols, categories, and extensions are all defined in a
6508/// single place in the source code, so they have definitive module files
6509/// associated with them. C++ namespaces, on the other hand, can have
6510/// definitions in multiple different module files.
6511///
6512/// Note: this needs to be kept in sync with ASTWriter::AddedVisibleDecl's
6513/// NDEBUG checking.
6514static ModuleFile *getDefinitiveModuleFileFor(const DeclContext *DC,
6515 ASTReader &Reader) {
Douglas Gregor7a6e2002013-01-22 17:08:30 +00006516 if (const DeclContext *DefDC = getDefinitiveDeclContext(DC))
6517 return Reader.getOwningModuleFile(cast<Decl>(DefDC));
Douglas Gregor9f782892013-01-21 15:25:38 +00006518
Craig Toppera13603a2014-05-22 05:54:18 +00006519 return nullptr;
Douglas Gregor9f782892013-01-21 15:25:38 +00006520}
6521
Richard Smith9ce12e32013-02-07 03:30:24 +00006522bool
Guy Benyei11169dd2012-12-18 14:30:41 +00006523ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC,
6524 DeclarationName Name) {
6525 assert(DC->hasExternalVisibleStorage() &&
6526 "DeclContext has no visible decls in storage");
6527 if (!Name)
Richard Smith9ce12e32013-02-07 03:30:24 +00006528 return false;
Guy Benyei11169dd2012-12-18 14:30:41 +00006529
Richard Smith8c913ec2014-08-14 02:21:01 +00006530 Deserializing LookupResults(this);
6531
Guy Benyei11169dd2012-12-18 14:30:41 +00006532 SmallVector<NamedDecl *, 64> Decls;
Richard Smith8c913ec2014-08-14 02:21:01 +00006533
Guy Benyei11169dd2012-12-18 14:30:41 +00006534 // Compute the declaration contexts we need to look into. Multiple such
6535 // declaration contexts occur when two declaration contexts from disjoint
6536 // modules get merged, e.g., when two namespaces with the same name are
6537 // independently defined in separate modules.
6538 SmallVector<const DeclContext *, 2> Contexts;
6539 Contexts.push_back(DC);
Richard Smith8c913ec2014-08-14 02:21:01 +00006540
Guy Benyei11169dd2012-12-18 14:30:41 +00006541 if (DC->isNamespace()) {
Richard Smithcd45dbc2014-04-19 03:48:30 +00006542 auto Merged = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC)));
Guy Benyei11169dd2012-12-18 14:30:41 +00006543 if (Merged != MergedDecls.end()) {
6544 for (unsigned I = 0, N = Merged->second.size(); I != N; ++I)
6545 Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I])));
6546 }
6547 }
Richard Smith8c913ec2014-08-14 02:21:01 +00006548
6549 auto LookUpInContexts = [&](ArrayRef<const DeclContext*> Contexts) {
6550 DeclContextNameLookupVisitor Visitor(*this, Contexts, Name, Decls);
6551
6552 // If we can definitively determine which module file to look into,
6553 // only look there. Otherwise, look in all module files.
6554 ModuleFile *Definitive;
6555 if (Contexts.size() == 1 &&
6556 (Definitive = getDefinitiveModuleFileFor(Contexts[0], *this))) {
6557 DeclContextNameLookupVisitor::visit(*Definitive, &Visitor);
6558 } else {
6559 ModuleMgr.visit(&DeclContextNameLookupVisitor::visit, &Visitor);
6560 }
6561 };
6562
6563 LookUpInContexts(Contexts);
6564
6565 // If this might be an implicit special member function, then also search
6566 // all merged definitions of the surrounding class. We need to search them
6567 // individually, because finding an entity in one of them doesn't imply that
6568 // we can't find a different entity in another one.
Richard Smithcd45dbc2014-04-19 03:48:30 +00006569 if (isa<CXXRecordDecl>(DC)) {
Richard Smith8c913ec2014-08-14 02:21:01 +00006570 auto Kind = Name.getNameKind();
6571 if (Kind == DeclarationName::CXXConstructorName ||
6572 Kind == DeclarationName::CXXDestructorName ||
6573 (Kind == DeclarationName::CXXOperatorName &&
6574 Name.getCXXOverloadedOperator() == OO_Equal)) {
6575 auto Merged = MergedLookups.find(DC);
6576 if (Merged != MergedLookups.end())
6577 for (auto *MergedDC : Merged->second)
6578 LookUpInContexts(MergedDC);
6579 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00006580 }
6581
Guy Benyei11169dd2012-12-18 14:30:41 +00006582 ++NumVisibleDeclContextsRead;
6583 SetExternalVisibleDeclsForName(DC, Name, Decls);
Richard Smith9ce12e32013-02-07 03:30:24 +00006584 return !Decls.empty();
Guy Benyei11169dd2012-12-18 14:30:41 +00006585}
6586
6587namespace {
6588 /// \brief ModuleFile visitor used to retrieve all visible names in a
6589 /// declaration context.
6590 class DeclContextAllNamesVisitor {
6591 ASTReader &Reader;
Dmitri Gribenkof8579502013-01-12 19:30:44 +00006592 SmallVectorImpl<const DeclContext *> &Contexts;
Craig Topper3598eb72013-07-05 04:43:31 +00006593 DeclsMap &Decls;
Argyrios Kyrtzidis2810e9d2012-12-19 22:21:18 +00006594 bool VisitAll;
Guy Benyei11169dd2012-12-18 14:30:41 +00006595
6596 public:
6597 DeclContextAllNamesVisitor(ASTReader &Reader,
6598 SmallVectorImpl<const DeclContext *> &Contexts,
Craig Topper3598eb72013-07-05 04:43:31 +00006599 DeclsMap &Decls, bool VisitAll)
Argyrios Kyrtzidis2810e9d2012-12-19 22:21:18 +00006600 : Reader(Reader), Contexts(Contexts), Decls(Decls), VisitAll(VisitAll) { }
Guy Benyei11169dd2012-12-18 14:30:41 +00006601
6602 static bool visit(ModuleFile &M, void *UserData) {
6603 DeclContextAllNamesVisitor *This
6604 = static_cast<DeclContextAllNamesVisitor *>(UserData);
6605
6606 // Check whether we have any visible declaration information for
6607 // this context in this module.
6608 ModuleFile::DeclContextInfosMap::iterator Info;
6609 bool FoundInfo = false;
6610 for (unsigned I = 0, N = This->Contexts.size(); I != N; ++I) {
6611 Info = M.DeclContextInfos.find(This->Contexts[I]);
6612 if (Info != M.DeclContextInfos.end() &&
6613 Info->second.NameLookupTableData) {
6614 FoundInfo = true;
6615 break;
6616 }
6617 }
6618
6619 if (!FoundInfo)
6620 return false;
6621
Richard Smith52e3fba2014-03-11 07:17:35 +00006622 ASTDeclContextNameLookupTable *LookupTable =
Guy Benyei11169dd2012-12-18 14:30:41 +00006623 Info->second.NameLookupTableData;
6624 bool FoundAnything = false;
6625 for (ASTDeclContextNameLookupTable::data_iterator
Douglas Gregor5e306b12013-01-23 22:38:11 +00006626 I = LookupTable->data_begin(), E = LookupTable->data_end();
6627 I != E;
6628 ++I) {
Guy Benyei11169dd2012-12-18 14:30:41 +00006629 ASTDeclContextNameLookupTrait::data_type Data = *I;
6630 for (; Data.first != Data.second; ++Data.first) {
6631 NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M,
6632 *Data.first);
6633 if (!ND)
6634 continue;
6635
6636 // Record this declaration.
6637 FoundAnything = true;
6638 This->Decls[ND->getDeclName()].push_back(ND);
6639 }
6640 }
6641
Argyrios Kyrtzidis2810e9d2012-12-19 22:21:18 +00006642 return FoundAnything && !This->VisitAll;
Guy Benyei11169dd2012-12-18 14:30:41 +00006643 }
6644 };
6645}
6646
6647void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) {
6648 if (!DC->hasExternalVisibleStorage())
6649 return;
Craig Topper79be4cd2013-07-05 04:33:53 +00006650 DeclsMap Decls;
Guy Benyei11169dd2012-12-18 14:30:41 +00006651
6652 // Compute the declaration contexts we need to look into. Multiple such
6653 // declaration contexts occur when two declaration contexts from disjoint
6654 // modules get merged, e.g., when two namespaces with the same name are
6655 // independently defined in separate modules.
6656 SmallVector<const DeclContext *, 2> Contexts;
6657 Contexts.push_back(DC);
6658
6659 if (DC->isNamespace()) {
6660 MergedDeclsMap::iterator Merged
6661 = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC)));
6662 if (Merged != MergedDecls.end()) {
6663 for (unsigned I = 0, N = Merged->second.size(); I != N; ++I)
6664 Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I])));
6665 }
6666 }
6667
Argyrios Kyrtzidis2810e9d2012-12-19 22:21:18 +00006668 DeclContextAllNamesVisitor Visitor(*this, Contexts, Decls,
6669 /*VisitAll=*/DC->isFileContext());
Guy Benyei11169dd2012-12-18 14:30:41 +00006670 ModuleMgr.visit(&DeclContextAllNamesVisitor::visit, &Visitor);
6671 ++NumVisibleDeclContextsRead;
6672
Craig Topper79be4cd2013-07-05 04:33:53 +00006673 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) {
Guy Benyei11169dd2012-12-18 14:30:41 +00006674 SetExternalVisibleDeclsForName(DC, I->first, I->second);
6675 }
6676 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false);
6677}
6678
6679/// \brief Under non-PCH compilation the consumer receives the objc methods
6680/// before receiving the implementation, and codegen depends on this.
6681/// We simulate this by deserializing and passing to consumer the methods of the
6682/// implementation before passing the deserialized implementation decl.
6683static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD,
6684 ASTConsumer *Consumer) {
6685 assert(ImplD && Consumer);
6686
Aaron Ballmanaff18c02014-03-13 19:03:34 +00006687 for (auto *I : ImplD->methods())
6688 Consumer->HandleInterestingDecl(DeclGroupRef(I));
Guy Benyei11169dd2012-12-18 14:30:41 +00006689
6690 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD));
6691}
6692
6693void ASTReader::PassInterestingDeclsToConsumer() {
6694 assert(Consumer);
Richard Smith04d05b52014-03-23 00:27:18 +00006695
6696 if (PassingDeclsToConsumer)
6697 return;
6698
6699 // Guard variable to avoid recursively redoing the process of passing
6700 // decls to consumer.
6701 SaveAndRestore<bool> GuardPassingDeclsToConsumer(PassingDeclsToConsumer,
6702 true);
6703
Guy Benyei11169dd2012-12-18 14:30:41 +00006704 while (!InterestingDecls.empty()) {
6705 Decl *D = InterestingDecls.front();
6706 InterestingDecls.pop_front();
6707
6708 PassInterestingDeclToConsumer(D);
6709 }
6710}
6711
6712void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
6713 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
6714 PassObjCImplDeclToConsumer(ImplD, Consumer);
6715 else
6716 Consumer->HandleInterestingDecl(DeclGroupRef(D));
6717}
6718
6719void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) {
6720 this->Consumer = Consumer;
6721
6722 if (!Consumer)
6723 return;
6724
Ben Langmuir332aafe2014-01-31 01:06:56 +00006725 for (unsigned I = 0, N = EagerlyDeserializedDecls.size(); I != N; ++I) {
Guy Benyei11169dd2012-12-18 14:30:41 +00006726 // Force deserialization of this decl, which will cause it to be queued for
6727 // passing to the consumer.
Ben Langmuir332aafe2014-01-31 01:06:56 +00006728 GetDecl(EagerlyDeserializedDecls[I]);
Guy Benyei11169dd2012-12-18 14:30:41 +00006729 }
Ben Langmuir332aafe2014-01-31 01:06:56 +00006730 EagerlyDeserializedDecls.clear();
Guy Benyei11169dd2012-12-18 14:30:41 +00006731
6732 PassInterestingDeclsToConsumer();
6733}
6734
6735void ASTReader::PrintStats() {
6736 std::fprintf(stderr, "*** AST File Statistics:\n");
6737
6738 unsigned NumTypesLoaded
6739 = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(),
6740 QualType());
6741 unsigned NumDeclsLoaded
6742 = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(),
Craig Toppera13603a2014-05-22 05:54:18 +00006743 (Decl *)nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00006744 unsigned NumIdentifiersLoaded
6745 = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(),
6746 IdentifiersLoaded.end(),
Craig Toppera13603a2014-05-22 05:54:18 +00006747 (IdentifierInfo *)nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00006748 unsigned NumMacrosLoaded
6749 = MacrosLoaded.size() - std::count(MacrosLoaded.begin(),
6750 MacrosLoaded.end(),
Craig Toppera13603a2014-05-22 05:54:18 +00006751 (MacroInfo *)nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00006752 unsigned NumSelectorsLoaded
6753 = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(),
6754 SelectorsLoaded.end(),
6755 Selector());
6756
6757 if (unsigned TotalNumSLocEntries = getTotalNumSLocs())
6758 std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n",
6759 NumSLocEntriesRead, TotalNumSLocEntries,
6760 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
6761 if (!TypesLoaded.empty())
6762 std::fprintf(stderr, " %u/%u types read (%f%%)\n",
6763 NumTypesLoaded, (unsigned)TypesLoaded.size(),
6764 ((float)NumTypesLoaded/TypesLoaded.size() * 100));
6765 if (!DeclsLoaded.empty())
6766 std::fprintf(stderr, " %u/%u declarations read (%f%%)\n",
6767 NumDeclsLoaded, (unsigned)DeclsLoaded.size(),
6768 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100));
6769 if (!IdentifiersLoaded.empty())
6770 std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n",
6771 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(),
6772 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
6773 if (!MacrosLoaded.empty())
6774 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
6775 NumMacrosLoaded, (unsigned)MacrosLoaded.size(),
6776 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100));
6777 if (!SelectorsLoaded.empty())
6778 std::fprintf(stderr, " %u/%u selectors read (%f%%)\n",
6779 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(),
6780 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
6781 if (TotalNumStatements)
6782 std::fprintf(stderr, " %u/%u statements read (%f%%)\n",
6783 NumStatementsRead, TotalNumStatements,
6784 ((float)NumStatementsRead/TotalNumStatements * 100));
6785 if (TotalNumMacros)
6786 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
6787 NumMacrosRead, TotalNumMacros,
6788 ((float)NumMacrosRead/TotalNumMacros * 100));
6789 if (TotalLexicalDeclContexts)
6790 std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n",
6791 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
6792 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
6793 * 100));
6794 if (TotalVisibleDeclContexts)
6795 std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n",
6796 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
6797 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
6798 * 100));
6799 if (TotalNumMethodPoolEntries) {
6800 std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n",
6801 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
6802 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
6803 * 100));
Guy Benyei11169dd2012-12-18 14:30:41 +00006804 }
Douglas Gregorad2f7a52013-01-28 17:54:36 +00006805 if (NumMethodPoolLookups) {
6806 std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n",
6807 NumMethodPoolHits, NumMethodPoolLookups,
6808 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
6809 }
6810 if (NumMethodPoolTableLookups) {
6811 std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n",
6812 NumMethodPoolTableHits, NumMethodPoolTableLookups,
6813 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups
6814 * 100.0));
6815 }
6816
Douglas Gregor00a50f72013-01-25 00:38:33 +00006817 if (NumIdentifierLookupHits) {
6818 std::fprintf(stderr,
6819 " %u / %u identifier table lookups succeeded (%f%%)\n",
6820 NumIdentifierLookupHits, NumIdentifierLookups,
6821 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
6822 }
6823
Douglas Gregore060e572013-01-25 01:03:03 +00006824 if (GlobalIndex) {
6825 std::fprintf(stderr, "\n");
6826 GlobalIndex->printStats();
6827 }
6828
Guy Benyei11169dd2012-12-18 14:30:41 +00006829 std::fprintf(stderr, "\n");
6830 dump();
6831 std::fprintf(stderr, "\n");
6832}
6833
6834template<typename Key, typename ModuleFile, unsigned InitialCapacity>
6835static void
6836dumpModuleIDMap(StringRef Name,
6837 const ContinuousRangeMap<Key, ModuleFile *,
6838 InitialCapacity> &Map) {
6839 if (Map.begin() == Map.end())
6840 return;
6841
6842 typedef ContinuousRangeMap<Key, ModuleFile *, InitialCapacity> MapType;
6843 llvm::errs() << Name << ":\n";
6844 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
6845 I != IEnd; ++I) {
6846 llvm::errs() << " " << I->first << " -> " << I->second->FileName
6847 << "\n";
6848 }
6849}
6850
6851void ASTReader::dump() {
6852 llvm::errs() << "*** PCH/ModuleFile Remappings:\n";
6853 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap);
6854 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap);
6855 dumpModuleIDMap("Global type map", GlobalTypeMap);
6856 dumpModuleIDMap("Global declaration map", GlobalDeclMap);
6857 dumpModuleIDMap("Global identifier map", GlobalIdentifierMap);
6858 dumpModuleIDMap("Global macro map", GlobalMacroMap);
6859 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap);
6860 dumpModuleIDMap("Global selector map", GlobalSelectorMap);
6861 dumpModuleIDMap("Global preprocessed entity map",
6862 GlobalPreprocessedEntityMap);
6863
6864 llvm::errs() << "\n*** PCH/Modules Loaded:";
6865 for (ModuleManager::ModuleConstIterator M = ModuleMgr.begin(),
6866 MEnd = ModuleMgr.end();
6867 M != MEnd; ++M)
6868 (*M)->dump();
6869}
6870
6871/// Return the amount of memory used by memory buffers, breaking down
6872/// by heap-backed versus mmap'ed memory.
6873void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const {
6874 for (ModuleConstIterator I = ModuleMgr.begin(),
6875 E = ModuleMgr.end(); I != E; ++I) {
6876 if (llvm::MemoryBuffer *buf = (*I)->Buffer.get()) {
6877 size_t bytes = buf->getBufferSize();
6878 switch (buf->getBufferKind()) {
6879 case llvm::MemoryBuffer::MemoryBuffer_Malloc:
6880 sizes.malloc_bytes += bytes;
6881 break;
6882 case llvm::MemoryBuffer::MemoryBuffer_MMap:
6883 sizes.mmap_bytes += bytes;
6884 break;
6885 }
6886 }
6887 }
6888}
6889
6890void ASTReader::InitializeSema(Sema &S) {
6891 SemaObj = &S;
6892 S.addExternalSource(this);
6893
6894 // Makes sure any declarations that were deserialized "too early"
6895 // still get added to the identifier's declaration chains.
Ben Langmuir5418f402014-09-10 21:29:41 +00006896 for (uint64_t ID : PreloadedDeclIDs) {
6897 NamedDecl *D = cast<NamedDecl>(GetDecl(ID));
6898 pushExternalDeclIntoScope(D, D->getDeclName());
Guy Benyei11169dd2012-12-18 14:30:41 +00006899 }
Ben Langmuir5418f402014-09-10 21:29:41 +00006900 PreloadedDeclIDs.clear();
Guy Benyei11169dd2012-12-18 14:30:41 +00006901
Richard Smith3d8e97e2013-10-18 06:54:39 +00006902 // FIXME: What happens if these are changed by a module import?
Guy Benyei11169dd2012-12-18 14:30:41 +00006903 if (!FPPragmaOptions.empty()) {
6904 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS");
6905 SemaObj->FPFeatures.fp_contract = FPPragmaOptions[0];
6906 }
6907
Richard Smith3d8e97e2013-10-18 06:54:39 +00006908 // FIXME: What happens if these are changed by a module import?
Guy Benyei11169dd2012-12-18 14:30:41 +00006909 if (!OpenCLExtensions.empty()) {
6910 unsigned I = 0;
6911#define OPENCLEXT(nm) SemaObj->OpenCLFeatures.nm = OpenCLExtensions[I++];
6912#include "clang/Basic/OpenCLExtensions.def"
6913
6914 assert(OpenCLExtensions.size() == I && "Wrong number of OPENCL_EXTENSIONS");
6915 }
Richard Smith3d8e97e2013-10-18 06:54:39 +00006916
6917 UpdateSema();
6918}
6919
6920void ASTReader::UpdateSema() {
6921 assert(SemaObj && "no Sema to update");
6922
6923 // Load the offsets of the declarations that Sema references.
6924 // They will be lazily deserialized when needed.
6925 if (!SemaDeclRefs.empty()) {
6926 assert(SemaDeclRefs.size() % 2 == 0);
6927 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 2) {
6928 if (!SemaObj->StdNamespace)
6929 SemaObj->StdNamespace = SemaDeclRefs[I];
6930 if (!SemaObj->StdBadAlloc)
6931 SemaObj->StdBadAlloc = SemaDeclRefs[I+1];
6932 }
6933 SemaDeclRefs.clear();
6934 }
Dario Domizioli13a0a382014-05-23 12:13:25 +00006935
6936 // Update the state of 'pragma clang optimize'. Use the same API as if we had
6937 // encountered the pragma in the source.
6938 if(OptimizeOffPragmaLocation.isValid())
6939 SemaObj->ActOnPragmaOptimize(/* IsOn = */ false, OptimizeOffPragmaLocation);
Guy Benyei11169dd2012-12-18 14:30:41 +00006940}
6941
6942IdentifierInfo* ASTReader::get(const char *NameStart, const char *NameEnd) {
6943 // Note that we are loading an identifier.
6944 Deserializing AnIdentifier(this);
Douglas Gregore060e572013-01-25 01:03:03 +00006945 StringRef Name(NameStart, NameEnd - NameStart);
6946
6947 // If there is a global index, look there first to determine which modules
6948 // provably do not have any results for this identifier.
Douglas Gregor7211ac12013-01-25 23:32:03 +00006949 GlobalModuleIndex::HitSet Hits;
Craig Toppera13603a2014-05-22 05:54:18 +00006950 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
Douglas Gregore060e572013-01-25 01:03:03 +00006951 if (!loadGlobalIndex()) {
Douglas Gregor7211ac12013-01-25 23:32:03 +00006952 if (GlobalIndex->lookupIdentifier(Name, Hits)) {
6953 HitsPtr = &Hits;
Douglas Gregore060e572013-01-25 01:03:03 +00006954 }
6955 }
Douglas Gregor7211ac12013-01-25 23:32:03 +00006956 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0,
Douglas Gregor00a50f72013-01-25 00:38:33 +00006957 NumIdentifierLookups,
6958 NumIdentifierLookupHits);
Douglas Gregor7211ac12013-01-25 23:32:03 +00006959 ModuleMgr.visit(IdentifierLookupVisitor::visit, &Visitor, HitsPtr);
Guy Benyei11169dd2012-12-18 14:30:41 +00006960 IdentifierInfo *II = Visitor.getIdentifierInfo();
6961 markIdentifierUpToDate(II);
6962 return II;
6963}
6964
6965namespace clang {
6966 /// \brief An identifier-lookup iterator that enumerates all of the
6967 /// identifiers stored within a set of AST files.
6968 class ASTIdentifierIterator : public IdentifierIterator {
6969 /// \brief The AST reader whose identifiers are being enumerated.
6970 const ASTReader &Reader;
6971
6972 /// \brief The current index into the chain of AST files stored in
6973 /// the AST reader.
6974 unsigned Index;
6975
6976 /// \brief The current position within the identifier lookup table
6977 /// of the current AST file.
6978 ASTIdentifierLookupTable::key_iterator Current;
6979
6980 /// \brief The end position within the identifier lookup table of
6981 /// the current AST file.
6982 ASTIdentifierLookupTable::key_iterator End;
6983
6984 public:
6985 explicit ASTIdentifierIterator(const ASTReader &Reader);
6986
Craig Topper3e89dfe2014-03-13 02:13:41 +00006987 StringRef Next() override;
Guy Benyei11169dd2012-12-18 14:30:41 +00006988 };
6989}
6990
6991ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader)
6992 : Reader(Reader), Index(Reader.ModuleMgr.size() - 1) {
6993 ASTIdentifierLookupTable *IdTable
6994 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].IdentifierLookupTable;
6995 Current = IdTable->key_begin();
6996 End = IdTable->key_end();
6997}
6998
6999StringRef ASTIdentifierIterator::Next() {
7000 while (Current == End) {
7001 // If we have exhausted all of our AST files, we're done.
7002 if (Index == 0)
7003 return StringRef();
7004
7005 --Index;
7006 ASTIdentifierLookupTable *IdTable
7007 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].
7008 IdentifierLookupTable;
7009 Current = IdTable->key_begin();
7010 End = IdTable->key_end();
7011 }
7012
7013 // We have any identifiers remaining in the current AST file; return
7014 // the next one.
Douglas Gregorbfd73d72013-01-23 18:53:14 +00007015 StringRef Result = *Current;
Guy Benyei11169dd2012-12-18 14:30:41 +00007016 ++Current;
Douglas Gregorbfd73d72013-01-23 18:53:14 +00007017 return Result;
Guy Benyei11169dd2012-12-18 14:30:41 +00007018}
7019
Argyrios Kyrtzidis9aca3c62013-04-17 22:10:55 +00007020IdentifierIterator *ASTReader::getIdentifiers() {
7021 if (!loadGlobalIndex())
7022 return GlobalIndex->createIdentifierIterator();
7023
Guy Benyei11169dd2012-12-18 14:30:41 +00007024 return new ASTIdentifierIterator(*this);
7025}
7026
7027namespace clang { namespace serialization {
7028 class ReadMethodPoolVisitor {
7029 ASTReader &Reader;
7030 Selector Sel;
7031 unsigned PriorGeneration;
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00007032 unsigned InstanceBits;
7033 unsigned FactoryBits;
Dmitri Gribenkof8579502013-01-12 19:30:44 +00007034 SmallVector<ObjCMethodDecl *, 4> InstanceMethods;
7035 SmallVector<ObjCMethodDecl *, 4> FactoryMethods;
Guy Benyei11169dd2012-12-18 14:30:41 +00007036
7037 public:
7038 ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel,
7039 unsigned PriorGeneration)
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00007040 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration),
7041 InstanceBits(0), FactoryBits(0) { }
Guy Benyei11169dd2012-12-18 14:30:41 +00007042
7043 static bool visit(ModuleFile &M, void *UserData) {
7044 ReadMethodPoolVisitor *This
7045 = static_cast<ReadMethodPoolVisitor *>(UserData);
7046
7047 if (!M.SelectorLookupTable)
7048 return false;
7049
7050 // If we've already searched this module file, skip it now.
7051 if (M.Generation <= This->PriorGeneration)
7052 return true;
7053
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007054 ++This->Reader.NumMethodPoolTableLookups;
Guy Benyei11169dd2012-12-18 14:30:41 +00007055 ASTSelectorLookupTable *PoolTable
7056 = (ASTSelectorLookupTable*)M.SelectorLookupTable;
7057 ASTSelectorLookupTable::iterator Pos = PoolTable->find(This->Sel);
7058 if (Pos == PoolTable->end())
7059 return false;
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007060
7061 ++This->Reader.NumMethodPoolTableHits;
Guy Benyei11169dd2012-12-18 14:30:41 +00007062 ++This->Reader.NumSelectorsRead;
7063 // FIXME: Not quite happy with the statistics here. We probably should
7064 // disable this tracking when called via LoadSelector.
7065 // Also, should entries without methods count as misses?
7066 ++This->Reader.NumMethodPoolEntriesRead;
7067 ASTSelectorLookupTrait::data_type Data = *Pos;
7068 if (This->Reader.DeserializationListener)
7069 This->Reader.DeserializationListener->SelectorRead(Data.ID,
7070 This->Sel);
7071
7072 This->InstanceMethods.append(Data.Instance.begin(), Data.Instance.end());
7073 This->FactoryMethods.append(Data.Factory.begin(), Data.Factory.end());
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00007074 This->InstanceBits = Data.InstanceBits;
7075 This->FactoryBits = Data.FactoryBits;
Guy Benyei11169dd2012-12-18 14:30:41 +00007076 return true;
7077 }
7078
7079 /// \brief Retrieve the instance methods found by this visitor.
7080 ArrayRef<ObjCMethodDecl *> getInstanceMethods() const {
7081 return InstanceMethods;
7082 }
7083
7084 /// \brief Retrieve the instance methods found by this visitor.
7085 ArrayRef<ObjCMethodDecl *> getFactoryMethods() const {
7086 return FactoryMethods;
7087 }
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00007088
7089 unsigned getInstanceBits() const { return InstanceBits; }
7090 unsigned getFactoryBits() const { return FactoryBits; }
Guy Benyei11169dd2012-12-18 14:30:41 +00007091 };
7092} } // end namespace clang::serialization
7093
7094/// \brief Add the given set of methods to the method list.
7095static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods,
7096 ObjCMethodList &List) {
7097 for (unsigned I = 0, N = Methods.size(); I != N; ++I) {
7098 S.addMethodToGlobalList(&List, Methods[I]);
7099 }
7100}
7101
7102void ASTReader::ReadMethodPool(Selector Sel) {
7103 // Get the selector generation and update it to the current generation.
7104 unsigned &Generation = SelectorGeneration[Sel];
7105 unsigned PriorGeneration = Generation;
Richard Smith053f6c62014-05-16 23:01:30 +00007106 Generation = getGeneration();
Guy Benyei11169dd2012-12-18 14:30:41 +00007107
7108 // Search for methods defined with this selector.
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007109 ++NumMethodPoolLookups;
Guy Benyei11169dd2012-12-18 14:30:41 +00007110 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration);
7111 ModuleMgr.visit(&ReadMethodPoolVisitor::visit, &Visitor);
7112
7113 if (Visitor.getInstanceMethods().empty() &&
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007114 Visitor.getFactoryMethods().empty())
Guy Benyei11169dd2012-12-18 14:30:41 +00007115 return;
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007116
7117 ++NumMethodPoolHits;
7118
Guy Benyei11169dd2012-12-18 14:30:41 +00007119 if (!getSema())
7120 return;
7121
7122 Sema &S = *getSema();
7123 Sema::GlobalMethodPool::iterator Pos
7124 = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first;
7125
7126 addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first);
7127 addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second);
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00007128 Pos->second.first.setBits(Visitor.getInstanceBits());
7129 Pos->second.second.setBits(Visitor.getFactoryBits());
Guy Benyei11169dd2012-12-18 14:30:41 +00007130}
7131
7132void ASTReader::ReadKnownNamespaces(
7133 SmallVectorImpl<NamespaceDecl *> &Namespaces) {
7134 Namespaces.clear();
7135
7136 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
7137 if (NamespaceDecl *Namespace
7138 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I])))
7139 Namespaces.push_back(Namespace);
7140 }
7141}
7142
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00007143void ASTReader::ReadUndefinedButUsed(
Nick Lewyckyf0f56162013-01-31 03:23:57 +00007144 llvm::DenseMap<NamedDecl*, SourceLocation> &Undefined) {
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00007145 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
7146 NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++]));
Nick Lewycky8334af82013-01-26 00:35:08 +00007147 SourceLocation Loc =
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00007148 SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]);
Nick Lewycky8334af82013-01-26 00:35:08 +00007149 Undefined.insert(std::make_pair(D, Loc));
7150 }
7151}
Nick Lewycky8334af82013-01-26 00:35:08 +00007152
Guy Benyei11169dd2012-12-18 14:30:41 +00007153void ASTReader::ReadTentativeDefinitions(
7154 SmallVectorImpl<VarDecl *> &TentativeDefs) {
7155 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
7156 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I]));
7157 if (Var)
7158 TentativeDefs.push_back(Var);
7159 }
7160 TentativeDefinitions.clear();
7161}
7162
7163void ASTReader::ReadUnusedFileScopedDecls(
7164 SmallVectorImpl<const DeclaratorDecl *> &Decls) {
7165 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
7166 DeclaratorDecl *D
7167 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I]));
7168 if (D)
7169 Decls.push_back(D);
7170 }
7171 UnusedFileScopedDecls.clear();
7172}
7173
7174void ASTReader::ReadDelegatingConstructors(
7175 SmallVectorImpl<CXXConstructorDecl *> &Decls) {
7176 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
7177 CXXConstructorDecl *D
7178 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I]));
7179 if (D)
7180 Decls.push_back(D);
7181 }
7182 DelegatingCtorDecls.clear();
7183}
7184
7185void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) {
7186 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
7187 TypedefNameDecl *D
7188 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I]));
7189 if (D)
7190 Decls.push_back(D);
7191 }
7192 ExtVectorDecls.clear();
7193}
7194
7195void ASTReader::ReadDynamicClasses(SmallVectorImpl<CXXRecordDecl *> &Decls) {
7196 for (unsigned I = 0, N = DynamicClasses.size(); I != N; ++I) {
7197 CXXRecordDecl *D
7198 = dyn_cast_or_null<CXXRecordDecl>(GetDecl(DynamicClasses[I]));
7199 if (D)
7200 Decls.push_back(D);
7201 }
7202 DynamicClasses.clear();
7203}
7204
Nico Weber72889432014-09-06 01:25:55 +00007205void ASTReader::ReadUnusedLocalTypedefNameCandidates(
7206 llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) {
7207 for (unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N;
7208 ++I) {
7209 TypedefNameDecl *D = dyn_cast_or_null<TypedefNameDecl>(
7210 GetDecl(UnusedLocalTypedefNameCandidates[I]));
7211 if (D)
7212 Decls.insert(D);
7213 }
7214 UnusedLocalTypedefNameCandidates.clear();
7215}
7216
Guy Benyei11169dd2012-12-18 14:30:41 +00007217void
Richard Smith78165b52013-01-10 23:43:47 +00007218ASTReader::ReadLocallyScopedExternCDecls(SmallVectorImpl<NamedDecl *> &Decls) {
7219 for (unsigned I = 0, N = LocallyScopedExternCDecls.size(); I != N; ++I) {
7220 NamedDecl *D
7221 = dyn_cast_or_null<NamedDecl>(GetDecl(LocallyScopedExternCDecls[I]));
Guy Benyei11169dd2012-12-18 14:30:41 +00007222 if (D)
7223 Decls.push_back(D);
7224 }
Richard Smith78165b52013-01-10 23:43:47 +00007225 LocallyScopedExternCDecls.clear();
Guy Benyei11169dd2012-12-18 14:30:41 +00007226}
7227
7228void ASTReader::ReadReferencedSelectors(
7229 SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) {
7230 if (ReferencedSelectorsData.empty())
7231 return;
7232
7233 // If there are @selector references added them to its pool. This is for
7234 // implementation of -Wselector.
7235 unsigned int DataSize = ReferencedSelectorsData.size()-1;
7236 unsigned I = 0;
7237 while (I < DataSize) {
7238 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]);
7239 SourceLocation SelLoc
7240 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]);
7241 Sels.push_back(std::make_pair(Sel, SelLoc));
7242 }
7243 ReferencedSelectorsData.clear();
7244}
7245
7246void ASTReader::ReadWeakUndeclaredIdentifiers(
7247 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo> > &WeakIDs) {
7248 if (WeakUndeclaredIdentifiers.empty())
7249 return;
7250
7251 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) {
7252 IdentifierInfo *WeakId
7253 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
7254 IdentifierInfo *AliasId
7255 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
7256 SourceLocation Loc
7257 = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]);
7258 bool Used = WeakUndeclaredIdentifiers[I++];
7259 WeakInfo WI(AliasId, Loc);
7260 WI.setUsed(Used);
7261 WeakIDs.push_back(std::make_pair(WeakId, WI));
7262 }
7263 WeakUndeclaredIdentifiers.clear();
7264}
7265
7266void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) {
7267 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) {
7268 ExternalVTableUse VT;
7269 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++]));
7270 VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]);
7271 VT.DefinitionRequired = VTableUses[Idx++];
7272 VTables.push_back(VT);
7273 }
7274
7275 VTableUses.clear();
7276}
7277
7278void ASTReader::ReadPendingInstantiations(
7279 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation> > &Pending) {
7280 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
7281 ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++]));
7282 SourceLocation Loc
7283 = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]);
7284
7285 Pending.push_back(std::make_pair(D, Loc));
7286 }
7287 PendingInstantiations.clear();
7288}
7289
Richard Smithe40f2ba2013-08-07 21:41:30 +00007290void ASTReader::ReadLateParsedTemplates(
7291 llvm::DenseMap<const FunctionDecl *, LateParsedTemplate *> &LPTMap) {
7292 for (unsigned Idx = 0, N = LateParsedTemplates.size(); Idx < N;
7293 /* In loop */) {
7294 FunctionDecl *FD = cast<FunctionDecl>(GetDecl(LateParsedTemplates[Idx++]));
7295
7296 LateParsedTemplate *LT = new LateParsedTemplate;
7297 LT->D = GetDecl(LateParsedTemplates[Idx++]);
7298
7299 ModuleFile *F = getOwningModuleFile(LT->D);
7300 assert(F && "No module");
7301
7302 unsigned TokN = LateParsedTemplates[Idx++];
7303 LT->Toks.reserve(TokN);
7304 for (unsigned T = 0; T < TokN; ++T)
7305 LT->Toks.push_back(ReadToken(*F, LateParsedTemplates, Idx));
7306
7307 LPTMap[FD] = LT;
7308 }
7309
7310 LateParsedTemplates.clear();
7311}
7312
Guy Benyei11169dd2012-12-18 14:30:41 +00007313void ASTReader::LoadSelector(Selector Sel) {
7314 // It would be complicated to avoid reading the methods anyway. So don't.
7315 ReadMethodPool(Sel);
7316}
7317
7318void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) {
7319 assert(ID && "Non-zero identifier ID required");
7320 assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range");
7321 IdentifiersLoaded[ID - 1] = II;
7322 if (DeserializationListener)
7323 DeserializationListener->IdentifierRead(ID, II);
7324}
7325
7326/// \brief Set the globally-visible declarations associated with the given
7327/// identifier.
7328///
7329/// If the AST reader is currently in a state where the given declaration IDs
7330/// cannot safely be resolved, they are queued until it is safe to resolve
7331/// them.
7332///
7333/// \param II an IdentifierInfo that refers to one or more globally-visible
7334/// declarations.
7335///
7336/// \param DeclIDs the set of declaration IDs with the name @p II that are
7337/// visible at global scope.
7338///
Douglas Gregor6168bd22013-02-18 15:53:43 +00007339/// \param Decls if non-null, this vector will be populated with the set of
7340/// deserialized declarations. These declarations will not be pushed into
7341/// scope.
Guy Benyei11169dd2012-12-18 14:30:41 +00007342void
7343ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II,
7344 const SmallVectorImpl<uint32_t> &DeclIDs,
Douglas Gregor6168bd22013-02-18 15:53:43 +00007345 SmallVectorImpl<Decl *> *Decls) {
7346 if (NumCurrentElementsDeserializing && !Decls) {
7347 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
Guy Benyei11169dd2012-12-18 14:30:41 +00007348 return;
7349 }
7350
7351 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
Ben Langmuir5418f402014-09-10 21:29:41 +00007352 if (!SemaObj) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007353 // Queue this declaration so that it will be added to the
7354 // translation unit scope and identifier's declaration chain
7355 // once a Sema object is known.
Ben Langmuir5418f402014-09-10 21:29:41 +00007356 PreloadedDeclIDs.push_back(DeclIDs[I]);
7357 continue;
Guy Benyei11169dd2012-12-18 14:30:41 +00007358 }
Ben Langmuir5418f402014-09-10 21:29:41 +00007359
7360 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I]));
7361
7362 // If we're simply supposed to record the declarations, do so now.
7363 if (Decls) {
7364 Decls->push_back(D);
7365 continue;
7366 }
7367
7368 // Introduce this declaration into the translation-unit scope
7369 // and add it to the declaration chain for this identifier, so
7370 // that (unqualified) name lookup will find it.
7371 pushExternalDeclIntoScope(D, II);
Guy Benyei11169dd2012-12-18 14:30:41 +00007372 }
7373}
7374
Douglas Gregorc8a992f2013-01-21 16:52:34 +00007375IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007376 if (ID == 0)
Craig Toppera13603a2014-05-22 05:54:18 +00007377 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007378
7379 if (IdentifiersLoaded.empty()) {
7380 Error("no identifier table in AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00007381 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007382 }
7383
7384 ID -= 1;
7385 if (!IdentifiersLoaded[ID]) {
7386 GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1);
7387 assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map");
7388 ModuleFile *M = I->second;
7389 unsigned Index = ID - M->BaseIdentifierID;
7390 const char *Str = M->IdentifierTableData + M->IdentifierOffsets[Index];
7391
7392 // All of the strings in the AST file are preceded by a 16-bit length.
7393 // Extract that 16-bit length to avoid having to execute strlen().
7394 // NOTE: 'StrLenPtr' is an 'unsigned char*' so that we load bytes as
7395 // unsigned integers. This is important to avoid integer overflow when
7396 // we cast them to 'unsigned'.
7397 const unsigned char *StrLenPtr = (const unsigned char*) Str - 2;
7398 unsigned StrLen = (((unsigned) StrLenPtr[0])
7399 | (((unsigned) StrLenPtr[1]) << 8)) - 1;
Douglas Gregorc8a992f2013-01-21 16:52:34 +00007400 IdentifiersLoaded[ID]
7401 = &PP.getIdentifierTable().get(StringRef(Str, StrLen));
Guy Benyei11169dd2012-12-18 14:30:41 +00007402 if (DeserializationListener)
7403 DeserializationListener->IdentifierRead(ID + 1, IdentifiersLoaded[ID]);
7404 }
7405
7406 return IdentifiersLoaded[ID];
7407}
7408
Douglas Gregorc8a992f2013-01-21 16:52:34 +00007409IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) {
7410 return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID));
Guy Benyei11169dd2012-12-18 14:30:41 +00007411}
7412
7413IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) {
7414 if (LocalID < NUM_PREDEF_IDENT_IDS)
7415 return LocalID;
7416
7417 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7418 = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS);
7419 assert(I != M.IdentifierRemap.end()
7420 && "Invalid index into identifier index remap");
7421
7422 return LocalID + I->second;
7423}
7424
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00007425MacroInfo *ASTReader::getMacro(MacroID ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007426 if (ID == 0)
Craig Toppera13603a2014-05-22 05:54:18 +00007427 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007428
7429 if (MacrosLoaded.empty()) {
7430 Error("no macro table in AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00007431 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007432 }
7433
7434 ID -= NUM_PREDEF_MACRO_IDS;
7435 if (!MacrosLoaded[ID]) {
7436 GlobalMacroMapType::iterator I
7437 = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS);
7438 assert(I != GlobalMacroMap.end() && "Corrupted global macro map");
7439 ModuleFile *M = I->second;
7440 unsigned Index = ID - M->BaseMacroID;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00007441 MacrosLoaded[ID] = ReadMacroRecord(*M, M->MacroOffsets[Index]);
7442
7443 if (DeserializationListener)
7444 DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS,
7445 MacrosLoaded[ID]);
Guy Benyei11169dd2012-12-18 14:30:41 +00007446 }
7447
7448 return MacrosLoaded[ID];
7449}
7450
7451MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) {
7452 if (LocalID < NUM_PREDEF_MACRO_IDS)
7453 return LocalID;
7454
7455 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7456 = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS);
7457 assert(I != M.MacroRemap.end() && "Invalid index into macro index remap");
7458
7459 return LocalID + I->second;
7460}
7461
7462serialization::SubmoduleID
7463ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) {
7464 if (LocalID < NUM_PREDEF_SUBMODULE_IDS)
7465 return LocalID;
7466
7467 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7468 = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS);
7469 assert(I != M.SubmoduleRemap.end()
7470 && "Invalid index into submodule index remap");
7471
7472 return LocalID + I->second;
7473}
7474
7475Module *ASTReader::getSubmodule(SubmoduleID GlobalID) {
7476 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) {
7477 assert(GlobalID == 0 && "Unhandled global submodule ID");
Craig Toppera13603a2014-05-22 05:54:18 +00007478 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007479 }
7480
7481 if (GlobalID > SubmodulesLoaded.size()) {
7482 Error("submodule ID out of range in AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00007483 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007484 }
7485
7486 return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS];
7487}
Douglas Gregorc147b0b2013-01-12 01:29:50 +00007488
7489Module *ASTReader::getModule(unsigned ID) {
7490 return getSubmodule(ID);
7491}
7492
Guy Benyei11169dd2012-12-18 14:30:41 +00007493Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) {
7494 return DecodeSelector(getGlobalSelectorID(M, LocalID));
7495}
7496
7497Selector ASTReader::DecodeSelector(serialization::SelectorID ID) {
7498 if (ID == 0)
7499 return Selector();
7500
7501 if (ID > SelectorsLoaded.size()) {
7502 Error("selector ID out of range in AST file");
7503 return Selector();
7504 }
7505
Craig Toppera13603a2014-05-22 05:54:18 +00007506 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007507 // Load this selector from the selector table.
7508 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID);
7509 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map");
7510 ModuleFile &M = *I->second;
7511 ASTSelectorLookupTrait Trait(*this, M);
7512 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS;
7513 SelectorsLoaded[ID - 1] =
7514 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0);
7515 if (DeserializationListener)
7516 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
7517 }
7518
7519 return SelectorsLoaded[ID - 1];
7520}
7521
7522Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) {
7523 return DecodeSelector(ID);
7524}
7525
7526uint32_t ASTReader::GetNumExternalSelectors() {
7527 // ID 0 (the null selector) is considered an external selector.
7528 return getTotalNumSelectors() + 1;
7529}
7530
7531serialization::SelectorID
7532ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const {
7533 if (LocalID < NUM_PREDEF_SELECTOR_IDS)
7534 return LocalID;
7535
7536 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7537 = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS);
7538 assert(I != M.SelectorRemap.end()
7539 && "Invalid index into selector index remap");
7540
7541 return LocalID + I->second;
7542}
7543
7544DeclarationName
7545ASTReader::ReadDeclarationName(ModuleFile &F,
7546 const RecordData &Record, unsigned &Idx) {
7547 DeclarationName::NameKind Kind = (DeclarationName::NameKind)Record[Idx++];
7548 switch (Kind) {
7549 case DeclarationName::Identifier:
Douglas Gregorc8a992f2013-01-21 16:52:34 +00007550 return DeclarationName(GetIdentifierInfo(F, Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00007551
7552 case DeclarationName::ObjCZeroArgSelector:
7553 case DeclarationName::ObjCOneArgSelector:
7554 case DeclarationName::ObjCMultiArgSelector:
7555 return DeclarationName(ReadSelector(F, Record, Idx));
7556
7557 case DeclarationName::CXXConstructorName:
7558 return Context.DeclarationNames.getCXXConstructorName(
7559 Context.getCanonicalType(readType(F, Record, Idx)));
7560
7561 case DeclarationName::CXXDestructorName:
7562 return Context.DeclarationNames.getCXXDestructorName(
7563 Context.getCanonicalType(readType(F, Record, Idx)));
7564
7565 case DeclarationName::CXXConversionFunctionName:
7566 return Context.DeclarationNames.getCXXConversionFunctionName(
7567 Context.getCanonicalType(readType(F, Record, Idx)));
7568
7569 case DeclarationName::CXXOperatorName:
7570 return Context.DeclarationNames.getCXXOperatorName(
7571 (OverloadedOperatorKind)Record[Idx++]);
7572
7573 case DeclarationName::CXXLiteralOperatorName:
7574 return Context.DeclarationNames.getCXXLiteralOperatorName(
7575 GetIdentifierInfo(F, Record, Idx));
7576
7577 case DeclarationName::CXXUsingDirective:
7578 return DeclarationName::getUsingDirectiveName();
7579 }
7580
7581 llvm_unreachable("Invalid NameKind!");
7582}
7583
7584void ASTReader::ReadDeclarationNameLoc(ModuleFile &F,
7585 DeclarationNameLoc &DNLoc,
7586 DeclarationName Name,
7587 const RecordData &Record, unsigned &Idx) {
7588 switch (Name.getNameKind()) {
7589 case DeclarationName::CXXConstructorName:
7590 case DeclarationName::CXXDestructorName:
7591 case DeclarationName::CXXConversionFunctionName:
7592 DNLoc.NamedType.TInfo = GetTypeSourceInfo(F, Record, Idx);
7593 break;
7594
7595 case DeclarationName::CXXOperatorName:
7596 DNLoc.CXXOperatorName.BeginOpNameLoc
7597 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7598 DNLoc.CXXOperatorName.EndOpNameLoc
7599 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7600 break;
7601
7602 case DeclarationName::CXXLiteralOperatorName:
7603 DNLoc.CXXLiteralOperatorName.OpNameLoc
7604 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7605 break;
7606
7607 case DeclarationName::Identifier:
7608 case DeclarationName::ObjCZeroArgSelector:
7609 case DeclarationName::ObjCOneArgSelector:
7610 case DeclarationName::ObjCMultiArgSelector:
7611 case DeclarationName::CXXUsingDirective:
7612 break;
7613 }
7614}
7615
7616void ASTReader::ReadDeclarationNameInfo(ModuleFile &F,
7617 DeclarationNameInfo &NameInfo,
7618 const RecordData &Record, unsigned &Idx) {
7619 NameInfo.setName(ReadDeclarationName(F, Record, Idx));
7620 NameInfo.setLoc(ReadSourceLocation(F, Record, Idx));
7621 DeclarationNameLoc DNLoc;
7622 ReadDeclarationNameLoc(F, DNLoc, NameInfo.getName(), Record, Idx);
7623 NameInfo.setInfo(DNLoc);
7624}
7625
7626void ASTReader::ReadQualifierInfo(ModuleFile &F, QualifierInfo &Info,
7627 const RecordData &Record, unsigned &Idx) {
7628 Info.QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx);
7629 unsigned NumTPLists = Record[Idx++];
7630 Info.NumTemplParamLists = NumTPLists;
7631 if (NumTPLists) {
7632 Info.TemplParamLists = new (Context) TemplateParameterList*[NumTPLists];
7633 for (unsigned i=0; i != NumTPLists; ++i)
7634 Info.TemplParamLists[i] = ReadTemplateParameterList(F, Record, Idx);
7635 }
7636}
7637
7638TemplateName
7639ASTReader::ReadTemplateName(ModuleFile &F, const RecordData &Record,
7640 unsigned &Idx) {
7641 TemplateName::NameKind Kind = (TemplateName::NameKind)Record[Idx++];
7642 switch (Kind) {
7643 case TemplateName::Template:
7644 return TemplateName(ReadDeclAs<TemplateDecl>(F, Record, Idx));
7645
7646 case TemplateName::OverloadedTemplate: {
7647 unsigned size = Record[Idx++];
7648 UnresolvedSet<8> Decls;
7649 while (size--)
7650 Decls.addDecl(ReadDeclAs<NamedDecl>(F, Record, Idx));
7651
7652 return Context.getOverloadedTemplateName(Decls.begin(), Decls.end());
7653 }
7654
7655 case TemplateName::QualifiedTemplate: {
7656 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
7657 bool hasTemplKeyword = Record[Idx++];
7658 TemplateDecl *Template = ReadDeclAs<TemplateDecl>(F, Record, Idx);
7659 return Context.getQualifiedTemplateName(NNS, hasTemplKeyword, Template);
7660 }
7661
7662 case TemplateName::DependentTemplate: {
7663 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
7664 if (Record[Idx++]) // isIdentifier
7665 return Context.getDependentTemplateName(NNS,
7666 GetIdentifierInfo(F, Record,
7667 Idx));
7668 return Context.getDependentTemplateName(NNS,
7669 (OverloadedOperatorKind)Record[Idx++]);
7670 }
7671
7672 case TemplateName::SubstTemplateTemplateParm: {
7673 TemplateTemplateParmDecl *param
7674 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
7675 if (!param) return TemplateName();
7676 TemplateName replacement = ReadTemplateName(F, Record, Idx);
7677 return Context.getSubstTemplateTemplateParm(param, replacement);
7678 }
7679
7680 case TemplateName::SubstTemplateTemplateParmPack: {
7681 TemplateTemplateParmDecl *Param
7682 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
7683 if (!Param)
7684 return TemplateName();
7685
7686 TemplateArgument ArgPack = ReadTemplateArgument(F, Record, Idx);
7687 if (ArgPack.getKind() != TemplateArgument::Pack)
7688 return TemplateName();
7689
7690 return Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
7691 }
7692 }
7693
7694 llvm_unreachable("Unhandled template name kind!");
7695}
7696
7697TemplateArgument
7698ASTReader::ReadTemplateArgument(ModuleFile &F,
7699 const RecordData &Record, unsigned &Idx) {
7700 TemplateArgument::ArgKind Kind = (TemplateArgument::ArgKind)Record[Idx++];
7701 switch (Kind) {
7702 case TemplateArgument::Null:
7703 return TemplateArgument();
7704 case TemplateArgument::Type:
7705 return TemplateArgument(readType(F, Record, Idx));
7706 case TemplateArgument::Declaration: {
7707 ValueDecl *D = ReadDeclAs<ValueDecl>(F, Record, Idx);
7708 bool ForReferenceParam = Record[Idx++];
7709 return TemplateArgument(D, ForReferenceParam);
7710 }
7711 case TemplateArgument::NullPtr:
7712 return TemplateArgument(readType(F, Record, Idx), /*isNullPtr*/true);
7713 case TemplateArgument::Integral: {
7714 llvm::APSInt Value = ReadAPSInt(Record, Idx);
7715 QualType T = readType(F, Record, Idx);
7716 return TemplateArgument(Context, Value, T);
7717 }
7718 case TemplateArgument::Template:
7719 return TemplateArgument(ReadTemplateName(F, Record, Idx));
7720 case TemplateArgument::TemplateExpansion: {
7721 TemplateName Name = ReadTemplateName(F, Record, Idx);
David Blaikie05785d12013-02-20 22:23:23 +00007722 Optional<unsigned> NumTemplateExpansions;
Guy Benyei11169dd2012-12-18 14:30:41 +00007723 if (unsigned NumExpansions = Record[Idx++])
7724 NumTemplateExpansions = NumExpansions - 1;
7725 return TemplateArgument(Name, NumTemplateExpansions);
7726 }
7727 case TemplateArgument::Expression:
7728 return TemplateArgument(ReadExpr(F));
7729 case TemplateArgument::Pack: {
7730 unsigned NumArgs = Record[Idx++];
7731 TemplateArgument *Args = new (Context) TemplateArgument[NumArgs];
7732 for (unsigned I = 0; I != NumArgs; ++I)
7733 Args[I] = ReadTemplateArgument(F, Record, Idx);
7734 return TemplateArgument(Args, NumArgs);
7735 }
7736 }
7737
7738 llvm_unreachable("Unhandled template argument kind!");
7739}
7740
7741TemplateParameterList *
7742ASTReader::ReadTemplateParameterList(ModuleFile &F,
7743 const RecordData &Record, unsigned &Idx) {
7744 SourceLocation TemplateLoc = ReadSourceLocation(F, Record, Idx);
7745 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Idx);
7746 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Idx);
7747
7748 unsigned NumParams = Record[Idx++];
7749 SmallVector<NamedDecl *, 16> Params;
7750 Params.reserve(NumParams);
7751 while (NumParams--)
7752 Params.push_back(ReadDeclAs<NamedDecl>(F, Record, Idx));
7753
7754 TemplateParameterList* TemplateParams =
7755 TemplateParameterList::Create(Context, TemplateLoc, LAngleLoc,
7756 Params.data(), Params.size(), RAngleLoc);
7757 return TemplateParams;
7758}
7759
7760void
7761ASTReader::
Craig Topper5603df42013-07-05 19:34:19 +00007762ReadTemplateArgumentList(SmallVectorImpl<TemplateArgument> &TemplArgs,
Guy Benyei11169dd2012-12-18 14:30:41 +00007763 ModuleFile &F, const RecordData &Record,
7764 unsigned &Idx) {
7765 unsigned NumTemplateArgs = Record[Idx++];
7766 TemplArgs.reserve(NumTemplateArgs);
7767 while (NumTemplateArgs--)
7768 TemplArgs.push_back(ReadTemplateArgument(F, Record, Idx));
7769}
7770
7771/// \brief Read a UnresolvedSet structure.
Richard Smitha4ba74c2013-08-30 04:46:40 +00007772void ASTReader::ReadUnresolvedSet(ModuleFile &F, LazyASTUnresolvedSet &Set,
Guy Benyei11169dd2012-12-18 14:30:41 +00007773 const RecordData &Record, unsigned &Idx) {
7774 unsigned NumDecls = Record[Idx++];
7775 Set.reserve(Context, NumDecls);
7776 while (NumDecls--) {
Richard Smitha4ba74c2013-08-30 04:46:40 +00007777 DeclID ID = ReadDeclID(F, Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00007778 AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
Richard Smitha4ba74c2013-08-30 04:46:40 +00007779 Set.addLazyDecl(Context, ID, AS);
Guy Benyei11169dd2012-12-18 14:30:41 +00007780 }
7781}
7782
7783CXXBaseSpecifier
7784ASTReader::ReadCXXBaseSpecifier(ModuleFile &F,
7785 const RecordData &Record, unsigned &Idx) {
7786 bool isVirtual = static_cast<bool>(Record[Idx++]);
7787 bool isBaseOfClass = static_cast<bool>(Record[Idx++]);
7788 AccessSpecifier AS = static_cast<AccessSpecifier>(Record[Idx++]);
7789 bool inheritConstructors = static_cast<bool>(Record[Idx++]);
7790 TypeSourceInfo *TInfo = GetTypeSourceInfo(F, Record, Idx);
7791 SourceRange Range = ReadSourceRange(F, Record, Idx);
7792 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Idx);
7793 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo,
7794 EllipsisLoc);
7795 Result.setInheritConstructors(inheritConstructors);
7796 return Result;
7797}
7798
7799std::pair<CXXCtorInitializer **, unsigned>
7800ASTReader::ReadCXXCtorInitializers(ModuleFile &F, const RecordData &Record,
7801 unsigned &Idx) {
Craig Toppera13603a2014-05-22 05:54:18 +00007802 CXXCtorInitializer **CtorInitializers = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007803 unsigned NumInitializers = Record[Idx++];
7804 if (NumInitializers) {
7805 CtorInitializers
7806 = new (Context) CXXCtorInitializer*[NumInitializers];
7807 for (unsigned i=0; i != NumInitializers; ++i) {
Craig Toppera13603a2014-05-22 05:54:18 +00007808 TypeSourceInfo *TInfo = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007809 bool IsBaseVirtual = false;
Craig Toppera13603a2014-05-22 05:54:18 +00007810 FieldDecl *Member = nullptr;
7811 IndirectFieldDecl *IndirectMember = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007812
7813 CtorInitializerType Type = (CtorInitializerType)Record[Idx++];
7814 switch (Type) {
7815 case CTOR_INITIALIZER_BASE:
7816 TInfo = GetTypeSourceInfo(F, Record, Idx);
7817 IsBaseVirtual = Record[Idx++];
7818 break;
7819
7820 case CTOR_INITIALIZER_DELEGATING:
7821 TInfo = GetTypeSourceInfo(F, Record, Idx);
7822 break;
7823
7824 case CTOR_INITIALIZER_MEMBER:
7825 Member = ReadDeclAs<FieldDecl>(F, Record, Idx);
7826 break;
7827
7828 case CTOR_INITIALIZER_INDIRECT_MEMBER:
7829 IndirectMember = ReadDeclAs<IndirectFieldDecl>(F, Record, Idx);
7830 break;
7831 }
7832
7833 SourceLocation MemberOrEllipsisLoc = ReadSourceLocation(F, Record, Idx);
7834 Expr *Init = ReadExpr(F);
7835 SourceLocation LParenLoc = ReadSourceLocation(F, Record, Idx);
7836 SourceLocation RParenLoc = ReadSourceLocation(F, Record, Idx);
7837 bool IsWritten = Record[Idx++];
7838 unsigned SourceOrderOrNumArrayIndices;
7839 SmallVector<VarDecl *, 8> Indices;
7840 if (IsWritten) {
7841 SourceOrderOrNumArrayIndices = Record[Idx++];
7842 } else {
7843 SourceOrderOrNumArrayIndices = Record[Idx++];
7844 Indices.reserve(SourceOrderOrNumArrayIndices);
7845 for (unsigned i=0; i != SourceOrderOrNumArrayIndices; ++i)
7846 Indices.push_back(ReadDeclAs<VarDecl>(F, Record, Idx));
7847 }
7848
7849 CXXCtorInitializer *BOMInit;
7850 if (Type == CTOR_INITIALIZER_BASE) {
7851 BOMInit = new (Context) CXXCtorInitializer(Context, TInfo, IsBaseVirtual,
7852 LParenLoc, Init, RParenLoc,
7853 MemberOrEllipsisLoc);
7854 } else if (Type == CTOR_INITIALIZER_DELEGATING) {
7855 BOMInit = new (Context) CXXCtorInitializer(Context, TInfo, LParenLoc,
7856 Init, RParenLoc);
7857 } else if (IsWritten) {
7858 if (Member)
7859 BOMInit = new (Context) CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc,
7860 LParenLoc, Init, RParenLoc);
7861 else
7862 BOMInit = new (Context) CXXCtorInitializer(Context, IndirectMember,
7863 MemberOrEllipsisLoc, LParenLoc,
7864 Init, RParenLoc);
7865 } else {
Argyrios Kyrtzidis794671d2013-05-30 23:59:46 +00007866 if (IndirectMember) {
7867 assert(Indices.empty() && "Indirect field improperly initialized");
7868 BOMInit = new (Context) CXXCtorInitializer(Context, IndirectMember,
7869 MemberOrEllipsisLoc, LParenLoc,
7870 Init, RParenLoc);
7871 } else {
7872 BOMInit = CXXCtorInitializer::Create(Context, Member, MemberOrEllipsisLoc,
7873 LParenLoc, Init, RParenLoc,
7874 Indices.data(), Indices.size());
7875 }
Guy Benyei11169dd2012-12-18 14:30:41 +00007876 }
7877
7878 if (IsWritten)
7879 BOMInit->setSourceOrder(SourceOrderOrNumArrayIndices);
7880 CtorInitializers[i] = BOMInit;
7881 }
7882 }
7883
7884 return std::make_pair(CtorInitializers, NumInitializers);
7885}
7886
7887NestedNameSpecifier *
7888ASTReader::ReadNestedNameSpecifier(ModuleFile &F,
7889 const RecordData &Record, unsigned &Idx) {
7890 unsigned N = Record[Idx++];
Craig Toppera13603a2014-05-22 05:54:18 +00007891 NestedNameSpecifier *NNS = nullptr, *Prev = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007892 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 NNS = NestedNameSpecifier::Create(Context, Prev, II);
7899 break;
7900 }
7901
7902 case NestedNameSpecifier::Namespace: {
7903 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
7904 NNS = NestedNameSpecifier::Create(Context, Prev, NS);
7905 break;
7906 }
7907
7908 case NestedNameSpecifier::NamespaceAlias: {
7909 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
7910 NNS = NestedNameSpecifier::Create(Context, Prev, Alias);
7911 break;
7912 }
7913
7914 case NestedNameSpecifier::TypeSpec:
7915 case NestedNameSpecifier::TypeSpecWithTemplate: {
7916 const Type *T = readType(F, Record, Idx).getTypePtrOrNull();
7917 if (!T)
Craig Toppera13603a2014-05-22 05:54:18 +00007918 return nullptr;
7919
Guy Benyei11169dd2012-12-18 14:30:41 +00007920 bool Template = Record[Idx++];
7921 NNS = NestedNameSpecifier::Create(Context, Prev, Template, T);
7922 break;
7923 }
7924
7925 case NestedNameSpecifier::Global: {
7926 NNS = NestedNameSpecifier::GlobalSpecifier(Context);
7927 // No associated value, and there can't be a prefix.
7928 break;
7929 }
7930 }
7931 Prev = NNS;
7932 }
7933 return NNS;
7934}
7935
7936NestedNameSpecifierLoc
7937ASTReader::ReadNestedNameSpecifierLoc(ModuleFile &F, const RecordData &Record,
7938 unsigned &Idx) {
7939 unsigned N = Record[Idx++];
7940 NestedNameSpecifierLocBuilder Builder;
7941 for (unsigned I = 0; I != N; ++I) {
7942 NestedNameSpecifier::SpecifierKind Kind
7943 = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
7944 switch (Kind) {
7945 case NestedNameSpecifier::Identifier: {
7946 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
7947 SourceRange Range = ReadSourceRange(F, Record, Idx);
7948 Builder.Extend(Context, II, Range.getBegin(), Range.getEnd());
7949 break;
7950 }
7951
7952 case NestedNameSpecifier::Namespace: {
7953 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
7954 SourceRange Range = ReadSourceRange(F, Record, Idx);
7955 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
7956 break;
7957 }
7958
7959 case NestedNameSpecifier::NamespaceAlias: {
7960 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
7961 SourceRange Range = ReadSourceRange(F, Record, Idx);
7962 Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd());
7963 break;
7964 }
7965
7966 case NestedNameSpecifier::TypeSpec:
7967 case NestedNameSpecifier::TypeSpecWithTemplate: {
7968 bool Template = Record[Idx++];
7969 TypeSourceInfo *T = GetTypeSourceInfo(F, Record, Idx);
7970 if (!T)
7971 return NestedNameSpecifierLoc();
7972 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
7973
7974 // FIXME: 'template' keyword location not saved anywhere, so we fake it.
7975 Builder.Extend(Context,
7976 Template? T->getTypeLoc().getBeginLoc() : SourceLocation(),
7977 T->getTypeLoc(), ColonColonLoc);
7978 break;
7979 }
7980
7981 case NestedNameSpecifier::Global: {
7982 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
7983 Builder.MakeGlobal(Context, ColonColonLoc);
7984 break;
7985 }
7986 }
7987 }
7988
7989 return Builder.getWithLocInContext(Context);
7990}
7991
7992SourceRange
7993ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record,
7994 unsigned &Idx) {
7995 SourceLocation beg = ReadSourceLocation(F, Record, Idx);
7996 SourceLocation end = ReadSourceLocation(F, Record, Idx);
7997 return SourceRange(beg, end);
7998}
7999
8000/// \brief Read an integral value
8001llvm::APInt ASTReader::ReadAPInt(const RecordData &Record, unsigned &Idx) {
8002 unsigned BitWidth = Record[Idx++];
8003 unsigned NumWords = llvm::APInt::getNumWords(BitWidth);
8004 llvm::APInt Result(BitWidth, NumWords, &Record[Idx]);
8005 Idx += NumWords;
8006 return Result;
8007}
8008
8009/// \brief Read a signed integral value
8010llvm::APSInt ASTReader::ReadAPSInt(const RecordData &Record, unsigned &Idx) {
8011 bool isUnsigned = Record[Idx++];
8012 return llvm::APSInt(ReadAPInt(Record, Idx), isUnsigned);
8013}
8014
8015/// \brief Read a floating-point value
Tim Northover178723a2013-01-22 09:46:51 +00008016llvm::APFloat ASTReader::ReadAPFloat(const RecordData &Record,
8017 const llvm::fltSemantics &Sem,
8018 unsigned &Idx) {
8019 return llvm::APFloat(Sem, ReadAPInt(Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00008020}
8021
8022// \brief Read a string
8023std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) {
8024 unsigned Len = Record[Idx++];
8025 std::string Result(Record.data() + Idx, Record.data() + Idx + Len);
8026 Idx += Len;
8027 return Result;
8028}
8029
8030VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record,
8031 unsigned &Idx) {
8032 unsigned Major = Record[Idx++];
8033 unsigned Minor = Record[Idx++];
8034 unsigned Subminor = Record[Idx++];
8035 if (Minor == 0)
8036 return VersionTuple(Major);
8037 if (Subminor == 0)
8038 return VersionTuple(Major, Minor - 1);
8039 return VersionTuple(Major, Minor - 1, Subminor - 1);
8040}
8041
8042CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F,
8043 const RecordData &Record,
8044 unsigned &Idx) {
8045 CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx);
8046 return CXXTemporary::Create(Context, Decl);
8047}
8048
8049DiagnosticBuilder ASTReader::Diag(unsigned DiagID) {
Argyrios Kyrtzidisdc9fdaf2013-05-24 05:44:08 +00008050 return Diag(CurrentImportLoc, DiagID);
Guy Benyei11169dd2012-12-18 14:30:41 +00008051}
8052
8053DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) {
8054 return Diags.Report(Loc, DiagID);
8055}
8056
8057/// \brief Retrieve the identifier table associated with the
8058/// preprocessor.
8059IdentifierTable &ASTReader::getIdentifierTable() {
8060 return PP.getIdentifierTable();
8061}
8062
8063/// \brief Record that the given ID maps to the given switch-case
8064/// statement.
8065void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) {
Craig Toppera13603a2014-05-22 05:54:18 +00008066 assert((*CurrSwitchCaseStmts)[ID] == nullptr &&
Guy Benyei11169dd2012-12-18 14:30:41 +00008067 "Already have a SwitchCase with this ID");
8068 (*CurrSwitchCaseStmts)[ID] = SC;
8069}
8070
8071/// \brief Retrieve the switch-case statement with the given ID.
8072SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) {
Craig Toppera13603a2014-05-22 05:54:18 +00008073 assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID");
Guy Benyei11169dd2012-12-18 14:30:41 +00008074 return (*CurrSwitchCaseStmts)[ID];
8075}
8076
8077void ASTReader::ClearSwitchCaseIDs() {
8078 CurrSwitchCaseStmts->clear();
8079}
8080
8081void ASTReader::ReadComments() {
8082 std::vector<RawComment *> Comments;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00008083 for (SmallVectorImpl<std::pair<BitstreamCursor,
Guy Benyei11169dd2012-12-18 14:30:41 +00008084 serialization::ModuleFile *> >::iterator
8085 I = CommentsCursors.begin(),
8086 E = CommentsCursors.end();
8087 I != E; ++I) {
Dmitri Gribenko9ee0e302014-03-27 15:40:39 +00008088 Comments.clear();
Chris Lattner7fb3bef2013-01-20 00:56:42 +00008089 BitstreamCursor &Cursor = I->first;
Guy Benyei11169dd2012-12-18 14:30:41 +00008090 serialization::ModuleFile &F = *I->second;
8091 SavedStreamPosition SavedPosition(Cursor);
8092
8093 RecordData Record;
8094 while (true) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00008095 llvm::BitstreamEntry Entry =
8096 Cursor.advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd);
Dmitri Gribenko9ee0e302014-03-27 15:40:39 +00008097
Chris Lattner7fb3bef2013-01-20 00:56:42 +00008098 switch (Entry.Kind) {
8099 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
8100 case llvm::BitstreamEntry::Error:
8101 Error("malformed block record in AST file");
8102 return;
8103 case llvm::BitstreamEntry::EndBlock:
8104 goto NextCursor;
8105 case llvm::BitstreamEntry::Record:
8106 // The interesting case.
Guy Benyei11169dd2012-12-18 14:30:41 +00008107 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00008108 }
8109
8110 // Read a record.
8111 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00008112 switch ((CommentRecordTypes)Cursor.readRecord(Entry.ID, Record)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008113 case COMMENTS_RAW_COMMENT: {
8114 unsigned Idx = 0;
8115 SourceRange SR = ReadSourceRange(F, Record, Idx);
8116 RawComment::CommentKind Kind =
8117 (RawComment::CommentKind) Record[Idx++];
8118 bool IsTrailingComment = Record[Idx++];
8119 bool IsAlmostTrailingComment = Record[Idx++];
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00008120 Comments.push_back(new (Context) RawComment(
8121 SR, Kind, IsTrailingComment, IsAlmostTrailingComment,
8122 Context.getLangOpts().CommentOpts.ParseAllComments));
Guy Benyei11169dd2012-12-18 14:30:41 +00008123 break;
8124 }
8125 }
8126 }
Dmitri Gribenko9ee0e302014-03-27 15:40:39 +00008127 NextCursor:
8128 Context.Comments.addDeserializedComments(Comments);
Guy Benyei11169dd2012-12-18 14:30:41 +00008129 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008130}
8131
Richard Smithcd45dbc2014-04-19 03:48:30 +00008132std::string ASTReader::getOwningModuleNameForDiagnostic(const Decl *D) {
8133 // If we know the owning module, use it.
8134 if (Module *M = D->getOwningModule())
8135 return M->getFullModuleName();
8136
8137 // Otherwise, use the name of the top-level module the decl is within.
8138 if (ModuleFile *M = getOwningModuleFile(D))
8139 return M->ModuleName;
8140
8141 // Not from a module.
8142 return "";
8143}
8144
Guy Benyei11169dd2012-12-18 14:30:41 +00008145void ASTReader::finishPendingActions() {
Richard Smith851072e2014-05-19 20:59:20 +00008146 while (!PendingIdentifierInfos.empty() ||
8147 !PendingIncompleteDeclChains.empty() || !PendingDeclChains.empty() ||
Richard Smith2b9e3e32013-10-18 06:05:18 +00008148 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() ||
Richard Smitha0ce9c42014-07-29 23:23:27 +00008149 !PendingUpdateRecords.empty()) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008150 // If any identifiers with corresponding top-level declarations have
8151 // been loaded, load those declarations now.
Craig Topper79be4cd2013-07-05 04:33:53 +00008152 typedef llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2> >
8153 TopLevelDeclsMap;
8154 TopLevelDeclsMap TopLevelDecls;
8155
Guy Benyei11169dd2012-12-18 14:30:41 +00008156 while (!PendingIdentifierInfos.empty()) {
Douglas Gregor6168bd22013-02-18 15:53:43 +00008157 IdentifierInfo *II = PendingIdentifierInfos.back().first;
Richard Smithf0ae3c2d2014-03-28 17:31:23 +00008158 SmallVector<uint32_t, 4> DeclIDs =
8159 std::move(PendingIdentifierInfos.back().second);
Douglas Gregorcb15f082013-02-19 18:26:28 +00008160 PendingIdentifierInfos.pop_back();
Douglas Gregor6168bd22013-02-18 15:53:43 +00008161
8162 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]);
Guy Benyei11169dd2012-12-18 14:30:41 +00008163 }
Richard Smithf0ae3c2d2014-03-28 17:31:23 +00008164
Richard Smith851072e2014-05-19 20:59:20 +00008165 // For each decl chain that we wanted to complete while deserializing, mark
8166 // it as "still needs to be completed".
8167 for (unsigned I = 0; I != PendingIncompleteDeclChains.size(); ++I) {
8168 markIncompleteDeclChain(PendingIncompleteDeclChains[I]);
8169 }
8170 PendingIncompleteDeclChains.clear();
8171
Guy Benyei11169dd2012-12-18 14:30:41 +00008172 // Load pending declaration chains.
8173 for (unsigned I = 0; I != PendingDeclChains.size(); ++I) {
8174 loadPendingDeclChain(PendingDeclChains[I]);
8175 PendingDeclChainsKnown.erase(PendingDeclChains[I]);
8176 }
8177 PendingDeclChains.clear();
8178
Douglas Gregor6168bd22013-02-18 15:53:43 +00008179 // Make the most recent of the top-level declarations visible.
Craig Topper79be4cd2013-07-05 04:33:53 +00008180 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
8181 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
Douglas Gregor6168bd22013-02-18 15:53:43 +00008182 IdentifierInfo *II = TLD->first;
8183 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
Argyrios Kyrtzidise5edbf92013-04-26 21:33:35 +00008184 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II);
Douglas Gregor6168bd22013-02-18 15:53:43 +00008185 }
8186 }
8187
Guy Benyei11169dd2012-12-18 14:30:41 +00008188 // Load any pending macro definitions.
8189 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008190 IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
8191 SmallVector<PendingMacroInfo, 2> GlobalIDs;
8192 GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
8193 // Initialize the macro history from chained-PCHs ahead of module imports.
Richard Smith49f906a2014-03-01 00:08:04 +00008194 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
Argyrios Kyrtzidis719736c2013-01-19 03:14:56 +00008195 ++IDIdx) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008196 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
8197 if (Info.M->Kind != MK_Module)
8198 resolvePendingMacro(II, Info);
8199 }
8200 // Handle module imports.
Richard Smith49f906a2014-03-01 00:08:04 +00008201 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008202 ++IDIdx) {
8203 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
8204 if (Info.M->Kind == MK_Module)
8205 resolvePendingMacro(II, Info);
Guy Benyei11169dd2012-12-18 14:30:41 +00008206 }
8207 }
8208 PendingMacroIDs.clear();
Argyrios Kyrtzidis83a6e3b2013-02-16 00:48:59 +00008209
8210 // Wire up the DeclContexts for Decls that we delayed setting until
8211 // recursive loading is completed.
8212 while (!PendingDeclContextInfos.empty()) {
8213 PendingDeclContextInfo Info = PendingDeclContextInfos.front();
8214 PendingDeclContextInfos.pop_front();
8215 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC));
8216 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC));
8217 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext());
8218 }
Richard Smith2b9e3e32013-10-18 06:05:18 +00008219
Richard Smithd1c46742014-04-30 02:24:17 +00008220 // Perform any pending declaration updates.
Richard Smithd6db68c2014-08-07 20:58:41 +00008221 while (!PendingUpdateRecords.empty()) {
Richard Smithd1c46742014-04-30 02:24:17 +00008222 auto Update = PendingUpdateRecords.pop_back_val();
8223 ReadingKindTracker ReadingKind(Read_Decl, *this);
8224 loadDeclUpdateRecords(Update.first, Update.second);
8225 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008226 }
8227
8228 // If we deserialized any C++ or Objective-C class definitions, any
8229 // Objective-C protocol definitions, or any redeclarable templates, make sure
8230 // that all redeclarations point to the definitions. Note that this can only
8231 // happen now, after the redeclaration chains have been fully wired.
Craig Topperc6914d02014-08-25 04:15:02 +00008232 for (Decl *D : PendingDefinitions) {
8233 if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
Richard Smith5b21db82014-04-23 18:20:42 +00008234 if (const TagType *TagT = dyn_cast<TagType>(TD->getTypeForDecl())) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008235 // Make sure that the TagType points at the definition.
8236 const_cast<TagType*>(TagT)->decl = TD;
8237 }
8238
Craig Topperc6914d02014-08-25 04:15:02 +00008239 if (auto RD = dyn_cast<CXXRecordDecl>(D)) {
Richard Smith2c381642014-08-27 23:11:59 +00008240 for (auto R : RD->redecls()) {
8241 assert((R == D) == R->isThisDeclarationADefinition() &&
8242 "declaration thinks it's the definition but it isn't");
Aaron Ballman86c93902014-03-06 23:45:36 +00008243 cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData;
Richard Smith2c381642014-08-27 23:11:59 +00008244 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008245 }
8246
8247 continue;
8248 }
8249
Craig Topperc6914d02014-08-25 04:15:02 +00008250 if (auto ID = dyn_cast<ObjCInterfaceDecl>(D)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008251 // Make sure that the ObjCInterfaceType points at the definition.
8252 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl))
8253 ->Decl = ID;
8254
Aaron Ballman86c93902014-03-06 23:45:36 +00008255 for (auto R : ID->redecls())
Guy Benyei11169dd2012-12-18 14:30:41 +00008256 R->Data = ID->Data;
8257
8258 continue;
8259 }
8260
Craig Topperc6914d02014-08-25 04:15:02 +00008261 if (auto PD = dyn_cast<ObjCProtocolDecl>(D)) {
Aaron Ballman86c93902014-03-06 23:45:36 +00008262 for (auto R : PD->redecls())
Guy Benyei11169dd2012-12-18 14:30:41 +00008263 R->Data = PD->Data;
8264
8265 continue;
8266 }
8267
Craig Topperc6914d02014-08-25 04:15:02 +00008268 auto RTD = cast<RedeclarableTemplateDecl>(D)->getCanonicalDecl();
Aaron Ballman86c93902014-03-06 23:45:36 +00008269 for (auto R : RTD->redecls())
Guy Benyei11169dd2012-12-18 14:30:41 +00008270 R->Common = RTD->Common;
8271 }
8272 PendingDefinitions.clear();
8273
8274 // Load the bodies of any functions or methods we've encountered. We do
8275 // this now (delayed) so that we can be sure that the declaration chains
8276 // have been fully wired up.
8277 for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
8278 PBEnd = PendingBodies.end();
8279 PB != PBEnd; ++PB) {
8280 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
8281 // FIXME: Check for =delete/=default?
8282 // FIXME: Complain about ODR violations here?
8283 if (!getContext().getLangOpts().Modules || !FD->hasBody())
8284 FD->setLazyBody(PB->second);
8285 continue;
8286 }
8287
8288 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first);
8289 if (!getContext().getLangOpts().Modules || !MD->hasBody())
8290 MD->setLazyBody(PB->second);
8291 }
8292 PendingBodies.clear();
Richard Smitha0ce9c42014-07-29 23:23:27 +00008293}
8294
8295void ASTReader::diagnoseOdrViolations() {
Richard Smithbb853c72014-08-13 01:23:33 +00008296 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty())
8297 return;
8298
Richard Smitha0ce9c42014-07-29 23:23:27 +00008299 // Trigger the import of the full definition of each class that had any
8300 // odr-merging problems, so we can produce better diagnostics for them.
Richard Smithbb853c72014-08-13 01:23:33 +00008301 // These updates may in turn find and diagnose some ODR failures, so take
8302 // ownership of the set first.
8303 auto OdrMergeFailures = std::move(PendingOdrMergeFailures);
8304 PendingOdrMergeFailures.clear();
8305 for (auto &Merge : OdrMergeFailures) {
Richard Smitha0ce9c42014-07-29 23:23:27 +00008306 Merge.first->buildLookup();
8307 Merge.first->decls_begin();
8308 Merge.first->bases_begin();
8309 Merge.first->vbases_begin();
8310 for (auto *RD : Merge.second) {
8311 RD->decls_begin();
8312 RD->bases_begin();
8313 RD->vbases_begin();
8314 }
8315 }
8316
8317 // For each declaration from a merged context, check that the canonical
8318 // definition of that context also contains a declaration of the same
8319 // entity.
8320 //
8321 // Caution: this loop does things that might invalidate iterators into
8322 // PendingOdrMergeChecks. Don't turn this into a range-based for loop!
8323 while (!PendingOdrMergeChecks.empty()) {
8324 NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
8325
8326 // FIXME: Skip over implicit declarations for now. This matters for things
8327 // like implicitly-declared special member functions. This isn't entirely
8328 // correct; we can end up with multiple unmerged declarations of the same
8329 // implicit entity.
8330 if (D->isImplicit())
8331 continue;
8332
8333 DeclContext *CanonDef = D->getDeclContext();
Richard Smitha0ce9c42014-07-29 23:23:27 +00008334
8335 bool Found = false;
8336 const Decl *DCanon = D->getCanonicalDecl();
8337
Richard Smith01bdb7a2014-08-28 05:44:07 +00008338 for (auto RI : D->redecls()) {
8339 if (RI->getLexicalDeclContext() == CanonDef) {
8340 Found = true;
8341 break;
8342 }
8343 }
8344 if (Found)
8345 continue;
8346
Richard Smitha0ce9c42014-07-29 23:23:27 +00008347 llvm::SmallVector<const NamedDecl*, 4> Candidates;
Richard Smith01bdb7a2014-08-28 05:44:07 +00008348 DeclContext::lookup_result R = CanonDef->lookup(D->getDeclName());
Richard Smitha0ce9c42014-07-29 23:23:27 +00008349 for (DeclContext::lookup_iterator I = R.begin(), E = R.end();
8350 !Found && I != E; ++I) {
8351 for (auto RI : (*I)->redecls()) {
8352 if (RI->getLexicalDeclContext() == CanonDef) {
8353 // This declaration is present in the canonical definition. If it's
8354 // in the same redecl chain, it's the one we're looking for.
8355 if (RI->getCanonicalDecl() == DCanon)
8356 Found = true;
8357 else
8358 Candidates.push_back(cast<NamedDecl>(RI));
8359 break;
8360 }
8361 }
8362 }
8363
8364 if (!Found) {
Richard Smithd08aeb62014-08-28 01:33:39 +00008365 // The AST doesn't like TagDecls becoming invalid after they've been
8366 // completed. We only really need to mark FieldDecls as invalid here.
8367 if (!isa<TagDecl>(D))
8368 D->setInvalidDecl();
Richard Smitha0ce9c42014-07-29 23:23:27 +00008369
8370 std::string CanonDefModule =
8371 getOwningModuleNameForDiagnostic(cast<Decl>(CanonDef));
8372 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl)
8373 << D << getOwningModuleNameForDiagnostic(D)
8374 << CanonDef << CanonDefModule.empty() << CanonDefModule;
8375
8376 if (Candidates.empty())
8377 Diag(cast<Decl>(CanonDef)->getLocation(),
8378 diag::note_module_odr_violation_no_possible_decls) << D;
8379 else {
8380 for (unsigned I = 0, N = Candidates.size(); I != N; ++I)
8381 Diag(Candidates[I]->getLocation(),
8382 diag::note_module_odr_violation_possible_decl)
8383 << Candidates[I];
8384 }
8385
8386 DiagnosedOdrMergeFailures.insert(CanonDef);
8387 }
8388 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00008389
8390 // Issue any pending ODR-failure diagnostics.
Richard Smithbb853c72014-08-13 01:23:33 +00008391 for (auto &Merge : OdrMergeFailures) {
Richard Smitha0ce9c42014-07-29 23:23:27 +00008392 // If we've already pointed out a specific problem with this class, don't
8393 // bother issuing a general "something's different" diagnostic.
Richard Smithcd45dbc2014-04-19 03:48:30 +00008394 if (!DiagnosedOdrMergeFailures.insert(Merge.first))
8395 continue;
8396
8397 bool Diagnosed = false;
8398 for (auto *RD : Merge.second) {
8399 // Multiple different declarations got merged together; tell the user
8400 // where they came from.
8401 if (Merge.first != RD) {
8402 // FIXME: Walk the definition, figure out what's different,
8403 // and diagnose that.
8404 if (!Diagnosed) {
8405 std::string Module = getOwningModuleNameForDiagnostic(Merge.first);
8406 Diag(Merge.first->getLocation(),
8407 diag::err_module_odr_violation_different_definitions)
8408 << Merge.first << Module.empty() << Module;
8409 Diagnosed = true;
8410 }
8411
8412 Diag(RD->getLocation(),
8413 diag::note_module_odr_violation_different_definitions)
8414 << getOwningModuleNameForDiagnostic(RD);
8415 }
8416 }
8417
8418 if (!Diagnosed) {
8419 // All definitions are updates to the same declaration. This happens if a
8420 // module instantiates the declaration of a class template specialization
8421 // and two or more other modules instantiate its definition.
8422 //
8423 // FIXME: Indicate which modules had instantiations of this definition.
8424 // FIXME: How can this even happen?
8425 Diag(Merge.first->getLocation(),
8426 diag::err_module_odr_violation_different_instantiations)
8427 << Merge.first;
8428 }
8429 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008430}
8431
8432void ASTReader::FinishedDeserializing() {
8433 assert(NumCurrentElementsDeserializing &&
8434 "FinishedDeserializing not paired with StartedDeserializing");
8435 if (NumCurrentElementsDeserializing == 1) {
8436 // We decrease NumCurrentElementsDeserializing only after pending actions
8437 // are finished, to avoid recursively re-calling finishPendingActions().
8438 finishPendingActions();
8439 }
8440 --NumCurrentElementsDeserializing;
8441
Richard Smitha0ce9c42014-07-29 23:23:27 +00008442 if (NumCurrentElementsDeserializing == 0) {
8443 diagnoseOdrViolations();
8444
Richard Smith04d05b52014-03-23 00:27:18 +00008445 // We are not in recursive loading, so it's safe to pass the "interesting"
8446 // decls to the consumer.
Richard Smitha0ce9c42014-07-29 23:23:27 +00008447 if (Consumer)
8448 PassInterestingDeclsToConsumer();
Guy Benyei11169dd2012-12-18 14:30:41 +00008449 }
8450}
8451
Argyrios Kyrtzidise5edbf92013-04-26 21:33:35 +00008452void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) {
Rafael Espindola7b56f6c2013-10-19 16:55:03 +00008453 D = D->getMostRecentDecl();
Argyrios Kyrtzidise5edbf92013-04-26 21:33:35 +00008454
8455 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
8456 SemaObj->TUScope->AddDecl(D);
8457 } else if (SemaObj->TUScope) {
8458 // Adding the decl to IdResolver may have failed because it was already in
8459 // (even though it was not added in scope). If it is already in, make sure
8460 // it gets in the scope as well.
8461 if (std::find(SemaObj->IdResolver.begin(Name),
8462 SemaObj->IdResolver.end(), D) != SemaObj->IdResolver.end())
8463 SemaObj->TUScope->AddDecl(D);
8464 }
8465}
8466
Nico Weber824285e2014-05-08 04:26:47 +00008467ASTReader::ASTReader(Preprocessor &PP, ASTContext &Context, StringRef isysroot,
8468 bool DisableValidation, bool AllowASTWithCompilerErrors,
8469 bool AllowConfigurationMismatch, bool ValidateSystemInputs,
Ben Langmuir2cb4a782014-02-05 22:21:15 +00008470 bool UseGlobalIndex)
Craig Toppera13603a2014-05-22 05:54:18 +00008471 : Listener(new PCHValidator(PP, *this)), DeserializationListener(nullptr),
Nico Weber824285e2014-05-08 04:26:47 +00008472 OwnsDeserializationListener(false), SourceMgr(PP.getSourceManager()),
Craig Toppera13603a2014-05-22 05:54:18 +00008473 FileMgr(PP.getFileManager()), Diags(PP.getDiagnostics()),
8474 SemaObj(nullptr), PP(PP), Context(Context), Consumer(nullptr),
8475 ModuleMgr(PP.getFileManager()), isysroot(isysroot),
8476 DisableValidation(DisableValidation),
Nico Weber824285e2014-05-08 04:26:47 +00008477 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
8478 AllowConfigurationMismatch(AllowConfigurationMismatch),
8479 ValidateSystemInputs(ValidateSystemInputs),
8480 UseGlobalIndex(UseGlobalIndex), TriedLoadingGlobalIndex(false),
Richard Smith053f6c62014-05-16 23:01:30 +00008481 CurrSwitchCaseStmts(&SwitchCaseStmts),
Nico Weber824285e2014-05-08 04:26:47 +00008482 NumSLocEntriesRead(0), TotalNumSLocEntries(0), NumStatementsRead(0),
8483 TotalNumStatements(0), NumMacrosRead(0), TotalNumMacros(0),
8484 NumIdentifierLookups(0), NumIdentifierLookupHits(0), NumSelectorsRead(0),
8485 NumMethodPoolEntriesRead(0), NumMethodPoolLookups(0),
8486 NumMethodPoolHits(0), NumMethodPoolTableLookups(0),
8487 NumMethodPoolTableHits(0), TotalNumMethodPoolEntries(0),
8488 NumLexicalDeclContextsRead(0), TotalLexicalDeclContexts(0),
8489 NumVisibleDeclContextsRead(0), TotalVisibleDeclContexts(0),
8490 TotalModulesSizeInBits(0), NumCurrentElementsDeserializing(0),
8491 PassingDeclsToConsumer(false), NumCXXBaseSpecifiersLoaded(0),
8492 ReadingKind(Read_None) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008493 SourceMgr.setExternalSLocEntrySource(this);
8494}
8495
8496ASTReader::~ASTReader() {
Nico Weber824285e2014-05-08 04:26:47 +00008497 if (OwnsDeserializationListener)
8498 delete DeserializationListener;
8499
Guy Benyei11169dd2012-12-18 14:30:41 +00008500 for (DeclContextVisibleUpdatesPending::iterator
8501 I = PendingVisibleUpdates.begin(),
8502 E = PendingVisibleUpdates.end();
8503 I != E; ++I) {
8504 for (DeclContextVisibleUpdates::iterator J = I->second.begin(),
8505 F = I->second.end();
8506 J != F; ++J)
8507 delete J->first;
8508 }
8509}