blob: f3181546320a69f08b61322fca6aca5569b85c1a [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
Richard Smithe842a472014-10-22 02:05:46 +0000392 // module import of an implicitly-loaded module file.
Ben Langmuirb92de022014-04-29 16:25:26 +0000393 // 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];
Richard Smithe842a472014-10-22 02:05:46 +0000399 if (TopImport->Kind != MK_ImplicitModule)
Ben Langmuirb92de022014-04-29 16:25:26 +0000400 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
Richard Smithe842a472014-10-22 02:05:46 +0000784 if (F.Kind == MK_ImplicitModule || F.Kind == MK_ExplicitModule) {
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]);
Richard Smithe842a472014-10-22 02:05:46 +00001241 if (IncludeLoc.isInvalid() &&
1242 (F->Kind == MK_ImplicitModule || F->Kind == MK_ExplicitModule)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001243 IncludeLoc = getImportLocation(F);
1244 }
1245 unsigned Code = SLocEntryCursor.ReadCode();
1246 Record.clear();
1247 unsigned RecCode
Chris Lattner0e6c9402013-01-20 02:38:54 +00001248 = SLocEntryCursor.readRecord(Code, Record, &Blob);
Guy Benyei11169dd2012-12-18 14:30:41 +00001249
1250 if (RecCode != SM_SLOC_BUFFER_BLOB) {
1251 Error("AST record has invalid code");
1252 return true;
1253 }
1254
Rafael Espindolad87f8d72014-08-27 20:03:29 +00001255 std::unique_ptr<llvm::MemoryBuffer> Buffer =
1256 llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name);
David Blaikie50a5f972014-08-29 07:59:55 +00001257 SourceMgr.createFileID(std::move(Buffer), FileCharacter, ID,
Rafael Espindolad87f8d72014-08-27 20:03:29 +00001258 BaseOffset + Offset, IncludeLoc);
Guy Benyei11169dd2012-12-18 14:30:41 +00001259 break;
1260 }
1261
1262 case SM_SLOC_EXPANSION_ENTRY: {
1263 SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1]);
1264 SourceMgr.createExpansionLoc(SpellingLoc,
1265 ReadSourceLocation(*F, Record[2]),
1266 ReadSourceLocation(*F, Record[3]),
1267 Record[4],
1268 ID,
1269 BaseOffset + Record[0]);
1270 break;
1271 }
1272 }
1273
1274 return false;
1275}
1276
1277std::pair<SourceLocation, StringRef> ASTReader::getModuleImportLoc(int ID) {
1278 if (ID == 0)
1279 return std::make_pair(SourceLocation(), "");
1280
1281 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1282 Error("source location entry ID out-of-range for AST file");
1283 return std::make_pair(SourceLocation(), "");
1284 }
1285
1286 // Find which module file this entry lands in.
1287 ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second;
Richard Smithe842a472014-10-22 02:05:46 +00001288 if (M->Kind != MK_ImplicitModule && M->Kind != MK_ExplicitModule)
Guy Benyei11169dd2012-12-18 14:30:41 +00001289 return std::make_pair(SourceLocation(), "");
1290
1291 // FIXME: Can we map this down to a particular submodule? That would be
1292 // ideal.
Ben Langmuirbeee15e2014-04-14 18:00:01 +00001293 return std::make_pair(M->ImportLoc, StringRef(M->ModuleName));
Guy Benyei11169dd2012-12-18 14:30:41 +00001294}
1295
1296/// \brief Find the location where the module F is imported.
1297SourceLocation ASTReader::getImportLocation(ModuleFile *F) {
1298 if (F->ImportLoc.isValid())
1299 return F->ImportLoc;
1300
1301 // Otherwise we have a PCH. It's considered to be "imported" at the first
1302 // location of its includer.
1303 if (F->ImportedBy.empty() || !F->ImportedBy[0]) {
Ben Langmuirbeee15e2014-04-14 18:00:01 +00001304 // Main file is the importer.
1305 assert(!SourceMgr.getMainFileID().isInvalid() && "missing main file");
1306 return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID());
Guy Benyei11169dd2012-12-18 14:30:41 +00001307 }
Guy Benyei11169dd2012-12-18 14:30:41 +00001308 return F->ImportedBy[0]->FirstLoc;
1309}
1310
1311/// ReadBlockAbbrevs - Enter a subblock of the specified BlockID with the
1312/// specified cursor. Read the abbreviations that are at the top of the block
1313/// and then leave the cursor pointing into the block.
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001314bool ASTReader::ReadBlockAbbrevs(BitstreamCursor &Cursor, unsigned BlockID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001315 if (Cursor.EnterSubBlock(BlockID)) {
1316 Error("malformed block record in AST file");
1317 return Failure;
1318 }
1319
1320 while (true) {
1321 uint64_t Offset = Cursor.GetCurrentBitNo();
1322 unsigned Code = Cursor.ReadCode();
1323
1324 // We expect all abbrevs to be at the start of the block.
1325 if (Code != llvm::bitc::DEFINE_ABBREV) {
1326 Cursor.JumpToBit(Offset);
1327 return false;
1328 }
1329 Cursor.ReadAbbrevRecord();
1330 }
1331}
1332
Richard Smithe40f2ba2013-08-07 21:41:30 +00001333Token ASTReader::ReadToken(ModuleFile &F, const RecordDataImpl &Record,
John McCallf413f5e2013-05-03 00:10:13 +00001334 unsigned &Idx) {
1335 Token Tok;
1336 Tok.startToken();
1337 Tok.setLocation(ReadSourceLocation(F, Record, Idx));
1338 Tok.setLength(Record[Idx++]);
1339 if (IdentifierInfo *II = getLocalIdentifier(F, Record[Idx++]))
1340 Tok.setIdentifierInfo(II);
1341 Tok.setKind((tok::TokenKind)Record[Idx++]);
1342 Tok.setFlag((Token::TokenFlags)Record[Idx++]);
1343 return Tok;
1344}
1345
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001346MacroInfo *ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001347 BitstreamCursor &Stream = F.MacroCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00001348
1349 // Keep track of where we are in the stream, then jump back there
1350 // after reading this macro.
1351 SavedStreamPosition SavedPosition(Stream);
1352
1353 Stream.JumpToBit(Offset);
1354 RecordData Record;
1355 SmallVector<IdentifierInfo*, 16> MacroArgs;
Craig Toppera13603a2014-05-22 05:54:18 +00001356 MacroInfo *Macro = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00001357
Guy Benyei11169dd2012-12-18 14:30:41 +00001358 while (true) {
Chris Lattnerefa77172013-01-20 00:00:22 +00001359 // Advance to the next record, but if we get to the end of the block, don't
1360 // pop it (removing all the abbreviations from the cursor) since we want to
1361 // be able to reseek within the block and read entries.
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001362 unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd;
Chris Lattnerefa77172013-01-20 00:00:22 +00001363 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks(Flags);
1364
1365 switch (Entry.Kind) {
1366 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1367 case llvm::BitstreamEntry::Error:
1368 Error("malformed block record in AST file");
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001369 return Macro;
Chris Lattnerefa77172013-01-20 00:00:22 +00001370 case llvm::BitstreamEntry::EndBlock:
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001371 return Macro;
Chris Lattnerefa77172013-01-20 00:00:22 +00001372 case llvm::BitstreamEntry::Record:
1373 // The interesting case.
1374 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00001375 }
1376
1377 // Read a record.
Guy Benyei11169dd2012-12-18 14:30:41 +00001378 Record.clear();
1379 PreprocessorRecordTypes RecType =
Chris Lattner0e6c9402013-01-20 02:38:54 +00001380 (PreprocessorRecordTypes)Stream.readRecord(Entry.ID, Record);
Guy Benyei11169dd2012-12-18 14:30:41 +00001381 switch (RecType) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001382 case PP_MACRO_DIRECTIVE_HISTORY:
1383 return Macro;
1384
Guy Benyei11169dd2012-12-18 14:30:41 +00001385 case PP_MACRO_OBJECT_LIKE:
1386 case PP_MACRO_FUNCTION_LIKE: {
1387 // If we already have a macro, that means that we've hit the end
1388 // of the definition of the macro we were looking for. We're
1389 // done.
1390 if (Macro)
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001391 return Macro;
Guy Benyei11169dd2012-12-18 14:30:41 +00001392
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001393 unsigned NextIndex = 1; // Skip identifier ID.
1394 SubmoduleID SubModID = getGlobalSubmoduleID(F, Record[NextIndex++]);
Guy Benyei11169dd2012-12-18 14:30:41 +00001395 SourceLocation Loc = ReadSourceLocation(F, Record, NextIndex);
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001396 MacroInfo *MI = PP.AllocateDeserializedMacroInfo(Loc, SubModID);
Argyrios Kyrtzidis7572be22013-01-07 19:16:23 +00001397 MI->setDefinitionEndLoc(ReadSourceLocation(F, Record, NextIndex));
Guy Benyei11169dd2012-12-18 14:30:41 +00001398 MI->setIsUsed(Record[NextIndex++]);
Argyrios Kyrtzidis9ef53ce2014-04-09 18:21:23 +00001399 MI->setUsedForHeaderGuard(Record[NextIndex++]);
Guy Benyei11169dd2012-12-18 14:30:41 +00001400
Guy Benyei11169dd2012-12-18 14:30:41 +00001401 if (RecType == PP_MACRO_FUNCTION_LIKE) {
1402 // Decode function-like macro info.
1403 bool isC99VarArgs = Record[NextIndex++];
1404 bool isGNUVarArgs = Record[NextIndex++];
1405 bool hasCommaPasting = Record[NextIndex++];
1406 MacroArgs.clear();
1407 unsigned NumArgs = Record[NextIndex++];
1408 for (unsigned i = 0; i != NumArgs; ++i)
1409 MacroArgs.push_back(getLocalIdentifier(F, Record[NextIndex++]));
1410
1411 // Install function-like macro info.
1412 MI->setIsFunctionLike();
1413 if (isC99VarArgs) MI->setIsC99Varargs();
1414 if (isGNUVarArgs) MI->setIsGNUVarargs();
1415 if (hasCommaPasting) MI->setHasCommaPasting();
1416 MI->setArgumentList(MacroArgs.data(), MacroArgs.size(),
1417 PP.getPreprocessorAllocator());
1418 }
1419
Guy Benyei11169dd2012-12-18 14:30:41 +00001420 // Remember that we saw this macro last so that we add the tokens that
1421 // form its body to it.
1422 Macro = MI;
1423
1424 if (NextIndex + 1 == Record.size() && PP.getPreprocessingRecord() &&
1425 Record[NextIndex]) {
1426 // We have a macro definition. Register the association
1427 PreprocessedEntityID
1428 GlobalID = getGlobalPreprocessedEntityID(F, Record[NextIndex]);
1429 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
Argyrios Kyrtzidis832de9f2013-02-22 18:35:59 +00001430 PreprocessingRecord::PPEntityID
1431 PPID = PPRec.getPPEntityID(GlobalID-1, /*isLoaded=*/true);
1432 MacroDefinition *PPDef =
1433 cast_or_null<MacroDefinition>(PPRec.getPreprocessedEntity(PPID));
1434 if (PPDef)
1435 PPRec.RegisterMacroDefinition(Macro, PPDef);
Guy Benyei11169dd2012-12-18 14:30:41 +00001436 }
1437
1438 ++NumMacrosRead;
1439 break;
1440 }
1441
1442 case PP_TOKEN: {
1443 // If we see a TOKEN before a PP_MACRO_*, then the file is
1444 // erroneous, just pretend we didn't see this.
Craig Toppera13603a2014-05-22 05:54:18 +00001445 if (!Macro) break;
Guy Benyei11169dd2012-12-18 14:30:41 +00001446
John McCallf413f5e2013-05-03 00:10:13 +00001447 unsigned Idx = 0;
1448 Token Tok = ReadToken(F, Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00001449 Macro->AddTokenToBody(Tok);
1450 break;
1451 }
1452 }
1453 }
1454}
1455
1456PreprocessedEntityID
1457ASTReader::getGlobalPreprocessedEntityID(ModuleFile &M, unsigned LocalID) const {
1458 ContinuousRangeMap<uint32_t, int, 2>::const_iterator
1459 I = M.PreprocessedEntityRemap.find(LocalID - NUM_PREDEF_PP_ENTITY_IDS);
1460 assert(I != M.PreprocessedEntityRemap.end()
1461 && "Invalid index into preprocessed entity index remap");
1462
1463 return LocalID + I->second;
1464}
1465
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001466unsigned HeaderFileInfoTrait::ComputeHash(internal_key_ref ikey) {
1467 return llvm::hash_combine(ikey.Size, ikey.ModTime);
Guy Benyei11169dd2012-12-18 14:30:41 +00001468}
1469
1470HeaderFileInfoTrait::internal_key_type
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001471HeaderFileInfoTrait::GetInternalKey(const FileEntry *FE) {
1472 internal_key_type ikey = { FE->getSize(), FE->getModificationTime(),
1473 FE->getName() };
1474 return ikey;
1475}
Guy Benyei11169dd2012-12-18 14:30:41 +00001476
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001477bool HeaderFileInfoTrait::EqualKey(internal_key_ref a, internal_key_ref b) {
1478 if (a.Size != b.Size || a.ModTime != b.ModTime)
Guy Benyei11169dd2012-12-18 14:30:41 +00001479 return false;
1480
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001481 if (strcmp(a.Filename, b.Filename) == 0)
1482 return true;
1483
Guy Benyei11169dd2012-12-18 14:30:41 +00001484 // Determine whether the actual files are equivalent.
Argyrios Kyrtzidis2a513e82013-03-04 20:33:40 +00001485 FileManager &FileMgr = Reader.getFileManager();
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001486 const FileEntry *FEA = FileMgr.getFile(a.Filename);
1487 const FileEntry *FEB = FileMgr.getFile(b.Filename);
Argyrios Kyrtzidis2a513e82013-03-04 20:33:40 +00001488 return (FEA && FEA == FEB);
Guy Benyei11169dd2012-12-18 14:30:41 +00001489}
1490
1491std::pair<unsigned, unsigned>
1492HeaderFileInfoTrait::ReadKeyDataLength(const unsigned char*& d) {
Justin Bogner57ba0b22014-03-28 22:03:24 +00001493 using namespace llvm::support;
1494 unsigned KeyLen = (unsigned) endian::readNext<uint16_t, little, unaligned>(d);
Guy Benyei11169dd2012-12-18 14:30:41 +00001495 unsigned DataLen = (unsigned) *d++;
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001496 return std::make_pair(KeyLen, DataLen);
Guy Benyei11169dd2012-12-18 14:30:41 +00001497}
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001498
1499HeaderFileInfoTrait::internal_key_type
1500HeaderFileInfoTrait::ReadKey(const unsigned char *d, unsigned) {
Justin Bogner57ba0b22014-03-28 22:03:24 +00001501 using namespace llvm::support;
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001502 internal_key_type ikey;
Justin Bogner57ba0b22014-03-28 22:03:24 +00001503 ikey.Size = off_t(endian::readNext<uint64_t, little, unaligned>(d));
1504 ikey.ModTime = time_t(endian::readNext<uint64_t, little, unaligned>(d));
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001505 ikey.Filename = (const char *)d;
1506 return ikey;
1507}
1508
Guy Benyei11169dd2012-12-18 14:30:41 +00001509HeaderFileInfoTrait::data_type
Argyrios Kyrtzidisb146baa2013-03-13 21:13:51 +00001510HeaderFileInfoTrait::ReadData(internal_key_ref key, const unsigned char *d,
Guy Benyei11169dd2012-12-18 14:30:41 +00001511 unsigned DataLen) {
1512 const unsigned char *End = d + DataLen;
Justin Bogner57ba0b22014-03-28 22:03:24 +00001513 using namespace llvm::support;
Guy Benyei11169dd2012-12-18 14:30:41 +00001514 HeaderFileInfo HFI;
1515 unsigned Flags = *d++;
Lawrence Crowlb53e5482013-06-20 21:14:14 +00001516 HFI.HeaderRole = static_cast<ModuleMap::ModuleHeaderRole>
1517 ((Flags >> 6) & 0x03);
Guy Benyei11169dd2012-12-18 14:30:41 +00001518 HFI.isImport = (Flags >> 5) & 0x01;
1519 HFI.isPragmaOnce = (Flags >> 4) & 0x01;
1520 HFI.DirInfo = (Flags >> 2) & 0x03;
1521 HFI.Resolved = (Flags >> 1) & 0x01;
1522 HFI.IndexHeaderMapHeader = Flags & 0x01;
Justin Bogner57ba0b22014-03-28 22:03:24 +00001523 HFI.NumIncludes = endian::readNext<uint16_t, little, unaligned>(d);
1524 HFI.ControllingMacroID = Reader.getGlobalIdentifierID(
1525 M, endian::readNext<uint32_t, little, unaligned>(d));
1526 if (unsigned FrameworkOffset =
1527 endian::readNext<uint32_t, little, unaligned>(d)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001528 // The framework offset is 1 greater than the actual offset,
1529 // since 0 is used as an indicator for "no framework name".
1530 StringRef FrameworkName(FrameworkStrings + FrameworkOffset - 1);
1531 HFI.Framework = HS->getUniqueFrameworkName(FrameworkName);
1532 }
1533
Argyrios Kyrtzidisb146baa2013-03-13 21:13:51 +00001534 if (d != End) {
Justin Bogner57ba0b22014-03-28 22:03:24 +00001535 uint32_t LocalSMID = endian::readNext<uint32_t, little, unaligned>(d);
Argyrios Kyrtzidisb146baa2013-03-13 21:13:51 +00001536 if (LocalSMID) {
1537 // This header is part of a module. Associate it with the module to enable
1538 // implicit module import.
1539 SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID);
1540 Module *Mod = Reader.getSubmodule(GlobalSMID);
1541 HFI.isModuleHeader = true;
1542 FileManager &FileMgr = Reader.getFileManager();
1543 ModuleMap &ModMap =
1544 Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap();
Lawrence Crowlb53e5482013-06-20 21:14:14 +00001545 ModMap.addHeader(Mod, FileMgr.getFile(key.Filename), HFI.getHeaderRole());
Argyrios Kyrtzidisb146baa2013-03-13 21:13:51 +00001546 }
1547 }
1548
Guy Benyei11169dd2012-12-18 14:30:41 +00001549 assert(End == d && "Wrong data length in HeaderFileInfo deserialization");
1550 (void)End;
1551
1552 // This HeaderFileInfo was externally loaded.
1553 HFI.External = true;
1554 return HFI;
1555}
1556
Richard Smith49f906a2014-03-01 00:08:04 +00001557void
1558ASTReader::addPendingMacroFromModule(IdentifierInfo *II, ModuleFile *M,
1559 GlobalMacroID GMacID,
Craig Topper00bbdcf2014-06-28 23:22:23 +00001560 ArrayRef<SubmoduleID> Overrides) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001561 assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard");
Craig Toppera13603a2014-05-22 05:54:18 +00001562 SubmoduleID *OverrideData = nullptr;
Richard Smith49f906a2014-03-01 00:08:04 +00001563 if (!Overrides.empty()) {
1564 OverrideData = new (Context) SubmoduleID[Overrides.size() + 1];
1565 OverrideData[0] = Overrides.size();
1566 for (unsigned I = 0; I != Overrides.size(); ++I)
1567 OverrideData[I + 1] = getGlobalSubmoduleID(*M, Overrides[I]);
1568 }
1569 PendingMacroIDs[II].push_back(PendingMacroInfo(M, GMacID, OverrideData));
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001570}
1571
1572void ASTReader::addPendingMacroFromPCH(IdentifierInfo *II,
1573 ModuleFile *M,
1574 uint64_t MacroDirectivesOffset) {
1575 assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard");
1576 PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset));
Guy Benyei11169dd2012-12-18 14:30:41 +00001577}
1578
1579void ASTReader::ReadDefinedMacros() {
1580 // Note that we are loading defined macros.
1581 Deserializing Macros(this);
1582
1583 for (ModuleReverseIterator I = ModuleMgr.rbegin(),
1584 E = ModuleMgr.rend(); I != E; ++I) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001585 BitstreamCursor &MacroCursor = (*I)->MacroCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00001586
1587 // If there was no preprocessor block, skip this file.
1588 if (!MacroCursor.getBitStreamReader())
1589 continue;
1590
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001591 BitstreamCursor Cursor = MacroCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00001592 Cursor.JumpToBit((*I)->MacroStartOffset);
1593
1594 RecordData Record;
1595 while (true) {
Chris Lattnere7b154b2013-01-19 21:39:22 +00001596 llvm::BitstreamEntry E = Cursor.advanceSkippingSubblocks();
1597
1598 switch (E.Kind) {
1599 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1600 case llvm::BitstreamEntry::Error:
1601 Error("malformed block record in AST file");
1602 return;
1603 case llvm::BitstreamEntry::EndBlock:
1604 goto NextCursor;
1605
1606 case llvm::BitstreamEntry::Record:
Chris Lattnere7b154b2013-01-19 21:39:22 +00001607 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00001608 switch (Cursor.readRecord(E.ID, Record)) {
Chris Lattnere7b154b2013-01-19 21:39:22 +00001609 default: // Default behavior: ignore.
1610 break;
1611
1612 case PP_MACRO_OBJECT_LIKE:
1613 case PP_MACRO_FUNCTION_LIKE:
1614 getLocalIdentifier(**I, Record[0]);
1615 break;
1616
1617 case PP_TOKEN:
1618 // Ignore tokens.
1619 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00001620 }
Guy Benyei11169dd2012-12-18 14:30:41 +00001621 break;
1622 }
1623 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00001624 NextCursor: ;
Guy Benyei11169dd2012-12-18 14:30:41 +00001625 }
1626}
1627
1628namespace {
1629 /// \brief Visitor class used to look up identifirs in an AST file.
1630 class IdentifierLookupVisitor {
1631 StringRef Name;
1632 unsigned PriorGeneration;
Douglas Gregor00a50f72013-01-25 00:38:33 +00001633 unsigned &NumIdentifierLookups;
1634 unsigned &NumIdentifierLookupHits;
Guy Benyei11169dd2012-12-18 14:30:41 +00001635 IdentifierInfo *Found;
Douglas Gregor00a50f72013-01-25 00:38:33 +00001636
Guy Benyei11169dd2012-12-18 14:30:41 +00001637 public:
Douglas Gregor00a50f72013-01-25 00:38:33 +00001638 IdentifierLookupVisitor(StringRef Name, unsigned PriorGeneration,
1639 unsigned &NumIdentifierLookups,
1640 unsigned &NumIdentifierLookupHits)
Douglas Gregor7211ac12013-01-25 23:32:03 +00001641 : Name(Name), PriorGeneration(PriorGeneration),
Douglas Gregor00a50f72013-01-25 00:38:33 +00001642 NumIdentifierLookups(NumIdentifierLookups),
1643 NumIdentifierLookupHits(NumIdentifierLookupHits),
1644 Found()
1645 {
1646 }
Guy Benyei11169dd2012-12-18 14:30:41 +00001647
1648 static bool visit(ModuleFile &M, void *UserData) {
1649 IdentifierLookupVisitor *This
1650 = static_cast<IdentifierLookupVisitor *>(UserData);
1651
1652 // If we've already searched this module file, skip it now.
1653 if (M.Generation <= This->PriorGeneration)
1654 return true;
Douglas Gregore060e572013-01-25 01:03:03 +00001655
Guy Benyei11169dd2012-12-18 14:30:41 +00001656 ASTIdentifierLookupTable *IdTable
1657 = (ASTIdentifierLookupTable *)M.IdentifierLookupTable;
1658 if (!IdTable)
1659 return false;
1660
1661 ASTIdentifierLookupTrait Trait(IdTable->getInfoObj().getReader(),
1662 M, This->Found);
Douglas Gregor00a50f72013-01-25 00:38:33 +00001663 ++This->NumIdentifierLookups;
1664 ASTIdentifierLookupTable::iterator Pos = IdTable->find(This->Name,&Trait);
Guy Benyei11169dd2012-12-18 14:30:41 +00001665 if (Pos == IdTable->end())
1666 return false;
1667
1668 // Dereferencing the iterator has the effect of building the
1669 // IdentifierInfo node and populating it with the various
1670 // declarations it needs.
Douglas Gregor00a50f72013-01-25 00:38:33 +00001671 ++This->NumIdentifierLookupHits;
Guy Benyei11169dd2012-12-18 14:30:41 +00001672 This->Found = *Pos;
1673 return true;
1674 }
1675
1676 // \brief Retrieve the identifier info found within the module
1677 // files.
1678 IdentifierInfo *getIdentifierInfo() const { return Found; }
1679 };
1680}
1681
1682void ASTReader::updateOutOfDateIdentifier(IdentifierInfo &II) {
1683 // Note that we are loading an identifier.
1684 Deserializing AnIdentifier(this);
1685
1686 unsigned PriorGeneration = 0;
1687 if (getContext().getLangOpts().Modules)
1688 PriorGeneration = IdentifierGeneration[&II];
Douglas Gregore060e572013-01-25 01:03:03 +00001689
1690 // If there is a global index, look there first to determine which modules
1691 // provably do not have any results for this identifier.
Douglas Gregor7211ac12013-01-25 23:32:03 +00001692 GlobalModuleIndex::HitSet Hits;
Craig Toppera13603a2014-05-22 05:54:18 +00001693 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
Douglas Gregore060e572013-01-25 01:03:03 +00001694 if (!loadGlobalIndex()) {
Douglas Gregor7211ac12013-01-25 23:32:03 +00001695 if (GlobalIndex->lookupIdentifier(II.getName(), Hits)) {
1696 HitsPtr = &Hits;
Douglas Gregore060e572013-01-25 01:03:03 +00001697 }
1698 }
1699
Douglas Gregor7211ac12013-01-25 23:32:03 +00001700 IdentifierLookupVisitor Visitor(II.getName(), PriorGeneration,
Douglas Gregor00a50f72013-01-25 00:38:33 +00001701 NumIdentifierLookups,
1702 NumIdentifierLookupHits);
Douglas Gregor7211ac12013-01-25 23:32:03 +00001703 ModuleMgr.visit(IdentifierLookupVisitor::visit, &Visitor, HitsPtr);
Guy Benyei11169dd2012-12-18 14:30:41 +00001704 markIdentifierUpToDate(&II);
1705}
1706
1707void ASTReader::markIdentifierUpToDate(IdentifierInfo *II) {
1708 if (!II)
1709 return;
1710
1711 II->setOutOfDate(false);
1712
1713 // Update the generation for this identifier.
1714 if (getContext().getLangOpts().Modules)
Richard Smith053f6c62014-05-16 23:01:30 +00001715 IdentifierGeneration[II] = getGeneration();
Guy Benyei11169dd2012-12-18 14:30:41 +00001716}
1717
Richard Smith49f906a2014-03-01 00:08:04 +00001718struct ASTReader::ModuleMacroInfo {
1719 SubmoduleID SubModID;
1720 MacroInfo *MI;
1721 SubmoduleID *Overrides;
1722 // FIXME: Remove this.
1723 ModuleFile *F;
1724
1725 bool isDefine() const { return MI; }
1726
1727 SubmoduleID getSubmoduleID() const { return SubModID; }
1728
Craig Topper00bbdcf2014-06-28 23:22:23 +00001729 ArrayRef<SubmoduleID> getOverriddenSubmodules() const {
Richard Smith49f906a2014-03-01 00:08:04 +00001730 if (!Overrides)
Craig Topper00bbdcf2014-06-28 23:22:23 +00001731 return None;
Richard Smith49f906a2014-03-01 00:08:04 +00001732 return llvm::makeArrayRef(Overrides + 1, *Overrides);
1733 }
1734
Richard Smithdaa69e02014-07-25 04:40:03 +00001735 MacroDirective *import(Preprocessor &PP, SourceLocation ImportLoc) const {
Richard Smith49f906a2014-03-01 00:08:04 +00001736 if (!MI)
Richard Smithdaa69e02014-07-25 04:40:03 +00001737 return PP.AllocateUndefMacroDirective(ImportLoc, SubModID,
1738 getOverriddenSubmodules());
1739 return PP.AllocateDefMacroDirective(MI, ImportLoc, SubModID,
1740 getOverriddenSubmodules());
Richard Smith49f906a2014-03-01 00:08:04 +00001741 }
1742};
1743
1744ASTReader::ModuleMacroInfo *
1745ASTReader::getModuleMacro(const PendingMacroInfo &PMInfo) {
1746 ModuleMacroInfo Info;
1747
1748 uint32_t ID = PMInfo.ModuleMacroData.MacID;
1749 if (ID & 1) {
1750 // Macro undefinition.
1751 Info.SubModID = getGlobalSubmoduleID(*PMInfo.M, ID >> 1);
Craig Toppera13603a2014-05-22 05:54:18 +00001752 Info.MI = nullptr;
Richard Smith49f906a2014-03-01 00:08:04 +00001753 } else {
1754 // Macro definition.
1755 GlobalMacroID GMacID = getGlobalMacroID(*PMInfo.M, ID >> 1);
1756 assert(GMacID);
1757
1758 // If this macro has already been loaded, don't do so again.
1759 // FIXME: This is highly dubious. Multiple macro definitions can have the
1760 // same MacroInfo (and hence the same GMacID) due to #pragma push_macro etc.
1761 if (MacrosLoaded[GMacID - NUM_PREDEF_MACRO_IDS])
Craig Toppera13603a2014-05-22 05:54:18 +00001762 return nullptr;
Richard Smith49f906a2014-03-01 00:08:04 +00001763
1764 Info.MI = getMacro(GMacID);
1765 Info.SubModID = Info.MI->getOwningModuleID();
1766 }
1767 Info.Overrides = PMInfo.ModuleMacroData.Overrides;
1768 Info.F = PMInfo.M;
1769
1770 return new (Context) ModuleMacroInfo(Info);
1771}
1772
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001773void ASTReader::resolvePendingMacro(IdentifierInfo *II,
1774 const PendingMacroInfo &PMInfo) {
1775 assert(II);
1776
Richard Smithe842a472014-10-22 02:05:46 +00001777 if (PMInfo.M->Kind != MK_ImplicitModule &&
1778 PMInfo.M->Kind != MK_ExplicitModule) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001779 installPCHMacroDirectives(II, *PMInfo.M,
1780 PMInfo.PCHMacroData.MacroDirectivesOffset);
1781 return;
1782 }
Richard Smith49f906a2014-03-01 00:08:04 +00001783
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001784 // Module Macro.
1785
Richard Smith49f906a2014-03-01 00:08:04 +00001786 ModuleMacroInfo *MMI = getModuleMacro(PMInfo);
1787 if (!MMI)
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001788 return;
1789
Richard Smith49f906a2014-03-01 00:08:04 +00001790 Module *Owner = getSubmodule(MMI->getSubmoduleID());
1791 if (Owner && Owner->NameVisibility == Module::Hidden) {
1792 // Macros in the owning module are hidden. Just remember this macro to
1793 // install if we make this module visible.
1794 HiddenNamesMap[Owner].HiddenMacros.insert(std::make_pair(II, MMI));
1795 } else {
Richard Smithdaa69e02014-07-25 04:40:03 +00001796 installImportedMacro(II, MMI, Owner);
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001797 }
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001798}
1799
1800void ASTReader::installPCHMacroDirectives(IdentifierInfo *II,
1801 ModuleFile &M, uint64_t Offset) {
Richard Smithe842a472014-10-22 02:05:46 +00001802 assert(M.Kind != MK_ImplicitModule && M.Kind != MK_ExplicitModule);
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001803
1804 BitstreamCursor &Cursor = M.MacroCursor;
1805 SavedStreamPosition SavedPosition(Cursor);
1806 Cursor.JumpToBit(Offset);
1807
1808 llvm::BitstreamEntry Entry =
1809 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
1810 if (Entry.Kind != llvm::BitstreamEntry::Record) {
1811 Error("malformed block record in AST file");
1812 return;
1813 }
1814
1815 RecordData Record;
1816 PreprocessorRecordTypes RecType =
1817 (PreprocessorRecordTypes)Cursor.readRecord(Entry.ID, Record);
1818 if (RecType != PP_MACRO_DIRECTIVE_HISTORY) {
1819 Error("malformed block record in AST file");
1820 return;
1821 }
1822
1823 // Deserialize the macro directives history in reverse source-order.
Craig Toppera13603a2014-05-22 05:54:18 +00001824 MacroDirective *Latest = nullptr, *Earliest = nullptr;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001825 unsigned Idx = 0, N = Record.size();
1826 while (Idx < N) {
Craig Toppera13603a2014-05-22 05:54:18 +00001827 MacroDirective *MD = nullptr;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001828 SourceLocation Loc = ReadSourceLocation(M, Record, Idx);
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00001829 MacroDirective::Kind K = (MacroDirective::Kind)Record[Idx++];
1830 switch (K) {
1831 case MacroDirective::MD_Define: {
1832 GlobalMacroID GMacID = getGlobalMacroID(M, Record[Idx++]);
1833 MacroInfo *MI = getMacro(GMacID);
Richard Smithdaa69e02014-07-25 04:40:03 +00001834 SubmoduleID ImportedFrom = Record[Idx++];
1835 bool IsAmbiguous = Record[Idx++];
1836 llvm::SmallVector<unsigned, 4> Overrides;
1837 if (ImportedFrom) {
1838 Overrides.insert(Overrides.end(),
1839 &Record[Idx] + 1, &Record[Idx] + 1 + Record[Idx]);
1840 Idx += Overrides.size() + 1;
1841 }
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00001842 DefMacroDirective *DefMD =
Richard Smithdaa69e02014-07-25 04:40:03 +00001843 PP.AllocateDefMacroDirective(MI, Loc, ImportedFrom, Overrides);
1844 DefMD->setAmbiguous(IsAmbiguous);
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00001845 MD = DefMD;
1846 break;
1847 }
Richard Smithdaa69e02014-07-25 04:40:03 +00001848 case MacroDirective::MD_Undefine: {
1849 SubmoduleID ImportedFrom = Record[Idx++];
1850 llvm::SmallVector<unsigned, 4> Overrides;
1851 if (ImportedFrom) {
1852 Overrides.insert(Overrides.end(),
1853 &Record[Idx] + 1, &Record[Idx] + 1 + Record[Idx]);
1854 Idx += Overrides.size() + 1;
1855 }
1856 MD = PP.AllocateUndefMacroDirective(Loc, ImportedFrom, Overrides);
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00001857 break;
Richard Smithdaa69e02014-07-25 04:40:03 +00001858 }
1859 case MacroDirective::MD_Visibility:
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00001860 bool isPublic = Record[Idx++];
1861 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic);
1862 break;
1863 }
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001864
1865 if (!Latest)
1866 Latest = MD;
1867 if (Earliest)
1868 Earliest->setPrevious(MD);
1869 Earliest = MD;
1870 }
1871
1872 PP.setLoadedMacroDirective(II, Latest);
1873}
1874
Argyrios Kyrtzidis3a9c42c2013-03-27 01:25:34 +00001875/// \brief For the given macro definitions, check if they are both in system
Douglas Gregor0b202052013-04-12 21:00:54 +00001876/// modules.
1877static bool areDefinedInSystemModules(MacroInfo *PrevMI, MacroInfo *NewMI,
Douglas Gregor5e461192013-06-07 22:56:11 +00001878 Module *NewOwner, ASTReader &Reader) {
Argyrios Kyrtzidis3a9c42c2013-03-27 01:25:34 +00001879 assert(PrevMI && NewMI);
Craig Toppera13603a2014-05-22 05:54:18 +00001880 Module *PrevOwner = nullptr;
Argyrios Kyrtzidis3a9c42c2013-03-27 01:25:34 +00001881 if (SubmoduleID PrevModID = PrevMI->getOwningModuleID())
1882 PrevOwner = Reader.getSubmodule(PrevModID);
Douglas Gregor5e461192013-06-07 22:56:11 +00001883 SourceManager &SrcMgr = Reader.getSourceManager();
1884 bool PrevInSystem
1885 = PrevOwner? PrevOwner->IsSystem
1886 : SrcMgr.isInSystemHeader(PrevMI->getDefinitionLoc());
1887 bool NewInSystem
1888 = NewOwner? NewOwner->IsSystem
1889 : SrcMgr.isInSystemHeader(NewMI->getDefinitionLoc());
1890 if (PrevOwner && PrevOwner == NewOwner)
Argyrios Kyrtzidis3a9c42c2013-03-27 01:25:34 +00001891 return false;
Douglas Gregor5e461192013-06-07 22:56:11 +00001892 return PrevInSystem && NewInSystem;
Argyrios Kyrtzidis3a9c42c2013-03-27 01:25:34 +00001893}
1894
Richard Smith49f906a2014-03-01 00:08:04 +00001895void ASTReader::removeOverriddenMacros(IdentifierInfo *II,
Richard Smithdaa69e02014-07-25 04:40:03 +00001896 SourceLocation ImportLoc,
Richard Smith49f906a2014-03-01 00:08:04 +00001897 AmbiguousMacros &Ambig,
Craig Topper00bbdcf2014-06-28 23:22:23 +00001898 ArrayRef<SubmoduleID> Overrides) {
Richard Smith49f906a2014-03-01 00:08:04 +00001899 for (unsigned OI = 0, ON = Overrides.size(); OI != ON; ++OI) {
1900 SubmoduleID OwnerID = Overrides[OI];
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001901
Richard Smith49f906a2014-03-01 00:08:04 +00001902 // If this macro is not yet visible, remove it from the hidden names list.
Richard Smithbb853c72014-08-13 01:23:33 +00001903 // It won't be there if we're in the middle of making the owner visible.
Richard Smith49f906a2014-03-01 00:08:04 +00001904 Module *Owner = getSubmodule(OwnerID);
Richard Smithbb853c72014-08-13 01:23:33 +00001905 auto HiddenIt = HiddenNamesMap.find(Owner);
1906 if (HiddenIt != HiddenNamesMap.end()) {
1907 HiddenNames &Hidden = HiddenIt->second;
1908 HiddenMacrosMap::iterator HI = Hidden.HiddenMacros.find(II);
1909 if (HI != Hidden.HiddenMacros.end()) {
1910 // Register the macro now so we don't lose it when we re-export.
1911 PP.appendMacroDirective(II, HI->second->import(PP, ImportLoc));
Richard Smithdaa69e02014-07-25 04:40:03 +00001912
Richard Smithbb853c72014-08-13 01:23:33 +00001913 auto SubOverrides = HI->second->getOverriddenSubmodules();
1914 Hidden.HiddenMacros.erase(HI);
1915 removeOverriddenMacros(II, ImportLoc, Ambig, SubOverrides);
1916 }
Richard Smith49f906a2014-03-01 00:08:04 +00001917 }
1918
1919 // If this macro is already in our list of conflicts, remove it from there.
Richard Smithbb29e512014-03-06 00:33:23 +00001920 Ambig.erase(
1921 std::remove_if(Ambig.begin(), Ambig.end(), [&](DefMacroDirective *MD) {
1922 return MD->getInfo()->getOwningModuleID() == OwnerID;
1923 }),
1924 Ambig.end());
Richard Smith49f906a2014-03-01 00:08:04 +00001925 }
1926}
1927
1928ASTReader::AmbiguousMacros *
1929ASTReader::removeOverriddenMacros(IdentifierInfo *II,
Richard Smithdaa69e02014-07-25 04:40:03 +00001930 SourceLocation ImportLoc,
Craig Topper00bbdcf2014-06-28 23:22:23 +00001931 ArrayRef<SubmoduleID> Overrides) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001932 MacroDirective *Prev = PP.getMacroDirective(II);
Richard Smith49f906a2014-03-01 00:08:04 +00001933 if (!Prev && Overrides.empty())
Craig Toppera13603a2014-05-22 05:54:18 +00001934 return nullptr;
Richard Smith49f906a2014-03-01 00:08:04 +00001935
Craig Toppera13603a2014-05-22 05:54:18 +00001936 DefMacroDirective *PrevDef = Prev ? Prev->getDefinition().getDirective()
1937 : nullptr;
Richard Smith49f906a2014-03-01 00:08:04 +00001938 if (PrevDef && PrevDef->isAmbiguous()) {
1939 // We had a prior ambiguity. Check whether we resolve it (or make it worse).
1940 AmbiguousMacros &Ambig = AmbiguousMacroDefs[II];
1941 Ambig.push_back(PrevDef);
1942
Richard Smithdaa69e02014-07-25 04:40:03 +00001943 removeOverriddenMacros(II, ImportLoc, Ambig, Overrides);
Richard Smith49f906a2014-03-01 00:08:04 +00001944
1945 if (!Ambig.empty())
1946 return &Ambig;
1947
1948 AmbiguousMacroDefs.erase(II);
1949 } else {
1950 // There's no ambiguity yet. Maybe we're introducing one.
Benjamin Kramer834652a2014-05-03 18:44:26 +00001951 AmbiguousMacros Ambig;
Richard Smith49f906a2014-03-01 00:08:04 +00001952 if (PrevDef)
1953 Ambig.push_back(PrevDef);
1954
Richard Smithdaa69e02014-07-25 04:40:03 +00001955 removeOverriddenMacros(II, ImportLoc, Ambig, Overrides);
Richard Smith49f906a2014-03-01 00:08:04 +00001956
1957 if (!Ambig.empty()) {
1958 AmbiguousMacros &Result = AmbiguousMacroDefs[II];
Benjamin Kramer834652a2014-05-03 18:44:26 +00001959 std::swap(Result, Ambig);
Richard Smith49f906a2014-03-01 00:08:04 +00001960 return &Result;
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00001961 }
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001962 }
Richard Smith49f906a2014-03-01 00:08:04 +00001963
1964 // We ended up with no ambiguity.
Craig Toppera13603a2014-05-22 05:54:18 +00001965 return nullptr;
Richard Smith49f906a2014-03-01 00:08:04 +00001966}
1967
1968void ASTReader::installImportedMacro(IdentifierInfo *II, ModuleMacroInfo *MMI,
Richard Smithdaa69e02014-07-25 04:40:03 +00001969 Module *Owner) {
Richard Smith49f906a2014-03-01 00:08:04 +00001970 assert(II && Owner);
1971
1972 SourceLocation ImportLoc = Owner->MacroVisibilityLoc;
Richard Smithdaa69e02014-07-25 04:40:03 +00001973 if (ImportLoc.isInvalid()) {
Richard Smith49f906a2014-03-01 00:08:04 +00001974 // FIXME: If we made macros from this module visible but didn't provide a
1975 // source location for the import, we don't have a location for the macro.
1976 // Use the location at which the containing module file was first imported
1977 // for now.
1978 ImportLoc = MMI->F->DirectImportLoc;
Richard Smith56be7542014-03-21 00:33:59 +00001979 assert(ImportLoc.isValid() && "no import location for a visible macro?");
Richard Smith49f906a2014-03-01 00:08:04 +00001980 }
1981
Benjamin Kramer834652a2014-05-03 18:44:26 +00001982 AmbiguousMacros *Prev =
Richard Smithdaa69e02014-07-25 04:40:03 +00001983 removeOverriddenMacros(II, ImportLoc, MMI->getOverriddenSubmodules());
Richard Smith49f906a2014-03-01 00:08:04 +00001984
Richard Smith49f906a2014-03-01 00:08:04 +00001985 // Create a synthetic macro definition corresponding to the import (or null
1986 // if this was an undefinition of the macro).
Richard Smithdaa69e02014-07-25 04:40:03 +00001987 MacroDirective *Imported = MMI->import(PP, ImportLoc);
1988 DefMacroDirective *MD = dyn_cast<DefMacroDirective>(Imported);
Richard Smith49f906a2014-03-01 00:08:04 +00001989
1990 // If there's no ambiguity, just install the macro.
1991 if (!Prev) {
Richard Smithdaa69e02014-07-25 04:40:03 +00001992 PP.appendMacroDirective(II, Imported);
Richard Smith49f906a2014-03-01 00:08:04 +00001993 return;
1994 }
1995 assert(!Prev->empty());
1996
1997 if (!MD) {
1998 // We imported a #undef that didn't remove all prior definitions. The most
1999 // recent prior definition remains, and we install it in the place of the
Richard Smithdaa69e02014-07-25 04:40:03 +00002000 // imported directive, as if by a local #pragma pop_macro.
Richard Smith49f906a2014-03-01 00:08:04 +00002001 MacroInfo *NewMI = Prev->back()->getInfo();
2002 Prev->pop_back();
Richard Smithdaa69e02014-07-25 04:40:03 +00002003 MD = PP.AllocateDefMacroDirective(NewMI, ImportLoc);
2004
2005 // Install our #undef first so that we don't lose track of it. We'll replace
2006 // this with whichever macro definition ends up winning.
2007 PP.appendMacroDirective(II, Imported);
Richard Smith49f906a2014-03-01 00:08:04 +00002008 }
2009
2010 // We're introducing a macro definition that creates or adds to an ambiguity.
2011 // We can resolve that ambiguity if this macro is token-for-token identical to
2012 // all of the existing definitions.
2013 MacroInfo *NewMI = MD->getInfo();
2014 assert(NewMI && "macro definition with no MacroInfo?");
2015 while (!Prev->empty()) {
2016 MacroInfo *PrevMI = Prev->back()->getInfo();
2017 assert(PrevMI && "macro definition with no MacroInfo?");
2018
2019 // Before marking the macros as ambiguous, check if this is a case where
2020 // both macros are in system headers. If so, we trust that the system
2021 // did not get it wrong. This also handles cases where Clang's own
2022 // headers have a different spelling of certain system macros:
2023 // #define LONG_MAX __LONG_MAX__ (clang's limits.h)
2024 // #define LONG_MAX 0x7fffffffffffffffL (system's limits.h)
2025 //
2026 // FIXME: Remove the defined-in-system-headers check. clang's limits.h
2027 // overrides the system limits.h's macros, so there's no conflict here.
2028 if (NewMI != PrevMI &&
2029 !PrevMI->isIdenticalTo(*NewMI, PP, /*Syntactically=*/true) &&
2030 !areDefinedInSystemModules(PrevMI, NewMI, Owner, *this))
2031 break;
2032
2033 // The previous definition is the same as this one (or both are defined in
2034 // system modules so we can assume they're equivalent); we don't need to
2035 // track it any more.
2036 Prev->pop_back();
2037 }
2038
2039 if (!Prev->empty())
2040 MD->setAmbiguous(true);
2041
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00002042 PP.appendMacroDirective(II, MD);
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00002043}
2044
Argyrios Kyrtzidisce9b49e2014-03-14 02:26:27 +00002045ASTReader::InputFileInfo
2046ASTReader::readInputFileInfo(ModuleFile &F, unsigned ID) {
Ben Langmuir198c1682014-03-07 07:27:49 +00002047 // Go find this input file.
2048 BitstreamCursor &Cursor = F.InputFilesCursor;
2049 SavedStreamPosition SavedPosition(Cursor);
2050 Cursor.JumpToBit(F.InputFileOffsets[ID-1]);
2051
2052 unsigned Code = Cursor.ReadCode();
2053 RecordData Record;
2054 StringRef Blob;
2055
2056 unsigned Result = Cursor.readRecord(Code, Record, &Blob);
2057 assert(static_cast<InputFileRecordTypes>(Result) == INPUT_FILE &&
2058 "invalid record type for input file");
2059 (void)Result;
2060
Argyrios Kyrtzidisce9b49e2014-03-14 02:26:27 +00002061 std::string Filename;
2062 off_t StoredSize;
2063 time_t StoredTime;
2064 bool Overridden;
2065
Ben Langmuir198c1682014-03-07 07:27:49 +00002066 assert(Record[0] == ID && "Bogus stored ID or offset");
2067 StoredSize = static_cast<off_t>(Record[1]);
2068 StoredTime = static_cast<time_t>(Record[2]);
2069 Overridden = static_cast<bool>(Record[3]);
2070 Filename = Blob;
2071 MaybeAddSystemRootToFilename(F, Filename);
Argyrios Kyrtzidisce9b49e2014-03-14 02:26:27 +00002072
Hans Wennborg73945142014-03-14 17:45:06 +00002073 InputFileInfo R = { std::move(Filename), StoredSize, StoredTime, Overridden };
2074 return R;
Ben Langmuir198c1682014-03-07 07:27:49 +00002075}
2076
2077std::string ASTReader::getInputFileName(ModuleFile &F, unsigned int ID) {
Argyrios Kyrtzidisce9b49e2014-03-14 02:26:27 +00002078 return readInputFileInfo(F, ID).Filename;
Ben Langmuir198c1682014-03-07 07:27:49 +00002079}
2080
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00002081InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002082 // If this ID is bogus, just return an empty input file.
2083 if (ID == 0 || ID > F.InputFilesLoaded.size())
2084 return InputFile();
2085
2086 // If we've already loaded this input file, return it.
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00002087 if (F.InputFilesLoaded[ID-1].getFile())
Guy Benyei11169dd2012-12-18 14:30:41 +00002088 return F.InputFilesLoaded[ID-1];
2089
Argyrios Kyrtzidis9308f0a2014-01-08 19:13:34 +00002090 if (F.InputFilesLoaded[ID-1].isNotFound())
2091 return InputFile();
2092
Guy Benyei11169dd2012-12-18 14:30:41 +00002093 // Go find this input file.
Chris Lattner7fb3bef2013-01-20 00:56:42 +00002094 BitstreamCursor &Cursor = F.InputFilesCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00002095 SavedStreamPosition SavedPosition(Cursor);
2096 Cursor.JumpToBit(F.InputFileOffsets[ID-1]);
2097
Argyrios Kyrtzidisce9b49e2014-03-14 02:26:27 +00002098 InputFileInfo FI = readInputFileInfo(F, ID);
2099 off_t StoredSize = FI.StoredSize;
2100 time_t StoredTime = FI.StoredTime;
2101 bool Overridden = FI.Overridden;
2102 StringRef Filename = FI.Filename;
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00002103
Ben Langmuir198c1682014-03-07 07:27:49 +00002104 const FileEntry *File
2105 = Overridden? FileMgr.getVirtualFile(Filename, StoredSize, StoredTime)
2106 : FileMgr.getFile(Filename, /*OpenFile=*/false);
2107
2108 // If we didn't find the file, resolve it relative to the
2109 // original directory from which this AST file was created.
Craig Toppera13603a2014-05-22 05:54:18 +00002110 if (File == nullptr && !F.OriginalDir.empty() && !CurrentDir.empty() &&
Ben Langmuir198c1682014-03-07 07:27:49 +00002111 F.OriginalDir != CurrentDir) {
2112 std::string Resolved = resolveFileRelativeToOriginalDir(Filename,
2113 F.OriginalDir,
2114 CurrentDir);
2115 if (!Resolved.empty())
2116 File = FileMgr.getFile(Resolved);
2117 }
2118
2119 // For an overridden file, create a virtual file with the stored
2120 // size/timestamp.
Craig Toppera13603a2014-05-22 05:54:18 +00002121 if (Overridden && File == nullptr) {
Ben Langmuir198c1682014-03-07 07:27:49 +00002122 File = FileMgr.getVirtualFile(Filename, StoredSize, StoredTime);
2123 }
2124
Craig Toppera13603a2014-05-22 05:54:18 +00002125 if (File == nullptr) {
Ben Langmuir198c1682014-03-07 07:27:49 +00002126 if (Complain) {
2127 std::string ErrorStr = "could not find file '";
2128 ErrorStr += Filename;
2129 ErrorStr += "' referenced by AST file";
2130 Error(ErrorStr.c_str());
Guy Benyei11169dd2012-12-18 14:30:41 +00002131 }
Ben Langmuir198c1682014-03-07 07:27:49 +00002132 // Record that we didn't find the file.
2133 F.InputFilesLoaded[ID-1] = InputFile::getNotFound();
2134 return InputFile();
2135 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002136
Ben Langmuir198c1682014-03-07 07:27:49 +00002137 // Check if there was a request to override the contents of the file
2138 // that was part of the precompiled header. Overridding such a file
2139 // can lead to problems when lexing using the source locations from the
2140 // PCH.
2141 SourceManager &SM = getSourceManager();
2142 if (!Overridden && SM.isFileOverridden(File)) {
2143 if (Complain)
2144 Error(diag::err_fe_pch_file_overridden, Filename);
2145 // After emitting the diagnostic, recover by disabling the override so
2146 // that the original file will be used.
2147 SM.disableFileContentsOverride(File);
2148 // The FileEntry is a virtual file entry with the size of the contents
2149 // that would override the original contents. Set it to the original's
2150 // size/time.
2151 FileMgr.modifyFileEntry(const_cast<FileEntry*>(File),
2152 StoredSize, StoredTime);
2153 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002154
Ben Langmuir198c1682014-03-07 07:27:49 +00002155 bool IsOutOfDate = false;
2156
2157 // For an overridden file, there is nothing to validate.
2158 if (!Overridden && (StoredSize != File->getSize()
Guy Benyei11169dd2012-12-18 14:30:41 +00002159#if !defined(LLVM_ON_WIN32)
Ben Langmuir198c1682014-03-07 07:27:49 +00002160 // In our regression testing, the Windows file system seems to
2161 // have inconsistent modification times that sometimes
2162 // erroneously trigger this error-handling path.
2163 || StoredTime != File->getModificationTime()
Guy Benyei11169dd2012-12-18 14:30:41 +00002164#endif
Ben Langmuir198c1682014-03-07 07:27:49 +00002165 )) {
2166 if (Complain) {
2167 // Build a list of the PCH imports that got us here (in reverse).
2168 SmallVector<ModuleFile *, 4> ImportStack(1, &F);
2169 while (ImportStack.back()->ImportedBy.size() > 0)
2170 ImportStack.push_back(ImportStack.back()->ImportedBy[0]);
Ben Langmuire82630d2014-01-17 00:19:09 +00002171
Ben Langmuir198c1682014-03-07 07:27:49 +00002172 // The top-level PCH is stale.
2173 StringRef TopLevelPCHName(ImportStack.back()->FileName);
2174 Error(diag::err_fe_pch_file_modified, Filename, TopLevelPCHName);
Ben Langmuire82630d2014-01-17 00:19:09 +00002175
Ben Langmuir198c1682014-03-07 07:27:49 +00002176 // Print the import stack.
2177 if (ImportStack.size() > 1 && !Diags.isDiagnosticInFlight()) {
2178 Diag(diag::note_pch_required_by)
2179 << Filename << ImportStack[0]->FileName;
2180 for (unsigned I = 1; I < ImportStack.size(); ++I)
Ben Langmuire82630d2014-01-17 00:19:09 +00002181 Diag(diag::note_pch_required_by)
Ben Langmuir198c1682014-03-07 07:27:49 +00002182 << ImportStack[I-1]->FileName << ImportStack[I]->FileName;
Douglas Gregor7029ce12013-03-19 00:28:20 +00002183 }
2184
Ben Langmuir198c1682014-03-07 07:27:49 +00002185 if (!Diags.isDiagnosticInFlight())
2186 Diag(diag::note_pch_rebuild_required) << TopLevelPCHName;
Guy Benyei11169dd2012-12-18 14:30:41 +00002187 }
2188
Ben Langmuir198c1682014-03-07 07:27:49 +00002189 IsOutOfDate = true;
Guy Benyei11169dd2012-12-18 14:30:41 +00002190 }
2191
Ben Langmuir198c1682014-03-07 07:27:49 +00002192 InputFile IF = InputFile(File, Overridden, IsOutOfDate);
2193
2194 // Note that we've loaded this input file.
2195 F.InputFilesLoaded[ID-1] = IF;
2196 return IF;
Guy Benyei11169dd2012-12-18 14:30:41 +00002197}
2198
2199const FileEntry *ASTReader::getFileEntry(StringRef filenameStrRef) {
2200 ModuleFile &M = ModuleMgr.getPrimaryModule();
2201 std::string Filename = filenameStrRef;
2202 MaybeAddSystemRootToFilename(M, Filename);
2203 const FileEntry *File = FileMgr.getFile(Filename);
Craig Toppera13603a2014-05-22 05:54:18 +00002204 if (File == nullptr && !M.OriginalDir.empty() && !CurrentDir.empty() &&
Guy Benyei11169dd2012-12-18 14:30:41 +00002205 M.OriginalDir != CurrentDir) {
2206 std::string resolved = resolveFileRelativeToOriginalDir(Filename,
2207 M.OriginalDir,
2208 CurrentDir);
2209 if (!resolved.empty())
2210 File = FileMgr.getFile(resolved);
2211 }
2212
2213 return File;
2214}
2215
2216/// \brief If we are loading a relocatable PCH file, and the filename is
2217/// not an absolute path, add the system root to the beginning of the file
2218/// name.
2219void ASTReader::MaybeAddSystemRootToFilename(ModuleFile &M,
2220 std::string &Filename) {
2221 // If this is not a relocatable PCH file, there's nothing to do.
2222 if (!M.RelocatablePCH)
2223 return;
2224
2225 if (Filename.empty() || llvm::sys::path::is_absolute(Filename))
2226 return;
2227
2228 if (isysroot.empty()) {
2229 // If no system root was given, default to '/'
2230 Filename.insert(Filename.begin(), '/');
2231 return;
2232 }
2233
2234 unsigned Length = isysroot.size();
2235 if (isysroot[Length - 1] != '/')
2236 Filename.insert(Filename.begin(), '/');
2237
2238 Filename.insert(Filename.begin(), isysroot.begin(), isysroot.end());
2239}
2240
2241ASTReader::ASTReadResult
2242ASTReader::ReadControlBlock(ModuleFile &F,
Dmitri Gribenkof8579502013-01-12 19:30:44 +00002243 SmallVectorImpl<ImportedModule> &Loaded,
Ben Langmuirbeee15e2014-04-14 18:00:01 +00002244 const ModuleFile *ImportedBy,
Guy Benyei11169dd2012-12-18 14:30:41 +00002245 unsigned ClientLoadCapabilities) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00002246 BitstreamCursor &Stream = F.Stream;
Guy Benyei11169dd2012-12-18 14:30:41 +00002247
2248 if (Stream.EnterSubBlock(CONTROL_BLOCK_ID)) {
2249 Error("malformed block record in AST file");
2250 return Failure;
2251 }
2252
2253 // Read all of the records and blocks in the control block.
2254 RecordData Record;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002255 while (1) {
2256 llvm::BitstreamEntry Entry = Stream.advance();
2257
2258 switch (Entry.Kind) {
2259 case llvm::BitstreamEntry::Error:
2260 Error("malformed block record in AST file");
2261 return Failure;
Dmitri Gribenkof430da42014-02-12 10:33:14 +00002262 case llvm::BitstreamEntry::EndBlock: {
2263 // Validate input files.
2264 const HeaderSearchOptions &HSOpts =
2265 PP.getHeaderSearchInfo().getHeaderSearchOpts();
Ben Langmuircb69b572014-03-07 06:40:32 +00002266
2267 // All user input files reside at the index range [0, Record[1]), and
2268 // system input files reside at [Record[1], Record[0]).
2269 // Record is the one from INPUT_FILE_OFFSETS.
2270 unsigned NumInputs = Record[0];
2271 unsigned NumUserInputs = Record[1];
2272
Dmitri Gribenkof430da42014-02-12 10:33:14 +00002273 if (!DisableValidation &&
Ben Langmuir1e258222014-04-08 15:36:28 +00002274 (ValidateSystemInputs || !HSOpts.ModulesValidateOncePerBuildSession ||
Dmitri Gribenkof430da42014-02-12 10:33:14 +00002275 F.InputFilesValidationTimestamp <= HSOpts.BuildSessionTimestamp)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002276 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
Ben Langmuircb69b572014-03-07 06:40:32 +00002277
Dmitri Gribenkof430da42014-02-12 10:33:14 +00002278 // If we are reading a module, we will create a verification timestamp,
2279 // so we verify all input files. Otherwise, verify only user input
2280 // files.
Ben Langmuircb69b572014-03-07 06:40:32 +00002281
2282 unsigned N = NumUserInputs;
2283 if (ValidateSystemInputs ||
Richard Smithe842a472014-10-22 02:05:46 +00002284 (HSOpts.ModulesValidateOncePerBuildSession &&
2285 F.Kind == MK_ImplicitModule))
Ben Langmuircb69b572014-03-07 06:40:32 +00002286 N = NumInputs;
2287
Ben Langmuir3d4417c2014-02-07 17:31:11 +00002288 for (unsigned I = 0; I < N; ++I) {
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00002289 InputFile IF = getInputFile(F, I+1, Complain);
2290 if (!IF.getFile() || IF.isOutOfDate())
Guy Benyei11169dd2012-12-18 14:30:41 +00002291 return OutOfDate;
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00002292 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002293 }
Ben Langmuircb69b572014-03-07 06:40:32 +00002294
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +00002295 if (Listener)
2296 Listener->visitModuleFile(F.FileName);
2297
Ben Langmuircb69b572014-03-07 06:40:32 +00002298 if (Listener && Listener->needsInputFileVisitation()) {
2299 unsigned N = Listener->needsSystemInputFileVisitation() ? NumInputs
2300 : NumUserInputs;
Argyrios Kyrtzidis68ccbe02014-03-14 02:26:31 +00002301 for (unsigned I = 0; I < N; ++I) {
2302 bool IsSystem = I >= NumUserInputs;
2303 InputFileInfo FI = readInputFileInfo(F, I+1);
2304 Listener->visitInputFile(FI.Filename, IsSystem, FI.Overridden);
2305 }
Ben Langmuircb69b572014-03-07 06:40:32 +00002306 }
2307
Guy Benyei11169dd2012-12-18 14:30:41 +00002308 return Success;
Dmitri Gribenkof430da42014-02-12 10:33:14 +00002309 }
2310
Chris Lattnere7b154b2013-01-19 21:39:22 +00002311 case llvm::BitstreamEntry::SubBlock:
2312 switch (Entry.ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002313 case INPUT_FILES_BLOCK_ID:
2314 F.InputFilesCursor = Stream;
2315 if (Stream.SkipBlock() || // Skip with the main cursor
2316 // Read the abbreviations
2317 ReadBlockAbbrevs(F.InputFilesCursor, INPUT_FILES_BLOCK_ID)) {
2318 Error("malformed block record in AST file");
2319 return Failure;
2320 }
2321 continue;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002322
Guy Benyei11169dd2012-12-18 14:30:41 +00002323 default:
Chris Lattnere7b154b2013-01-19 21:39:22 +00002324 if (Stream.SkipBlock()) {
2325 Error("malformed block record in AST file");
2326 return Failure;
2327 }
2328 continue;
Guy Benyei11169dd2012-12-18 14:30:41 +00002329 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00002330
2331 case llvm::BitstreamEntry::Record:
2332 // The interesting case.
2333 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00002334 }
2335
2336 // Read and process a record.
2337 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00002338 StringRef Blob;
2339 switch ((ControlRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002340 case METADATA: {
2341 if (Record[0] != VERSION_MAJOR && !DisableValidation) {
2342 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
Dmitri Gribenko2228cd32014-02-11 15:40:09 +00002343 Diag(Record[0] < VERSION_MAJOR? diag::err_pch_version_too_old
2344 : diag::err_pch_version_too_new);
Guy Benyei11169dd2012-12-18 14:30:41 +00002345 return VersionMismatch;
2346 }
2347
2348 bool hasErrors = Record[5];
2349 if (hasErrors && !DisableValidation && !AllowASTWithCompilerErrors) {
2350 Diag(diag::err_pch_with_compiler_errors);
2351 return HadErrors;
2352 }
2353
2354 F.RelocatablePCH = Record[4];
2355
2356 const std::string &CurBranch = getClangFullRepositoryVersion();
Chris Lattner0e6c9402013-01-20 02:38:54 +00002357 StringRef ASTBranch = Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00002358 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) {
2359 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
Dmitri Gribenko2228cd32014-02-11 15:40:09 +00002360 Diag(diag::err_pch_different_branch) << ASTBranch << CurBranch;
Guy Benyei11169dd2012-12-18 14:30:41 +00002361 return VersionMismatch;
2362 }
2363 break;
2364 }
2365
2366 case IMPORTS: {
2367 // Load each of the imported PCH files.
2368 unsigned Idx = 0, N = Record.size();
2369 while (Idx < N) {
2370 // Read information about the AST file.
2371 ModuleKind ImportedKind = (ModuleKind)Record[Idx++];
2372 // The import location will be the local one for now; we will adjust
2373 // all import locations of module imports after the global source
2374 // location info are setup.
2375 SourceLocation ImportLoc =
2376 SourceLocation::getFromRawEncoding(Record[Idx++]);
Douglas Gregor7029ce12013-03-19 00:28:20 +00002377 off_t StoredSize = (off_t)Record[Idx++];
2378 time_t StoredModTime = (time_t)Record[Idx++];
Guy Benyei11169dd2012-12-18 14:30:41 +00002379 unsigned Length = Record[Idx++];
2380 SmallString<128> ImportedFile(Record.begin() + Idx,
2381 Record.begin() + Idx + Length);
2382 Idx += Length;
2383
2384 // Load the AST file.
2385 switch(ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F, Loaded,
Douglas Gregor7029ce12013-03-19 00:28:20 +00002386 StoredSize, StoredModTime,
Guy Benyei11169dd2012-12-18 14:30:41 +00002387 ClientLoadCapabilities)) {
2388 case Failure: return Failure;
2389 // If we have to ignore the dependency, we'll have to ignore this too.
Douglas Gregor2f1806e2013-03-19 00:38:50 +00002390 case Missing:
Guy Benyei11169dd2012-12-18 14:30:41 +00002391 case OutOfDate: return OutOfDate;
2392 case VersionMismatch: return VersionMismatch;
2393 case ConfigurationMismatch: return ConfigurationMismatch;
2394 case HadErrors: return HadErrors;
2395 case Success: break;
2396 }
2397 }
2398 break;
2399 }
2400
2401 case LANGUAGE_OPTIONS: {
2402 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2403 if (Listener && &F == *ModuleMgr.begin() &&
2404 ParseLanguageOptions(Record, Complain, *Listener) &&
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002405 !DisableValidation && !AllowConfigurationMismatch)
Guy Benyei11169dd2012-12-18 14:30:41 +00002406 return ConfigurationMismatch;
2407 break;
2408 }
2409
2410 case TARGET_OPTIONS: {
2411 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
2412 if (Listener && &F == *ModuleMgr.begin() &&
2413 ParseTargetOptions(Record, Complain, *Listener) &&
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002414 !DisableValidation && !AllowConfigurationMismatch)
Guy Benyei11169dd2012-12-18 14:30:41 +00002415 return ConfigurationMismatch;
2416 break;
2417 }
2418
2419 case DIAGNOSTIC_OPTIONS: {
Ben Langmuirb92de022014-04-29 16:25:26 +00002420 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate)==0;
Guy Benyei11169dd2012-12-18 14:30:41 +00002421 if (Listener && &F == *ModuleMgr.begin() &&
2422 ParseDiagnosticOptions(Record, Complain, *Listener) &&
Ben Langmuirb92de022014-04-29 16:25:26 +00002423 !DisableValidation)
2424 return OutOfDate;
Guy Benyei11169dd2012-12-18 14:30:41 +00002425 break;
2426 }
2427
2428 case FILE_SYSTEM_OPTIONS: {
2429 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
2430 if (Listener && &F == *ModuleMgr.begin() &&
2431 ParseFileSystemOptions(Record, Complain, *Listener) &&
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002432 !DisableValidation && !AllowConfigurationMismatch)
Guy Benyei11169dd2012-12-18 14:30:41 +00002433 return ConfigurationMismatch;
2434 break;
2435 }
2436
2437 case HEADER_SEARCH_OPTIONS: {
2438 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
2439 if (Listener && &F == *ModuleMgr.begin() &&
2440 ParseHeaderSearchOptions(Record, Complain, *Listener) &&
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002441 !DisableValidation && !AllowConfigurationMismatch)
Guy Benyei11169dd2012-12-18 14:30:41 +00002442 return ConfigurationMismatch;
2443 break;
2444 }
2445
2446 case PREPROCESSOR_OPTIONS: {
2447 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
2448 if (Listener && &F == *ModuleMgr.begin() &&
2449 ParsePreprocessorOptions(Record, Complain, *Listener,
2450 SuggestedPredefines) &&
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002451 !DisableValidation && !AllowConfigurationMismatch)
Guy Benyei11169dd2012-12-18 14:30:41 +00002452 return ConfigurationMismatch;
2453 break;
2454 }
2455
2456 case ORIGINAL_FILE:
2457 F.OriginalSourceFileID = FileID::get(Record[0]);
Chris Lattner0e6c9402013-01-20 02:38:54 +00002458 F.ActualOriginalSourceFileName = Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00002459 F.OriginalSourceFileName = F.ActualOriginalSourceFileName;
2460 MaybeAddSystemRootToFilename(F, F.OriginalSourceFileName);
2461 break;
2462
2463 case ORIGINAL_FILE_ID:
2464 F.OriginalSourceFileID = FileID::get(Record[0]);
2465 break;
2466
2467 case ORIGINAL_PCH_DIR:
Chris Lattner0e6c9402013-01-20 02:38:54 +00002468 F.OriginalDir = Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00002469 break;
2470
Ben Langmuirbeee15e2014-04-14 18:00:01 +00002471 case MODULE_NAME:
2472 F.ModuleName = Blob;
Ben Langmuir4f5212a2014-04-14 22:12:44 +00002473 if (Listener)
2474 Listener->ReadModuleName(F.ModuleName);
Ben Langmuirbeee15e2014-04-14 18:00:01 +00002475 break;
2476
2477 case MODULE_MAP_FILE:
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00002478 if (ASTReadResult Result =
2479 ReadModuleMapFileBlock(Record, F, ImportedBy, ClientLoadCapabilities))
2480 return Result;
Guy Benyei11169dd2012-12-18 14:30:41 +00002481 case INPUT_FILE_OFFSETS:
Chris Lattner0e6c9402013-01-20 02:38:54 +00002482 F.InputFileOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002483 F.InputFilesLoaded.resize(Record[0]);
2484 break;
2485 }
2486 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002487}
2488
Ben Langmuir2c9af442014-04-10 17:57:43 +00002489ASTReader::ASTReadResult
2490ASTReader::ReadASTBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00002491 BitstreamCursor &Stream = F.Stream;
Guy Benyei11169dd2012-12-18 14:30:41 +00002492
2493 if (Stream.EnterSubBlock(AST_BLOCK_ID)) {
2494 Error("malformed block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002495 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002496 }
2497
2498 // Read all of the records and blocks for the AST file.
2499 RecordData Record;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002500 while (1) {
2501 llvm::BitstreamEntry Entry = Stream.advance();
2502
2503 switch (Entry.Kind) {
2504 case llvm::BitstreamEntry::Error:
2505 Error("error at end of module block in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002506 return Failure;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002507 case llvm::BitstreamEntry::EndBlock: {
Richard Smithc0fbba72013-04-03 22:49:41 +00002508 // Outside of C++, we do not store a lookup map for the translation unit.
2509 // Instead, mark it as needing a lookup map to be built if this module
2510 // contains any declarations lexically within it (which it always does!).
2511 // This usually has no cost, since we very rarely need the lookup map for
2512 // the translation unit outside C++.
Guy Benyei11169dd2012-12-18 14:30:41 +00002513 DeclContext *DC = Context.getTranslationUnitDecl();
Richard Smithc0fbba72013-04-03 22:49:41 +00002514 if (DC->hasExternalLexicalStorage() &&
2515 !getContext().getLangOpts().CPlusPlus)
Guy Benyei11169dd2012-12-18 14:30:41 +00002516 DC->setMustBuildLookupTable();
Chris Lattnere7b154b2013-01-19 21:39:22 +00002517
Ben Langmuir2c9af442014-04-10 17:57:43 +00002518 return Success;
Guy Benyei11169dd2012-12-18 14:30:41 +00002519 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00002520 case llvm::BitstreamEntry::SubBlock:
2521 switch (Entry.ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002522 case DECLTYPES_BLOCK_ID:
2523 // We lazily load the decls block, but we want to set up the
2524 // DeclsCursor cursor to point into it. Clone our current bitcode
2525 // cursor to it, enter the block and read the abbrevs in that block.
2526 // With the main cursor, we just skip over it.
2527 F.DeclsCursor = Stream;
2528 if (Stream.SkipBlock() || // Skip with the main cursor.
2529 // Read the abbrevs.
2530 ReadBlockAbbrevs(F.DeclsCursor, DECLTYPES_BLOCK_ID)) {
2531 Error("malformed block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002532 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002533 }
2534 break;
Richard Smithb9eab6d2014-03-20 19:44:17 +00002535
Guy Benyei11169dd2012-12-18 14:30:41 +00002536 case PREPROCESSOR_BLOCK_ID:
2537 F.MacroCursor = Stream;
2538 if (!PP.getExternalSource())
2539 PP.setExternalSource(this);
Chris Lattnere7b154b2013-01-19 21:39:22 +00002540
Guy Benyei11169dd2012-12-18 14:30:41 +00002541 if (Stream.SkipBlock() ||
2542 ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID)) {
2543 Error("malformed block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002544 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002545 }
2546 F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo();
2547 break;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002548
Guy Benyei11169dd2012-12-18 14:30:41 +00002549 case PREPROCESSOR_DETAIL_BLOCK_ID:
2550 F.PreprocessorDetailCursor = Stream;
2551 if (Stream.SkipBlock() ||
Chris Lattnere7b154b2013-01-19 21:39:22 +00002552 ReadBlockAbbrevs(F.PreprocessorDetailCursor,
Guy Benyei11169dd2012-12-18 14:30:41 +00002553 PREPROCESSOR_DETAIL_BLOCK_ID)) {
Chris Lattnere7b154b2013-01-19 21:39:22 +00002554 Error("malformed preprocessor detail record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002555 return Failure;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002556 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002557 F.PreprocessorDetailStartOffset
Chris Lattnere7b154b2013-01-19 21:39:22 +00002558 = F.PreprocessorDetailCursor.GetCurrentBitNo();
2559
Guy Benyei11169dd2012-12-18 14:30:41 +00002560 if (!PP.getPreprocessingRecord())
2561 PP.createPreprocessingRecord();
2562 if (!PP.getPreprocessingRecord()->getExternalSource())
2563 PP.getPreprocessingRecord()->SetExternalSource(*this);
2564 break;
2565
2566 case SOURCE_MANAGER_BLOCK_ID:
2567 if (ReadSourceManagerBlock(F))
Ben Langmuir2c9af442014-04-10 17:57:43 +00002568 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002569 break;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002570
Guy Benyei11169dd2012-12-18 14:30:41 +00002571 case SUBMODULE_BLOCK_ID:
Ben Langmuir2c9af442014-04-10 17:57:43 +00002572 if (ASTReadResult Result = ReadSubmoduleBlock(F, ClientLoadCapabilities))
2573 return Result;
Guy Benyei11169dd2012-12-18 14:30:41 +00002574 break;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002575
Guy Benyei11169dd2012-12-18 14:30:41 +00002576 case COMMENTS_BLOCK_ID: {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00002577 BitstreamCursor C = Stream;
Guy Benyei11169dd2012-12-18 14:30:41 +00002578 if (Stream.SkipBlock() ||
2579 ReadBlockAbbrevs(C, COMMENTS_BLOCK_ID)) {
2580 Error("malformed comments block in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002581 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002582 }
2583 CommentsCursors.push_back(std::make_pair(C, &F));
2584 break;
2585 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00002586
Guy Benyei11169dd2012-12-18 14:30:41 +00002587 default:
Chris Lattnere7b154b2013-01-19 21:39:22 +00002588 if (Stream.SkipBlock()) {
2589 Error("malformed block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002590 return Failure;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002591 }
2592 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00002593 }
2594 continue;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002595
2596 case llvm::BitstreamEntry::Record:
2597 // The interesting case.
2598 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00002599 }
2600
2601 // Read and process a record.
2602 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00002603 StringRef Blob;
2604 switch ((ASTRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002605 default: // Default behavior: ignore.
2606 break;
2607
2608 case TYPE_OFFSET: {
2609 if (F.LocalNumTypes != 0) {
2610 Error("duplicate TYPE_OFFSET record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002611 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002612 }
Chris Lattner0e6c9402013-01-20 02:38:54 +00002613 F.TypeOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002614 F.LocalNumTypes = Record[0];
2615 unsigned LocalBaseTypeIndex = Record[1];
2616 F.BaseTypeIndex = getTotalNumTypes();
2617
2618 if (F.LocalNumTypes > 0) {
2619 // Introduce the global -> local mapping for types within this module.
2620 GlobalTypeMap.insert(std::make_pair(getTotalNumTypes(), &F));
2621
2622 // Introduce the local -> global mapping for types within this module.
2623 F.TypeRemap.insertOrReplace(
2624 std::make_pair(LocalBaseTypeIndex,
2625 F.BaseTypeIndex - LocalBaseTypeIndex));
Ben Langmuir52ca6782014-10-20 16:27:32 +00002626
2627 TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes);
Guy Benyei11169dd2012-12-18 14:30:41 +00002628 }
2629 break;
2630 }
2631
2632 case DECL_OFFSET: {
2633 if (F.LocalNumDecls != 0) {
2634 Error("duplicate DECL_OFFSET record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002635 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002636 }
Chris Lattner0e6c9402013-01-20 02:38:54 +00002637 F.DeclOffsets = (const DeclOffset *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002638 F.LocalNumDecls = Record[0];
2639 unsigned LocalBaseDeclID = Record[1];
2640 F.BaseDeclID = getTotalNumDecls();
2641
2642 if (F.LocalNumDecls > 0) {
2643 // Introduce the global -> local mapping for declarations within this
2644 // module.
2645 GlobalDeclMap.insert(
2646 std::make_pair(getTotalNumDecls() + NUM_PREDEF_DECL_IDS, &F));
2647
2648 // Introduce the local -> global mapping for declarations within this
2649 // module.
2650 F.DeclRemap.insertOrReplace(
2651 std::make_pair(LocalBaseDeclID, F.BaseDeclID - LocalBaseDeclID));
2652
2653 // Introduce the global -> local mapping for declarations within this
2654 // module.
2655 F.GlobalToLocalDeclIDs[&F] = LocalBaseDeclID;
Ben Langmuirfe971d92014-08-16 04:54:18 +00002656
Ben Langmuir52ca6782014-10-20 16:27:32 +00002657 DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls);
2658 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002659 break;
2660 }
2661
2662 case TU_UPDATE_LEXICAL: {
2663 DeclContext *TU = Context.getTranslationUnitDecl();
2664 DeclContextInfo &Info = F.DeclContextInfos[TU];
Chris Lattner0e6c9402013-01-20 02:38:54 +00002665 Info.LexicalDecls = reinterpret_cast<const KindDeclIDPair *>(Blob.data());
Guy Benyei11169dd2012-12-18 14:30:41 +00002666 Info.NumLexicalDecls
Chris Lattner0e6c9402013-01-20 02:38:54 +00002667 = static_cast<unsigned int>(Blob.size() / sizeof(KindDeclIDPair));
Guy Benyei11169dd2012-12-18 14:30:41 +00002668 TU->setHasExternalLexicalStorage(true);
2669 break;
2670 }
2671
2672 case UPDATE_VISIBLE: {
2673 unsigned Idx = 0;
2674 serialization::DeclID ID = ReadDeclID(F, Record, Idx);
2675 ASTDeclContextNameLookupTable *Table =
Justin Bognerda4e6502014-04-14 16:34:29 +00002676 ASTDeclContextNameLookupTable::Create(
2677 (const unsigned char *)Blob.data() + Record[Idx++],
2678 (const unsigned char *)Blob.data() + sizeof(uint32_t),
2679 (const unsigned char *)Blob.data(),
2680 ASTDeclContextNameLookupTrait(*this, F));
Richard Smithcd45dbc2014-04-19 03:48:30 +00002681 if (Decl *D = GetExistingDecl(ID)) {
Richard Smithd9174792014-03-11 03:10:46 +00002682 auto *DC = cast<DeclContext>(D);
2683 DC->getPrimaryContext()->setHasExternalVisibleStorage(true);
Richard Smith52e3fba2014-03-11 07:17:35 +00002684 auto *&LookupTable = F.DeclContextInfos[DC].NameLookupTableData;
2685 delete LookupTable;
2686 LookupTable = Table;
Guy Benyei11169dd2012-12-18 14:30:41 +00002687 } else
2688 PendingVisibleUpdates[ID].push_back(std::make_pair(Table, &F));
2689 break;
2690 }
2691
2692 case IDENTIFIER_TABLE:
Chris Lattner0e6c9402013-01-20 02:38:54 +00002693 F.IdentifierTableData = Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002694 if (Record[0]) {
Justin Bognerda4e6502014-04-14 16:34:29 +00002695 F.IdentifierLookupTable = ASTIdentifierLookupTable::Create(
2696 (const unsigned char *)F.IdentifierTableData + Record[0],
2697 (const unsigned char *)F.IdentifierTableData + sizeof(uint32_t),
2698 (const unsigned char *)F.IdentifierTableData,
2699 ASTIdentifierLookupTrait(*this, F));
Guy Benyei11169dd2012-12-18 14:30:41 +00002700
2701 PP.getIdentifierTable().setExternalIdentifierLookup(this);
2702 }
2703 break;
2704
2705 case IDENTIFIER_OFFSET: {
2706 if (F.LocalNumIdentifiers != 0) {
2707 Error("duplicate IDENTIFIER_OFFSET record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002708 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002709 }
Chris Lattner0e6c9402013-01-20 02:38:54 +00002710 F.IdentifierOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002711 F.LocalNumIdentifiers = Record[0];
2712 unsigned LocalBaseIdentifierID = Record[1];
2713 F.BaseIdentifierID = getTotalNumIdentifiers();
2714
2715 if (F.LocalNumIdentifiers > 0) {
2716 // Introduce the global -> local mapping for identifiers within this
2717 // module.
2718 GlobalIdentifierMap.insert(std::make_pair(getTotalNumIdentifiers() + 1,
2719 &F));
2720
2721 // Introduce the local -> global mapping for identifiers within this
2722 // module.
2723 F.IdentifierRemap.insertOrReplace(
2724 std::make_pair(LocalBaseIdentifierID,
2725 F.BaseIdentifierID - LocalBaseIdentifierID));
Ben Langmuirfe971d92014-08-16 04:54:18 +00002726
Ben Langmuir52ca6782014-10-20 16:27:32 +00002727 IdentifiersLoaded.resize(IdentifiersLoaded.size()
2728 + F.LocalNumIdentifiers);
2729 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002730 break;
2731 }
2732
Ben Langmuir332aafe2014-01-31 01:06:56 +00002733 case EAGERLY_DESERIALIZED_DECLS:
Guy Benyei11169dd2012-12-18 14:30:41 +00002734 for (unsigned I = 0, N = Record.size(); I != N; ++I)
Ben Langmuir332aafe2014-01-31 01:06:56 +00002735 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I]));
Guy Benyei11169dd2012-12-18 14:30:41 +00002736 break;
2737
2738 case SPECIAL_TYPES:
Douglas Gregor44180f82013-02-01 23:45:03 +00002739 if (SpecialTypes.empty()) {
2740 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2741 SpecialTypes.push_back(getGlobalTypeID(F, Record[I]));
2742 break;
2743 }
2744
2745 if (SpecialTypes.size() != Record.size()) {
2746 Error("invalid special-types record");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002747 return Failure;
Douglas Gregor44180f82013-02-01 23:45:03 +00002748 }
2749
2750 for (unsigned I = 0, N = Record.size(); I != N; ++I) {
2751 serialization::TypeID ID = getGlobalTypeID(F, Record[I]);
2752 if (!SpecialTypes[I])
2753 SpecialTypes[I] = ID;
2754 // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate
2755 // merge step?
2756 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002757 break;
2758
2759 case STATISTICS:
2760 TotalNumStatements += Record[0];
2761 TotalNumMacros += Record[1];
2762 TotalLexicalDeclContexts += Record[2];
2763 TotalVisibleDeclContexts += Record[3];
2764 break;
2765
2766 case UNUSED_FILESCOPED_DECLS:
2767 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2768 UnusedFileScopedDecls.push_back(getGlobalDeclID(F, Record[I]));
2769 break;
2770
2771 case DELEGATING_CTORS:
2772 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2773 DelegatingCtorDecls.push_back(getGlobalDeclID(F, Record[I]));
2774 break;
2775
2776 case WEAK_UNDECLARED_IDENTIFIERS:
2777 if (Record.size() % 4 != 0) {
2778 Error("invalid weak identifiers record");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002779 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002780 }
2781
2782 // FIXME: Ignore weak undeclared identifiers from non-original PCH
2783 // files. This isn't the way to do it :)
2784 WeakUndeclaredIdentifiers.clear();
2785
2786 // Translate the weak, undeclared identifiers into global IDs.
2787 for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) {
2788 WeakUndeclaredIdentifiers.push_back(
2789 getGlobalIdentifierID(F, Record[I++]));
2790 WeakUndeclaredIdentifiers.push_back(
2791 getGlobalIdentifierID(F, Record[I++]));
2792 WeakUndeclaredIdentifiers.push_back(
2793 ReadSourceLocation(F, Record, I).getRawEncoding());
2794 WeakUndeclaredIdentifiers.push_back(Record[I++]);
2795 }
2796 break;
2797
Richard Smith78165b52013-01-10 23:43:47 +00002798 case LOCALLY_SCOPED_EXTERN_C_DECLS:
Guy Benyei11169dd2012-12-18 14:30:41 +00002799 for (unsigned I = 0, N = Record.size(); I != N; ++I)
Richard Smith78165b52013-01-10 23:43:47 +00002800 LocallyScopedExternCDecls.push_back(getGlobalDeclID(F, Record[I]));
Guy Benyei11169dd2012-12-18 14:30:41 +00002801 break;
2802
2803 case SELECTOR_OFFSETS: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00002804 F.SelectorOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002805 F.LocalNumSelectors = Record[0];
2806 unsigned LocalBaseSelectorID = Record[1];
2807 F.BaseSelectorID = getTotalNumSelectors();
2808
2809 if (F.LocalNumSelectors > 0) {
2810 // Introduce the global -> local mapping for selectors within this
2811 // module.
2812 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F));
2813
2814 // Introduce the local -> global mapping for selectors within this
2815 // module.
2816 F.SelectorRemap.insertOrReplace(
2817 std::make_pair(LocalBaseSelectorID,
2818 F.BaseSelectorID - LocalBaseSelectorID));
Ben Langmuir52ca6782014-10-20 16:27:32 +00002819
2820 SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors);
Guy Benyei11169dd2012-12-18 14:30:41 +00002821 }
2822 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];
Benjamin Kramer867ea1d2014-03-02 13:01:17 +00002861 std::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) =
Ben Langmuir52ca6782014-10-20 16:27:32 +00002862 SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries,
Guy Benyei11169dd2012-12-18 14:30:41 +00002863 SLocSpaceSize);
2864 // Make our entry in the range map. BaseID is negative and growing, so
2865 // we invert it. Because we invert it, though, we need the other end of
2866 // the range.
2867 unsigned RangeStart =
2868 unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1;
2869 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F));
2870 F.FirstLoc = SourceLocation::getFromRawEncoding(F.SLocEntryBaseOffset);
2871
2872 // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing.
2873 assert((F.SLocEntryBaseOffset & (1U << 31U)) == 0);
2874 GlobalSLocOffsetMap.insert(
2875 std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset
2876 - SLocSpaceSize,&F));
2877
2878 // Initialize the remapping table.
2879 // Invalid stays invalid.
Richard Smithb9eab6d2014-03-20 19:44:17 +00002880 F.SLocRemap.insertOrReplace(std::make_pair(0U, 0));
Guy Benyei11169dd2012-12-18 14:30:41 +00002881 // This module. Base was 2 when being compiled.
Richard Smithb9eab6d2014-03-20 19:44:17 +00002882 F.SLocRemap.insertOrReplace(std::make_pair(2U,
Guy Benyei11169dd2012-12-18 14:30:41 +00002883 static_cast<int>(F.SLocEntryBaseOffset - 2)));
2884
2885 TotalNumSLocEntries += F.LocalNumSLocEntries;
2886 break;
2887 }
2888
2889 case MODULE_OFFSET_MAP: {
2890 // Additional remapping information.
Chris Lattner0e6c9402013-01-20 02:38:54 +00002891 const unsigned char *Data = (const unsigned char*)Blob.data();
2892 const unsigned char *DataEnd = Data + Blob.size();
Richard Smithb9eab6d2014-03-20 19:44:17 +00002893
2894 // If we see this entry before SOURCE_LOCATION_OFFSETS, add placeholders.
2895 if (F.SLocRemap.find(0) == F.SLocRemap.end()) {
2896 F.SLocRemap.insert(std::make_pair(0U, 0));
2897 F.SLocRemap.insert(std::make_pair(2U, 1));
2898 }
2899
Guy Benyei11169dd2012-12-18 14:30:41 +00002900 // Continuous range maps we may be updating in our module.
Ben Langmuir785180e2014-10-20 16:27:30 +00002901 typedef ContinuousRangeMap<uint32_t, int, 2>::Builder
2902 RemapBuilder;
2903 RemapBuilder SLocRemap(F.SLocRemap);
2904 RemapBuilder IdentifierRemap(F.IdentifierRemap);
2905 RemapBuilder MacroRemap(F.MacroRemap);
2906 RemapBuilder PreprocessedEntityRemap(F.PreprocessedEntityRemap);
2907 RemapBuilder SubmoduleRemap(F.SubmoduleRemap);
2908 RemapBuilder SelectorRemap(F.SelectorRemap);
2909 RemapBuilder DeclRemap(F.DeclRemap);
2910 RemapBuilder TypeRemap(F.TypeRemap);
Guy Benyei11169dd2012-12-18 14:30:41 +00002911
2912 while(Data < DataEnd) {
Justin Bogner57ba0b22014-03-28 22:03:24 +00002913 using namespace llvm::support;
2914 uint16_t Len = endian::readNext<uint16_t, little, unaligned>(Data);
Guy Benyei11169dd2012-12-18 14:30:41 +00002915 StringRef Name = StringRef((const char*)Data, Len);
2916 Data += Len;
2917 ModuleFile *OM = ModuleMgr.lookup(Name);
2918 if (!OM) {
2919 Error("SourceLocation remap refers to unknown module");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002920 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002921 }
2922
Justin Bogner57ba0b22014-03-28 22:03:24 +00002923 uint32_t SLocOffset =
2924 endian::readNext<uint32_t, little, unaligned>(Data);
2925 uint32_t IdentifierIDOffset =
2926 endian::readNext<uint32_t, little, unaligned>(Data);
2927 uint32_t MacroIDOffset =
2928 endian::readNext<uint32_t, little, unaligned>(Data);
2929 uint32_t PreprocessedEntityIDOffset =
2930 endian::readNext<uint32_t, little, unaligned>(Data);
2931 uint32_t SubmoduleIDOffset =
2932 endian::readNext<uint32_t, little, unaligned>(Data);
2933 uint32_t SelectorIDOffset =
2934 endian::readNext<uint32_t, little, unaligned>(Data);
2935 uint32_t DeclIDOffset =
2936 endian::readNext<uint32_t, little, unaligned>(Data);
2937 uint32_t TypeIndexOffset =
2938 endian::readNext<uint32_t, little, unaligned>(Data);
2939
Ben Langmuir785180e2014-10-20 16:27:30 +00002940 uint32_t None = std::numeric_limits<uint32_t>::max();
2941
2942 auto mapOffset = [&](uint32_t Offset, uint32_t BaseOffset,
2943 RemapBuilder &Remap) {
2944 if (Offset != None)
2945 Remap.insert(std::make_pair(Offset,
2946 static_cast<int>(BaseOffset - Offset)));
2947 };
2948 mapOffset(SLocOffset, OM->SLocEntryBaseOffset, SLocRemap);
2949 mapOffset(IdentifierIDOffset, OM->BaseIdentifierID, IdentifierRemap);
2950 mapOffset(MacroIDOffset, OM->BaseMacroID, MacroRemap);
2951 mapOffset(PreprocessedEntityIDOffset, OM->BasePreprocessedEntityID,
2952 PreprocessedEntityRemap);
2953 mapOffset(SubmoduleIDOffset, OM->BaseSubmoduleID, SubmoduleRemap);
2954 mapOffset(SelectorIDOffset, OM->BaseSelectorID, SelectorRemap);
2955 mapOffset(DeclIDOffset, OM->BaseDeclID, DeclRemap);
2956 mapOffset(TypeIndexOffset, OM->BaseTypeIndex, TypeRemap);
Guy Benyei11169dd2012-12-18 14:30:41 +00002957
2958 // Global -> local mappings.
2959 F.GlobalToLocalDeclIDs[OM] = DeclIDOffset;
2960 }
2961 break;
2962 }
2963
2964 case SOURCE_MANAGER_LINE_TABLE:
2965 if (ParseLineTable(F, Record))
Ben Langmuir2c9af442014-04-10 17:57:43 +00002966 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002967 break;
2968
2969 case SOURCE_LOCATION_PRELOADS: {
2970 // Need to transform from the local view (1-based IDs) to the global view,
2971 // which is based off F.SLocEntryBaseID.
2972 if (!F.PreloadSLocEntries.empty()) {
2973 Error("Multiple SOURCE_LOCATION_PRELOADS records in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002974 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002975 }
2976
2977 F.PreloadSLocEntries.swap(Record);
2978 break;
2979 }
2980
2981 case EXT_VECTOR_DECLS:
2982 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2983 ExtVectorDecls.push_back(getGlobalDeclID(F, Record[I]));
2984 break;
2985
2986 case VTABLE_USES:
2987 if (Record.size() % 3 != 0) {
2988 Error("Invalid VTABLE_USES record");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002989 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002990 }
2991
2992 // Later tables overwrite earlier ones.
2993 // FIXME: Modules will have some trouble with this. This is clearly not
2994 // the right way to do this.
2995 VTableUses.clear();
2996
2997 for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) {
2998 VTableUses.push_back(getGlobalDeclID(F, Record[Idx++]));
2999 VTableUses.push_back(
3000 ReadSourceLocation(F, Record, Idx).getRawEncoding());
3001 VTableUses.push_back(Record[Idx++]);
3002 }
3003 break;
3004
3005 case DYNAMIC_CLASSES:
3006 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3007 DynamicClasses.push_back(getGlobalDeclID(F, Record[I]));
3008 break;
3009
3010 case PENDING_IMPLICIT_INSTANTIATIONS:
3011 if (PendingInstantiations.size() % 2 != 0) {
3012 Error("Invalid existing PendingInstantiations");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003013 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003014 }
3015
3016 if (Record.size() % 2 != 0) {
3017 Error("Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003018 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003019 }
3020
3021 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
3022 PendingInstantiations.push_back(getGlobalDeclID(F, Record[I++]));
3023 PendingInstantiations.push_back(
3024 ReadSourceLocation(F, Record, I).getRawEncoding());
3025 }
3026 break;
3027
3028 case SEMA_DECL_REFS:
Richard Smith3d8e97e2013-10-18 06:54:39 +00003029 if (Record.size() != 2) {
3030 Error("Invalid SEMA_DECL_REFS block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003031 return Failure;
Richard Smith3d8e97e2013-10-18 06:54:39 +00003032 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003033 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3034 SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
3035 break;
3036
3037 case PPD_ENTITIES_OFFSETS: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00003038 F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data();
3039 assert(Blob.size() % sizeof(PPEntityOffset) == 0);
3040 F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset);
Guy Benyei11169dd2012-12-18 14:30:41 +00003041
3042 unsigned LocalBasePreprocessedEntityID = Record[0];
3043
3044 unsigned StartingID;
3045 if (!PP.getPreprocessingRecord())
3046 PP.createPreprocessingRecord();
3047 if (!PP.getPreprocessingRecord()->getExternalSource())
3048 PP.getPreprocessingRecord()->SetExternalSource(*this);
3049 StartingID
3050 = PP.getPreprocessingRecord()
Ben Langmuir52ca6782014-10-20 16:27:32 +00003051 ->allocateLoadedEntities(F.NumPreprocessedEntities);
Guy Benyei11169dd2012-12-18 14:30:41 +00003052 F.BasePreprocessedEntityID = StartingID;
3053
3054 if (F.NumPreprocessedEntities > 0) {
3055 // Introduce the global -> local mapping for preprocessed entities in
3056 // this module.
3057 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
3058
3059 // Introduce the local -> global mapping for preprocessed entities in
3060 // this module.
3061 F.PreprocessedEntityRemap.insertOrReplace(
3062 std::make_pair(LocalBasePreprocessedEntityID,
3063 F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID));
3064 }
3065
3066 break;
3067 }
3068
3069 case DECL_UPDATE_OFFSETS: {
3070 if (Record.size() % 2 != 0) {
3071 Error("invalid DECL_UPDATE_OFFSETS block in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003072 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003073 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00003074 for (unsigned I = 0, N = Record.size(); I != N; I += 2) {
3075 GlobalDeclID ID = getGlobalDeclID(F, Record[I]);
3076 DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I + 1]));
3077
3078 // If we've already loaded the decl, perform the updates when we finish
3079 // loading this block.
3080 if (Decl *D = GetExistingDecl(ID))
3081 PendingUpdateRecords.push_back(std::make_pair(ID, D));
3082 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003083 break;
3084 }
3085
3086 case DECL_REPLACEMENTS: {
3087 if (Record.size() % 3 != 0) {
3088 Error("invalid DECL_REPLACEMENTS block in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003089 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003090 }
3091 for (unsigned I = 0, N = Record.size(); I != N; I += 3)
3092 ReplacedDecls[getGlobalDeclID(F, Record[I])]
3093 = ReplacedDeclInfo(&F, Record[I+1], Record[I+2]);
3094 break;
3095 }
3096
3097 case OBJC_CATEGORIES_MAP: {
3098 if (F.LocalNumObjCCategoriesInMap != 0) {
3099 Error("duplicate OBJC_CATEGORIES_MAP record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003100 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003101 }
3102
3103 F.LocalNumObjCCategoriesInMap = Record[0];
Chris Lattner0e6c9402013-01-20 02:38:54 +00003104 F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003105 break;
3106 }
3107
3108 case OBJC_CATEGORIES:
3109 F.ObjCCategories.swap(Record);
3110 break;
3111
3112 case CXX_BASE_SPECIFIER_OFFSETS: {
3113 if (F.LocalNumCXXBaseSpecifiers != 0) {
3114 Error("duplicate CXX_BASE_SPECIFIER_OFFSETS record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003115 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003116 }
3117
3118 F.LocalNumCXXBaseSpecifiers = Record[0];
Chris Lattner0e6c9402013-01-20 02:38:54 +00003119 F.CXXBaseSpecifiersOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003120 NumCXXBaseSpecifiersLoaded += F.LocalNumCXXBaseSpecifiers;
3121 break;
3122 }
3123
3124 case DIAG_PRAGMA_MAPPINGS:
3125 if (F.PragmaDiagMappings.empty())
3126 F.PragmaDiagMappings.swap(Record);
3127 else
3128 F.PragmaDiagMappings.insert(F.PragmaDiagMappings.end(),
3129 Record.begin(), Record.end());
3130 break;
3131
3132 case CUDA_SPECIAL_DECL_REFS:
3133 // Later tables overwrite earlier ones.
3134 // FIXME: Modules will have trouble with this.
3135 CUDASpecialDeclRefs.clear();
3136 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3137 CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
3138 break;
3139
3140 case HEADER_SEARCH_TABLE: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00003141 F.HeaderFileInfoTableData = Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003142 F.LocalNumHeaderFileInfos = Record[1];
Guy Benyei11169dd2012-12-18 14:30:41 +00003143 if (Record[0]) {
3144 F.HeaderFileInfoTable
3145 = HeaderFileInfoLookupTable::Create(
3146 (const unsigned char *)F.HeaderFileInfoTableData + Record[0],
3147 (const unsigned char *)F.HeaderFileInfoTableData,
3148 HeaderFileInfoTrait(*this, F,
3149 &PP.getHeaderSearchInfo(),
Chris Lattner0e6c9402013-01-20 02:38:54 +00003150 Blob.data() + Record[2]));
Guy Benyei11169dd2012-12-18 14:30:41 +00003151
3152 PP.getHeaderSearchInfo().SetExternalSource(this);
3153 if (!PP.getHeaderSearchInfo().getExternalLookup())
3154 PP.getHeaderSearchInfo().SetExternalLookup(this);
3155 }
3156 break;
3157 }
3158
3159 case FP_PRAGMA_OPTIONS:
3160 // Later tables overwrite earlier ones.
3161 FPPragmaOptions.swap(Record);
3162 break;
3163
3164 case OPENCL_EXTENSIONS:
3165 // Later tables overwrite earlier ones.
3166 OpenCLExtensions.swap(Record);
3167 break;
3168
3169 case TENTATIVE_DEFINITIONS:
3170 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3171 TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I]));
3172 break;
3173
3174 case KNOWN_NAMESPACES:
3175 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3176 KnownNamespaces.push_back(getGlobalDeclID(F, Record[I]));
3177 break;
Nick Lewycky8334af82013-01-26 00:35:08 +00003178
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00003179 case UNDEFINED_BUT_USED:
3180 if (UndefinedButUsed.size() % 2 != 0) {
3181 Error("Invalid existing UndefinedButUsed");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003182 return Failure;
Nick Lewycky8334af82013-01-26 00:35:08 +00003183 }
3184
3185 if (Record.size() % 2 != 0) {
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00003186 Error("invalid undefined-but-used record");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003187 return Failure;
Nick Lewycky8334af82013-01-26 00:35:08 +00003188 }
3189 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00003190 UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++]));
3191 UndefinedButUsed.push_back(
Nick Lewycky8334af82013-01-26 00:35:08 +00003192 ReadSourceLocation(F, Record, I).getRawEncoding());
3193 }
3194 break;
3195
Guy Benyei11169dd2012-12-18 14:30:41 +00003196 case IMPORTED_MODULES: {
Richard Smithe842a472014-10-22 02:05:46 +00003197 if (F.Kind != MK_ImplicitModule && F.Kind != MK_ExplicitModule) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003198 // If we aren't loading a module (which has its own exports), make
3199 // all of the imported modules visible.
3200 // FIXME: Deal with macros-only imports.
Richard Smith56be7542014-03-21 00:33:59 +00003201 for (unsigned I = 0, N = Record.size(); I != N; /**/) {
3202 unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]);
3203 SourceLocation Loc = ReadSourceLocation(F, Record, I);
3204 if (GlobalID)
Aaron Ballman4f45b712014-03-21 15:22:56 +00003205 ImportedModules.push_back(ImportedSubmodule(GlobalID, Loc));
Guy Benyei11169dd2012-12-18 14:30:41 +00003206 }
3207 }
3208 break;
3209 }
3210
3211 case LOCAL_REDECLARATIONS: {
3212 F.RedeclarationChains.swap(Record);
3213 break;
3214 }
3215
3216 case LOCAL_REDECLARATIONS_MAP: {
3217 if (F.LocalNumRedeclarationsInMap != 0) {
3218 Error("duplicate LOCAL_REDECLARATIONS_MAP record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003219 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003220 }
3221
3222 F.LocalNumRedeclarationsInMap = Record[0];
Chris Lattner0e6c9402013-01-20 02:38:54 +00003223 F.RedeclarationsMap = (const LocalRedeclarationsInfo *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003224 break;
3225 }
3226
3227 case MERGED_DECLARATIONS: {
3228 for (unsigned Idx = 0; Idx < Record.size(); /* increment in loop */) {
3229 GlobalDeclID CanonID = getGlobalDeclID(F, Record[Idx++]);
3230 SmallVectorImpl<GlobalDeclID> &Decls = StoredMergedDecls[CanonID];
3231 for (unsigned N = Record[Idx++]; N > 0; --N)
3232 Decls.push_back(getGlobalDeclID(F, Record[Idx++]));
3233 }
3234 break;
3235 }
3236
3237 case MACRO_OFFSET: {
3238 if (F.LocalNumMacros != 0) {
3239 Error("duplicate MACRO_OFFSET record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003240 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003241 }
Chris Lattner0e6c9402013-01-20 02:38:54 +00003242 F.MacroOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003243 F.LocalNumMacros = Record[0];
3244 unsigned LocalBaseMacroID = Record[1];
3245 F.BaseMacroID = getTotalNumMacros();
3246
3247 if (F.LocalNumMacros > 0) {
3248 // Introduce the global -> local mapping for macros within this module.
3249 GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F));
3250
3251 // Introduce the local -> global mapping for macros within this module.
3252 F.MacroRemap.insertOrReplace(
3253 std::make_pair(LocalBaseMacroID,
3254 F.BaseMacroID - LocalBaseMacroID));
Ben Langmuir52ca6782014-10-20 16:27:32 +00003255
3256 MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros);
Guy Benyei11169dd2012-12-18 14:30:41 +00003257 }
3258 break;
3259 }
3260
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00003261 case MACRO_TABLE: {
3262 // FIXME: Not used yet.
Guy Benyei11169dd2012-12-18 14:30:41 +00003263 break;
3264 }
Richard Smithe40f2ba2013-08-07 21:41:30 +00003265
3266 case LATE_PARSED_TEMPLATE: {
3267 LateParsedTemplates.append(Record.begin(), Record.end());
3268 break;
3269 }
Dario Domizioli13a0a382014-05-23 12:13:25 +00003270
3271 case OPTIMIZE_PRAGMA_OPTIONS:
3272 if (Record.size() != 1) {
3273 Error("invalid pragma optimize record");
3274 return Failure;
3275 }
3276 OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]);
3277 break;
Nico Weber72889432014-09-06 01:25:55 +00003278
3279 case UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES:
3280 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3281 UnusedLocalTypedefNameCandidates.push_back(
3282 getGlobalDeclID(F, Record[I]));
3283 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00003284 }
3285 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003286}
3287
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003288ASTReader::ASTReadResult
3289ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F,
3290 const ModuleFile *ImportedBy,
3291 unsigned ClientLoadCapabilities) {
3292 unsigned Idx = 0;
3293 F.ModuleMapPath = ReadString(Record, Idx);
3294
Richard Smithe842a472014-10-22 02:05:46 +00003295 if (F.Kind == MK_ExplicitModule) {
3296 // For an explicitly-loaded module, we don't care whether the original
3297 // module map file exists or matches.
3298 return Success;
3299 }
3300
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003301 // Try to resolve ModuleName in the current header search context and
3302 // verify that it is found in the same module map file as we saved. If the
3303 // top-level AST file is a main file, skip this check because there is no
3304 // usable header search context.
3305 assert(!F.ModuleName.empty() &&
Richard Smithe842a472014-10-22 02:05:46 +00003306 "MODULE_NAME should come before MODULE_MAP_FILE");
3307 if (F.Kind == MK_ImplicitModule &&
3308 (*ModuleMgr.begin())->Kind != MK_MainFile) {
3309 // An implicitly-loaded module file should have its module listed in some
3310 // module map file that we've already loaded.
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003311 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName);
Richard Smithe842a472014-10-22 02:05:46 +00003312 auto &Map = PP.getHeaderSearchInfo().getModuleMap();
3313 const FileEntry *ModMap = M ? Map.getModuleMapFileForUniquing(M) : nullptr;
3314 if (!ModMap) {
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003315 assert(ImportedBy && "top-level import should be verified");
3316 if ((ClientLoadCapabilities & ARR_Missing) == 0)
Richard Smithe842a472014-10-22 02:05:46 +00003317 Diag(diag::err_imported_module_not_found) << F.ModuleName << F.FileName
3318 << ImportedBy->FileName
3319 << F.ModuleMapPath;
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003320 return Missing;
3321 }
3322
Richard Smithe842a472014-10-22 02:05:46 +00003323 assert(M->Name == F.ModuleName && "found module with different name");
3324
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003325 // Check the primary module map file.
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003326 const FileEntry *StoredModMap = FileMgr.getFile(F.ModuleMapPath);
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003327 if (StoredModMap == nullptr || StoredModMap != ModMap) {
3328 assert(ModMap && "found module is missing module map file");
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003329 assert(ImportedBy && "top-level import should be verified");
3330 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3331 Diag(diag::err_imported_module_modmap_changed)
3332 << F.ModuleName << ImportedBy->FileName
3333 << ModMap->getName() << F.ModuleMapPath;
3334 return OutOfDate;
3335 }
3336
3337 llvm::SmallPtrSet<const FileEntry *, 1> AdditionalStoredMaps;
3338 for (unsigned I = 0, N = Record[Idx++]; I < N; ++I) {
3339 // FIXME: we should use input files rather than storing names.
3340 std::string Filename = ReadString(Record, Idx);
3341 const FileEntry *F =
3342 FileMgr.getFile(Filename, false, false);
3343 if (F == nullptr) {
3344 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3345 Error("could not find file '" + Filename +"' referenced by AST file");
3346 return OutOfDate;
3347 }
3348 AdditionalStoredMaps.insert(F);
3349 }
3350
3351 // Check any additional module map files (e.g. module.private.modulemap)
3352 // that are not in the pcm.
3353 if (auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) {
3354 for (const FileEntry *ModMap : *AdditionalModuleMaps) {
3355 // Remove files that match
3356 // Note: SmallPtrSet::erase is really remove
3357 if (!AdditionalStoredMaps.erase(ModMap)) {
3358 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3359 Diag(diag::err_module_different_modmap)
3360 << F.ModuleName << /*new*/0 << ModMap->getName();
3361 return OutOfDate;
3362 }
3363 }
3364 }
3365
3366 // Check any additional module map files that are in the pcm, but not
3367 // found in header search. Cases that match are already removed.
3368 for (const FileEntry *ModMap : AdditionalStoredMaps) {
3369 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3370 Diag(diag::err_module_different_modmap)
3371 << F.ModuleName << /*not new*/1 << ModMap->getName();
3372 return OutOfDate;
3373 }
3374 }
3375
3376 if (Listener)
3377 Listener->ReadModuleMapFile(F.ModuleMapPath);
3378 return Success;
3379}
3380
3381
Douglas Gregorc1489562013-02-12 23:36:21 +00003382/// \brief Move the given method to the back of the global list of methods.
3383static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) {
3384 // Find the entry for this selector in the method pool.
3385 Sema::GlobalMethodPool::iterator Known
3386 = S.MethodPool.find(Method->getSelector());
3387 if (Known == S.MethodPool.end())
3388 return;
3389
3390 // Retrieve the appropriate method list.
3391 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
3392 : Known->second.second;
3393 bool Found = false;
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00003394 for (ObjCMethodList *List = &Start; List; List = List->getNext()) {
Douglas Gregorc1489562013-02-12 23:36:21 +00003395 if (!Found) {
3396 if (List->Method == Method) {
3397 Found = true;
3398 } else {
3399 // Keep searching.
3400 continue;
3401 }
3402 }
3403
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00003404 if (List->getNext())
3405 List->Method = List->getNext()->Method;
Douglas Gregorc1489562013-02-12 23:36:21 +00003406 else
3407 List->Method = Method;
3408 }
3409}
3410
Richard Smithe657bbd2014-07-18 22:13:40 +00003411void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner,
3412 bool FromFinalization) {
3413 // FIXME: Only do this if Owner->NameVisibility == AllVisible.
Richard Smith57721ac2014-07-21 04:10:40 +00003414 for (Decl *D : Names.HiddenDecls) {
Richard Smith49f906a2014-03-01 00:08:04 +00003415 bool wasHidden = D->Hidden;
3416 D->Hidden = false;
Guy Benyei11169dd2012-12-18 14:30:41 +00003417
Richard Smith49f906a2014-03-01 00:08:04 +00003418 if (wasHidden && SemaObj) {
3419 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) {
3420 moveMethodToBackOfGlobalList(*SemaObj, Method);
Douglas Gregorc1489562013-02-12 23:36:21 +00003421 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003422 }
3423 }
Richard Smith49f906a2014-03-01 00:08:04 +00003424
Richard Smithe657bbd2014-07-18 22:13:40 +00003425 assert((FromFinalization || Owner->NameVisibility >= Module::MacrosVisible) &&
3426 "nothing to make visible?");
Richard Smithdaa69e02014-07-25 04:40:03 +00003427 for (const auto &Macro : Names.HiddenMacros) {
3428 if (FromFinalization)
3429 PP.appendMacroDirective(Macro.first,
3430 Macro.second->import(PP, SourceLocation()));
3431 else
3432 installImportedMacro(Macro.first, Macro.second, Owner);
3433 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003434}
3435
Richard Smith49f906a2014-03-01 00:08:04 +00003436void ASTReader::makeModuleVisible(Module *Mod,
Argyrios Kyrtzidis125df052013-02-01 16:36:12 +00003437 Module::NameVisibilityKind NameVisibility,
Douglas Gregorfb912652013-03-20 21:10:35 +00003438 SourceLocation ImportLoc,
3439 bool Complain) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003440 llvm::SmallPtrSet<Module *, 4> Visited;
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003441 SmallVector<Module *, 4> Stack;
Robert Wilhelm25284cc2013-08-23 16:11:15 +00003442 Stack.push_back(Mod);
Guy Benyei11169dd2012-12-18 14:30:41 +00003443 while (!Stack.empty()) {
Robert Wilhelm25284cc2013-08-23 16:11:15 +00003444 Mod = Stack.pop_back_val();
Guy Benyei11169dd2012-12-18 14:30:41 +00003445
3446 if (NameVisibility <= Mod->NameVisibility) {
Robert Wilhelm25284cc2013-08-23 16:11:15 +00003447 // This module already has this level of visibility (or greater), so
Guy Benyei11169dd2012-12-18 14:30:41 +00003448 // there is nothing more to do.
3449 continue;
3450 }
Richard Smith49f906a2014-03-01 00:08:04 +00003451
Guy Benyei11169dd2012-12-18 14:30:41 +00003452 if (!Mod->isAvailable()) {
3453 // Modules that aren't available cannot be made visible.
3454 continue;
3455 }
3456
3457 // Update the module's name visibility.
Richard Smith49f906a2014-03-01 00:08:04 +00003458 if (NameVisibility >= Module::MacrosVisible &&
3459 Mod->NameVisibility < Module::MacrosVisible)
3460 Mod->MacroVisibilityLoc = ImportLoc;
Guy Benyei11169dd2012-12-18 14:30:41 +00003461 Mod->NameVisibility = NameVisibility;
Richard Smith49f906a2014-03-01 00:08:04 +00003462
Guy Benyei11169dd2012-12-18 14:30:41 +00003463 // If we've already deserialized any names from this module,
3464 // mark them as visible.
3465 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
3466 if (Hidden != HiddenNamesMap.end()) {
Richard Smith57721ac2014-07-21 04:10:40 +00003467 auto HiddenNames = std::move(*Hidden);
Guy Benyei11169dd2012-12-18 14:30:41 +00003468 HiddenNamesMap.erase(Hidden);
Richard Smith57721ac2014-07-21 04:10:40 +00003469 makeNamesVisible(HiddenNames.second, HiddenNames.first,
3470 /*FromFinalization*/false);
3471 assert(HiddenNamesMap.find(Mod) == HiddenNamesMap.end() &&
3472 "making names visible added hidden names");
Guy Benyei11169dd2012-12-18 14:30:41 +00003473 }
Dmitri Gribenkoe9bcf5b2013-11-04 21:51:33 +00003474
Guy Benyei11169dd2012-12-18 14:30:41 +00003475 // Push any exported modules onto the stack to be marked as visible.
Argyrios Kyrtzidis8739f7b2013-02-19 19:34:40 +00003476 SmallVector<Module *, 16> Exports;
3477 Mod->getExportedModules(Exports);
3478 for (SmallVectorImpl<Module *>::iterator
3479 I = Exports.begin(), E = Exports.end(); I != E; ++I) {
3480 Module *Exported = *I;
3481 if (Visited.insert(Exported))
3482 Stack.push_back(Exported);
Guy Benyei11169dd2012-12-18 14:30:41 +00003483 }
Douglas Gregorfb912652013-03-20 21:10:35 +00003484
3485 // Detect any conflicts.
3486 if (Complain) {
3487 assert(ImportLoc.isValid() && "Missing import location");
3488 for (unsigned I = 0, N = Mod->Conflicts.size(); I != N; ++I) {
3489 if (Mod->Conflicts[I].Other->NameVisibility >= NameVisibility) {
3490 Diag(ImportLoc, diag::warn_module_conflict)
3491 << Mod->getFullModuleName()
3492 << Mod->Conflicts[I].Other->getFullModuleName()
3493 << Mod->Conflicts[I].Message;
3494 // FIXME: Need note where the other module was imported.
3495 }
3496 }
3497 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003498 }
3499}
3500
Douglas Gregore060e572013-01-25 01:03:03 +00003501bool ASTReader::loadGlobalIndex() {
3502 if (GlobalIndex)
3503 return false;
3504
3505 if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
3506 !Context.getLangOpts().Modules)
3507 return true;
3508
3509 // Try to load the global index.
3510 TriedLoadingGlobalIndex = true;
3511 StringRef ModuleCachePath
3512 = getPreprocessor().getHeaderSearchInfo().getModuleCachePath();
3513 std::pair<GlobalModuleIndex *, GlobalModuleIndex::ErrorCode> Result
Douglas Gregor7029ce12013-03-19 00:28:20 +00003514 = GlobalModuleIndex::readIndex(ModuleCachePath);
Douglas Gregore060e572013-01-25 01:03:03 +00003515 if (!Result.first)
3516 return true;
3517
3518 GlobalIndex.reset(Result.first);
Douglas Gregor7211ac12013-01-25 23:32:03 +00003519 ModuleMgr.setGlobalIndex(GlobalIndex.get());
Douglas Gregore060e572013-01-25 01:03:03 +00003520 return false;
3521}
3522
3523bool ASTReader::isGlobalIndexUnavailable() const {
3524 return Context.getLangOpts().Modules && UseGlobalIndex &&
3525 !hasGlobalIndex() && TriedLoadingGlobalIndex;
3526}
3527
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003528static void updateModuleTimestamp(ModuleFile &MF) {
3529 // Overwrite the timestamp file contents so that file's mtime changes.
3530 std::string TimestampFilename = MF.getTimestampFilename();
Rafael Espindoladae941a2014-08-25 18:17:04 +00003531 std::error_code EC;
3532 llvm::raw_fd_ostream OS(TimestampFilename, EC, llvm::sys::fs::F_Text);
3533 if (EC)
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003534 return;
3535 OS << "Timestamp file\n";
3536}
3537
Guy Benyei11169dd2012-12-18 14:30:41 +00003538ASTReader::ASTReadResult ASTReader::ReadAST(const std::string &FileName,
3539 ModuleKind Type,
3540 SourceLocation ImportLoc,
3541 unsigned ClientLoadCapabilities) {
Argyrios Kyrtzidisdc9fdaf2013-05-24 05:44:08 +00003542 llvm::SaveAndRestore<SourceLocation>
3543 SetCurImportLocRAII(CurrentImportLoc, ImportLoc);
3544
Richard Smithd1c46742014-04-30 02:24:17 +00003545 // Defer any pending actions until we get to the end of reading the AST file.
3546 Deserializing AnASTFile(this);
3547
Guy Benyei11169dd2012-12-18 14:30:41 +00003548 // Bump the generation number.
Richard Smith053f6c62014-05-16 23:01:30 +00003549 unsigned PreviousGeneration = incrementGeneration(Context);
Guy Benyei11169dd2012-12-18 14:30:41 +00003550
3551 unsigned NumModules = ModuleMgr.size();
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003552 SmallVector<ImportedModule, 4> Loaded;
Guy Benyei11169dd2012-12-18 14:30:41 +00003553 switch(ASTReadResult ReadResult = ReadASTCore(FileName, Type, ImportLoc,
Craig Toppera13603a2014-05-22 05:54:18 +00003554 /*ImportedBy=*/nullptr, Loaded,
Douglas Gregor7029ce12013-03-19 00:28:20 +00003555 0, 0,
Guy Benyei11169dd2012-12-18 14:30:41 +00003556 ClientLoadCapabilities)) {
3557 case Failure:
Douglas Gregor7029ce12013-03-19 00:28:20 +00003558 case Missing:
Guy Benyei11169dd2012-12-18 14:30:41 +00003559 case OutOfDate:
3560 case VersionMismatch:
3561 case ConfigurationMismatch:
Ben Langmuir9801b252014-06-20 00:24:56 +00003562 case HadErrors: {
3563 llvm::SmallPtrSet<ModuleFile *, 4> LoadedSet;
3564 for (const ImportedModule &IM : Loaded)
3565 LoadedSet.insert(IM.Mod);
3566
Douglas Gregor7029ce12013-03-19 00:28:20 +00003567 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, ModuleMgr.end(),
Ben Langmuir9801b252014-06-20 00:24:56 +00003568 LoadedSet,
Douglas Gregor7029ce12013-03-19 00:28:20 +00003569 Context.getLangOpts().Modules
3570 ? &PP.getHeaderSearchInfo().getModuleMap()
Craig Toppera13603a2014-05-22 05:54:18 +00003571 : nullptr);
Douglas Gregore060e572013-01-25 01:03:03 +00003572
3573 // If we find that any modules are unusable, the global index is going
3574 // to be out-of-date. Just remove it.
3575 GlobalIndex.reset();
Craig Toppera13603a2014-05-22 05:54:18 +00003576 ModuleMgr.setGlobalIndex(nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00003577 return ReadResult;
Ben Langmuir9801b252014-06-20 00:24:56 +00003578 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003579 case Success:
3580 break;
3581 }
3582
3583 // Here comes stuff that we only do once the entire chain is loaded.
3584
3585 // Load the AST blocks of all of the modules that we loaded.
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003586 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
3587 MEnd = Loaded.end();
Guy Benyei11169dd2012-12-18 14:30:41 +00003588 M != MEnd; ++M) {
3589 ModuleFile &F = *M->Mod;
3590
3591 // Read the AST block.
Ben Langmuir2c9af442014-04-10 17:57:43 +00003592 if (ASTReadResult Result = ReadASTBlock(F, ClientLoadCapabilities))
3593 return Result;
Guy Benyei11169dd2012-12-18 14:30:41 +00003594
3595 // Once read, set the ModuleFile bit base offset and update the size in
3596 // bits of all files we've seen.
3597 F.GlobalBitOffset = TotalModulesSizeInBits;
3598 TotalModulesSizeInBits += F.SizeInBits;
3599 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F));
3600
3601 // Preload SLocEntries.
3602 for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) {
3603 int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID;
3604 // Load it through the SourceManager and don't call ReadSLocEntry()
3605 // directly because the entry may have already been loaded in which case
3606 // calling ReadSLocEntry() directly would trigger an assertion in
3607 // SourceManager.
3608 SourceMgr.getLoadedSLocEntryByID(Index);
3609 }
3610 }
3611
Douglas Gregor603cd862013-03-22 18:50:14 +00003612 // Setup the import locations and notify the module manager that we've
3613 // committed to these module files.
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003614 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
3615 MEnd = Loaded.end();
Guy Benyei11169dd2012-12-18 14:30:41 +00003616 M != MEnd; ++M) {
3617 ModuleFile &F = *M->Mod;
Douglas Gregor603cd862013-03-22 18:50:14 +00003618
3619 ModuleMgr.moduleFileAccepted(&F);
3620
3621 // Set the import location.
Argyrios Kyrtzidis71c1af82013-02-01 16:36:14 +00003622 F.DirectImportLoc = ImportLoc;
Guy Benyei11169dd2012-12-18 14:30:41 +00003623 if (!M->ImportedBy)
3624 F.ImportLoc = M->ImportLoc;
3625 else
3626 F.ImportLoc = ReadSourceLocation(*M->ImportedBy,
3627 M->ImportLoc.getRawEncoding());
3628 }
3629
3630 // Mark all of the identifiers in the identifier table as being out of date,
3631 // so that various accessors know to check the loaded modules when the
3632 // identifier is used.
3633 for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(),
3634 IdEnd = PP.getIdentifierTable().end();
3635 Id != IdEnd; ++Id)
3636 Id->second->setOutOfDate(true);
3637
3638 // Resolve any unresolved module exports.
Douglas Gregorfb912652013-03-20 21:10:35 +00003639 for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) {
3640 UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I];
Guy Benyei11169dd2012-12-18 14:30:41 +00003641 SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID);
3642 Module *ResolvedMod = getSubmodule(GlobalID);
Douglas Gregorfb912652013-03-20 21:10:35 +00003643
3644 switch (Unresolved.Kind) {
3645 case UnresolvedModuleRef::Conflict:
3646 if (ResolvedMod) {
3647 Module::Conflict Conflict;
3648 Conflict.Other = ResolvedMod;
3649 Conflict.Message = Unresolved.String.str();
3650 Unresolved.Mod->Conflicts.push_back(Conflict);
3651 }
3652 continue;
3653
3654 case UnresolvedModuleRef::Import:
Guy Benyei11169dd2012-12-18 14:30:41 +00003655 if (ResolvedMod)
3656 Unresolved.Mod->Imports.push_back(ResolvedMod);
3657 continue;
Guy Benyei11169dd2012-12-18 14:30:41 +00003658
Douglas Gregorfb912652013-03-20 21:10:35 +00003659 case UnresolvedModuleRef::Export:
3660 if (ResolvedMod || Unresolved.IsWildcard)
3661 Unresolved.Mod->Exports.push_back(
3662 Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard));
3663 continue;
3664 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003665 }
Douglas Gregorfb912652013-03-20 21:10:35 +00003666 UnresolvedModuleRefs.clear();
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003667
3668 // FIXME: How do we load the 'use'd modules? They may not be submodules.
3669 // Might be unnecessary as use declarations are only used to build the
3670 // module itself.
Guy Benyei11169dd2012-12-18 14:30:41 +00003671
3672 InitializeContext();
3673
Richard Smith3d8e97e2013-10-18 06:54:39 +00003674 if (SemaObj)
3675 UpdateSema();
3676
Guy Benyei11169dd2012-12-18 14:30:41 +00003677 if (DeserializationListener)
3678 DeserializationListener->ReaderInitialized(this);
3679
3680 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
3681 if (!PrimaryModule.OriginalSourceFileID.isInvalid()) {
3682 PrimaryModule.OriginalSourceFileID
3683 = FileID::get(PrimaryModule.SLocEntryBaseID
3684 + PrimaryModule.OriginalSourceFileID.getOpaqueValue() - 1);
3685
3686 // If this AST file is a precompiled preamble, then set the
3687 // preamble file ID of the source manager to the file source file
3688 // from which the preamble was built.
3689 if (Type == MK_Preamble) {
3690 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID);
3691 } else if (Type == MK_MainFile) {
3692 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID);
3693 }
3694 }
3695
3696 // For any Objective-C class definitions we have already loaded, make sure
3697 // that we load any additional categories.
3698 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
3699 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
3700 ObjCClassesLoaded[I],
3701 PreviousGeneration);
3702 }
Douglas Gregore060e572013-01-25 01:03:03 +00003703
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003704 if (PP.getHeaderSearchInfo()
3705 .getHeaderSearchOpts()
3706 .ModulesValidateOncePerBuildSession) {
3707 // Now we are certain that the module and all modules it depends on are
3708 // up to date. Create or update timestamp files for modules that are
3709 // located in the module cache (not for PCH files that could be anywhere
3710 // in the filesystem).
3711 for (unsigned I = 0, N = Loaded.size(); I != N; ++I) {
3712 ImportedModule &M = Loaded[I];
Richard Smithe842a472014-10-22 02:05:46 +00003713 if (M.Mod->Kind == MK_ImplicitModule) {
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003714 updateModuleTimestamp(*M.Mod);
3715 }
3716 }
3717 }
3718
Guy Benyei11169dd2012-12-18 14:30:41 +00003719 return Success;
3720}
3721
3722ASTReader::ASTReadResult
3723ASTReader::ReadASTCore(StringRef FileName,
3724 ModuleKind Type,
3725 SourceLocation ImportLoc,
3726 ModuleFile *ImportedBy,
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003727 SmallVectorImpl<ImportedModule> &Loaded,
Douglas Gregor7029ce12013-03-19 00:28:20 +00003728 off_t ExpectedSize, time_t ExpectedModTime,
Guy Benyei11169dd2012-12-18 14:30:41 +00003729 unsigned ClientLoadCapabilities) {
3730 ModuleFile *M;
Guy Benyei11169dd2012-12-18 14:30:41 +00003731 std::string ErrorStr;
Douglas Gregor7029ce12013-03-19 00:28:20 +00003732 ModuleManager::AddModuleResult AddResult
3733 = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy,
Richard Smith053f6c62014-05-16 23:01:30 +00003734 getGeneration(), ExpectedSize, ExpectedModTime,
Douglas Gregor7029ce12013-03-19 00:28:20 +00003735 M, ErrorStr);
Guy Benyei11169dd2012-12-18 14:30:41 +00003736
Douglas Gregor7029ce12013-03-19 00:28:20 +00003737 switch (AddResult) {
3738 case ModuleManager::AlreadyLoaded:
3739 return Success;
3740
3741 case ModuleManager::NewlyLoaded:
3742 // Load module file below.
3743 break;
3744
3745 case ModuleManager::Missing:
Richard Smithe842a472014-10-22 02:05:46 +00003746 // The module file was missing; if the client can handle that, return
Douglas Gregor7029ce12013-03-19 00:28:20 +00003747 // it.
3748 if (ClientLoadCapabilities & ARR_Missing)
3749 return Missing;
3750
3751 // Otherwise, return an error.
3752 {
3753 std::string Msg = "Unable to load module \"" + FileName.str() + "\": "
3754 + ErrorStr;
3755 Error(Msg);
3756 }
3757 return Failure;
3758
3759 case ModuleManager::OutOfDate:
3760 // We couldn't load the module file because it is out-of-date. If the
3761 // client can handle out-of-date, return it.
3762 if (ClientLoadCapabilities & ARR_OutOfDate)
3763 return OutOfDate;
3764
3765 // Otherwise, return an error.
3766 {
3767 std::string Msg = "Unable to load module \"" + FileName.str() + "\": "
3768 + ErrorStr;
3769 Error(Msg);
3770 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003771 return Failure;
3772 }
3773
Douglas Gregor7029ce12013-03-19 00:28:20 +00003774 assert(M && "Missing module file");
Guy Benyei11169dd2012-12-18 14:30:41 +00003775
3776 // FIXME: This seems rather a hack. Should CurrentDir be part of the
3777 // module?
3778 if (FileName != "-") {
3779 CurrentDir = llvm::sys::path::parent_path(FileName);
3780 if (CurrentDir.empty()) CurrentDir = ".";
3781 }
3782
3783 ModuleFile &F = *M;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00003784 BitstreamCursor &Stream = F.Stream;
Guy Benyei11169dd2012-12-18 14:30:41 +00003785 Stream.init(F.StreamFile);
3786 F.SizeInBits = F.Buffer->getBufferSize() * 8;
3787
3788 // Sniff for the signature.
3789 if (Stream.Read(8) != 'C' ||
3790 Stream.Read(8) != 'P' ||
3791 Stream.Read(8) != 'C' ||
3792 Stream.Read(8) != 'H') {
3793 Diag(diag::err_not_a_pch_file) << FileName;
3794 return Failure;
3795 }
3796
3797 // This is used for compatibility with older PCH formats.
3798 bool HaveReadControlBlock = false;
3799
Chris Lattnerefa77172013-01-20 00:00:22 +00003800 while (1) {
3801 llvm::BitstreamEntry Entry = Stream.advance();
3802
3803 switch (Entry.Kind) {
3804 case llvm::BitstreamEntry::Error:
3805 case llvm::BitstreamEntry::EndBlock:
3806 case llvm::BitstreamEntry::Record:
Guy Benyei11169dd2012-12-18 14:30:41 +00003807 Error("invalid record at top-level of AST file");
3808 return Failure;
Chris Lattnerefa77172013-01-20 00:00:22 +00003809
3810 case llvm::BitstreamEntry::SubBlock:
3811 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00003812 }
3813
Guy Benyei11169dd2012-12-18 14:30:41 +00003814 // We only know the control subblock ID.
Chris Lattnerefa77172013-01-20 00:00:22 +00003815 switch (Entry.ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003816 case llvm::bitc::BLOCKINFO_BLOCK_ID:
3817 if (Stream.ReadBlockInfoBlock()) {
3818 Error("malformed BlockInfoBlock in AST file");
3819 return Failure;
3820 }
3821 break;
3822 case CONTROL_BLOCK_ID:
3823 HaveReadControlBlock = true;
Ben Langmuirbeee15e2014-04-14 18:00:01 +00003824 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003825 case Success:
3826 break;
3827
3828 case Failure: return Failure;
Douglas Gregor7029ce12013-03-19 00:28:20 +00003829 case Missing: return Missing;
Guy Benyei11169dd2012-12-18 14:30:41 +00003830 case OutOfDate: return OutOfDate;
3831 case VersionMismatch: return VersionMismatch;
3832 case ConfigurationMismatch: return ConfigurationMismatch;
3833 case HadErrors: return HadErrors;
3834 }
3835 break;
3836 case AST_BLOCK_ID:
3837 if (!HaveReadControlBlock) {
3838 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
Dmitri Gribenko2228cd32014-02-11 15:40:09 +00003839 Diag(diag::err_pch_version_too_old);
Guy Benyei11169dd2012-12-18 14:30:41 +00003840 return VersionMismatch;
3841 }
3842
3843 // Record that we've loaded this module.
3844 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc));
3845 return Success;
3846
3847 default:
3848 if (Stream.SkipBlock()) {
3849 Error("malformed block record in AST file");
3850 return Failure;
3851 }
3852 break;
3853 }
3854 }
3855
3856 return Success;
3857}
3858
3859void ASTReader::InitializeContext() {
3860 // If there's a listener, notify them that we "read" the translation unit.
3861 if (DeserializationListener)
3862 DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID,
3863 Context.getTranslationUnitDecl());
3864
Guy Benyei11169dd2012-12-18 14:30:41 +00003865 // FIXME: Find a better way to deal with collisions between these
3866 // built-in types. Right now, we just ignore the problem.
3867
3868 // Load the special types.
3869 if (SpecialTypes.size() >= NumSpecialTypeIDs) {
3870 if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) {
3871 if (!Context.CFConstantStringTypeDecl)
3872 Context.setCFConstantStringType(GetType(String));
3873 }
3874
3875 if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) {
3876 QualType FileType = GetType(File);
3877 if (FileType.isNull()) {
3878 Error("FILE type is NULL");
3879 return;
3880 }
3881
3882 if (!Context.FILEDecl) {
3883 if (const TypedefType *Typedef = FileType->getAs<TypedefType>())
3884 Context.setFILEDecl(Typedef->getDecl());
3885 else {
3886 const TagType *Tag = FileType->getAs<TagType>();
3887 if (!Tag) {
3888 Error("Invalid FILE type in AST file");
3889 return;
3890 }
3891 Context.setFILEDecl(Tag->getDecl());
3892 }
3893 }
3894 }
3895
3896 if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) {
3897 QualType Jmp_bufType = GetType(Jmp_buf);
3898 if (Jmp_bufType.isNull()) {
3899 Error("jmp_buf type is NULL");
3900 return;
3901 }
3902
3903 if (!Context.jmp_bufDecl) {
3904 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>())
3905 Context.setjmp_bufDecl(Typedef->getDecl());
3906 else {
3907 const TagType *Tag = Jmp_bufType->getAs<TagType>();
3908 if (!Tag) {
3909 Error("Invalid jmp_buf type in AST file");
3910 return;
3911 }
3912 Context.setjmp_bufDecl(Tag->getDecl());
3913 }
3914 }
3915 }
3916
3917 if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) {
3918 QualType Sigjmp_bufType = GetType(Sigjmp_buf);
3919 if (Sigjmp_bufType.isNull()) {
3920 Error("sigjmp_buf type is NULL");
3921 return;
3922 }
3923
3924 if (!Context.sigjmp_bufDecl) {
3925 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>())
3926 Context.setsigjmp_bufDecl(Typedef->getDecl());
3927 else {
3928 const TagType *Tag = Sigjmp_bufType->getAs<TagType>();
3929 assert(Tag && "Invalid sigjmp_buf type in AST file");
3930 Context.setsigjmp_bufDecl(Tag->getDecl());
3931 }
3932 }
3933 }
3934
3935 if (unsigned ObjCIdRedef
3936 = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) {
3937 if (Context.ObjCIdRedefinitionType.isNull())
3938 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef);
3939 }
3940
3941 if (unsigned ObjCClassRedef
3942 = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) {
3943 if (Context.ObjCClassRedefinitionType.isNull())
3944 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef);
3945 }
3946
3947 if (unsigned ObjCSelRedef
3948 = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) {
3949 if (Context.ObjCSelRedefinitionType.isNull())
3950 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef);
3951 }
3952
3953 if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) {
3954 QualType Ucontext_tType = GetType(Ucontext_t);
3955 if (Ucontext_tType.isNull()) {
3956 Error("ucontext_t type is NULL");
3957 return;
3958 }
3959
3960 if (!Context.ucontext_tDecl) {
3961 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>())
3962 Context.setucontext_tDecl(Typedef->getDecl());
3963 else {
3964 const TagType *Tag = Ucontext_tType->getAs<TagType>();
3965 assert(Tag && "Invalid ucontext_t type in AST file");
3966 Context.setucontext_tDecl(Tag->getDecl());
3967 }
3968 }
3969 }
3970 }
3971
3972 ReadPragmaDiagnosticMappings(Context.getDiagnostics());
3973
3974 // If there were any CUDA special declarations, deserialize them.
3975 if (!CUDASpecialDeclRefs.empty()) {
3976 assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!");
3977 Context.setcudaConfigureCallDecl(
3978 cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0])));
3979 }
Richard Smith56be7542014-03-21 00:33:59 +00003980
Guy Benyei11169dd2012-12-18 14:30:41 +00003981 // Re-export any modules that were imported by a non-module AST file.
Richard Smith56be7542014-03-21 00:33:59 +00003982 // FIXME: This does not make macro-only imports visible again. It also doesn't
3983 // make #includes mapped to module imports visible.
3984 for (auto &Import : ImportedModules) {
3985 if (Module *Imported = getSubmodule(Import.ID))
Argyrios Kyrtzidis125df052013-02-01 16:36:12 +00003986 makeModuleVisible(Imported, Module::AllVisible,
Richard Smith56be7542014-03-21 00:33:59 +00003987 /*ImportLoc=*/Import.ImportLoc,
Douglas Gregorfb912652013-03-20 21:10:35 +00003988 /*Complain=*/false);
Guy Benyei11169dd2012-12-18 14:30:41 +00003989 }
3990 ImportedModules.clear();
3991}
3992
3993void ASTReader::finalizeForWriting() {
Richard Smith57721ac2014-07-21 04:10:40 +00003994 while (!HiddenNamesMap.empty()) {
3995 auto HiddenNames = std::move(*HiddenNamesMap.begin());
3996 HiddenNamesMap.erase(HiddenNamesMap.begin());
3997 makeNamesVisible(HiddenNames.second, HiddenNames.first,
3998 /*FromFinalization*/true);
Guy Benyei11169dd2012-12-18 14:30:41 +00003999 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004000}
4001
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004002/// \brief Given a cursor at the start of an AST file, scan ahead and drop the
4003/// cursor into the start of the given block ID, returning false on success and
4004/// true on failure.
4005static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004006 while (1) {
4007 llvm::BitstreamEntry Entry = Cursor.advance();
4008 switch (Entry.Kind) {
4009 case llvm::BitstreamEntry::Error:
4010 case llvm::BitstreamEntry::EndBlock:
4011 return true;
4012
4013 case llvm::BitstreamEntry::Record:
4014 // Ignore top-level records.
4015 Cursor.skipRecord(Entry.ID);
4016 break;
4017
4018 case llvm::BitstreamEntry::SubBlock:
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004019 if (Entry.ID == BlockID) {
4020 if (Cursor.EnterSubBlock(BlockID))
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004021 return true;
4022 // Found it!
4023 return false;
4024 }
4025
4026 if (Cursor.SkipBlock())
4027 return true;
4028 }
4029 }
4030}
4031
Guy Benyei11169dd2012-12-18 14:30:41 +00004032/// \brief Retrieve the name of the original source file name
4033/// directly from the AST file, without actually loading the AST
4034/// file.
4035std::string ASTReader::getOriginalSourceFile(const std::string &ASTFileName,
4036 FileManager &FileMgr,
4037 DiagnosticsEngine &Diags) {
4038 // Open the AST file.
4039 std::string ErrStr;
Rafael Espindola6406f7b2014-08-26 19:54:40 +00004040 std::unique_ptr<llvm::MemoryBuffer> Buffer =
4041 FileMgr.getBufferForFile(ASTFileName, &ErrStr);
Guy Benyei11169dd2012-12-18 14:30:41 +00004042 if (!Buffer) {
4043 Diags.Report(diag::err_fe_unable_to_read_pch_file) << ASTFileName << ErrStr;
4044 return std::string();
4045 }
4046
4047 // Initialize the stream
4048 llvm::BitstreamReader StreamFile;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004049 BitstreamCursor Stream;
Guy Benyei11169dd2012-12-18 14:30:41 +00004050 StreamFile.init((const unsigned char *)Buffer->getBufferStart(),
4051 (const unsigned char *)Buffer->getBufferEnd());
4052 Stream.init(StreamFile);
4053
4054 // Sniff for the signature.
4055 if (Stream.Read(8) != 'C' ||
4056 Stream.Read(8) != 'P' ||
4057 Stream.Read(8) != 'C' ||
4058 Stream.Read(8) != 'H') {
4059 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName;
4060 return std::string();
4061 }
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004062
Chris Lattnere7b154b2013-01-19 21:39:22 +00004063 // Scan for the CONTROL_BLOCK_ID block.
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004064 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004065 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
4066 return std::string();
Chris Lattnere7b154b2013-01-19 21:39:22 +00004067 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004068
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004069 // Scan for ORIGINAL_FILE inside the control block.
4070 RecordData Record;
Chris Lattnere7b154b2013-01-19 21:39:22 +00004071 while (1) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004072 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
Chris Lattnere7b154b2013-01-19 21:39:22 +00004073 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
4074 return std::string();
4075
4076 if (Entry.Kind != llvm::BitstreamEntry::Record) {
4077 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
4078 return std::string();
Guy Benyei11169dd2012-12-18 14:30:41 +00004079 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00004080
Guy Benyei11169dd2012-12-18 14:30:41 +00004081 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00004082 StringRef Blob;
4083 if (Stream.readRecord(Entry.ID, Record, &Blob) == ORIGINAL_FILE)
4084 return Blob.str();
Guy Benyei11169dd2012-12-18 14:30:41 +00004085 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004086}
4087
4088namespace {
4089 class SimplePCHValidator : public ASTReaderListener {
4090 const LangOptions &ExistingLangOpts;
4091 const TargetOptions &ExistingTargetOpts;
4092 const PreprocessorOptions &ExistingPPOpts;
4093 FileManager &FileMgr;
4094
4095 public:
4096 SimplePCHValidator(const LangOptions &ExistingLangOpts,
4097 const TargetOptions &ExistingTargetOpts,
4098 const PreprocessorOptions &ExistingPPOpts,
4099 FileManager &FileMgr)
4100 : ExistingLangOpts(ExistingLangOpts),
4101 ExistingTargetOpts(ExistingTargetOpts),
4102 ExistingPPOpts(ExistingPPOpts),
4103 FileMgr(FileMgr)
4104 {
4105 }
4106
Craig Topper3e89dfe2014-03-13 02:13:41 +00004107 bool ReadLanguageOptions(const LangOptions &LangOpts,
4108 bool Complain) override {
Craig Toppera13603a2014-05-22 05:54:18 +00004109 return checkLanguageOptions(ExistingLangOpts, LangOpts, nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00004110 }
Craig Topper3e89dfe2014-03-13 02:13:41 +00004111 bool ReadTargetOptions(const TargetOptions &TargetOpts,
4112 bool Complain) override {
Craig Toppera13603a2014-05-22 05:54:18 +00004113 return checkTargetOptions(ExistingTargetOpts, TargetOpts, nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00004114 }
Craig Topper3e89dfe2014-03-13 02:13:41 +00004115 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
4116 bool Complain,
4117 std::string &SuggestedPredefines) override {
Craig Toppera13603a2014-05-22 05:54:18 +00004118 return checkPreprocessorOptions(ExistingPPOpts, PPOpts, nullptr, FileMgr,
Argyrios Kyrtzidisd3afa0c2013-04-26 21:33:40 +00004119 SuggestedPredefines, ExistingLangOpts);
Guy Benyei11169dd2012-12-18 14:30:41 +00004120 }
4121 };
4122}
4123
4124bool ASTReader::readASTFileControlBlock(StringRef Filename,
4125 FileManager &FileMgr,
4126 ASTReaderListener &Listener) {
4127 // Open the AST file.
4128 std::string ErrStr;
Rafael Espindola6406f7b2014-08-26 19:54:40 +00004129 std::unique_ptr<llvm::MemoryBuffer> Buffer =
4130 FileMgr.getBufferForFile(Filename, &ErrStr);
Guy Benyei11169dd2012-12-18 14:30:41 +00004131 if (!Buffer) {
4132 return true;
4133 }
4134
4135 // Initialize the stream
4136 llvm::BitstreamReader StreamFile;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004137 BitstreamCursor Stream;
Guy Benyei11169dd2012-12-18 14:30:41 +00004138 StreamFile.init((const unsigned char *)Buffer->getBufferStart(),
4139 (const unsigned char *)Buffer->getBufferEnd());
4140 Stream.init(StreamFile);
4141
4142 // Sniff for the signature.
4143 if (Stream.Read(8) != 'C' ||
4144 Stream.Read(8) != 'P' ||
4145 Stream.Read(8) != 'C' ||
4146 Stream.Read(8) != 'H') {
4147 return true;
4148 }
4149
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004150 // Scan for the CONTROL_BLOCK_ID block.
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004151 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID))
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004152 return true;
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004153
4154 bool NeedsInputFiles = Listener.needsInputFileVisitation();
Ben Langmuircb69b572014-03-07 06:40:32 +00004155 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004156 BitstreamCursor InputFilesCursor;
4157 if (NeedsInputFiles) {
4158 InputFilesCursor = Stream;
4159 if (SkipCursorToBlock(InputFilesCursor, INPUT_FILES_BLOCK_ID))
4160 return true;
4161
4162 // Read the abbreviations
4163 while (true) {
4164 uint64_t Offset = InputFilesCursor.GetCurrentBitNo();
4165 unsigned Code = InputFilesCursor.ReadCode();
4166
4167 // We expect all abbrevs to be at the start of the block.
4168 if (Code != llvm::bitc::DEFINE_ABBREV) {
4169 InputFilesCursor.JumpToBit(Offset);
4170 break;
4171 }
4172 InputFilesCursor.ReadAbbrevRecord();
4173 }
4174 }
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004175
4176 // Scan for ORIGINAL_FILE inside the control block.
Guy Benyei11169dd2012-12-18 14:30:41 +00004177 RecordData Record;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004178 while (1) {
4179 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
4180 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
4181 return false;
4182
4183 if (Entry.Kind != llvm::BitstreamEntry::Record)
4184 return true;
4185
Guy Benyei11169dd2012-12-18 14:30:41 +00004186 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00004187 StringRef Blob;
4188 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob);
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004189 switch ((ControlRecordTypes)RecCode) {
4190 case METADATA: {
4191 if (Record[0] != VERSION_MAJOR)
4192 return true;
Guy Benyei11169dd2012-12-18 14:30:41 +00004193
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004194 if (Listener.ReadFullVersionInformation(Blob))
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004195 return true;
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004196
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004197 break;
4198 }
Ben Langmuir4f5212a2014-04-14 22:12:44 +00004199 case MODULE_NAME:
4200 Listener.ReadModuleName(Blob);
4201 break;
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00004202 case MODULE_MAP_FILE: {
4203 unsigned Idx = 0;
4204 Listener.ReadModuleMapFile(ReadString(Record, Idx));
Ben Langmuir4f5212a2014-04-14 22:12:44 +00004205 break;
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00004206 }
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004207 case LANGUAGE_OPTIONS:
4208 if (ParseLanguageOptions(Record, false, Listener))
4209 return true;
4210 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004211
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004212 case TARGET_OPTIONS:
4213 if (ParseTargetOptions(Record, false, Listener))
4214 return true;
4215 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004216
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004217 case DIAGNOSTIC_OPTIONS:
4218 if (ParseDiagnosticOptions(Record, false, Listener))
4219 return true;
4220 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004221
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004222 case FILE_SYSTEM_OPTIONS:
4223 if (ParseFileSystemOptions(Record, false, Listener))
4224 return true;
4225 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004226
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004227 case HEADER_SEARCH_OPTIONS:
4228 if (ParseHeaderSearchOptions(Record, false, Listener))
4229 return true;
4230 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004231
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004232 case PREPROCESSOR_OPTIONS: {
4233 std::string IgnoredSuggestedPredefines;
4234 if (ParsePreprocessorOptions(Record, false, Listener,
4235 IgnoredSuggestedPredefines))
4236 return true;
4237 break;
4238 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004239
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004240 case INPUT_FILE_OFFSETS: {
4241 if (!NeedsInputFiles)
4242 break;
4243
4244 unsigned NumInputFiles = Record[0];
4245 unsigned NumUserFiles = Record[1];
4246 const uint32_t *InputFileOffs = (const uint32_t *)Blob.data();
4247 for (unsigned I = 0; I != NumInputFiles; ++I) {
4248 // Go find this input file.
4249 bool isSystemFile = I >= NumUserFiles;
Ben Langmuircb69b572014-03-07 06:40:32 +00004250
4251 if (isSystemFile && !NeedsSystemInputFiles)
4252 break; // the rest are system input files
4253
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004254 BitstreamCursor &Cursor = InputFilesCursor;
4255 SavedStreamPosition SavedPosition(Cursor);
4256 Cursor.JumpToBit(InputFileOffs[I]);
4257
4258 unsigned Code = Cursor.ReadCode();
4259 RecordData Record;
4260 StringRef Blob;
4261 bool shouldContinue = false;
4262 switch ((InputFileRecordTypes)Cursor.readRecord(Code, Record, &Blob)) {
4263 case INPUT_FILE:
Argyrios Kyrtzidis68ccbe02014-03-14 02:26:31 +00004264 bool Overridden = static_cast<bool>(Record[3]);
4265 shouldContinue = Listener.visitInputFile(Blob, isSystemFile, Overridden);
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004266 break;
4267 }
4268 if (!shouldContinue)
4269 break;
4270 }
4271 break;
4272 }
4273
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004274 default:
4275 // No other validation to perform.
4276 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004277 }
4278 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004279}
4280
4281
4282bool ASTReader::isAcceptableASTFile(StringRef Filename,
4283 FileManager &FileMgr,
4284 const LangOptions &LangOpts,
4285 const TargetOptions &TargetOpts,
4286 const PreprocessorOptions &PPOpts) {
4287 SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts, FileMgr);
4288 return !readASTFileControlBlock(Filename, FileMgr, validator);
4289}
4290
Ben Langmuir2c9af442014-04-10 17:57:43 +00004291ASTReader::ASTReadResult
4292ASTReader::ReadSubmoduleBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004293 // Enter the submodule block.
4294 if (F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) {
4295 Error("malformed submodule block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004296 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004297 }
4298
4299 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
4300 bool First = true;
Craig Toppera13603a2014-05-22 05:54:18 +00004301 Module *CurrentModule = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00004302 RecordData Record;
4303 while (true) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004304 llvm::BitstreamEntry Entry = F.Stream.advanceSkippingSubblocks();
4305
4306 switch (Entry.Kind) {
4307 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
4308 case llvm::BitstreamEntry::Error:
4309 Error("malformed block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004310 return Failure;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004311 case llvm::BitstreamEntry::EndBlock:
Ben Langmuir2c9af442014-04-10 17:57:43 +00004312 return Success;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004313 case llvm::BitstreamEntry::Record:
4314 // The interesting case.
4315 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004316 }
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004317
Guy Benyei11169dd2012-12-18 14:30:41 +00004318 // Read a record.
Chris Lattner0e6c9402013-01-20 02:38:54 +00004319 StringRef Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00004320 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00004321 switch (F.Stream.readRecord(Entry.ID, Record, &Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004322 default: // Default behavior: ignore.
4323 break;
4324
4325 case SUBMODULE_DEFINITION: {
4326 if (First) {
4327 Error("missing submodule metadata record at beginning of block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004328 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004329 }
4330
Douglas Gregor8d932422013-03-20 03:59:18 +00004331 if (Record.size() < 8) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004332 Error("malformed module definition");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004333 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004334 }
4335
Chris Lattner0e6c9402013-01-20 02:38:54 +00004336 StringRef Name = Blob;
Richard Smith9bca2982014-03-08 00:03:56 +00004337 unsigned Idx = 0;
4338 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]);
4339 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]);
4340 bool IsFramework = Record[Idx++];
4341 bool IsExplicit = Record[Idx++];
4342 bool IsSystem = Record[Idx++];
4343 bool IsExternC = Record[Idx++];
4344 bool InferSubmodules = Record[Idx++];
4345 bool InferExplicitSubmodules = Record[Idx++];
4346 bool InferExportWildcard = Record[Idx++];
4347 bool ConfigMacrosExhaustive = Record[Idx++];
Douglas Gregor8d932422013-03-20 03:59:18 +00004348
Ben Langmuirbeee15e2014-04-14 18:00:01 +00004349 Module *ParentModule = nullptr;
Ben Langmuir9d6448b2014-08-09 00:57:23 +00004350 if (Parent)
Guy Benyei11169dd2012-12-18 14:30:41 +00004351 ParentModule = getSubmodule(Parent);
Ben Langmuirbeee15e2014-04-14 18:00:01 +00004352
Guy Benyei11169dd2012-12-18 14:30:41 +00004353 // Retrieve this (sub)module from the module map, creating it if
4354 // necessary.
Ben Langmuir9d6448b2014-08-09 00:57:23 +00004355 CurrentModule = ModMap.findOrCreateModule(Name, ParentModule, IsFramework,
Guy Benyei11169dd2012-12-18 14:30:41 +00004356 IsExplicit).first;
Ben Langmuir9d6448b2014-08-09 00:57:23 +00004357
4358 // FIXME: set the definition loc for CurrentModule, or call
4359 // ModMap.setInferredModuleAllowedBy()
4360
Guy Benyei11169dd2012-12-18 14:30:41 +00004361 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS;
4362 if (GlobalIndex >= SubmodulesLoaded.size() ||
4363 SubmodulesLoaded[GlobalIndex]) {
4364 Error("too many submodules");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004365 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004366 }
Douglas Gregor8a114ab2013-02-06 22:40:31 +00004367
Douglas Gregor7029ce12013-03-19 00:28:20 +00004368 if (!ParentModule) {
4369 if (const FileEntry *CurFile = CurrentModule->getASTFile()) {
4370 if (CurFile != F.File) {
4371 if (!Diags.isDiagnosticInFlight()) {
4372 Diag(diag::err_module_file_conflict)
4373 << CurrentModule->getTopLevelModuleName()
4374 << CurFile->getName()
4375 << F.File->getName();
4376 }
Ben Langmuir2c9af442014-04-10 17:57:43 +00004377 return Failure;
Douglas Gregor8a114ab2013-02-06 22:40:31 +00004378 }
Douglas Gregor8a114ab2013-02-06 22:40:31 +00004379 }
Douglas Gregor7029ce12013-03-19 00:28:20 +00004380
4381 CurrentModule->setASTFile(F.File);
Douglas Gregor8a114ab2013-02-06 22:40:31 +00004382 }
Ben Langmuirbeee15e2014-04-14 18:00:01 +00004383
Guy Benyei11169dd2012-12-18 14:30:41 +00004384 CurrentModule->IsFromModuleFile = true;
4385 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem;
Richard Smith9bca2982014-03-08 00:03:56 +00004386 CurrentModule->IsExternC = IsExternC;
Guy Benyei11169dd2012-12-18 14:30:41 +00004387 CurrentModule->InferSubmodules = InferSubmodules;
4388 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules;
4389 CurrentModule->InferExportWildcard = InferExportWildcard;
Douglas Gregor8d932422013-03-20 03:59:18 +00004390 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive;
Guy Benyei11169dd2012-12-18 14:30:41 +00004391 if (DeserializationListener)
4392 DeserializationListener->ModuleRead(GlobalID, CurrentModule);
4393
4394 SubmodulesLoaded[GlobalIndex] = CurrentModule;
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004395
Douglas Gregorfb912652013-03-20 21:10:35 +00004396 // Clear out data that will be replaced by what is the module file.
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004397 CurrentModule->LinkLibraries.clear();
Douglas Gregor8d932422013-03-20 03:59:18 +00004398 CurrentModule->ConfigMacros.clear();
Douglas Gregorfb912652013-03-20 21:10:35 +00004399 CurrentModule->UnresolvedConflicts.clear();
4400 CurrentModule->Conflicts.clear();
Guy Benyei11169dd2012-12-18 14:30:41 +00004401 break;
4402 }
4403
4404 case SUBMODULE_UMBRELLA_HEADER: {
4405 if (First) {
4406 Error("missing submodule metadata record at beginning of block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004407 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004408 }
4409
4410 if (!CurrentModule)
4411 break;
4412
Chris Lattner0e6c9402013-01-20 02:38:54 +00004413 if (const FileEntry *Umbrella = PP.getFileManager().getFile(Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004414 if (!CurrentModule->getUmbrellaHeader())
4415 ModMap.setUmbrellaHeader(CurrentModule, Umbrella);
4416 else if (CurrentModule->getUmbrellaHeader() != Umbrella) {
Ben Langmuir2c9af442014-04-10 17:57:43 +00004417 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
4418 Error("mismatched umbrella headers in submodule");
4419 return OutOfDate;
Guy Benyei11169dd2012-12-18 14:30:41 +00004420 }
4421 }
4422 break;
4423 }
4424
4425 case SUBMODULE_HEADER: {
4426 if (First) {
4427 Error("missing submodule metadata record at beginning of block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004428 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004429 }
4430
4431 if (!CurrentModule)
4432 break;
4433
Argyrios Kyrtzidisb146baa2013-03-13 21:13:51 +00004434 // We lazily associate headers with their modules via the HeaderInfoTable.
4435 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
4436 // of complete filenames or remove it entirely.
Guy Benyei11169dd2012-12-18 14:30:41 +00004437 break;
4438 }
4439
4440 case SUBMODULE_EXCLUDED_HEADER: {
4441 if (First) {
4442 Error("missing submodule metadata record at beginning of block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004443 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004444 }
4445
4446 if (!CurrentModule)
4447 break;
4448
Argyrios Kyrtzidisb146baa2013-03-13 21:13:51 +00004449 // We lazily associate headers with their modules via the HeaderInfoTable.
4450 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
4451 // of complete filenames or remove it entirely.
Guy Benyei11169dd2012-12-18 14:30:41 +00004452 break;
4453 }
4454
Lawrence Crowlb53e5482013-06-20 21:14:14 +00004455 case SUBMODULE_PRIVATE_HEADER: {
4456 if (First) {
4457 Error("missing submodule metadata record at beginning of block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004458 return Failure;
Lawrence Crowlb53e5482013-06-20 21:14:14 +00004459 }
4460
4461 if (!CurrentModule)
4462 break;
4463
4464 // We lazily associate headers with their modules via the HeaderInfoTable.
4465 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
4466 // of complete filenames or remove it entirely.
4467 break;
4468 }
4469
Guy Benyei11169dd2012-12-18 14:30:41 +00004470 case SUBMODULE_TOPHEADER: {
4471 if (First) {
4472 Error("missing submodule metadata record at beginning of block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004473 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004474 }
4475
4476 if (!CurrentModule)
4477 break;
4478
Argyrios Kyrtzidis3c5305c2013-03-13 21:13:43 +00004479 CurrentModule->addTopHeaderFilename(Blob);
Guy Benyei11169dd2012-12-18 14:30:41 +00004480 break;
4481 }
4482
4483 case SUBMODULE_UMBRELLA_DIR: {
4484 if (First) {
4485 Error("missing submodule metadata record at beginning of block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004486 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004487 }
4488
4489 if (!CurrentModule)
4490 break;
4491
Guy Benyei11169dd2012-12-18 14:30:41 +00004492 if (const DirectoryEntry *Umbrella
Chris Lattner0e6c9402013-01-20 02:38:54 +00004493 = PP.getFileManager().getDirectory(Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004494 if (!CurrentModule->getUmbrellaDir())
4495 ModMap.setUmbrellaDir(CurrentModule, Umbrella);
4496 else if (CurrentModule->getUmbrellaDir() != Umbrella) {
Ben Langmuir2c9af442014-04-10 17:57:43 +00004497 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
4498 Error("mismatched umbrella directories in submodule");
4499 return OutOfDate;
Guy Benyei11169dd2012-12-18 14:30:41 +00004500 }
4501 }
4502 break;
4503 }
4504
4505 case SUBMODULE_METADATA: {
4506 if (!First) {
4507 Error("submodule metadata record not at beginning of block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004508 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004509 }
4510 First = false;
4511
4512 F.BaseSubmoduleID = getTotalNumSubmodules();
4513 F.LocalNumSubmodules = Record[0];
4514 unsigned LocalBaseSubmoduleID = Record[1];
4515 if (F.LocalNumSubmodules > 0) {
4516 // Introduce the global -> local mapping for submodules within this
4517 // module.
4518 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F));
4519
4520 // Introduce the local -> global mapping for submodules within this
4521 // module.
4522 F.SubmoduleRemap.insertOrReplace(
4523 std::make_pair(LocalBaseSubmoduleID,
4524 F.BaseSubmoduleID - LocalBaseSubmoduleID));
Ben Langmuirfe971d92014-08-16 04:54:18 +00004525
Ben Langmuir52ca6782014-10-20 16:27:32 +00004526 SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules);
4527 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004528 break;
4529 }
4530
4531 case SUBMODULE_IMPORTS: {
4532 if (First) {
4533 Error("missing submodule metadata record at beginning of block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004534 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004535 }
4536
4537 if (!CurrentModule)
4538 break;
4539
4540 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) {
Douglas Gregorfb912652013-03-20 21:10:35 +00004541 UnresolvedModuleRef Unresolved;
Guy Benyei11169dd2012-12-18 14:30:41 +00004542 Unresolved.File = &F;
4543 Unresolved.Mod = CurrentModule;
4544 Unresolved.ID = Record[Idx];
Douglas Gregorfb912652013-03-20 21:10:35 +00004545 Unresolved.Kind = UnresolvedModuleRef::Import;
Guy Benyei11169dd2012-12-18 14:30:41 +00004546 Unresolved.IsWildcard = false;
Douglas Gregorfb912652013-03-20 21:10:35 +00004547 UnresolvedModuleRefs.push_back(Unresolved);
Guy Benyei11169dd2012-12-18 14:30:41 +00004548 }
4549 break;
4550 }
4551
4552 case SUBMODULE_EXPORTS: {
4553 if (First) {
4554 Error("missing submodule metadata record at beginning of block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004555 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004556 }
4557
4558 if (!CurrentModule)
4559 break;
4560
4561 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) {
Douglas Gregorfb912652013-03-20 21:10:35 +00004562 UnresolvedModuleRef Unresolved;
Guy Benyei11169dd2012-12-18 14:30:41 +00004563 Unresolved.File = &F;
4564 Unresolved.Mod = CurrentModule;
4565 Unresolved.ID = Record[Idx];
Douglas Gregorfb912652013-03-20 21:10:35 +00004566 Unresolved.Kind = UnresolvedModuleRef::Export;
Guy Benyei11169dd2012-12-18 14:30:41 +00004567 Unresolved.IsWildcard = Record[Idx + 1];
Douglas Gregorfb912652013-03-20 21:10:35 +00004568 UnresolvedModuleRefs.push_back(Unresolved);
Guy Benyei11169dd2012-12-18 14:30:41 +00004569 }
4570
4571 // Once we've loaded the set of exports, there's no reason to keep
4572 // the parsed, unresolved exports around.
4573 CurrentModule->UnresolvedExports.clear();
4574 break;
4575 }
4576 case SUBMODULE_REQUIRES: {
4577 if (First) {
4578 Error("missing submodule metadata record at beginning of block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004579 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004580 }
4581
4582 if (!CurrentModule)
4583 break;
4584
Richard Smitha3feee22013-10-28 22:18:19 +00004585 CurrentModule->addRequirement(Blob, Record[0], Context.getLangOpts(),
Guy Benyei11169dd2012-12-18 14:30:41 +00004586 Context.getTargetInfo());
4587 break;
4588 }
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004589
4590 case SUBMODULE_LINK_LIBRARY:
4591 if (First) {
4592 Error("missing submodule metadata record at beginning of block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004593 return Failure;
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004594 }
4595
4596 if (!CurrentModule)
4597 break;
4598
4599 CurrentModule->LinkLibraries.push_back(
Chris Lattner0e6c9402013-01-20 02:38:54 +00004600 Module::LinkLibrary(Blob, Record[0]));
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004601 break;
Douglas Gregor35b13ec2013-03-20 00:22:05 +00004602
4603 case SUBMODULE_CONFIG_MACRO:
4604 if (First) {
4605 Error("missing submodule metadata record at beginning of block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004606 return Failure;
Douglas Gregor35b13ec2013-03-20 00:22:05 +00004607 }
4608
4609 if (!CurrentModule)
4610 break;
4611
4612 CurrentModule->ConfigMacros.push_back(Blob.str());
4613 break;
Douglas Gregorfb912652013-03-20 21:10:35 +00004614
4615 case SUBMODULE_CONFLICT: {
4616 if (First) {
4617 Error("missing submodule metadata record at beginning of block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004618 return Failure;
Douglas Gregorfb912652013-03-20 21:10:35 +00004619 }
4620
4621 if (!CurrentModule)
4622 break;
4623
4624 UnresolvedModuleRef Unresolved;
4625 Unresolved.File = &F;
4626 Unresolved.Mod = CurrentModule;
4627 Unresolved.ID = Record[0];
4628 Unresolved.Kind = UnresolvedModuleRef::Conflict;
4629 Unresolved.IsWildcard = false;
4630 Unresolved.String = Blob;
4631 UnresolvedModuleRefs.push_back(Unresolved);
4632 break;
4633 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004634 }
4635 }
4636}
4637
4638/// \brief Parse the record that corresponds to a LangOptions data
4639/// structure.
4640///
4641/// This routine parses the language options from the AST file and then gives
4642/// them to the AST listener if one is set.
4643///
4644/// \returns true if the listener deems the file unacceptable, false otherwise.
4645bool ASTReader::ParseLanguageOptions(const RecordData &Record,
4646 bool Complain,
4647 ASTReaderListener &Listener) {
4648 LangOptions LangOpts;
4649 unsigned Idx = 0;
4650#define LANGOPT(Name, Bits, Default, Description) \
4651 LangOpts.Name = Record[Idx++];
4652#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
4653 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
4654#include "clang/Basic/LangOptions.def"
Will Dietzf54319c2013-01-18 11:30:38 +00004655#define SANITIZER(NAME, ID) LangOpts.Sanitize.ID = Record[Idx++];
4656#include "clang/Basic/Sanitizers.def"
Guy Benyei11169dd2012-12-18 14:30:41 +00004657
4658 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++];
4659 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx);
4660 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion);
4661
4662 unsigned Length = Record[Idx++];
4663 LangOpts.CurrentModule.assign(Record.begin() + Idx,
4664 Record.begin() + Idx + Length);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004665
4666 Idx += Length;
4667
4668 // Comment options.
4669 for (unsigned N = Record[Idx++]; N; --N) {
4670 LangOpts.CommentOpts.BlockCommandNames.push_back(
4671 ReadString(Record, Idx));
4672 }
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004673 LangOpts.CommentOpts.ParseAllComments = Record[Idx++];
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004674
Guy Benyei11169dd2012-12-18 14:30:41 +00004675 return Listener.ReadLanguageOptions(LangOpts, Complain);
4676}
4677
4678bool ASTReader::ParseTargetOptions(const RecordData &Record,
4679 bool Complain,
4680 ASTReaderListener &Listener) {
4681 unsigned Idx = 0;
4682 TargetOptions TargetOpts;
4683 TargetOpts.Triple = ReadString(Record, Idx);
4684 TargetOpts.CPU = ReadString(Record, Idx);
4685 TargetOpts.ABI = ReadString(Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00004686 for (unsigned N = Record[Idx++]; N; --N) {
4687 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx));
4688 }
4689 for (unsigned N = Record[Idx++]; N; --N) {
4690 TargetOpts.Features.push_back(ReadString(Record, Idx));
4691 }
4692
4693 return Listener.ReadTargetOptions(TargetOpts, Complain);
4694}
4695
4696bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain,
4697 ASTReaderListener &Listener) {
Ben Langmuirb92de022014-04-29 16:25:26 +00004698 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions);
Guy Benyei11169dd2012-12-18 14:30:41 +00004699 unsigned Idx = 0;
Ben Langmuirb92de022014-04-29 16:25:26 +00004700#define DIAGOPT(Name, Bits, Default) DiagOpts->Name = Record[Idx++];
Guy Benyei11169dd2012-12-18 14:30:41 +00004701#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
Ben Langmuirb92de022014-04-29 16:25:26 +00004702 DiagOpts->set##Name(static_cast<Type>(Record[Idx++]));
Guy Benyei11169dd2012-12-18 14:30:41 +00004703#include "clang/Basic/DiagnosticOptions.def"
4704
Richard Smith3be1cb22014-08-07 00:24:21 +00004705 for (unsigned N = Record[Idx++]; N; --N)
Ben Langmuirb92de022014-04-29 16:25:26 +00004706 DiagOpts->Warnings.push_back(ReadString(Record, Idx));
Richard Smith3be1cb22014-08-07 00:24:21 +00004707 for (unsigned N = Record[Idx++]; N; --N)
4708 DiagOpts->Remarks.push_back(ReadString(Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00004709
4710 return Listener.ReadDiagnosticOptions(DiagOpts, Complain);
4711}
4712
4713bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain,
4714 ASTReaderListener &Listener) {
4715 FileSystemOptions FSOpts;
4716 unsigned Idx = 0;
4717 FSOpts.WorkingDir = ReadString(Record, Idx);
4718 return Listener.ReadFileSystemOptions(FSOpts, Complain);
4719}
4720
4721bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record,
4722 bool Complain,
4723 ASTReaderListener &Listener) {
4724 HeaderSearchOptions HSOpts;
4725 unsigned Idx = 0;
4726 HSOpts.Sysroot = ReadString(Record, Idx);
4727
4728 // Include entries.
4729 for (unsigned N = Record[Idx++]; N; --N) {
4730 std::string Path = ReadString(Record, Idx);
4731 frontend::IncludeDirGroup Group
4732 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]);
Guy Benyei11169dd2012-12-18 14:30:41 +00004733 bool IsFramework = Record[Idx++];
4734 bool IgnoreSysRoot = Record[Idx++];
Guy Benyei11169dd2012-12-18 14:30:41 +00004735 HSOpts.UserEntries.push_back(
Daniel Dunbar53681732013-01-30 00:34:26 +00004736 HeaderSearchOptions::Entry(Path, Group, IsFramework, IgnoreSysRoot));
Guy Benyei11169dd2012-12-18 14:30:41 +00004737 }
4738
4739 // System header prefixes.
4740 for (unsigned N = Record[Idx++]; N; --N) {
4741 std::string Prefix = ReadString(Record, Idx);
4742 bool IsSystemHeader = Record[Idx++];
4743 HSOpts.SystemHeaderPrefixes.push_back(
4744 HeaderSearchOptions::SystemHeaderPrefix(Prefix, IsSystemHeader));
4745 }
4746
4747 HSOpts.ResourceDir = ReadString(Record, Idx);
4748 HSOpts.ModuleCachePath = ReadString(Record, Idx);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004749 HSOpts.ModuleUserBuildPath = ReadString(Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00004750 HSOpts.DisableModuleHash = Record[Idx++];
4751 HSOpts.UseBuiltinIncludes = Record[Idx++];
4752 HSOpts.UseStandardSystemIncludes = Record[Idx++];
4753 HSOpts.UseStandardCXXIncludes = Record[Idx++];
4754 HSOpts.UseLibcxx = Record[Idx++];
4755
4756 return Listener.ReadHeaderSearchOptions(HSOpts, Complain);
4757}
4758
4759bool ASTReader::ParsePreprocessorOptions(const RecordData &Record,
4760 bool Complain,
4761 ASTReaderListener &Listener,
4762 std::string &SuggestedPredefines) {
4763 PreprocessorOptions PPOpts;
4764 unsigned Idx = 0;
4765
4766 // Macro definitions/undefs
4767 for (unsigned N = Record[Idx++]; N; --N) {
4768 std::string Macro = ReadString(Record, Idx);
4769 bool IsUndef = Record[Idx++];
4770 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef));
4771 }
4772
4773 // Includes
4774 for (unsigned N = Record[Idx++]; N; --N) {
4775 PPOpts.Includes.push_back(ReadString(Record, Idx));
4776 }
4777
4778 // Macro Includes
4779 for (unsigned N = Record[Idx++]; N; --N) {
4780 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx));
4781 }
4782
4783 PPOpts.UsePredefines = Record[Idx++];
Argyrios Kyrtzidisd3afa0c2013-04-26 21:33:40 +00004784 PPOpts.DetailedRecord = Record[Idx++];
Guy Benyei11169dd2012-12-18 14:30:41 +00004785 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx);
4786 PPOpts.ImplicitPTHInclude = ReadString(Record, Idx);
4787 PPOpts.ObjCXXARCStandardLibrary =
4788 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]);
4789 SuggestedPredefines.clear();
4790 return Listener.ReadPreprocessorOptions(PPOpts, Complain,
4791 SuggestedPredefines);
4792}
4793
4794std::pair<ModuleFile *, unsigned>
4795ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) {
4796 GlobalPreprocessedEntityMapType::iterator
4797 I = GlobalPreprocessedEntityMap.find(GlobalIndex);
4798 assert(I != GlobalPreprocessedEntityMap.end() &&
4799 "Corrupted global preprocessed entity map");
4800 ModuleFile *M = I->second;
4801 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID;
4802 return std::make_pair(M, LocalIndex);
4803}
4804
4805std::pair<PreprocessingRecord::iterator, PreprocessingRecord::iterator>
4806ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const {
4807 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
4808 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID,
4809 Mod.NumPreprocessedEntities);
4810
4811 return std::make_pair(PreprocessingRecord::iterator(),
4812 PreprocessingRecord::iterator());
4813}
4814
4815std::pair<ASTReader::ModuleDeclIterator, ASTReader::ModuleDeclIterator>
4816ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) {
4817 return std::make_pair(ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls),
4818 ModuleDeclIterator(this, &Mod,
4819 Mod.FileSortedDecls + Mod.NumFileSortedDecls));
4820}
4821
4822PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) {
4823 PreprocessedEntityID PPID = Index+1;
4824 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
4825 ModuleFile &M = *PPInfo.first;
4826 unsigned LocalIndex = PPInfo.second;
4827 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
4828
Guy Benyei11169dd2012-12-18 14:30:41 +00004829 if (!PP.getPreprocessingRecord()) {
4830 Error("no preprocessing record");
Craig Toppera13603a2014-05-22 05:54:18 +00004831 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00004832 }
4833
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004834 SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor);
4835 M.PreprocessorDetailCursor.JumpToBit(PPOffs.BitOffset);
4836
4837 llvm::BitstreamEntry Entry =
4838 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
4839 if (Entry.Kind != llvm::BitstreamEntry::Record)
Craig Toppera13603a2014-05-22 05:54:18 +00004840 return nullptr;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004841
Guy Benyei11169dd2012-12-18 14:30:41 +00004842 // Read the record.
4843 SourceRange Range(ReadSourceLocation(M, PPOffs.Begin),
4844 ReadSourceLocation(M, PPOffs.End));
4845 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
Chris Lattner0e6c9402013-01-20 02:38:54 +00004846 StringRef Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00004847 RecordData Record;
4848 PreprocessorDetailRecordTypes RecType =
Chris Lattner0e6c9402013-01-20 02:38:54 +00004849 (PreprocessorDetailRecordTypes)M.PreprocessorDetailCursor.readRecord(
4850 Entry.ID, Record, &Blob);
Guy Benyei11169dd2012-12-18 14:30:41 +00004851 switch (RecType) {
4852 case PPD_MACRO_EXPANSION: {
4853 bool isBuiltin = Record[0];
Craig Toppera13603a2014-05-22 05:54:18 +00004854 IdentifierInfo *Name = nullptr;
4855 MacroDefinition *Def = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00004856 if (isBuiltin)
4857 Name = getLocalIdentifier(M, Record[1]);
4858 else {
4859 PreprocessedEntityID
4860 GlobalID = getGlobalPreprocessedEntityID(M, Record[1]);
4861 Def =cast<MacroDefinition>(PPRec.getLoadedPreprocessedEntity(GlobalID-1));
4862 }
4863
4864 MacroExpansion *ME;
4865 if (isBuiltin)
4866 ME = new (PPRec) MacroExpansion(Name, Range);
4867 else
4868 ME = new (PPRec) MacroExpansion(Def, Range);
4869
4870 return ME;
4871 }
4872
4873 case PPD_MACRO_DEFINITION: {
4874 // Decode the identifier info and then check again; if the macro is
4875 // still defined and associated with the identifier,
4876 IdentifierInfo *II = getLocalIdentifier(M, Record[0]);
4877 MacroDefinition *MD
4878 = new (PPRec) MacroDefinition(II, Range);
4879
4880 if (DeserializationListener)
4881 DeserializationListener->MacroDefinitionRead(PPID, MD);
4882
4883 return MD;
4884 }
4885
4886 case PPD_INCLUSION_DIRECTIVE: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00004887 const char *FullFileNameStart = Blob.data() + Record[0];
4888 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]);
Craig Toppera13603a2014-05-22 05:54:18 +00004889 const FileEntry *File = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00004890 if (!FullFileName.empty())
4891 File = PP.getFileManager().getFile(FullFileName);
4892
4893 // FIXME: Stable encoding
4894 InclusionDirective::InclusionKind Kind
4895 = static_cast<InclusionDirective::InclusionKind>(Record[2]);
4896 InclusionDirective *ID
4897 = new (PPRec) InclusionDirective(PPRec, Kind,
Chris Lattner0e6c9402013-01-20 02:38:54 +00004898 StringRef(Blob.data(), Record[0]),
Guy Benyei11169dd2012-12-18 14:30:41 +00004899 Record[1], Record[3],
4900 File,
4901 Range);
4902 return ID;
4903 }
4904 }
4905
4906 llvm_unreachable("Invalid PreprocessorDetailRecordTypes");
4907}
4908
4909/// \brief \arg SLocMapI points at a chunk of a module that contains no
4910/// preprocessed entities or the entities it contains are not the ones we are
4911/// looking for. Find the next module that contains entities and return the ID
4912/// of the first entry.
4913PreprocessedEntityID ASTReader::findNextPreprocessedEntity(
4914 GlobalSLocOffsetMapType::const_iterator SLocMapI) const {
4915 ++SLocMapI;
4916 for (GlobalSLocOffsetMapType::const_iterator
4917 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
4918 ModuleFile &M = *SLocMapI->second;
4919 if (M.NumPreprocessedEntities)
4920 return M.BasePreprocessedEntityID;
4921 }
4922
4923 return getTotalNumPreprocessedEntities();
4924}
4925
4926namespace {
4927
4928template <unsigned PPEntityOffset::*PPLoc>
4929struct PPEntityComp {
4930 const ASTReader &Reader;
4931 ModuleFile &M;
4932
4933 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) { }
4934
4935 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const {
4936 SourceLocation LHS = getLoc(L);
4937 SourceLocation RHS = getLoc(R);
4938 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
4939 }
4940
4941 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const {
4942 SourceLocation LHS = getLoc(L);
4943 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
4944 }
4945
4946 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const {
4947 SourceLocation RHS = getLoc(R);
4948 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
4949 }
4950
4951 SourceLocation getLoc(const PPEntityOffset &PPE) const {
4952 return Reader.ReadSourceLocation(M, PPE.*PPLoc);
4953 }
4954};
4955
4956}
4957
Alp Toker2e9ce4c2014-05-16 18:59:21 +00004958PreprocessedEntityID ASTReader::findPreprocessedEntity(SourceLocation Loc,
4959 bool EndsAfter) const {
4960 if (SourceMgr.isLocalSourceLocation(Loc))
Guy Benyei11169dd2012-12-18 14:30:41 +00004961 return getTotalNumPreprocessedEntities();
4962
Alp Toker2e9ce4c2014-05-16 18:59:21 +00004963 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
4964 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
Guy Benyei11169dd2012-12-18 14:30:41 +00004965 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
4966 "Corrupted global sloc offset map");
4967
4968 if (SLocMapI->second->NumPreprocessedEntities == 0)
4969 return findNextPreprocessedEntity(SLocMapI);
4970
4971 ModuleFile &M = *SLocMapI->second;
4972 typedef const PPEntityOffset *pp_iterator;
4973 pp_iterator pp_begin = M.PreprocessedEntityOffsets;
4974 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities;
4975
4976 size_t Count = M.NumPreprocessedEntities;
4977 size_t Half;
4978 pp_iterator First = pp_begin;
4979 pp_iterator PPI;
4980
Alp Toker2e9ce4c2014-05-16 18:59:21 +00004981 if (EndsAfter) {
4982 PPI = std::upper_bound(pp_begin, pp_end, Loc,
4983 PPEntityComp<&PPEntityOffset::Begin>(*this, M));
4984 } else {
4985 // Do a binary search manually instead of using std::lower_bound because
4986 // The end locations of entities may be unordered (when a macro expansion
4987 // is inside another macro argument), but for this case it is not important
4988 // whether we get the first macro expansion or its containing macro.
4989 while (Count > 0) {
4990 Half = Count / 2;
4991 PPI = First;
4992 std::advance(PPI, Half);
4993 if (SourceMgr.isBeforeInTranslationUnit(ReadSourceLocation(M, PPI->End),
4994 Loc)) {
4995 First = PPI;
4996 ++First;
4997 Count = Count - Half - 1;
4998 } else
4999 Count = Half;
5000 }
Guy Benyei11169dd2012-12-18 14:30:41 +00005001 }
5002
5003 if (PPI == pp_end)
5004 return findNextPreprocessedEntity(SLocMapI);
5005
5006 return M.BasePreprocessedEntityID + (PPI - pp_begin);
5007}
5008
Guy Benyei11169dd2012-12-18 14:30:41 +00005009/// \brief Returns a pair of [Begin, End) indices of preallocated
5010/// preprocessed entities that \arg Range encompasses.
5011std::pair<unsigned, unsigned>
5012 ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) {
5013 if (Range.isInvalid())
5014 return std::make_pair(0,0);
5015 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
5016
Alp Toker2e9ce4c2014-05-16 18:59:21 +00005017 PreprocessedEntityID BeginID =
5018 findPreprocessedEntity(Range.getBegin(), false);
5019 PreprocessedEntityID EndID = findPreprocessedEntity(Range.getEnd(), true);
Guy Benyei11169dd2012-12-18 14:30:41 +00005020 return std::make_pair(BeginID, EndID);
5021}
5022
5023/// \brief Optionally returns true or false if the preallocated preprocessed
5024/// entity with index \arg Index came from file \arg FID.
David Blaikie05785d12013-02-20 22:23:23 +00005025Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index,
Guy Benyei11169dd2012-12-18 14:30:41 +00005026 FileID FID) {
5027 if (FID.isInvalid())
5028 return false;
5029
5030 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
5031 ModuleFile &M = *PPInfo.first;
5032 unsigned LocalIndex = PPInfo.second;
5033 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
5034
5035 SourceLocation Loc = ReadSourceLocation(M, PPOffs.Begin);
5036 if (Loc.isInvalid())
5037 return false;
5038
5039 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
5040 return true;
5041 else
5042 return false;
5043}
5044
5045namespace {
5046 /// \brief Visitor used to search for information about a header file.
5047 class HeaderFileInfoVisitor {
Guy Benyei11169dd2012-12-18 14:30:41 +00005048 const FileEntry *FE;
5049
David Blaikie05785d12013-02-20 22:23:23 +00005050 Optional<HeaderFileInfo> HFI;
Guy Benyei11169dd2012-12-18 14:30:41 +00005051
5052 public:
Argyrios Kyrtzidis61a38962013-03-06 18:12:44 +00005053 explicit HeaderFileInfoVisitor(const FileEntry *FE)
5054 : FE(FE) { }
Guy Benyei11169dd2012-12-18 14:30:41 +00005055
5056 static bool visit(ModuleFile &M, void *UserData) {
5057 HeaderFileInfoVisitor *This
5058 = static_cast<HeaderFileInfoVisitor *>(UserData);
5059
Guy Benyei11169dd2012-12-18 14:30:41 +00005060 HeaderFileInfoLookupTable *Table
5061 = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable);
5062 if (!Table)
5063 return false;
5064
5065 // Look in the on-disk hash table for an entry for this file name.
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00005066 HeaderFileInfoLookupTable::iterator Pos = Table->find(This->FE);
Guy Benyei11169dd2012-12-18 14:30:41 +00005067 if (Pos == Table->end())
5068 return false;
5069
5070 This->HFI = *Pos;
5071 return true;
5072 }
5073
David Blaikie05785d12013-02-20 22:23:23 +00005074 Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; }
Guy Benyei11169dd2012-12-18 14:30:41 +00005075 };
5076}
5077
5078HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) {
Argyrios Kyrtzidis61a38962013-03-06 18:12:44 +00005079 HeaderFileInfoVisitor Visitor(FE);
Guy Benyei11169dd2012-12-18 14:30:41 +00005080 ModuleMgr.visit(&HeaderFileInfoVisitor::visit, &Visitor);
Argyrios Kyrtzidis1054bbf2013-05-08 23:46:55 +00005081 if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
Guy Benyei11169dd2012-12-18 14:30:41 +00005082 return *HFI;
Guy Benyei11169dd2012-12-18 14:30:41 +00005083
5084 return HeaderFileInfo();
5085}
5086
5087void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) {
5088 // FIXME: Make it work properly with modules.
Dmitri Gribenkof8579502013-01-12 19:30:44 +00005089 SmallVector<DiagnosticsEngine::DiagState *, 32> DiagStates;
Guy Benyei11169dd2012-12-18 14:30:41 +00005090 for (ModuleIterator I = ModuleMgr.begin(), E = ModuleMgr.end(); I != E; ++I) {
5091 ModuleFile &F = *(*I);
5092 unsigned Idx = 0;
5093 DiagStates.clear();
5094 assert(!Diag.DiagStates.empty());
5095 DiagStates.push_back(&Diag.DiagStates.front()); // the command-line one.
5096 while (Idx < F.PragmaDiagMappings.size()) {
5097 SourceLocation Loc = ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]);
5098 unsigned DiagStateID = F.PragmaDiagMappings[Idx++];
5099 if (DiagStateID != 0) {
5100 Diag.DiagStatePoints.push_back(
5101 DiagnosticsEngine::DiagStatePoint(DiagStates[DiagStateID-1],
5102 FullSourceLoc(Loc, SourceMgr)));
5103 continue;
5104 }
5105
5106 assert(DiagStateID == 0);
5107 // A new DiagState was created here.
5108 Diag.DiagStates.push_back(*Diag.GetCurDiagState());
5109 DiagnosticsEngine::DiagState *NewState = &Diag.DiagStates.back();
5110 DiagStates.push_back(NewState);
5111 Diag.DiagStatePoints.push_back(
5112 DiagnosticsEngine::DiagStatePoint(NewState,
5113 FullSourceLoc(Loc, SourceMgr)));
5114 while (1) {
5115 assert(Idx < F.PragmaDiagMappings.size() &&
5116 "Invalid data, didn't find '-1' marking end of diag/map pairs");
5117 if (Idx >= F.PragmaDiagMappings.size()) {
5118 break; // Something is messed up but at least avoid infinite loop in
5119 // release build.
5120 }
5121 unsigned DiagID = F.PragmaDiagMappings[Idx++];
5122 if (DiagID == (unsigned)-1) {
5123 break; // no more diag/map pairs for this location.
5124 }
Alp Tokerc726c362014-06-10 09:31:37 +00005125 diag::Severity Map = (diag::Severity)F.PragmaDiagMappings[Idx++];
5126 DiagnosticMapping Mapping = Diag.makeUserMapping(Map, Loc);
5127 Diag.GetCurDiagState()->setMapping(DiagID, Mapping);
Guy Benyei11169dd2012-12-18 14:30:41 +00005128 }
5129 }
5130 }
5131}
5132
5133/// \brief Get the correct cursor and offset for loading a type.
5134ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) {
5135 GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index);
5136 assert(I != GlobalTypeMap.end() && "Corrupted global type map");
5137 ModuleFile *M = I->second;
5138 return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex]);
5139}
5140
5141/// \brief Read and return the type with the given index..
5142///
5143/// The index is the type ID, shifted and minus the number of predefs. This
5144/// routine actually reads the record corresponding to the type at the given
5145/// location. It is a helper routine for GetType, which deals with reading type
5146/// IDs.
5147QualType ASTReader::readTypeRecord(unsigned Index) {
5148 RecordLocation Loc = TypeCursorForIndex(Index);
Chris Lattner7fb3bef2013-01-20 00:56:42 +00005149 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00005150
5151 // Keep track of where we are in the stream, then jump back there
5152 // after reading this type.
5153 SavedStreamPosition SavedPosition(DeclsCursor);
5154
5155 ReadingKindTracker ReadingKind(Read_Type, *this);
5156
5157 // Note that we are loading a type record.
5158 Deserializing AType(this);
5159
5160 unsigned Idx = 0;
5161 DeclsCursor.JumpToBit(Loc.Offset);
5162 RecordData Record;
5163 unsigned Code = DeclsCursor.ReadCode();
Chris Lattner0e6c9402013-01-20 02:38:54 +00005164 switch ((TypeCode)DeclsCursor.readRecord(Code, Record)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00005165 case TYPE_EXT_QUAL: {
5166 if (Record.size() != 2) {
5167 Error("Incorrect encoding of extended qualifier type");
5168 return QualType();
5169 }
5170 QualType Base = readType(*Loc.F, Record, Idx);
5171 Qualifiers Quals = Qualifiers::fromOpaqueValue(Record[Idx++]);
5172 return Context.getQualifiedType(Base, Quals);
5173 }
5174
5175 case TYPE_COMPLEX: {
5176 if (Record.size() != 1) {
5177 Error("Incorrect encoding of complex type");
5178 return QualType();
5179 }
5180 QualType ElemType = readType(*Loc.F, Record, Idx);
5181 return Context.getComplexType(ElemType);
5182 }
5183
5184 case TYPE_POINTER: {
5185 if (Record.size() != 1) {
5186 Error("Incorrect encoding of pointer type");
5187 return QualType();
5188 }
5189 QualType PointeeType = readType(*Loc.F, Record, Idx);
5190 return Context.getPointerType(PointeeType);
5191 }
5192
Reid Kleckner8a365022013-06-24 17:51:48 +00005193 case TYPE_DECAYED: {
5194 if (Record.size() != 1) {
5195 Error("Incorrect encoding of decayed type");
5196 return QualType();
5197 }
5198 QualType OriginalType = readType(*Loc.F, Record, Idx);
5199 QualType DT = Context.getAdjustedParameterType(OriginalType);
5200 if (!isa<DecayedType>(DT))
5201 Error("Decayed type does not decay");
5202 return DT;
5203 }
5204
Reid Kleckner0503a872013-12-05 01:23:43 +00005205 case TYPE_ADJUSTED: {
5206 if (Record.size() != 2) {
5207 Error("Incorrect encoding of adjusted type");
5208 return QualType();
5209 }
5210 QualType OriginalTy = readType(*Loc.F, Record, Idx);
5211 QualType AdjustedTy = readType(*Loc.F, Record, Idx);
5212 return Context.getAdjustedType(OriginalTy, AdjustedTy);
5213 }
5214
Guy Benyei11169dd2012-12-18 14:30:41 +00005215 case TYPE_BLOCK_POINTER: {
5216 if (Record.size() != 1) {
5217 Error("Incorrect encoding of block pointer type");
5218 return QualType();
5219 }
5220 QualType PointeeType = readType(*Loc.F, Record, Idx);
5221 return Context.getBlockPointerType(PointeeType);
5222 }
5223
5224 case TYPE_LVALUE_REFERENCE: {
5225 if (Record.size() != 2) {
5226 Error("Incorrect encoding of lvalue reference type");
5227 return QualType();
5228 }
5229 QualType PointeeType = readType(*Loc.F, Record, Idx);
5230 return Context.getLValueReferenceType(PointeeType, Record[1]);
5231 }
5232
5233 case TYPE_RVALUE_REFERENCE: {
5234 if (Record.size() != 1) {
5235 Error("Incorrect encoding of rvalue reference type");
5236 return QualType();
5237 }
5238 QualType PointeeType = readType(*Loc.F, Record, Idx);
5239 return Context.getRValueReferenceType(PointeeType);
5240 }
5241
5242 case TYPE_MEMBER_POINTER: {
5243 if (Record.size() != 2) {
5244 Error("Incorrect encoding of member pointer type");
5245 return QualType();
5246 }
5247 QualType PointeeType = readType(*Loc.F, Record, Idx);
5248 QualType ClassType = readType(*Loc.F, Record, Idx);
5249 if (PointeeType.isNull() || ClassType.isNull())
5250 return QualType();
5251
5252 return Context.getMemberPointerType(PointeeType, ClassType.getTypePtr());
5253 }
5254
5255 case TYPE_CONSTANT_ARRAY: {
5256 QualType ElementType = readType(*Loc.F, Record, Idx);
5257 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5258 unsigned IndexTypeQuals = Record[2];
5259 unsigned Idx = 3;
5260 llvm::APInt Size = ReadAPInt(Record, Idx);
5261 return Context.getConstantArrayType(ElementType, Size,
5262 ASM, IndexTypeQuals);
5263 }
5264
5265 case TYPE_INCOMPLETE_ARRAY: {
5266 QualType ElementType = readType(*Loc.F, Record, Idx);
5267 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5268 unsigned IndexTypeQuals = Record[2];
5269 return Context.getIncompleteArrayType(ElementType, ASM, IndexTypeQuals);
5270 }
5271
5272 case TYPE_VARIABLE_ARRAY: {
5273 QualType ElementType = readType(*Loc.F, Record, Idx);
5274 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5275 unsigned IndexTypeQuals = Record[2];
5276 SourceLocation LBLoc = ReadSourceLocation(*Loc.F, Record[3]);
5277 SourceLocation RBLoc = ReadSourceLocation(*Loc.F, Record[4]);
5278 return Context.getVariableArrayType(ElementType, ReadExpr(*Loc.F),
5279 ASM, IndexTypeQuals,
5280 SourceRange(LBLoc, RBLoc));
5281 }
5282
5283 case TYPE_VECTOR: {
5284 if (Record.size() != 3) {
5285 Error("incorrect encoding of vector type in AST file");
5286 return QualType();
5287 }
5288
5289 QualType ElementType = readType(*Loc.F, Record, Idx);
5290 unsigned NumElements = Record[1];
5291 unsigned VecKind = Record[2];
5292 return Context.getVectorType(ElementType, NumElements,
5293 (VectorType::VectorKind)VecKind);
5294 }
5295
5296 case TYPE_EXT_VECTOR: {
5297 if (Record.size() != 3) {
5298 Error("incorrect encoding of extended vector type in AST file");
5299 return QualType();
5300 }
5301
5302 QualType ElementType = readType(*Loc.F, Record, Idx);
5303 unsigned NumElements = Record[1];
5304 return Context.getExtVectorType(ElementType, NumElements);
5305 }
5306
5307 case TYPE_FUNCTION_NO_PROTO: {
5308 if (Record.size() != 6) {
5309 Error("incorrect encoding of no-proto function type");
5310 return QualType();
5311 }
5312 QualType ResultType = readType(*Loc.F, Record, Idx);
5313 FunctionType::ExtInfo Info(Record[1], Record[2], Record[3],
5314 (CallingConv)Record[4], Record[5]);
5315 return Context.getFunctionNoProtoType(ResultType, Info);
5316 }
5317
5318 case TYPE_FUNCTION_PROTO: {
5319 QualType ResultType = readType(*Loc.F, Record, Idx);
5320
5321 FunctionProtoType::ExtProtoInfo EPI;
5322 EPI.ExtInfo = FunctionType::ExtInfo(/*noreturn*/ Record[1],
5323 /*hasregparm*/ Record[2],
5324 /*regparm*/ Record[3],
5325 static_cast<CallingConv>(Record[4]),
5326 /*produces*/ Record[5]);
5327
5328 unsigned Idx = 6;
Guy Benyei11169dd2012-12-18 14:30:41 +00005329
5330 EPI.Variadic = Record[Idx++];
5331 EPI.HasTrailingReturn = Record[Idx++];
5332 EPI.TypeQuals = Record[Idx++];
5333 EPI.RefQualifier = static_cast<RefQualifierKind>(Record[Idx++]);
Richard Smith564417a2014-03-20 21:47:22 +00005334 SmallVector<QualType, 8> ExceptionStorage;
Richard Smith8acb4282014-07-31 21:57:55 +00005335 readExceptionSpec(*Loc.F, ExceptionStorage, EPI.ExceptionSpec, Record, Idx);
Richard Smith01b2cb42014-07-26 06:37:51 +00005336
5337 unsigned NumParams = Record[Idx++];
5338 SmallVector<QualType, 16> ParamTypes;
5339 for (unsigned I = 0; I != NumParams; ++I)
5340 ParamTypes.push_back(readType(*Loc.F, Record, Idx));
5341
Jordan Rose5c382722013-03-08 21:51:21 +00005342 return Context.getFunctionType(ResultType, ParamTypes, EPI);
Guy Benyei11169dd2012-12-18 14:30:41 +00005343 }
5344
5345 case TYPE_UNRESOLVED_USING: {
5346 unsigned Idx = 0;
5347 return Context.getTypeDeclType(
5348 ReadDeclAs<UnresolvedUsingTypenameDecl>(*Loc.F, Record, Idx));
5349 }
5350
5351 case TYPE_TYPEDEF: {
5352 if (Record.size() != 2) {
5353 Error("incorrect encoding of typedef type");
5354 return QualType();
5355 }
5356 unsigned Idx = 0;
5357 TypedefNameDecl *Decl = ReadDeclAs<TypedefNameDecl>(*Loc.F, Record, Idx);
5358 QualType Canonical = readType(*Loc.F, Record, Idx);
5359 if (!Canonical.isNull())
5360 Canonical = Context.getCanonicalType(Canonical);
5361 return Context.getTypedefType(Decl, Canonical);
5362 }
5363
5364 case TYPE_TYPEOF_EXPR:
5365 return Context.getTypeOfExprType(ReadExpr(*Loc.F));
5366
5367 case TYPE_TYPEOF: {
5368 if (Record.size() != 1) {
5369 Error("incorrect encoding of typeof(type) in AST file");
5370 return QualType();
5371 }
5372 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5373 return Context.getTypeOfType(UnderlyingType);
5374 }
5375
5376 case TYPE_DECLTYPE: {
5377 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5378 return Context.getDecltypeType(ReadExpr(*Loc.F), UnderlyingType);
5379 }
5380
5381 case TYPE_UNARY_TRANSFORM: {
5382 QualType BaseType = readType(*Loc.F, Record, Idx);
5383 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5384 UnaryTransformType::UTTKind UKind = (UnaryTransformType::UTTKind)Record[2];
5385 return Context.getUnaryTransformType(BaseType, UnderlyingType, UKind);
5386 }
5387
Richard Smith74aeef52013-04-26 16:15:35 +00005388 case TYPE_AUTO: {
5389 QualType Deduced = readType(*Loc.F, Record, Idx);
5390 bool IsDecltypeAuto = Record[Idx++];
Richard Smith27d807c2013-04-30 13:56:41 +00005391 bool IsDependent = Deduced.isNull() ? Record[Idx++] : false;
Manuel Klimek2fdbea22013-08-22 12:12:24 +00005392 return Context.getAutoType(Deduced, IsDecltypeAuto, IsDependent);
Richard Smith74aeef52013-04-26 16:15:35 +00005393 }
Guy Benyei11169dd2012-12-18 14:30:41 +00005394
5395 case TYPE_RECORD: {
5396 if (Record.size() != 2) {
5397 Error("incorrect encoding of record type");
5398 return QualType();
5399 }
5400 unsigned Idx = 0;
5401 bool IsDependent = Record[Idx++];
5402 RecordDecl *RD = ReadDeclAs<RecordDecl>(*Loc.F, Record, Idx);
5403 RD = cast_or_null<RecordDecl>(RD->getCanonicalDecl());
5404 QualType T = Context.getRecordType(RD);
5405 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5406 return T;
5407 }
5408
5409 case TYPE_ENUM: {
5410 if (Record.size() != 2) {
5411 Error("incorrect encoding of enum type");
5412 return QualType();
5413 }
5414 unsigned Idx = 0;
5415 bool IsDependent = Record[Idx++];
5416 QualType T
5417 = Context.getEnumType(ReadDeclAs<EnumDecl>(*Loc.F, Record, Idx));
5418 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5419 return T;
5420 }
5421
5422 case TYPE_ATTRIBUTED: {
5423 if (Record.size() != 3) {
5424 Error("incorrect encoding of attributed type");
5425 return QualType();
5426 }
5427 QualType modifiedType = readType(*Loc.F, Record, Idx);
5428 QualType equivalentType = readType(*Loc.F, Record, Idx);
5429 AttributedType::Kind kind = static_cast<AttributedType::Kind>(Record[2]);
5430 return Context.getAttributedType(kind, modifiedType, equivalentType);
5431 }
5432
5433 case TYPE_PAREN: {
5434 if (Record.size() != 1) {
5435 Error("incorrect encoding of paren type");
5436 return QualType();
5437 }
5438 QualType InnerType = readType(*Loc.F, Record, Idx);
5439 return Context.getParenType(InnerType);
5440 }
5441
5442 case TYPE_PACK_EXPANSION: {
5443 if (Record.size() != 2) {
5444 Error("incorrect encoding of pack expansion type");
5445 return QualType();
5446 }
5447 QualType Pattern = readType(*Loc.F, Record, Idx);
5448 if (Pattern.isNull())
5449 return QualType();
David Blaikie05785d12013-02-20 22:23:23 +00005450 Optional<unsigned> NumExpansions;
Guy Benyei11169dd2012-12-18 14:30:41 +00005451 if (Record[1])
5452 NumExpansions = Record[1] - 1;
5453 return Context.getPackExpansionType(Pattern, NumExpansions);
5454 }
5455
5456 case TYPE_ELABORATED: {
5457 unsigned Idx = 0;
5458 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5459 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5460 QualType NamedType = readType(*Loc.F, Record, Idx);
5461 return Context.getElaboratedType(Keyword, NNS, NamedType);
5462 }
5463
5464 case TYPE_OBJC_INTERFACE: {
5465 unsigned Idx = 0;
5466 ObjCInterfaceDecl *ItfD
5467 = ReadDeclAs<ObjCInterfaceDecl>(*Loc.F, Record, Idx);
5468 return Context.getObjCInterfaceType(ItfD->getCanonicalDecl());
5469 }
5470
5471 case TYPE_OBJC_OBJECT: {
5472 unsigned Idx = 0;
5473 QualType Base = readType(*Loc.F, Record, Idx);
5474 unsigned NumProtos = Record[Idx++];
5475 SmallVector<ObjCProtocolDecl*, 4> Protos;
5476 for (unsigned I = 0; I != NumProtos; ++I)
5477 Protos.push_back(ReadDeclAs<ObjCProtocolDecl>(*Loc.F, Record, Idx));
5478 return Context.getObjCObjectType(Base, Protos.data(), NumProtos);
5479 }
5480
5481 case TYPE_OBJC_OBJECT_POINTER: {
5482 unsigned Idx = 0;
5483 QualType Pointee = readType(*Loc.F, Record, Idx);
5484 return Context.getObjCObjectPointerType(Pointee);
5485 }
5486
5487 case TYPE_SUBST_TEMPLATE_TYPE_PARM: {
5488 unsigned Idx = 0;
5489 QualType Parm = readType(*Loc.F, Record, Idx);
5490 QualType Replacement = readType(*Loc.F, Record, Idx);
Stephan Tolksdorfe96f8b32014-03-15 10:23:27 +00005491 return Context.getSubstTemplateTypeParmType(
5492 cast<TemplateTypeParmType>(Parm),
5493 Context.getCanonicalType(Replacement));
Guy Benyei11169dd2012-12-18 14:30:41 +00005494 }
5495
5496 case TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK: {
5497 unsigned Idx = 0;
5498 QualType Parm = readType(*Loc.F, Record, Idx);
5499 TemplateArgument ArgPack = ReadTemplateArgument(*Loc.F, Record, Idx);
5500 return Context.getSubstTemplateTypeParmPackType(
5501 cast<TemplateTypeParmType>(Parm),
5502 ArgPack);
5503 }
5504
5505 case TYPE_INJECTED_CLASS_NAME: {
5506 CXXRecordDecl *D = ReadDeclAs<CXXRecordDecl>(*Loc.F, Record, Idx);
5507 QualType TST = readType(*Loc.F, Record, Idx); // probably derivable
5508 // FIXME: ASTContext::getInjectedClassNameType is not currently suitable
5509 // for AST reading, too much interdependencies.
Richard Smith6377f8f2014-10-21 21:15:18 +00005510 const Type *T = nullptr;
5511 for (auto *DI = D; DI; DI = DI->getPreviousDecl()) {
5512 if (const Type *Existing = DI->getTypeForDecl()) {
5513 T = Existing;
5514 break;
5515 }
5516 }
5517 if (!T) {
Richard Smithf17fdbd2014-04-24 02:25:27 +00005518 T = new (Context, TypeAlignment) InjectedClassNameType(D, TST);
Richard Smith6377f8f2014-10-21 21:15:18 +00005519 for (auto *DI = D; DI; DI = DI->getPreviousDecl())
5520 DI->setTypeForDecl(T);
5521 }
Richard Smithf17fdbd2014-04-24 02:25:27 +00005522 return QualType(T, 0);
Guy Benyei11169dd2012-12-18 14:30:41 +00005523 }
5524
5525 case TYPE_TEMPLATE_TYPE_PARM: {
5526 unsigned Idx = 0;
5527 unsigned Depth = Record[Idx++];
5528 unsigned Index = Record[Idx++];
5529 bool Pack = Record[Idx++];
5530 TemplateTypeParmDecl *D
5531 = ReadDeclAs<TemplateTypeParmDecl>(*Loc.F, Record, Idx);
5532 return Context.getTemplateTypeParmType(Depth, Index, Pack, D);
5533 }
5534
5535 case TYPE_DEPENDENT_NAME: {
5536 unsigned Idx = 0;
5537 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5538 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5539 const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx);
5540 QualType Canon = readType(*Loc.F, Record, Idx);
5541 if (!Canon.isNull())
5542 Canon = Context.getCanonicalType(Canon);
5543 return Context.getDependentNameType(Keyword, NNS, Name, Canon);
5544 }
5545
5546 case TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION: {
5547 unsigned Idx = 0;
5548 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5549 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5550 const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx);
5551 unsigned NumArgs = Record[Idx++];
5552 SmallVector<TemplateArgument, 8> Args;
5553 Args.reserve(NumArgs);
5554 while (NumArgs--)
5555 Args.push_back(ReadTemplateArgument(*Loc.F, Record, Idx));
5556 return Context.getDependentTemplateSpecializationType(Keyword, NNS, Name,
5557 Args.size(), Args.data());
5558 }
5559
5560 case TYPE_DEPENDENT_SIZED_ARRAY: {
5561 unsigned Idx = 0;
5562
5563 // ArrayType
5564 QualType ElementType = readType(*Loc.F, Record, Idx);
5565 ArrayType::ArraySizeModifier ASM
5566 = (ArrayType::ArraySizeModifier)Record[Idx++];
5567 unsigned IndexTypeQuals = Record[Idx++];
5568
5569 // DependentSizedArrayType
5570 Expr *NumElts = ReadExpr(*Loc.F);
5571 SourceRange Brackets = ReadSourceRange(*Loc.F, Record, Idx);
5572
5573 return Context.getDependentSizedArrayType(ElementType, NumElts, ASM,
5574 IndexTypeQuals, Brackets);
5575 }
5576
5577 case TYPE_TEMPLATE_SPECIALIZATION: {
5578 unsigned Idx = 0;
5579 bool IsDependent = Record[Idx++];
5580 TemplateName Name = ReadTemplateName(*Loc.F, Record, Idx);
5581 SmallVector<TemplateArgument, 8> Args;
5582 ReadTemplateArgumentList(Args, *Loc.F, Record, Idx);
5583 QualType Underlying = readType(*Loc.F, Record, Idx);
5584 QualType T;
5585 if (Underlying.isNull())
5586 T = Context.getCanonicalTemplateSpecializationType(Name, Args.data(),
5587 Args.size());
5588 else
5589 T = Context.getTemplateSpecializationType(Name, Args.data(),
5590 Args.size(), Underlying);
5591 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5592 return T;
5593 }
5594
5595 case TYPE_ATOMIC: {
5596 if (Record.size() != 1) {
5597 Error("Incorrect encoding of atomic type");
5598 return QualType();
5599 }
5600 QualType ValueType = readType(*Loc.F, Record, Idx);
5601 return Context.getAtomicType(ValueType);
5602 }
5603 }
5604 llvm_unreachable("Invalid TypeCode!");
5605}
5606
Richard Smith564417a2014-03-20 21:47:22 +00005607void ASTReader::readExceptionSpec(ModuleFile &ModuleFile,
5608 SmallVectorImpl<QualType> &Exceptions,
Richard Smith8acb4282014-07-31 21:57:55 +00005609 FunctionProtoType::ExceptionSpecInfo &ESI,
Richard Smith564417a2014-03-20 21:47:22 +00005610 const RecordData &Record, unsigned &Idx) {
5611 ExceptionSpecificationType EST =
5612 static_cast<ExceptionSpecificationType>(Record[Idx++]);
Richard Smith8acb4282014-07-31 21:57:55 +00005613 ESI.Type = EST;
Richard Smith564417a2014-03-20 21:47:22 +00005614 if (EST == EST_Dynamic) {
Richard Smith8acb4282014-07-31 21:57:55 +00005615 for (unsigned I = 0, N = Record[Idx++]; I != N; ++I)
Richard Smith564417a2014-03-20 21:47:22 +00005616 Exceptions.push_back(readType(ModuleFile, Record, Idx));
Richard Smith8acb4282014-07-31 21:57:55 +00005617 ESI.Exceptions = Exceptions;
Richard Smith564417a2014-03-20 21:47:22 +00005618 } else if (EST == EST_ComputedNoexcept) {
Richard Smith8acb4282014-07-31 21:57:55 +00005619 ESI.NoexceptExpr = ReadExpr(ModuleFile);
Richard Smith564417a2014-03-20 21:47:22 +00005620 } else if (EST == EST_Uninstantiated) {
Richard Smith8acb4282014-07-31 21:57:55 +00005621 ESI.SourceDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
5622 ESI.SourceTemplate = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
Richard Smith564417a2014-03-20 21:47:22 +00005623 } else if (EST == EST_Unevaluated) {
Richard Smith8acb4282014-07-31 21:57:55 +00005624 ESI.SourceDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
Richard Smith564417a2014-03-20 21:47:22 +00005625 }
5626}
5627
Guy Benyei11169dd2012-12-18 14:30:41 +00005628class clang::TypeLocReader : public TypeLocVisitor<TypeLocReader> {
5629 ASTReader &Reader;
5630 ModuleFile &F;
5631 const ASTReader::RecordData &Record;
5632 unsigned &Idx;
5633
5634 SourceLocation ReadSourceLocation(const ASTReader::RecordData &R,
5635 unsigned &I) {
5636 return Reader.ReadSourceLocation(F, R, I);
5637 }
5638
5639 template<typename T>
5640 T *ReadDeclAs(const ASTReader::RecordData &Record, unsigned &Idx) {
5641 return Reader.ReadDeclAs<T>(F, Record, Idx);
5642 }
5643
5644public:
5645 TypeLocReader(ASTReader &Reader, ModuleFile &F,
5646 const ASTReader::RecordData &Record, unsigned &Idx)
5647 : Reader(Reader), F(F), Record(Record), Idx(Idx)
5648 { }
5649
5650 // We want compile-time assurance that we've enumerated all of
5651 // these, so unfortunately we have to declare them first, then
5652 // define them out-of-line.
5653#define ABSTRACT_TYPELOC(CLASS, PARENT)
5654#define TYPELOC(CLASS, PARENT) \
5655 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
5656#include "clang/AST/TypeLocNodes.def"
5657
5658 void VisitFunctionTypeLoc(FunctionTypeLoc);
5659 void VisitArrayTypeLoc(ArrayTypeLoc);
5660};
5661
5662void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
5663 // nothing to do
5664}
5665void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
5666 TL.setBuiltinLoc(ReadSourceLocation(Record, Idx));
5667 if (TL.needsExtraLocalData()) {
5668 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Record[Idx++]));
5669 TL.setWrittenSignSpec(static_cast<DeclSpec::TSS>(Record[Idx++]));
5670 TL.setWrittenWidthSpec(static_cast<DeclSpec::TSW>(Record[Idx++]));
5671 TL.setModeAttr(Record[Idx++]);
5672 }
5673}
5674void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
5675 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5676}
5677void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
5678 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5679}
Reid Kleckner8a365022013-06-24 17:51:48 +00005680void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
5681 // nothing to do
5682}
Reid Kleckner0503a872013-12-05 01:23:43 +00005683void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
5684 // nothing to do
5685}
Guy Benyei11169dd2012-12-18 14:30:41 +00005686void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
5687 TL.setCaretLoc(ReadSourceLocation(Record, Idx));
5688}
5689void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
5690 TL.setAmpLoc(ReadSourceLocation(Record, Idx));
5691}
5692void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
5693 TL.setAmpAmpLoc(ReadSourceLocation(Record, Idx));
5694}
5695void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
5696 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5697 TL.setClassTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5698}
5699void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) {
5700 TL.setLBracketLoc(ReadSourceLocation(Record, Idx));
5701 TL.setRBracketLoc(ReadSourceLocation(Record, Idx));
5702 if (Record[Idx++])
5703 TL.setSizeExpr(Reader.ReadExpr(F));
5704 else
Craig Toppera13603a2014-05-22 05:54:18 +00005705 TL.setSizeExpr(nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00005706}
5707void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) {
5708 VisitArrayTypeLoc(TL);
5709}
5710void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) {
5711 VisitArrayTypeLoc(TL);
5712}
5713void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
5714 VisitArrayTypeLoc(TL);
5715}
5716void TypeLocReader::VisitDependentSizedArrayTypeLoc(
5717 DependentSizedArrayTypeLoc TL) {
5718 VisitArrayTypeLoc(TL);
5719}
5720void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
5721 DependentSizedExtVectorTypeLoc TL) {
5722 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5723}
5724void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
5725 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5726}
5727void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
5728 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5729}
5730void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) {
5731 TL.setLocalRangeBegin(ReadSourceLocation(Record, Idx));
5732 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5733 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5734 TL.setLocalRangeEnd(ReadSourceLocation(Record, Idx));
Alp Tokerb3fd5cf2014-01-21 00:32:38 +00005735 for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) {
5736 TL.setParam(i, ReadDeclAs<ParmVarDecl>(Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00005737 }
5738}
5739void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) {
5740 VisitFunctionTypeLoc(TL);
5741}
5742void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) {
5743 VisitFunctionTypeLoc(TL);
5744}
5745void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
5746 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5747}
5748void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
5749 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5750}
5751void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
5752 TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
5753 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5754 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5755}
5756void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
5757 TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
5758 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5759 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5760 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5761}
5762void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
5763 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5764}
5765void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
5766 TL.setKWLoc(ReadSourceLocation(Record, Idx));
5767 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5768 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5769 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5770}
5771void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) {
5772 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5773}
5774void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) {
5775 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5776}
5777void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) {
5778 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5779}
5780void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
5781 TL.setAttrNameLoc(ReadSourceLocation(Record, Idx));
5782 if (TL.hasAttrOperand()) {
5783 SourceRange range;
5784 range.setBegin(ReadSourceLocation(Record, Idx));
5785 range.setEnd(ReadSourceLocation(Record, Idx));
5786 TL.setAttrOperandParensRange(range);
5787 }
5788 if (TL.hasAttrExprOperand()) {
5789 if (Record[Idx++])
5790 TL.setAttrExprOperand(Reader.ReadExpr(F));
5791 else
Craig Toppera13603a2014-05-22 05:54:18 +00005792 TL.setAttrExprOperand(nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00005793 } else if (TL.hasAttrEnumOperand())
5794 TL.setAttrEnumOperandLoc(ReadSourceLocation(Record, Idx));
5795}
5796void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
5797 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5798}
5799void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
5800 SubstTemplateTypeParmTypeLoc TL) {
5801 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5802}
5803void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
5804 SubstTemplateTypeParmPackTypeLoc TL) {
5805 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5806}
5807void TypeLocReader::VisitTemplateSpecializationTypeLoc(
5808 TemplateSpecializationTypeLoc TL) {
5809 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx));
5810 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx));
5811 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5812 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5813 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i)
5814 TL.setArgLocInfo(i,
5815 Reader.GetTemplateArgumentLocInfo(F,
5816 TL.getTypePtr()->getArg(i).getKind(),
5817 Record, Idx));
5818}
5819void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
5820 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5821 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5822}
5823void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
5824 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5825 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5826}
5827void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
5828 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5829}
5830void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
5831 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5832 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5833 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5834}
5835void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc(
5836 DependentTemplateSpecializationTypeLoc TL) {
5837 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5838 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5839 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx));
5840 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx));
5841 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5842 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5843 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
5844 TL.setArgLocInfo(I,
5845 Reader.GetTemplateArgumentLocInfo(F,
5846 TL.getTypePtr()->getArg(I).getKind(),
5847 Record, Idx));
5848}
5849void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
5850 TL.setEllipsisLoc(ReadSourceLocation(Record, Idx));
5851}
5852void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
5853 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5854}
5855void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
5856 TL.setHasBaseTypeAsWritten(Record[Idx++]);
5857 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5858 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5859 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
5860 TL.setProtocolLoc(i, ReadSourceLocation(Record, Idx));
5861}
5862void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
5863 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5864}
5865void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
5866 TL.setKWLoc(ReadSourceLocation(Record, Idx));
5867 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5868 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5869}
5870
5871TypeSourceInfo *ASTReader::GetTypeSourceInfo(ModuleFile &F,
5872 const RecordData &Record,
5873 unsigned &Idx) {
5874 QualType InfoTy = readType(F, Record, Idx);
5875 if (InfoTy.isNull())
Craig Toppera13603a2014-05-22 05:54:18 +00005876 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00005877
5878 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy);
5879 TypeLocReader TLR(*this, F, Record, Idx);
5880 for (TypeLoc TL = TInfo->getTypeLoc(); !TL.isNull(); TL = TL.getNextTypeLoc())
5881 TLR.Visit(TL);
5882 return TInfo;
5883}
5884
5885QualType ASTReader::GetType(TypeID ID) {
5886 unsigned FastQuals = ID & Qualifiers::FastMask;
5887 unsigned Index = ID >> Qualifiers::FastWidth;
5888
5889 if (Index < NUM_PREDEF_TYPE_IDS) {
5890 QualType T;
5891 switch ((PredefinedTypeIDs)Index) {
5892 case PREDEF_TYPE_NULL_ID: return QualType();
5893 case PREDEF_TYPE_VOID_ID: T = Context.VoidTy; break;
5894 case PREDEF_TYPE_BOOL_ID: T = Context.BoolTy; break;
5895
5896 case PREDEF_TYPE_CHAR_U_ID:
5897 case PREDEF_TYPE_CHAR_S_ID:
5898 // FIXME: Check that the signedness of CharTy is correct!
5899 T = Context.CharTy;
5900 break;
5901
5902 case PREDEF_TYPE_UCHAR_ID: T = Context.UnsignedCharTy; break;
5903 case PREDEF_TYPE_USHORT_ID: T = Context.UnsignedShortTy; break;
5904 case PREDEF_TYPE_UINT_ID: T = Context.UnsignedIntTy; break;
5905 case PREDEF_TYPE_ULONG_ID: T = Context.UnsignedLongTy; break;
5906 case PREDEF_TYPE_ULONGLONG_ID: T = Context.UnsignedLongLongTy; break;
5907 case PREDEF_TYPE_UINT128_ID: T = Context.UnsignedInt128Ty; break;
5908 case PREDEF_TYPE_SCHAR_ID: T = Context.SignedCharTy; break;
5909 case PREDEF_TYPE_WCHAR_ID: T = Context.WCharTy; break;
5910 case PREDEF_TYPE_SHORT_ID: T = Context.ShortTy; break;
5911 case PREDEF_TYPE_INT_ID: T = Context.IntTy; break;
5912 case PREDEF_TYPE_LONG_ID: T = Context.LongTy; break;
5913 case PREDEF_TYPE_LONGLONG_ID: T = Context.LongLongTy; break;
5914 case PREDEF_TYPE_INT128_ID: T = Context.Int128Ty; break;
5915 case PREDEF_TYPE_HALF_ID: T = Context.HalfTy; break;
5916 case PREDEF_TYPE_FLOAT_ID: T = Context.FloatTy; break;
5917 case PREDEF_TYPE_DOUBLE_ID: T = Context.DoubleTy; break;
5918 case PREDEF_TYPE_LONGDOUBLE_ID: T = Context.LongDoubleTy; break;
5919 case PREDEF_TYPE_OVERLOAD_ID: T = Context.OverloadTy; break;
5920 case PREDEF_TYPE_BOUND_MEMBER: T = Context.BoundMemberTy; break;
5921 case PREDEF_TYPE_PSEUDO_OBJECT: T = Context.PseudoObjectTy; break;
5922 case PREDEF_TYPE_DEPENDENT_ID: T = Context.DependentTy; break;
5923 case PREDEF_TYPE_UNKNOWN_ANY: T = Context.UnknownAnyTy; break;
5924 case PREDEF_TYPE_NULLPTR_ID: T = Context.NullPtrTy; break;
5925 case PREDEF_TYPE_CHAR16_ID: T = Context.Char16Ty; break;
5926 case PREDEF_TYPE_CHAR32_ID: T = Context.Char32Ty; break;
5927 case PREDEF_TYPE_OBJC_ID: T = Context.ObjCBuiltinIdTy; break;
5928 case PREDEF_TYPE_OBJC_CLASS: T = Context.ObjCBuiltinClassTy; break;
5929 case PREDEF_TYPE_OBJC_SEL: T = Context.ObjCBuiltinSelTy; break;
Guy Benyeid8a08ea2012-12-18 14:38:23 +00005930 case PREDEF_TYPE_IMAGE1D_ID: T = Context.OCLImage1dTy; break;
5931 case PREDEF_TYPE_IMAGE1D_ARR_ID: T = Context.OCLImage1dArrayTy; break;
5932 case PREDEF_TYPE_IMAGE1D_BUFF_ID: T = Context.OCLImage1dBufferTy; break;
5933 case PREDEF_TYPE_IMAGE2D_ID: T = Context.OCLImage2dTy; break;
5934 case PREDEF_TYPE_IMAGE2D_ARR_ID: T = Context.OCLImage2dArrayTy; break;
5935 case PREDEF_TYPE_IMAGE3D_ID: T = Context.OCLImage3dTy; break;
Guy Benyei61054192013-02-07 10:55:47 +00005936 case PREDEF_TYPE_SAMPLER_ID: T = Context.OCLSamplerTy; break;
Guy Benyei1b4fb3e2013-01-20 12:31:11 +00005937 case PREDEF_TYPE_EVENT_ID: T = Context.OCLEventTy; break;
Guy Benyei11169dd2012-12-18 14:30:41 +00005938 case PREDEF_TYPE_AUTO_DEDUCT: T = Context.getAutoDeductType(); break;
5939
5940 case PREDEF_TYPE_AUTO_RREF_DEDUCT:
5941 T = Context.getAutoRRefDeductType();
5942 break;
5943
5944 case PREDEF_TYPE_ARC_UNBRIDGED_CAST:
5945 T = Context.ARCUnbridgedCastTy;
5946 break;
5947
5948 case PREDEF_TYPE_VA_LIST_TAG:
5949 T = Context.getVaListTagType();
5950 break;
5951
5952 case PREDEF_TYPE_BUILTIN_FN:
5953 T = Context.BuiltinFnTy;
5954 break;
5955 }
5956
5957 assert(!T.isNull() && "Unknown predefined type");
5958 return T.withFastQualifiers(FastQuals);
5959 }
5960
5961 Index -= NUM_PREDEF_TYPE_IDS;
5962 assert(Index < TypesLoaded.size() && "Type index out-of-range");
5963 if (TypesLoaded[Index].isNull()) {
5964 TypesLoaded[Index] = readTypeRecord(Index);
5965 if (TypesLoaded[Index].isNull())
5966 return QualType();
5967
5968 TypesLoaded[Index]->setFromAST();
5969 if (DeserializationListener)
5970 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID),
5971 TypesLoaded[Index]);
5972 }
5973
5974 return TypesLoaded[Index].withFastQualifiers(FastQuals);
5975}
5976
5977QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) {
5978 return GetType(getGlobalTypeID(F, LocalID));
5979}
5980
5981serialization::TypeID
5982ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const {
5983 unsigned FastQuals = LocalID & Qualifiers::FastMask;
5984 unsigned LocalIndex = LocalID >> Qualifiers::FastWidth;
5985
5986 if (LocalIndex < NUM_PREDEF_TYPE_IDS)
5987 return LocalID;
5988
5989 ContinuousRangeMap<uint32_t, int, 2>::iterator I
5990 = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS);
5991 assert(I != F.TypeRemap.end() && "Invalid index into type index remap");
5992
5993 unsigned GlobalIndex = LocalIndex + I->second;
5994 return (GlobalIndex << Qualifiers::FastWidth) | FastQuals;
5995}
5996
5997TemplateArgumentLocInfo
5998ASTReader::GetTemplateArgumentLocInfo(ModuleFile &F,
5999 TemplateArgument::ArgKind Kind,
6000 const RecordData &Record,
6001 unsigned &Index) {
6002 switch (Kind) {
6003 case TemplateArgument::Expression:
6004 return ReadExpr(F);
6005 case TemplateArgument::Type:
6006 return GetTypeSourceInfo(F, Record, Index);
6007 case TemplateArgument::Template: {
6008 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
6009 Index);
6010 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
6011 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
6012 SourceLocation());
6013 }
6014 case TemplateArgument::TemplateExpansion: {
6015 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
6016 Index);
6017 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
6018 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Index);
6019 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
6020 EllipsisLoc);
6021 }
6022 case TemplateArgument::Null:
6023 case TemplateArgument::Integral:
6024 case TemplateArgument::Declaration:
6025 case TemplateArgument::NullPtr:
6026 case TemplateArgument::Pack:
6027 // FIXME: Is this right?
6028 return TemplateArgumentLocInfo();
6029 }
6030 llvm_unreachable("unexpected template argument loc");
6031}
6032
6033TemplateArgumentLoc
6034ASTReader::ReadTemplateArgumentLoc(ModuleFile &F,
6035 const RecordData &Record, unsigned &Index) {
6036 TemplateArgument Arg = ReadTemplateArgument(F, Record, Index);
6037
6038 if (Arg.getKind() == TemplateArgument::Expression) {
6039 if (Record[Index++]) // bool InfoHasSameExpr.
6040 return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr()));
6041 }
6042 return TemplateArgumentLoc(Arg, GetTemplateArgumentLocInfo(F, Arg.getKind(),
6043 Record, Index));
6044}
6045
Enea Zaffanella6dbe1872013-08-10 07:24:53 +00006046const ASTTemplateArgumentListInfo*
6047ASTReader::ReadASTTemplateArgumentListInfo(ModuleFile &F,
6048 const RecordData &Record,
6049 unsigned &Index) {
6050 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Index);
6051 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Index);
6052 unsigned NumArgsAsWritten = Record[Index++];
6053 TemplateArgumentListInfo TemplArgsInfo(LAngleLoc, RAngleLoc);
6054 for (unsigned i = 0; i != NumArgsAsWritten; ++i)
6055 TemplArgsInfo.addArgument(ReadTemplateArgumentLoc(F, Record, Index));
6056 return ASTTemplateArgumentListInfo::Create(getContext(), TemplArgsInfo);
6057}
6058
Guy Benyei11169dd2012-12-18 14:30:41 +00006059Decl *ASTReader::GetExternalDecl(uint32_t ID) {
6060 return GetDecl(ID);
6061}
6062
Richard Smith053f6c62014-05-16 23:01:30 +00006063void ASTReader::CompleteRedeclChain(const Decl *D) {
Richard Smith851072e2014-05-19 20:59:20 +00006064 if (NumCurrentElementsDeserializing) {
6065 // We arrange to not care about the complete redeclaration chain while we're
6066 // deserializing. Just remember that the AST has marked this one as complete
6067 // but that it's not actually complete yet, so we know we still need to
6068 // complete it later.
6069 PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D));
6070 return;
6071 }
6072
Richard Smith053f6c62014-05-16 23:01:30 +00006073 const DeclContext *DC = D->getDeclContext()->getRedeclContext();
6074
Richard Smith053f6c62014-05-16 23:01:30 +00006075 // If this is a named declaration, complete it by looking it up
6076 // within its context.
6077 //
Richard Smith01bdb7a2014-08-28 05:44:07 +00006078 // FIXME: Merging a function definition should merge
Richard Smith053f6c62014-05-16 23:01:30 +00006079 // all mergeable entities within it.
6080 if (isa<TranslationUnitDecl>(DC) || isa<NamespaceDecl>(DC) ||
6081 isa<CXXRecordDecl>(DC) || isa<EnumDecl>(DC)) {
6082 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) {
6083 auto *II = Name.getAsIdentifierInfo();
6084 if (isa<TranslationUnitDecl>(DC) && II) {
6085 // Outside of C++, we don't have a lookup table for the TU, so update
6086 // the identifier instead. In C++, either way should work fine.
6087 if (II->isOutOfDate())
6088 updateOutOfDateIdentifier(*II);
6089 } else
6090 DC->lookup(Name);
Richard Smith01bdb7a2014-08-28 05:44:07 +00006091 } else if (needsAnonymousDeclarationNumber(cast<NamedDecl>(D))) {
6092 // FIXME: It'd be nice to do something a bit more targeted here.
6093 D->getDeclContext()->decls_begin();
Richard Smith053f6c62014-05-16 23:01:30 +00006094 }
6095 }
6096}
6097
Richard Smithcd45dbc2014-04-19 03:48:30 +00006098uint64_t ASTReader::readCXXBaseSpecifiers(ModuleFile &M,
6099 const RecordData &Record,
6100 unsigned &Idx) {
6101 if (Idx >= Record.size() || Record[Idx] > M.LocalNumCXXBaseSpecifiers) {
6102 Error("malformed AST file: missing C++ base specifier");
Guy Benyei11169dd2012-12-18 14:30:41 +00006103 return 0;
Richard Smithcd45dbc2014-04-19 03:48:30 +00006104 }
6105
Guy Benyei11169dd2012-12-18 14:30:41 +00006106 unsigned LocalID = Record[Idx++];
6107 return getGlobalBitOffset(M, M.CXXBaseSpecifiersOffsets[LocalID - 1]);
6108}
6109
6110CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) {
6111 RecordLocation Loc = getLocalBitOffset(Offset);
Chris Lattner7fb3bef2013-01-20 00:56:42 +00006112 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00006113 SavedStreamPosition SavedPosition(Cursor);
6114 Cursor.JumpToBit(Loc.Offset);
6115 ReadingKindTracker ReadingKind(Read_Decl, *this);
6116 RecordData Record;
6117 unsigned Code = Cursor.ReadCode();
Chris Lattner0e6c9402013-01-20 02:38:54 +00006118 unsigned RecCode = Cursor.readRecord(Code, Record);
Guy Benyei11169dd2012-12-18 14:30:41 +00006119 if (RecCode != DECL_CXX_BASE_SPECIFIERS) {
Richard Smithcd45dbc2014-04-19 03:48:30 +00006120 Error("malformed AST file: missing C++ base specifiers");
Craig Toppera13603a2014-05-22 05:54:18 +00006121 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00006122 }
6123
6124 unsigned Idx = 0;
6125 unsigned NumBases = Record[Idx++];
6126 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases);
6127 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases];
6128 for (unsigned I = 0; I != NumBases; ++I)
6129 Bases[I] = ReadCXXBaseSpecifier(*Loc.F, Record, Idx);
6130 return Bases;
6131}
6132
6133serialization::DeclID
6134ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const {
6135 if (LocalID < NUM_PREDEF_DECL_IDS)
6136 return LocalID;
6137
6138 ContinuousRangeMap<uint32_t, int, 2>::iterator I
6139 = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS);
6140 assert(I != F.DeclRemap.end() && "Invalid index into decl index remap");
6141
6142 return LocalID + I->second;
6143}
6144
6145bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID,
6146 ModuleFile &M) const {
6147 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(ID);
6148 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6149 return &M == I->second;
6150}
6151
Douglas Gregor9f782892013-01-21 15:25:38 +00006152ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) {
Guy Benyei11169dd2012-12-18 14:30:41 +00006153 if (!D->isFromASTFile())
Craig Toppera13603a2014-05-22 05:54:18 +00006154 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00006155 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID());
6156 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6157 return I->second;
6158}
6159
6160SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) {
6161 if (ID < NUM_PREDEF_DECL_IDS)
6162 return SourceLocation();
Richard Smithcd45dbc2014-04-19 03:48:30 +00006163
Guy Benyei11169dd2012-12-18 14:30:41 +00006164 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6165
6166 if (Index > DeclsLoaded.size()) {
6167 Error("declaration ID out-of-range for AST file");
6168 return SourceLocation();
6169 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00006170
Guy Benyei11169dd2012-12-18 14:30:41 +00006171 if (Decl *D = DeclsLoaded[Index])
6172 return D->getLocation();
6173
6174 unsigned RawLocation = 0;
6175 RecordLocation Rec = DeclCursorForID(ID, RawLocation);
6176 return ReadSourceLocation(*Rec.F, RawLocation);
6177}
6178
Richard Smithcd45dbc2014-04-19 03:48:30 +00006179Decl *ASTReader::GetExistingDecl(DeclID ID) {
6180 if (ID < NUM_PREDEF_DECL_IDS) {
Guy Benyei11169dd2012-12-18 14:30:41 +00006181 switch ((PredefinedDeclIDs)ID) {
6182 case PREDEF_DECL_NULL_ID:
Craig Toppera13603a2014-05-22 05:54:18 +00006183 return nullptr;
Richard Smithcd45dbc2014-04-19 03:48:30 +00006184
Guy Benyei11169dd2012-12-18 14:30:41 +00006185 case PREDEF_DECL_TRANSLATION_UNIT_ID:
6186 return Context.getTranslationUnitDecl();
Richard Smithcd45dbc2014-04-19 03:48:30 +00006187
Guy Benyei11169dd2012-12-18 14:30:41 +00006188 case PREDEF_DECL_OBJC_ID_ID:
6189 return Context.getObjCIdDecl();
6190
6191 case PREDEF_DECL_OBJC_SEL_ID:
6192 return Context.getObjCSelDecl();
6193
6194 case PREDEF_DECL_OBJC_CLASS_ID:
6195 return Context.getObjCClassDecl();
Richard Smithcd45dbc2014-04-19 03:48:30 +00006196
Guy Benyei11169dd2012-12-18 14:30:41 +00006197 case PREDEF_DECL_OBJC_PROTOCOL_ID:
6198 return Context.getObjCProtocolDecl();
Richard Smithcd45dbc2014-04-19 03:48:30 +00006199
Guy Benyei11169dd2012-12-18 14:30:41 +00006200 case PREDEF_DECL_INT_128_ID:
6201 return Context.getInt128Decl();
6202
6203 case PREDEF_DECL_UNSIGNED_INT_128_ID:
6204 return Context.getUInt128Decl();
Richard Smithcd45dbc2014-04-19 03:48:30 +00006205
Guy Benyei11169dd2012-12-18 14:30:41 +00006206 case PREDEF_DECL_OBJC_INSTANCETYPE_ID:
6207 return Context.getObjCInstanceTypeDecl();
6208
6209 case PREDEF_DECL_BUILTIN_VA_LIST_ID:
6210 return Context.getBuiltinVaListDecl();
6211 }
6212 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00006213
Guy Benyei11169dd2012-12-18 14:30:41 +00006214 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6215
6216 if (Index >= DeclsLoaded.size()) {
6217 assert(0 && "declaration ID out-of-range for AST file");
6218 Error("declaration ID out-of-range for AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00006219 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00006220 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00006221
6222 return DeclsLoaded[Index];
6223}
6224
6225Decl *ASTReader::GetDecl(DeclID ID) {
6226 if (ID < NUM_PREDEF_DECL_IDS)
6227 return GetExistingDecl(ID);
6228
6229 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6230
6231 if (Index >= DeclsLoaded.size()) {
6232 assert(0 && "declaration ID out-of-range for AST file");
6233 Error("declaration ID out-of-range for AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00006234 return nullptr;
Richard Smithcd45dbc2014-04-19 03:48:30 +00006235 }
6236
Guy Benyei11169dd2012-12-18 14:30:41 +00006237 if (!DeclsLoaded[Index]) {
6238 ReadDeclRecord(ID);
6239 if (DeserializationListener)
6240 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
6241 }
6242
6243 return DeclsLoaded[Index];
6244}
6245
6246DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M,
6247 DeclID GlobalID) {
6248 if (GlobalID < NUM_PREDEF_DECL_IDS)
6249 return GlobalID;
6250
6251 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID);
6252 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6253 ModuleFile *Owner = I->second;
6254
6255 llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos
6256 = M.GlobalToLocalDeclIDs.find(Owner);
6257 if (Pos == M.GlobalToLocalDeclIDs.end())
6258 return 0;
6259
6260 return GlobalID - Owner->BaseDeclID + Pos->second;
6261}
6262
6263serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F,
6264 const RecordData &Record,
6265 unsigned &Idx) {
6266 if (Idx >= Record.size()) {
6267 Error("Corrupted AST file");
6268 return 0;
6269 }
6270
6271 return getGlobalDeclID(F, Record[Idx++]);
6272}
6273
6274/// \brief Resolve the offset of a statement into a statement.
6275///
6276/// This operation will read a new statement from the external
6277/// source each time it is called, and is meant to be used via a
6278/// LazyOffsetPtr (which is used by Decls for the body of functions, etc).
6279Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) {
6280 // Switch case IDs are per Decl.
6281 ClearSwitchCaseIDs();
6282
6283 // Offset here is a global offset across the entire chain.
6284 RecordLocation Loc = getLocalBitOffset(Offset);
6285 Loc.F->DeclsCursor.JumpToBit(Loc.Offset);
6286 return ReadStmtFromStream(*Loc.F);
6287}
6288
6289namespace {
6290 class FindExternalLexicalDeclsVisitor {
6291 ASTReader &Reader;
6292 const DeclContext *DC;
6293 bool (*isKindWeWant)(Decl::Kind);
6294
6295 SmallVectorImpl<Decl*> &Decls;
6296 bool PredefsVisited[NUM_PREDEF_DECL_IDS];
6297
6298 public:
6299 FindExternalLexicalDeclsVisitor(ASTReader &Reader, const DeclContext *DC,
6300 bool (*isKindWeWant)(Decl::Kind),
6301 SmallVectorImpl<Decl*> &Decls)
6302 : Reader(Reader), DC(DC), isKindWeWant(isKindWeWant), Decls(Decls)
6303 {
6304 for (unsigned I = 0; I != NUM_PREDEF_DECL_IDS; ++I)
6305 PredefsVisited[I] = false;
6306 }
6307
6308 static bool visit(ModuleFile &M, bool Preorder, void *UserData) {
6309 if (Preorder)
6310 return false;
6311
6312 FindExternalLexicalDeclsVisitor *This
6313 = static_cast<FindExternalLexicalDeclsVisitor *>(UserData);
6314
6315 ModuleFile::DeclContextInfosMap::iterator Info
6316 = M.DeclContextInfos.find(This->DC);
6317 if (Info == M.DeclContextInfos.end() || !Info->second.LexicalDecls)
6318 return false;
6319
6320 // Load all of the declaration IDs
6321 for (const KindDeclIDPair *ID = Info->second.LexicalDecls,
6322 *IDE = ID + Info->second.NumLexicalDecls;
6323 ID != IDE; ++ID) {
6324 if (This->isKindWeWant && !This->isKindWeWant((Decl::Kind)ID->first))
6325 continue;
6326
6327 // Don't add predefined declarations to the lexical context more
6328 // than once.
6329 if (ID->second < NUM_PREDEF_DECL_IDS) {
6330 if (This->PredefsVisited[ID->second])
6331 continue;
6332
6333 This->PredefsVisited[ID->second] = true;
6334 }
6335
6336 if (Decl *D = This->Reader.GetLocalDecl(M, ID->second)) {
6337 if (!This->DC->isDeclInLexicalTraversal(D))
6338 This->Decls.push_back(D);
6339 }
6340 }
6341
6342 return false;
6343 }
6344 };
6345}
6346
6347ExternalLoadResult ASTReader::FindExternalLexicalDecls(const DeclContext *DC,
6348 bool (*isKindWeWant)(Decl::Kind),
6349 SmallVectorImpl<Decl*> &Decls) {
6350 // There might be lexical decls in multiple modules, for the TU at
6351 // least. Walk all of the modules in the order they were loaded.
6352 FindExternalLexicalDeclsVisitor Visitor(*this, DC, isKindWeWant, Decls);
6353 ModuleMgr.visitDepthFirst(&FindExternalLexicalDeclsVisitor::visit, &Visitor);
6354 ++NumLexicalDeclContextsRead;
6355 return ELR_Success;
6356}
6357
6358namespace {
6359
6360class DeclIDComp {
6361 ASTReader &Reader;
6362 ModuleFile &Mod;
6363
6364public:
6365 DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {}
6366
6367 bool operator()(LocalDeclID L, LocalDeclID R) const {
6368 SourceLocation LHS = getLocation(L);
6369 SourceLocation RHS = getLocation(R);
6370 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6371 }
6372
6373 bool operator()(SourceLocation LHS, LocalDeclID R) const {
6374 SourceLocation RHS = getLocation(R);
6375 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6376 }
6377
6378 bool operator()(LocalDeclID L, SourceLocation RHS) const {
6379 SourceLocation LHS = getLocation(L);
6380 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6381 }
6382
6383 SourceLocation getLocation(LocalDeclID ID) const {
6384 return Reader.getSourceManager().getFileLoc(
6385 Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID)));
6386 }
6387};
6388
6389}
6390
6391void ASTReader::FindFileRegionDecls(FileID File,
6392 unsigned Offset, unsigned Length,
6393 SmallVectorImpl<Decl *> &Decls) {
6394 SourceManager &SM = getSourceManager();
6395
6396 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File);
6397 if (I == FileDeclIDs.end())
6398 return;
6399
6400 FileDeclsInfo &DInfo = I->second;
6401 if (DInfo.Decls.empty())
6402 return;
6403
6404 SourceLocation
6405 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset);
6406 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length);
6407
6408 DeclIDComp DIDComp(*this, *DInfo.Mod);
6409 ArrayRef<serialization::LocalDeclID>::iterator
6410 BeginIt = std::lower_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
6411 BeginLoc, DIDComp);
6412 if (BeginIt != DInfo.Decls.begin())
6413 --BeginIt;
6414
6415 // If we are pointing at a top-level decl inside an objc container, we need
6416 // to backtrack until we find it otherwise we will fail to report that the
6417 // region overlaps with an objc container.
6418 while (BeginIt != DInfo.Decls.begin() &&
6419 GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt))
6420 ->isTopLevelDeclInObjCContainer())
6421 --BeginIt;
6422
6423 ArrayRef<serialization::LocalDeclID>::iterator
6424 EndIt = std::upper_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
6425 EndLoc, DIDComp);
6426 if (EndIt != DInfo.Decls.end())
6427 ++EndIt;
6428
6429 for (ArrayRef<serialization::LocalDeclID>::iterator
6430 DIt = BeginIt; DIt != EndIt; ++DIt)
6431 Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt)));
6432}
6433
6434namespace {
6435 /// \brief ModuleFile visitor used to perform name lookup into a
6436 /// declaration context.
6437 class DeclContextNameLookupVisitor {
6438 ASTReader &Reader;
Richard Smith8c913ec2014-08-14 02:21:01 +00006439 ArrayRef<const DeclContext *> Contexts;
Guy Benyei11169dd2012-12-18 14:30:41 +00006440 DeclarationName Name;
6441 SmallVectorImpl<NamedDecl *> &Decls;
6442
6443 public:
Richard Smith8c913ec2014-08-14 02:21:01 +00006444 DeclContextNameLookupVisitor(ASTReader &Reader,
6445 ArrayRef<const DeclContext *> Contexts,
Guy Benyei11169dd2012-12-18 14:30:41 +00006446 DeclarationName Name,
6447 SmallVectorImpl<NamedDecl *> &Decls)
6448 : Reader(Reader), Contexts(Contexts), Name(Name), Decls(Decls) { }
6449
6450 static bool visit(ModuleFile &M, void *UserData) {
6451 DeclContextNameLookupVisitor *This
6452 = static_cast<DeclContextNameLookupVisitor *>(UserData);
6453
6454 // Check whether we have any visible declaration information for
6455 // this context in this module.
6456 ModuleFile::DeclContextInfosMap::iterator Info;
6457 bool FoundInfo = false;
Richard Smith8c913ec2014-08-14 02:21:01 +00006458 for (auto *DC : This->Contexts) {
6459 Info = M.DeclContextInfos.find(DC);
6460 if (Info != M.DeclContextInfos.end() &&
Guy Benyei11169dd2012-12-18 14:30:41 +00006461 Info->second.NameLookupTableData) {
6462 FoundInfo = true;
6463 break;
6464 }
6465 }
6466
6467 if (!FoundInfo)
6468 return false;
Richard Smith8c913ec2014-08-14 02:21:01 +00006469
Guy Benyei11169dd2012-12-18 14:30:41 +00006470 // Look for this name within this module.
Richard Smith52e3fba2014-03-11 07:17:35 +00006471 ASTDeclContextNameLookupTable *LookupTable =
Guy Benyei11169dd2012-12-18 14:30:41 +00006472 Info->second.NameLookupTableData;
6473 ASTDeclContextNameLookupTable::iterator Pos
6474 = LookupTable->find(This->Name);
6475 if (Pos == LookupTable->end())
6476 return false;
6477
6478 bool FoundAnything = false;
6479 ASTDeclContextNameLookupTrait::data_type Data = *Pos;
6480 for (; Data.first != Data.second; ++Data.first) {
6481 NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M, *Data.first);
6482 if (!ND)
6483 continue;
6484
6485 if (ND->getDeclName() != This->Name) {
6486 // A name might be null because the decl's redeclarable part is
6487 // currently read before reading its name. The lookup is triggered by
6488 // building that decl (likely indirectly), and so it is later in the
6489 // sense of "already existing" and can be ignored here.
Richard Smith8c913ec2014-08-14 02:21:01 +00006490 // FIXME: This should not happen; deserializing declarations should
6491 // not perform lookups since that can lead to deserialization cycles.
Guy Benyei11169dd2012-12-18 14:30:41 +00006492 continue;
6493 }
Richard Smith8c913ec2014-08-14 02:21:01 +00006494
Guy Benyei11169dd2012-12-18 14:30:41 +00006495 // Record this declaration.
6496 FoundAnything = true;
6497 This->Decls.push_back(ND);
6498 }
6499
6500 return FoundAnything;
6501 }
6502 };
6503}
6504
Douglas Gregor9f782892013-01-21 15:25:38 +00006505/// \brief Retrieve the "definitive" module file for the definition of the
6506/// given declaration context, if there is one.
6507///
6508/// The "definitive" module file is the only place where we need to look to
6509/// find information about the declarations within the given declaration
6510/// context. For example, C++ and Objective-C classes, C structs/unions, and
6511/// Objective-C protocols, categories, and extensions are all defined in a
6512/// single place in the source code, so they have definitive module files
6513/// associated with them. C++ namespaces, on the other hand, can have
6514/// definitions in multiple different module files.
6515///
6516/// Note: this needs to be kept in sync with ASTWriter::AddedVisibleDecl's
6517/// NDEBUG checking.
6518static ModuleFile *getDefinitiveModuleFileFor(const DeclContext *DC,
6519 ASTReader &Reader) {
Douglas Gregor7a6e2002013-01-22 17:08:30 +00006520 if (const DeclContext *DefDC = getDefinitiveDeclContext(DC))
6521 return Reader.getOwningModuleFile(cast<Decl>(DefDC));
Douglas Gregor9f782892013-01-21 15:25:38 +00006522
Craig Toppera13603a2014-05-22 05:54:18 +00006523 return nullptr;
Douglas Gregor9f782892013-01-21 15:25:38 +00006524}
6525
Richard Smith9ce12e32013-02-07 03:30:24 +00006526bool
Guy Benyei11169dd2012-12-18 14:30:41 +00006527ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC,
6528 DeclarationName Name) {
6529 assert(DC->hasExternalVisibleStorage() &&
6530 "DeclContext has no visible decls in storage");
6531 if (!Name)
Richard Smith9ce12e32013-02-07 03:30:24 +00006532 return false;
Guy Benyei11169dd2012-12-18 14:30:41 +00006533
Richard Smith8c913ec2014-08-14 02:21:01 +00006534 Deserializing LookupResults(this);
6535
Guy Benyei11169dd2012-12-18 14:30:41 +00006536 SmallVector<NamedDecl *, 64> Decls;
Richard Smith8c913ec2014-08-14 02:21:01 +00006537
Guy Benyei11169dd2012-12-18 14:30:41 +00006538 // Compute the declaration contexts we need to look into. Multiple such
6539 // declaration contexts occur when two declaration contexts from disjoint
6540 // modules get merged, e.g., when two namespaces with the same name are
6541 // independently defined in separate modules.
6542 SmallVector<const DeclContext *, 2> Contexts;
6543 Contexts.push_back(DC);
Richard Smith8c913ec2014-08-14 02:21:01 +00006544
Guy Benyei11169dd2012-12-18 14:30:41 +00006545 if (DC->isNamespace()) {
Richard Smithcd45dbc2014-04-19 03:48:30 +00006546 auto Merged = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC)));
Guy Benyei11169dd2012-12-18 14:30:41 +00006547 if (Merged != MergedDecls.end()) {
6548 for (unsigned I = 0, N = Merged->second.size(); I != N; ++I)
6549 Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I])));
6550 }
6551 }
Richard Smith8c913ec2014-08-14 02:21:01 +00006552
6553 auto LookUpInContexts = [&](ArrayRef<const DeclContext*> Contexts) {
6554 DeclContextNameLookupVisitor Visitor(*this, Contexts, Name, Decls);
6555
6556 // If we can definitively determine which module file to look into,
6557 // only look there. Otherwise, look in all module files.
6558 ModuleFile *Definitive;
6559 if (Contexts.size() == 1 &&
6560 (Definitive = getDefinitiveModuleFileFor(Contexts[0], *this))) {
6561 DeclContextNameLookupVisitor::visit(*Definitive, &Visitor);
6562 } else {
6563 ModuleMgr.visit(&DeclContextNameLookupVisitor::visit, &Visitor);
6564 }
6565 };
6566
6567 LookUpInContexts(Contexts);
6568
6569 // If this might be an implicit special member function, then also search
6570 // all merged definitions of the surrounding class. We need to search them
6571 // individually, because finding an entity in one of them doesn't imply that
6572 // we can't find a different entity in another one.
Richard Smithcd45dbc2014-04-19 03:48:30 +00006573 if (isa<CXXRecordDecl>(DC)) {
Richard Smith8c913ec2014-08-14 02:21:01 +00006574 auto Kind = Name.getNameKind();
6575 if (Kind == DeclarationName::CXXConstructorName ||
6576 Kind == DeclarationName::CXXDestructorName ||
6577 (Kind == DeclarationName::CXXOperatorName &&
6578 Name.getCXXOverloadedOperator() == OO_Equal)) {
6579 auto Merged = MergedLookups.find(DC);
6580 if (Merged != MergedLookups.end())
6581 for (auto *MergedDC : Merged->second)
6582 LookUpInContexts(MergedDC);
6583 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00006584 }
6585
Guy Benyei11169dd2012-12-18 14:30:41 +00006586 ++NumVisibleDeclContextsRead;
6587 SetExternalVisibleDeclsForName(DC, Name, Decls);
Richard Smith9ce12e32013-02-07 03:30:24 +00006588 return !Decls.empty();
Guy Benyei11169dd2012-12-18 14:30:41 +00006589}
6590
6591namespace {
6592 /// \brief ModuleFile visitor used to retrieve all visible names in a
6593 /// declaration context.
6594 class DeclContextAllNamesVisitor {
6595 ASTReader &Reader;
Dmitri Gribenkof8579502013-01-12 19:30:44 +00006596 SmallVectorImpl<const DeclContext *> &Contexts;
Craig Topper3598eb72013-07-05 04:43:31 +00006597 DeclsMap &Decls;
Argyrios Kyrtzidis2810e9d2012-12-19 22:21:18 +00006598 bool VisitAll;
Guy Benyei11169dd2012-12-18 14:30:41 +00006599
6600 public:
6601 DeclContextAllNamesVisitor(ASTReader &Reader,
6602 SmallVectorImpl<const DeclContext *> &Contexts,
Craig Topper3598eb72013-07-05 04:43:31 +00006603 DeclsMap &Decls, bool VisitAll)
Argyrios Kyrtzidis2810e9d2012-12-19 22:21:18 +00006604 : Reader(Reader), Contexts(Contexts), Decls(Decls), VisitAll(VisitAll) { }
Guy Benyei11169dd2012-12-18 14:30:41 +00006605
6606 static bool visit(ModuleFile &M, void *UserData) {
6607 DeclContextAllNamesVisitor *This
6608 = static_cast<DeclContextAllNamesVisitor *>(UserData);
6609
6610 // Check whether we have any visible declaration information for
6611 // this context in this module.
6612 ModuleFile::DeclContextInfosMap::iterator Info;
6613 bool FoundInfo = false;
6614 for (unsigned I = 0, N = This->Contexts.size(); I != N; ++I) {
6615 Info = M.DeclContextInfos.find(This->Contexts[I]);
6616 if (Info != M.DeclContextInfos.end() &&
6617 Info->second.NameLookupTableData) {
6618 FoundInfo = true;
6619 break;
6620 }
6621 }
6622
6623 if (!FoundInfo)
6624 return false;
6625
Richard Smith52e3fba2014-03-11 07:17:35 +00006626 ASTDeclContextNameLookupTable *LookupTable =
Guy Benyei11169dd2012-12-18 14:30:41 +00006627 Info->second.NameLookupTableData;
6628 bool FoundAnything = false;
6629 for (ASTDeclContextNameLookupTable::data_iterator
Douglas Gregor5e306b12013-01-23 22:38:11 +00006630 I = LookupTable->data_begin(), E = LookupTable->data_end();
6631 I != E;
6632 ++I) {
Guy Benyei11169dd2012-12-18 14:30:41 +00006633 ASTDeclContextNameLookupTrait::data_type Data = *I;
6634 for (; Data.first != Data.second; ++Data.first) {
6635 NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M,
6636 *Data.first);
6637 if (!ND)
6638 continue;
6639
6640 // Record this declaration.
6641 FoundAnything = true;
6642 This->Decls[ND->getDeclName()].push_back(ND);
6643 }
6644 }
6645
Argyrios Kyrtzidis2810e9d2012-12-19 22:21:18 +00006646 return FoundAnything && !This->VisitAll;
Guy Benyei11169dd2012-12-18 14:30:41 +00006647 }
6648 };
6649}
6650
6651void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) {
6652 if (!DC->hasExternalVisibleStorage())
6653 return;
Craig Topper79be4cd2013-07-05 04:33:53 +00006654 DeclsMap Decls;
Guy Benyei11169dd2012-12-18 14:30:41 +00006655
6656 // Compute the declaration contexts we need to look into. Multiple such
6657 // declaration contexts occur when two declaration contexts from disjoint
6658 // modules get merged, e.g., when two namespaces with the same name are
6659 // independently defined in separate modules.
6660 SmallVector<const DeclContext *, 2> Contexts;
6661 Contexts.push_back(DC);
6662
6663 if (DC->isNamespace()) {
6664 MergedDeclsMap::iterator Merged
6665 = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC)));
6666 if (Merged != MergedDecls.end()) {
6667 for (unsigned I = 0, N = Merged->second.size(); I != N; ++I)
6668 Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I])));
6669 }
6670 }
6671
Argyrios Kyrtzidis2810e9d2012-12-19 22:21:18 +00006672 DeclContextAllNamesVisitor Visitor(*this, Contexts, Decls,
6673 /*VisitAll=*/DC->isFileContext());
Guy Benyei11169dd2012-12-18 14:30:41 +00006674 ModuleMgr.visit(&DeclContextAllNamesVisitor::visit, &Visitor);
6675 ++NumVisibleDeclContextsRead;
6676
Craig Topper79be4cd2013-07-05 04:33:53 +00006677 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) {
Guy Benyei11169dd2012-12-18 14:30:41 +00006678 SetExternalVisibleDeclsForName(DC, I->first, I->second);
6679 }
6680 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false);
6681}
6682
6683/// \brief Under non-PCH compilation the consumer receives the objc methods
6684/// before receiving the implementation, and codegen depends on this.
6685/// We simulate this by deserializing and passing to consumer the methods of the
6686/// implementation before passing the deserialized implementation decl.
6687static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD,
6688 ASTConsumer *Consumer) {
6689 assert(ImplD && Consumer);
6690
Aaron Ballmanaff18c02014-03-13 19:03:34 +00006691 for (auto *I : ImplD->methods())
6692 Consumer->HandleInterestingDecl(DeclGroupRef(I));
Guy Benyei11169dd2012-12-18 14:30:41 +00006693
6694 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD));
6695}
6696
6697void ASTReader::PassInterestingDeclsToConsumer() {
6698 assert(Consumer);
Richard Smith04d05b52014-03-23 00:27:18 +00006699
6700 if (PassingDeclsToConsumer)
6701 return;
6702
6703 // Guard variable to avoid recursively redoing the process of passing
6704 // decls to consumer.
6705 SaveAndRestore<bool> GuardPassingDeclsToConsumer(PassingDeclsToConsumer,
6706 true);
6707
Guy Benyei11169dd2012-12-18 14:30:41 +00006708 while (!InterestingDecls.empty()) {
6709 Decl *D = InterestingDecls.front();
6710 InterestingDecls.pop_front();
6711
6712 PassInterestingDeclToConsumer(D);
6713 }
6714}
6715
6716void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
6717 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
6718 PassObjCImplDeclToConsumer(ImplD, Consumer);
6719 else
6720 Consumer->HandleInterestingDecl(DeclGroupRef(D));
6721}
6722
6723void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) {
6724 this->Consumer = Consumer;
6725
6726 if (!Consumer)
6727 return;
6728
Ben Langmuir332aafe2014-01-31 01:06:56 +00006729 for (unsigned I = 0, N = EagerlyDeserializedDecls.size(); I != N; ++I) {
Guy Benyei11169dd2012-12-18 14:30:41 +00006730 // Force deserialization of this decl, which will cause it to be queued for
6731 // passing to the consumer.
Ben Langmuir332aafe2014-01-31 01:06:56 +00006732 GetDecl(EagerlyDeserializedDecls[I]);
Guy Benyei11169dd2012-12-18 14:30:41 +00006733 }
Ben Langmuir332aafe2014-01-31 01:06:56 +00006734 EagerlyDeserializedDecls.clear();
Guy Benyei11169dd2012-12-18 14:30:41 +00006735
6736 PassInterestingDeclsToConsumer();
6737}
6738
6739void ASTReader::PrintStats() {
6740 std::fprintf(stderr, "*** AST File Statistics:\n");
6741
6742 unsigned NumTypesLoaded
6743 = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(),
6744 QualType());
6745 unsigned NumDeclsLoaded
6746 = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(),
Craig Toppera13603a2014-05-22 05:54:18 +00006747 (Decl *)nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00006748 unsigned NumIdentifiersLoaded
6749 = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(),
6750 IdentifiersLoaded.end(),
Craig Toppera13603a2014-05-22 05:54:18 +00006751 (IdentifierInfo *)nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00006752 unsigned NumMacrosLoaded
6753 = MacrosLoaded.size() - std::count(MacrosLoaded.begin(),
6754 MacrosLoaded.end(),
Craig Toppera13603a2014-05-22 05:54:18 +00006755 (MacroInfo *)nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00006756 unsigned NumSelectorsLoaded
6757 = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(),
6758 SelectorsLoaded.end(),
6759 Selector());
6760
6761 if (unsigned TotalNumSLocEntries = getTotalNumSLocs())
6762 std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n",
6763 NumSLocEntriesRead, TotalNumSLocEntries,
6764 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
6765 if (!TypesLoaded.empty())
6766 std::fprintf(stderr, " %u/%u types read (%f%%)\n",
6767 NumTypesLoaded, (unsigned)TypesLoaded.size(),
6768 ((float)NumTypesLoaded/TypesLoaded.size() * 100));
6769 if (!DeclsLoaded.empty())
6770 std::fprintf(stderr, " %u/%u declarations read (%f%%)\n",
6771 NumDeclsLoaded, (unsigned)DeclsLoaded.size(),
6772 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100));
6773 if (!IdentifiersLoaded.empty())
6774 std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n",
6775 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(),
6776 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
6777 if (!MacrosLoaded.empty())
6778 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
6779 NumMacrosLoaded, (unsigned)MacrosLoaded.size(),
6780 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100));
6781 if (!SelectorsLoaded.empty())
6782 std::fprintf(stderr, " %u/%u selectors read (%f%%)\n",
6783 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(),
6784 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
6785 if (TotalNumStatements)
6786 std::fprintf(stderr, " %u/%u statements read (%f%%)\n",
6787 NumStatementsRead, TotalNumStatements,
6788 ((float)NumStatementsRead/TotalNumStatements * 100));
6789 if (TotalNumMacros)
6790 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
6791 NumMacrosRead, TotalNumMacros,
6792 ((float)NumMacrosRead/TotalNumMacros * 100));
6793 if (TotalLexicalDeclContexts)
6794 std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n",
6795 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
6796 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
6797 * 100));
6798 if (TotalVisibleDeclContexts)
6799 std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n",
6800 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
6801 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
6802 * 100));
6803 if (TotalNumMethodPoolEntries) {
6804 std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n",
6805 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
6806 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
6807 * 100));
Guy Benyei11169dd2012-12-18 14:30:41 +00006808 }
Douglas Gregorad2f7a52013-01-28 17:54:36 +00006809 if (NumMethodPoolLookups) {
6810 std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n",
6811 NumMethodPoolHits, NumMethodPoolLookups,
6812 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
6813 }
6814 if (NumMethodPoolTableLookups) {
6815 std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n",
6816 NumMethodPoolTableHits, NumMethodPoolTableLookups,
6817 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups
6818 * 100.0));
6819 }
6820
Douglas Gregor00a50f72013-01-25 00:38:33 +00006821 if (NumIdentifierLookupHits) {
6822 std::fprintf(stderr,
6823 " %u / %u identifier table lookups succeeded (%f%%)\n",
6824 NumIdentifierLookupHits, NumIdentifierLookups,
6825 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
6826 }
6827
Douglas Gregore060e572013-01-25 01:03:03 +00006828 if (GlobalIndex) {
6829 std::fprintf(stderr, "\n");
6830 GlobalIndex->printStats();
6831 }
6832
Guy Benyei11169dd2012-12-18 14:30:41 +00006833 std::fprintf(stderr, "\n");
6834 dump();
6835 std::fprintf(stderr, "\n");
6836}
6837
6838template<typename Key, typename ModuleFile, unsigned InitialCapacity>
6839static void
6840dumpModuleIDMap(StringRef Name,
6841 const ContinuousRangeMap<Key, ModuleFile *,
6842 InitialCapacity> &Map) {
6843 if (Map.begin() == Map.end())
6844 return;
6845
6846 typedef ContinuousRangeMap<Key, ModuleFile *, InitialCapacity> MapType;
6847 llvm::errs() << Name << ":\n";
6848 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
6849 I != IEnd; ++I) {
6850 llvm::errs() << " " << I->first << " -> " << I->second->FileName
6851 << "\n";
6852 }
6853}
6854
6855void ASTReader::dump() {
6856 llvm::errs() << "*** PCH/ModuleFile Remappings:\n";
6857 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap);
6858 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap);
6859 dumpModuleIDMap("Global type map", GlobalTypeMap);
6860 dumpModuleIDMap("Global declaration map", GlobalDeclMap);
6861 dumpModuleIDMap("Global identifier map", GlobalIdentifierMap);
6862 dumpModuleIDMap("Global macro map", GlobalMacroMap);
6863 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap);
6864 dumpModuleIDMap("Global selector map", GlobalSelectorMap);
6865 dumpModuleIDMap("Global preprocessed entity map",
6866 GlobalPreprocessedEntityMap);
6867
6868 llvm::errs() << "\n*** PCH/Modules Loaded:";
6869 for (ModuleManager::ModuleConstIterator M = ModuleMgr.begin(),
6870 MEnd = ModuleMgr.end();
6871 M != MEnd; ++M)
6872 (*M)->dump();
6873}
6874
6875/// Return the amount of memory used by memory buffers, breaking down
6876/// by heap-backed versus mmap'ed memory.
6877void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const {
6878 for (ModuleConstIterator I = ModuleMgr.begin(),
6879 E = ModuleMgr.end(); I != E; ++I) {
6880 if (llvm::MemoryBuffer *buf = (*I)->Buffer.get()) {
6881 size_t bytes = buf->getBufferSize();
6882 switch (buf->getBufferKind()) {
6883 case llvm::MemoryBuffer::MemoryBuffer_Malloc:
6884 sizes.malloc_bytes += bytes;
6885 break;
6886 case llvm::MemoryBuffer::MemoryBuffer_MMap:
6887 sizes.mmap_bytes += bytes;
6888 break;
6889 }
6890 }
6891 }
6892}
6893
6894void ASTReader::InitializeSema(Sema &S) {
6895 SemaObj = &S;
6896 S.addExternalSource(this);
6897
6898 // Makes sure any declarations that were deserialized "too early"
6899 // still get added to the identifier's declaration chains.
Ben Langmuir5418f402014-09-10 21:29:41 +00006900 for (uint64_t ID : PreloadedDeclIDs) {
6901 NamedDecl *D = cast<NamedDecl>(GetDecl(ID));
6902 pushExternalDeclIntoScope(D, D->getDeclName());
Guy Benyei11169dd2012-12-18 14:30:41 +00006903 }
Ben Langmuir5418f402014-09-10 21:29:41 +00006904 PreloadedDeclIDs.clear();
Guy Benyei11169dd2012-12-18 14:30:41 +00006905
Richard Smith3d8e97e2013-10-18 06:54:39 +00006906 // FIXME: What happens if these are changed by a module import?
Guy Benyei11169dd2012-12-18 14:30:41 +00006907 if (!FPPragmaOptions.empty()) {
6908 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS");
6909 SemaObj->FPFeatures.fp_contract = FPPragmaOptions[0];
6910 }
6911
Richard Smith3d8e97e2013-10-18 06:54:39 +00006912 // FIXME: What happens if these are changed by a module import?
Guy Benyei11169dd2012-12-18 14:30:41 +00006913 if (!OpenCLExtensions.empty()) {
6914 unsigned I = 0;
6915#define OPENCLEXT(nm) SemaObj->OpenCLFeatures.nm = OpenCLExtensions[I++];
6916#include "clang/Basic/OpenCLExtensions.def"
6917
6918 assert(OpenCLExtensions.size() == I && "Wrong number of OPENCL_EXTENSIONS");
6919 }
Richard Smith3d8e97e2013-10-18 06:54:39 +00006920
6921 UpdateSema();
6922}
6923
6924void ASTReader::UpdateSema() {
6925 assert(SemaObj && "no Sema to update");
6926
6927 // Load the offsets of the declarations that Sema references.
6928 // They will be lazily deserialized when needed.
6929 if (!SemaDeclRefs.empty()) {
6930 assert(SemaDeclRefs.size() % 2 == 0);
6931 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 2) {
6932 if (!SemaObj->StdNamespace)
6933 SemaObj->StdNamespace = SemaDeclRefs[I];
6934 if (!SemaObj->StdBadAlloc)
6935 SemaObj->StdBadAlloc = SemaDeclRefs[I+1];
6936 }
6937 SemaDeclRefs.clear();
6938 }
Dario Domizioli13a0a382014-05-23 12:13:25 +00006939
6940 // Update the state of 'pragma clang optimize'. Use the same API as if we had
6941 // encountered the pragma in the source.
6942 if(OptimizeOffPragmaLocation.isValid())
6943 SemaObj->ActOnPragmaOptimize(/* IsOn = */ false, OptimizeOffPragmaLocation);
Guy Benyei11169dd2012-12-18 14:30:41 +00006944}
6945
6946IdentifierInfo* ASTReader::get(const char *NameStart, const char *NameEnd) {
6947 // Note that we are loading an identifier.
6948 Deserializing AnIdentifier(this);
Douglas Gregore060e572013-01-25 01:03:03 +00006949 StringRef Name(NameStart, NameEnd - NameStart);
6950
6951 // If there is a global index, look there first to determine which modules
6952 // provably do not have any results for this identifier.
Douglas Gregor7211ac12013-01-25 23:32:03 +00006953 GlobalModuleIndex::HitSet Hits;
Craig Toppera13603a2014-05-22 05:54:18 +00006954 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
Douglas Gregore060e572013-01-25 01:03:03 +00006955 if (!loadGlobalIndex()) {
Douglas Gregor7211ac12013-01-25 23:32:03 +00006956 if (GlobalIndex->lookupIdentifier(Name, Hits)) {
6957 HitsPtr = &Hits;
Douglas Gregore060e572013-01-25 01:03:03 +00006958 }
6959 }
Douglas Gregor7211ac12013-01-25 23:32:03 +00006960 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0,
Douglas Gregor00a50f72013-01-25 00:38:33 +00006961 NumIdentifierLookups,
6962 NumIdentifierLookupHits);
Douglas Gregor7211ac12013-01-25 23:32:03 +00006963 ModuleMgr.visit(IdentifierLookupVisitor::visit, &Visitor, HitsPtr);
Guy Benyei11169dd2012-12-18 14:30:41 +00006964 IdentifierInfo *II = Visitor.getIdentifierInfo();
6965 markIdentifierUpToDate(II);
6966 return II;
6967}
6968
6969namespace clang {
6970 /// \brief An identifier-lookup iterator that enumerates all of the
6971 /// identifiers stored within a set of AST files.
6972 class ASTIdentifierIterator : public IdentifierIterator {
6973 /// \brief The AST reader whose identifiers are being enumerated.
6974 const ASTReader &Reader;
6975
6976 /// \brief The current index into the chain of AST files stored in
6977 /// the AST reader.
6978 unsigned Index;
6979
6980 /// \brief The current position within the identifier lookup table
6981 /// of the current AST file.
6982 ASTIdentifierLookupTable::key_iterator Current;
6983
6984 /// \brief The end position within the identifier lookup table of
6985 /// the current AST file.
6986 ASTIdentifierLookupTable::key_iterator End;
6987
6988 public:
6989 explicit ASTIdentifierIterator(const ASTReader &Reader);
6990
Craig Topper3e89dfe2014-03-13 02:13:41 +00006991 StringRef Next() override;
Guy Benyei11169dd2012-12-18 14:30:41 +00006992 };
6993}
6994
6995ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader)
6996 : Reader(Reader), Index(Reader.ModuleMgr.size() - 1) {
6997 ASTIdentifierLookupTable *IdTable
6998 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].IdentifierLookupTable;
6999 Current = IdTable->key_begin();
7000 End = IdTable->key_end();
7001}
7002
7003StringRef ASTIdentifierIterator::Next() {
7004 while (Current == End) {
7005 // If we have exhausted all of our AST files, we're done.
7006 if (Index == 0)
7007 return StringRef();
7008
7009 --Index;
7010 ASTIdentifierLookupTable *IdTable
7011 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].
7012 IdentifierLookupTable;
7013 Current = IdTable->key_begin();
7014 End = IdTable->key_end();
7015 }
7016
7017 // We have any identifiers remaining in the current AST file; return
7018 // the next one.
Douglas Gregorbfd73d72013-01-23 18:53:14 +00007019 StringRef Result = *Current;
Guy Benyei11169dd2012-12-18 14:30:41 +00007020 ++Current;
Douglas Gregorbfd73d72013-01-23 18:53:14 +00007021 return Result;
Guy Benyei11169dd2012-12-18 14:30:41 +00007022}
7023
Argyrios Kyrtzidis9aca3c62013-04-17 22:10:55 +00007024IdentifierIterator *ASTReader::getIdentifiers() {
7025 if (!loadGlobalIndex())
7026 return GlobalIndex->createIdentifierIterator();
7027
Guy Benyei11169dd2012-12-18 14:30:41 +00007028 return new ASTIdentifierIterator(*this);
7029}
7030
7031namespace clang { namespace serialization {
7032 class ReadMethodPoolVisitor {
7033 ASTReader &Reader;
7034 Selector Sel;
7035 unsigned PriorGeneration;
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00007036 unsigned InstanceBits;
7037 unsigned FactoryBits;
Dmitri Gribenkof8579502013-01-12 19:30:44 +00007038 SmallVector<ObjCMethodDecl *, 4> InstanceMethods;
7039 SmallVector<ObjCMethodDecl *, 4> FactoryMethods;
Guy Benyei11169dd2012-12-18 14:30:41 +00007040
7041 public:
7042 ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel,
7043 unsigned PriorGeneration)
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00007044 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration),
7045 InstanceBits(0), FactoryBits(0) { }
Guy Benyei11169dd2012-12-18 14:30:41 +00007046
7047 static bool visit(ModuleFile &M, void *UserData) {
7048 ReadMethodPoolVisitor *This
7049 = static_cast<ReadMethodPoolVisitor *>(UserData);
7050
7051 if (!M.SelectorLookupTable)
7052 return false;
7053
7054 // If we've already searched this module file, skip it now.
7055 if (M.Generation <= This->PriorGeneration)
7056 return true;
7057
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007058 ++This->Reader.NumMethodPoolTableLookups;
Guy Benyei11169dd2012-12-18 14:30:41 +00007059 ASTSelectorLookupTable *PoolTable
7060 = (ASTSelectorLookupTable*)M.SelectorLookupTable;
7061 ASTSelectorLookupTable::iterator Pos = PoolTable->find(This->Sel);
7062 if (Pos == PoolTable->end())
7063 return false;
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007064
7065 ++This->Reader.NumMethodPoolTableHits;
Guy Benyei11169dd2012-12-18 14:30:41 +00007066 ++This->Reader.NumSelectorsRead;
7067 // FIXME: Not quite happy with the statistics here. We probably should
7068 // disable this tracking when called via LoadSelector.
7069 // Also, should entries without methods count as misses?
7070 ++This->Reader.NumMethodPoolEntriesRead;
7071 ASTSelectorLookupTrait::data_type Data = *Pos;
7072 if (This->Reader.DeserializationListener)
7073 This->Reader.DeserializationListener->SelectorRead(Data.ID,
7074 This->Sel);
7075
7076 This->InstanceMethods.append(Data.Instance.begin(), Data.Instance.end());
7077 This->FactoryMethods.append(Data.Factory.begin(), Data.Factory.end());
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00007078 This->InstanceBits = Data.InstanceBits;
7079 This->FactoryBits = Data.FactoryBits;
Guy Benyei11169dd2012-12-18 14:30:41 +00007080 return true;
7081 }
7082
7083 /// \brief Retrieve the instance methods found by this visitor.
7084 ArrayRef<ObjCMethodDecl *> getInstanceMethods() const {
7085 return InstanceMethods;
7086 }
7087
7088 /// \brief Retrieve the instance methods found by this visitor.
7089 ArrayRef<ObjCMethodDecl *> getFactoryMethods() const {
7090 return FactoryMethods;
7091 }
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00007092
7093 unsigned getInstanceBits() const { return InstanceBits; }
7094 unsigned getFactoryBits() const { return FactoryBits; }
Guy Benyei11169dd2012-12-18 14:30:41 +00007095 };
7096} } // end namespace clang::serialization
7097
7098/// \brief Add the given set of methods to the method list.
7099static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods,
7100 ObjCMethodList &List) {
7101 for (unsigned I = 0, N = Methods.size(); I != N; ++I) {
7102 S.addMethodToGlobalList(&List, Methods[I]);
7103 }
7104}
7105
7106void ASTReader::ReadMethodPool(Selector Sel) {
7107 // Get the selector generation and update it to the current generation.
7108 unsigned &Generation = SelectorGeneration[Sel];
7109 unsigned PriorGeneration = Generation;
Richard Smith053f6c62014-05-16 23:01:30 +00007110 Generation = getGeneration();
Guy Benyei11169dd2012-12-18 14:30:41 +00007111
7112 // Search for methods defined with this selector.
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007113 ++NumMethodPoolLookups;
Guy Benyei11169dd2012-12-18 14:30:41 +00007114 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration);
7115 ModuleMgr.visit(&ReadMethodPoolVisitor::visit, &Visitor);
7116
7117 if (Visitor.getInstanceMethods().empty() &&
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007118 Visitor.getFactoryMethods().empty())
Guy Benyei11169dd2012-12-18 14:30:41 +00007119 return;
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007120
7121 ++NumMethodPoolHits;
7122
Guy Benyei11169dd2012-12-18 14:30:41 +00007123 if (!getSema())
7124 return;
7125
7126 Sema &S = *getSema();
7127 Sema::GlobalMethodPool::iterator Pos
7128 = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first;
7129
7130 addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first);
7131 addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second);
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00007132 Pos->second.first.setBits(Visitor.getInstanceBits());
7133 Pos->second.second.setBits(Visitor.getFactoryBits());
Guy Benyei11169dd2012-12-18 14:30:41 +00007134}
7135
7136void ASTReader::ReadKnownNamespaces(
7137 SmallVectorImpl<NamespaceDecl *> &Namespaces) {
7138 Namespaces.clear();
7139
7140 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
7141 if (NamespaceDecl *Namespace
7142 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I])))
7143 Namespaces.push_back(Namespace);
7144 }
7145}
7146
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00007147void ASTReader::ReadUndefinedButUsed(
Nick Lewyckyf0f56162013-01-31 03:23:57 +00007148 llvm::DenseMap<NamedDecl*, SourceLocation> &Undefined) {
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00007149 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
7150 NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++]));
Nick Lewycky8334af82013-01-26 00:35:08 +00007151 SourceLocation Loc =
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00007152 SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]);
Nick Lewycky8334af82013-01-26 00:35:08 +00007153 Undefined.insert(std::make_pair(D, Loc));
7154 }
7155}
Nick Lewycky8334af82013-01-26 00:35:08 +00007156
Guy Benyei11169dd2012-12-18 14:30:41 +00007157void ASTReader::ReadTentativeDefinitions(
7158 SmallVectorImpl<VarDecl *> &TentativeDefs) {
7159 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
7160 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I]));
7161 if (Var)
7162 TentativeDefs.push_back(Var);
7163 }
7164 TentativeDefinitions.clear();
7165}
7166
7167void ASTReader::ReadUnusedFileScopedDecls(
7168 SmallVectorImpl<const DeclaratorDecl *> &Decls) {
7169 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
7170 DeclaratorDecl *D
7171 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I]));
7172 if (D)
7173 Decls.push_back(D);
7174 }
7175 UnusedFileScopedDecls.clear();
7176}
7177
7178void ASTReader::ReadDelegatingConstructors(
7179 SmallVectorImpl<CXXConstructorDecl *> &Decls) {
7180 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
7181 CXXConstructorDecl *D
7182 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I]));
7183 if (D)
7184 Decls.push_back(D);
7185 }
7186 DelegatingCtorDecls.clear();
7187}
7188
7189void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) {
7190 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
7191 TypedefNameDecl *D
7192 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I]));
7193 if (D)
7194 Decls.push_back(D);
7195 }
7196 ExtVectorDecls.clear();
7197}
7198
7199void ASTReader::ReadDynamicClasses(SmallVectorImpl<CXXRecordDecl *> &Decls) {
7200 for (unsigned I = 0, N = DynamicClasses.size(); I != N; ++I) {
7201 CXXRecordDecl *D
7202 = dyn_cast_or_null<CXXRecordDecl>(GetDecl(DynamicClasses[I]));
7203 if (D)
7204 Decls.push_back(D);
7205 }
7206 DynamicClasses.clear();
7207}
7208
Nico Weber72889432014-09-06 01:25:55 +00007209void ASTReader::ReadUnusedLocalTypedefNameCandidates(
7210 llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) {
7211 for (unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N;
7212 ++I) {
7213 TypedefNameDecl *D = dyn_cast_or_null<TypedefNameDecl>(
7214 GetDecl(UnusedLocalTypedefNameCandidates[I]));
7215 if (D)
7216 Decls.insert(D);
7217 }
7218 UnusedLocalTypedefNameCandidates.clear();
7219}
7220
Guy Benyei11169dd2012-12-18 14:30:41 +00007221void
Richard Smith78165b52013-01-10 23:43:47 +00007222ASTReader::ReadLocallyScopedExternCDecls(SmallVectorImpl<NamedDecl *> &Decls) {
7223 for (unsigned I = 0, N = LocallyScopedExternCDecls.size(); I != N; ++I) {
7224 NamedDecl *D
7225 = dyn_cast_or_null<NamedDecl>(GetDecl(LocallyScopedExternCDecls[I]));
Guy Benyei11169dd2012-12-18 14:30:41 +00007226 if (D)
7227 Decls.push_back(D);
7228 }
Richard Smith78165b52013-01-10 23:43:47 +00007229 LocallyScopedExternCDecls.clear();
Guy Benyei11169dd2012-12-18 14:30:41 +00007230}
7231
7232void ASTReader::ReadReferencedSelectors(
7233 SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) {
7234 if (ReferencedSelectorsData.empty())
7235 return;
7236
7237 // If there are @selector references added them to its pool. This is for
7238 // implementation of -Wselector.
7239 unsigned int DataSize = ReferencedSelectorsData.size()-1;
7240 unsigned I = 0;
7241 while (I < DataSize) {
7242 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]);
7243 SourceLocation SelLoc
7244 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]);
7245 Sels.push_back(std::make_pair(Sel, SelLoc));
7246 }
7247 ReferencedSelectorsData.clear();
7248}
7249
7250void ASTReader::ReadWeakUndeclaredIdentifiers(
7251 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo> > &WeakIDs) {
7252 if (WeakUndeclaredIdentifiers.empty())
7253 return;
7254
7255 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) {
7256 IdentifierInfo *WeakId
7257 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
7258 IdentifierInfo *AliasId
7259 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
7260 SourceLocation Loc
7261 = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]);
7262 bool Used = WeakUndeclaredIdentifiers[I++];
7263 WeakInfo WI(AliasId, Loc);
7264 WI.setUsed(Used);
7265 WeakIDs.push_back(std::make_pair(WeakId, WI));
7266 }
7267 WeakUndeclaredIdentifiers.clear();
7268}
7269
7270void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) {
7271 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) {
7272 ExternalVTableUse VT;
7273 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++]));
7274 VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]);
7275 VT.DefinitionRequired = VTableUses[Idx++];
7276 VTables.push_back(VT);
7277 }
7278
7279 VTableUses.clear();
7280}
7281
7282void ASTReader::ReadPendingInstantiations(
7283 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation> > &Pending) {
7284 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
7285 ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++]));
7286 SourceLocation Loc
7287 = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]);
7288
7289 Pending.push_back(std::make_pair(D, Loc));
7290 }
7291 PendingInstantiations.clear();
7292}
7293
Richard Smithe40f2ba2013-08-07 21:41:30 +00007294void ASTReader::ReadLateParsedTemplates(
7295 llvm::DenseMap<const FunctionDecl *, LateParsedTemplate *> &LPTMap) {
7296 for (unsigned Idx = 0, N = LateParsedTemplates.size(); Idx < N;
7297 /* In loop */) {
7298 FunctionDecl *FD = cast<FunctionDecl>(GetDecl(LateParsedTemplates[Idx++]));
7299
7300 LateParsedTemplate *LT = new LateParsedTemplate;
7301 LT->D = GetDecl(LateParsedTemplates[Idx++]);
7302
7303 ModuleFile *F = getOwningModuleFile(LT->D);
7304 assert(F && "No module");
7305
7306 unsigned TokN = LateParsedTemplates[Idx++];
7307 LT->Toks.reserve(TokN);
7308 for (unsigned T = 0; T < TokN; ++T)
7309 LT->Toks.push_back(ReadToken(*F, LateParsedTemplates, Idx));
7310
7311 LPTMap[FD] = LT;
7312 }
7313
7314 LateParsedTemplates.clear();
7315}
7316
Guy Benyei11169dd2012-12-18 14:30:41 +00007317void ASTReader::LoadSelector(Selector Sel) {
7318 // It would be complicated to avoid reading the methods anyway. So don't.
7319 ReadMethodPool(Sel);
7320}
7321
7322void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) {
7323 assert(ID && "Non-zero identifier ID required");
7324 assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range");
7325 IdentifiersLoaded[ID - 1] = II;
7326 if (DeserializationListener)
7327 DeserializationListener->IdentifierRead(ID, II);
7328}
7329
7330/// \brief Set the globally-visible declarations associated with the given
7331/// identifier.
7332///
7333/// If the AST reader is currently in a state where the given declaration IDs
7334/// cannot safely be resolved, they are queued until it is safe to resolve
7335/// them.
7336///
7337/// \param II an IdentifierInfo that refers to one or more globally-visible
7338/// declarations.
7339///
7340/// \param DeclIDs the set of declaration IDs with the name @p II that are
7341/// visible at global scope.
7342///
Douglas Gregor6168bd22013-02-18 15:53:43 +00007343/// \param Decls if non-null, this vector will be populated with the set of
7344/// deserialized declarations. These declarations will not be pushed into
7345/// scope.
Guy Benyei11169dd2012-12-18 14:30:41 +00007346void
7347ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II,
7348 const SmallVectorImpl<uint32_t> &DeclIDs,
Douglas Gregor6168bd22013-02-18 15:53:43 +00007349 SmallVectorImpl<Decl *> *Decls) {
7350 if (NumCurrentElementsDeserializing && !Decls) {
7351 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
Guy Benyei11169dd2012-12-18 14:30:41 +00007352 return;
7353 }
7354
7355 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
Ben Langmuir5418f402014-09-10 21:29:41 +00007356 if (!SemaObj) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007357 // Queue this declaration so that it will be added to the
7358 // translation unit scope and identifier's declaration chain
7359 // once a Sema object is known.
Ben Langmuir5418f402014-09-10 21:29:41 +00007360 PreloadedDeclIDs.push_back(DeclIDs[I]);
7361 continue;
Guy Benyei11169dd2012-12-18 14:30:41 +00007362 }
Ben Langmuir5418f402014-09-10 21:29:41 +00007363
7364 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I]));
7365
7366 // If we're simply supposed to record the declarations, do so now.
7367 if (Decls) {
7368 Decls->push_back(D);
7369 continue;
7370 }
7371
7372 // Introduce this declaration into the translation-unit scope
7373 // and add it to the declaration chain for this identifier, so
7374 // that (unqualified) name lookup will find it.
7375 pushExternalDeclIntoScope(D, II);
Guy Benyei11169dd2012-12-18 14:30:41 +00007376 }
7377}
7378
Douglas Gregorc8a992f2013-01-21 16:52:34 +00007379IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007380 if (ID == 0)
Craig Toppera13603a2014-05-22 05:54:18 +00007381 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007382
7383 if (IdentifiersLoaded.empty()) {
7384 Error("no identifier table in AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00007385 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007386 }
7387
7388 ID -= 1;
7389 if (!IdentifiersLoaded[ID]) {
7390 GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1);
7391 assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map");
7392 ModuleFile *M = I->second;
7393 unsigned Index = ID - M->BaseIdentifierID;
7394 const char *Str = M->IdentifierTableData + M->IdentifierOffsets[Index];
7395
7396 // All of the strings in the AST file are preceded by a 16-bit length.
7397 // Extract that 16-bit length to avoid having to execute strlen().
7398 // NOTE: 'StrLenPtr' is an 'unsigned char*' so that we load bytes as
7399 // unsigned integers. This is important to avoid integer overflow when
7400 // we cast them to 'unsigned'.
7401 const unsigned char *StrLenPtr = (const unsigned char*) Str - 2;
7402 unsigned StrLen = (((unsigned) StrLenPtr[0])
7403 | (((unsigned) StrLenPtr[1]) << 8)) - 1;
Douglas Gregorc8a992f2013-01-21 16:52:34 +00007404 IdentifiersLoaded[ID]
7405 = &PP.getIdentifierTable().get(StringRef(Str, StrLen));
Guy Benyei11169dd2012-12-18 14:30:41 +00007406 if (DeserializationListener)
7407 DeserializationListener->IdentifierRead(ID + 1, IdentifiersLoaded[ID]);
7408 }
7409
7410 return IdentifiersLoaded[ID];
7411}
7412
Douglas Gregorc8a992f2013-01-21 16:52:34 +00007413IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) {
7414 return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID));
Guy Benyei11169dd2012-12-18 14:30:41 +00007415}
7416
7417IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) {
7418 if (LocalID < NUM_PREDEF_IDENT_IDS)
7419 return LocalID;
7420
7421 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7422 = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS);
7423 assert(I != M.IdentifierRemap.end()
7424 && "Invalid index into identifier index remap");
7425
7426 return LocalID + I->second;
7427}
7428
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00007429MacroInfo *ASTReader::getMacro(MacroID ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007430 if (ID == 0)
Craig Toppera13603a2014-05-22 05:54:18 +00007431 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007432
7433 if (MacrosLoaded.empty()) {
7434 Error("no macro table in AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00007435 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007436 }
7437
7438 ID -= NUM_PREDEF_MACRO_IDS;
7439 if (!MacrosLoaded[ID]) {
7440 GlobalMacroMapType::iterator I
7441 = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS);
7442 assert(I != GlobalMacroMap.end() && "Corrupted global macro map");
7443 ModuleFile *M = I->second;
7444 unsigned Index = ID - M->BaseMacroID;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00007445 MacrosLoaded[ID] = ReadMacroRecord(*M, M->MacroOffsets[Index]);
7446
7447 if (DeserializationListener)
7448 DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS,
7449 MacrosLoaded[ID]);
Guy Benyei11169dd2012-12-18 14:30:41 +00007450 }
7451
7452 return MacrosLoaded[ID];
7453}
7454
7455MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) {
7456 if (LocalID < NUM_PREDEF_MACRO_IDS)
7457 return LocalID;
7458
7459 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7460 = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS);
7461 assert(I != M.MacroRemap.end() && "Invalid index into macro index remap");
7462
7463 return LocalID + I->second;
7464}
7465
7466serialization::SubmoduleID
7467ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) {
7468 if (LocalID < NUM_PREDEF_SUBMODULE_IDS)
7469 return LocalID;
7470
7471 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7472 = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS);
7473 assert(I != M.SubmoduleRemap.end()
7474 && "Invalid index into submodule index remap");
7475
7476 return LocalID + I->second;
7477}
7478
7479Module *ASTReader::getSubmodule(SubmoduleID GlobalID) {
7480 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) {
7481 assert(GlobalID == 0 && "Unhandled global submodule ID");
Craig Toppera13603a2014-05-22 05:54:18 +00007482 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007483 }
7484
7485 if (GlobalID > SubmodulesLoaded.size()) {
7486 Error("submodule ID out of range in AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00007487 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007488 }
7489
7490 return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS];
7491}
Douglas Gregorc147b0b2013-01-12 01:29:50 +00007492
7493Module *ASTReader::getModule(unsigned ID) {
7494 return getSubmodule(ID);
7495}
7496
Guy Benyei11169dd2012-12-18 14:30:41 +00007497Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) {
7498 return DecodeSelector(getGlobalSelectorID(M, LocalID));
7499}
7500
7501Selector ASTReader::DecodeSelector(serialization::SelectorID ID) {
7502 if (ID == 0)
7503 return Selector();
7504
7505 if (ID > SelectorsLoaded.size()) {
7506 Error("selector ID out of range in AST file");
7507 return Selector();
7508 }
7509
Craig Toppera13603a2014-05-22 05:54:18 +00007510 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007511 // Load this selector from the selector table.
7512 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID);
7513 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map");
7514 ModuleFile &M = *I->second;
7515 ASTSelectorLookupTrait Trait(*this, M);
7516 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS;
7517 SelectorsLoaded[ID - 1] =
7518 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0);
7519 if (DeserializationListener)
7520 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
7521 }
7522
7523 return SelectorsLoaded[ID - 1];
7524}
7525
7526Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) {
7527 return DecodeSelector(ID);
7528}
7529
7530uint32_t ASTReader::GetNumExternalSelectors() {
7531 // ID 0 (the null selector) is considered an external selector.
7532 return getTotalNumSelectors() + 1;
7533}
7534
7535serialization::SelectorID
7536ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const {
7537 if (LocalID < NUM_PREDEF_SELECTOR_IDS)
7538 return LocalID;
7539
7540 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7541 = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS);
7542 assert(I != M.SelectorRemap.end()
7543 && "Invalid index into selector index remap");
7544
7545 return LocalID + I->second;
7546}
7547
7548DeclarationName
7549ASTReader::ReadDeclarationName(ModuleFile &F,
7550 const RecordData &Record, unsigned &Idx) {
7551 DeclarationName::NameKind Kind = (DeclarationName::NameKind)Record[Idx++];
7552 switch (Kind) {
7553 case DeclarationName::Identifier:
Douglas Gregorc8a992f2013-01-21 16:52:34 +00007554 return DeclarationName(GetIdentifierInfo(F, Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00007555
7556 case DeclarationName::ObjCZeroArgSelector:
7557 case DeclarationName::ObjCOneArgSelector:
7558 case DeclarationName::ObjCMultiArgSelector:
7559 return DeclarationName(ReadSelector(F, Record, Idx));
7560
7561 case DeclarationName::CXXConstructorName:
7562 return Context.DeclarationNames.getCXXConstructorName(
7563 Context.getCanonicalType(readType(F, Record, Idx)));
7564
7565 case DeclarationName::CXXDestructorName:
7566 return Context.DeclarationNames.getCXXDestructorName(
7567 Context.getCanonicalType(readType(F, Record, Idx)));
7568
7569 case DeclarationName::CXXConversionFunctionName:
7570 return Context.DeclarationNames.getCXXConversionFunctionName(
7571 Context.getCanonicalType(readType(F, Record, Idx)));
7572
7573 case DeclarationName::CXXOperatorName:
7574 return Context.DeclarationNames.getCXXOperatorName(
7575 (OverloadedOperatorKind)Record[Idx++]);
7576
7577 case DeclarationName::CXXLiteralOperatorName:
7578 return Context.DeclarationNames.getCXXLiteralOperatorName(
7579 GetIdentifierInfo(F, Record, Idx));
7580
7581 case DeclarationName::CXXUsingDirective:
7582 return DeclarationName::getUsingDirectiveName();
7583 }
7584
7585 llvm_unreachable("Invalid NameKind!");
7586}
7587
7588void ASTReader::ReadDeclarationNameLoc(ModuleFile &F,
7589 DeclarationNameLoc &DNLoc,
7590 DeclarationName Name,
7591 const RecordData &Record, unsigned &Idx) {
7592 switch (Name.getNameKind()) {
7593 case DeclarationName::CXXConstructorName:
7594 case DeclarationName::CXXDestructorName:
7595 case DeclarationName::CXXConversionFunctionName:
7596 DNLoc.NamedType.TInfo = GetTypeSourceInfo(F, Record, Idx);
7597 break;
7598
7599 case DeclarationName::CXXOperatorName:
7600 DNLoc.CXXOperatorName.BeginOpNameLoc
7601 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7602 DNLoc.CXXOperatorName.EndOpNameLoc
7603 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7604 break;
7605
7606 case DeclarationName::CXXLiteralOperatorName:
7607 DNLoc.CXXLiteralOperatorName.OpNameLoc
7608 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7609 break;
7610
7611 case DeclarationName::Identifier:
7612 case DeclarationName::ObjCZeroArgSelector:
7613 case DeclarationName::ObjCOneArgSelector:
7614 case DeclarationName::ObjCMultiArgSelector:
7615 case DeclarationName::CXXUsingDirective:
7616 break;
7617 }
7618}
7619
7620void ASTReader::ReadDeclarationNameInfo(ModuleFile &F,
7621 DeclarationNameInfo &NameInfo,
7622 const RecordData &Record, unsigned &Idx) {
7623 NameInfo.setName(ReadDeclarationName(F, Record, Idx));
7624 NameInfo.setLoc(ReadSourceLocation(F, Record, Idx));
7625 DeclarationNameLoc DNLoc;
7626 ReadDeclarationNameLoc(F, DNLoc, NameInfo.getName(), Record, Idx);
7627 NameInfo.setInfo(DNLoc);
7628}
7629
7630void ASTReader::ReadQualifierInfo(ModuleFile &F, QualifierInfo &Info,
7631 const RecordData &Record, unsigned &Idx) {
7632 Info.QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx);
7633 unsigned NumTPLists = Record[Idx++];
7634 Info.NumTemplParamLists = NumTPLists;
7635 if (NumTPLists) {
7636 Info.TemplParamLists = new (Context) TemplateParameterList*[NumTPLists];
7637 for (unsigned i=0; i != NumTPLists; ++i)
7638 Info.TemplParamLists[i] = ReadTemplateParameterList(F, Record, Idx);
7639 }
7640}
7641
7642TemplateName
7643ASTReader::ReadTemplateName(ModuleFile &F, const RecordData &Record,
7644 unsigned &Idx) {
7645 TemplateName::NameKind Kind = (TemplateName::NameKind)Record[Idx++];
7646 switch (Kind) {
7647 case TemplateName::Template:
7648 return TemplateName(ReadDeclAs<TemplateDecl>(F, Record, Idx));
7649
7650 case TemplateName::OverloadedTemplate: {
7651 unsigned size = Record[Idx++];
7652 UnresolvedSet<8> Decls;
7653 while (size--)
7654 Decls.addDecl(ReadDeclAs<NamedDecl>(F, Record, Idx));
7655
7656 return Context.getOverloadedTemplateName(Decls.begin(), Decls.end());
7657 }
7658
7659 case TemplateName::QualifiedTemplate: {
7660 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
7661 bool hasTemplKeyword = Record[Idx++];
7662 TemplateDecl *Template = ReadDeclAs<TemplateDecl>(F, Record, Idx);
7663 return Context.getQualifiedTemplateName(NNS, hasTemplKeyword, Template);
7664 }
7665
7666 case TemplateName::DependentTemplate: {
7667 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
7668 if (Record[Idx++]) // isIdentifier
7669 return Context.getDependentTemplateName(NNS,
7670 GetIdentifierInfo(F, Record,
7671 Idx));
7672 return Context.getDependentTemplateName(NNS,
7673 (OverloadedOperatorKind)Record[Idx++]);
7674 }
7675
7676 case TemplateName::SubstTemplateTemplateParm: {
7677 TemplateTemplateParmDecl *param
7678 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
7679 if (!param) return TemplateName();
7680 TemplateName replacement = ReadTemplateName(F, Record, Idx);
7681 return Context.getSubstTemplateTemplateParm(param, replacement);
7682 }
7683
7684 case TemplateName::SubstTemplateTemplateParmPack: {
7685 TemplateTemplateParmDecl *Param
7686 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
7687 if (!Param)
7688 return TemplateName();
7689
7690 TemplateArgument ArgPack = ReadTemplateArgument(F, Record, Idx);
7691 if (ArgPack.getKind() != TemplateArgument::Pack)
7692 return TemplateName();
7693
7694 return Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
7695 }
7696 }
7697
7698 llvm_unreachable("Unhandled template name kind!");
7699}
7700
7701TemplateArgument
7702ASTReader::ReadTemplateArgument(ModuleFile &F,
7703 const RecordData &Record, unsigned &Idx) {
7704 TemplateArgument::ArgKind Kind = (TemplateArgument::ArgKind)Record[Idx++];
7705 switch (Kind) {
7706 case TemplateArgument::Null:
7707 return TemplateArgument();
7708 case TemplateArgument::Type:
7709 return TemplateArgument(readType(F, Record, Idx));
7710 case TemplateArgument::Declaration: {
7711 ValueDecl *D = ReadDeclAs<ValueDecl>(F, Record, Idx);
David Blaikie0f62c8d2014-10-16 04:21:25 +00007712 return TemplateArgument(D, readType(F, Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00007713 }
7714 case TemplateArgument::NullPtr:
7715 return TemplateArgument(readType(F, Record, Idx), /*isNullPtr*/true);
7716 case TemplateArgument::Integral: {
7717 llvm::APSInt Value = ReadAPSInt(Record, Idx);
7718 QualType T = readType(F, Record, Idx);
7719 return TemplateArgument(Context, Value, T);
7720 }
7721 case TemplateArgument::Template:
7722 return TemplateArgument(ReadTemplateName(F, Record, Idx));
7723 case TemplateArgument::TemplateExpansion: {
7724 TemplateName Name = ReadTemplateName(F, Record, Idx);
David Blaikie05785d12013-02-20 22:23:23 +00007725 Optional<unsigned> NumTemplateExpansions;
Guy Benyei11169dd2012-12-18 14:30:41 +00007726 if (unsigned NumExpansions = Record[Idx++])
7727 NumTemplateExpansions = NumExpansions - 1;
7728 return TemplateArgument(Name, NumTemplateExpansions);
7729 }
7730 case TemplateArgument::Expression:
7731 return TemplateArgument(ReadExpr(F));
7732 case TemplateArgument::Pack: {
7733 unsigned NumArgs = Record[Idx++];
7734 TemplateArgument *Args = new (Context) TemplateArgument[NumArgs];
7735 for (unsigned I = 0; I != NumArgs; ++I)
7736 Args[I] = ReadTemplateArgument(F, Record, Idx);
7737 return TemplateArgument(Args, NumArgs);
7738 }
7739 }
7740
7741 llvm_unreachable("Unhandled template argument kind!");
7742}
7743
7744TemplateParameterList *
7745ASTReader::ReadTemplateParameterList(ModuleFile &F,
7746 const RecordData &Record, unsigned &Idx) {
7747 SourceLocation TemplateLoc = ReadSourceLocation(F, Record, Idx);
7748 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Idx);
7749 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Idx);
7750
7751 unsigned NumParams = Record[Idx++];
7752 SmallVector<NamedDecl *, 16> Params;
7753 Params.reserve(NumParams);
7754 while (NumParams--)
7755 Params.push_back(ReadDeclAs<NamedDecl>(F, Record, Idx));
7756
7757 TemplateParameterList* TemplateParams =
7758 TemplateParameterList::Create(Context, TemplateLoc, LAngleLoc,
7759 Params.data(), Params.size(), RAngleLoc);
7760 return TemplateParams;
7761}
7762
7763void
7764ASTReader::
Craig Topper5603df42013-07-05 19:34:19 +00007765ReadTemplateArgumentList(SmallVectorImpl<TemplateArgument> &TemplArgs,
Guy Benyei11169dd2012-12-18 14:30:41 +00007766 ModuleFile &F, const RecordData &Record,
7767 unsigned &Idx) {
7768 unsigned NumTemplateArgs = Record[Idx++];
7769 TemplArgs.reserve(NumTemplateArgs);
7770 while (NumTemplateArgs--)
7771 TemplArgs.push_back(ReadTemplateArgument(F, Record, Idx));
7772}
7773
7774/// \brief Read a UnresolvedSet structure.
Richard Smitha4ba74c2013-08-30 04:46:40 +00007775void ASTReader::ReadUnresolvedSet(ModuleFile &F, LazyASTUnresolvedSet &Set,
Guy Benyei11169dd2012-12-18 14:30:41 +00007776 const RecordData &Record, unsigned &Idx) {
7777 unsigned NumDecls = Record[Idx++];
7778 Set.reserve(Context, NumDecls);
7779 while (NumDecls--) {
Richard Smitha4ba74c2013-08-30 04:46:40 +00007780 DeclID ID = ReadDeclID(F, Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00007781 AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
Richard Smitha4ba74c2013-08-30 04:46:40 +00007782 Set.addLazyDecl(Context, ID, AS);
Guy Benyei11169dd2012-12-18 14:30:41 +00007783 }
7784}
7785
7786CXXBaseSpecifier
7787ASTReader::ReadCXXBaseSpecifier(ModuleFile &F,
7788 const RecordData &Record, unsigned &Idx) {
7789 bool isVirtual = static_cast<bool>(Record[Idx++]);
7790 bool isBaseOfClass = static_cast<bool>(Record[Idx++]);
7791 AccessSpecifier AS = static_cast<AccessSpecifier>(Record[Idx++]);
7792 bool inheritConstructors = static_cast<bool>(Record[Idx++]);
7793 TypeSourceInfo *TInfo = GetTypeSourceInfo(F, Record, Idx);
7794 SourceRange Range = ReadSourceRange(F, Record, Idx);
7795 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Idx);
7796 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo,
7797 EllipsisLoc);
7798 Result.setInheritConstructors(inheritConstructors);
7799 return Result;
7800}
7801
7802std::pair<CXXCtorInitializer **, unsigned>
7803ASTReader::ReadCXXCtorInitializers(ModuleFile &F, const RecordData &Record,
7804 unsigned &Idx) {
Craig Toppera13603a2014-05-22 05:54:18 +00007805 CXXCtorInitializer **CtorInitializers = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007806 unsigned NumInitializers = Record[Idx++];
7807 if (NumInitializers) {
7808 CtorInitializers
7809 = new (Context) CXXCtorInitializer*[NumInitializers];
7810 for (unsigned i=0; i != NumInitializers; ++i) {
Craig Toppera13603a2014-05-22 05:54:18 +00007811 TypeSourceInfo *TInfo = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007812 bool IsBaseVirtual = false;
Craig Toppera13603a2014-05-22 05:54:18 +00007813 FieldDecl *Member = nullptr;
7814 IndirectFieldDecl *IndirectMember = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007815
7816 CtorInitializerType Type = (CtorInitializerType)Record[Idx++];
7817 switch (Type) {
7818 case CTOR_INITIALIZER_BASE:
7819 TInfo = GetTypeSourceInfo(F, Record, Idx);
7820 IsBaseVirtual = Record[Idx++];
7821 break;
7822
7823 case CTOR_INITIALIZER_DELEGATING:
7824 TInfo = GetTypeSourceInfo(F, Record, Idx);
7825 break;
7826
7827 case CTOR_INITIALIZER_MEMBER:
7828 Member = ReadDeclAs<FieldDecl>(F, Record, Idx);
7829 break;
7830
7831 case CTOR_INITIALIZER_INDIRECT_MEMBER:
7832 IndirectMember = ReadDeclAs<IndirectFieldDecl>(F, Record, Idx);
7833 break;
7834 }
7835
7836 SourceLocation MemberOrEllipsisLoc = ReadSourceLocation(F, Record, Idx);
7837 Expr *Init = ReadExpr(F);
7838 SourceLocation LParenLoc = ReadSourceLocation(F, Record, Idx);
7839 SourceLocation RParenLoc = ReadSourceLocation(F, Record, Idx);
7840 bool IsWritten = Record[Idx++];
7841 unsigned SourceOrderOrNumArrayIndices;
7842 SmallVector<VarDecl *, 8> Indices;
7843 if (IsWritten) {
7844 SourceOrderOrNumArrayIndices = Record[Idx++];
7845 } else {
7846 SourceOrderOrNumArrayIndices = Record[Idx++];
7847 Indices.reserve(SourceOrderOrNumArrayIndices);
7848 for (unsigned i=0; i != SourceOrderOrNumArrayIndices; ++i)
7849 Indices.push_back(ReadDeclAs<VarDecl>(F, Record, Idx));
7850 }
7851
7852 CXXCtorInitializer *BOMInit;
7853 if (Type == CTOR_INITIALIZER_BASE) {
7854 BOMInit = new (Context) CXXCtorInitializer(Context, TInfo, IsBaseVirtual,
7855 LParenLoc, Init, RParenLoc,
7856 MemberOrEllipsisLoc);
7857 } else if (Type == CTOR_INITIALIZER_DELEGATING) {
7858 BOMInit = new (Context) CXXCtorInitializer(Context, TInfo, LParenLoc,
7859 Init, RParenLoc);
7860 } else if (IsWritten) {
7861 if (Member)
7862 BOMInit = new (Context) CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc,
7863 LParenLoc, Init, RParenLoc);
7864 else
7865 BOMInit = new (Context) CXXCtorInitializer(Context, IndirectMember,
7866 MemberOrEllipsisLoc, LParenLoc,
7867 Init, RParenLoc);
7868 } else {
Argyrios Kyrtzidis794671d2013-05-30 23:59:46 +00007869 if (IndirectMember) {
7870 assert(Indices.empty() && "Indirect field improperly initialized");
7871 BOMInit = new (Context) CXXCtorInitializer(Context, IndirectMember,
7872 MemberOrEllipsisLoc, LParenLoc,
7873 Init, RParenLoc);
7874 } else {
7875 BOMInit = CXXCtorInitializer::Create(Context, Member, MemberOrEllipsisLoc,
7876 LParenLoc, Init, RParenLoc,
7877 Indices.data(), Indices.size());
7878 }
Guy Benyei11169dd2012-12-18 14:30:41 +00007879 }
7880
7881 if (IsWritten)
7882 BOMInit->setSourceOrder(SourceOrderOrNumArrayIndices);
7883 CtorInitializers[i] = BOMInit;
7884 }
7885 }
7886
7887 return std::make_pair(CtorInitializers, NumInitializers);
7888}
7889
7890NestedNameSpecifier *
7891ASTReader::ReadNestedNameSpecifier(ModuleFile &F,
7892 const RecordData &Record, unsigned &Idx) {
7893 unsigned N = Record[Idx++];
Craig Toppera13603a2014-05-22 05:54:18 +00007894 NestedNameSpecifier *NNS = nullptr, *Prev = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007895 for (unsigned I = 0; I != N; ++I) {
7896 NestedNameSpecifier::SpecifierKind Kind
7897 = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
7898 switch (Kind) {
7899 case NestedNameSpecifier::Identifier: {
7900 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
7901 NNS = NestedNameSpecifier::Create(Context, Prev, II);
7902 break;
7903 }
7904
7905 case NestedNameSpecifier::Namespace: {
7906 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
7907 NNS = NestedNameSpecifier::Create(Context, Prev, NS);
7908 break;
7909 }
7910
7911 case NestedNameSpecifier::NamespaceAlias: {
7912 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
7913 NNS = NestedNameSpecifier::Create(Context, Prev, Alias);
7914 break;
7915 }
7916
7917 case NestedNameSpecifier::TypeSpec:
7918 case NestedNameSpecifier::TypeSpecWithTemplate: {
7919 const Type *T = readType(F, Record, Idx).getTypePtrOrNull();
7920 if (!T)
Craig Toppera13603a2014-05-22 05:54:18 +00007921 return nullptr;
7922
Guy Benyei11169dd2012-12-18 14:30:41 +00007923 bool Template = Record[Idx++];
7924 NNS = NestedNameSpecifier::Create(Context, Prev, Template, T);
7925 break;
7926 }
7927
7928 case NestedNameSpecifier::Global: {
7929 NNS = NestedNameSpecifier::GlobalSpecifier(Context);
7930 // No associated value, and there can't be a prefix.
7931 break;
7932 }
Nikola Smiljanic67860242014-09-26 00:28:20 +00007933
7934 case NestedNameSpecifier::Super: {
7935 CXXRecordDecl *RD = ReadDeclAs<CXXRecordDecl>(F, Record, Idx);
7936 NNS = NestedNameSpecifier::SuperSpecifier(Context, RD);
7937 break;
7938 }
Guy Benyei11169dd2012-12-18 14:30:41 +00007939 }
7940 Prev = NNS;
7941 }
7942 return NNS;
7943}
7944
7945NestedNameSpecifierLoc
7946ASTReader::ReadNestedNameSpecifierLoc(ModuleFile &F, const RecordData &Record,
7947 unsigned &Idx) {
7948 unsigned N = Record[Idx++];
7949 NestedNameSpecifierLocBuilder Builder;
7950 for (unsigned I = 0; I != N; ++I) {
7951 NestedNameSpecifier::SpecifierKind Kind
7952 = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
7953 switch (Kind) {
7954 case NestedNameSpecifier::Identifier: {
7955 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
7956 SourceRange Range = ReadSourceRange(F, Record, Idx);
7957 Builder.Extend(Context, II, Range.getBegin(), Range.getEnd());
7958 break;
7959 }
7960
7961 case NestedNameSpecifier::Namespace: {
7962 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
7963 SourceRange Range = ReadSourceRange(F, Record, Idx);
7964 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
7965 break;
7966 }
7967
7968 case NestedNameSpecifier::NamespaceAlias: {
7969 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
7970 SourceRange Range = ReadSourceRange(F, Record, Idx);
7971 Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd());
7972 break;
7973 }
7974
7975 case NestedNameSpecifier::TypeSpec:
7976 case NestedNameSpecifier::TypeSpecWithTemplate: {
7977 bool Template = Record[Idx++];
7978 TypeSourceInfo *T = GetTypeSourceInfo(F, Record, Idx);
7979 if (!T)
7980 return NestedNameSpecifierLoc();
7981 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
7982
7983 // FIXME: 'template' keyword location not saved anywhere, so we fake it.
7984 Builder.Extend(Context,
7985 Template? T->getTypeLoc().getBeginLoc() : SourceLocation(),
7986 T->getTypeLoc(), ColonColonLoc);
7987 break;
7988 }
7989
7990 case NestedNameSpecifier::Global: {
7991 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
7992 Builder.MakeGlobal(Context, ColonColonLoc);
7993 break;
7994 }
Nikola Smiljanic67860242014-09-26 00:28:20 +00007995
7996 case NestedNameSpecifier::Super: {
7997 CXXRecordDecl *RD = ReadDeclAs<CXXRecordDecl>(F, Record, Idx);
7998 SourceRange Range = ReadSourceRange(F, Record, Idx);
7999 Builder.MakeSuper(Context, RD, Range.getBegin(), Range.getEnd());
8000 break;
8001 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008002 }
8003 }
Nikola Smiljanic67860242014-09-26 00:28:20 +00008004
Guy Benyei11169dd2012-12-18 14:30:41 +00008005 return Builder.getWithLocInContext(Context);
8006}
8007
8008SourceRange
8009ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record,
8010 unsigned &Idx) {
8011 SourceLocation beg = ReadSourceLocation(F, Record, Idx);
8012 SourceLocation end = ReadSourceLocation(F, Record, Idx);
8013 return SourceRange(beg, end);
8014}
8015
8016/// \brief Read an integral value
8017llvm::APInt ASTReader::ReadAPInt(const RecordData &Record, unsigned &Idx) {
8018 unsigned BitWidth = Record[Idx++];
8019 unsigned NumWords = llvm::APInt::getNumWords(BitWidth);
8020 llvm::APInt Result(BitWidth, NumWords, &Record[Idx]);
8021 Idx += NumWords;
8022 return Result;
8023}
8024
8025/// \brief Read a signed integral value
8026llvm::APSInt ASTReader::ReadAPSInt(const RecordData &Record, unsigned &Idx) {
8027 bool isUnsigned = Record[Idx++];
8028 return llvm::APSInt(ReadAPInt(Record, Idx), isUnsigned);
8029}
8030
8031/// \brief Read a floating-point value
Tim Northover178723a2013-01-22 09:46:51 +00008032llvm::APFloat ASTReader::ReadAPFloat(const RecordData &Record,
8033 const llvm::fltSemantics &Sem,
8034 unsigned &Idx) {
8035 return llvm::APFloat(Sem, ReadAPInt(Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00008036}
8037
8038// \brief Read a string
8039std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) {
8040 unsigned Len = Record[Idx++];
8041 std::string Result(Record.data() + Idx, Record.data() + Idx + Len);
8042 Idx += Len;
8043 return Result;
8044}
8045
8046VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record,
8047 unsigned &Idx) {
8048 unsigned Major = Record[Idx++];
8049 unsigned Minor = Record[Idx++];
8050 unsigned Subminor = Record[Idx++];
8051 if (Minor == 0)
8052 return VersionTuple(Major);
8053 if (Subminor == 0)
8054 return VersionTuple(Major, Minor - 1);
8055 return VersionTuple(Major, Minor - 1, Subminor - 1);
8056}
8057
8058CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F,
8059 const RecordData &Record,
8060 unsigned &Idx) {
8061 CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx);
8062 return CXXTemporary::Create(Context, Decl);
8063}
8064
8065DiagnosticBuilder ASTReader::Diag(unsigned DiagID) {
Argyrios Kyrtzidisdc9fdaf2013-05-24 05:44:08 +00008066 return Diag(CurrentImportLoc, DiagID);
Guy Benyei11169dd2012-12-18 14:30:41 +00008067}
8068
8069DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) {
8070 return Diags.Report(Loc, DiagID);
8071}
8072
8073/// \brief Retrieve the identifier table associated with the
8074/// preprocessor.
8075IdentifierTable &ASTReader::getIdentifierTable() {
8076 return PP.getIdentifierTable();
8077}
8078
8079/// \brief Record that the given ID maps to the given switch-case
8080/// statement.
8081void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) {
Craig Toppera13603a2014-05-22 05:54:18 +00008082 assert((*CurrSwitchCaseStmts)[ID] == nullptr &&
Guy Benyei11169dd2012-12-18 14:30:41 +00008083 "Already have a SwitchCase with this ID");
8084 (*CurrSwitchCaseStmts)[ID] = SC;
8085}
8086
8087/// \brief Retrieve the switch-case statement with the given ID.
8088SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) {
Craig Toppera13603a2014-05-22 05:54:18 +00008089 assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID");
Guy Benyei11169dd2012-12-18 14:30:41 +00008090 return (*CurrSwitchCaseStmts)[ID];
8091}
8092
8093void ASTReader::ClearSwitchCaseIDs() {
8094 CurrSwitchCaseStmts->clear();
8095}
8096
8097void ASTReader::ReadComments() {
8098 std::vector<RawComment *> Comments;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00008099 for (SmallVectorImpl<std::pair<BitstreamCursor,
Guy Benyei11169dd2012-12-18 14:30:41 +00008100 serialization::ModuleFile *> >::iterator
8101 I = CommentsCursors.begin(),
8102 E = CommentsCursors.end();
8103 I != E; ++I) {
Dmitri Gribenko9ee0e302014-03-27 15:40:39 +00008104 Comments.clear();
Chris Lattner7fb3bef2013-01-20 00:56:42 +00008105 BitstreamCursor &Cursor = I->first;
Guy Benyei11169dd2012-12-18 14:30:41 +00008106 serialization::ModuleFile &F = *I->second;
8107 SavedStreamPosition SavedPosition(Cursor);
8108
8109 RecordData Record;
8110 while (true) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00008111 llvm::BitstreamEntry Entry =
8112 Cursor.advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd);
Dmitri Gribenko9ee0e302014-03-27 15:40:39 +00008113
Chris Lattner7fb3bef2013-01-20 00:56:42 +00008114 switch (Entry.Kind) {
8115 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
8116 case llvm::BitstreamEntry::Error:
8117 Error("malformed block record in AST file");
8118 return;
8119 case llvm::BitstreamEntry::EndBlock:
8120 goto NextCursor;
8121 case llvm::BitstreamEntry::Record:
8122 // The interesting case.
Guy Benyei11169dd2012-12-18 14:30:41 +00008123 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00008124 }
8125
8126 // Read a record.
8127 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00008128 switch ((CommentRecordTypes)Cursor.readRecord(Entry.ID, Record)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008129 case COMMENTS_RAW_COMMENT: {
8130 unsigned Idx = 0;
8131 SourceRange SR = ReadSourceRange(F, Record, Idx);
8132 RawComment::CommentKind Kind =
8133 (RawComment::CommentKind) Record[Idx++];
8134 bool IsTrailingComment = Record[Idx++];
8135 bool IsAlmostTrailingComment = Record[Idx++];
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00008136 Comments.push_back(new (Context) RawComment(
8137 SR, Kind, IsTrailingComment, IsAlmostTrailingComment,
8138 Context.getLangOpts().CommentOpts.ParseAllComments));
Guy Benyei11169dd2012-12-18 14:30:41 +00008139 break;
8140 }
8141 }
8142 }
Dmitri Gribenko9ee0e302014-03-27 15:40:39 +00008143 NextCursor:
8144 Context.Comments.addDeserializedComments(Comments);
Guy Benyei11169dd2012-12-18 14:30:41 +00008145 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008146}
8147
Richard Smithcd45dbc2014-04-19 03:48:30 +00008148std::string ASTReader::getOwningModuleNameForDiagnostic(const Decl *D) {
8149 // If we know the owning module, use it.
8150 if (Module *M = D->getOwningModule())
8151 return M->getFullModuleName();
8152
8153 // Otherwise, use the name of the top-level module the decl is within.
8154 if (ModuleFile *M = getOwningModuleFile(D))
8155 return M->ModuleName;
8156
8157 // Not from a module.
8158 return "";
8159}
8160
Guy Benyei11169dd2012-12-18 14:30:41 +00008161void ASTReader::finishPendingActions() {
Richard Smith851072e2014-05-19 20:59:20 +00008162 while (!PendingIdentifierInfos.empty() ||
8163 !PendingIncompleteDeclChains.empty() || !PendingDeclChains.empty() ||
Richard Smith2b9e3e32013-10-18 06:05:18 +00008164 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() ||
Richard Smitha0ce9c42014-07-29 23:23:27 +00008165 !PendingUpdateRecords.empty()) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008166 // If any identifiers with corresponding top-level declarations have
8167 // been loaded, load those declarations now.
Craig Topper79be4cd2013-07-05 04:33:53 +00008168 typedef llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2> >
8169 TopLevelDeclsMap;
8170 TopLevelDeclsMap TopLevelDecls;
8171
Guy Benyei11169dd2012-12-18 14:30:41 +00008172 while (!PendingIdentifierInfos.empty()) {
Douglas Gregor6168bd22013-02-18 15:53:43 +00008173 IdentifierInfo *II = PendingIdentifierInfos.back().first;
Richard Smithf0ae3c2d2014-03-28 17:31:23 +00008174 SmallVector<uint32_t, 4> DeclIDs =
8175 std::move(PendingIdentifierInfos.back().second);
Douglas Gregorcb15f082013-02-19 18:26:28 +00008176 PendingIdentifierInfos.pop_back();
Douglas Gregor6168bd22013-02-18 15:53:43 +00008177
8178 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]);
Guy Benyei11169dd2012-12-18 14:30:41 +00008179 }
Richard Smithf0ae3c2d2014-03-28 17:31:23 +00008180
Richard Smith851072e2014-05-19 20:59:20 +00008181 // For each decl chain that we wanted to complete while deserializing, mark
8182 // it as "still needs to be completed".
8183 for (unsigned I = 0; I != PendingIncompleteDeclChains.size(); ++I) {
8184 markIncompleteDeclChain(PendingIncompleteDeclChains[I]);
8185 }
8186 PendingIncompleteDeclChains.clear();
8187
Guy Benyei11169dd2012-12-18 14:30:41 +00008188 // Load pending declaration chains.
8189 for (unsigned I = 0; I != PendingDeclChains.size(); ++I) {
8190 loadPendingDeclChain(PendingDeclChains[I]);
8191 PendingDeclChainsKnown.erase(PendingDeclChains[I]);
8192 }
8193 PendingDeclChains.clear();
8194
Douglas Gregor6168bd22013-02-18 15:53:43 +00008195 // Make the most recent of the top-level declarations visible.
Craig Topper79be4cd2013-07-05 04:33:53 +00008196 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
8197 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
Douglas Gregor6168bd22013-02-18 15:53:43 +00008198 IdentifierInfo *II = TLD->first;
8199 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
Argyrios Kyrtzidise5edbf92013-04-26 21:33:35 +00008200 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II);
Douglas Gregor6168bd22013-02-18 15:53:43 +00008201 }
8202 }
8203
Guy Benyei11169dd2012-12-18 14:30:41 +00008204 // Load any pending macro definitions.
8205 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008206 IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
8207 SmallVector<PendingMacroInfo, 2> GlobalIDs;
8208 GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
8209 // Initialize the macro history from chained-PCHs ahead of module imports.
Richard Smith49f906a2014-03-01 00:08:04 +00008210 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
Argyrios Kyrtzidis719736c2013-01-19 03:14:56 +00008211 ++IDIdx) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008212 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
Richard Smithe842a472014-10-22 02:05:46 +00008213 if (Info.M->Kind != MK_ImplicitModule &&
8214 Info.M->Kind != MK_ExplicitModule)
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008215 resolvePendingMacro(II, Info);
8216 }
8217 // Handle module imports.
Richard Smith49f906a2014-03-01 00:08:04 +00008218 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008219 ++IDIdx) {
8220 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
Richard Smithe842a472014-10-22 02:05:46 +00008221 if (Info.M->Kind == MK_ImplicitModule ||
8222 Info.M->Kind == MK_ExplicitModule)
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008223 resolvePendingMacro(II, Info);
Guy Benyei11169dd2012-12-18 14:30:41 +00008224 }
8225 }
8226 PendingMacroIDs.clear();
Argyrios Kyrtzidis83a6e3b2013-02-16 00:48:59 +00008227
8228 // Wire up the DeclContexts for Decls that we delayed setting until
8229 // recursive loading is completed.
8230 while (!PendingDeclContextInfos.empty()) {
8231 PendingDeclContextInfo Info = PendingDeclContextInfos.front();
8232 PendingDeclContextInfos.pop_front();
8233 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC));
8234 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC));
8235 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext());
8236 }
Richard Smith2b9e3e32013-10-18 06:05:18 +00008237
Richard Smithd1c46742014-04-30 02:24:17 +00008238 // Perform any pending declaration updates.
Richard Smithd6db68c2014-08-07 20:58:41 +00008239 while (!PendingUpdateRecords.empty()) {
Richard Smithd1c46742014-04-30 02:24:17 +00008240 auto Update = PendingUpdateRecords.pop_back_val();
8241 ReadingKindTracker ReadingKind(Read_Decl, *this);
8242 loadDeclUpdateRecords(Update.first, Update.second);
8243 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008244 }
8245
8246 // If we deserialized any C++ or Objective-C class definitions, any
8247 // Objective-C protocol definitions, or any redeclarable templates, make sure
8248 // that all redeclarations point to the definitions. Note that this can only
8249 // happen now, after the redeclaration chains have been fully wired.
Craig Topperc6914d02014-08-25 04:15:02 +00008250 for (Decl *D : PendingDefinitions) {
8251 if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
Richard Smith5b21db82014-04-23 18:20:42 +00008252 if (const TagType *TagT = dyn_cast<TagType>(TD->getTypeForDecl())) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008253 // Make sure that the TagType points at the definition.
8254 const_cast<TagType*>(TagT)->decl = TD;
8255 }
8256
Craig Topperc6914d02014-08-25 04:15:02 +00008257 if (auto RD = dyn_cast<CXXRecordDecl>(D)) {
Richard Smith2c381642014-08-27 23:11:59 +00008258 for (auto R : RD->redecls()) {
8259 assert((R == D) == R->isThisDeclarationADefinition() &&
8260 "declaration thinks it's the definition but it isn't");
Aaron Ballman86c93902014-03-06 23:45:36 +00008261 cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData;
Richard Smith2c381642014-08-27 23:11:59 +00008262 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008263 }
8264
8265 continue;
8266 }
8267
Craig Topperc6914d02014-08-25 04:15:02 +00008268 if (auto ID = dyn_cast<ObjCInterfaceDecl>(D)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008269 // Make sure that the ObjCInterfaceType points at the definition.
8270 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl))
8271 ->Decl = ID;
8272
Aaron Ballman86c93902014-03-06 23:45:36 +00008273 for (auto R : ID->redecls())
Guy Benyei11169dd2012-12-18 14:30:41 +00008274 R->Data = ID->Data;
8275
8276 continue;
8277 }
8278
Craig Topperc6914d02014-08-25 04:15:02 +00008279 if (auto PD = dyn_cast<ObjCProtocolDecl>(D)) {
Aaron Ballman86c93902014-03-06 23:45:36 +00008280 for (auto R : PD->redecls())
Guy Benyei11169dd2012-12-18 14:30:41 +00008281 R->Data = PD->Data;
8282
8283 continue;
8284 }
8285
Craig Topperc6914d02014-08-25 04:15:02 +00008286 auto RTD = cast<RedeclarableTemplateDecl>(D)->getCanonicalDecl();
Aaron Ballman86c93902014-03-06 23:45:36 +00008287 for (auto R : RTD->redecls())
Guy Benyei11169dd2012-12-18 14:30:41 +00008288 R->Common = RTD->Common;
8289 }
8290 PendingDefinitions.clear();
8291
8292 // Load the bodies of any functions or methods we've encountered. We do
8293 // this now (delayed) so that we can be sure that the declaration chains
8294 // have been fully wired up.
8295 for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
8296 PBEnd = PendingBodies.end();
8297 PB != PBEnd; ++PB) {
8298 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
8299 // FIXME: Check for =delete/=default?
8300 // FIXME: Complain about ODR violations here?
8301 if (!getContext().getLangOpts().Modules || !FD->hasBody())
8302 FD->setLazyBody(PB->second);
8303 continue;
8304 }
8305
8306 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first);
8307 if (!getContext().getLangOpts().Modules || !MD->hasBody())
8308 MD->setLazyBody(PB->second);
8309 }
8310 PendingBodies.clear();
Richard Smitha0ce9c42014-07-29 23:23:27 +00008311}
8312
8313void ASTReader::diagnoseOdrViolations() {
Richard Smithbb853c72014-08-13 01:23:33 +00008314 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty())
8315 return;
8316
Richard Smitha0ce9c42014-07-29 23:23:27 +00008317 // Trigger the import of the full definition of each class that had any
8318 // odr-merging problems, so we can produce better diagnostics for them.
Richard Smithbb853c72014-08-13 01:23:33 +00008319 // These updates may in turn find and diagnose some ODR failures, so take
8320 // ownership of the set first.
8321 auto OdrMergeFailures = std::move(PendingOdrMergeFailures);
8322 PendingOdrMergeFailures.clear();
8323 for (auto &Merge : OdrMergeFailures) {
Richard Smitha0ce9c42014-07-29 23:23:27 +00008324 Merge.first->buildLookup();
8325 Merge.first->decls_begin();
8326 Merge.first->bases_begin();
8327 Merge.first->vbases_begin();
8328 for (auto *RD : Merge.second) {
8329 RD->decls_begin();
8330 RD->bases_begin();
8331 RD->vbases_begin();
8332 }
8333 }
8334
8335 // For each declaration from a merged context, check that the canonical
8336 // definition of that context also contains a declaration of the same
8337 // entity.
8338 //
8339 // Caution: this loop does things that might invalidate iterators into
8340 // PendingOdrMergeChecks. Don't turn this into a range-based for loop!
8341 while (!PendingOdrMergeChecks.empty()) {
8342 NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
8343
8344 // FIXME: Skip over implicit declarations for now. This matters for things
8345 // like implicitly-declared special member functions. This isn't entirely
8346 // correct; we can end up with multiple unmerged declarations of the same
8347 // implicit entity.
8348 if (D->isImplicit())
8349 continue;
8350
8351 DeclContext *CanonDef = D->getDeclContext();
Richard Smitha0ce9c42014-07-29 23:23:27 +00008352
8353 bool Found = false;
8354 const Decl *DCanon = D->getCanonicalDecl();
8355
Richard Smith01bdb7a2014-08-28 05:44:07 +00008356 for (auto RI : D->redecls()) {
8357 if (RI->getLexicalDeclContext() == CanonDef) {
8358 Found = true;
8359 break;
8360 }
8361 }
8362 if (Found)
8363 continue;
8364
Richard Smitha0ce9c42014-07-29 23:23:27 +00008365 llvm::SmallVector<const NamedDecl*, 4> Candidates;
Richard Smith01bdb7a2014-08-28 05:44:07 +00008366 DeclContext::lookup_result R = CanonDef->lookup(D->getDeclName());
Richard Smitha0ce9c42014-07-29 23:23:27 +00008367 for (DeclContext::lookup_iterator I = R.begin(), E = R.end();
8368 !Found && I != E; ++I) {
8369 for (auto RI : (*I)->redecls()) {
8370 if (RI->getLexicalDeclContext() == CanonDef) {
8371 // This declaration is present in the canonical definition. If it's
8372 // in the same redecl chain, it's the one we're looking for.
8373 if (RI->getCanonicalDecl() == DCanon)
8374 Found = true;
8375 else
8376 Candidates.push_back(cast<NamedDecl>(RI));
8377 break;
8378 }
8379 }
8380 }
8381
8382 if (!Found) {
Richard Smithd08aeb62014-08-28 01:33:39 +00008383 // The AST doesn't like TagDecls becoming invalid after they've been
8384 // completed. We only really need to mark FieldDecls as invalid here.
8385 if (!isa<TagDecl>(D))
8386 D->setInvalidDecl();
Richard Smitha0ce9c42014-07-29 23:23:27 +00008387
8388 std::string CanonDefModule =
8389 getOwningModuleNameForDiagnostic(cast<Decl>(CanonDef));
8390 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl)
8391 << D << getOwningModuleNameForDiagnostic(D)
8392 << CanonDef << CanonDefModule.empty() << CanonDefModule;
8393
8394 if (Candidates.empty())
8395 Diag(cast<Decl>(CanonDef)->getLocation(),
8396 diag::note_module_odr_violation_no_possible_decls) << D;
8397 else {
8398 for (unsigned I = 0, N = Candidates.size(); I != N; ++I)
8399 Diag(Candidates[I]->getLocation(),
8400 diag::note_module_odr_violation_possible_decl)
8401 << Candidates[I];
8402 }
8403
8404 DiagnosedOdrMergeFailures.insert(CanonDef);
8405 }
8406 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00008407
8408 // Issue any pending ODR-failure diagnostics.
Richard Smithbb853c72014-08-13 01:23:33 +00008409 for (auto &Merge : OdrMergeFailures) {
Richard Smitha0ce9c42014-07-29 23:23:27 +00008410 // If we've already pointed out a specific problem with this class, don't
8411 // bother issuing a general "something's different" diagnostic.
Richard Smithcd45dbc2014-04-19 03:48:30 +00008412 if (!DiagnosedOdrMergeFailures.insert(Merge.first))
8413 continue;
8414
8415 bool Diagnosed = false;
8416 for (auto *RD : Merge.second) {
8417 // Multiple different declarations got merged together; tell the user
8418 // where they came from.
8419 if (Merge.first != RD) {
8420 // FIXME: Walk the definition, figure out what's different,
8421 // and diagnose that.
8422 if (!Diagnosed) {
8423 std::string Module = getOwningModuleNameForDiagnostic(Merge.first);
8424 Diag(Merge.first->getLocation(),
8425 diag::err_module_odr_violation_different_definitions)
8426 << Merge.first << Module.empty() << Module;
8427 Diagnosed = true;
8428 }
8429
8430 Diag(RD->getLocation(),
8431 diag::note_module_odr_violation_different_definitions)
8432 << getOwningModuleNameForDiagnostic(RD);
8433 }
8434 }
8435
8436 if (!Diagnosed) {
8437 // All definitions are updates to the same declaration. This happens if a
8438 // module instantiates the declaration of a class template specialization
8439 // and two or more other modules instantiate its definition.
8440 //
8441 // FIXME: Indicate which modules had instantiations of this definition.
8442 // FIXME: How can this even happen?
8443 Diag(Merge.first->getLocation(),
8444 diag::err_module_odr_violation_different_instantiations)
8445 << Merge.first;
8446 }
8447 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008448}
8449
8450void ASTReader::FinishedDeserializing() {
8451 assert(NumCurrentElementsDeserializing &&
8452 "FinishedDeserializing not paired with StartedDeserializing");
8453 if (NumCurrentElementsDeserializing == 1) {
8454 // We decrease NumCurrentElementsDeserializing only after pending actions
8455 // are finished, to avoid recursively re-calling finishPendingActions().
8456 finishPendingActions();
8457 }
8458 --NumCurrentElementsDeserializing;
8459
Richard Smitha0ce9c42014-07-29 23:23:27 +00008460 if (NumCurrentElementsDeserializing == 0) {
8461 diagnoseOdrViolations();
8462
Richard Smith04d05b52014-03-23 00:27:18 +00008463 // We are not in recursive loading, so it's safe to pass the "interesting"
8464 // decls to the consumer.
Richard Smitha0ce9c42014-07-29 23:23:27 +00008465 if (Consumer)
8466 PassInterestingDeclsToConsumer();
Guy Benyei11169dd2012-12-18 14:30:41 +00008467 }
8468}
8469
Argyrios Kyrtzidise5edbf92013-04-26 21:33:35 +00008470void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) {
Rafael Espindola7b56f6c2013-10-19 16:55:03 +00008471 D = D->getMostRecentDecl();
Argyrios Kyrtzidise5edbf92013-04-26 21:33:35 +00008472
8473 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
8474 SemaObj->TUScope->AddDecl(D);
8475 } else if (SemaObj->TUScope) {
8476 // Adding the decl to IdResolver may have failed because it was already in
8477 // (even though it was not added in scope). If it is already in, make sure
8478 // it gets in the scope as well.
8479 if (std::find(SemaObj->IdResolver.begin(Name),
8480 SemaObj->IdResolver.end(), D) != SemaObj->IdResolver.end())
8481 SemaObj->TUScope->AddDecl(D);
8482 }
8483}
8484
Nico Weber824285e2014-05-08 04:26:47 +00008485ASTReader::ASTReader(Preprocessor &PP, ASTContext &Context, StringRef isysroot,
8486 bool DisableValidation, bool AllowASTWithCompilerErrors,
8487 bool AllowConfigurationMismatch, bool ValidateSystemInputs,
Ben Langmuir2cb4a782014-02-05 22:21:15 +00008488 bool UseGlobalIndex)
Craig Toppera13603a2014-05-22 05:54:18 +00008489 : Listener(new PCHValidator(PP, *this)), DeserializationListener(nullptr),
Nico Weber824285e2014-05-08 04:26:47 +00008490 OwnsDeserializationListener(false), SourceMgr(PP.getSourceManager()),
Craig Toppera13603a2014-05-22 05:54:18 +00008491 FileMgr(PP.getFileManager()), Diags(PP.getDiagnostics()),
8492 SemaObj(nullptr), PP(PP), Context(Context), Consumer(nullptr),
8493 ModuleMgr(PP.getFileManager()), isysroot(isysroot),
8494 DisableValidation(DisableValidation),
Nico Weber824285e2014-05-08 04:26:47 +00008495 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
8496 AllowConfigurationMismatch(AllowConfigurationMismatch),
8497 ValidateSystemInputs(ValidateSystemInputs),
8498 UseGlobalIndex(UseGlobalIndex), TriedLoadingGlobalIndex(false),
Richard Smith053f6c62014-05-16 23:01:30 +00008499 CurrSwitchCaseStmts(&SwitchCaseStmts),
Nico Weber824285e2014-05-08 04:26:47 +00008500 NumSLocEntriesRead(0), TotalNumSLocEntries(0), NumStatementsRead(0),
8501 TotalNumStatements(0), NumMacrosRead(0), TotalNumMacros(0),
8502 NumIdentifierLookups(0), NumIdentifierLookupHits(0), NumSelectorsRead(0),
8503 NumMethodPoolEntriesRead(0), NumMethodPoolLookups(0),
8504 NumMethodPoolHits(0), NumMethodPoolTableLookups(0),
8505 NumMethodPoolTableHits(0), TotalNumMethodPoolEntries(0),
8506 NumLexicalDeclContextsRead(0), TotalLexicalDeclContexts(0),
8507 NumVisibleDeclContextsRead(0), TotalVisibleDeclContexts(0),
8508 TotalModulesSizeInBits(0), NumCurrentElementsDeserializing(0),
8509 PassingDeclsToConsumer(false), NumCXXBaseSpecifiersLoaded(0),
8510 ReadingKind(Read_None) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008511 SourceMgr.setExternalSLocEntrySource(this);
8512}
8513
8514ASTReader::~ASTReader() {
Nico Weber824285e2014-05-08 04:26:47 +00008515 if (OwnsDeserializationListener)
8516 delete DeserializationListener;
8517
Guy Benyei11169dd2012-12-18 14:30:41 +00008518 for (DeclContextVisibleUpdatesPending::iterator
8519 I = PendingVisibleUpdates.begin(),
8520 E = PendingVisibleUpdates.end();
8521 I != E; ++I) {
8522 for (DeclContextVisibleUpdates::iterator J = I->second.begin(),
8523 F = I->second.end();
8524 J != F; ++J)
8525 delete J->first;
8526 }
8527}