blob: d26ed222b3ac8889793a9294536fbdc0397a624c [file] [log] [blame]
Richard Smith9e2341d2015-03-23 03:25:59 +00001//===-- ASTReader.cpp - AST File Reader ----------------------------------===//
Guy Benyei11169dd2012-12-18 14:30:41 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines the ASTReader class, which reads AST files.
11//
12//===----------------------------------------------------------------------===//
13
14#include "clang/Serialization/ASTReader.h"
15#include "ASTCommon.h"
16#include "ASTReaderInternals.h"
17#include "clang/AST/ASTConsumer.h"
18#include "clang/AST/ASTContext.h"
19#include "clang/AST/DeclTemplate.h"
20#include "clang/AST/Expr.h"
21#include "clang/AST/ExprCXX.h"
22#include "clang/AST/NestedNameSpecifier.h"
23#include "clang/AST/Type.h"
24#include "clang/AST/TypeLocVisitor.h"
Benjamin Kramerf3ca26982014-05-10 16:31:55 +000025#include "clang/Basic/DiagnosticOptions.h"
Guy Benyei11169dd2012-12-18 14:30:41 +000026#include "clang/Basic/FileManager.h"
Guy Benyei11169dd2012-12-18 14:30:41 +000027#include "clang/Basic/SourceManager.h"
28#include "clang/Basic/SourceManagerInternals.h"
29#include "clang/Basic/TargetInfo.h"
30#include "clang/Basic/TargetOptions.h"
31#include "clang/Basic/Version.h"
32#include "clang/Basic/VersionTuple.h"
Ben Langmuirb92de022014-04-29 16:25:26 +000033#include "clang/Frontend/Utils.h"
Guy Benyei11169dd2012-12-18 14:30:41 +000034#include "clang/Lex/HeaderSearch.h"
35#include "clang/Lex/HeaderSearchOptions.h"
36#include "clang/Lex/MacroInfo.h"
37#include "clang/Lex/PreprocessingRecord.h"
38#include "clang/Lex/Preprocessor.h"
39#include "clang/Lex/PreprocessorOptions.h"
40#include "clang/Sema/Scope.h"
41#include "clang/Sema/Sema.h"
42#include "clang/Serialization/ASTDeserializationListener.h"
Douglas Gregore060e572013-01-25 01:03:03 +000043#include "clang/Serialization/GlobalModuleIndex.h"
Guy Benyei11169dd2012-12-18 14:30:41 +000044#include "clang/Serialization/ModuleManager.h"
45#include "clang/Serialization/SerializationDiagnostic.h"
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +000046#include "llvm/ADT/Hashing.h"
Guy Benyei11169dd2012-12-18 14:30:41 +000047#include "llvm/ADT/StringExtras.h"
48#include "llvm/Bitcode/BitstreamReader.h"
49#include "llvm/Support/ErrorHandling.h"
50#include "llvm/Support/FileSystem.h"
51#include "llvm/Support/MemoryBuffer.h"
52#include "llvm/Support/Path.h"
53#include "llvm/Support/SaveAndRestore.h"
Dmitri Gribenkof430da42014-02-12 10:33:14 +000054#include "llvm/Support/raw_ostream.h"
Guy Benyei11169dd2012-12-18 14:30:41 +000055#include <algorithm>
Chris Lattner91f373e2013-01-20 00:57:52 +000056#include <cstdio>
Guy Benyei11169dd2012-12-18 14:30:41 +000057#include <iterator>
Rafael Espindola8a8e5542014-06-12 17:19:42 +000058#include <system_error>
Guy Benyei11169dd2012-12-18 14:30:41 +000059
60using namespace clang;
61using namespace clang::serialization;
62using namespace clang::serialization::reader;
Chris Lattner7fb3bef2013-01-20 00:56:42 +000063using llvm::BitstreamCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +000064
Ben Langmuircb69b572014-03-07 06:40:32 +000065
66//===----------------------------------------------------------------------===//
67// ChainedASTReaderListener implementation
68//===----------------------------------------------------------------------===//
69
70bool
71ChainedASTReaderListener::ReadFullVersionInformation(StringRef FullVersion) {
72 return First->ReadFullVersionInformation(FullVersion) ||
73 Second->ReadFullVersionInformation(FullVersion);
74}
Ben Langmuir4f5212a2014-04-14 22:12:44 +000075void ChainedASTReaderListener::ReadModuleName(StringRef ModuleName) {
76 First->ReadModuleName(ModuleName);
77 Second->ReadModuleName(ModuleName);
78}
79void ChainedASTReaderListener::ReadModuleMapFile(StringRef ModuleMapPath) {
80 First->ReadModuleMapFile(ModuleMapPath);
81 Second->ReadModuleMapFile(ModuleMapPath);
82}
Richard Smith1e2cf0d2014-10-31 02:28:58 +000083bool
84ChainedASTReaderListener::ReadLanguageOptions(const LangOptions &LangOpts,
85 bool Complain,
86 bool AllowCompatibleDifferences) {
87 return First->ReadLanguageOptions(LangOpts, Complain,
88 AllowCompatibleDifferences) ||
89 Second->ReadLanguageOptions(LangOpts, Complain,
90 AllowCompatibleDifferences);
Ben Langmuircb69b572014-03-07 06:40:32 +000091}
Chandler Carruth0d745bc2015-03-14 04:47:43 +000092bool ChainedASTReaderListener::ReadTargetOptions(
93 const TargetOptions &TargetOpts, bool Complain,
94 bool AllowCompatibleDifferences) {
95 return First->ReadTargetOptions(TargetOpts, Complain,
96 AllowCompatibleDifferences) ||
97 Second->ReadTargetOptions(TargetOpts, Complain,
98 AllowCompatibleDifferences);
Ben Langmuircb69b572014-03-07 06:40:32 +000099}
100bool ChainedASTReaderListener::ReadDiagnosticOptions(
Ben Langmuirb92de022014-04-29 16:25:26 +0000101 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) {
Ben Langmuircb69b572014-03-07 06:40:32 +0000102 return First->ReadDiagnosticOptions(DiagOpts, Complain) ||
103 Second->ReadDiagnosticOptions(DiagOpts, Complain);
104}
105bool
106ChainedASTReaderListener::ReadFileSystemOptions(const FileSystemOptions &FSOpts,
107 bool Complain) {
108 return First->ReadFileSystemOptions(FSOpts, Complain) ||
109 Second->ReadFileSystemOptions(FSOpts, Complain);
110}
111
112bool ChainedASTReaderListener::ReadHeaderSearchOptions(
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +0000113 const HeaderSearchOptions &HSOpts, StringRef SpecificModuleCachePath,
114 bool Complain) {
115 return First->ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
116 Complain) ||
117 Second->ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
118 Complain);
Ben Langmuircb69b572014-03-07 06:40:32 +0000119}
120bool ChainedASTReaderListener::ReadPreprocessorOptions(
121 const PreprocessorOptions &PPOpts, bool Complain,
122 std::string &SuggestedPredefines) {
123 return First->ReadPreprocessorOptions(PPOpts, Complain,
124 SuggestedPredefines) ||
125 Second->ReadPreprocessorOptions(PPOpts, Complain, SuggestedPredefines);
126}
127void ChainedASTReaderListener::ReadCounter(const serialization::ModuleFile &M,
128 unsigned Value) {
129 First->ReadCounter(M, Value);
130 Second->ReadCounter(M, Value);
131}
132bool ChainedASTReaderListener::needsInputFileVisitation() {
133 return First->needsInputFileVisitation() ||
134 Second->needsInputFileVisitation();
135}
136bool ChainedASTReaderListener::needsSystemInputFileVisitation() {
137 return First->needsSystemInputFileVisitation() ||
138 Second->needsSystemInputFileVisitation();
139}
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000140void ChainedASTReaderListener::visitModuleFile(StringRef Filename) {
141 First->visitModuleFile(Filename);
142 Second->visitModuleFile(Filename);
143}
Ben Langmuircb69b572014-03-07 06:40:32 +0000144bool ChainedASTReaderListener::visitInputFile(StringRef Filename,
Argyrios Kyrtzidis68ccbe02014-03-14 02:26:31 +0000145 bool isSystem,
146 bool isOverridden) {
Justin Bognerc65a66d2014-05-22 06:04:59 +0000147 bool Continue = false;
148 if (First->needsInputFileVisitation() &&
149 (!isSystem || First->needsSystemInputFileVisitation()))
150 Continue |= First->visitInputFile(Filename, isSystem, isOverridden);
151 if (Second->needsInputFileVisitation() &&
152 (!isSystem || Second->needsSystemInputFileVisitation()))
153 Continue |= Second->visitInputFile(Filename, isSystem, isOverridden);
154 return Continue;
Ben Langmuircb69b572014-03-07 06:40:32 +0000155}
156
Guy Benyei11169dd2012-12-18 14:30:41 +0000157//===----------------------------------------------------------------------===//
158// PCH validator implementation
159//===----------------------------------------------------------------------===//
160
161ASTReaderListener::~ASTReaderListener() {}
162
163/// \brief Compare the given set of language options against an existing set of
164/// language options.
165///
166/// \param Diags If non-NULL, diagnostics will be emitted via this engine.
Richard Smith1e2cf0d2014-10-31 02:28:58 +0000167/// \param AllowCompatibleDifferences If true, differences between compatible
168/// language options will be permitted.
Guy Benyei11169dd2012-12-18 14:30:41 +0000169///
170/// \returns true if the languagae options mis-match, false otherwise.
171static bool checkLanguageOptions(const LangOptions &LangOpts,
172 const LangOptions &ExistingLangOpts,
Richard Smith1e2cf0d2014-10-31 02:28:58 +0000173 DiagnosticsEngine *Diags,
174 bool AllowCompatibleDifferences = true) {
Guy Benyei11169dd2012-12-18 14:30:41 +0000175#define LANGOPT(Name, Bits, Default, Description) \
176 if (ExistingLangOpts.Name != LangOpts.Name) { \
177 if (Diags) \
178 Diags->Report(diag::err_pch_langopt_mismatch) \
179 << Description << LangOpts.Name << ExistingLangOpts.Name; \
180 return true; \
181 }
182
183#define VALUE_LANGOPT(Name, Bits, Default, Description) \
184 if (ExistingLangOpts.Name != LangOpts.Name) { \
185 if (Diags) \
186 Diags->Report(diag::err_pch_langopt_value_mismatch) \
187 << Description; \
188 return true; \
189 }
190
191#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
192 if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \
193 if (Diags) \
194 Diags->Report(diag::err_pch_langopt_value_mismatch) \
195 << Description; \
196 return true; \
197 }
198
Richard Smith1e2cf0d2014-10-31 02:28:58 +0000199#define COMPATIBLE_LANGOPT(Name, Bits, Default, Description) \
200 if (!AllowCompatibleDifferences) \
201 LANGOPT(Name, Bits, Default, Description)
202
203#define COMPATIBLE_ENUM_LANGOPT(Name, Bits, Default, Description) \
204 if (!AllowCompatibleDifferences) \
205 ENUM_LANGOPT(Name, Bits, Default, Description)
206
Guy Benyei11169dd2012-12-18 14:30:41 +0000207#define BENIGN_LANGOPT(Name, Bits, Default, Description)
208#define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description)
209#include "clang/Basic/LangOptions.def"
210
211 if (ExistingLangOpts.ObjCRuntime != LangOpts.ObjCRuntime) {
212 if (Diags)
213 Diags->Report(diag::err_pch_langopt_value_mismatch)
214 << "target Objective-C runtime";
215 return true;
216 }
217
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +0000218 if (ExistingLangOpts.CommentOpts.BlockCommandNames !=
219 LangOpts.CommentOpts.BlockCommandNames) {
220 if (Diags)
221 Diags->Report(diag::err_pch_langopt_value_mismatch)
222 << "block command names";
223 return true;
224 }
225
Guy Benyei11169dd2012-12-18 14:30:41 +0000226 return false;
227}
228
229/// \brief Compare the given set of target options against an existing set of
230/// target options.
231///
232/// \param Diags If non-NULL, diagnostics will be emitted via this engine.
233///
234/// \returns true if the target options mis-match, false otherwise.
235static bool checkTargetOptions(const TargetOptions &TargetOpts,
236 const TargetOptions &ExistingTargetOpts,
Chandler Carruth0d745bc2015-03-14 04:47:43 +0000237 DiagnosticsEngine *Diags,
238 bool AllowCompatibleDifferences = true) {
Guy Benyei11169dd2012-12-18 14:30:41 +0000239#define CHECK_TARGET_OPT(Field, Name) \
240 if (TargetOpts.Field != ExistingTargetOpts.Field) { \
241 if (Diags) \
242 Diags->Report(diag::err_pch_targetopt_mismatch) \
243 << Name << TargetOpts.Field << ExistingTargetOpts.Field; \
244 return true; \
245 }
246
Chandler Carruth0d745bc2015-03-14 04:47:43 +0000247 // The triple and ABI must match exactly.
Guy Benyei11169dd2012-12-18 14:30:41 +0000248 CHECK_TARGET_OPT(Triple, "target");
Guy Benyei11169dd2012-12-18 14:30:41 +0000249 CHECK_TARGET_OPT(ABI, "target ABI");
Chandler Carruth0d745bc2015-03-14 04:47:43 +0000250
251 // We can tolerate different CPUs in many cases, notably when one CPU
252 // supports a strict superset of another. When allowing compatible
253 // differences skip this check.
254 if (!AllowCompatibleDifferences)
255 CHECK_TARGET_OPT(CPU, "target CPU");
256
Guy Benyei11169dd2012-12-18 14:30:41 +0000257#undef CHECK_TARGET_OPT
258
259 // Compare feature sets.
260 SmallVector<StringRef, 4> ExistingFeatures(
261 ExistingTargetOpts.FeaturesAsWritten.begin(),
262 ExistingTargetOpts.FeaturesAsWritten.end());
263 SmallVector<StringRef, 4> ReadFeatures(TargetOpts.FeaturesAsWritten.begin(),
264 TargetOpts.FeaturesAsWritten.end());
265 std::sort(ExistingFeatures.begin(), ExistingFeatures.end());
266 std::sort(ReadFeatures.begin(), ReadFeatures.end());
267
Chandler Carruth0d745bc2015-03-14 04:47:43 +0000268 // We compute the set difference in both directions explicitly so that we can
269 // diagnose the differences differently.
270 SmallVector<StringRef, 4> UnmatchedExistingFeatures, UnmatchedReadFeatures;
271 std::set_difference(
272 ExistingFeatures.begin(), ExistingFeatures.end(), ReadFeatures.begin(),
273 ReadFeatures.end(), std::back_inserter(UnmatchedExistingFeatures));
274 std::set_difference(ReadFeatures.begin(), ReadFeatures.end(),
275 ExistingFeatures.begin(), ExistingFeatures.end(),
276 std::back_inserter(UnmatchedReadFeatures));
Guy Benyei11169dd2012-12-18 14:30:41 +0000277
Chandler Carruth0d745bc2015-03-14 04:47:43 +0000278 // If we are allowing compatible differences and the read feature set is
279 // a strict subset of the existing feature set, there is nothing to diagnose.
280 if (AllowCompatibleDifferences && UnmatchedReadFeatures.empty())
281 return false;
Guy Benyei11169dd2012-12-18 14:30:41 +0000282
Chandler Carruth0d745bc2015-03-14 04:47:43 +0000283 if (Diags) {
284 for (StringRef Feature : UnmatchedReadFeatures)
Guy Benyei11169dd2012-12-18 14:30:41 +0000285 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
Chandler Carruth0d745bc2015-03-14 04:47:43 +0000286 << /* is-existing-feature */ false << Feature;
287 for (StringRef Feature : UnmatchedExistingFeatures)
288 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
289 << /* is-existing-feature */ true << Feature;
Guy Benyei11169dd2012-12-18 14:30:41 +0000290 }
291
Chandler Carruth0d745bc2015-03-14 04:47:43 +0000292 return !UnmatchedReadFeatures.empty() || !UnmatchedExistingFeatures.empty();
Guy Benyei11169dd2012-12-18 14:30:41 +0000293}
294
295bool
296PCHValidator::ReadLanguageOptions(const LangOptions &LangOpts,
Richard Smith1e2cf0d2014-10-31 02:28:58 +0000297 bool Complain,
298 bool AllowCompatibleDifferences) {
Guy Benyei11169dd2012-12-18 14:30:41 +0000299 const LangOptions &ExistingLangOpts = PP.getLangOpts();
300 return checkLanguageOptions(LangOpts, ExistingLangOpts,
Richard Smith1e2cf0d2014-10-31 02:28:58 +0000301 Complain ? &Reader.Diags : nullptr,
302 AllowCompatibleDifferences);
Guy Benyei11169dd2012-12-18 14:30:41 +0000303}
304
305bool PCHValidator::ReadTargetOptions(const TargetOptions &TargetOpts,
Chandler Carruth0d745bc2015-03-14 04:47:43 +0000306 bool Complain,
307 bool AllowCompatibleDifferences) {
Guy Benyei11169dd2012-12-18 14:30:41 +0000308 const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts();
309 return checkTargetOptions(TargetOpts, ExistingTargetOpts,
Chandler Carruth0d745bc2015-03-14 04:47:43 +0000310 Complain ? &Reader.Diags : nullptr,
311 AllowCompatibleDifferences);
Guy Benyei11169dd2012-12-18 14:30:41 +0000312}
313
314namespace {
315 typedef llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/> >
316 MacroDefinitionsMap;
Craig Topper3598eb72013-07-05 04:43:31 +0000317 typedef llvm::DenseMap<DeclarationName, SmallVector<NamedDecl *, 8> >
318 DeclsMap;
Guy Benyei11169dd2012-12-18 14:30:41 +0000319}
320
Ben Langmuirb92de022014-04-29 16:25:26 +0000321static bool checkDiagnosticGroupMappings(DiagnosticsEngine &StoredDiags,
322 DiagnosticsEngine &Diags,
323 bool Complain) {
324 typedef DiagnosticsEngine::Level Level;
325
326 // Check current mappings for new -Werror mappings, and the stored mappings
327 // for cases that were explicitly mapped to *not* be errors that are now
328 // errors because of options like -Werror.
329 DiagnosticsEngine *MappingSources[] = { &Diags, &StoredDiags };
330
331 for (DiagnosticsEngine *MappingSource : MappingSources) {
332 for (auto DiagIDMappingPair : MappingSource->getDiagnosticMappings()) {
333 diag::kind DiagID = DiagIDMappingPair.first;
334 Level CurLevel = Diags.getDiagnosticLevel(DiagID, SourceLocation());
335 if (CurLevel < DiagnosticsEngine::Error)
336 continue; // not significant
337 Level StoredLevel =
338 StoredDiags.getDiagnosticLevel(DiagID, SourceLocation());
339 if (StoredLevel < DiagnosticsEngine::Error) {
340 if (Complain)
341 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror=" +
342 Diags.getDiagnosticIDs()->getWarningOptionForDiag(DiagID).str();
343 return true;
344 }
345 }
346 }
347
348 return false;
349}
350
Alp Tokerac4e8e52014-06-22 21:58:33 +0000351static bool isExtHandlingFromDiagsError(DiagnosticsEngine &Diags) {
352 diag::Severity Ext = Diags.getExtensionHandlingBehavior();
353 if (Ext == diag::Severity::Warning && Diags.getWarningsAsErrors())
354 return true;
355 return Ext >= diag::Severity::Error;
Ben Langmuirb92de022014-04-29 16:25:26 +0000356}
357
358static bool checkDiagnosticMappings(DiagnosticsEngine &StoredDiags,
359 DiagnosticsEngine &Diags,
360 bool IsSystem, bool Complain) {
361 // Top-level options
362 if (IsSystem) {
363 if (Diags.getSuppressSystemWarnings())
364 return false;
365 // If -Wsystem-headers was not enabled before, be conservative
366 if (StoredDiags.getSuppressSystemWarnings()) {
367 if (Complain)
368 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Wsystem-headers";
369 return true;
370 }
371 }
372
373 if (Diags.getWarningsAsErrors() && !StoredDiags.getWarningsAsErrors()) {
374 if (Complain)
375 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror";
376 return true;
377 }
378
379 if (Diags.getWarningsAsErrors() && Diags.getEnableAllWarnings() &&
380 !StoredDiags.getEnableAllWarnings()) {
381 if (Complain)
382 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Weverything -Werror";
383 return true;
384 }
385
386 if (isExtHandlingFromDiagsError(Diags) &&
387 !isExtHandlingFromDiagsError(StoredDiags)) {
388 if (Complain)
389 Diags.Report(diag::err_pch_diagopt_mismatch) << "-pedantic-errors";
390 return true;
391 }
392
393 return checkDiagnosticGroupMappings(StoredDiags, Diags, Complain);
394}
395
396bool PCHValidator::ReadDiagnosticOptions(
397 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) {
398 DiagnosticsEngine &ExistingDiags = PP.getDiagnostics();
399 IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(ExistingDiags.getDiagnosticIDs());
400 IntrusiveRefCntPtr<DiagnosticsEngine> Diags(
Alp Tokerf994cef2014-07-05 03:08:06 +0000401 new DiagnosticsEngine(DiagIDs, DiagOpts.get()));
Ben Langmuirb92de022014-04-29 16:25:26 +0000402 // This should never fail, because we would have processed these options
403 // before writing them to an ASTFile.
404 ProcessWarningOptions(*Diags, *DiagOpts, /*Report*/false);
405
406 ModuleManager &ModuleMgr = Reader.getModuleManager();
407 assert(ModuleMgr.size() >= 1 && "what ASTFile is this then");
408
409 // If the original import came from a file explicitly generated by the user,
410 // don't check the diagnostic mappings.
411 // FIXME: currently this is approximated by checking whether this is not a
Richard Smithe842a472014-10-22 02:05:46 +0000412 // module import of an implicitly-loaded module file.
Ben Langmuirb92de022014-04-29 16:25:26 +0000413 // Note: ModuleMgr.rbegin() may not be the current module, but it must be in
414 // the transitive closure of its imports, since unrelated modules cannot be
415 // imported until after this module finishes validation.
416 ModuleFile *TopImport = *ModuleMgr.rbegin();
417 while (!TopImport->ImportedBy.empty())
418 TopImport = TopImport->ImportedBy[0];
Richard Smithe842a472014-10-22 02:05:46 +0000419 if (TopImport->Kind != MK_ImplicitModule)
Ben Langmuirb92de022014-04-29 16:25:26 +0000420 return false;
421
422 StringRef ModuleName = TopImport->ModuleName;
423 assert(!ModuleName.empty() && "diagnostic options read before module name");
424
425 Module *M = PP.getHeaderSearchInfo().lookupModule(ModuleName);
426 assert(M && "missing module");
427
428 // FIXME: if the diagnostics are incompatible, save a DiagnosticOptions that
429 // contains the union of their flags.
430 return checkDiagnosticMappings(*Diags, ExistingDiags, M->IsSystem, Complain);
431}
432
Guy Benyei11169dd2012-12-18 14:30:41 +0000433/// \brief Collect the macro definitions provided by the given preprocessor
434/// options.
Craig Toppera13603a2014-05-22 05:54:18 +0000435static void
436collectMacroDefinitions(const PreprocessorOptions &PPOpts,
437 MacroDefinitionsMap &Macros,
438 SmallVectorImpl<StringRef> *MacroNames = nullptr) {
Guy Benyei11169dd2012-12-18 14:30:41 +0000439 for (unsigned I = 0, N = PPOpts.Macros.size(); I != N; ++I) {
440 StringRef Macro = PPOpts.Macros[I].first;
441 bool IsUndef = PPOpts.Macros[I].second;
442
443 std::pair<StringRef, StringRef> MacroPair = Macro.split('=');
444 StringRef MacroName = MacroPair.first;
445 StringRef MacroBody = MacroPair.second;
446
447 // For an #undef'd macro, we only care about the name.
448 if (IsUndef) {
449 if (MacroNames && !Macros.count(MacroName))
450 MacroNames->push_back(MacroName);
451
452 Macros[MacroName] = std::make_pair("", true);
453 continue;
454 }
455
456 // For a #define'd macro, figure out the actual definition.
457 if (MacroName.size() == Macro.size())
458 MacroBody = "1";
459 else {
460 // Note: GCC drops anything following an end-of-line character.
461 StringRef::size_type End = MacroBody.find_first_of("\n\r");
462 MacroBody = MacroBody.substr(0, End);
463 }
464
465 if (MacroNames && !Macros.count(MacroName))
466 MacroNames->push_back(MacroName);
467 Macros[MacroName] = std::make_pair(MacroBody, false);
468 }
469}
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +0000470
Guy Benyei11169dd2012-12-18 14:30:41 +0000471/// \brief Check the preprocessor options deserialized from the control block
472/// against the preprocessor options in an existing preprocessor.
473///
474/// \param Diags If non-null, produce diagnostics for any mismatches incurred.
475static bool checkPreprocessorOptions(const PreprocessorOptions &PPOpts,
476 const PreprocessorOptions &ExistingPPOpts,
477 DiagnosticsEngine *Diags,
478 FileManager &FileMgr,
Argyrios Kyrtzidisd3afa0c2013-04-26 21:33:40 +0000479 std::string &SuggestedPredefines,
480 const LangOptions &LangOpts) {
Guy Benyei11169dd2012-12-18 14:30:41 +0000481 // Check macro definitions.
482 MacroDefinitionsMap ASTFileMacros;
483 collectMacroDefinitions(PPOpts, ASTFileMacros);
484 MacroDefinitionsMap ExistingMacros;
485 SmallVector<StringRef, 4> ExistingMacroNames;
486 collectMacroDefinitions(ExistingPPOpts, ExistingMacros, &ExistingMacroNames);
487
488 for (unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) {
489 // Dig out the macro definition in the existing preprocessor options.
490 StringRef MacroName = ExistingMacroNames[I];
491 std::pair<StringRef, bool> Existing = ExistingMacros[MacroName];
492
493 // Check whether we know anything about this macro name or not.
494 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/> >::iterator Known
495 = ASTFileMacros.find(MacroName);
496 if (Known == ASTFileMacros.end()) {
497 // FIXME: Check whether this identifier was referenced anywhere in the
498 // AST file. If so, we should reject the AST file. Unfortunately, this
499 // information isn't in the control block. What shall we do about it?
500
501 if (Existing.second) {
502 SuggestedPredefines += "#undef ";
503 SuggestedPredefines += MacroName.str();
504 SuggestedPredefines += '\n';
505 } else {
506 SuggestedPredefines += "#define ";
507 SuggestedPredefines += MacroName.str();
508 SuggestedPredefines += ' ';
509 SuggestedPredefines += Existing.first.str();
510 SuggestedPredefines += '\n';
511 }
512 continue;
513 }
514
515 // If the macro was defined in one but undef'd in the other, we have a
516 // conflict.
517 if (Existing.second != Known->second.second) {
518 if (Diags) {
519 Diags->Report(diag::err_pch_macro_def_undef)
520 << MacroName << Known->second.second;
521 }
522 return true;
523 }
524
525 // If the macro was #undef'd in both, or if the macro bodies are identical,
526 // it's fine.
527 if (Existing.second || Existing.first == Known->second.first)
528 continue;
529
530 // The macro bodies differ; complain.
531 if (Diags) {
532 Diags->Report(diag::err_pch_macro_def_conflict)
533 << MacroName << Known->second.first << Existing.first;
534 }
535 return true;
536 }
537
538 // Check whether we're using predefines.
539 if (PPOpts.UsePredefines != ExistingPPOpts.UsePredefines) {
540 if (Diags) {
541 Diags->Report(diag::err_pch_undef) << ExistingPPOpts.UsePredefines;
542 }
543 return true;
544 }
545
Argyrios Kyrtzidisd3afa0c2013-04-26 21:33:40 +0000546 // Detailed record is important since it is used for the module cache hash.
547 if (LangOpts.Modules &&
548 PPOpts.DetailedRecord != ExistingPPOpts.DetailedRecord) {
549 if (Diags) {
550 Diags->Report(diag::err_pch_pp_detailed_record) << PPOpts.DetailedRecord;
551 }
552 return true;
553 }
554
Guy Benyei11169dd2012-12-18 14:30:41 +0000555 // Compute the #include and #include_macros lines we need.
556 for (unsigned I = 0, N = ExistingPPOpts.Includes.size(); I != N; ++I) {
557 StringRef File = ExistingPPOpts.Includes[I];
558 if (File == ExistingPPOpts.ImplicitPCHInclude)
559 continue;
560
561 if (std::find(PPOpts.Includes.begin(), PPOpts.Includes.end(), File)
562 != PPOpts.Includes.end())
563 continue;
564
565 SuggestedPredefines += "#include \"";
Manuel Klimek9af34ae2014-08-12 08:25:57 +0000566 SuggestedPredefines += File;
Guy Benyei11169dd2012-12-18 14:30:41 +0000567 SuggestedPredefines += "\"\n";
568 }
569
570 for (unsigned I = 0, N = ExistingPPOpts.MacroIncludes.size(); I != N; ++I) {
571 StringRef File = ExistingPPOpts.MacroIncludes[I];
572 if (std::find(PPOpts.MacroIncludes.begin(), PPOpts.MacroIncludes.end(),
573 File)
574 != PPOpts.MacroIncludes.end())
575 continue;
576
577 SuggestedPredefines += "#__include_macros \"";
Manuel Klimek9af34ae2014-08-12 08:25:57 +0000578 SuggestedPredefines += File;
Guy Benyei11169dd2012-12-18 14:30:41 +0000579 SuggestedPredefines += "\"\n##\n";
580 }
581
582 return false;
583}
584
585bool PCHValidator::ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
586 bool Complain,
587 std::string &SuggestedPredefines) {
588 const PreprocessorOptions &ExistingPPOpts = PP.getPreprocessorOpts();
589
590 return checkPreprocessorOptions(PPOpts, ExistingPPOpts,
Craig Toppera13603a2014-05-22 05:54:18 +0000591 Complain? &Reader.Diags : nullptr,
Guy Benyei11169dd2012-12-18 14:30:41 +0000592 PP.getFileManager(),
Argyrios Kyrtzidisd3afa0c2013-04-26 21:33:40 +0000593 SuggestedPredefines,
594 PP.getLangOpts());
Guy Benyei11169dd2012-12-18 14:30:41 +0000595}
596
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +0000597/// Check the header search options deserialized from the control block
598/// against the header search options in an existing preprocessor.
599///
600/// \param Diags If non-null, produce diagnostics for any mismatches incurred.
601static bool checkHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
602 StringRef SpecificModuleCachePath,
603 StringRef ExistingModuleCachePath,
604 DiagnosticsEngine *Diags,
605 const LangOptions &LangOpts) {
606 if (LangOpts.Modules) {
607 if (SpecificModuleCachePath != ExistingModuleCachePath) {
608 if (Diags)
609 Diags->Report(diag::err_pch_modulecache_mismatch)
610 << SpecificModuleCachePath << ExistingModuleCachePath;
611 return true;
612 }
613 }
614
615 return false;
616}
617
618bool PCHValidator::ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
619 StringRef SpecificModuleCachePath,
620 bool Complain) {
621 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
622 PP.getHeaderSearchInfo().getModuleCachePath(),
623 Complain ? &Reader.Diags : nullptr,
624 PP.getLangOpts());
625}
626
Guy Benyei11169dd2012-12-18 14:30:41 +0000627void PCHValidator::ReadCounter(const ModuleFile &M, unsigned Value) {
628 PP.setCounterValue(Value);
629}
630
631//===----------------------------------------------------------------------===//
632// AST reader implementation
633//===----------------------------------------------------------------------===//
634
Nico Weber824285e2014-05-08 04:26:47 +0000635void ASTReader::setDeserializationListener(ASTDeserializationListener *Listener,
636 bool TakeOwnership) {
Guy Benyei11169dd2012-12-18 14:30:41 +0000637 DeserializationListener = Listener;
Nico Weber824285e2014-05-08 04:26:47 +0000638 OwnsDeserializationListener = TakeOwnership;
Guy Benyei11169dd2012-12-18 14:30:41 +0000639}
640
641
642
643unsigned ASTSelectorLookupTrait::ComputeHash(Selector Sel) {
644 return serialization::ComputeHash(Sel);
645}
646
647
648std::pair<unsigned, unsigned>
649ASTSelectorLookupTrait::ReadKeyDataLength(const unsigned char*& d) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000650 using namespace llvm::support;
651 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
652 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
Guy Benyei11169dd2012-12-18 14:30:41 +0000653 return std::make_pair(KeyLen, DataLen);
654}
655
656ASTSelectorLookupTrait::internal_key_type
657ASTSelectorLookupTrait::ReadKey(const unsigned char* d, unsigned) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000658 using namespace llvm::support;
Guy Benyei11169dd2012-12-18 14:30:41 +0000659 SelectorTable &SelTable = Reader.getContext().Selectors;
Justin Bogner57ba0b22014-03-28 22:03:24 +0000660 unsigned N = endian::readNext<uint16_t, little, unaligned>(d);
661 IdentifierInfo *FirstII = Reader.getLocalIdentifier(
662 F, endian::readNext<uint32_t, little, unaligned>(d));
Guy Benyei11169dd2012-12-18 14:30:41 +0000663 if (N == 0)
664 return SelTable.getNullarySelector(FirstII);
665 else if (N == 1)
666 return SelTable.getUnarySelector(FirstII);
667
668 SmallVector<IdentifierInfo *, 16> Args;
669 Args.push_back(FirstII);
670 for (unsigned I = 1; I != N; ++I)
Justin Bogner57ba0b22014-03-28 22:03:24 +0000671 Args.push_back(Reader.getLocalIdentifier(
672 F, endian::readNext<uint32_t, little, unaligned>(d)));
Guy Benyei11169dd2012-12-18 14:30:41 +0000673
674 return SelTable.getSelector(N, Args.data());
675}
676
677ASTSelectorLookupTrait::data_type
678ASTSelectorLookupTrait::ReadData(Selector, const unsigned char* d,
679 unsigned DataLen) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000680 using namespace llvm::support;
Guy Benyei11169dd2012-12-18 14:30:41 +0000681
682 data_type Result;
683
Justin Bogner57ba0b22014-03-28 22:03:24 +0000684 Result.ID = Reader.getGlobalSelectorID(
685 F, endian::readNext<uint32_t, little, unaligned>(d));
Nico Weberff4b35e2014-12-27 22:14:15 +0000686 unsigned FullInstanceBits = endian::readNext<uint16_t, little, unaligned>(d);
687 unsigned FullFactoryBits = endian::readNext<uint16_t, little, unaligned>(d);
688 Result.InstanceBits = FullInstanceBits & 0x3;
689 Result.InstanceHasMoreThanOneDecl = (FullInstanceBits >> 2) & 0x1;
690 Result.FactoryBits = FullFactoryBits & 0x3;
691 Result.FactoryHasMoreThanOneDecl = (FullFactoryBits >> 2) & 0x1;
692 unsigned NumInstanceMethods = FullInstanceBits >> 3;
693 unsigned NumFactoryMethods = FullFactoryBits >> 3;
Guy Benyei11169dd2012-12-18 14:30:41 +0000694
695 // Load instance methods
696 for (unsigned I = 0; I != NumInstanceMethods; ++I) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000697 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
698 F, endian::readNext<uint32_t, little, unaligned>(d)))
Guy Benyei11169dd2012-12-18 14:30:41 +0000699 Result.Instance.push_back(Method);
700 }
701
702 // Load factory methods
703 for (unsigned I = 0; I != NumFactoryMethods; ++I) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000704 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
705 F, endian::readNext<uint32_t, little, unaligned>(d)))
Guy Benyei11169dd2012-12-18 14:30:41 +0000706 Result.Factory.push_back(Method);
707 }
708
709 return Result;
710}
711
Douglas Gregorbfd73d72013-01-23 18:53:14 +0000712unsigned ASTIdentifierLookupTraitBase::ComputeHash(const internal_key_type& a) {
713 return llvm::HashString(a);
Guy Benyei11169dd2012-12-18 14:30:41 +0000714}
715
716std::pair<unsigned, unsigned>
Douglas Gregorbfd73d72013-01-23 18:53:14 +0000717ASTIdentifierLookupTraitBase::ReadKeyDataLength(const unsigned char*& d) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000718 using namespace llvm::support;
719 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
720 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
Guy Benyei11169dd2012-12-18 14:30:41 +0000721 return std::make_pair(KeyLen, DataLen);
722}
723
Douglas Gregorbfd73d72013-01-23 18:53:14 +0000724ASTIdentifierLookupTraitBase::internal_key_type
725ASTIdentifierLookupTraitBase::ReadKey(const unsigned char* d, unsigned n) {
Guy Benyei11169dd2012-12-18 14:30:41 +0000726 assert(n >= 2 && d[n-1] == '\0');
Douglas Gregorbfd73d72013-01-23 18:53:14 +0000727 return StringRef((const char*) d, n-1);
Guy Benyei11169dd2012-12-18 14:30:41 +0000728}
729
Douglas Gregordcf25082013-02-11 18:16:18 +0000730/// \brief Whether the given identifier is "interesting".
731static bool isInterestingIdentifier(IdentifierInfo &II) {
732 return II.isPoisoned() ||
733 II.isExtensionToken() ||
734 II.getObjCOrBuiltinID() ||
735 II.hasRevertedTokenIDToIdentifier() ||
736 II.hadMacroDefinition() ||
737 II.getFETokenInfo<void>();
738}
739
Guy Benyei11169dd2012-12-18 14:30:41 +0000740IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k,
741 const unsigned char* d,
742 unsigned DataLen) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000743 using namespace llvm::support;
744 unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d);
Guy Benyei11169dd2012-12-18 14:30:41 +0000745 bool IsInteresting = RawID & 0x01;
746
747 // Wipe out the "is interesting" bit.
748 RawID = RawID >> 1;
749
750 IdentID ID = Reader.getGlobalIdentifierID(F, RawID);
751 if (!IsInteresting) {
752 // For uninteresting identifiers, just build the IdentifierInfo
753 // and associate it with the persistent ID.
754 IdentifierInfo *II = KnownII;
755 if (!II) {
Douglas Gregorbfd73d72013-01-23 18:53:14 +0000756 II = &Reader.getIdentifierTable().getOwn(k);
Guy Benyei11169dd2012-12-18 14:30:41 +0000757 KnownII = II;
758 }
759 Reader.SetIdentifierInfo(ID, II);
Douglas Gregordcf25082013-02-11 18:16:18 +0000760 if (!II->isFromAST()) {
761 bool WasInteresting = isInterestingIdentifier(*II);
762 II->setIsFromAST();
763 if (WasInteresting)
764 II->setChangedSinceDeserialization();
765 }
766 Reader.markIdentifierUpToDate(II);
Guy Benyei11169dd2012-12-18 14:30:41 +0000767 return II;
768 }
769
Justin Bogner57ba0b22014-03-28 22:03:24 +0000770 unsigned ObjCOrBuiltinID = endian::readNext<uint16_t, little, unaligned>(d);
771 unsigned Bits = endian::readNext<uint16_t, little, unaligned>(d);
Guy Benyei11169dd2012-12-18 14:30:41 +0000772 bool CPlusPlusOperatorKeyword = Bits & 0x01;
773 Bits >>= 1;
774 bool HasRevertedTokenIDToIdentifier = Bits & 0x01;
775 Bits >>= 1;
776 bool Poisoned = Bits & 0x01;
777 Bits >>= 1;
778 bool ExtensionToken = Bits & 0x01;
779 Bits >>= 1;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +0000780 bool hasSubmoduleMacros = Bits & 0x01;
781 Bits >>= 1;
Guy Benyei11169dd2012-12-18 14:30:41 +0000782 bool hadMacroDefinition = Bits & 0x01;
783 Bits >>= 1;
784
785 assert(Bits == 0 && "Extra bits in the identifier?");
786 DataLen -= 8;
787
788 // Build the IdentifierInfo itself and link the identifier ID with
789 // the new IdentifierInfo.
790 IdentifierInfo *II = KnownII;
791 if (!II) {
Douglas Gregorbfd73d72013-01-23 18:53:14 +0000792 II = &Reader.getIdentifierTable().getOwn(StringRef(k));
Guy Benyei11169dd2012-12-18 14:30:41 +0000793 KnownII = II;
794 }
795 Reader.markIdentifierUpToDate(II);
Douglas Gregordcf25082013-02-11 18:16:18 +0000796 if (!II->isFromAST()) {
797 bool WasInteresting = isInterestingIdentifier(*II);
798 II->setIsFromAST();
799 if (WasInteresting)
800 II->setChangedSinceDeserialization();
801 }
Guy Benyei11169dd2012-12-18 14:30:41 +0000802
803 // Set or check the various bits in the IdentifierInfo structure.
804 // Token IDs are read-only.
Argyrios Kyrtzidisddee8c92013-02-27 01:13:51 +0000805 if (HasRevertedTokenIDToIdentifier && II->getTokenID() != tok::identifier)
Guy Benyei11169dd2012-12-18 14:30:41 +0000806 II->RevertTokenIDToIdentifier();
807 II->setObjCOrBuiltinID(ObjCOrBuiltinID);
808 assert(II->isExtensionToken() == ExtensionToken &&
809 "Incorrect extension token flag");
810 (void)ExtensionToken;
811 if (Poisoned)
812 II->setIsPoisoned(true);
813 assert(II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword &&
814 "Incorrect C++ operator keyword flag");
815 (void)CPlusPlusOperatorKeyword;
816
817 // If this identifier is a macro, deserialize the macro
818 // definition.
819 if (hadMacroDefinition) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000820 uint32_t MacroDirectivesOffset =
821 endian::readNext<uint32_t, little, unaligned>(d);
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +0000822 DataLen -= 4;
823 SmallVector<uint32_t, 8> LocalMacroIDs;
824 if (hasSubmoduleMacros) {
Richard Smithdaa69e02014-07-25 04:40:03 +0000825 while (true) {
826 uint32_t LocalMacroID =
827 endian::readNext<uint32_t, little, unaligned>(d);
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +0000828 DataLen -= 4;
Richard Smithdf8a8312015-03-13 04:05:01 +0000829 if (LocalMacroID == (uint32_t)-1) break;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +0000830 LocalMacroIDs.push_back(LocalMacroID);
831 }
Argyrios Kyrtzidis719736c2013-01-19 03:14:56 +0000832 }
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +0000833
Richard Smithe842a472014-10-22 02:05:46 +0000834 if (F.Kind == MK_ImplicitModule || F.Kind == MK_ExplicitModule) {
Richard Smith49f906a2014-03-01 00:08:04 +0000835 // Macro definitions are stored from newest to oldest, so reverse them
836 // before registering them.
837 llvm::SmallVector<unsigned, 8> MacroSizes;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +0000838 for (SmallVectorImpl<uint32_t>::iterator
Richard Smith49f906a2014-03-01 00:08:04 +0000839 I = LocalMacroIDs.begin(), E = LocalMacroIDs.end(); I != E; /**/) {
840 unsigned Size = 1;
841
842 static const uint32_t HasOverridesFlag = 0x80000000U;
843 if (I + 1 != E && (I[1] & HasOverridesFlag))
844 Size += 1 + (I[1] & ~HasOverridesFlag);
845
846 MacroSizes.push_back(Size);
847 I += Size;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +0000848 }
Richard Smith49f906a2014-03-01 00:08:04 +0000849
850 SmallVectorImpl<uint32_t>::iterator I = LocalMacroIDs.end();
851 for (SmallVectorImpl<unsigned>::reverse_iterator SI = MacroSizes.rbegin(),
852 SE = MacroSizes.rend();
853 SI != SE; ++SI) {
854 I -= *SI;
855
856 uint32_t LocalMacroID = *I;
Craig Topper00bbdcf2014-06-28 23:22:23 +0000857 ArrayRef<uint32_t> Overrides;
Richard Smith49f906a2014-03-01 00:08:04 +0000858 if (*SI != 1)
859 Overrides = llvm::makeArrayRef(&I[2], *SI - 2);
860 Reader.addPendingMacroFromModule(II, &F, LocalMacroID, Overrides);
861 }
862 assert(I == LocalMacroIDs.begin());
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +0000863 } else {
864 Reader.addPendingMacroFromPCH(II, &F, MacroDirectivesOffset);
865 }
Guy Benyei11169dd2012-12-18 14:30:41 +0000866 }
867
868 Reader.SetIdentifierInfo(ID, II);
869
870 // Read all of the declarations visible at global scope with this
871 // name.
872 if (DataLen > 0) {
873 SmallVector<uint32_t, 4> DeclIDs;
874 for (; DataLen > 0; DataLen -= 4)
Justin Bogner57ba0b22014-03-28 22:03:24 +0000875 DeclIDs.push_back(Reader.getGlobalDeclID(
876 F, endian::readNext<uint32_t, little, unaligned>(d)));
Guy Benyei11169dd2012-12-18 14:30:41 +0000877 Reader.SetGloballyVisibleDecls(II, DeclIDs);
878 }
879
880 return II;
881}
882
883unsigned
884ASTDeclContextNameLookupTrait::ComputeHash(const DeclNameKey &Key) const {
885 llvm::FoldingSetNodeID ID;
886 ID.AddInteger(Key.Kind);
887
888 switch (Key.Kind) {
889 case DeclarationName::Identifier:
890 case DeclarationName::CXXLiteralOperatorName:
891 ID.AddString(((IdentifierInfo*)Key.Data)->getName());
892 break;
893 case DeclarationName::ObjCZeroArgSelector:
894 case DeclarationName::ObjCOneArgSelector:
895 case DeclarationName::ObjCMultiArgSelector:
896 ID.AddInteger(serialization::ComputeHash(Selector(Key.Data)));
897 break;
898 case DeclarationName::CXXOperatorName:
899 ID.AddInteger((OverloadedOperatorKind)Key.Data);
900 break;
901 case DeclarationName::CXXConstructorName:
902 case DeclarationName::CXXDestructorName:
903 case DeclarationName::CXXConversionFunctionName:
904 case DeclarationName::CXXUsingDirective:
905 break;
906 }
907
908 return ID.ComputeHash();
909}
910
911ASTDeclContextNameLookupTrait::internal_key_type
912ASTDeclContextNameLookupTrait::GetInternalKey(
913 const external_key_type& Name) const {
914 DeclNameKey Key;
915 Key.Kind = Name.getNameKind();
916 switch (Name.getNameKind()) {
917 case DeclarationName::Identifier:
918 Key.Data = (uint64_t)Name.getAsIdentifierInfo();
919 break;
920 case DeclarationName::ObjCZeroArgSelector:
921 case DeclarationName::ObjCOneArgSelector:
922 case DeclarationName::ObjCMultiArgSelector:
923 Key.Data = (uint64_t)Name.getObjCSelector().getAsOpaquePtr();
924 break;
925 case DeclarationName::CXXOperatorName:
926 Key.Data = Name.getCXXOverloadedOperator();
927 break;
928 case DeclarationName::CXXLiteralOperatorName:
929 Key.Data = (uint64_t)Name.getCXXLiteralIdentifier();
930 break;
931 case DeclarationName::CXXConstructorName:
932 case DeclarationName::CXXDestructorName:
933 case DeclarationName::CXXConversionFunctionName:
934 case DeclarationName::CXXUsingDirective:
935 Key.Data = 0;
936 break;
937 }
938
939 return Key;
940}
941
942std::pair<unsigned, unsigned>
943ASTDeclContextNameLookupTrait::ReadKeyDataLength(const unsigned char*& d) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000944 using namespace llvm::support;
945 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
946 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
Guy Benyei11169dd2012-12-18 14:30:41 +0000947 return std::make_pair(KeyLen, DataLen);
948}
949
950ASTDeclContextNameLookupTrait::internal_key_type
951ASTDeclContextNameLookupTrait::ReadKey(const unsigned char* d, unsigned) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000952 using namespace llvm::support;
Guy Benyei11169dd2012-12-18 14:30:41 +0000953
954 DeclNameKey Key;
955 Key.Kind = (DeclarationName::NameKind)*d++;
956 switch (Key.Kind) {
957 case DeclarationName::Identifier:
Justin Bogner57ba0b22014-03-28 22:03:24 +0000958 Key.Data = (uint64_t)Reader.getLocalIdentifier(
959 F, endian::readNext<uint32_t, little, unaligned>(d));
Guy Benyei11169dd2012-12-18 14:30:41 +0000960 break;
961 case DeclarationName::ObjCZeroArgSelector:
962 case DeclarationName::ObjCOneArgSelector:
963 case DeclarationName::ObjCMultiArgSelector:
964 Key.Data =
Justin Bogner57ba0b22014-03-28 22:03:24 +0000965 (uint64_t)Reader.getLocalSelector(
966 F, endian::readNext<uint32_t, little, unaligned>(
967 d)).getAsOpaquePtr();
Guy Benyei11169dd2012-12-18 14:30:41 +0000968 break;
969 case DeclarationName::CXXOperatorName:
970 Key.Data = *d++; // OverloadedOperatorKind
971 break;
972 case DeclarationName::CXXLiteralOperatorName:
Justin Bogner57ba0b22014-03-28 22:03:24 +0000973 Key.Data = (uint64_t)Reader.getLocalIdentifier(
974 F, endian::readNext<uint32_t, little, unaligned>(d));
Guy Benyei11169dd2012-12-18 14:30:41 +0000975 break;
976 case DeclarationName::CXXConstructorName:
977 case DeclarationName::CXXDestructorName:
978 case DeclarationName::CXXConversionFunctionName:
979 case DeclarationName::CXXUsingDirective:
980 Key.Data = 0;
981 break;
982 }
983
984 return Key;
985}
986
987ASTDeclContextNameLookupTrait::data_type
988ASTDeclContextNameLookupTrait::ReadData(internal_key_type,
989 const unsigned char* d,
990 unsigned DataLen) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000991 using namespace llvm::support;
992 unsigned NumDecls = endian::readNext<uint16_t, little, unaligned>(d);
Argyrios Kyrtzidisc57e5032013-01-11 22:29:49 +0000993 LE32DeclID *Start = reinterpret_cast<LE32DeclID *>(
994 const_cast<unsigned char *>(d));
Guy Benyei11169dd2012-12-18 14:30:41 +0000995 return std::make_pair(Start, Start + NumDecls);
996}
997
998bool ASTReader::ReadDeclContextStorage(ModuleFile &M,
Chris Lattner7fb3bef2013-01-20 00:56:42 +0000999 BitstreamCursor &Cursor,
Guy Benyei11169dd2012-12-18 14:30:41 +00001000 const std::pair<uint64_t, uint64_t> &Offsets,
1001 DeclContextInfo &Info) {
1002 SavedStreamPosition SavedPosition(Cursor);
1003 // First the lexical decls.
1004 if (Offsets.first != 0) {
1005 Cursor.JumpToBit(Offsets.first);
1006
1007 RecordData Record;
Chris Lattner0e6c9402013-01-20 02:38:54 +00001008 StringRef Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00001009 unsigned Code = Cursor.ReadCode();
Chris Lattner0e6c9402013-01-20 02:38:54 +00001010 unsigned RecCode = Cursor.readRecord(Code, Record, &Blob);
Guy Benyei11169dd2012-12-18 14:30:41 +00001011 if (RecCode != DECL_CONTEXT_LEXICAL) {
1012 Error("Expected lexical block");
1013 return true;
1014 }
1015
Chris Lattner0e6c9402013-01-20 02:38:54 +00001016 Info.LexicalDecls = reinterpret_cast<const KindDeclIDPair*>(Blob.data());
1017 Info.NumLexicalDecls = Blob.size() / sizeof(KindDeclIDPair);
Guy Benyei11169dd2012-12-18 14:30:41 +00001018 }
1019
1020 // Now the lookup table.
1021 if (Offsets.second != 0) {
1022 Cursor.JumpToBit(Offsets.second);
1023
1024 RecordData Record;
Chris Lattner0e6c9402013-01-20 02:38:54 +00001025 StringRef Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00001026 unsigned Code = Cursor.ReadCode();
Chris Lattner0e6c9402013-01-20 02:38:54 +00001027 unsigned RecCode = Cursor.readRecord(Code, Record, &Blob);
Guy Benyei11169dd2012-12-18 14:30:41 +00001028 if (RecCode != DECL_CONTEXT_VISIBLE) {
1029 Error("Expected visible lookup table block");
1030 return true;
1031 }
Justin Bognerda4e6502014-04-14 16:34:29 +00001032 Info.NameLookupTableData = ASTDeclContextNameLookupTable::Create(
1033 (const unsigned char *)Blob.data() + Record[0],
1034 (const unsigned char *)Blob.data() + sizeof(uint32_t),
1035 (const unsigned char *)Blob.data(),
1036 ASTDeclContextNameLookupTrait(*this, M));
Guy Benyei11169dd2012-12-18 14:30:41 +00001037 }
1038
1039 return false;
1040}
1041
1042void ASTReader::Error(StringRef Msg) {
1043 Error(diag::err_fe_pch_malformed, Msg);
Douglas Gregor940e8052013-05-10 22:15:13 +00001044 if (Context.getLangOpts().Modules && !Diags.isDiagnosticInFlight()) {
1045 Diag(diag::note_module_cache_path)
1046 << PP.getHeaderSearchInfo().getModuleCachePath();
1047 }
Guy Benyei11169dd2012-12-18 14:30:41 +00001048}
1049
1050void ASTReader::Error(unsigned DiagID,
1051 StringRef Arg1, StringRef Arg2) {
1052 if (Diags.isDiagnosticInFlight())
1053 Diags.SetDelayedDiagnostic(DiagID, Arg1, Arg2);
1054 else
1055 Diag(DiagID) << Arg1 << Arg2;
1056}
1057
1058//===----------------------------------------------------------------------===//
1059// Source Manager Deserialization
1060//===----------------------------------------------------------------------===//
1061
1062/// \brief Read the line table in the source manager block.
1063/// \returns true if there was an error.
1064bool ASTReader::ParseLineTable(ModuleFile &F,
Richard Smith7ed1bc92014-12-05 22:42:13 +00001065 const RecordData &Record) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001066 unsigned Idx = 0;
1067 LineTableInfo &LineTable = SourceMgr.getLineTable();
1068
1069 // Parse the file names
1070 std::map<int, int> FileIDs;
1071 for (int I = 0, N = Record[Idx++]; I != N; ++I) {
1072 // Extract the file name
Richard Smith7ed1bc92014-12-05 22:42:13 +00001073 auto Filename = ReadPath(F, Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00001074 FileIDs[I] = LineTable.getLineTableFilenameID(Filename);
1075 }
1076
1077 // Parse the line entries
1078 std::vector<LineEntry> Entries;
1079 while (Idx < Record.size()) {
1080 int FID = Record[Idx++];
1081 assert(FID >= 0 && "Serialized line entries for non-local file.");
1082 // Remap FileID from 1-based old view.
1083 FID += F.SLocEntryBaseID - 1;
1084
1085 // Extract the line entries
1086 unsigned NumEntries = Record[Idx++];
1087 assert(NumEntries && "Numentries is 00000");
1088 Entries.clear();
1089 Entries.reserve(NumEntries);
1090 for (unsigned I = 0; I != NumEntries; ++I) {
1091 unsigned FileOffset = Record[Idx++];
1092 unsigned LineNo = Record[Idx++];
1093 int FilenameID = FileIDs[Record[Idx++]];
1094 SrcMgr::CharacteristicKind FileKind
1095 = (SrcMgr::CharacteristicKind)Record[Idx++];
1096 unsigned IncludeOffset = Record[Idx++];
1097 Entries.push_back(LineEntry::get(FileOffset, LineNo, FilenameID,
1098 FileKind, IncludeOffset));
1099 }
1100 LineTable.AddEntry(FileID::get(FID), Entries);
1101 }
1102
1103 return false;
1104}
1105
1106/// \brief Read a source manager block
1107bool ASTReader::ReadSourceManagerBlock(ModuleFile &F) {
1108 using namespace SrcMgr;
1109
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001110 BitstreamCursor &SLocEntryCursor = F.SLocEntryCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00001111
1112 // Set the source-location entry cursor to the current position in
1113 // the stream. This cursor will be used to read the contents of the
1114 // source manager block initially, and then lazily read
1115 // source-location entries as needed.
1116 SLocEntryCursor = F.Stream;
1117
1118 // The stream itself is going to skip over the source manager block.
1119 if (F.Stream.SkipBlock()) {
1120 Error("malformed block record in AST file");
1121 return true;
1122 }
1123
1124 // Enter the source manager block.
1125 if (SLocEntryCursor.EnterSubBlock(SOURCE_MANAGER_BLOCK_ID)) {
1126 Error("malformed source manager block record in AST file");
1127 return true;
1128 }
1129
1130 RecordData Record;
1131 while (true) {
Chris Lattnere7b154b2013-01-19 21:39:22 +00001132 llvm::BitstreamEntry E = SLocEntryCursor.advanceSkippingSubblocks();
1133
1134 switch (E.Kind) {
1135 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1136 case llvm::BitstreamEntry::Error:
1137 Error("malformed block record in AST file");
1138 return true;
1139 case llvm::BitstreamEntry::EndBlock:
Guy Benyei11169dd2012-12-18 14:30:41 +00001140 return false;
Chris Lattnere7b154b2013-01-19 21:39:22 +00001141 case llvm::BitstreamEntry::Record:
1142 // The interesting case.
1143 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00001144 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00001145
Guy Benyei11169dd2012-12-18 14:30:41 +00001146 // Read a record.
Guy Benyei11169dd2012-12-18 14:30:41 +00001147 Record.clear();
Chris Lattner15c3e7d2013-01-21 18:28:26 +00001148 StringRef Blob;
1149 switch (SLocEntryCursor.readRecord(E.ID, Record, &Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001150 default: // Default behavior: ignore.
1151 break;
1152
1153 case SM_SLOC_FILE_ENTRY:
1154 case SM_SLOC_BUFFER_ENTRY:
1155 case SM_SLOC_EXPANSION_ENTRY:
1156 // Once we hit one of the source location entries, we're done.
1157 return false;
1158 }
1159 }
1160}
1161
1162/// \brief If a header file is not found at the path that we expect it to be
1163/// and the PCH file was moved from its original location, try to resolve the
1164/// file by assuming that header+PCH were moved together and the header is in
1165/// the same place relative to the PCH.
1166static std::string
1167resolveFileRelativeToOriginalDir(const std::string &Filename,
1168 const std::string &OriginalDir,
1169 const std::string &CurrDir) {
1170 assert(OriginalDir != CurrDir &&
1171 "No point trying to resolve the file if the PCH dir didn't change");
1172 using namespace llvm::sys;
1173 SmallString<128> filePath(Filename);
1174 fs::make_absolute(filePath);
1175 assert(path::is_absolute(OriginalDir));
1176 SmallString<128> currPCHPath(CurrDir);
1177
1178 path::const_iterator fileDirI = path::begin(path::parent_path(filePath)),
1179 fileDirE = path::end(path::parent_path(filePath));
1180 path::const_iterator origDirI = path::begin(OriginalDir),
1181 origDirE = path::end(OriginalDir);
1182 // Skip the common path components from filePath and OriginalDir.
1183 while (fileDirI != fileDirE && origDirI != origDirE &&
1184 *fileDirI == *origDirI) {
1185 ++fileDirI;
1186 ++origDirI;
1187 }
1188 for (; origDirI != origDirE; ++origDirI)
1189 path::append(currPCHPath, "..");
1190 path::append(currPCHPath, fileDirI, fileDirE);
1191 path::append(currPCHPath, path::filename(Filename));
1192 return currPCHPath.str();
1193}
1194
1195bool ASTReader::ReadSLocEntry(int ID) {
1196 if (ID == 0)
1197 return false;
1198
1199 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1200 Error("source location entry ID out-of-range for AST file");
1201 return true;
1202 }
1203
1204 ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second;
1205 F->SLocEntryCursor.JumpToBit(F->SLocEntryOffsets[ID - F->SLocEntryBaseID]);
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001206 BitstreamCursor &SLocEntryCursor = F->SLocEntryCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00001207 unsigned BaseOffset = F->SLocEntryBaseOffset;
1208
1209 ++NumSLocEntriesRead;
Chris Lattnere7b154b2013-01-19 21:39:22 +00001210 llvm::BitstreamEntry Entry = SLocEntryCursor.advance();
1211 if (Entry.Kind != llvm::BitstreamEntry::Record) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001212 Error("incorrectly-formatted source location entry in AST file");
1213 return true;
1214 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00001215
Guy Benyei11169dd2012-12-18 14:30:41 +00001216 RecordData Record;
Chris Lattner0e6c9402013-01-20 02:38:54 +00001217 StringRef Blob;
1218 switch (SLocEntryCursor.readRecord(Entry.ID, Record, &Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001219 default:
1220 Error("incorrectly-formatted source location entry in AST file");
1221 return true;
1222
1223 case SM_SLOC_FILE_ENTRY: {
1224 // We will detect whether a file changed and return 'Failure' for it, but
1225 // we will also try to fail gracefully by setting up the SLocEntry.
1226 unsigned InputID = Record[4];
1227 InputFile IF = getInputFile(*F, InputID);
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00001228 const FileEntry *File = IF.getFile();
1229 bool OverriddenBuffer = IF.isOverridden();
Guy Benyei11169dd2012-12-18 14:30:41 +00001230
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00001231 // Note that we only check if a File was returned. If it was out-of-date
1232 // we have complained but we will continue creating a FileID to recover
1233 // gracefully.
1234 if (!File)
Guy Benyei11169dd2012-12-18 14:30:41 +00001235 return true;
1236
1237 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
1238 if (IncludeLoc.isInvalid() && F->Kind != MK_MainFile) {
1239 // This is the module's main file.
1240 IncludeLoc = getImportLocation(F);
1241 }
1242 SrcMgr::CharacteristicKind
1243 FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
1244 FileID FID = SourceMgr.createFileID(File, IncludeLoc, FileCharacter,
1245 ID, BaseOffset + Record[0]);
1246 SrcMgr::FileInfo &FileInfo =
1247 const_cast<SrcMgr::FileInfo&>(SourceMgr.getSLocEntry(FID).getFile());
1248 FileInfo.NumCreatedFIDs = Record[5];
1249 if (Record[3])
1250 FileInfo.setHasLineDirectives();
1251
1252 const DeclID *FirstDecl = F->FileSortedDecls + Record[6];
1253 unsigned NumFileDecls = Record[7];
1254 if (NumFileDecls) {
1255 assert(F->FileSortedDecls && "FILE_SORTED_DECLS not encountered yet ?");
1256 FileDeclIDs[FID] = FileDeclsInfo(F, llvm::makeArrayRef(FirstDecl,
1257 NumFileDecls));
1258 }
1259
1260 const SrcMgr::ContentCache *ContentCache
1261 = SourceMgr.getOrCreateContentCache(File,
1262 /*isSystemFile=*/FileCharacter != SrcMgr::C_User);
1263 if (OverriddenBuffer && !ContentCache->BufferOverridden &&
1264 ContentCache->ContentsEntry == ContentCache->OrigEntry) {
1265 unsigned Code = SLocEntryCursor.ReadCode();
1266 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00001267 unsigned RecCode = SLocEntryCursor.readRecord(Code, Record, &Blob);
Guy Benyei11169dd2012-12-18 14:30:41 +00001268
1269 if (RecCode != SM_SLOC_BUFFER_BLOB) {
1270 Error("AST record has invalid code");
1271 return true;
1272 }
1273
Rafael Espindolad87f8d72014-08-27 20:03:29 +00001274 std::unique_ptr<llvm::MemoryBuffer> Buffer
Chris Lattner0e6c9402013-01-20 02:38:54 +00001275 = llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), File->getName());
David Blaikie49cc3182014-08-27 20:54:45 +00001276 SourceMgr.overrideFileContents(File, std::move(Buffer));
Guy Benyei11169dd2012-12-18 14:30:41 +00001277 }
1278
1279 break;
1280 }
1281
1282 case SM_SLOC_BUFFER_ENTRY: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00001283 const char *Name = Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00001284 unsigned Offset = Record[0];
1285 SrcMgr::CharacteristicKind
1286 FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
1287 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
Richard Smithe842a472014-10-22 02:05:46 +00001288 if (IncludeLoc.isInvalid() &&
1289 (F->Kind == MK_ImplicitModule || F->Kind == MK_ExplicitModule)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001290 IncludeLoc = getImportLocation(F);
1291 }
1292 unsigned Code = SLocEntryCursor.ReadCode();
1293 Record.clear();
1294 unsigned RecCode
Chris Lattner0e6c9402013-01-20 02:38:54 +00001295 = SLocEntryCursor.readRecord(Code, Record, &Blob);
Guy Benyei11169dd2012-12-18 14:30:41 +00001296
1297 if (RecCode != SM_SLOC_BUFFER_BLOB) {
1298 Error("AST record has invalid code");
1299 return true;
1300 }
1301
Rafael Espindolad87f8d72014-08-27 20:03:29 +00001302 std::unique_ptr<llvm::MemoryBuffer> Buffer =
1303 llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name);
David Blaikie50a5f972014-08-29 07:59:55 +00001304 SourceMgr.createFileID(std::move(Buffer), FileCharacter, ID,
Rafael Espindolad87f8d72014-08-27 20:03:29 +00001305 BaseOffset + Offset, IncludeLoc);
Guy Benyei11169dd2012-12-18 14:30:41 +00001306 break;
1307 }
1308
1309 case SM_SLOC_EXPANSION_ENTRY: {
1310 SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1]);
1311 SourceMgr.createExpansionLoc(SpellingLoc,
1312 ReadSourceLocation(*F, Record[2]),
1313 ReadSourceLocation(*F, Record[3]),
1314 Record[4],
1315 ID,
1316 BaseOffset + Record[0]);
1317 break;
1318 }
1319 }
1320
1321 return false;
1322}
1323
1324std::pair<SourceLocation, StringRef> ASTReader::getModuleImportLoc(int ID) {
1325 if (ID == 0)
1326 return std::make_pair(SourceLocation(), "");
1327
1328 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1329 Error("source location entry ID out-of-range for AST file");
1330 return std::make_pair(SourceLocation(), "");
1331 }
1332
1333 // Find which module file this entry lands in.
1334 ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second;
Richard Smithe842a472014-10-22 02:05:46 +00001335 if (M->Kind != MK_ImplicitModule && M->Kind != MK_ExplicitModule)
Guy Benyei11169dd2012-12-18 14:30:41 +00001336 return std::make_pair(SourceLocation(), "");
1337
1338 // FIXME: Can we map this down to a particular submodule? That would be
1339 // ideal.
Ben Langmuirbeee15e2014-04-14 18:00:01 +00001340 return std::make_pair(M->ImportLoc, StringRef(M->ModuleName));
Guy Benyei11169dd2012-12-18 14:30:41 +00001341}
1342
1343/// \brief Find the location where the module F is imported.
1344SourceLocation ASTReader::getImportLocation(ModuleFile *F) {
1345 if (F->ImportLoc.isValid())
1346 return F->ImportLoc;
1347
1348 // Otherwise we have a PCH. It's considered to be "imported" at the first
1349 // location of its includer.
1350 if (F->ImportedBy.empty() || !F->ImportedBy[0]) {
Ben Langmuirbeee15e2014-04-14 18:00:01 +00001351 // Main file is the importer.
1352 assert(!SourceMgr.getMainFileID().isInvalid() && "missing main file");
1353 return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID());
Guy Benyei11169dd2012-12-18 14:30:41 +00001354 }
Guy Benyei11169dd2012-12-18 14:30:41 +00001355 return F->ImportedBy[0]->FirstLoc;
1356}
1357
1358/// ReadBlockAbbrevs - Enter a subblock of the specified BlockID with the
1359/// specified cursor. Read the abbreviations that are at the top of the block
1360/// and then leave the cursor pointing into the block.
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001361bool ASTReader::ReadBlockAbbrevs(BitstreamCursor &Cursor, unsigned BlockID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001362 if (Cursor.EnterSubBlock(BlockID)) {
1363 Error("malformed block record in AST file");
1364 return Failure;
1365 }
1366
1367 while (true) {
1368 uint64_t Offset = Cursor.GetCurrentBitNo();
1369 unsigned Code = Cursor.ReadCode();
1370
1371 // We expect all abbrevs to be at the start of the block.
1372 if (Code != llvm::bitc::DEFINE_ABBREV) {
1373 Cursor.JumpToBit(Offset);
1374 return false;
1375 }
1376 Cursor.ReadAbbrevRecord();
1377 }
1378}
1379
Richard Smithe40f2ba2013-08-07 21:41:30 +00001380Token ASTReader::ReadToken(ModuleFile &F, const RecordDataImpl &Record,
John McCallf413f5e2013-05-03 00:10:13 +00001381 unsigned &Idx) {
1382 Token Tok;
1383 Tok.startToken();
1384 Tok.setLocation(ReadSourceLocation(F, Record, Idx));
1385 Tok.setLength(Record[Idx++]);
1386 if (IdentifierInfo *II = getLocalIdentifier(F, Record[Idx++]))
1387 Tok.setIdentifierInfo(II);
1388 Tok.setKind((tok::TokenKind)Record[Idx++]);
1389 Tok.setFlag((Token::TokenFlags)Record[Idx++]);
1390 return Tok;
1391}
1392
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001393MacroInfo *ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001394 BitstreamCursor &Stream = F.MacroCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00001395
1396 // Keep track of where we are in the stream, then jump back there
1397 // after reading this macro.
1398 SavedStreamPosition SavedPosition(Stream);
1399
1400 Stream.JumpToBit(Offset);
1401 RecordData Record;
1402 SmallVector<IdentifierInfo*, 16> MacroArgs;
Craig Toppera13603a2014-05-22 05:54:18 +00001403 MacroInfo *Macro = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00001404
Guy Benyei11169dd2012-12-18 14:30:41 +00001405 while (true) {
Chris Lattnerefa77172013-01-20 00:00:22 +00001406 // Advance to the next record, but if we get to the end of the block, don't
1407 // pop it (removing all the abbreviations from the cursor) since we want to
1408 // be able to reseek within the block and read entries.
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001409 unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd;
Chris Lattnerefa77172013-01-20 00:00:22 +00001410 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks(Flags);
1411
1412 switch (Entry.Kind) {
1413 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1414 case llvm::BitstreamEntry::Error:
1415 Error("malformed block record in AST file");
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001416 return Macro;
Chris Lattnerefa77172013-01-20 00:00:22 +00001417 case llvm::BitstreamEntry::EndBlock:
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001418 return Macro;
Chris Lattnerefa77172013-01-20 00:00:22 +00001419 case llvm::BitstreamEntry::Record:
1420 // The interesting case.
1421 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00001422 }
1423
1424 // Read a record.
Guy Benyei11169dd2012-12-18 14:30:41 +00001425 Record.clear();
1426 PreprocessorRecordTypes RecType =
Chris Lattner0e6c9402013-01-20 02:38:54 +00001427 (PreprocessorRecordTypes)Stream.readRecord(Entry.ID, Record);
Guy Benyei11169dd2012-12-18 14:30:41 +00001428 switch (RecType) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001429 case PP_MACRO_DIRECTIVE_HISTORY:
1430 return Macro;
1431
Guy Benyei11169dd2012-12-18 14:30:41 +00001432 case PP_MACRO_OBJECT_LIKE:
1433 case PP_MACRO_FUNCTION_LIKE: {
1434 // If we already have a macro, that means that we've hit the end
1435 // of the definition of the macro we were looking for. We're
1436 // done.
1437 if (Macro)
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001438 return Macro;
Guy Benyei11169dd2012-12-18 14:30:41 +00001439
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001440 unsigned NextIndex = 1; // Skip identifier ID.
1441 SubmoduleID SubModID = getGlobalSubmoduleID(F, Record[NextIndex++]);
Guy Benyei11169dd2012-12-18 14:30:41 +00001442 SourceLocation Loc = ReadSourceLocation(F, Record, NextIndex);
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001443 MacroInfo *MI = PP.AllocateDeserializedMacroInfo(Loc, SubModID);
Argyrios Kyrtzidis7572be22013-01-07 19:16:23 +00001444 MI->setDefinitionEndLoc(ReadSourceLocation(F, Record, NextIndex));
Guy Benyei11169dd2012-12-18 14:30:41 +00001445 MI->setIsUsed(Record[NextIndex++]);
Argyrios Kyrtzidis9ef53ce2014-04-09 18:21:23 +00001446 MI->setUsedForHeaderGuard(Record[NextIndex++]);
Guy Benyei11169dd2012-12-18 14:30:41 +00001447
Guy Benyei11169dd2012-12-18 14:30:41 +00001448 if (RecType == PP_MACRO_FUNCTION_LIKE) {
1449 // Decode function-like macro info.
1450 bool isC99VarArgs = Record[NextIndex++];
1451 bool isGNUVarArgs = Record[NextIndex++];
1452 bool hasCommaPasting = Record[NextIndex++];
1453 MacroArgs.clear();
1454 unsigned NumArgs = Record[NextIndex++];
1455 for (unsigned i = 0; i != NumArgs; ++i)
1456 MacroArgs.push_back(getLocalIdentifier(F, Record[NextIndex++]));
1457
1458 // Install function-like macro info.
1459 MI->setIsFunctionLike();
1460 if (isC99VarArgs) MI->setIsC99Varargs();
1461 if (isGNUVarArgs) MI->setIsGNUVarargs();
1462 if (hasCommaPasting) MI->setHasCommaPasting();
1463 MI->setArgumentList(MacroArgs.data(), MacroArgs.size(),
1464 PP.getPreprocessorAllocator());
1465 }
1466
Guy Benyei11169dd2012-12-18 14:30:41 +00001467 // Remember that we saw this macro last so that we add the tokens that
1468 // form its body to it.
1469 Macro = MI;
1470
1471 if (NextIndex + 1 == Record.size() && PP.getPreprocessingRecord() &&
1472 Record[NextIndex]) {
1473 // We have a macro definition. Register the association
1474 PreprocessedEntityID
1475 GlobalID = getGlobalPreprocessedEntityID(F, Record[NextIndex]);
1476 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
Argyrios Kyrtzidis832de9f2013-02-22 18:35:59 +00001477 PreprocessingRecord::PPEntityID
1478 PPID = PPRec.getPPEntityID(GlobalID-1, /*isLoaded=*/true);
1479 MacroDefinition *PPDef =
1480 cast_or_null<MacroDefinition>(PPRec.getPreprocessedEntity(PPID));
1481 if (PPDef)
1482 PPRec.RegisterMacroDefinition(Macro, PPDef);
Guy Benyei11169dd2012-12-18 14:30:41 +00001483 }
1484
1485 ++NumMacrosRead;
1486 break;
1487 }
1488
1489 case PP_TOKEN: {
1490 // If we see a TOKEN before a PP_MACRO_*, then the file is
1491 // erroneous, just pretend we didn't see this.
Craig Toppera13603a2014-05-22 05:54:18 +00001492 if (!Macro) break;
Guy Benyei11169dd2012-12-18 14:30:41 +00001493
John McCallf413f5e2013-05-03 00:10:13 +00001494 unsigned Idx = 0;
1495 Token Tok = ReadToken(F, Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00001496 Macro->AddTokenToBody(Tok);
1497 break;
1498 }
1499 }
1500 }
1501}
1502
1503PreprocessedEntityID
1504ASTReader::getGlobalPreprocessedEntityID(ModuleFile &M, unsigned LocalID) const {
1505 ContinuousRangeMap<uint32_t, int, 2>::const_iterator
1506 I = M.PreprocessedEntityRemap.find(LocalID - NUM_PREDEF_PP_ENTITY_IDS);
1507 assert(I != M.PreprocessedEntityRemap.end()
1508 && "Invalid index into preprocessed entity index remap");
1509
1510 return LocalID + I->second;
1511}
1512
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001513unsigned HeaderFileInfoTrait::ComputeHash(internal_key_ref ikey) {
1514 return llvm::hash_combine(ikey.Size, ikey.ModTime);
Guy Benyei11169dd2012-12-18 14:30:41 +00001515}
Richard Smith7ed1bc92014-12-05 22:42:13 +00001516
Guy Benyei11169dd2012-12-18 14:30:41 +00001517HeaderFileInfoTrait::internal_key_type
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001518HeaderFileInfoTrait::GetInternalKey(const FileEntry *FE) {
1519 internal_key_type ikey = { FE->getSize(), FE->getModificationTime(),
Richard Smith7ed1bc92014-12-05 22:42:13 +00001520 FE->getName(), /*Imported*/false };
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001521 return ikey;
1522}
Guy Benyei11169dd2012-12-18 14:30:41 +00001523
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001524bool HeaderFileInfoTrait::EqualKey(internal_key_ref a, internal_key_ref b) {
1525 if (a.Size != b.Size || a.ModTime != b.ModTime)
Guy Benyei11169dd2012-12-18 14:30:41 +00001526 return false;
1527
Richard Smith7ed1bc92014-12-05 22:42:13 +00001528 if (llvm::sys::path::is_absolute(a.Filename) &&
1529 strcmp(a.Filename, b.Filename) == 0)
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001530 return true;
1531
Guy Benyei11169dd2012-12-18 14:30:41 +00001532 // Determine whether the actual files are equivalent.
Argyrios Kyrtzidis2a513e82013-03-04 20:33:40 +00001533 FileManager &FileMgr = Reader.getFileManager();
Richard Smith7ed1bc92014-12-05 22:42:13 +00001534 auto GetFile = [&](const internal_key_type &Key) -> const FileEntry* {
1535 if (!Key.Imported)
1536 return FileMgr.getFile(Key.Filename);
1537
1538 std::string Resolved = Key.Filename;
1539 Reader.ResolveImportedPath(M, Resolved);
1540 return FileMgr.getFile(Resolved);
1541 };
1542
1543 const FileEntry *FEA = GetFile(a);
1544 const FileEntry *FEB = GetFile(b);
1545 return FEA && FEA == FEB;
Guy Benyei11169dd2012-12-18 14:30:41 +00001546}
1547
1548std::pair<unsigned, unsigned>
1549HeaderFileInfoTrait::ReadKeyDataLength(const unsigned char*& d) {
Justin Bogner57ba0b22014-03-28 22:03:24 +00001550 using namespace llvm::support;
1551 unsigned KeyLen = (unsigned) endian::readNext<uint16_t, little, unaligned>(d);
Guy Benyei11169dd2012-12-18 14:30:41 +00001552 unsigned DataLen = (unsigned) *d++;
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001553 return std::make_pair(KeyLen, DataLen);
Guy Benyei11169dd2012-12-18 14:30:41 +00001554}
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001555
1556HeaderFileInfoTrait::internal_key_type
1557HeaderFileInfoTrait::ReadKey(const unsigned char *d, unsigned) {
Justin Bogner57ba0b22014-03-28 22:03:24 +00001558 using namespace llvm::support;
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001559 internal_key_type ikey;
Justin Bogner57ba0b22014-03-28 22:03:24 +00001560 ikey.Size = off_t(endian::readNext<uint64_t, little, unaligned>(d));
1561 ikey.ModTime = time_t(endian::readNext<uint64_t, little, unaligned>(d));
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001562 ikey.Filename = (const char *)d;
Richard Smith7ed1bc92014-12-05 22:42:13 +00001563 ikey.Imported = true;
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001564 return ikey;
1565}
1566
Guy Benyei11169dd2012-12-18 14:30:41 +00001567HeaderFileInfoTrait::data_type
Argyrios Kyrtzidisb146baa2013-03-13 21:13:51 +00001568HeaderFileInfoTrait::ReadData(internal_key_ref key, const unsigned char *d,
Guy Benyei11169dd2012-12-18 14:30:41 +00001569 unsigned DataLen) {
1570 const unsigned char *End = d + DataLen;
Justin Bogner57ba0b22014-03-28 22:03:24 +00001571 using namespace llvm::support;
Guy Benyei11169dd2012-12-18 14:30:41 +00001572 HeaderFileInfo HFI;
1573 unsigned Flags = *d++;
Lawrence Crowlb53e5482013-06-20 21:14:14 +00001574 HFI.HeaderRole = static_cast<ModuleMap::ModuleHeaderRole>
1575 ((Flags >> 6) & 0x03);
Guy Benyei11169dd2012-12-18 14:30:41 +00001576 HFI.isImport = (Flags >> 5) & 0x01;
1577 HFI.isPragmaOnce = (Flags >> 4) & 0x01;
1578 HFI.DirInfo = (Flags >> 2) & 0x03;
1579 HFI.Resolved = (Flags >> 1) & 0x01;
1580 HFI.IndexHeaderMapHeader = Flags & 0x01;
Justin Bogner57ba0b22014-03-28 22:03:24 +00001581 HFI.NumIncludes = endian::readNext<uint16_t, little, unaligned>(d);
1582 HFI.ControllingMacroID = Reader.getGlobalIdentifierID(
1583 M, endian::readNext<uint32_t, little, unaligned>(d));
1584 if (unsigned FrameworkOffset =
1585 endian::readNext<uint32_t, little, unaligned>(d)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001586 // The framework offset is 1 greater than the actual offset,
1587 // since 0 is used as an indicator for "no framework name".
1588 StringRef FrameworkName(FrameworkStrings + FrameworkOffset - 1);
1589 HFI.Framework = HS->getUniqueFrameworkName(FrameworkName);
1590 }
1591
Argyrios Kyrtzidisb146baa2013-03-13 21:13:51 +00001592 if (d != End) {
Justin Bogner57ba0b22014-03-28 22:03:24 +00001593 uint32_t LocalSMID = endian::readNext<uint32_t, little, unaligned>(d);
Argyrios Kyrtzidisb146baa2013-03-13 21:13:51 +00001594 if (LocalSMID) {
1595 // This header is part of a module. Associate it with the module to enable
1596 // implicit module import.
1597 SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID);
1598 Module *Mod = Reader.getSubmodule(GlobalSMID);
1599 HFI.isModuleHeader = true;
1600 FileManager &FileMgr = Reader.getFileManager();
1601 ModuleMap &ModMap =
1602 Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap();
Richard Smith7ed1bc92014-12-05 22:42:13 +00001603 // FIXME: This information should be propagated through the
1604 // SUBMODULE_HEADER etc records rather than from here.
Richard Smith3c1a41a2014-12-02 00:08:08 +00001605 // FIXME: We don't ever mark excluded headers.
Richard Smith7ed1bc92014-12-05 22:42:13 +00001606 std::string Filename = key.Filename;
1607 if (key.Imported)
1608 Reader.ResolveImportedPath(M, Filename);
1609 Module::Header H = { key.Filename, FileMgr.getFile(Filename) };
Hans Wennborg0101b542014-12-02 02:13:09 +00001610 ModMap.addHeader(Mod, H, HFI.getHeaderRole());
Argyrios Kyrtzidisb146baa2013-03-13 21:13:51 +00001611 }
1612 }
1613
Guy Benyei11169dd2012-12-18 14:30:41 +00001614 assert(End == d && "Wrong data length in HeaderFileInfo deserialization");
1615 (void)End;
1616
1617 // This HeaderFileInfo was externally loaded.
1618 HFI.External = true;
1619 return HFI;
1620}
1621
Richard Smith49f906a2014-03-01 00:08:04 +00001622void
1623ASTReader::addPendingMacroFromModule(IdentifierInfo *II, ModuleFile *M,
1624 GlobalMacroID GMacID,
Craig Topper00bbdcf2014-06-28 23:22:23 +00001625 ArrayRef<SubmoduleID> Overrides) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001626 assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard");
Craig Toppera13603a2014-05-22 05:54:18 +00001627 SubmoduleID *OverrideData = nullptr;
Richard Smith49f906a2014-03-01 00:08:04 +00001628 if (!Overrides.empty()) {
1629 OverrideData = new (Context) SubmoduleID[Overrides.size() + 1];
1630 OverrideData[0] = Overrides.size();
1631 for (unsigned I = 0; I != Overrides.size(); ++I)
1632 OverrideData[I + 1] = getGlobalSubmoduleID(*M, Overrides[I]);
1633 }
1634 PendingMacroIDs[II].push_back(PendingMacroInfo(M, GMacID, OverrideData));
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001635}
1636
1637void ASTReader::addPendingMacroFromPCH(IdentifierInfo *II,
1638 ModuleFile *M,
1639 uint64_t MacroDirectivesOffset) {
1640 assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard");
1641 PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset));
Guy Benyei11169dd2012-12-18 14:30:41 +00001642}
1643
1644void ASTReader::ReadDefinedMacros() {
1645 // Note that we are loading defined macros.
1646 Deserializing Macros(this);
1647
1648 for (ModuleReverseIterator I = ModuleMgr.rbegin(),
1649 E = ModuleMgr.rend(); I != E; ++I) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001650 BitstreamCursor &MacroCursor = (*I)->MacroCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00001651
1652 // If there was no preprocessor block, skip this file.
1653 if (!MacroCursor.getBitStreamReader())
1654 continue;
1655
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001656 BitstreamCursor Cursor = MacroCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00001657 Cursor.JumpToBit((*I)->MacroStartOffset);
1658
1659 RecordData Record;
1660 while (true) {
Chris Lattnere7b154b2013-01-19 21:39:22 +00001661 llvm::BitstreamEntry E = Cursor.advanceSkippingSubblocks();
1662
1663 switch (E.Kind) {
1664 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1665 case llvm::BitstreamEntry::Error:
1666 Error("malformed block record in AST file");
1667 return;
1668 case llvm::BitstreamEntry::EndBlock:
1669 goto NextCursor;
1670
1671 case llvm::BitstreamEntry::Record:
Chris Lattnere7b154b2013-01-19 21:39:22 +00001672 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00001673 switch (Cursor.readRecord(E.ID, Record)) {
Chris Lattnere7b154b2013-01-19 21:39:22 +00001674 default: // Default behavior: ignore.
1675 break;
1676
1677 case PP_MACRO_OBJECT_LIKE:
1678 case PP_MACRO_FUNCTION_LIKE:
1679 getLocalIdentifier(**I, Record[0]);
1680 break;
1681
1682 case PP_TOKEN:
1683 // Ignore tokens.
1684 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00001685 }
Guy Benyei11169dd2012-12-18 14:30:41 +00001686 break;
1687 }
1688 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00001689 NextCursor: ;
Guy Benyei11169dd2012-12-18 14:30:41 +00001690 }
1691}
1692
1693namespace {
1694 /// \brief Visitor class used to look up identifirs in an AST file.
1695 class IdentifierLookupVisitor {
1696 StringRef Name;
1697 unsigned PriorGeneration;
Douglas Gregor00a50f72013-01-25 00:38:33 +00001698 unsigned &NumIdentifierLookups;
1699 unsigned &NumIdentifierLookupHits;
Guy Benyei11169dd2012-12-18 14:30:41 +00001700 IdentifierInfo *Found;
Douglas Gregor00a50f72013-01-25 00:38:33 +00001701
Guy Benyei11169dd2012-12-18 14:30:41 +00001702 public:
Douglas Gregor00a50f72013-01-25 00:38:33 +00001703 IdentifierLookupVisitor(StringRef Name, unsigned PriorGeneration,
1704 unsigned &NumIdentifierLookups,
1705 unsigned &NumIdentifierLookupHits)
Douglas Gregor7211ac12013-01-25 23:32:03 +00001706 : Name(Name), PriorGeneration(PriorGeneration),
Douglas Gregor00a50f72013-01-25 00:38:33 +00001707 NumIdentifierLookups(NumIdentifierLookups),
1708 NumIdentifierLookupHits(NumIdentifierLookupHits),
1709 Found()
1710 {
1711 }
Guy Benyei11169dd2012-12-18 14:30:41 +00001712
1713 static bool visit(ModuleFile &M, void *UserData) {
1714 IdentifierLookupVisitor *This
1715 = static_cast<IdentifierLookupVisitor *>(UserData);
1716
1717 // If we've already searched this module file, skip it now.
1718 if (M.Generation <= This->PriorGeneration)
1719 return true;
Douglas Gregore060e572013-01-25 01:03:03 +00001720
Guy Benyei11169dd2012-12-18 14:30:41 +00001721 ASTIdentifierLookupTable *IdTable
1722 = (ASTIdentifierLookupTable *)M.IdentifierLookupTable;
1723 if (!IdTable)
1724 return false;
1725
1726 ASTIdentifierLookupTrait Trait(IdTable->getInfoObj().getReader(),
1727 M, This->Found);
Douglas Gregor00a50f72013-01-25 00:38:33 +00001728 ++This->NumIdentifierLookups;
1729 ASTIdentifierLookupTable::iterator Pos = IdTable->find(This->Name,&Trait);
Guy Benyei11169dd2012-12-18 14:30:41 +00001730 if (Pos == IdTable->end())
1731 return false;
1732
1733 // Dereferencing the iterator has the effect of building the
1734 // IdentifierInfo node and populating it with the various
1735 // declarations it needs.
Douglas Gregor00a50f72013-01-25 00:38:33 +00001736 ++This->NumIdentifierLookupHits;
Guy Benyei11169dd2012-12-18 14:30:41 +00001737 This->Found = *Pos;
1738 return true;
1739 }
1740
1741 // \brief Retrieve the identifier info found within the module
1742 // files.
1743 IdentifierInfo *getIdentifierInfo() const { return Found; }
1744 };
1745}
1746
1747void ASTReader::updateOutOfDateIdentifier(IdentifierInfo &II) {
1748 // Note that we are loading an identifier.
1749 Deserializing AnIdentifier(this);
1750
1751 unsigned PriorGeneration = 0;
1752 if (getContext().getLangOpts().Modules)
1753 PriorGeneration = IdentifierGeneration[&II];
Douglas Gregore060e572013-01-25 01:03:03 +00001754
1755 // If there is a global index, look there first to determine which modules
1756 // provably do not have any results for this identifier.
Douglas Gregor7211ac12013-01-25 23:32:03 +00001757 GlobalModuleIndex::HitSet Hits;
Craig Toppera13603a2014-05-22 05:54:18 +00001758 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
Douglas Gregore060e572013-01-25 01:03:03 +00001759 if (!loadGlobalIndex()) {
Douglas Gregor7211ac12013-01-25 23:32:03 +00001760 if (GlobalIndex->lookupIdentifier(II.getName(), Hits)) {
1761 HitsPtr = &Hits;
Douglas Gregore060e572013-01-25 01:03:03 +00001762 }
1763 }
1764
Douglas Gregor7211ac12013-01-25 23:32:03 +00001765 IdentifierLookupVisitor Visitor(II.getName(), PriorGeneration,
Douglas Gregor00a50f72013-01-25 00:38:33 +00001766 NumIdentifierLookups,
1767 NumIdentifierLookupHits);
Douglas Gregor7211ac12013-01-25 23:32:03 +00001768 ModuleMgr.visit(IdentifierLookupVisitor::visit, &Visitor, HitsPtr);
Guy Benyei11169dd2012-12-18 14:30:41 +00001769 markIdentifierUpToDate(&II);
1770}
1771
1772void ASTReader::markIdentifierUpToDate(IdentifierInfo *II) {
1773 if (!II)
1774 return;
1775
1776 II->setOutOfDate(false);
1777
1778 // Update the generation for this identifier.
1779 if (getContext().getLangOpts().Modules)
Richard Smith053f6c62014-05-16 23:01:30 +00001780 IdentifierGeneration[II] = getGeneration();
Guy Benyei11169dd2012-12-18 14:30:41 +00001781}
1782
Richard Smith49f906a2014-03-01 00:08:04 +00001783struct ASTReader::ModuleMacroInfo {
1784 SubmoduleID SubModID;
1785 MacroInfo *MI;
1786 SubmoduleID *Overrides;
1787 // FIXME: Remove this.
1788 ModuleFile *F;
1789
1790 bool isDefine() const { return MI; }
1791
1792 SubmoduleID getSubmoduleID() const { return SubModID; }
1793
Craig Topper00bbdcf2014-06-28 23:22:23 +00001794 ArrayRef<SubmoduleID> getOverriddenSubmodules() const {
Richard Smith49f906a2014-03-01 00:08:04 +00001795 if (!Overrides)
Craig Topper00bbdcf2014-06-28 23:22:23 +00001796 return None;
Richard Smith49f906a2014-03-01 00:08:04 +00001797 return llvm::makeArrayRef(Overrides + 1, *Overrides);
1798 }
1799
Richard Smithdaa69e02014-07-25 04:40:03 +00001800 MacroDirective *import(Preprocessor &PP, SourceLocation ImportLoc) const {
Richard Smith49f906a2014-03-01 00:08:04 +00001801 if (!MI)
Richard Smithdaa69e02014-07-25 04:40:03 +00001802 return PP.AllocateUndefMacroDirective(ImportLoc, SubModID,
1803 getOverriddenSubmodules());
1804 return PP.AllocateDefMacroDirective(MI, ImportLoc, SubModID,
1805 getOverriddenSubmodules());
Richard Smith49f906a2014-03-01 00:08:04 +00001806 }
1807};
1808
1809ASTReader::ModuleMacroInfo *
Richard Smithdf8a8312015-03-13 04:05:01 +00001810ASTReader::getModuleMacro(IdentifierInfo *II, const PendingMacroInfo &PMInfo) {
Richard Smith49f906a2014-03-01 00:08:04 +00001811 ModuleMacroInfo Info;
1812
1813 uint32_t ID = PMInfo.ModuleMacroData.MacID;
1814 if (ID & 1) {
1815 // Macro undefinition.
1816 Info.SubModID = getGlobalSubmoduleID(*PMInfo.M, ID >> 1);
Craig Toppera13603a2014-05-22 05:54:18 +00001817 Info.MI = nullptr;
Richard Smithdf8a8312015-03-13 04:05:01 +00001818
1819 // If we've already loaded the #undef of this macro from this module,
1820 // don't do so again.
1821 if (!LoadedUndefs.insert(std::make_pair(II, Info.SubModID)).second)
1822 return nullptr;
Richard Smith49f906a2014-03-01 00:08:04 +00001823 } else {
1824 // Macro definition.
1825 GlobalMacroID GMacID = getGlobalMacroID(*PMInfo.M, ID >> 1);
1826 assert(GMacID);
1827
1828 // If this macro has already been loaded, don't do so again.
1829 // FIXME: This is highly dubious. Multiple macro definitions can have the
1830 // same MacroInfo (and hence the same GMacID) due to #pragma push_macro etc.
1831 if (MacrosLoaded[GMacID - NUM_PREDEF_MACRO_IDS])
Craig Toppera13603a2014-05-22 05:54:18 +00001832 return nullptr;
Richard Smith49f906a2014-03-01 00:08:04 +00001833
1834 Info.MI = getMacro(GMacID);
1835 Info.SubModID = Info.MI->getOwningModuleID();
1836 }
1837 Info.Overrides = PMInfo.ModuleMacroData.Overrides;
1838 Info.F = PMInfo.M;
1839
1840 return new (Context) ModuleMacroInfo(Info);
1841}
1842
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001843void ASTReader::resolvePendingMacro(IdentifierInfo *II,
1844 const PendingMacroInfo &PMInfo) {
1845 assert(II);
1846
Richard Smithe842a472014-10-22 02:05:46 +00001847 if (PMInfo.M->Kind != MK_ImplicitModule &&
1848 PMInfo.M->Kind != MK_ExplicitModule) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001849 installPCHMacroDirectives(II, *PMInfo.M,
1850 PMInfo.PCHMacroData.MacroDirectivesOffset);
1851 return;
1852 }
Richard Smith49f906a2014-03-01 00:08:04 +00001853
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001854 // Module Macro.
1855
Richard Smithdf8a8312015-03-13 04:05:01 +00001856 ModuleMacroInfo *MMI = getModuleMacro(II, PMInfo);
Richard Smith49f906a2014-03-01 00:08:04 +00001857 if (!MMI)
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001858 return;
1859
Richard Smith49f906a2014-03-01 00:08:04 +00001860 Module *Owner = getSubmodule(MMI->getSubmoduleID());
1861 if (Owner && Owner->NameVisibility == Module::Hidden) {
1862 // Macros in the owning module are hidden. Just remember this macro to
1863 // install if we make this module visible.
1864 HiddenNamesMap[Owner].HiddenMacros.insert(std::make_pair(II, MMI));
1865 } else {
Richard Smithdaa69e02014-07-25 04:40:03 +00001866 installImportedMacro(II, MMI, Owner);
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001867 }
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001868}
1869
1870void ASTReader::installPCHMacroDirectives(IdentifierInfo *II,
1871 ModuleFile &M, uint64_t Offset) {
Richard Smithe842a472014-10-22 02:05:46 +00001872 assert(M.Kind != MK_ImplicitModule && M.Kind != MK_ExplicitModule);
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001873
1874 BitstreamCursor &Cursor = M.MacroCursor;
1875 SavedStreamPosition SavedPosition(Cursor);
1876 Cursor.JumpToBit(Offset);
1877
1878 llvm::BitstreamEntry Entry =
1879 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
1880 if (Entry.Kind != llvm::BitstreamEntry::Record) {
1881 Error("malformed block record in AST file");
1882 return;
1883 }
1884
1885 RecordData Record;
1886 PreprocessorRecordTypes RecType =
1887 (PreprocessorRecordTypes)Cursor.readRecord(Entry.ID, Record);
1888 if (RecType != PP_MACRO_DIRECTIVE_HISTORY) {
1889 Error("malformed block record in AST file");
1890 return;
1891 }
1892
1893 // Deserialize the macro directives history in reverse source-order.
Craig Toppera13603a2014-05-22 05:54:18 +00001894 MacroDirective *Latest = nullptr, *Earliest = nullptr;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001895 unsigned Idx = 0, N = Record.size();
1896 while (Idx < N) {
Craig Toppera13603a2014-05-22 05:54:18 +00001897 MacroDirective *MD = nullptr;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001898 SourceLocation Loc = ReadSourceLocation(M, Record, Idx);
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00001899 MacroDirective::Kind K = (MacroDirective::Kind)Record[Idx++];
1900 switch (K) {
1901 case MacroDirective::MD_Define: {
1902 GlobalMacroID GMacID = getGlobalMacroID(M, Record[Idx++]);
1903 MacroInfo *MI = getMacro(GMacID);
Richard Smithdaa69e02014-07-25 04:40:03 +00001904 SubmoduleID ImportedFrom = Record[Idx++];
1905 bool IsAmbiguous = Record[Idx++];
1906 llvm::SmallVector<unsigned, 4> Overrides;
1907 if (ImportedFrom) {
1908 Overrides.insert(Overrides.end(),
1909 &Record[Idx] + 1, &Record[Idx] + 1 + Record[Idx]);
1910 Idx += Overrides.size() + 1;
1911 }
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00001912 DefMacroDirective *DefMD =
Richard Smithdaa69e02014-07-25 04:40:03 +00001913 PP.AllocateDefMacroDirective(MI, Loc, ImportedFrom, Overrides);
1914 DefMD->setAmbiguous(IsAmbiguous);
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00001915 MD = DefMD;
1916 break;
1917 }
Richard Smithdaa69e02014-07-25 04:40:03 +00001918 case MacroDirective::MD_Undefine: {
1919 SubmoduleID ImportedFrom = Record[Idx++];
1920 llvm::SmallVector<unsigned, 4> Overrides;
1921 if (ImportedFrom) {
1922 Overrides.insert(Overrides.end(),
1923 &Record[Idx] + 1, &Record[Idx] + 1 + Record[Idx]);
1924 Idx += Overrides.size() + 1;
1925 }
1926 MD = PP.AllocateUndefMacroDirective(Loc, ImportedFrom, Overrides);
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00001927 break;
Richard Smithdaa69e02014-07-25 04:40:03 +00001928 }
1929 case MacroDirective::MD_Visibility:
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00001930 bool isPublic = Record[Idx++];
1931 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic);
1932 break;
1933 }
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001934
1935 if (!Latest)
1936 Latest = MD;
1937 if (Earliest)
1938 Earliest->setPrevious(MD);
1939 Earliest = MD;
1940 }
1941
1942 PP.setLoadedMacroDirective(II, Latest);
1943}
1944
Argyrios Kyrtzidis3a9c42c2013-03-27 01:25:34 +00001945/// \brief For the given macro definitions, check if they are both in system
Douglas Gregor0b202052013-04-12 21:00:54 +00001946/// modules.
1947static bool areDefinedInSystemModules(MacroInfo *PrevMI, MacroInfo *NewMI,
Douglas Gregor5e461192013-06-07 22:56:11 +00001948 Module *NewOwner, ASTReader &Reader) {
Argyrios Kyrtzidis3a9c42c2013-03-27 01:25:34 +00001949 assert(PrevMI && NewMI);
Craig Toppera13603a2014-05-22 05:54:18 +00001950 Module *PrevOwner = nullptr;
Argyrios Kyrtzidis3a9c42c2013-03-27 01:25:34 +00001951 if (SubmoduleID PrevModID = PrevMI->getOwningModuleID())
1952 PrevOwner = Reader.getSubmodule(PrevModID);
Douglas Gregor5e461192013-06-07 22:56:11 +00001953 if (PrevOwner && PrevOwner == NewOwner)
Argyrios Kyrtzidis3a9c42c2013-03-27 01:25:34 +00001954 return false;
Chandler Carruthc2132d82015-03-13 08:29:54 +00001955 SourceManager &SrcMgr = Reader.getSourceManager();
1956 bool PrevInSystem = (PrevOwner && PrevOwner->IsSystem) ||
1957 SrcMgr.isInSystemHeader(PrevMI->getDefinitionLoc());
1958 bool NewInSystem = (NewOwner && NewOwner->IsSystem) ||
1959 SrcMgr.isInSystemHeader(NewMI->getDefinitionLoc());
Douglas Gregor5e461192013-06-07 22:56:11 +00001960 return PrevInSystem && NewInSystem;
Argyrios Kyrtzidis3a9c42c2013-03-27 01:25:34 +00001961}
1962
Richard Smith49f906a2014-03-01 00:08:04 +00001963void ASTReader::removeOverriddenMacros(IdentifierInfo *II,
Richard Smithdaa69e02014-07-25 04:40:03 +00001964 SourceLocation ImportLoc,
Richard Smith49f906a2014-03-01 00:08:04 +00001965 AmbiguousMacros &Ambig,
Craig Topper00bbdcf2014-06-28 23:22:23 +00001966 ArrayRef<SubmoduleID> Overrides) {
Richard Smith49f906a2014-03-01 00:08:04 +00001967 for (unsigned OI = 0, ON = Overrides.size(); OI != ON; ++OI) {
1968 SubmoduleID OwnerID = Overrides[OI];
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001969
Richard Smith49f906a2014-03-01 00:08:04 +00001970 // If this macro is not yet visible, remove it from the hidden names list.
Richard Smithbb853c72014-08-13 01:23:33 +00001971 // It won't be there if we're in the middle of making the owner visible.
Richard Smith49f906a2014-03-01 00:08:04 +00001972 Module *Owner = getSubmodule(OwnerID);
Richard Smithbb853c72014-08-13 01:23:33 +00001973 auto HiddenIt = HiddenNamesMap.find(Owner);
1974 if (HiddenIt != HiddenNamesMap.end()) {
1975 HiddenNames &Hidden = HiddenIt->second;
1976 HiddenMacrosMap::iterator HI = Hidden.HiddenMacros.find(II);
1977 if (HI != Hidden.HiddenMacros.end()) {
1978 // Register the macro now so we don't lose it when we re-export.
1979 PP.appendMacroDirective(II, HI->second->import(PP, ImportLoc));
Richard Smithdaa69e02014-07-25 04:40:03 +00001980
Richard Smithbb853c72014-08-13 01:23:33 +00001981 auto SubOverrides = HI->second->getOverriddenSubmodules();
1982 Hidden.HiddenMacros.erase(HI);
1983 removeOverriddenMacros(II, ImportLoc, Ambig, SubOverrides);
1984 }
Richard Smith49f906a2014-03-01 00:08:04 +00001985 }
1986
1987 // If this macro is already in our list of conflicts, remove it from there.
Richard Smithbb29e512014-03-06 00:33:23 +00001988 Ambig.erase(
1989 std::remove_if(Ambig.begin(), Ambig.end(), [&](DefMacroDirective *MD) {
1990 return MD->getInfo()->getOwningModuleID() == OwnerID;
1991 }),
1992 Ambig.end());
Richard Smith49f906a2014-03-01 00:08:04 +00001993 }
1994}
1995
1996ASTReader::AmbiguousMacros *
1997ASTReader::removeOverriddenMacros(IdentifierInfo *II,
Richard Smithdaa69e02014-07-25 04:40:03 +00001998 SourceLocation ImportLoc,
Craig Topper00bbdcf2014-06-28 23:22:23 +00001999 ArrayRef<SubmoduleID> Overrides) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00002000 MacroDirective *Prev = PP.getMacroDirective(II);
Richard Smith49f906a2014-03-01 00:08:04 +00002001 if (!Prev && Overrides.empty())
Craig Toppera13603a2014-05-22 05:54:18 +00002002 return nullptr;
Richard Smith49f906a2014-03-01 00:08:04 +00002003
Craig Toppera13603a2014-05-22 05:54:18 +00002004 DefMacroDirective *PrevDef = Prev ? Prev->getDefinition().getDirective()
2005 : nullptr;
Richard Smith49f906a2014-03-01 00:08:04 +00002006 if (PrevDef && PrevDef->isAmbiguous()) {
2007 // We had a prior ambiguity. Check whether we resolve it (or make it worse).
2008 AmbiguousMacros &Ambig = AmbiguousMacroDefs[II];
2009 Ambig.push_back(PrevDef);
2010
Richard Smithdaa69e02014-07-25 04:40:03 +00002011 removeOverriddenMacros(II, ImportLoc, Ambig, Overrides);
Richard Smith49f906a2014-03-01 00:08:04 +00002012
2013 if (!Ambig.empty())
2014 return &Ambig;
2015
2016 AmbiguousMacroDefs.erase(II);
2017 } else {
2018 // There's no ambiguity yet. Maybe we're introducing one.
Benjamin Kramer834652a2014-05-03 18:44:26 +00002019 AmbiguousMacros Ambig;
Richard Smith49f906a2014-03-01 00:08:04 +00002020 if (PrevDef)
2021 Ambig.push_back(PrevDef);
2022
Richard Smithdaa69e02014-07-25 04:40:03 +00002023 removeOverriddenMacros(II, ImportLoc, Ambig, Overrides);
Richard Smith49f906a2014-03-01 00:08:04 +00002024
2025 if (!Ambig.empty()) {
2026 AmbiguousMacros &Result = AmbiguousMacroDefs[II];
Benjamin Kramer834652a2014-05-03 18:44:26 +00002027 std::swap(Result, Ambig);
Richard Smith49f906a2014-03-01 00:08:04 +00002028 return &Result;
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00002029 }
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00002030 }
Richard Smith49f906a2014-03-01 00:08:04 +00002031
2032 // We ended up with no ambiguity.
Craig Toppera13603a2014-05-22 05:54:18 +00002033 return nullptr;
Richard Smith49f906a2014-03-01 00:08:04 +00002034}
2035
2036void ASTReader::installImportedMacro(IdentifierInfo *II, ModuleMacroInfo *MMI,
Richard Smithdaa69e02014-07-25 04:40:03 +00002037 Module *Owner) {
Richard Smith49f906a2014-03-01 00:08:04 +00002038 assert(II && Owner);
2039
2040 SourceLocation ImportLoc = Owner->MacroVisibilityLoc;
Richard Smithdaa69e02014-07-25 04:40:03 +00002041 if (ImportLoc.isInvalid()) {
Richard Smith49f906a2014-03-01 00:08:04 +00002042 // FIXME: If we made macros from this module visible but didn't provide a
2043 // source location for the import, we don't have a location for the macro.
2044 // Use the location at which the containing module file was first imported
2045 // for now.
2046 ImportLoc = MMI->F->DirectImportLoc;
Richard Smith56be7542014-03-21 00:33:59 +00002047 assert(ImportLoc.isValid() && "no import location for a visible macro?");
Richard Smith49f906a2014-03-01 00:08:04 +00002048 }
2049
Benjamin Kramer834652a2014-05-03 18:44:26 +00002050 AmbiguousMacros *Prev =
Richard Smithdaa69e02014-07-25 04:40:03 +00002051 removeOverriddenMacros(II, ImportLoc, MMI->getOverriddenSubmodules());
Richard Smith49f906a2014-03-01 00:08:04 +00002052
Richard Smith49f906a2014-03-01 00:08:04 +00002053 // Create a synthetic macro definition corresponding to the import (or null
2054 // if this was an undefinition of the macro).
Richard Smithdaa69e02014-07-25 04:40:03 +00002055 MacroDirective *Imported = MMI->import(PP, ImportLoc);
2056 DefMacroDirective *MD = dyn_cast<DefMacroDirective>(Imported);
Richard Smith49f906a2014-03-01 00:08:04 +00002057
2058 // If there's no ambiguity, just install the macro.
2059 if (!Prev) {
Richard Smithdaa69e02014-07-25 04:40:03 +00002060 PP.appendMacroDirective(II, Imported);
Richard Smith49f906a2014-03-01 00:08:04 +00002061 return;
2062 }
2063 assert(!Prev->empty());
2064
2065 if (!MD) {
2066 // We imported a #undef that didn't remove all prior definitions. The most
2067 // recent prior definition remains, and we install it in the place of the
Richard Smithdaa69e02014-07-25 04:40:03 +00002068 // imported directive, as if by a local #pragma pop_macro.
Richard Smith49f906a2014-03-01 00:08:04 +00002069 MacroInfo *NewMI = Prev->back()->getInfo();
2070 Prev->pop_back();
Richard Smithdaa69e02014-07-25 04:40:03 +00002071 MD = PP.AllocateDefMacroDirective(NewMI, ImportLoc);
2072
2073 // Install our #undef first so that we don't lose track of it. We'll replace
2074 // this with whichever macro definition ends up winning.
2075 PP.appendMacroDirective(II, Imported);
Richard Smith49f906a2014-03-01 00:08:04 +00002076 }
2077
2078 // We're introducing a macro definition that creates or adds to an ambiguity.
2079 // We can resolve that ambiguity if this macro is token-for-token identical to
2080 // all of the existing definitions.
2081 MacroInfo *NewMI = MD->getInfo();
2082 assert(NewMI && "macro definition with no MacroInfo?");
2083 while (!Prev->empty()) {
2084 MacroInfo *PrevMI = Prev->back()->getInfo();
2085 assert(PrevMI && "macro definition with no MacroInfo?");
2086
2087 // Before marking the macros as ambiguous, check if this is a case where
2088 // both macros are in system headers. If so, we trust that the system
2089 // did not get it wrong. This also handles cases where Clang's own
2090 // headers have a different spelling of certain system macros:
2091 // #define LONG_MAX __LONG_MAX__ (clang's limits.h)
2092 // #define LONG_MAX 0x7fffffffffffffffL (system's limits.h)
2093 //
2094 // FIXME: Remove the defined-in-system-headers check. clang's limits.h
2095 // overrides the system limits.h's macros, so there's no conflict here.
2096 if (NewMI != PrevMI &&
2097 !PrevMI->isIdenticalTo(*NewMI, PP, /*Syntactically=*/true) &&
2098 !areDefinedInSystemModules(PrevMI, NewMI, Owner, *this))
2099 break;
2100
2101 // The previous definition is the same as this one (or both are defined in
2102 // system modules so we can assume they're equivalent); we don't need to
2103 // track it any more.
2104 Prev->pop_back();
2105 }
2106
2107 if (!Prev->empty())
2108 MD->setAmbiguous(true);
2109
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00002110 PP.appendMacroDirective(II, MD);
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00002111}
2112
Argyrios Kyrtzidisce9b49e2014-03-14 02:26:27 +00002113ASTReader::InputFileInfo
2114ASTReader::readInputFileInfo(ModuleFile &F, unsigned ID) {
Ben Langmuir198c1682014-03-07 07:27:49 +00002115 // Go find this input file.
2116 BitstreamCursor &Cursor = F.InputFilesCursor;
2117 SavedStreamPosition SavedPosition(Cursor);
2118 Cursor.JumpToBit(F.InputFileOffsets[ID-1]);
2119
2120 unsigned Code = Cursor.ReadCode();
2121 RecordData Record;
2122 StringRef Blob;
2123
2124 unsigned Result = Cursor.readRecord(Code, Record, &Blob);
2125 assert(static_cast<InputFileRecordTypes>(Result) == INPUT_FILE &&
2126 "invalid record type for input file");
2127 (void)Result;
2128
Argyrios Kyrtzidisce9b49e2014-03-14 02:26:27 +00002129 std::string Filename;
2130 off_t StoredSize;
2131 time_t StoredTime;
2132 bool Overridden;
Richard Smith7ed1bc92014-12-05 22:42:13 +00002133
Ben Langmuir198c1682014-03-07 07:27:49 +00002134 assert(Record[0] == ID && "Bogus stored ID or offset");
2135 StoredSize = static_cast<off_t>(Record[1]);
2136 StoredTime = static_cast<time_t>(Record[2]);
2137 Overridden = static_cast<bool>(Record[3]);
2138 Filename = Blob;
Richard Smith7ed1bc92014-12-05 22:42:13 +00002139 ResolveImportedPath(F, Filename);
2140
Hans Wennborg73945142014-03-14 17:45:06 +00002141 InputFileInfo R = { std::move(Filename), StoredSize, StoredTime, Overridden };
2142 return R;
Ben Langmuir198c1682014-03-07 07:27:49 +00002143}
2144
2145std::string ASTReader::getInputFileName(ModuleFile &F, unsigned int ID) {
Argyrios Kyrtzidisce9b49e2014-03-14 02:26:27 +00002146 return readInputFileInfo(F, ID).Filename;
Ben Langmuir198c1682014-03-07 07:27:49 +00002147}
2148
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00002149InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002150 // If this ID is bogus, just return an empty input file.
2151 if (ID == 0 || ID > F.InputFilesLoaded.size())
2152 return InputFile();
2153
2154 // If we've already loaded this input file, return it.
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00002155 if (F.InputFilesLoaded[ID-1].getFile())
Guy Benyei11169dd2012-12-18 14:30:41 +00002156 return F.InputFilesLoaded[ID-1];
2157
Argyrios Kyrtzidis9308f0a2014-01-08 19:13:34 +00002158 if (F.InputFilesLoaded[ID-1].isNotFound())
2159 return InputFile();
2160
Guy Benyei11169dd2012-12-18 14:30:41 +00002161 // Go find this input file.
Chris Lattner7fb3bef2013-01-20 00:56:42 +00002162 BitstreamCursor &Cursor = F.InputFilesCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00002163 SavedStreamPosition SavedPosition(Cursor);
2164 Cursor.JumpToBit(F.InputFileOffsets[ID-1]);
2165
Argyrios Kyrtzidisce9b49e2014-03-14 02:26:27 +00002166 InputFileInfo FI = readInputFileInfo(F, ID);
2167 off_t StoredSize = FI.StoredSize;
2168 time_t StoredTime = FI.StoredTime;
2169 bool Overridden = FI.Overridden;
2170 StringRef Filename = FI.Filename;
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00002171
Ben Langmuir198c1682014-03-07 07:27:49 +00002172 const FileEntry *File
2173 = Overridden? FileMgr.getVirtualFile(Filename, StoredSize, StoredTime)
2174 : FileMgr.getFile(Filename, /*OpenFile=*/false);
2175
2176 // If we didn't find the file, resolve it relative to the
2177 // original directory from which this AST file was created.
Craig Toppera13603a2014-05-22 05:54:18 +00002178 if (File == nullptr && !F.OriginalDir.empty() && !CurrentDir.empty() &&
Ben Langmuir198c1682014-03-07 07:27:49 +00002179 F.OriginalDir != CurrentDir) {
2180 std::string Resolved = resolveFileRelativeToOriginalDir(Filename,
2181 F.OriginalDir,
2182 CurrentDir);
2183 if (!Resolved.empty())
2184 File = FileMgr.getFile(Resolved);
2185 }
2186
2187 // For an overridden file, create a virtual file with the stored
2188 // size/timestamp.
Craig Toppera13603a2014-05-22 05:54:18 +00002189 if (Overridden && File == nullptr) {
Ben Langmuir198c1682014-03-07 07:27:49 +00002190 File = FileMgr.getVirtualFile(Filename, StoredSize, StoredTime);
2191 }
2192
Craig Toppera13603a2014-05-22 05:54:18 +00002193 if (File == nullptr) {
Ben Langmuir198c1682014-03-07 07:27:49 +00002194 if (Complain) {
2195 std::string ErrorStr = "could not find file '";
2196 ErrorStr += Filename;
2197 ErrorStr += "' referenced by AST file";
2198 Error(ErrorStr.c_str());
Guy Benyei11169dd2012-12-18 14:30:41 +00002199 }
Ben Langmuir198c1682014-03-07 07:27:49 +00002200 // Record that we didn't find the file.
2201 F.InputFilesLoaded[ID-1] = InputFile::getNotFound();
2202 return InputFile();
2203 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002204
Ben Langmuir198c1682014-03-07 07:27:49 +00002205 // Check if there was a request to override the contents of the file
2206 // that was part of the precompiled header. Overridding such a file
2207 // can lead to problems when lexing using the source locations from the
2208 // PCH.
2209 SourceManager &SM = getSourceManager();
2210 if (!Overridden && SM.isFileOverridden(File)) {
2211 if (Complain)
2212 Error(diag::err_fe_pch_file_overridden, Filename);
2213 // After emitting the diagnostic, recover by disabling the override so
2214 // that the original file will be used.
2215 SM.disableFileContentsOverride(File);
2216 // The FileEntry is a virtual file entry with the size of the contents
2217 // that would override the original contents. Set it to the original's
2218 // size/time.
2219 FileMgr.modifyFileEntry(const_cast<FileEntry*>(File),
2220 StoredSize, StoredTime);
2221 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002222
Ben Langmuir198c1682014-03-07 07:27:49 +00002223 bool IsOutOfDate = false;
2224
2225 // For an overridden file, there is nothing to validate.
Richard Smith96fdab62014-10-28 16:24:08 +00002226 if (!Overridden && //
2227 (StoredSize != File->getSize() ||
2228#if defined(LLVM_ON_WIN32)
2229 false
2230#else
Ben Langmuir198c1682014-03-07 07:27:49 +00002231 // In our regression testing, the Windows file system seems to
2232 // have inconsistent modification times that sometimes
2233 // erroneously trigger this error-handling path.
Richard Smith96fdab62014-10-28 16:24:08 +00002234 //
2235 // This also happens in networked file systems, so disable this
2236 // check if validation is disabled or if we have an explicitly
2237 // built PCM file.
2238 //
2239 // FIXME: Should we also do this for PCH files? They could also
2240 // reasonably get shared across a network during a distributed build.
2241 (StoredTime != File->getModificationTime() && !DisableValidation &&
2242 F.Kind != MK_ExplicitModule)
Guy Benyei11169dd2012-12-18 14:30:41 +00002243#endif
Ben Langmuir198c1682014-03-07 07:27:49 +00002244 )) {
2245 if (Complain) {
2246 // Build a list of the PCH imports that got us here (in reverse).
2247 SmallVector<ModuleFile *, 4> ImportStack(1, &F);
2248 while (ImportStack.back()->ImportedBy.size() > 0)
2249 ImportStack.push_back(ImportStack.back()->ImportedBy[0]);
Ben Langmuire82630d2014-01-17 00:19:09 +00002250
Ben Langmuir198c1682014-03-07 07:27:49 +00002251 // The top-level PCH is stale.
2252 StringRef TopLevelPCHName(ImportStack.back()->FileName);
2253 Error(diag::err_fe_pch_file_modified, Filename, TopLevelPCHName);
Ben Langmuire82630d2014-01-17 00:19:09 +00002254
Ben Langmuir198c1682014-03-07 07:27:49 +00002255 // Print the import stack.
2256 if (ImportStack.size() > 1 && !Diags.isDiagnosticInFlight()) {
2257 Diag(diag::note_pch_required_by)
2258 << Filename << ImportStack[0]->FileName;
2259 for (unsigned I = 1; I < ImportStack.size(); ++I)
Ben Langmuire82630d2014-01-17 00:19:09 +00002260 Diag(diag::note_pch_required_by)
Ben Langmuir198c1682014-03-07 07:27:49 +00002261 << ImportStack[I-1]->FileName << ImportStack[I]->FileName;
Douglas Gregor7029ce12013-03-19 00:28:20 +00002262 }
2263
Ben Langmuir198c1682014-03-07 07:27:49 +00002264 if (!Diags.isDiagnosticInFlight())
2265 Diag(diag::note_pch_rebuild_required) << TopLevelPCHName;
Guy Benyei11169dd2012-12-18 14:30:41 +00002266 }
2267
Ben Langmuir198c1682014-03-07 07:27:49 +00002268 IsOutOfDate = true;
Guy Benyei11169dd2012-12-18 14:30:41 +00002269 }
2270
Ben Langmuir198c1682014-03-07 07:27:49 +00002271 InputFile IF = InputFile(File, Overridden, IsOutOfDate);
2272
2273 // Note that we've loaded this input file.
2274 F.InputFilesLoaded[ID-1] = IF;
2275 return IF;
Guy Benyei11169dd2012-12-18 14:30:41 +00002276}
2277
Richard Smith7ed1bc92014-12-05 22:42:13 +00002278/// \brief If we are loading a relocatable PCH or module file, and the filename
2279/// is not an absolute path, add the system or module root to the beginning of
2280/// the file name.
2281void ASTReader::ResolveImportedPath(ModuleFile &M, std::string &Filename) {
2282 // Resolve relative to the base directory, if we have one.
2283 if (!M.BaseDirectory.empty())
2284 return ResolveImportedPath(Filename, M.BaseDirectory);
Guy Benyei11169dd2012-12-18 14:30:41 +00002285}
2286
Richard Smith7ed1bc92014-12-05 22:42:13 +00002287void ASTReader::ResolveImportedPath(std::string &Filename, StringRef Prefix) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002288 if (Filename.empty() || llvm::sys::path::is_absolute(Filename))
2289 return;
2290
Richard Smith7ed1bc92014-12-05 22:42:13 +00002291 SmallString<128> Buffer;
2292 llvm::sys::path::append(Buffer, Prefix, Filename);
2293 Filename.assign(Buffer.begin(), Buffer.end());
Guy Benyei11169dd2012-12-18 14:30:41 +00002294}
2295
2296ASTReader::ASTReadResult
2297ASTReader::ReadControlBlock(ModuleFile &F,
Dmitri Gribenkof8579502013-01-12 19:30:44 +00002298 SmallVectorImpl<ImportedModule> &Loaded,
Ben Langmuirbeee15e2014-04-14 18:00:01 +00002299 const ModuleFile *ImportedBy,
Guy Benyei11169dd2012-12-18 14:30:41 +00002300 unsigned ClientLoadCapabilities) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00002301 BitstreamCursor &Stream = F.Stream;
Guy Benyei11169dd2012-12-18 14:30:41 +00002302
2303 if (Stream.EnterSubBlock(CONTROL_BLOCK_ID)) {
2304 Error("malformed block record in AST file");
2305 return Failure;
2306 }
2307
Richard Smith1e2cf0d2014-10-31 02:28:58 +00002308 // Should we allow the configuration of the module file to differ from the
2309 // configuration of the current translation unit in a compatible way?
2310 //
2311 // FIXME: Allow this for files explicitly specified with -include-pch too.
2312 bool AllowCompatibleConfigurationMismatch = F.Kind == MK_ExplicitModule;
2313
Guy Benyei11169dd2012-12-18 14:30:41 +00002314 // Read all of the records and blocks in the control block.
2315 RecordData Record;
Richard Smitha1825302014-10-23 22:18:29 +00002316 unsigned NumInputs = 0;
2317 unsigned NumUserInputs = 0;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002318 while (1) {
2319 llvm::BitstreamEntry Entry = Stream.advance();
2320
2321 switch (Entry.Kind) {
2322 case llvm::BitstreamEntry::Error:
2323 Error("malformed block record in AST file");
2324 return Failure;
Dmitri Gribenkof430da42014-02-12 10:33:14 +00002325 case llvm::BitstreamEntry::EndBlock: {
2326 // Validate input files.
2327 const HeaderSearchOptions &HSOpts =
2328 PP.getHeaderSearchInfo().getHeaderSearchOpts();
Ben Langmuircb69b572014-03-07 06:40:32 +00002329
Richard Smitha1825302014-10-23 22:18:29 +00002330 // All user input files reside at the index range [0, NumUserInputs), and
2331 // system input files reside at [NumUserInputs, NumInputs).
Ben Langmuiracb803e2014-11-10 22:13:10 +00002332 if (!DisableValidation) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002333 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
Ben Langmuircb69b572014-03-07 06:40:32 +00002334
Dmitri Gribenkof430da42014-02-12 10:33:14 +00002335 // If we are reading a module, we will create a verification timestamp,
2336 // so we verify all input files. Otherwise, verify only user input
2337 // files.
Ben Langmuircb69b572014-03-07 06:40:32 +00002338
2339 unsigned N = NumUserInputs;
2340 if (ValidateSystemInputs ||
Richard Smithe842a472014-10-22 02:05:46 +00002341 (HSOpts.ModulesValidateOncePerBuildSession &&
Ben Langmuiracb803e2014-11-10 22:13:10 +00002342 F.InputFilesValidationTimestamp <= HSOpts.BuildSessionTimestamp &&
Richard Smithe842a472014-10-22 02:05:46 +00002343 F.Kind == MK_ImplicitModule))
Ben Langmuircb69b572014-03-07 06:40:32 +00002344 N = NumInputs;
2345
Ben Langmuir3d4417c2014-02-07 17:31:11 +00002346 for (unsigned I = 0; I < N; ++I) {
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00002347 InputFile IF = getInputFile(F, I+1, Complain);
2348 if (!IF.getFile() || IF.isOutOfDate())
Guy Benyei11169dd2012-12-18 14:30:41 +00002349 return OutOfDate;
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00002350 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002351 }
Ben Langmuircb69b572014-03-07 06:40:32 +00002352
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +00002353 if (Listener)
2354 Listener->visitModuleFile(F.FileName);
2355
Ben Langmuircb69b572014-03-07 06:40:32 +00002356 if (Listener && Listener->needsInputFileVisitation()) {
2357 unsigned N = Listener->needsSystemInputFileVisitation() ? NumInputs
2358 : NumUserInputs;
Argyrios Kyrtzidis68ccbe02014-03-14 02:26:31 +00002359 for (unsigned I = 0; I < N; ++I) {
2360 bool IsSystem = I >= NumUserInputs;
2361 InputFileInfo FI = readInputFileInfo(F, I+1);
2362 Listener->visitInputFile(FI.Filename, IsSystem, FI.Overridden);
2363 }
Ben Langmuircb69b572014-03-07 06:40:32 +00002364 }
2365
Guy Benyei11169dd2012-12-18 14:30:41 +00002366 return Success;
Dmitri Gribenkof430da42014-02-12 10:33:14 +00002367 }
2368
Chris Lattnere7b154b2013-01-19 21:39:22 +00002369 case llvm::BitstreamEntry::SubBlock:
2370 switch (Entry.ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002371 case INPUT_FILES_BLOCK_ID:
2372 F.InputFilesCursor = Stream;
2373 if (Stream.SkipBlock() || // Skip with the main cursor
2374 // Read the abbreviations
2375 ReadBlockAbbrevs(F.InputFilesCursor, INPUT_FILES_BLOCK_ID)) {
2376 Error("malformed block record in AST file");
2377 return Failure;
2378 }
2379 continue;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002380
Guy Benyei11169dd2012-12-18 14:30:41 +00002381 default:
Chris Lattnere7b154b2013-01-19 21:39:22 +00002382 if (Stream.SkipBlock()) {
2383 Error("malformed block record in AST file");
2384 return Failure;
2385 }
2386 continue;
Guy Benyei11169dd2012-12-18 14:30:41 +00002387 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00002388
2389 case llvm::BitstreamEntry::Record:
2390 // The interesting case.
2391 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00002392 }
2393
2394 // Read and process a record.
2395 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00002396 StringRef Blob;
2397 switch ((ControlRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002398 case METADATA: {
2399 if (Record[0] != VERSION_MAJOR && !DisableValidation) {
2400 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
Dmitri Gribenko2228cd32014-02-11 15:40:09 +00002401 Diag(Record[0] < VERSION_MAJOR? diag::err_pch_version_too_old
2402 : diag::err_pch_version_too_new);
Guy Benyei11169dd2012-12-18 14:30:41 +00002403 return VersionMismatch;
2404 }
2405
2406 bool hasErrors = Record[5];
2407 if (hasErrors && !DisableValidation && !AllowASTWithCompilerErrors) {
2408 Diag(diag::err_pch_with_compiler_errors);
2409 return HadErrors;
2410 }
2411
2412 F.RelocatablePCH = Record[4];
Richard Smith7ed1bc92014-12-05 22:42:13 +00002413 // Relative paths in a relocatable PCH are relative to our sysroot.
2414 if (F.RelocatablePCH)
2415 F.BaseDirectory = isysroot.empty() ? "/" : isysroot;
Guy Benyei11169dd2012-12-18 14:30:41 +00002416
2417 const std::string &CurBranch = getClangFullRepositoryVersion();
Chris Lattner0e6c9402013-01-20 02:38:54 +00002418 StringRef ASTBranch = Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00002419 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) {
2420 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
Dmitri Gribenko2228cd32014-02-11 15:40:09 +00002421 Diag(diag::err_pch_different_branch) << ASTBranch << CurBranch;
Guy Benyei11169dd2012-12-18 14:30:41 +00002422 return VersionMismatch;
2423 }
2424 break;
2425 }
2426
Ben Langmuir487ea142014-10-23 18:05:36 +00002427 case SIGNATURE:
2428 assert((!F.Signature || F.Signature == Record[0]) && "signature changed");
2429 F.Signature = Record[0];
2430 break;
2431
Guy Benyei11169dd2012-12-18 14:30:41 +00002432 case IMPORTS: {
2433 // Load each of the imported PCH files.
2434 unsigned Idx = 0, N = Record.size();
2435 while (Idx < N) {
2436 // Read information about the AST file.
2437 ModuleKind ImportedKind = (ModuleKind)Record[Idx++];
2438 // The import location will be the local one for now; we will adjust
2439 // all import locations of module imports after the global source
2440 // location info are setup.
2441 SourceLocation ImportLoc =
2442 SourceLocation::getFromRawEncoding(Record[Idx++]);
Douglas Gregor7029ce12013-03-19 00:28:20 +00002443 off_t StoredSize = (off_t)Record[Idx++];
2444 time_t StoredModTime = (time_t)Record[Idx++];
Ben Langmuir487ea142014-10-23 18:05:36 +00002445 ASTFileSignature StoredSignature = Record[Idx++];
Richard Smith7ed1bc92014-12-05 22:42:13 +00002446 auto ImportedFile = ReadPath(F, Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00002447
2448 // Load the AST file.
2449 switch(ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F, Loaded,
Ben Langmuir487ea142014-10-23 18:05:36 +00002450 StoredSize, StoredModTime, StoredSignature,
Guy Benyei11169dd2012-12-18 14:30:41 +00002451 ClientLoadCapabilities)) {
2452 case Failure: return Failure;
2453 // If we have to ignore the dependency, we'll have to ignore this too.
Douglas Gregor2f1806e2013-03-19 00:38:50 +00002454 case Missing:
Guy Benyei11169dd2012-12-18 14:30:41 +00002455 case OutOfDate: return OutOfDate;
2456 case VersionMismatch: return VersionMismatch;
2457 case ConfigurationMismatch: return ConfigurationMismatch;
2458 case HadErrors: return HadErrors;
2459 case Success: break;
2460 }
2461 }
2462 break;
2463 }
2464
Richard Smith7f330cd2015-03-18 01:42:29 +00002465 case KNOWN_MODULE_FILES:
2466 break;
2467
Guy Benyei11169dd2012-12-18 14:30:41 +00002468 case LANGUAGE_OPTIONS: {
2469 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
Richard Smith1e2cf0d2014-10-31 02:28:58 +00002470 // FIXME: The &F == *ModuleMgr.begin() check is wrong for modules.
Guy Benyei11169dd2012-12-18 14:30:41 +00002471 if (Listener && &F == *ModuleMgr.begin() &&
Richard Smith1e2cf0d2014-10-31 02:28:58 +00002472 ParseLanguageOptions(Record, Complain, *Listener,
2473 AllowCompatibleConfigurationMismatch) &&
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002474 !DisableValidation && !AllowConfigurationMismatch)
Guy Benyei11169dd2012-12-18 14:30:41 +00002475 return ConfigurationMismatch;
2476 break;
2477 }
2478
2479 case TARGET_OPTIONS: {
2480 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
2481 if (Listener && &F == *ModuleMgr.begin() &&
Chandler Carruth0d745bc2015-03-14 04:47:43 +00002482 ParseTargetOptions(Record, Complain, *Listener,
2483 AllowCompatibleConfigurationMismatch) &&
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002484 !DisableValidation && !AllowConfigurationMismatch)
Guy Benyei11169dd2012-12-18 14:30:41 +00002485 return ConfigurationMismatch;
2486 break;
2487 }
2488
2489 case DIAGNOSTIC_OPTIONS: {
Ben Langmuirb92de022014-04-29 16:25:26 +00002490 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate)==0;
Guy Benyei11169dd2012-12-18 14:30:41 +00002491 if (Listener && &F == *ModuleMgr.begin() &&
Richard Smith1e2cf0d2014-10-31 02:28:58 +00002492 !AllowCompatibleConfigurationMismatch &&
Guy Benyei11169dd2012-12-18 14:30:41 +00002493 ParseDiagnosticOptions(Record, Complain, *Listener) &&
Ben Langmuirb92de022014-04-29 16:25:26 +00002494 !DisableValidation)
2495 return OutOfDate;
Guy Benyei11169dd2012-12-18 14:30:41 +00002496 break;
2497 }
2498
2499 case FILE_SYSTEM_OPTIONS: {
2500 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
2501 if (Listener && &F == *ModuleMgr.begin() &&
Richard Smith1e2cf0d2014-10-31 02:28:58 +00002502 !AllowCompatibleConfigurationMismatch &&
Guy Benyei11169dd2012-12-18 14:30:41 +00002503 ParseFileSystemOptions(Record, Complain, *Listener) &&
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002504 !DisableValidation && !AllowConfigurationMismatch)
Guy Benyei11169dd2012-12-18 14:30:41 +00002505 return ConfigurationMismatch;
2506 break;
2507 }
2508
2509 case HEADER_SEARCH_OPTIONS: {
2510 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
2511 if (Listener && &F == *ModuleMgr.begin() &&
Richard Smith1e2cf0d2014-10-31 02:28:58 +00002512 !AllowCompatibleConfigurationMismatch &&
Guy Benyei11169dd2012-12-18 14:30:41 +00002513 ParseHeaderSearchOptions(Record, Complain, *Listener) &&
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002514 !DisableValidation && !AllowConfigurationMismatch)
Guy Benyei11169dd2012-12-18 14:30:41 +00002515 return ConfigurationMismatch;
2516 break;
2517 }
2518
2519 case PREPROCESSOR_OPTIONS: {
2520 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
2521 if (Listener && &F == *ModuleMgr.begin() &&
Richard Smith1e2cf0d2014-10-31 02:28:58 +00002522 !AllowCompatibleConfigurationMismatch &&
Guy Benyei11169dd2012-12-18 14:30:41 +00002523 ParsePreprocessorOptions(Record, Complain, *Listener,
2524 SuggestedPredefines) &&
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002525 !DisableValidation && !AllowConfigurationMismatch)
Guy Benyei11169dd2012-12-18 14:30:41 +00002526 return ConfigurationMismatch;
2527 break;
2528 }
2529
2530 case ORIGINAL_FILE:
2531 F.OriginalSourceFileID = FileID::get(Record[0]);
Chris Lattner0e6c9402013-01-20 02:38:54 +00002532 F.ActualOriginalSourceFileName = Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00002533 F.OriginalSourceFileName = F.ActualOriginalSourceFileName;
Richard Smith7ed1bc92014-12-05 22:42:13 +00002534 ResolveImportedPath(F, F.OriginalSourceFileName);
Guy Benyei11169dd2012-12-18 14:30:41 +00002535 break;
2536
2537 case ORIGINAL_FILE_ID:
2538 F.OriginalSourceFileID = FileID::get(Record[0]);
2539 break;
2540
2541 case ORIGINAL_PCH_DIR:
Chris Lattner0e6c9402013-01-20 02:38:54 +00002542 F.OriginalDir = Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00002543 break;
2544
Ben Langmuirbeee15e2014-04-14 18:00:01 +00002545 case MODULE_NAME:
2546 F.ModuleName = Blob;
Ben Langmuir4f5212a2014-04-14 22:12:44 +00002547 if (Listener)
2548 Listener->ReadModuleName(F.ModuleName);
Ben Langmuirbeee15e2014-04-14 18:00:01 +00002549 break;
2550
Richard Smith223d3f22014-12-06 03:21:08 +00002551 case MODULE_DIRECTORY: {
2552 assert(!F.ModuleName.empty() &&
2553 "MODULE_DIRECTORY found before MODULE_NAME");
2554 // If we've already loaded a module map file covering this module, we may
2555 // have a better path for it (relative to the current build).
2556 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName);
2557 if (M && M->Directory) {
2558 // If we're implicitly loading a module, the base directory can't
2559 // change between the build and use.
2560 if (F.Kind != MK_ExplicitModule) {
2561 const DirectoryEntry *BuildDir =
2562 PP.getFileManager().getDirectory(Blob);
2563 if (!BuildDir || BuildDir != M->Directory) {
2564 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
2565 Diag(diag::err_imported_module_relocated)
2566 << F.ModuleName << Blob << M->Directory->getName();
2567 return OutOfDate;
2568 }
2569 }
2570 F.BaseDirectory = M->Directory->getName();
2571 } else {
2572 F.BaseDirectory = Blob;
2573 }
Richard Smith7ed1bc92014-12-05 22:42:13 +00002574 break;
Richard Smith223d3f22014-12-06 03:21:08 +00002575 }
Richard Smith7ed1bc92014-12-05 22:42:13 +00002576
Ben Langmuirbeee15e2014-04-14 18:00:01 +00002577 case MODULE_MAP_FILE:
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00002578 if (ASTReadResult Result =
2579 ReadModuleMapFileBlock(Record, F, ImportedBy, ClientLoadCapabilities))
2580 return Result;
Ben Langmuir264ea152014-11-08 00:06:39 +00002581 break;
2582
Guy Benyei11169dd2012-12-18 14:30:41 +00002583 case INPUT_FILE_OFFSETS:
Richard Smitha1825302014-10-23 22:18:29 +00002584 NumInputs = Record[0];
2585 NumUserInputs = Record[1];
Richard Smithec216502015-02-13 19:48:37 +00002586 F.InputFileOffsets = (const uint64_t *)Blob.data();
Richard Smitha1825302014-10-23 22:18:29 +00002587 F.InputFilesLoaded.resize(NumInputs);
Guy Benyei11169dd2012-12-18 14:30:41 +00002588 break;
2589 }
2590 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002591}
2592
Ben Langmuir2c9af442014-04-10 17:57:43 +00002593ASTReader::ASTReadResult
2594ASTReader::ReadASTBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00002595 BitstreamCursor &Stream = F.Stream;
Guy Benyei11169dd2012-12-18 14:30:41 +00002596
2597 if (Stream.EnterSubBlock(AST_BLOCK_ID)) {
2598 Error("malformed block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002599 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002600 }
2601
2602 // Read all of the records and blocks for the AST file.
2603 RecordData Record;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002604 while (1) {
2605 llvm::BitstreamEntry Entry = Stream.advance();
2606
2607 switch (Entry.Kind) {
2608 case llvm::BitstreamEntry::Error:
2609 Error("error at end of module block in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002610 return Failure;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002611 case llvm::BitstreamEntry::EndBlock: {
Richard Smithc0fbba72013-04-03 22:49:41 +00002612 // Outside of C++, we do not store a lookup map for the translation unit.
2613 // Instead, mark it as needing a lookup map to be built if this module
2614 // contains any declarations lexically within it (which it always does!).
2615 // This usually has no cost, since we very rarely need the lookup map for
2616 // the translation unit outside C++.
Guy Benyei11169dd2012-12-18 14:30:41 +00002617 DeclContext *DC = Context.getTranslationUnitDecl();
Richard Smithc0fbba72013-04-03 22:49:41 +00002618 if (DC->hasExternalLexicalStorage() &&
2619 !getContext().getLangOpts().CPlusPlus)
Guy Benyei11169dd2012-12-18 14:30:41 +00002620 DC->setMustBuildLookupTable();
Chris Lattnere7b154b2013-01-19 21:39:22 +00002621
Ben Langmuir2c9af442014-04-10 17:57:43 +00002622 return Success;
Guy Benyei11169dd2012-12-18 14:30:41 +00002623 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00002624 case llvm::BitstreamEntry::SubBlock:
2625 switch (Entry.ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002626 case DECLTYPES_BLOCK_ID:
2627 // We lazily load the decls block, but we want to set up the
2628 // DeclsCursor cursor to point into it. Clone our current bitcode
2629 // cursor to it, enter the block and read the abbrevs in that block.
2630 // With the main cursor, we just skip over it.
2631 F.DeclsCursor = Stream;
2632 if (Stream.SkipBlock() || // Skip with the main cursor.
2633 // Read the abbrevs.
2634 ReadBlockAbbrevs(F.DeclsCursor, DECLTYPES_BLOCK_ID)) {
2635 Error("malformed block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002636 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002637 }
2638 break;
Richard Smithb9eab6d2014-03-20 19:44:17 +00002639
Guy Benyei11169dd2012-12-18 14:30:41 +00002640 case PREPROCESSOR_BLOCK_ID:
2641 F.MacroCursor = Stream;
2642 if (!PP.getExternalSource())
2643 PP.setExternalSource(this);
Chris Lattnere7b154b2013-01-19 21:39:22 +00002644
Guy Benyei11169dd2012-12-18 14:30:41 +00002645 if (Stream.SkipBlock() ||
2646 ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID)) {
2647 Error("malformed block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002648 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002649 }
2650 F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo();
2651 break;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002652
Guy Benyei11169dd2012-12-18 14:30:41 +00002653 case PREPROCESSOR_DETAIL_BLOCK_ID:
2654 F.PreprocessorDetailCursor = Stream;
2655 if (Stream.SkipBlock() ||
Chris Lattnere7b154b2013-01-19 21:39:22 +00002656 ReadBlockAbbrevs(F.PreprocessorDetailCursor,
Guy Benyei11169dd2012-12-18 14:30:41 +00002657 PREPROCESSOR_DETAIL_BLOCK_ID)) {
Chris Lattnere7b154b2013-01-19 21:39:22 +00002658 Error("malformed preprocessor detail record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002659 return Failure;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002660 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002661 F.PreprocessorDetailStartOffset
Chris Lattnere7b154b2013-01-19 21:39:22 +00002662 = F.PreprocessorDetailCursor.GetCurrentBitNo();
2663
Guy Benyei11169dd2012-12-18 14:30:41 +00002664 if (!PP.getPreprocessingRecord())
2665 PP.createPreprocessingRecord();
2666 if (!PP.getPreprocessingRecord()->getExternalSource())
2667 PP.getPreprocessingRecord()->SetExternalSource(*this);
2668 break;
2669
2670 case SOURCE_MANAGER_BLOCK_ID:
2671 if (ReadSourceManagerBlock(F))
Ben Langmuir2c9af442014-04-10 17:57:43 +00002672 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002673 break;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002674
Guy Benyei11169dd2012-12-18 14:30:41 +00002675 case SUBMODULE_BLOCK_ID:
Ben Langmuir2c9af442014-04-10 17:57:43 +00002676 if (ASTReadResult Result = ReadSubmoduleBlock(F, ClientLoadCapabilities))
2677 return Result;
Guy Benyei11169dd2012-12-18 14:30:41 +00002678 break;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002679
Guy Benyei11169dd2012-12-18 14:30:41 +00002680 case COMMENTS_BLOCK_ID: {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00002681 BitstreamCursor C = Stream;
Guy Benyei11169dd2012-12-18 14:30:41 +00002682 if (Stream.SkipBlock() ||
2683 ReadBlockAbbrevs(C, COMMENTS_BLOCK_ID)) {
2684 Error("malformed comments block in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002685 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002686 }
2687 CommentsCursors.push_back(std::make_pair(C, &F));
2688 break;
2689 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00002690
Guy Benyei11169dd2012-12-18 14:30:41 +00002691 default:
Chris Lattnere7b154b2013-01-19 21:39:22 +00002692 if (Stream.SkipBlock()) {
2693 Error("malformed block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002694 return Failure;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002695 }
2696 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00002697 }
2698 continue;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002699
2700 case llvm::BitstreamEntry::Record:
2701 // The interesting case.
2702 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00002703 }
2704
2705 // Read and process a record.
2706 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00002707 StringRef Blob;
2708 switch ((ASTRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002709 default: // Default behavior: ignore.
2710 break;
2711
2712 case TYPE_OFFSET: {
2713 if (F.LocalNumTypes != 0) {
2714 Error("duplicate TYPE_OFFSET record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002715 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002716 }
Chris Lattner0e6c9402013-01-20 02:38:54 +00002717 F.TypeOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002718 F.LocalNumTypes = Record[0];
2719 unsigned LocalBaseTypeIndex = Record[1];
2720 F.BaseTypeIndex = getTotalNumTypes();
2721
2722 if (F.LocalNumTypes > 0) {
2723 // Introduce the global -> local mapping for types within this module.
2724 GlobalTypeMap.insert(std::make_pair(getTotalNumTypes(), &F));
2725
2726 // Introduce the local -> global mapping for types within this module.
2727 F.TypeRemap.insertOrReplace(
2728 std::make_pair(LocalBaseTypeIndex,
2729 F.BaseTypeIndex - LocalBaseTypeIndex));
Ben Langmuir52ca6782014-10-20 16:27:32 +00002730
2731 TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes);
Guy Benyei11169dd2012-12-18 14:30:41 +00002732 }
2733 break;
2734 }
2735
2736 case DECL_OFFSET: {
2737 if (F.LocalNumDecls != 0) {
2738 Error("duplicate DECL_OFFSET record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002739 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002740 }
Chris Lattner0e6c9402013-01-20 02:38:54 +00002741 F.DeclOffsets = (const DeclOffset *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002742 F.LocalNumDecls = Record[0];
2743 unsigned LocalBaseDeclID = Record[1];
2744 F.BaseDeclID = getTotalNumDecls();
2745
2746 if (F.LocalNumDecls > 0) {
2747 // Introduce the global -> local mapping for declarations within this
2748 // module.
2749 GlobalDeclMap.insert(
2750 std::make_pair(getTotalNumDecls() + NUM_PREDEF_DECL_IDS, &F));
2751
2752 // Introduce the local -> global mapping for declarations within this
2753 // module.
2754 F.DeclRemap.insertOrReplace(
2755 std::make_pair(LocalBaseDeclID, F.BaseDeclID - LocalBaseDeclID));
2756
2757 // Introduce the global -> local mapping for declarations within this
2758 // module.
2759 F.GlobalToLocalDeclIDs[&F] = LocalBaseDeclID;
Ben Langmuirfe971d92014-08-16 04:54:18 +00002760
Ben Langmuir52ca6782014-10-20 16:27:32 +00002761 DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls);
2762 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002763 break;
2764 }
2765
2766 case TU_UPDATE_LEXICAL: {
2767 DeclContext *TU = Context.getTranslationUnitDecl();
2768 DeclContextInfo &Info = F.DeclContextInfos[TU];
Chris Lattner0e6c9402013-01-20 02:38:54 +00002769 Info.LexicalDecls = reinterpret_cast<const KindDeclIDPair *>(Blob.data());
Guy Benyei11169dd2012-12-18 14:30:41 +00002770 Info.NumLexicalDecls
Chris Lattner0e6c9402013-01-20 02:38:54 +00002771 = static_cast<unsigned int>(Blob.size() / sizeof(KindDeclIDPair));
Guy Benyei11169dd2012-12-18 14:30:41 +00002772 TU->setHasExternalLexicalStorage(true);
2773 break;
2774 }
2775
2776 case UPDATE_VISIBLE: {
2777 unsigned Idx = 0;
2778 serialization::DeclID ID = ReadDeclID(F, Record, Idx);
2779 ASTDeclContextNameLookupTable *Table =
Justin Bognerda4e6502014-04-14 16:34:29 +00002780 ASTDeclContextNameLookupTable::Create(
2781 (const unsigned char *)Blob.data() + Record[Idx++],
2782 (const unsigned char *)Blob.data() + sizeof(uint32_t),
2783 (const unsigned char *)Blob.data(),
2784 ASTDeclContextNameLookupTrait(*this, F));
Richard Smithcd45dbc2014-04-19 03:48:30 +00002785 if (Decl *D = GetExistingDecl(ID)) {
Richard Smithd9174792014-03-11 03:10:46 +00002786 auto *DC = cast<DeclContext>(D);
2787 DC->getPrimaryContext()->setHasExternalVisibleStorage(true);
Richard Smith52e3fba2014-03-11 07:17:35 +00002788 auto *&LookupTable = F.DeclContextInfos[DC].NameLookupTableData;
2789 delete LookupTable;
2790 LookupTable = Table;
Guy Benyei11169dd2012-12-18 14:30:41 +00002791 } else
2792 PendingVisibleUpdates[ID].push_back(std::make_pair(Table, &F));
2793 break;
2794 }
2795
2796 case IDENTIFIER_TABLE:
Chris Lattner0e6c9402013-01-20 02:38:54 +00002797 F.IdentifierTableData = Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002798 if (Record[0]) {
Justin Bognerda4e6502014-04-14 16:34:29 +00002799 F.IdentifierLookupTable = ASTIdentifierLookupTable::Create(
2800 (const unsigned char *)F.IdentifierTableData + Record[0],
2801 (const unsigned char *)F.IdentifierTableData + sizeof(uint32_t),
2802 (const unsigned char *)F.IdentifierTableData,
2803 ASTIdentifierLookupTrait(*this, F));
Guy Benyei11169dd2012-12-18 14:30:41 +00002804
2805 PP.getIdentifierTable().setExternalIdentifierLookup(this);
2806 }
2807 break;
2808
2809 case IDENTIFIER_OFFSET: {
2810 if (F.LocalNumIdentifiers != 0) {
2811 Error("duplicate IDENTIFIER_OFFSET record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002812 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002813 }
Chris Lattner0e6c9402013-01-20 02:38:54 +00002814 F.IdentifierOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002815 F.LocalNumIdentifiers = Record[0];
2816 unsigned LocalBaseIdentifierID = Record[1];
2817 F.BaseIdentifierID = getTotalNumIdentifiers();
2818
2819 if (F.LocalNumIdentifiers > 0) {
2820 // Introduce the global -> local mapping for identifiers within this
2821 // module.
2822 GlobalIdentifierMap.insert(std::make_pair(getTotalNumIdentifiers() + 1,
2823 &F));
2824
2825 // Introduce the local -> global mapping for identifiers within this
2826 // module.
2827 F.IdentifierRemap.insertOrReplace(
2828 std::make_pair(LocalBaseIdentifierID,
2829 F.BaseIdentifierID - LocalBaseIdentifierID));
Ben Langmuirfe971d92014-08-16 04:54:18 +00002830
Ben Langmuir52ca6782014-10-20 16:27:32 +00002831 IdentifiersLoaded.resize(IdentifiersLoaded.size()
2832 + F.LocalNumIdentifiers);
2833 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002834 break;
2835 }
2836
Ben Langmuir332aafe2014-01-31 01:06:56 +00002837 case EAGERLY_DESERIALIZED_DECLS:
Richard Smith9e2341d2015-03-23 03:25:59 +00002838 // FIXME: Skip reading this record if our ASTConsumer doesn't care
2839 // about "interesting" decls (for instance, if we're building a module).
Guy Benyei11169dd2012-12-18 14:30:41 +00002840 for (unsigned I = 0, N = Record.size(); I != N; ++I)
Ben Langmuir332aafe2014-01-31 01:06:56 +00002841 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I]));
Guy Benyei11169dd2012-12-18 14:30:41 +00002842 break;
2843
2844 case SPECIAL_TYPES:
Douglas Gregor44180f82013-02-01 23:45:03 +00002845 if (SpecialTypes.empty()) {
2846 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2847 SpecialTypes.push_back(getGlobalTypeID(F, Record[I]));
2848 break;
2849 }
2850
2851 if (SpecialTypes.size() != Record.size()) {
2852 Error("invalid special-types record");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002853 return Failure;
Douglas Gregor44180f82013-02-01 23:45:03 +00002854 }
2855
2856 for (unsigned I = 0, N = Record.size(); I != N; ++I) {
2857 serialization::TypeID ID = getGlobalTypeID(F, Record[I]);
2858 if (!SpecialTypes[I])
2859 SpecialTypes[I] = ID;
2860 // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate
2861 // merge step?
2862 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002863 break;
2864
2865 case STATISTICS:
2866 TotalNumStatements += Record[0];
2867 TotalNumMacros += Record[1];
2868 TotalLexicalDeclContexts += Record[2];
2869 TotalVisibleDeclContexts += Record[3];
2870 break;
2871
2872 case UNUSED_FILESCOPED_DECLS:
2873 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2874 UnusedFileScopedDecls.push_back(getGlobalDeclID(F, Record[I]));
2875 break;
2876
2877 case DELEGATING_CTORS:
2878 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2879 DelegatingCtorDecls.push_back(getGlobalDeclID(F, Record[I]));
2880 break;
2881
2882 case WEAK_UNDECLARED_IDENTIFIERS:
2883 if (Record.size() % 4 != 0) {
2884 Error("invalid weak identifiers record");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002885 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002886 }
2887
2888 // FIXME: Ignore weak undeclared identifiers from non-original PCH
2889 // files. This isn't the way to do it :)
2890 WeakUndeclaredIdentifiers.clear();
2891
2892 // Translate the weak, undeclared identifiers into global IDs.
2893 for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) {
2894 WeakUndeclaredIdentifiers.push_back(
2895 getGlobalIdentifierID(F, Record[I++]));
2896 WeakUndeclaredIdentifiers.push_back(
2897 getGlobalIdentifierID(F, Record[I++]));
2898 WeakUndeclaredIdentifiers.push_back(
2899 ReadSourceLocation(F, Record, I).getRawEncoding());
2900 WeakUndeclaredIdentifiers.push_back(Record[I++]);
2901 }
2902 break;
2903
Guy Benyei11169dd2012-12-18 14:30:41 +00002904 case SELECTOR_OFFSETS: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00002905 F.SelectorOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002906 F.LocalNumSelectors = Record[0];
2907 unsigned LocalBaseSelectorID = Record[1];
2908 F.BaseSelectorID = getTotalNumSelectors();
2909
2910 if (F.LocalNumSelectors > 0) {
2911 // Introduce the global -> local mapping for selectors within this
2912 // module.
2913 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F));
2914
2915 // Introduce the local -> global mapping for selectors within this
2916 // module.
2917 F.SelectorRemap.insertOrReplace(
2918 std::make_pair(LocalBaseSelectorID,
2919 F.BaseSelectorID - LocalBaseSelectorID));
Ben Langmuir52ca6782014-10-20 16:27:32 +00002920
2921 SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors);
Guy Benyei11169dd2012-12-18 14:30:41 +00002922 }
2923 break;
2924 }
2925
2926 case METHOD_POOL:
Chris Lattner0e6c9402013-01-20 02:38:54 +00002927 F.SelectorLookupTableData = (const unsigned char *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002928 if (Record[0])
2929 F.SelectorLookupTable
2930 = ASTSelectorLookupTable::Create(
2931 F.SelectorLookupTableData + Record[0],
2932 F.SelectorLookupTableData,
2933 ASTSelectorLookupTrait(*this, F));
2934 TotalNumMethodPoolEntries += Record[1];
2935 break;
2936
2937 case REFERENCED_SELECTOR_POOL:
2938 if (!Record.empty()) {
2939 for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) {
2940 ReferencedSelectorsData.push_back(getGlobalSelectorID(F,
2941 Record[Idx++]));
2942 ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx).
2943 getRawEncoding());
2944 }
2945 }
2946 break;
2947
2948 case PP_COUNTER_VALUE:
2949 if (!Record.empty() && Listener)
2950 Listener->ReadCounter(F, Record[0]);
2951 break;
2952
2953 case FILE_SORTED_DECLS:
Chris Lattner0e6c9402013-01-20 02:38:54 +00002954 F.FileSortedDecls = (const DeclID *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002955 F.NumFileSortedDecls = Record[0];
2956 break;
2957
2958 case SOURCE_LOCATION_OFFSETS: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00002959 F.SLocEntryOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002960 F.LocalNumSLocEntries = Record[0];
2961 unsigned SLocSpaceSize = Record[1];
Benjamin Kramer867ea1d2014-03-02 13:01:17 +00002962 std::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) =
Ben Langmuir52ca6782014-10-20 16:27:32 +00002963 SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries,
Guy Benyei11169dd2012-12-18 14:30:41 +00002964 SLocSpaceSize);
2965 // Make our entry in the range map. BaseID is negative and growing, so
2966 // we invert it. Because we invert it, though, we need the other end of
2967 // the range.
2968 unsigned RangeStart =
2969 unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1;
2970 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F));
2971 F.FirstLoc = SourceLocation::getFromRawEncoding(F.SLocEntryBaseOffset);
2972
2973 // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing.
2974 assert((F.SLocEntryBaseOffset & (1U << 31U)) == 0);
2975 GlobalSLocOffsetMap.insert(
2976 std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset
2977 - SLocSpaceSize,&F));
2978
2979 // Initialize the remapping table.
2980 // Invalid stays invalid.
Richard Smithb9eab6d2014-03-20 19:44:17 +00002981 F.SLocRemap.insertOrReplace(std::make_pair(0U, 0));
Guy Benyei11169dd2012-12-18 14:30:41 +00002982 // This module. Base was 2 when being compiled.
Richard Smithb9eab6d2014-03-20 19:44:17 +00002983 F.SLocRemap.insertOrReplace(std::make_pair(2U,
Guy Benyei11169dd2012-12-18 14:30:41 +00002984 static_cast<int>(F.SLocEntryBaseOffset - 2)));
2985
2986 TotalNumSLocEntries += F.LocalNumSLocEntries;
2987 break;
2988 }
2989
2990 case MODULE_OFFSET_MAP: {
2991 // Additional remapping information.
Chris Lattner0e6c9402013-01-20 02:38:54 +00002992 const unsigned char *Data = (const unsigned char*)Blob.data();
2993 const unsigned char *DataEnd = Data + Blob.size();
Richard Smithb9eab6d2014-03-20 19:44:17 +00002994
2995 // If we see this entry before SOURCE_LOCATION_OFFSETS, add placeholders.
2996 if (F.SLocRemap.find(0) == F.SLocRemap.end()) {
2997 F.SLocRemap.insert(std::make_pair(0U, 0));
2998 F.SLocRemap.insert(std::make_pair(2U, 1));
2999 }
3000
Guy Benyei11169dd2012-12-18 14:30:41 +00003001 // Continuous range maps we may be updating in our module.
Ben Langmuir785180e2014-10-20 16:27:30 +00003002 typedef ContinuousRangeMap<uint32_t, int, 2>::Builder
3003 RemapBuilder;
3004 RemapBuilder SLocRemap(F.SLocRemap);
3005 RemapBuilder IdentifierRemap(F.IdentifierRemap);
3006 RemapBuilder MacroRemap(F.MacroRemap);
3007 RemapBuilder PreprocessedEntityRemap(F.PreprocessedEntityRemap);
3008 RemapBuilder SubmoduleRemap(F.SubmoduleRemap);
3009 RemapBuilder SelectorRemap(F.SelectorRemap);
3010 RemapBuilder DeclRemap(F.DeclRemap);
3011 RemapBuilder TypeRemap(F.TypeRemap);
Guy Benyei11169dd2012-12-18 14:30:41 +00003012
3013 while(Data < DataEnd) {
Justin Bogner57ba0b22014-03-28 22:03:24 +00003014 using namespace llvm::support;
3015 uint16_t Len = endian::readNext<uint16_t, little, unaligned>(Data);
Guy Benyei11169dd2012-12-18 14:30:41 +00003016 StringRef Name = StringRef((const char*)Data, Len);
3017 Data += Len;
3018 ModuleFile *OM = ModuleMgr.lookup(Name);
3019 if (!OM) {
3020 Error("SourceLocation remap refers to unknown module");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003021 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003022 }
3023
Justin Bogner57ba0b22014-03-28 22:03:24 +00003024 uint32_t SLocOffset =
3025 endian::readNext<uint32_t, little, unaligned>(Data);
3026 uint32_t IdentifierIDOffset =
3027 endian::readNext<uint32_t, little, unaligned>(Data);
3028 uint32_t MacroIDOffset =
3029 endian::readNext<uint32_t, little, unaligned>(Data);
3030 uint32_t PreprocessedEntityIDOffset =
3031 endian::readNext<uint32_t, little, unaligned>(Data);
3032 uint32_t SubmoduleIDOffset =
3033 endian::readNext<uint32_t, little, unaligned>(Data);
3034 uint32_t SelectorIDOffset =
3035 endian::readNext<uint32_t, little, unaligned>(Data);
3036 uint32_t DeclIDOffset =
3037 endian::readNext<uint32_t, little, unaligned>(Data);
3038 uint32_t TypeIndexOffset =
3039 endian::readNext<uint32_t, little, unaligned>(Data);
3040
Ben Langmuir785180e2014-10-20 16:27:30 +00003041 uint32_t None = std::numeric_limits<uint32_t>::max();
3042
3043 auto mapOffset = [&](uint32_t Offset, uint32_t BaseOffset,
3044 RemapBuilder &Remap) {
3045 if (Offset != None)
3046 Remap.insert(std::make_pair(Offset,
3047 static_cast<int>(BaseOffset - Offset)));
3048 };
3049 mapOffset(SLocOffset, OM->SLocEntryBaseOffset, SLocRemap);
3050 mapOffset(IdentifierIDOffset, OM->BaseIdentifierID, IdentifierRemap);
3051 mapOffset(MacroIDOffset, OM->BaseMacroID, MacroRemap);
3052 mapOffset(PreprocessedEntityIDOffset, OM->BasePreprocessedEntityID,
3053 PreprocessedEntityRemap);
3054 mapOffset(SubmoduleIDOffset, OM->BaseSubmoduleID, SubmoduleRemap);
3055 mapOffset(SelectorIDOffset, OM->BaseSelectorID, SelectorRemap);
3056 mapOffset(DeclIDOffset, OM->BaseDeclID, DeclRemap);
3057 mapOffset(TypeIndexOffset, OM->BaseTypeIndex, TypeRemap);
Guy Benyei11169dd2012-12-18 14:30:41 +00003058
3059 // Global -> local mappings.
3060 F.GlobalToLocalDeclIDs[OM] = DeclIDOffset;
3061 }
3062 break;
3063 }
3064
3065 case SOURCE_MANAGER_LINE_TABLE:
3066 if (ParseLineTable(F, Record))
Ben Langmuir2c9af442014-04-10 17:57:43 +00003067 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003068 break;
3069
3070 case SOURCE_LOCATION_PRELOADS: {
3071 // Need to transform from the local view (1-based IDs) to the global view,
3072 // which is based off F.SLocEntryBaseID.
3073 if (!F.PreloadSLocEntries.empty()) {
3074 Error("Multiple SOURCE_LOCATION_PRELOADS records in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003075 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003076 }
3077
3078 F.PreloadSLocEntries.swap(Record);
3079 break;
3080 }
3081
3082 case EXT_VECTOR_DECLS:
3083 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3084 ExtVectorDecls.push_back(getGlobalDeclID(F, Record[I]));
3085 break;
3086
3087 case VTABLE_USES:
3088 if (Record.size() % 3 != 0) {
3089 Error("Invalid VTABLE_USES record");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003090 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003091 }
3092
3093 // Later tables overwrite earlier ones.
3094 // FIXME: Modules will have some trouble with this. This is clearly not
3095 // the right way to do this.
3096 VTableUses.clear();
3097
3098 for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) {
3099 VTableUses.push_back(getGlobalDeclID(F, Record[Idx++]));
3100 VTableUses.push_back(
3101 ReadSourceLocation(F, Record, Idx).getRawEncoding());
3102 VTableUses.push_back(Record[Idx++]);
3103 }
3104 break;
3105
Guy Benyei11169dd2012-12-18 14:30:41 +00003106 case PENDING_IMPLICIT_INSTANTIATIONS:
3107 if (PendingInstantiations.size() % 2 != 0) {
3108 Error("Invalid existing PendingInstantiations");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003109 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003110 }
3111
3112 if (Record.size() % 2 != 0) {
3113 Error("Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003114 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003115 }
3116
3117 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
3118 PendingInstantiations.push_back(getGlobalDeclID(F, Record[I++]));
3119 PendingInstantiations.push_back(
3120 ReadSourceLocation(F, Record, I).getRawEncoding());
3121 }
3122 break;
3123
3124 case SEMA_DECL_REFS:
Richard Smith3d8e97e2013-10-18 06:54:39 +00003125 if (Record.size() != 2) {
3126 Error("Invalid SEMA_DECL_REFS block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003127 return Failure;
Richard Smith3d8e97e2013-10-18 06:54:39 +00003128 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003129 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3130 SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
3131 break;
3132
3133 case PPD_ENTITIES_OFFSETS: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00003134 F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data();
3135 assert(Blob.size() % sizeof(PPEntityOffset) == 0);
3136 F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset);
Guy Benyei11169dd2012-12-18 14:30:41 +00003137
3138 unsigned LocalBasePreprocessedEntityID = Record[0];
3139
3140 unsigned StartingID;
3141 if (!PP.getPreprocessingRecord())
3142 PP.createPreprocessingRecord();
3143 if (!PP.getPreprocessingRecord()->getExternalSource())
3144 PP.getPreprocessingRecord()->SetExternalSource(*this);
3145 StartingID
3146 = PP.getPreprocessingRecord()
Ben Langmuir52ca6782014-10-20 16:27:32 +00003147 ->allocateLoadedEntities(F.NumPreprocessedEntities);
Guy Benyei11169dd2012-12-18 14:30:41 +00003148 F.BasePreprocessedEntityID = StartingID;
3149
3150 if (F.NumPreprocessedEntities > 0) {
3151 // Introduce the global -> local mapping for preprocessed entities in
3152 // this module.
3153 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
3154
3155 // Introduce the local -> global mapping for preprocessed entities in
3156 // this module.
3157 F.PreprocessedEntityRemap.insertOrReplace(
3158 std::make_pair(LocalBasePreprocessedEntityID,
3159 F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID));
3160 }
3161
3162 break;
3163 }
3164
3165 case DECL_UPDATE_OFFSETS: {
3166 if (Record.size() % 2 != 0) {
3167 Error("invalid DECL_UPDATE_OFFSETS block in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003168 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003169 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00003170 for (unsigned I = 0, N = Record.size(); I != N; I += 2) {
3171 GlobalDeclID ID = getGlobalDeclID(F, Record[I]);
3172 DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I + 1]));
3173
3174 // If we've already loaded the decl, perform the updates when we finish
3175 // loading this block.
3176 if (Decl *D = GetExistingDecl(ID))
3177 PendingUpdateRecords.push_back(std::make_pair(ID, D));
3178 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003179 break;
3180 }
3181
3182 case DECL_REPLACEMENTS: {
3183 if (Record.size() % 3 != 0) {
3184 Error("invalid DECL_REPLACEMENTS block in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003185 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003186 }
3187 for (unsigned I = 0, N = Record.size(); I != N; I += 3)
3188 ReplacedDecls[getGlobalDeclID(F, Record[I])]
3189 = ReplacedDeclInfo(&F, Record[I+1], Record[I+2]);
3190 break;
3191 }
3192
3193 case OBJC_CATEGORIES_MAP: {
3194 if (F.LocalNumObjCCategoriesInMap != 0) {
3195 Error("duplicate OBJC_CATEGORIES_MAP record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003196 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003197 }
3198
3199 F.LocalNumObjCCategoriesInMap = Record[0];
Chris Lattner0e6c9402013-01-20 02:38:54 +00003200 F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003201 break;
3202 }
3203
3204 case OBJC_CATEGORIES:
3205 F.ObjCCategories.swap(Record);
3206 break;
Richard Smithc2bb8182015-03-24 06:36:48 +00003207
Guy Benyei11169dd2012-12-18 14:30:41 +00003208 case CXX_BASE_SPECIFIER_OFFSETS: {
3209 if (F.LocalNumCXXBaseSpecifiers != 0) {
3210 Error("duplicate CXX_BASE_SPECIFIER_OFFSETS record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003211 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003212 }
Richard Smithc2bb8182015-03-24 06:36:48 +00003213
Guy Benyei11169dd2012-12-18 14:30:41 +00003214 F.LocalNumCXXBaseSpecifiers = Record[0];
Chris Lattner0e6c9402013-01-20 02:38:54 +00003215 F.CXXBaseSpecifiersOffsets = (const uint32_t *)Blob.data();
Richard Smithc2bb8182015-03-24 06:36:48 +00003216 break;
3217 }
3218
3219 case CXX_CTOR_INITIALIZERS_OFFSETS: {
3220 if (F.LocalNumCXXCtorInitializers != 0) {
3221 Error("duplicate CXX_CTOR_INITIALIZERS_OFFSETS record in AST file");
3222 return Failure;
3223 }
3224
3225 F.LocalNumCXXCtorInitializers = Record[0];
3226 F.CXXCtorInitializersOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003227 break;
3228 }
3229
3230 case DIAG_PRAGMA_MAPPINGS:
3231 if (F.PragmaDiagMappings.empty())
3232 F.PragmaDiagMappings.swap(Record);
3233 else
3234 F.PragmaDiagMappings.insert(F.PragmaDiagMappings.end(),
3235 Record.begin(), Record.end());
3236 break;
3237
3238 case CUDA_SPECIAL_DECL_REFS:
3239 // Later tables overwrite earlier ones.
3240 // FIXME: Modules will have trouble with this.
3241 CUDASpecialDeclRefs.clear();
3242 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3243 CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
3244 break;
3245
3246 case HEADER_SEARCH_TABLE: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00003247 F.HeaderFileInfoTableData = Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003248 F.LocalNumHeaderFileInfos = Record[1];
Guy Benyei11169dd2012-12-18 14:30:41 +00003249 if (Record[0]) {
3250 F.HeaderFileInfoTable
3251 = HeaderFileInfoLookupTable::Create(
3252 (const unsigned char *)F.HeaderFileInfoTableData + Record[0],
3253 (const unsigned char *)F.HeaderFileInfoTableData,
3254 HeaderFileInfoTrait(*this, F,
3255 &PP.getHeaderSearchInfo(),
Chris Lattner0e6c9402013-01-20 02:38:54 +00003256 Blob.data() + Record[2]));
Guy Benyei11169dd2012-12-18 14:30:41 +00003257
3258 PP.getHeaderSearchInfo().SetExternalSource(this);
3259 if (!PP.getHeaderSearchInfo().getExternalLookup())
3260 PP.getHeaderSearchInfo().SetExternalLookup(this);
3261 }
3262 break;
3263 }
3264
3265 case FP_PRAGMA_OPTIONS:
3266 // Later tables overwrite earlier ones.
3267 FPPragmaOptions.swap(Record);
3268 break;
3269
3270 case OPENCL_EXTENSIONS:
3271 // Later tables overwrite earlier ones.
3272 OpenCLExtensions.swap(Record);
3273 break;
3274
3275 case TENTATIVE_DEFINITIONS:
3276 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3277 TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I]));
3278 break;
3279
3280 case KNOWN_NAMESPACES:
3281 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3282 KnownNamespaces.push_back(getGlobalDeclID(F, Record[I]));
3283 break;
Nick Lewycky8334af82013-01-26 00:35:08 +00003284
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00003285 case UNDEFINED_BUT_USED:
3286 if (UndefinedButUsed.size() % 2 != 0) {
3287 Error("Invalid existing UndefinedButUsed");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003288 return Failure;
Nick Lewycky8334af82013-01-26 00:35:08 +00003289 }
3290
3291 if (Record.size() % 2 != 0) {
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00003292 Error("invalid undefined-but-used record");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003293 return Failure;
Nick Lewycky8334af82013-01-26 00:35:08 +00003294 }
3295 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00003296 UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++]));
3297 UndefinedButUsed.push_back(
Nick Lewycky8334af82013-01-26 00:35:08 +00003298 ReadSourceLocation(F, Record, I).getRawEncoding());
3299 }
3300 break;
3301
Guy Benyei11169dd2012-12-18 14:30:41 +00003302 case IMPORTED_MODULES: {
Richard Smithe842a472014-10-22 02:05:46 +00003303 if (F.Kind != MK_ImplicitModule && F.Kind != MK_ExplicitModule) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003304 // If we aren't loading a module (which has its own exports), make
3305 // all of the imported modules visible.
3306 // FIXME: Deal with macros-only imports.
Richard Smith56be7542014-03-21 00:33:59 +00003307 for (unsigned I = 0, N = Record.size(); I != N; /**/) {
3308 unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]);
3309 SourceLocation Loc = ReadSourceLocation(F, Record, I);
3310 if (GlobalID)
Aaron Ballman4f45b712014-03-21 15:22:56 +00003311 ImportedModules.push_back(ImportedSubmodule(GlobalID, Loc));
Guy Benyei11169dd2012-12-18 14:30:41 +00003312 }
3313 }
3314 break;
3315 }
3316
3317 case LOCAL_REDECLARATIONS: {
3318 F.RedeclarationChains.swap(Record);
3319 break;
3320 }
3321
3322 case LOCAL_REDECLARATIONS_MAP: {
3323 if (F.LocalNumRedeclarationsInMap != 0) {
3324 Error("duplicate LOCAL_REDECLARATIONS_MAP record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003325 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003326 }
3327
3328 F.LocalNumRedeclarationsInMap = Record[0];
Chris Lattner0e6c9402013-01-20 02:38:54 +00003329 F.RedeclarationsMap = (const LocalRedeclarationsInfo *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003330 break;
3331 }
3332
Guy Benyei11169dd2012-12-18 14:30:41 +00003333 case MACRO_OFFSET: {
3334 if (F.LocalNumMacros != 0) {
3335 Error("duplicate MACRO_OFFSET record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003336 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003337 }
Chris Lattner0e6c9402013-01-20 02:38:54 +00003338 F.MacroOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003339 F.LocalNumMacros = Record[0];
3340 unsigned LocalBaseMacroID = Record[1];
3341 F.BaseMacroID = getTotalNumMacros();
3342
3343 if (F.LocalNumMacros > 0) {
3344 // Introduce the global -> local mapping for macros within this module.
3345 GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F));
3346
3347 // Introduce the local -> global mapping for macros within this module.
3348 F.MacroRemap.insertOrReplace(
3349 std::make_pair(LocalBaseMacroID,
3350 F.BaseMacroID - LocalBaseMacroID));
Ben Langmuir52ca6782014-10-20 16:27:32 +00003351
3352 MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros);
Guy Benyei11169dd2012-12-18 14:30:41 +00003353 }
3354 break;
3355 }
3356
Richard Smithe40f2ba2013-08-07 21:41:30 +00003357 case LATE_PARSED_TEMPLATE: {
3358 LateParsedTemplates.append(Record.begin(), Record.end());
3359 break;
3360 }
Dario Domizioli13a0a382014-05-23 12:13:25 +00003361
3362 case OPTIMIZE_PRAGMA_OPTIONS:
3363 if (Record.size() != 1) {
3364 Error("invalid pragma optimize record");
3365 return Failure;
3366 }
3367 OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]);
3368 break;
Nico Weber72889432014-09-06 01:25:55 +00003369
3370 case UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES:
3371 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3372 UnusedLocalTypedefNameCandidates.push_back(
3373 getGlobalDeclID(F, Record[I]));
3374 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00003375 }
3376 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003377}
3378
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003379ASTReader::ASTReadResult
3380ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F,
3381 const ModuleFile *ImportedBy,
3382 unsigned ClientLoadCapabilities) {
3383 unsigned Idx = 0;
Richard Smith7ed1bc92014-12-05 22:42:13 +00003384 F.ModuleMapPath = ReadPath(F, Record, Idx);
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003385
Richard Smithe842a472014-10-22 02:05:46 +00003386 if (F.Kind == MK_ExplicitModule) {
3387 // For an explicitly-loaded module, we don't care whether the original
3388 // module map file exists or matches.
3389 return Success;
3390 }
3391
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003392 // Try to resolve ModuleName in the current header search context and
3393 // verify that it is found in the same module map file as we saved. If the
3394 // top-level AST file is a main file, skip this check because there is no
3395 // usable header search context.
3396 assert(!F.ModuleName.empty() &&
Richard Smithe842a472014-10-22 02:05:46 +00003397 "MODULE_NAME should come before MODULE_MAP_FILE");
3398 if (F.Kind == MK_ImplicitModule &&
3399 (*ModuleMgr.begin())->Kind != MK_MainFile) {
3400 // An implicitly-loaded module file should have its module listed in some
3401 // module map file that we've already loaded.
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003402 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName);
Richard Smithe842a472014-10-22 02:05:46 +00003403 auto &Map = PP.getHeaderSearchInfo().getModuleMap();
3404 const FileEntry *ModMap = M ? Map.getModuleMapFileForUniquing(M) : nullptr;
3405 if (!ModMap) {
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003406 assert(ImportedBy && "top-level import should be verified");
3407 if ((ClientLoadCapabilities & ARR_Missing) == 0)
Richard Smithe842a472014-10-22 02:05:46 +00003408 Diag(diag::err_imported_module_not_found) << F.ModuleName << F.FileName
3409 << ImportedBy->FileName
3410 << F.ModuleMapPath;
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003411 return Missing;
3412 }
3413
Richard Smithe842a472014-10-22 02:05:46 +00003414 assert(M->Name == F.ModuleName && "found module with different name");
3415
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003416 // Check the primary module map file.
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003417 const FileEntry *StoredModMap = FileMgr.getFile(F.ModuleMapPath);
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003418 if (StoredModMap == nullptr || StoredModMap != ModMap) {
3419 assert(ModMap && "found module is missing module map file");
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003420 assert(ImportedBy && "top-level import should be verified");
3421 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3422 Diag(diag::err_imported_module_modmap_changed)
3423 << F.ModuleName << ImportedBy->FileName
3424 << ModMap->getName() << F.ModuleMapPath;
3425 return OutOfDate;
3426 }
3427
3428 llvm::SmallPtrSet<const FileEntry *, 1> AdditionalStoredMaps;
3429 for (unsigned I = 0, N = Record[Idx++]; I < N; ++I) {
3430 // FIXME: we should use input files rather than storing names.
Richard Smith7ed1bc92014-12-05 22:42:13 +00003431 std::string Filename = ReadPath(F, Record, Idx);
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003432 const FileEntry *F =
3433 FileMgr.getFile(Filename, false, false);
3434 if (F == nullptr) {
3435 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3436 Error("could not find file '" + Filename +"' referenced by AST file");
3437 return OutOfDate;
3438 }
3439 AdditionalStoredMaps.insert(F);
3440 }
3441
3442 // Check any additional module map files (e.g. module.private.modulemap)
3443 // that are not in the pcm.
3444 if (auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) {
3445 for (const FileEntry *ModMap : *AdditionalModuleMaps) {
3446 // Remove files that match
3447 // Note: SmallPtrSet::erase is really remove
3448 if (!AdditionalStoredMaps.erase(ModMap)) {
3449 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3450 Diag(diag::err_module_different_modmap)
3451 << F.ModuleName << /*new*/0 << ModMap->getName();
3452 return OutOfDate;
3453 }
3454 }
3455 }
3456
3457 // Check any additional module map files that are in the pcm, but not
3458 // found in header search. Cases that match are already removed.
3459 for (const FileEntry *ModMap : AdditionalStoredMaps) {
3460 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3461 Diag(diag::err_module_different_modmap)
3462 << F.ModuleName << /*not new*/1 << ModMap->getName();
3463 return OutOfDate;
3464 }
3465 }
3466
3467 if (Listener)
3468 Listener->ReadModuleMapFile(F.ModuleMapPath);
3469 return Success;
3470}
3471
3472
Douglas Gregorc1489562013-02-12 23:36:21 +00003473/// \brief Move the given method to the back of the global list of methods.
3474static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) {
3475 // Find the entry for this selector in the method pool.
3476 Sema::GlobalMethodPool::iterator Known
3477 = S.MethodPool.find(Method->getSelector());
3478 if (Known == S.MethodPool.end())
3479 return;
3480
3481 // Retrieve the appropriate method list.
3482 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
3483 : Known->second.second;
3484 bool Found = false;
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00003485 for (ObjCMethodList *List = &Start; List; List = List->getNext()) {
Douglas Gregorc1489562013-02-12 23:36:21 +00003486 if (!Found) {
Nico Weber2e0c8f72014-12-27 03:58:08 +00003487 if (List->getMethod() == Method) {
Douglas Gregorc1489562013-02-12 23:36:21 +00003488 Found = true;
3489 } else {
3490 // Keep searching.
3491 continue;
3492 }
3493 }
3494
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00003495 if (List->getNext())
Nico Weber2e0c8f72014-12-27 03:58:08 +00003496 List->setMethod(List->getNext()->getMethod());
Douglas Gregorc1489562013-02-12 23:36:21 +00003497 else
Nico Weber2e0c8f72014-12-27 03:58:08 +00003498 List->setMethod(Method);
Douglas Gregorc1489562013-02-12 23:36:21 +00003499 }
3500}
3501
Richard Smithe657bbd2014-07-18 22:13:40 +00003502void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner,
3503 bool FromFinalization) {
3504 // FIXME: Only do this if Owner->NameVisibility == AllVisible.
Richard Smith57721ac2014-07-21 04:10:40 +00003505 for (Decl *D : Names.HiddenDecls) {
Richard Smith49f906a2014-03-01 00:08:04 +00003506 bool wasHidden = D->Hidden;
3507 D->Hidden = false;
Guy Benyei11169dd2012-12-18 14:30:41 +00003508
Richard Smith49f906a2014-03-01 00:08:04 +00003509 if (wasHidden && SemaObj) {
3510 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) {
3511 moveMethodToBackOfGlobalList(*SemaObj, Method);
Douglas Gregorc1489562013-02-12 23:36:21 +00003512 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003513 }
3514 }
Richard Smith49f906a2014-03-01 00:08:04 +00003515
Richard Smithe657bbd2014-07-18 22:13:40 +00003516 assert((FromFinalization || Owner->NameVisibility >= Module::MacrosVisible) &&
3517 "nothing to make visible?");
Richard Smithdaa69e02014-07-25 04:40:03 +00003518 for (const auto &Macro : Names.HiddenMacros) {
3519 if (FromFinalization)
3520 PP.appendMacroDirective(Macro.first,
3521 Macro.second->import(PP, SourceLocation()));
3522 else
3523 installImportedMacro(Macro.first, Macro.second, Owner);
3524 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003525}
3526
Richard Smith49f906a2014-03-01 00:08:04 +00003527void ASTReader::makeModuleVisible(Module *Mod,
Argyrios Kyrtzidis125df052013-02-01 16:36:12 +00003528 Module::NameVisibilityKind NameVisibility,
Douglas Gregorfb912652013-03-20 21:10:35 +00003529 SourceLocation ImportLoc,
3530 bool Complain) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003531 llvm::SmallPtrSet<Module *, 4> Visited;
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003532 SmallVector<Module *, 4> Stack;
Robert Wilhelm25284cc2013-08-23 16:11:15 +00003533 Stack.push_back(Mod);
Guy Benyei11169dd2012-12-18 14:30:41 +00003534 while (!Stack.empty()) {
Robert Wilhelm25284cc2013-08-23 16:11:15 +00003535 Mod = Stack.pop_back_val();
Guy Benyei11169dd2012-12-18 14:30:41 +00003536
3537 if (NameVisibility <= Mod->NameVisibility) {
Robert Wilhelm25284cc2013-08-23 16:11:15 +00003538 // This module already has this level of visibility (or greater), so
Guy Benyei11169dd2012-12-18 14:30:41 +00003539 // there is nothing more to do.
3540 continue;
3541 }
Richard Smith49f906a2014-03-01 00:08:04 +00003542
Guy Benyei11169dd2012-12-18 14:30:41 +00003543 if (!Mod->isAvailable()) {
3544 // Modules that aren't available cannot be made visible.
3545 continue;
3546 }
3547
3548 // Update the module's name visibility.
Richard Smith49f906a2014-03-01 00:08:04 +00003549 if (NameVisibility >= Module::MacrosVisible &&
3550 Mod->NameVisibility < Module::MacrosVisible)
3551 Mod->MacroVisibilityLoc = ImportLoc;
Guy Benyei11169dd2012-12-18 14:30:41 +00003552 Mod->NameVisibility = NameVisibility;
Richard Smith49f906a2014-03-01 00:08:04 +00003553
Guy Benyei11169dd2012-12-18 14:30:41 +00003554 // If we've already deserialized any names from this module,
3555 // mark them as visible.
3556 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
3557 if (Hidden != HiddenNamesMap.end()) {
Richard Smith57721ac2014-07-21 04:10:40 +00003558 auto HiddenNames = std::move(*Hidden);
Guy Benyei11169dd2012-12-18 14:30:41 +00003559 HiddenNamesMap.erase(Hidden);
Richard Smith57721ac2014-07-21 04:10:40 +00003560 makeNamesVisible(HiddenNames.second, HiddenNames.first,
3561 /*FromFinalization*/false);
3562 assert(HiddenNamesMap.find(Mod) == HiddenNamesMap.end() &&
3563 "making names visible added hidden names");
Guy Benyei11169dd2012-12-18 14:30:41 +00003564 }
Dmitri Gribenkoe9bcf5b2013-11-04 21:51:33 +00003565
Guy Benyei11169dd2012-12-18 14:30:41 +00003566 // Push any exported modules onto the stack to be marked as visible.
Argyrios Kyrtzidis8739f7b2013-02-19 19:34:40 +00003567 SmallVector<Module *, 16> Exports;
3568 Mod->getExportedModules(Exports);
3569 for (SmallVectorImpl<Module *>::iterator
3570 I = Exports.begin(), E = Exports.end(); I != E; ++I) {
3571 Module *Exported = *I;
David Blaikie82e95a32014-11-19 07:49:47 +00003572 if (Visited.insert(Exported).second)
Argyrios Kyrtzidis8739f7b2013-02-19 19:34:40 +00003573 Stack.push_back(Exported);
Guy Benyei11169dd2012-12-18 14:30:41 +00003574 }
Douglas Gregorfb912652013-03-20 21:10:35 +00003575
3576 // Detect any conflicts.
3577 if (Complain) {
3578 assert(ImportLoc.isValid() && "Missing import location");
3579 for (unsigned I = 0, N = Mod->Conflicts.size(); I != N; ++I) {
3580 if (Mod->Conflicts[I].Other->NameVisibility >= NameVisibility) {
3581 Diag(ImportLoc, diag::warn_module_conflict)
3582 << Mod->getFullModuleName()
3583 << Mod->Conflicts[I].Other->getFullModuleName()
3584 << Mod->Conflicts[I].Message;
3585 // FIXME: Need note where the other module was imported.
3586 }
3587 }
3588 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003589 }
3590}
3591
Douglas Gregore060e572013-01-25 01:03:03 +00003592bool ASTReader::loadGlobalIndex() {
3593 if (GlobalIndex)
3594 return false;
3595
3596 if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
3597 !Context.getLangOpts().Modules)
3598 return true;
3599
3600 // Try to load the global index.
3601 TriedLoadingGlobalIndex = true;
3602 StringRef ModuleCachePath
3603 = getPreprocessor().getHeaderSearchInfo().getModuleCachePath();
3604 std::pair<GlobalModuleIndex *, GlobalModuleIndex::ErrorCode> Result
Douglas Gregor7029ce12013-03-19 00:28:20 +00003605 = GlobalModuleIndex::readIndex(ModuleCachePath);
Douglas Gregore060e572013-01-25 01:03:03 +00003606 if (!Result.first)
3607 return true;
3608
3609 GlobalIndex.reset(Result.first);
Douglas Gregor7211ac12013-01-25 23:32:03 +00003610 ModuleMgr.setGlobalIndex(GlobalIndex.get());
Douglas Gregore060e572013-01-25 01:03:03 +00003611 return false;
3612}
3613
3614bool ASTReader::isGlobalIndexUnavailable() const {
3615 return Context.getLangOpts().Modules && UseGlobalIndex &&
3616 !hasGlobalIndex() && TriedLoadingGlobalIndex;
3617}
3618
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003619static void updateModuleTimestamp(ModuleFile &MF) {
3620 // Overwrite the timestamp file contents so that file's mtime changes.
3621 std::string TimestampFilename = MF.getTimestampFilename();
Rafael Espindoladae941a2014-08-25 18:17:04 +00003622 std::error_code EC;
3623 llvm::raw_fd_ostream OS(TimestampFilename, EC, llvm::sys::fs::F_Text);
3624 if (EC)
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003625 return;
3626 OS << "Timestamp file\n";
3627}
3628
Guy Benyei11169dd2012-12-18 14:30:41 +00003629ASTReader::ASTReadResult ASTReader::ReadAST(const std::string &FileName,
3630 ModuleKind Type,
3631 SourceLocation ImportLoc,
3632 unsigned ClientLoadCapabilities) {
Argyrios Kyrtzidisdc9fdaf2013-05-24 05:44:08 +00003633 llvm::SaveAndRestore<SourceLocation>
3634 SetCurImportLocRAII(CurrentImportLoc, ImportLoc);
3635
Richard Smithd1c46742014-04-30 02:24:17 +00003636 // Defer any pending actions until we get to the end of reading the AST file.
3637 Deserializing AnASTFile(this);
3638
Guy Benyei11169dd2012-12-18 14:30:41 +00003639 // Bump the generation number.
Richard Smith053f6c62014-05-16 23:01:30 +00003640 unsigned PreviousGeneration = incrementGeneration(Context);
Guy Benyei11169dd2012-12-18 14:30:41 +00003641
3642 unsigned NumModules = ModuleMgr.size();
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003643 SmallVector<ImportedModule, 4> Loaded;
Guy Benyei11169dd2012-12-18 14:30:41 +00003644 switch(ASTReadResult ReadResult = ReadASTCore(FileName, Type, ImportLoc,
Craig Toppera13603a2014-05-22 05:54:18 +00003645 /*ImportedBy=*/nullptr, Loaded,
Ben Langmuir487ea142014-10-23 18:05:36 +00003646 0, 0, 0,
Guy Benyei11169dd2012-12-18 14:30:41 +00003647 ClientLoadCapabilities)) {
3648 case Failure:
Douglas Gregor7029ce12013-03-19 00:28:20 +00003649 case Missing:
Guy Benyei11169dd2012-12-18 14:30:41 +00003650 case OutOfDate:
3651 case VersionMismatch:
3652 case ConfigurationMismatch:
Ben Langmuir9801b252014-06-20 00:24:56 +00003653 case HadErrors: {
3654 llvm::SmallPtrSet<ModuleFile *, 4> LoadedSet;
3655 for (const ImportedModule &IM : Loaded)
3656 LoadedSet.insert(IM.Mod);
3657
Douglas Gregor7029ce12013-03-19 00:28:20 +00003658 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, ModuleMgr.end(),
Ben Langmuir9801b252014-06-20 00:24:56 +00003659 LoadedSet,
Douglas Gregor7029ce12013-03-19 00:28:20 +00003660 Context.getLangOpts().Modules
3661 ? &PP.getHeaderSearchInfo().getModuleMap()
Craig Toppera13603a2014-05-22 05:54:18 +00003662 : nullptr);
Douglas Gregore060e572013-01-25 01:03:03 +00003663
3664 // If we find that any modules are unusable, the global index is going
3665 // to be out-of-date. Just remove it.
3666 GlobalIndex.reset();
Craig Toppera13603a2014-05-22 05:54:18 +00003667 ModuleMgr.setGlobalIndex(nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00003668 return ReadResult;
Ben Langmuir9801b252014-06-20 00:24:56 +00003669 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003670 case Success:
3671 break;
3672 }
3673
3674 // Here comes stuff that we only do once the entire chain is loaded.
3675
3676 // Load the AST blocks of all of the modules that we loaded.
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003677 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
3678 MEnd = Loaded.end();
Guy Benyei11169dd2012-12-18 14:30:41 +00003679 M != MEnd; ++M) {
3680 ModuleFile &F = *M->Mod;
3681
3682 // Read the AST block.
Ben Langmuir2c9af442014-04-10 17:57:43 +00003683 if (ASTReadResult Result = ReadASTBlock(F, ClientLoadCapabilities))
3684 return Result;
Guy Benyei11169dd2012-12-18 14:30:41 +00003685
3686 // Once read, set the ModuleFile bit base offset and update the size in
3687 // bits of all files we've seen.
3688 F.GlobalBitOffset = TotalModulesSizeInBits;
3689 TotalModulesSizeInBits += F.SizeInBits;
3690 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F));
3691
3692 // Preload SLocEntries.
3693 for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) {
3694 int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID;
3695 // Load it through the SourceManager and don't call ReadSLocEntry()
3696 // directly because the entry may have already been loaded in which case
3697 // calling ReadSLocEntry() directly would trigger an assertion in
3698 // SourceManager.
3699 SourceMgr.getLoadedSLocEntryByID(Index);
3700 }
3701 }
3702
Douglas Gregor603cd862013-03-22 18:50:14 +00003703 // Setup the import locations and notify the module manager that we've
3704 // committed to these module files.
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003705 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
3706 MEnd = Loaded.end();
Guy Benyei11169dd2012-12-18 14:30:41 +00003707 M != MEnd; ++M) {
3708 ModuleFile &F = *M->Mod;
Douglas Gregor603cd862013-03-22 18:50:14 +00003709
3710 ModuleMgr.moduleFileAccepted(&F);
3711
3712 // Set the import location.
Argyrios Kyrtzidis71c1af82013-02-01 16:36:14 +00003713 F.DirectImportLoc = ImportLoc;
Guy Benyei11169dd2012-12-18 14:30:41 +00003714 if (!M->ImportedBy)
3715 F.ImportLoc = M->ImportLoc;
3716 else
3717 F.ImportLoc = ReadSourceLocation(*M->ImportedBy,
3718 M->ImportLoc.getRawEncoding());
3719 }
3720
3721 // Mark all of the identifiers in the identifier table as being out of date,
3722 // so that various accessors know to check the loaded modules when the
3723 // identifier is used.
3724 for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(),
3725 IdEnd = PP.getIdentifierTable().end();
3726 Id != IdEnd; ++Id)
3727 Id->second->setOutOfDate(true);
3728
3729 // Resolve any unresolved module exports.
Douglas Gregorfb912652013-03-20 21:10:35 +00003730 for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) {
3731 UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I];
Guy Benyei11169dd2012-12-18 14:30:41 +00003732 SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID);
3733 Module *ResolvedMod = getSubmodule(GlobalID);
Douglas Gregorfb912652013-03-20 21:10:35 +00003734
3735 switch (Unresolved.Kind) {
3736 case UnresolvedModuleRef::Conflict:
3737 if (ResolvedMod) {
3738 Module::Conflict Conflict;
3739 Conflict.Other = ResolvedMod;
3740 Conflict.Message = Unresolved.String.str();
3741 Unresolved.Mod->Conflicts.push_back(Conflict);
3742 }
3743 continue;
3744
3745 case UnresolvedModuleRef::Import:
Guy Benyei11169dd2012-12-18 14:30:41 +00003746 if (ResolvedMod)
3747 Unresolved.Mod->Imports.push_back(ResolvedMod);
3748 continue;
Guy Benyei11169dd2012-12-18 14:30:41 +00003749
Douglas Gregorfb912652013-03-20 21:10:35 +00003750 case UnresolvedModuleRef::Export:
3751 if (ResolvedMod || Unresolved.IsWildcard)
3752 Unresolved.Mod->Exports.push_back(
3753 Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard));
3754 continue;
3755 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003756 }
Douglas Gregorfb912652013-03-20 21:10:35 +00003757 UnresolvedModuleRefs.clear();
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003758
3759 // FIXME: How do we load the 'use'd modules? They may not be submodules.
3760 // Might be unnecessary as use declarations are only used to build the
3761 // module itself.
Guy Benyei11169dd2012-12-18 14:30:41 +00003762
3763 InitializeContext();
3764
Richard Smith3d8e97e2013-10-18 06:54:39 +00003765 if (SemaObj)
3766 UpdateSema();
3767
Guy Benyei11169dd2012-12-18 14:30:41 +00003768 if (DeserializationListener)
3769 DeserializationListener->ReaderInitialized(this);
3770
3771 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
3772 if (!PrimaryModule.OriginalSourceFileID.isInvalid()) {
3773 PrimaryModule.OriginalSourceFileID
3774 = FileID::get(PrimaryModule.SLocEntryBaseID
3775 + PrimaryModule.OriginalSourceFileID.getOpaqueValue() - 1);
3776
3777 // If this AST file is a precompiled preamble, then set the
3778 // preamble file ID of the source manager to the file source file
3779 // from which the preamble was built.
3780 if (Type == MK_Preamble) {
3781 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID);
3782 } else if (Type == MK_MainFile) {
3783 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID);
3784 }
3785 }
3786
3787 // For any Objective-C class definitions we have already loaded, make sure
3788 // that we load any additional categories.
3789 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
3790 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
3791 ObjCClassesLoaded[I],
3792 PreviousGeneration);
3793 }
Douglas Gregore060e572013-01-25 01:03:03 +00003794
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003795 if (PP.getHeaderSearchInfo()
3796 .getHeaderSearchOpts()
3797 .ModulesValidateOncePerBuildSession) {
3798 // Now we are certain that the module and all modules it depends on are
3799 // up to date. Create or update timestamp files for modules that are
3800 // located in the module cache (not for PCH files that could be anywhere
3801 // in the filesystem).
3802 for (unsigned I = 0, N = Loaded.size(); I != N; ++I) {
3803 ImportedModule &M = Loaded[I];
Richard Smithe842a472014-10-22 02:05:46 +00003804 if (M.Mod->Kind == MK_ImplicitModule) {
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003805 updateModuleTimestamp(*M.Mod);
3806 }
3807 }
3808 }
3809
Guy Benyei11169dd2012-12-18 14:30:41 +00003810 return Success;
3811}
3812
Ben Langmuir487ea142014-10-23 18:05:36 +00003813static ASTFileSignature readASTFileSignature(llvm::BitstreamReader &StreamFile);
3814
Ben Langmuir70a1b812015-03-24 04:43:52 +00003815/// \brief Whether \p Stream starts with the AST/PCH file magic number 'CPCH'.
3816static bool startsWithASTFileMagic(BitstreamCursor &Stream) {
3817 return Stream.Read(8) == 'C' &&
3818 Stream.Read(8) == 'P' &&
3819 Stream.Read(8) == 'C' &&
3820 Stream.Read(8) == 'H';
3821}
3822
Guy Benyei11169dd2012-12-18 14:30:41 +00003823ASTReader::ASTReadResult
3824ASTReader::ReadASTCore(StringRef FileName,
3825 ModuleKind Type,
3826 SourceLocation ImportLoc,
3827 ModuleFile *ImportedBy,
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003828 SmallVectorImpl<ImportedModule> &Loaded,
Douglas Gregor7029ce12013-03-19 00:28:20 +00003829 off_t ExpectedSize, time_t ExpectedModTime,
Ben Langmuir487ea142014-10-23 18:05:36 +00003830 ASTFileSignature ExpectedSignature,
Guy Benyei11169dd2012-12-18 14:30:41 +00003831 unsigned ClientLoadCapabilities) {
3832 ModuleFile *M;
Guy Benyei11169dd2012-12-18 14:30:41 +00003833 std::string ErrorStr;
Douglas Gregor7029ce12013-03-19 00:28:20 +00003834 ModuleManager::AddModuleResult AddResult
3835 = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy,
Richard Smith053f6c62014-05-16 23:01:30 +00003836 getGeneration(), ExpectedSize, ExpectedModTime,
Ben Langmuir487ea142014-10-23 18:05:36 +00003837 ExpectedSignature, readASTFileSignature,
Douglas Gregor7029ce12013-03-19 00:28:20 +00003838 M, ErrorStr);
Guy Benyei11169dd2012-12-18 14:30:41 +00003839
Douglas Gregor7029ce12013-03-19 00:28:20 +00003840 switch (AddResult) {
3841 case ModuleManager::AlreadyLoaded:
3842 return Success;
3843
3844 case ModuleManager::NewlyLoaded:
3845 // Load module file below.
3846 break;
3847
3848 case ModuleManager::Missing:
Richard Smithe842a472014-10-22 02:05:46 +00003849 // The module file was missing; if the client can handle that, return
Douglas Gregor7029ce12013-03-19 00:28:20 +00003850 // it.
3851 if (ClientLoadCapabilities & ARR_Missing)
3852 return Missing;
3853
3854 // Otherwise, return an error.
3855 {
3856 std::string Msg = "Unable to load module \"" + FileName.str() + "\": "
3857 + ErrorStr;
3858 Error(Msg);
3859 }
3860 return Failure;
3861
3862 case ModuleManager::OutOfDate:
3863 // We couldn't load the module file because it is out-of-date. If the
3864 // client can handle out-of-date, return it.
3865 if (ClientLoadCapabilities & ARR_OutOfDate)
3866 return OutOfDate;
3867
3868 // Otherwise, return an error.
3869 {
3870 std::string Msg = "Unable to load module \"" + FileName.str() + "\": "
3871 + ErrorStr;
3872 Error(Msg);
3873 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003874 return Failure;
3875 }
3876
Douglas Gregor7029ce12013-03-19 00:28:20 +00003877 assert(M && "Missing module file");
Guy Benyei11169dd2012-12-18 14:30:41 +00003878
3879 // FIXME: This seems rather a hack. Should CurrentDir be part of the
3880 // module?
3881 if (FileName != "-") {
3882 CurrentDir = llvm::sys::path::parent_path(FileName);
3883 if (CurrentDir.empty()) CurrentDir = ".";
3884 }
3885
3886 ModuleFile &F = *M;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00003887 BitstreamCursor &Stream = F.Stream;
Rafael Espindolafd832392014-11-12 14:48:44 +00003888 Stream.init(&F.StreamFile);
Adrian Prantlcbc368c2015-02-25 02:44:04 +00003889 F.SizeInBits = F.Buffer->getBufferSize() * 8;
3890
Guy Benyei11169dd2012-12-18 14:30:41 +00003891 // Sniff for the signature.
Ben Langmuir70a1b812015-03-24 04:43:52 +00003892 if (!startsWithASTFileMagic(Stream)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003893 Diag(diag::err_not_a_pch_file) << FileName;
3894 return Failure;
3895 }
3896
3897 // This is used for compatibility with older PCH formats.
3898 bool HaveReadControlBlock = false;
3899
Chris Lattnerefa77172013-01-20 00:00:22 +00003900 while (1) {
3901 llvm::BitstreamEntry Entry = Stream.advance();
3902
3903 switch (Entry.Kind) {
3904 case llvm::BitstreamEntry::Error:
3905 case llvm::BitstreamEntry::EndBlock:
3906 case llvm::BitstreamEntry::Record:
Guy Benyei11169dd2012-12-18 14:30:41 +00003907 Error("invalid record at top-level of AST file");
3908 return Failure;
Chris Lattnerefa77172013-01-20 00:00:22 +00003909
3910 case llvm::BitstreamEntry::SubBlock:
3911 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00003912 }
3913
Guy Benyei11169dd2012-12-18 14:30:41 +00003914 // We only know the control subblock ID.
Chris Lattnerefa77172013-01-20 00:00:22 +00003915 switch (Entry.ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003916 case llvm::bitc::BLOCKINFO_BLOCK_ID:
3917 if (Stream.ReadBlockInfoBlock()) {
3918 Error("malformed BlockInfoBlock in AST file");
3919 return Failure;
3920 }
3921 break;
3922 case CONTROL_BLOCK_ID:
3923 HaveReadControlBlock = true;
Ben Langmuirbeee15e2014-04-14 18:00:01 +00003924 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003925 case Success:
3926 break;
3927
3928 case Failure: return Failure;
Douglas Gregor7029ce12013-03-19 00:28:20 +00003929 case Missing: return Missing;
Guy Benyei11169dd2012-12-18 14:30:41 +00003930 case OutOfDate: return OutOfDate;
3931 case VersionMismatch: return VersionMismatch;
3932 case ConfigurationMismatch: return ConfigurationMismatch;
3933 case HadErrors: return HadErrors;
3934 }
3935 break;
3936 case AST_BLOCK_ID:
3937 if (!HaveReadControlBlock) {
3938 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
Dmitri Gribenko2228cd32014-02-11 15:40:09 +00003939 Diag(diag::err_pch_version_too_old);
Guy Benyei11169dd2012-12-18 14:30:41 +00003940 return VersionMismatch;
3941 }
3942
3943 // Record that we've loaded this module.
3944 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc));
3945 return Success;
3946
3947 default:
3948 if (Stream.SkipBlock()) {
3949 Error("malformed block record in AST file");
3950 return Failure;
3951 }
3952 break;
3953 }
3954 }
3955
3956 return Success;
3957}
3958
3959void ASTReader::InitializeContext() {
3960 // If there's a listener, notify them that we "read" the translation unit.
3961 if (DeserializationListener)
3962 DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID,
3963 Context.getTranslationUnitDecl());
3964
Guy Benyei11169dd2012-12-18 14:30:41 +00003965 // FIXME: Find a better way to deal with collisions between these
3966 // built-in types. Right now, we just ignore the problem.
3967
3968 // Load the special types.
3969 if (SpecialTypes.size() >= NumSpecialTypeIDs) {
3970 if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) {
3971 if (!Context.CFConstantStringTypeDecl)
3972 Context.setCFConstantStringType(GetType(String));
3973 }
3974
3975 if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) {
3976 QualType FileType = GetType(File);
3977 if (FileType.isNull()) {
3978 Error("FILE type is NULL");
3979 return;
3980 }
3981
3982 if (!Context.FILEDecl) {
3983 if (const TypedefType *Typedef = FileType->getAs<TypedefType>())
3984 Context.setFILEDecl(Typedef->getDecl());
3985 else {
3986 const TagType *Tag = FileType->getAs<TagType>();
3987 if (!Tag) {
3988 Error("Invalid FILE type in AST file");
3989 return;
3990 }
3991 Context.setFILEDecl(Tag->getDecl());
3992 }
3993 }
3994 }
3995
3996 if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) {
3997 QualType Jmp_bufType = GetType(Jmp_buf);
3998 if (Jmp_bufType.isNull()) {
3999 Error("jmp_buf type is NULL");
4000 return;
4001 }
4002
4003 if (!Context.jmp_bufDecl) {
4004 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>())
4005 Context.setjmp_bufDecl(Typedef->getDecl());
4006 else {
4007 const TagType *Tag = Jmp_bufType->getAs<TagType>();
4008 if (!Tag) {
4009 Error("Invalid jmp_buf type in AST file");
4010 return;
4011 }
4012 Context.setjmp_bufDecl(Tag->getDecl());
4013 }
4014 }
4015 }
4016
4017 if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) {
4018 QualType Sigjmp_bufType = GetType(Sigjmp_buf);
4019 if (Sigjmp_bufType.isNull()) {
4020 Error("sigjmp_buf type is NULL");
4021 return;
4022 }
4023
4024 if (!Context.sigjmp_bufDecl) {
4025 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>())
4026 Context.setsigjmp_bufDecl(Typedef->getDecl());
4027 else {
4028 const TagType *Tag = Sigjmp_bufType->getAs<TagType>();
4029 assert(Tag && "Invalid sigjmp_buf type in AST file");
4030 Context.setsigjmp_bufDecl(Tag->getDecl());
4031 }
4032 }
4033 }
4034
4035 if (unsigned ObjCIdRedef
4036 = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) {
4037 if (Context.ObjCIdRedefinitionType.isNull())
4038 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef);
4039 }
4040
4041 if (unsigned ObjCClassRedef
4042 = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) {
4043 if (Context.ObjCClassRedefinitionType.isNull())
4044 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef);
4045 }
4046
4047 if (unsigned ObjCSelRedef
4048 = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) {
4049 if (Context.ObjCSelRedefinitionType.isNull())
4050 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef);
4051 }
4052
4053 if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) {
4054 QualType Ucontext_tType = GetType(Ucontext_t);
4055 if (Ucontext_tType.isNull()) {
4056 Error("ucontext_t type is NULL");
4057 return;
4058 }
4059
4060 if (!Context.ucontext_tDecl) {
4061 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>())
4062 Context.setucontext_tDecl(Typedef->getDecl());
4063 else {
4064 const TagType *Tag = Ucontext_tType->getAs<TagType>();
4065 assert(Tag && "Invalid ucontext_t type in AST file");
4066 Context.setucontext_tDecl(Tag->getDecl());
4067 }
4068 }
4069 }
4070 }
4071
4072 ReadPragmaDiagnosticMappings(Context.getDiagnostics());
4073
4074 // If there were any CUDA special declarations, deserialize them.
4075 if (!CUDASpecialDeclRefs.empty()) {
4076 assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!");
4077 Context.setcudaConfigureCallDecl(
4078 cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0])));
4079 }
Richard Smith56be7542014-03-21 00:33:59 +00004080
Guy Benyei11169dd2012-12-18 14:30:41 +00004081 // Re-export any modules that were imported by a non-module AST file.
Richard Smith56be7542014-03-21 00:33:59 +00004082 // FIXME: This does not make macro-only imports visible again. It also doesn't
4083 // make #includes mapped to module imports visible.
4084 for (auto &Import : ImportedModules) {
4085 if (Module *Imported = getSubmodule(Import.ID))
Argyrios Kyrtzidis125df052013-02-01 16:36:12 +00004086 makeModuleVisible(Imported, Module::AllVisible,
Richard Smith56be7542014-03-21 00:33:59 +00004087 /*ImportLoc=*/Import.ImportLoc,
Douglas Gregorfb912652013-03-20 21:10:35 +00004088 /*Complain=*/false);
Guy Benyei11169dd2012-12-18 14:30:41 +00004089 }
4090 ImportedModules.clear();
4091}
4092
4093void ASTReader::finalizeForWriting() {
Richard Smith57721ac2014-07-21 04:10:40 +00004094 while (!HiddenNamesMap.empty()) {
4095 auto HiddenNames = std::move(*HiddenNamesMap.begin());
4096 HiddenNamesMap.erase(HiddenNamesMap.begin());
4097 makeNamesVisible(HiddenNames.second, HiddenNames.first,
4098 /*FromFinalization*/true);
Guy Benyei11169dd2012-12-18 14:30:41 +00004099 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004100}
4101
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004102/// \brief Given a cursor at the start of an AST file, scan ahead and drop the
4103/// cursor into the start of the given block ID, returning false on success and
4104/// true on failure.
4105static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004106 while (1) {
4107 llvm::BitstreamEntry Entry = Cursor.advance();
4108 switch (Entry.Kind) {
4109 case llvm::BitstreamEntry::Error:
4110 case llvm::BitstreamEntry::EndBlock:
4111 return true;
4112
4113 case llvm::BitstreamEntry::Record:
4114 // Ignore top-level records.
4115 Cursor.skipRecord(Entry.ID);
4116 break;
4117
4118 case llvm::BitstreamEntry::SubBlock:
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004119 if (Entry.ID == BlockID) {
4120 if (Cursor.EnterSubBlock(BlockID))
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004121 return true;
4122 // Found it!
4123 return false;
4124 }
4125
4126 if (Cursor.SkipBlock())
4127 return true;
4128 }
4129 }
4130}
4131
Ben Langmuir70a1b812015-03-24 04:43:52 +00004132/// \brief Reads and return the signature record from \p StreamFile's control
4133/// block, or else returns 0.
Ben Langmuir487ea142014-10-23 18:05:36 +00004134static ASTFileSignature readASTFileSignature(llvm::BitstreamReader &StreamFile){
4135 BitstreamCursor Stream(StreamFile);
Ben Langmuir70a1b812015-03-24 04:43:52 +00004136 if (!startsWithASTFileMagic(Stream))
Ben Langmuir487ea142014-10-23 18:05:36 +00004137 return 0;
Ben Langmuir487ea142014-10-23 18:05:36 +00004138
4139 // Scan for the CONTROL_BLOCK_ID block.
4140 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID))
4141 return 0;
4142
4143 // Scan for SIGNATURE inside the control block.
4144 ASTReader::RecordData Record;
4145 while (1) {
4146 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
4147 if (Entry.Kind == llvm::BitstreamEntry::EndBlock ||
4148 Entry.Kind != llvm::BitstreamEntry::Record)
4149 return 0;
4150
4151 Record.clear();
4152 StringRef Blob;
4153 if (SIGNATURE == Stream.readRecord(Entry.ID, Record, &Blob))
4154 return Record[0];
4155 }
4156}
4157
Guy Benyei11169dd2012-12-18 14:30:41 +00004158/// \brief Retrieve the name of the original source file name
4159/// directly from the AST file, without actually loading the AST
4160/// file.
4161std::string ASTReader::getOriginalSourceFile(const std::string &ASTFileName,
4162 FileManager &FileMgr,
4163 DiagnosticsEngine &Diags) {
4164 // Open the AST file.
Benjamin Kramera8857962014-10-26 22:44:13 +00004165 auto Buffer = FileMgr.getBufferForFile(ASTFileName);
Guy Benyei11169dd2012-12-18 14:30:41 +00004166 if (!Buffer) {
Benjamin Kramera8857962014-10-26 22:44:13 +00004167 Diags.Report(diag::err_fe_unable_to_read_pch_file)
4168 << ASTFileName << Buffer.getError().message();
Guy Benyei11169dd2012-12-18 14:30:41 +00004169 return std::string();
4170 }
4171
4172 // Initialize the stream
4173 llvm::BitstreamReader StreamFile;
Adrian Prantlcbc368c2015-02-25 02:44:04 +00004174 StreamFile.init((const unsigned char *)(*Buffer)->getBufferStart(),
4175 (const unsigned char *)(*Buffer)->getBufferEnd());
Rafael Espindolaaf0e40a2014-11-12 14:42:25 +00004176 BitstreamCursor Stream(StreamFile);
Guy Benyei11169dd2012-12-18 14:30:41 +00004177
4178 // Sniff for the signature.
Ben Langmuir70a1b812015-03-24 04:43:52 +00004179 if (!startsWithASTFileMagic(Stream)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004180 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName;
4181 return std::string();
4182 }
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004183
Chris Lattnere7b154b2013-01-19 21:39:22 +00004184 // Scan for the CONTROL_BLOCK_ID block.
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004185 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004186 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
4187 return std::string();
Chris Lattnere7b154b2013-01-19 21:39:22 +00004188 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004189
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004190 // Scan for ORIGINAL_FILE inside the control block.
4191 RecordData Record;
Chris Lattnere7b154b2013-01-19 21:39:22 +00004192 while (1) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004193 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
Chris Lattnere7b154b2013-01-19 21:39:22 +00004194 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
4195 return std::string();
4196
4197 if (Entry.Kind != llvm::BitstreamEntry::Record) {
4198 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
4199 return std::string();
Guy Benyei11169dd2012-12-18 14:30:41 +00004200 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00004201
Guy Benyei11169dd2012-12-18 14:30:41 +00004202 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00004203 StringRef Blob;
4204 if (Stream.readRecord(Entry.ID, Record, &Blob) == ORIGINAL_FILE)
4205 return Blob.str();
Guy Benyei11169dd2012-12-18 14:30:41 +00004206 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004207}
4208
4209namespace {
4210 class SimplePCHValidator : public ASTReaderListener {
4211 const LangOptions &ExistingLangOpts;
4212 const TargetOptions &ExistingTargetOpts;
4213 const PreprocessorOptions &ExistingPPOpts;
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00004214 std::string ExistingModuleCachePath;
Guy Benyei11169dd2012-12-18 14:30:41 +00004215 FileManager &FileMgr;
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00004216
Guy Benyei11169dd2012-12-18 14:30:41 +00004217 public:
4218 SimplePCHValidator(const LangOptions &ExistingLangOpts,
4219 const TargetOptions &ExistingTargetOpts,
4220 const PreprocessorOptions &ExistingPPOpts,
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00004221 StringRef ExistingModuleCachePath,
Guy Benyei11169dd2012-12-18 14:30:41 +00004222 FileManager &FileMgr)
4223 : ExistingLangOpts(ExistingLangOpts),
4224 ExistingTargetOpts(ExistingTargetOpts),
4225 ExistingPPOpts(ExistingPPOpts),
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00004226 ExistingModuleCachePath(ExistingModuleCachePath),
Guy Benyei11169dd2012-12-18 14:30:41 +00004227 FileMgr(FileMgr)
4228 {
4229 }
4230
Richard Smith1e2cf0d2014-10-31 02:28:58 +00004231 bool ReadLanguageOptions(const LangOptions &LangOpts, bool Complain,
4232 bool AllowCompatibleDifferences) override {
4233 return checkLanguageOptions(ExistingLangOpts, LangOpts, nullptr,
4234 AllowCompatibleDifferences);
Guy Benyei11169dd2012-12-18 14:30:41 +00004235 }
Chandler Carruth0d745bc2015-03-14 04:47:43 +00004236 bool ReadTargetOptions(const TargetOptions &TargetOpts, bool Complain,
4237 bool AllowCompatibleDifferences) override {
4238 return checkTargetOptions(ExistingTargetOpts, TargetOpts, nullptr,
4239 AllowCompatibleDifferences);
Guy Benyei11169dd2012-12-18 14:30:41 +00004240 }
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00004241 bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
4242 StringRef SpecificModuleCachePath,
4243 bool Complain) override {
4244 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
4245 ExistingModuleCachePath,
4246 nullptr, ExistingLangOpts);
4247 }
Craig Topper3e89dfe2014-03-13 02:13:41 +00004248 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
4249 bool Complain,
4250 std::string &SuggestedPredefines) override {
Craig Toppera13603a2014-05-22 05:54:18 +00004251 return checkPreprocessorOptions(ExistingPPOpts, PPOpts, nullptr, FileMgr,
Argyrios Kyrtzidisd3afa0c2013-04-26 21:33:40 +00004252 SuggestedPredefines, ExistingLangOpts);
Guy Benyei11169dd2012-12-18 14:30:41 +00004253 }
4254 };
4255}
4256
4257bool ASTReader::readASTFileControlBlock(StringRef Filename,
4258 FileManager &FileMgr,
4259 ASTReaderListener &Listener) {
4260 // Open the AST file.
Richard Smith7f330cd2015-03-18 01:42:29 +00004261 // FIXME: This allows use of the VFS; we do not allow use of the
4262 // VFS when actually loading a module.
Benjamin Kramera8857962014-10-26 22:44:13 +00004263 auto Buffer = FileMgr.getBufferForFile(Filename);
Guy Benyei11169dd2012-12-18 14:30:41 +00004264 if (!Buffer) {
4265 return true;
4266 }
4267
4268 // Initialize the stream
4269 llvm::BitstreamReader StreamFile;
Adrian Prantlcbc368c2015-02-25 02:44:04 +00004270 StreamFile.init((const unsigned char *)(*Buffer)->getBufferStart(),
4271 (const unsigned char *)(*Buffer)->getBufferEnd());
Rafael Espindolaaf0e40a2014-11-12 14:42:25 +00004272 BitstreamCursor Stream(StreamFile);
Guy Benyei11169dd2012-12-18 14:30:41 +00004273
4274 // Sniff for the signature.
Ben Langmuir70a1b812015-03-24 04:43:52 +00004275 if (!startsWithASTFileMagic(Stream))
Guy Benyei11169dd2012-12-18 14:30:41 +00004276 return true;
Guy Benyei11169dd2012-12-18 14:30:41 +00004277
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004278 // Scan for the CONTROL_BLOCK_ID block.
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004279 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID))
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004280 return true;
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004281
4282 bool NeedsInputFiles = Listener.needsInputFileVisitation();
Ben Langmuircb69b572014-03-07 06:40:32 +00004283 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
Richard Smithd4b230b2014-10-27 23:01:16 +00004284 bool NeedsImports = Listener.needsImportVisitation();
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004285 BitstreamCursor InputFilesCursor;
4286 if (NeedsInputFiles) {
4287 InputFilesCursor = Stream;
4288 if (SkipCursorToBlock(InputFilesCursor, INPUT_FILES_BLOCK_ID))
4289 return true;
4290
4291 // Read the abbreviations
4292 while (true) {
4293 uint64_t Offset = InputFilesCursor.GetCurrentBitNo();
4294 unsigned Code = InputFilesCursor.ReadCode();
4295
4296 // We expect all abbrevs to be at the start of the block.
4297 if (Code != llvm::bitc::DEFINE_ABBREV) {
4298 InputFilesCursor.JumpToBit(Offset);
4299 break;
4300 }
4301 InputFilesCursor.ReadAbbrevRecord();
4302 }
4303 }
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004304
4305 // Scan for ORIGINAL_FILE inside the control block.
Guy Benyei11169dd2012-12-18 14:30:41 +00004306 RecordData Record;
Richard Smith7ed1bc92014-12-05 22:42:13 +00004307 std::string ModuleDir;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004308 while (1) {
4309 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
4310 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
4311 return false;
4312
4313 if (Entry.Kind != llvm::BitstreamEntry::Record)
4314 return true;
4315
Guy Benyei11169dd2012-12-18 14:30:41 +00004316 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00004317 StringRef Blob;
4318 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob);
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004319 switch ((ControlRecordTypes)RecCode) {
4320 case METADATA: {
4321 if (Record[0] != VERSION_MAJOR)
4322 return true;
Guy Benyei11169dd2012-12-18 14:30:41 +00004323
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004324 if (Listener.ReadFullVersionInformation(Blob))
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004325 return true;
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004326
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004327 break;
4328 }
Ben Langmuir4f5212a2014-04-14 22:12:44 +00004329 case MODULE_NAME:
4330 Listener.ReadModuleName(Blob);
4331 break;
Richard Smith7ed1bc92014-12-05 22:42:13 +00004332 case MODULE_DIRECTORY:
4333 ModuleDir = Blob;
4334 break;
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00004335 case MODULE_MAP_FILE: {
4336 unsigned Idx = 0;
Richard Smith7ed1bc92014-12-05 22:42:13 +00004337 auto Path = ReadString(Record, Idx);
4338 ResolveImportedPath(Path, ModuleDir);
4339 Listener.ReadModuleMapFile(Path);
Ben Langmuir4f5212a2014-04-14 22:12:44 +00004340 break;
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00004341 }
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004342 case LANGUAGE_OPTIONS:
Richard Smith1e2cf0d2014-10-31 02:28:58 +00004343 if (ParseLanguageOptions(Record, false, Listener,
4344 /*AllowCompatibleConfigurationMismatch*/false))
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004345 return true;
4346 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004347
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004348 case TARGET_OPTIONS:
Chandler Carruth0d745bc2015-03-14 04:47:43 +00004349 if (ParseTargetOptions(Record, false, Listener,
4350 /*AllowCompatibleConfigurationMismatch*/ false))
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004351 return true;
4352 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004353
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004354 case DIAGNOSTIC_OPTIONS:
4355 if (ParseDiagnosticOptions(Record, false, Listener))
4356 return true;
4357 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004358
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004359 case FILE_SYSTEM_OPTIONS:
4360 if (ParseFileSystemOptions(Record, false, Listener))
4361 return true;
4362 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004363
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004364 case HEADER_SEARCH_OPTIONS:
4365 if (ParseHeaderSearchOptions(Record, false, Listener))
4366 return true;
4367 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004368
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004369 case PREPROCESSOR_OPTIONS: {
4370 std::string IgnoredSuggestedPredefines;
4371 if (ParsePreprocessorOptions(Record, false, Listener,
4372 IgnoredSuggestedPredefines))
4373 return true;
4374 break;
4375 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004376
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004377 case INPUT_FILE_OFFSETS: {
4378 if (!NeedsInputFiles)
4379 break;
4380
4381 unsigned NumInputFiles = Record[0];
4382 unsigned NumUserFiles = Record[1];
Richard Smithec216502015-02-13 19:48:37 +00004383 const uint64_t *InputFileOffs = (const uint64_t *)Blob.data();
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004384 for (unsigned I = 0; I != NumInputFiles; ++I) {
4385 // Go find this input file.
4386 bool isSystemFile = I >= NumUserFiles;
Ben Langmuircb69b572014-03-07 06:40:32 +00004387
4388 if (isSystemFile && !NeedsSystemInputFiles)
4389 break; // the rest are system input files
4390
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004391 BitstreamCursor &Cursor = InputFilesCursor;
4392 SavedStreamPosition SavedPosition(Cursor);
4393 Cursor.JumpToBit(InputFileOffs[I]);
4394
4395 unsigned Code = Cursor.ReadCode();
4396 RecordData Record;
4397 StringRef Blob;
4398 bool shouldContinue = false;
4399 switch ((InputFileRecordTypes)Cursor.readRecord(Code, Record, &Blob)) {
4400 case INPUT_FILE:
Argyrios Kyrtzidis68ccbe02014-03-14 02:26:31 +00004401 bool Overridden = static_cast<bool>(Record[3]);
Richard Smith7ed1bc92014-12-05 22:42:13 +00004402 std::string Filename = Blob;
4403 ResolveImportedPath(Filename, ModuleDir);
4404 shouldContinue =
4405 Listener.visitInputFile(Filename, isSystemFile, Overridden);
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004406 break;
4407 }
4408 if (!shouldContinue)
4409 break;
4410 }
4411 break;
4412 }
4413
Richard Smithd4b230b2014-10-27 23:01:16 +00004414 case IMPORTS: {
4415 if (!NeedsImports)
4416 break;
4417
4418 unsigned Idx = 0, N = Record.size();
4419 while (Idx < N) {
4420 // Read information about the AST file.
Richard Smith79c98cc2014-10-27 23:25:15 +00004421 Idx += 5; // ImportLoc, Size, ModTime, Signature
Richard Smith7ed1bc92014-12-05 22:42:13 +00004422 std::string Filename = ReadString(Record, Idx);
4423 ResolveImportedPath(Filename, ModuleDir);
4424 Listener.visitImport(Filename);
Richard Smithd4b230b2014-10-27 23:01:16 +00004425 }
4426 break;
4427 }
4428
Richard Smith7f330cd2015-03-18 01:42:29 +00004429 case KNOWN_MODULE_FILES: {
4430 // Known-but-not-technically-used module files are treated as imports.
4431 if (!NeedsImports)
4432 break;
4433
4434 unsigned Idx = 0, N = Record.size();
4435 while (Idx < N) {
4436 std::string Filename = ReadString(Record, Idx);
4437 ResolveImportedPath(Filename, ModuleDir);
4438 Listener.visitImport(Filename);
4439 }
4440 break;
4441 }
4442
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004443 default:
4444 // No other validation to perform.
4445 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004446 }
4447 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004448}
4449
4450
4451bool ASTReader::isAcceptableASTFile(StringRef Filename,
4452 FileManager &FileMgr,
4453 const LangOptions &LangOpts,
4454 const TargetOptions &TargetOpts,
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00004455 const PreprocessorOptions &PPOpts,
4456 std::string ExistingModuleCachePath) {
4457 SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts,
4458 ExistingModuleCachePath, FileMgr);
Guy Benyei11169dd2012-12-18 14:30:41 +00004459 return !readASTFileControlBlock(Filename, FileMgr, validator);
4460}
4461
Ben Langmuir2c9af442014-04-10 17:57:43 +00004462ASTReader::ASTReadResult
4463ASTReader::ReadSubmoduleBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004464 // Enter the submodule block.
4465 if (F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) {
4466 Error("malformed submodule block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004467 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004468 }
4469
4470 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
4471 bool First = true;
Craig Toppera13603a2014-05-22 05:54:18 +00004472 Module *CurrentModule = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00004473 RecordData Record;
4474 while (true) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004475 llvm::BitstreamEntry Entry = F.Stream.advanceSkippingSubblocks();
4476
4477 switch (Entry.Kind) {
4478 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
4479 case llvm::BitstreamEntry::Error:
4480 Error("malformed block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004481 return Failure;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004482 case llvm::BitstreamEntry::EndBlock:
Ben Langmuir2c9af442014-04-10 17:57:43 +00004483 return Success;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004484 case llvm::BitstreamEntry::Record:
4485 // The interesting case.
4486 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004487 }
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004488
Guy Benyei11169dd2012-12-18 14:30:41 +00004489 // Read a record.
Chris Lattner0e6c9402013-01-20 02:38:54 +00004490 StringRef Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00004491 Record.clear();
Richard Smith03478d92014-10-23 22:12:14 +00004492 auto Kind = F.Stream.readRecord(Entry.ID, Record, &Blob);
4493
4494 if ((Kind == SUBMODULE_METADATA) != First) {
4495 Error("submodule metadata record should be at beginning of block");
4496 return Failure;
4497 }
4498 First = false;
4499
4500 // Submodule information is only valid if we have a current module.
4501 // FIXME: Should we error on these cases?
4502 if (!CurrentModule && Kind != SUBMODULE_METADATA &&
4503 Kind != SUBMODULE_DEFINITION)
4504 continue;
4505
4506 switch (Kind) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004507 default: // Default behavior: ignore.
4508 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004509
Richard Smith03478d92014-10-23 22:12:14 +00004510 case SUBMODULE_DEFINITION: {
Douglas Gregor8d932422013-03-20 03:59:18 +00004511 if (Record.size() < 8) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004512 Error("malformed module definition");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004513 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004514 }
Richard Smith03478d92014-10-23 22:12:14 +00004515
Chris Lattner0e6c9402013-01-20 02:38:54 +00004516 StringRef Name = Blob;
Richard Smith9bca2982014-03-08 00:03:56 +00004517 unsigned Idx = 0;
4518 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]);
4519 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]);
4520 bool IsFramework = Record[Idx++];
4521 bool IsExplicit = Record[Idx++];
4522 bool IsSystem = Record[Idx++];
4523 bool IsExternC = Record[Idx++];
4524 bool InferSubmodules = Record[Idx++];
4525 bool InferExplicitSubmodules = Record[Idx++];
4526 bool InferExportWildcard = Record[Idx++];
4527 bool ConfigMacrosExhaustive = Record[Idx++];
Douglas Gregor8d932422013-03-20 03:59:18 +00004528
Ben Langmuirbeee15e2014-04-14 18:00:01 +00004529 Module *ParentModule = nullptr;
Ben Langmuir9d6448b2014-08-09 00:57:23 +00004530 if (Parent)
Guy Benyei11169dd2012-12-18 14:30:41 +00004531 ParentModule = getSubmodule(Parent);
Ben Langmuirbeee15e2014-04-14 18:00:01 +00004532
Guy Benyei11169dd2012-12-18 14:30:41 +00004533 // Retrieve this (sub)module from the module map, creating it if
4534 // necessary.
Ben Langmuir9d6448b2014-08-09 00:57:23 +00004535 CurrentModule = ModMap.findOrCreateModule(Name, ParentModule, IsFramework,
Guy Benyei11169dd2012-12-18 14:30:41 +00004536 IsExplicit).first;
Ben Langmuir9d6448b2014-08-09 00:57:23 +00004537
4538 // FIXME: set the definition loc for CurrentModule, or call
4539 // ModMap.setInferredModuleAllowedBy()
4540
Guy Benyei11169dd2012-12-18 14:30:41 +00004541 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS;
4542 if (GlobalIndex >= SubmodulesLoaded.size() ||
4543 SubmodulesLoaded[GlobalIndex]) {
4544 Error("too many submodules");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004545 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004546 }
Douglas Gregor8a114ab2013-02-06 22:40:31 +00004547
Douglas Gregor7029ce12013-03-19 00:28:20 +00004548 if (!ParentModule) {
4549 if (const FileEntry *CurFile = CurrentModule->getASTFile()) {
4550 if (CurFile != F.File) {
4551 if (!Diags.isDiagnosticInFlight()) {
4552 Diag(diag::err_module_file_conflict)
4553 << CurrentModule->getTopLevelModuleName()
4554 << CurFile->getName()
4555 << F.File->getName();
4556 }
Ben Langmuir2c9af442014-04-10 17:57:43 +00004557 return Failure;
Douglas Gregor8a114ab2013-02-06 22:40:31 +00004558 }
Douglas Gregor8a114ab2013-02-06 22:40:31 +00004559 }
Douglas Gregor7029ce12013-03-19 00:28:20 +00004560
4561 CurrentModule->setASTFile(F.File);
Douglas Gregor8a114ab2013-02-06 22:40:31 +00004562 }
Ben Langmuirbeee15e2014-04-14 18:00:01 +00004563
Guy Benyei11169dd2012-12-18 14:30:41 +00004564 CurrentModule->IsFromModuleFile = true;
4565 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem;
Richard Smith9bca2982014-03-08 00:03:56 +00004566 CurrentModule->IsExternC = IsExternC;
Guy Benyei11169dd2012-12-18 14:30:41 +00004567 CurrentModule->InferSubmodules = InferSubmodules;
4568 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules;
4569 CurrentModule->InferExportWildcard = InferExportWildcard;
Douglas Gregor8d932422013-03-20 03:59:18 +00004570 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive;
Guy Benyei11169dd2012-12-18 14:30:41 +00004571 if (DeserializationListener)
4572 DeserializationListener->ModuleRead(GlobalID, CurrentModule);
4573
4574 SubmodulesLoaded[GlobalIndex] = CurrentModule;
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004575
Douglas Gregorfb912652013-03-20 21:10:35 +00004576 // Clear out data that will be replaced by what is the module file.
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004577 CurrentModule->LinkLibraries.clear();
Douglas Gregor8d932422013-03-20 03:59:18 +00004578 CurrentModule->ConfigMacros.clear();
Douglas Gregorfb912652013-03-20 21:10:35 +00004579 CurrentModule->UnresolvedConflicts.clear();
4580 CurrentModule->Conflicts.clear();
Guy Benyei11169dd2012-12-18 14:30:41 +00004581 break;
4582 }
4583
4584 case SUBMODULE_UMBRELLA_HEADER: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00004585 if (const FileEntry *Umbrella = PP.getFileManager().getFile(Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004586 if (!CurrentModule->getUmbrellaHeader())
4587 ModMap.setUmbrellaHeader(CurrentModule, Umbrella);
4588 else if (CurrentModule->getUmbrellaHeader() != Umbrella) {
Ben Langmuirbc35fbe2015-02-20 21:46:39 +00004589 // This can be a spurious difference caused by changing the VFS to
4590 // point to a different copy of the file, and it is too late to
4591 // to rebuild safely.
4592 // FIXME: If we wrote the virtual paths instead of the 'real' paths,
4593 // after input file validation only real problems would remain and we
4594 // could just error. For now, assume it's okay.
4595 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004596 }
4597 }
4598 break;
4599 }
4600
Richard Smith202210b2014-10-24 20:23:01 +00004601 case SUBMODULE_HEADER:
4602 case SUBMODULE_EXCLUDED_HEADER:
4603 case SUBMODULE_PRIVATE_HEADER:
4604 // We lazily associate headers with their modules via the HeaderInfo table.
Argyrios Kyrtzidisb146baa2013-03-13 21:13:51 +00004605 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
4606 // of complete filenames or remove it entirely.
Richard Smith202210b2014-10-24 20:23:01 +00004607 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004608
Richard Smith202210b2014-10-24 20:23:01 +00004609 case SUBMODULE_TEXTUAL_HEADER:
4610 case SUBMODULE_PRIVATE_TEXTUAL_HEADER:
4611 // FIXME: Textual headers are not marked in the HeaderInfo table. Load
4612 // them here.
4613 break;
Lawrence Crowlb53e5482013-06-20 21:14:14 +00004614
Guy Benyei11169dd2012-12-18 14:30:41 +00004615 case SUBMODULE_TOPHEADER: {
Argyrios Kyrtzidis3c5305c2013-03-13 21:13:43 +00004616 CurrentModule->addTopHeaderFilename(Blob);
Guy Benyei11169dd2012-12-18 14:30:41 +00004617 break;
4618 }
4619
4620 case SUBMODULE_UMBRELLA_DIR: {
Guy Benyei11169dd2012-12-18 14:30:41 +00004621 if (const DirectoryEntry *Umbrella
Chris Lattner0e6c9402013-01-20 02:38:54 +00004622 = PP.getFileManager().getDirectory(Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004623 if (!CurrentModule->getUmbrellaDir())
4624 ModMap.setUmbrellaDir(CurrentModule, Umbrella);
4625 else if (CurrentModule->getUmbrellaDir() != Umbrella) {
Ben Langmuir2c9af442014-04-10 17:57:43 +00004626 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
4627 Error("mismatched umbrella directories in submodule");
4628 return OutOfDate;
Guy Benyei11169dd2012-12-18 14:30:41 +00004629 }
4630 }
4631 break;
4632 }
4633
4634 case SUBMODULE_METADATA: {
Guy Benyei11169dd2012-12-18 14:30:41 +00004635 F.BaseSubmoduleID = getTotalNumSubmodules();
4636 F.LocalNumSubmodules = Record[0];
4637 unsigned LocalBaseSubmoduleID = Record[1];
4638 if (F.LocalNumSubmodules > 0) {
4639 // Introduce the global -> local mapping for submodules within this
4640 // module.
4641 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F));
4642
4643 // Introduce the local -> global mapping for submodules within this
4644 // module.
4645 F.SubmoduleRemap.insertOrReplace(
4646 std::make_pair(LocalBaseSubmoduleID,
4647 F.BaseSubmoduleID - LocalBaseSubmoduleID));
Ben Langmuirfe971d92014-08-16 04:54:18 +00004648
Ben Langmuir52ca6782014-10-20 16:27:32 +00004649 SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules);
4650 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004651 break;
4652 }
4653
4654 case SUBMODULE_IMPORTS: {
Guy Benyei11169dd2012-12-18 14:30:41 +00004655 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) {
Douglas Gregorfb912652013-03-20 21:10:35 +00004656 UnresolvedModuleRef Unresolved;
Guy Benyei11169dd2012-12-18 14:30:41 +00004657 Unresolved.File = &F;
4658 Unresolved.Mod = CurrentModule;
4659 Unresolved.ID = Record[Idx];
Douglas Gregorfb912652013-03-20 21:10:35 +00004660 Unresolved.Kind = UnresolvedModuleRef::Import;
Guy Benyei11169dd2012-12-18 14:30:41 +00004661 Unresolved.IsWildcard = false;
Douglas Gregorfb912652013-03-20 21:10:35 +00004662 UnresolvedModuleRefs.push_back(Unresolved);
Guy Benyei11169dd2012-12-18 14:30:41 +00004663 }
4664 break;
4665 }
4666
4667 case SUBMODULE_EXPORTS: {
Guy Benyei11169dd2012-12-18 14:30:41 +00004668 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) {
Douglas Gregorfb912652013-03-20 21:10:35 +00004669 UnresolvedModuleRef Unresolved;
Guy Benyei11169dd2012-12-18 14:30:41 +00004670 Unresolved.File = &F;
4671 Unresolved.Mod = CurrentModule;
4672 Unresolved.ID = Record[Idx];
Douglas Gregorfb912652013-03-20 21:10:35 +00004673 Unresolved.Kind = UnresolvedModuleRef::Export;
Guy Benyei11169dd2012-12-18 14:30:41 +00004674 Unresolved.IsWildcard = Record[Idx + 1];
Douglas Gregorfb912652013-03-20 21:10:35 +00004675 UnresolvedModuleRefs.push_back(Unresolved);
Guy Benyei11169dd2012-12-18 14:30:41 +00004676 }
4677
4678 // Once we've loaded the set of exports, there's no reason to keep
4679 // the parsed, unresolved exports around.
4680 CurrentModule->UnresolvedExports.clear();
4681 break;
4682 }
4683 case SUBMODULE_REQUIRES: {
Richard Smitha3feee22013-10-28 22:18:19 +00004684 CurrentModule->addRequirement(Blob, Record[0], Context.getLangOpts(),
Guy Benyei11169dd2012-12-18 14:30:41 +00004685 Context.getTargetInfo());
4686 break;
4687 }
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004688
4689 case SUBMODULE_LINK_LIBRARY:
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004690 CurrentModule->LinkLibraries.push_back(
Chris Lattner0e6c9402013-01-20 02:38:54 +00004691 Module::LinkLibrary(Blob, Record[0]));
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004692 break;
Douglas Gregor35b13ec2013-03-20 00:22:05 +00004693
4694 case SUBMODULE_CONFIG_MACRO:
Douglas Gregor35b13ec2013-03-20 00:22:05 +00004695 CurrentModule->ConfigMacros.push_back(Blob.str());
4696 break;
Douglas Gregorfb912652013-03-20 21:10:35 +00004697
4698 case SUBMODULE_CONFLICT: {
Douglas Gregorfb912652013-03-20 21:10:35 +00004699 UnresolvedModuleRef Unresolved;
4700 Unresolved.File = &F;
4701 Unresolved.Mod = CurrentModule;
4702 Unresolved.ID = Record[0];
4703 Unresolved.Kind = UnresolvedModuleRef::Conflict;
4704 Unresolved.IsWildcard = false;
4705 Unresolved.String = Blob;
4706 UnresolvedModuleRefs.push_back(Unresolved);
4707 break;
4708 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004709 }
4710 }
4711}
4712
4713/// \brief Parse the record that corresponds to a LangOptions data
4714/// structure.
4715///
4716/// This routine parses the language options from the AST file and then gives
4717/// them to the AST listener if one is set.
4718///
4719/// \returns true if the listener deems the file unacceptable, false otherwise.
4720bool ASTReader::ParseLanguageOptions(const RecordData &Record,
4721 bool Complain,
Richard Smith1e2cf0d2014-10-31 02:28:58 +00004722 ASTReaderListener &Listener,
4723 bool AllowCompatibleDifferences) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004724 LangOptions LangOpts;
4725 unsigned Idx = 0;
4726#define LANGOPT(Name, Bits, Default, Description) \
4727 LangOpts.Name = Record[Idx++];
4728#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
4729 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
4730#include "clang/Basic/LangOptions.def"
Alexey Samsonovedf99a92014-11-07 22:29:38 +00004731#define SANITIZER(NAME, ID) \
4732 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]);
Will Dietzf54319c2013-01-18 11:30:38 +00004733#include "clang/Basic/Sanitizers.def"
Guy Benyei11169dd2012-12-18 14:30:41 +00004734
4735 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++];
4736 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx);
4737 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion);
4738
4739 unsigned Length = Record[Idx++];
4740 LangOpts.CurrentModule.assign(Record.begin() + Idx,
4741 Record.begin() + Idx + Length);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004742
4743 Idx += Length;
4744
4745 // Comment options.
4746 for (unsigned N = Record[Idx++]; N; --N) {
4747 LangOpts.CommentOpts.BlockCommandNames.push_back(
4748 ReadString(Record, Idx));
4749 }
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004750 LangOpts.CommentOpts.ParseAllComments = Record[Idx++];
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004751
Richard Smith1e2cf0d2014-10-31 02:28:58 +00004752 return Listener.ReadLanguageOptions(LangOpts, Complain,
4753 AllowCompatibleDifferences);
Guy Benyei11169dd2012-12-18 14:30:41 +00004754}
4755
Chandler Carruth0d745bc2015-03-14 04:47:43 +00004756bool ASTReader::ParseTargetOptions(const RecordData &Record, bool Complain,
4757 ASTReaderListener &Listener,
4758 bool AllowCompatibleDifferences) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004759 unsigned Idx = 0;
4760 TargetOptions TargetOpts;
4761 TargetOpts.Triple = ReadString(Record, Idx);
4762 TargetOpts.CPU = ReadString(Record, Idx);
4763 TargetOpts.ABI = ReadString(Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00004764 for (unsigned N = Record[Idx++]; N; --N) {
4765 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx));
4766 }
4767 for (unsigned N = Record[Idx++]; N; --N) {
4768 TargetOpts.Features.push_back(ReadString(Record, Idx));
4769 }
4770
Chandler Carruth0d745bc2015-03-14 04:47:43 +00004771 return Listener.ReadTargetOptions(TargetOpts, Complain,
4772 AllowCompatibleDifferences);
Guy Benyei11169dd2012-12-18 14:30:41 +00004773}
4774
4775bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain,
4776 ASTReaderListener &Listener) {
Ben Langmuirb92de022014-04-29 16:25:26 +00004777 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions);
Guy Benyei11169dd2012-12-18 14:30:41 +00004778 unsigned Idx = 0;
Ben Langmuirb92de022014-04-29 16:25:26 +00004779#define DIAGOPT(Name, Bits, Default) DiagOpts->Name = Record[Idx++];
Guy Benyei11169dd2012-12-18 14:30:41 +00004780#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
Ben Langmuirb92de022014-04-29 16:25:26 +00004781 DiagOpts->set##Name(static_cast<Type>(Record[Idx++]));
Guy Benyei11169dd2012-12-18 14:30:41 +00004782#include "clang/Basic/DiagnosticOptions.def"
4783
Richard Smith3be1cb22014-08-07 00:24:21 +00004784 for (unsigned N = Record[Idx++]; N; --N)
Ben Langmuirb92de022014-04-29 16:25:26 +00004785 DiagOpts->Warnings.push_back(ReadString(Record, Idx));
Richard Smith3be1cb22014-08-07 00:24:21 +00004786 for (unsigned N = Record[Idx++]; N; --N)
4787 DiagOpts->Remarks.push_back(ReadString(Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00004788
4789 return Listener.ReadDiagnosticOptions(DiagOpts, Complain);
4790}
4791
4792bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain,
4793 ASTReaderListener &Listener) {
4794 FileSystemOptions FSOpts;
4795 unsigned Idx = 0;
4796 FSOpts.WorkingDir = ReadString(Record, Idx);
4797 return Listener.ReadFileSystemOptions(FSOpts, Complain);
4798}
4799
4800bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record,
4801 bool Complain,
4802 ASTReaderListener &Listener) {
4803 HeaderSearchOptions HSOpts;
4804 unsigned Idx = 0;
4805 HSOpts.Sysroot = ReadString(Record, Idx);
4806
4807 // Include entries.
4808 for (unsigned N = Record[Idx++]; N; --N) {
4809 std::string Path = ReadString(Record, Idx);
4810 frontend::IncludeDirGroup Group
4811 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]);
Guy Benyei11169dd2012-12-18 14:30:41 +00004812 bool IsFramework = Record[Idx++];
4813 bool IgnoreSysRoot = Record[Idx++];
Guy Benyei11169dd2012-12-18 14:30:41 +00004814 HSOpts.UserEntries.push_back(
Daniel Dunbar53681732013-01-30 00:34:26 +00004815 HeaderSearchOptions::Entry(Path, Group, IsFramework, IgnoreSysRoot));
Guy Benyei11169dd2012-12-18 14:30:41 +00004816 }
4817
4818 // System header prefixes.
4819 for (unsigned N = Record[Idx++]; N; --N) {
4820 std::string Prefix = ReadString(Record, Idx);
4821 bool IsSystemHeader = Record[Idx++];
4822 HSOpts.SystemHeaderPrefixes.push_back(
4823 HeaderSearchOptions::SystemHeaderPrefix(Prefix, IsSystemHeader));
4824 }
4825
4826 HSOpts.ResourceDir = ReadString(Record, Idx);
4827 HSOpts.ModuleCachePath = ReadString(Record, Idx);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004828 HSOpts.ModuleUserBuildPath = ReadString(Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00004829 HSOpts.DisableModuleHash = Record[Idx++];
4830 HSOpts.UseBuiltinIncludes = Record[Idx++];
4831 HSOpts.UseStandardSystemIncludes = Record[Idx++];
4832 HSOpts.UseStandardCXXIncludes = Record[Idx++];
4833 HSOpts.UseLibcxx = Record[Idx++];
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00004834 std::string SpecificModuleCachePath = ReadString(Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00004835
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00004836 return Listener.ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
4837 Complain);
Guy Benyei11169dd2012-12-18 14:30:41 +00004838}
4839
4840bool ASTReader::ParsePreprocessorOptions(const RecordData &Record,
4841 bool Complain,
4842 ASTReaderListener &Listener,
4843 std::string &SuggestedPredefines) {
4844 PreprocessorOptions PPOpts;
4845 unsigned Idx = 0;
4846
4847 // Macro definitions/undefs
4848 for (unsigned N = Record[Idx++]; N; --N) {
4849 std::string Macro = ReadString(Record, Idx);
4850 bool IsUndef = Record[Idx++];
4851 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef));
4852 }
4853
4854 // Includes
4855 for (unsigned N = Record[Idx++]; N; --N) {
4856 PPOpts.Includes.push_back(ReadString(Record, Idx));
4857 }
4858
4859 // Macro Includes
4860 for (unsigned N = Record[Idx++]; N; --N) {
4861 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx));
4862 }
4863
4864 PPOpts.UsePredefines = Record[Idx++];
Argyrios Kyrtzidisd3afa0c2013-04-26 21:33:40 +00004865 PPOpts.DetailedRecord = Record[Idx++];
Guy Benyei11169dd2012-12-18 14:30:41 +00004866 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx);
4867 PPOpts.ImplicitPTHInclude = ReadString(Record, Idx);
4868 PPOpts.ObjCXXARCStandardLibrary =
4869 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]);
4870 SuggestedPredefines.clear();
4871 return Listener.ReadPreprocessorOptions(PPOpts, Complain,
4872 SuggestedPredefines);
4873}
4874
4875std::pair<ModuleFile *, unsigned>
4876ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) {
4877 GlobalPreprocessedEntityMapType::iterator
4878 I = GlobalPreprocessedEntityMap.find(GlobalIndex);
4879 assert(I != GlobalPreprocessedEntityMap.end() &&
4880 "Corrupted global preprocessed entity map");
4881 ModuleFile *M = I->second;
4882 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID;
4883 return std::make_pair(M, LocalIndex);
4884}
4885
Benjamin Kramerb4ef6682015-02-06 17:25:10 +00004886llvm::iterator_range<PreprocessingRecord::iterator>
Guy Benyei11169dd2012-12-18 14:30:41 +00004887ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const {
4888 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
4889 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID,
4890 Mod.NumPreprocessedEntities);
4891
Benjamin Kramerb4ef6682015-02-06 17:25:10 +00004892 return llvm::make_range(PreprocessingRecord::iterator(),
4893 PreprocessingRecord::iterator());
Guy Benyei11169dd2012-12-18 14:30:41 +00004894}
4895
Benjamin Kramerb4ef6682015-02-06 17:25:10 +00004896llvm::iterator_range<ASTReader::ModuleDeclIterator>
Guy Benyei11169dd2012-12-18 14:30:41 +00004897ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) {
Benjamin Kramerb4ef6682015-02-06 17:25:10 +00004898 return llvm::make_range(
4899 ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls),
4900 ModuleDeclIterator(this, &Mod,
4901 Mod.FileSortedDecls + Mod.NumFileSortedDecls));
Guy Benyei11169dd2012-12-18 14:30:41 +00004902}
4903
4904PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) {
4905 PreprocessedEntityID PPID = Index+1;
4906 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
4907 ModuleFile &M = *PPInfo.first;
4908 unsigned LocalIndex = PPInfo.second;
4909 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
4910
Guy Benyei11169dd2012-12-18 14:30:41 +00004911 if (!PP.getPreprocessingRecord()) {
4912 Error("no preprocessing record");
Craig Toppera13603a2014-05-22 05:54:18 +00004913 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00004914 }
4915
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004916 SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor);
4917 M.PreprocessorDetailCursor.JumpToBit(PPOffs.BitOffset);
4918
4919 llvm::BitstreamEntry Entry =
4920 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
4921 if (Entry.Kind != llvm::BitstreamEntry::Record)
Craig Toppera13603a2014-05-22 05:54:18 +00004922 return nullptr;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004923
Guy Benyei11169dd2012-12-18 14:30:41 +00004924 // Read the record.
4925 SourceRange Range(ReadSourceLocation(M, PPOffs.Begin),
4926 ReadSourceLocation(M, PPOffs.End));
4927 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
Chris Lattner0e6c9402013-01-20 02:38:54 +00004928 StringRef Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00004929 RecordData Record;
4930 PreprocessorDetailRecordTypes RecType =
Chris Lattner0e6c9402013-01-20 02:38:54 +00004931 (PreprocessorDetailRecordTypes)M.PreprocessorDetailCursor.readRecord(
4932 Entry.ID, Record, &Blob);
Guy Benyei11169dd2012-12-18 14:30:41 +00004933 switch (RecType) {
4934 case PPD_MACRO_EXPANSION: {
4935 bool isBuiltin = Record[0];
Craig Toppera13603a2014-05-22 05:54:18 +00004936 IdentifierInfo *Name = nullptr;
4937 MacroDefinition *Def = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00004938 if (isBuiltin)
4939 Name = getLocalIdentifier(M, Record[1]);
4940 else {
4941 PreprocessedEntityID
4942 GlobalID = getGlobalPreprocessedEntityID(M, Record[1]);
4943 Def =cast<MacroDefinition>(PPRec.getLoadedPreprocessedEntity(GlobalID-1));
4944 }
4945
4946 MacroExpansion *ME;
4947 if (isBuiltin)
4948 ME = new (PPRec) MacroExpansion(Name, Range);
4949 else
4950 ME = new (PPRec) MacroExpansion(Def, Range);
4951
4952 return ME;
4953 }
4954
4955 case PPD_MACRO_DEFINITION: {
4956 // Decode the identifier info and then check again; if the macro is
4957 // still defined and associated with the identifier,
4958 IdentifierInfo *II = getLocalIdentifier(M, Record[0]);
4959 MacroDefinition *MD
4960 = new (PPRec) MacroDefinition(II, Range);
4961
4962 if (DeserializationListener)
4963 DeserializationListener->MacroDefinitionRead(PPID, MD);
4964
4965 return MD;
4966 }
4967
4968 case PPD_INCLUSION_DIRECTIVE: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00004969 const char *FullFileNameStart = Blob.data() + Record[0];
4970 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]);
Craig Toppera13603a2014-05-22 05:54:18 +00004971 const FileEntry *File = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00004972 if (!FullFileName.empty())
4973 File = PP.getFileManager().getFile(FullFileName);
4974
4975 // FIXME: Stable encoding
4976 InclusionDirective::InclusionKind Kind
4977 = static_cast<InclusionDirective::InclusionKind>(Record[2]);
4978 InclusionDirective *ID
4979 = new (PPRec) InclusionDirective(PPRec, Kind,
Chris Lattner0e6c9402013-01-20 02:38:54 +00004980 StringRef(Blob.data(), Record[0]),
Guy Benyei11169dd2012-12-18 14:30:41 +00004981 Record[1], Record[3],
4982 File,
4983 Range);
4984 return ID;
4985 }
4986 }
4987
4988 llvm_unreachable("Invalid PreprocessorDetailRecordTypes");
4989}
4990
4991/// \brief \arg SLocMapI points at a chunk of a module that contains no
4992/// preprocessed entities or the entities it contains are not the ones we are
4993/// looking for. Find the next module that contains entities and return the ID
4994/// of the first entry.
4995PreprocessedEntityID ASTReader::findNextPreprocessedEntity(
4996 GlobalSLocOffsetMapType::const_iterator SLocMapI) const {
4997 ++SLocMapI;
4998 for (GlobalSLocOffsetMapType::const_iterator
4999 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
5000 ModuleFile &M = *SLocMapI->second;
5001 if (M.NumPreprocessedEntities)
5002 return M.BasePreprocessedEntityID;
5003 }
5004
5005 return getTotalNumPreprocessedEntities();
5006}
5007
5008namespace {
5009
5010template <unsigned PPEntityOffset::*PPLoc>
5011struct PPEntityComp {
5012 const ASTReader &Reader;
5013 ModuleFile &M;
5014
5015 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) { }
5016
5017 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const {
5018 SourceLocation LHS = getLoc(L);
5019 SourceLocation RHS = getLoc(R);
5020 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
5021 }
5022
5023 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const {
5024 SourceLocation LHS = getLoc(L);
5025 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
5026 }
5027
5028 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const {
5029 SourceLocation RHS = getLoc(R);
5030 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
5031 }
5032
5033 SourceLocation getLoc(const PPEntityOffset &PPE) const {
5034 return Reader.ReadSourceLocation(M, PPE.*PPLoc);
5035 }
5036};
5037
5038}
5039
Alp Toker2e9ce4c2014-05-16 18:59:21 +00005040PreprocessedEntityID ASTReader::findPreprocessedEntity(SourceLocation Loc,
5041 bool EndsAfter) const {
5042 if (SourceMgr.isLocalSourceLocation(Loc))
Guy Benyei11169dd2012-12-18 14:30:41 +00005043 return getTotalNumPreprocessedEntities();
5044
Alp Toker2e9ce4c2014-05-16 18:59:21 +00005045 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
5046 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
Guy Benyei11169dd2012-12-18 14:30:41 +00005047 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
5048 "Corrupted global sloc offset map");
5049
5050 if (SLocMapI->second->NumPreprocessedEntities == 0)
5051 return findNextPreprocessedEntity(SLocMapI);
5052
5053 ModuleFile &M = *SLocMapI->second;
5054 typedef const PPEntityOffset *pp_iterator;
5055 pp_iterator pp_begin = M.PreprocessedEntityOffsets;
5056 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities;
5057
5058 size_t Count = M.NumPreprocessedEntities;
5059 size_t Half;
5060 pp_iterator First = pp_begin;
5061 pp_iterator PPI;
5062
Alp Toker2e9ce4c2014-05-16 18:59:21 +00005063 if (EndsAfter) {
5064 PPI = std::upper_bound(pp_begin, pp_end, Loc,
5065 PPEntityComp<&PPEntityOffset::Begin>(*this, M));
5066 } else {
5067 // Do a binary search manually instead of using std::lower_bound because
5068 // The end locations of entities may be unordered (when a macro expansion
5069 // is inside another macro argument), but for this case it is not important
5070 // whether we get the first macro expansion or its containing macro.
5071 while (Count > 0) {
5072 Half = Count / 2;
5073 PPI = First;
5074 std::advance(PPI, Half);
5075 if (SourceMgr.isBeforeInTranslationUnit(ReadSourceLocation(M, PPI->End),
5076 Loc)) {
5077 First = PPI;
5078 ++First;
5079 Count = Count - Half - 1;
5080 } else
5081 Count = Half;
5082 }
Guy Benyei11169dd2012-12-18 14:30:41 +00005083 }
5084
5085 if (PPI == pp_end)
5086 return findNextPreprocessedEntity(SLocMapI);
5087
5088 return M.BasePreprocessedEntityID + (PPI - pp_begin);
5089}
5090
Guy Benyei11169dd2012-12-18 14:30:41 +00005091/// \brief Returns a pair of [Begin, End) indices of preallocated
5092/// preprocessed entities that \arg Range encompasses.
5093std::pair<unsigned, unsigned>
5094 ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) {
5095 if (Range.isInvalid())
5096 return std::make_pair(0,0);
5097 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
5098
Alp Toker2e9ce4c2014-05-16 18:59:21 +00005099 PreprocessedEntityID BeginID =
5100 findPreprocessedEntity(Range.getBegin(), false);
5101 PreprocessedEntityID EndID = findPreprocessedEntity(Range.getEnd(), true);
Guy Benyei11169dd2012-12-18 14:30:41 +00005102 return std::make_pair(BeginID, EndID);
5103}
5104
5105/// \brief Optionally returns true or false if the preallocated preprocessed
5106/// entity with index \arg Index came from file \arg FID.
David Blaikie05785d12013-02-20 22:23:23 +00005107Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index,
Guy Benyei11169dd2012-12-18 14:30:41 +00005108 FileID FID) {
5109 if (FID.isInvalid())
5110 return false;
5111
5112 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
5113 ModuleFile &M = *PPInfo.first;
5114 unsigned LocalIndex = PPInfo.second;
5115 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
5116
5117 SourceLocation Loc = ReadSourceLocation(M, PPOffs.Begin);
5118 if (Loc.isInvalid())
5119 return false;
5120
5121 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
5122 return true;
5123 else
5124 return false;
5125}
5126
5127namespace {
5128 /// \brief Visitor used to search for information about a header file.
5129 class HeaderFileInfoVisitor {
Guy Benyei11169dd2012-12-18 14:30:41 +00005130 const FileEntry *FE;
5131
David Blaikie05785d12013-02-20 22:23:23 +00005132 Optional<HeaderFileInfo> HFI;
Guy Benyei11169dd2012-12-18 14:30:41 +00005133
5134 public:
Argyrios Kyrtzidis61a38962013-03-06 18:12:44 +00005135 explicit HeaderFileInfoVisitor(const FileEntry *FE)
5136 : FE(FE) { }
Guy Benyei11169dd2012-12-18 14:30:41 +00005137
5138 static bool visit(ModuleFile &M, void *UserData) {
5139 HeaderFileInfoVisitor *This
5140 = static_cast<HeaderFileInfoVisitor *>(UserData);
5141
Guy Benyei11169dd2012-12-18 14:30:41 +00005142 HeaderFileInfoLookupTable *Table
5143 = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable);
5144 if (!Table)
5145 return false;
5146
5147 // Look in the on-disk hash table for an entry for this file name.
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00005148 HeaderFileInfoLookupTable::iterator Pos = Table->find(This->FE);
Guy Benyei11169dd2012-12-18 14:30:41 +00005149 if (Pos == Table->end())
5150 return false;
5151
5152 This->HFI = *Pos;
5153 return true;
5154 }
5155
David Blaikie05785d12013-02-20 22:23:23 +00005156 Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; }
Guy Benyei11169dd2012-12-18 14:30:41 +00005157 };
5158}
5159
5160HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) {
Argyrios Kyrtzidis61a38962013-03-06 18:12:44 +00005161 HeaderFileInfoVisitor Visitor(FE);
Guy Benyei11169dd2012-12-18 14:30:41 +00005162 ModuleMgr.visit(&HeaderFileInfoVisitor::visit, &Visitor);
Argyrios Kyrtzidis1054bbf2013-05-08 23:46:55 +00005163 if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
Guy Benyei11169dd2012-12-18 14:30:41 +00005164 return *HFI;
Guy Benyei11169dd2012-12-18 14:30:41 +00005165
5166 return HeaderFileInfo();
5167}
5168
5169void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) {
5170 // FIXME: Make it work properly with modules.
Dmitri Gribenkof8579502013-01-12 19:30:44 +00005171 SmallVector<DiagnosticsEngine::DiagState *, 32> DiagStates;
Guy Benyei11169dd2012-12-18 14:30:41 +00005172 for (ModuleIterator I = ModuleMgr.begin(), E = ModuleMgr.end(); I != E; ++I) {
5173 ModuleFile &F = *(*I);
5174 unsigned Idx = 0;
5175 DiagStates.clear();
5176 assert(!Diag.DiagStates.empty());
5177 DiagStates.push_back(&Diag.DiagStates.front()); // the command-line one.
5178 while (Idx < F.PragmaDiagMappings.size()) {
5179 SourceLocation Loc = ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]);
5180 unsigned DiagStateID = F.PragmaDiagMappings[Idx++];
5181 if (DiagStateID != 0) {
5182 Diag.DiagStatePoints.push_back(
5183 DiagnosticsEngine::DiagStatePoint(DiagStates[DiagStateID-1],
5184 FullSourceLoc(Loc, SourceMgr)));
5185 continue;
5186 }
5187
5188 assert(DiagStateID == 0);
5189 // A new DiagState was created here.
5190 Diag.DiagStates.push_back(*Diag.GetCurDiagState());
5191 DiagnosticsEngine::DiagState *NewState = &Diag.DiagStates.back();
5192 DiagStates.push_back(NewState);
5193 Diag.DiagStatePoints.push_back(
5194 DiagnosticsEngine::DiagStatePoint(NewState,
5195 FullSourceLoc(Loc, SourceMgr)));
5196 while (1) {
5197 assert(Idx < F.PragmaDiagMappings.size() &&
5198 "Invalid data, didn't find '-1' marking end of diag/map pairs");
5199 if (Idx >= F.PragmaDiagMappings.size()) {
5200 break; // Something is messed up but at least avoid infinite loop in
5201 // release build.
5202 }
5203 unsigned DiagID = F.PragmaDiagMappings[Idx++];
5204 if (DiagID == (unsigned)-1) {
5205 break; // no more diag/map pairs for this location.
5206 }
Alp Tokerc726c362014-06-10 09:31:37 +00005207 diag::Severity Map = (diag::Severity)F.PragmaDiagMappings[Idx++];
5208 DiagnosticMapping Mapping = Diag.makeUserMapping(Map, Loc);
5209 Diag.GetCurDiagState()->setMapping(DiagID, Mapping);
Guy Benyei11169dd2012-12-18 14:30:41 +00005210 }
5211 }
5212 }
5213}
5214
5215/// \brief Get the correct cursor and offset for loading a type.
5216ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) {
5217 GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index);
5218 assert(I != GlobalTypeMap.end() && "Corrupted global type map");
5219 ModuleFile *M = I->second;
5220 return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex]);
5221}
5222
5223/// \brief Read and return the type with the given index..
5224///
5225/// The index is the type ID, shifted and minus the number of predefs. This
5226/// routine actually reads the record corresponding to the type at the given
5227/// location. It is a helper routine for GetType, which deals with reading type
5228/// IDs.
5229QualType ASTReader::readTypeRecord(unsigned Index) {
5230 RecordLocation Loc = TypeCursorForIndex(Index);
Chris Lattner7fb3bef2013-01-20 00:56:42 +00005231 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00005232
5233 // Keep track of where we are in the stream, then jump back there
5234 // after reading this type.
5235 SavedStreamPosition SavedPosition(DeclsCursor);
5236
5237 ReadingKindTracker ReadingKind(Read_Type, *this);
5238
5239 // Note that we are loading a type record.
5240 Deserializing AType(this);
5241
5242 unsigned Idx = 0;
5243 DeclsCursor.JumpToBit(Loc.Offset);
5244 RecordData Record;
5245 unsigned Code = DeclsCursor.ReadCode();
Chris Lattner0e6c9402013-01-20 02:38:54 +00005246 switch ((TypeCode)DeclsCursor.readRecord(Code, Record)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00005247 case TYPE_EXT_QUAL: {
5248 if (Record.size() != 2) {
5249 Error("Incorrect encoding of extended qualifier type");
5250 return QualType();
5251 }
5252 QualType Base = readType(*Loc.F, Record, Idx);
5253 Qualifiers Quals = Qualifiers::fromOpaqueValue(Record[Idx++]);
5254 return Context.getQualifiedType(Base, Quals);
5255 }
5256
5257 case TYPE_COMPLEX: {
5258 if (Record.size() != 1) {
5259 Error("Incorrect encoding of complex type");
5260 return QualType();
5261 }
5262 QualType ElemType = readType(*Loc.F, Record, Idx);
5263 return Context.getComplexType(ElemType);
5264 }
5265
5266 case TYPE_POINTER: {
5267 if (Record.size() != 1) {
5268 Error("Incorrect encoding of pointer type");
5269 return QualType();
5270 }
5271 QualType PointeeType = readType(*Loc.F, Record, Idx);
5272 return Context.getPointerType(PointeeType);
5273 }
5274
Reid Kleckner8a365022013-06-24 17:51:48 +00005275 case TYPE_DECAYED: {
5276 if (Record.size() != 1) {
5277 Error("Incorrect encoding of decayed type");
5278 return QualType();
5279 }
5280 QualType OriginalType = readType(*Loc.F, Record, Idx);
5281 QualType DT = Context.getAdjustedParameterType(OriginalType);
5282 if (!isa<DecayedType>(DT))
5283 Error("Decayed type does not decay");
5284 return DT;
5285 }
5286
Reid Kleckner0503a872013-12-05 01:23:43 +00005287 case TYPE_ADJUSTED: {
5288 if (Record.size() != 2) {
5289 Error("Incorrect encoding of adjusted type");
5290 return QualType();
5291 }
5292 QualType OriginalTy = readType(*Loc.F, Record, Idx);
5293 QualType AdjustedTy = readType(*Loc.F, Record, Idx);
5294 return Context.getAdjustedType(OriginalTy, AdjustedTy);
5295 }
5296
Guy Benyei11169dd2012-12-18 14:30:41 +00005297 case TYPE_BLOCK_POINTER: {
5298 if (Record.size() != 1) {
5299 Error("Incorrect encoding of block pointer type");
5300 return QualType();
5301 }
5302 QualType PointeeType = readType(*Loc.F, Record, Idx);
5303 return Context.getBlockPointerType(PointeeType);
5304 }
5305
5306 case TYPE_LVALUE_REFERENCE: {
5307 if (Record.size() != 2) {
5308 Error("Incorrect encoding of lvalue reference type");
5309 return QualType();
5310 }
5311 QualType PointeeType = readType(*Loc.F, Record, Idx);
5312 return Context.getLValueReferenceType(PointeeType, Record[1]);
5313 }
5314
5315 case TYPE_RVALUE_REFERENCE: {
5316 if (Record.size() != 1) {
5317 Error("Incorrect encoding of rvalue reference type");
5318 return QualType();
5319 }
5320 QualType PointeeType = readType(*Loc.F, Record, Idx);
5321 return Context.getRValueReferenceType(PointeeType);
5322 }
5323
5324 case TYPE_MEMBER_POINTER: {
5325 if (Record.size() != 2) {
5326 Error("Incorrect encoding of member pointer type");
5327 return QualType();
5328 }
5329 QualType PointeeType = readType(*Loc.F, Record, Idx);
5330 QualType ClassType = readType(*Loc.F, Record, Idx);
5331 if (PointeeType.isNull() || ClassType.isNull())
5332 return QualType();
5333
5334 return Context.getMemberPointerType(PointeeType, ClassType.getTypePtr());
5335 }
5336
5337 case TYPE_CONSTANT_ARRAY: {
5338 QualType ElementType = readType(*Loc.F, Record, Idx);
5339 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5340 unsigned IndexTypeQuals = Record[2];
5341 unsigned Idx = 3;
5342 llvm::APInt Size = ReadAPInt(Record, Idx);
5343 return Context.getConstantArrayType(ElementType, Size,
5344 ASM, IndexTypeQuals);
5345 }
5346
5347 case TYPE_INCOMPLETE_ARRAY: {
5348 QualType ElementType = readType(*Loc.F, Record, Idx);
5349 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5350 unsigned IndexTypeQuals = Record[2];
5351 return Context.getIncompleteArrayType(ElementType, ASM, IndexTypeQuals);
5352 }
5353
5354 case TYPE_VARIABLE_ARRAY: {
5355 QualType ElementType = readType(*Loc.F, Record, Idx);
5356 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5357 unsigned IndexTypeQuals = Record[2];
5358 SourceLocation LBLoc = ReadSourceLocation(*Loc.F, Record[3]);
5359 SourceLocation RBLoc = ReadSourceLocation(*Loc.F, Record[4]);
5360 return Context.getVariableArrayType(ElementType, ReadExpr(*Loc.F),
5361 ASM, IndexTypeQuals,
5362 SourceRange(LBLoc, RBLoc));
5363 }
5364
5365 case TYPE_VECTOR: {
5366 if (Record.size() != 3) {
5367 Error("incorrect encoding of vector type in AST file");
5368 return QualType();
5369 }
5370
5371 QualType ElementType = readType(*Loc.F, Record, Idx);
5372 unsigned NumElements = Record[1];
5373 unsigned VecKind = Record[2];
5374 return Context.getVectorType(ElementType, NumElements,
5375 (VectorType::VectorKind)VecKind);
5376 }
5377
5378 case TYPE_EXT_VECTOR: {
5379 if (Record.size() != 3) {
5380 Error("incorrect encoding of extended vector type in AST file");
5381 return QualType();
5382 }
5383
5384 QualType ElementType = readType(*Loc.F, Record, Idx);
5385 unsigned NumElements = Record[1];
5386 return Context.getExtVectorType(ElementType, NumElements);
5387 }
5388
5389 case TYPE_FUNCTION_NO_PROTO: {
5390 if (Record.size() != 6) {
5391 Error("incorrect encoding of no-proto function type");
5392 return QualType();
5393 }
5394 QualType ResultType = readType(*Loc.F, Record, Idx);
5395 FunctionType::ExtInfo Info(Record[1], Record[2], Record[3],
5396 (CallingConv)Record[4], Record[5]);
5397 return Context.getFunctionNoProtoType(ResultType, Info);
5398 }
5399
5400 case TYPE_FUNCTION_PROTO: {
5401 QualType ResultType = readType(*Loc.F, Record, Idx);
5402
5403 FunctionProtoType::ExtProtoInfo EPI;
5404 EPI.ExtInfo = FunctionType::ExtInfo(/*noreturn*/ Record[1],
5405 /*hasregparm*/ Record[2],
5406 /*regparm*/ Record[3],
5407 static_cast<CallingConv>(Record[4]),
5408 /*produces*/ Record[5]);
5409
5410 unsigned Idx = 6;
Guy Benyei11169dd2012-12-18 14:30:41 +00005411
5412 EPI.Variadic = Record[Idx++];
5413 EPI.HasTrailingReturn = Record[Idx++];
5414 EPI.TypeQuals = Record[Idx++];
5415 EPI.RefQualifier = static_cast<RefQualifierKind>(Record[Idx++]);
Richard Smith564417a2014-03-20 21:47:22 +00005416 SmallVector<QualType, 8> ExceptionStorage;
Richard Smith8acb4282014-07-31 21:57:55 +00005417 readExceptionSpec(*Loc.F, ExceptionStorage, EPI.ExceptionSpec, Record, Idx);
Richard Smith01b2cb42014-07-26 06:37:51 +00005418
5419 unsigned NumParams = Record[Idx++];
5420 SmallVector<QualType, 16> ParamTypes;
5421 for (unsigned I = 0; I != NumParams; ++I)
5422 ParamTypes.push_back(readType(*Loc.F, Record, Idx));
5423
Jordan Rose5c382722013-03-08 21:51:21 +00005424 return Context.getFunctionType(ResultType, ParamTypes, EPI);
Guy Benyei11169dd2012-12-18 14:30:41 +00005425 }
5426
5427 case TYPE_UNRESOLVED_USING: {
5428 unsigned Idx = 0;
5429 return Context.getTypeDeclType(
5430 ReadDeclAs<UnresolvedUsingTypenameDecl>(*Loc.F, Record, Idx));
5431 }
5432
5433 case TYPE_TYPEDEF: {
5434 if (Record.size() != 2) {
5435 Error("incorrect encoding of typedef type");
5436 return QualType();
5437 }
5438 unsigned Idx = 0;
5439 TypedefNameDecl *Decl = ReadDeclAs<TypedefNameDecl>(*Loc.F, Record, Idx);
5440 QualType Canonical = readType(*Loc.F, Record, Idx);
5441 if (!Canonical.isNull())
5442 Canonical = Context.getCanonicalType(Canonical);
5443 return Context.getTypedefType(Decl, Canonical);
5444 }
5445
5446 case TYPE_TYPEOF_EXPR:
5447 return Context.getTypeOfExprType(ReadExpr(*Loc.F));
5448
5449 case TYPE_TYPEOF: {
5450 if (Record.size() != 1) {
5451 Error("incorrect encoding of typeof(type) in AST file");
5452 return QualType();
5453 }
5454 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5455 return Context.getTypeOfType(UnderlyingType);
5456 }
5457
5458 case TYPE_DECLTYPE: {
5459 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5460 return Context.getDecltypeType(ReadExpr(*Loc.F), UnderlyingType);
5461 }
5462
5463 case TYPE_UNARY_TRANSFORM: {
5464 QualType BaseType = readType(*Loc.F, Record, Idx);
5465 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5466 UnaryTransformType::UTTKind UKind = (UnaryTransformType::UTTKind)Record[2];
5467 return Context.getUnaryTransformType(BaseType, UnderlyingType, UKind);
5468 }
5469
Richard Smith74aeef52013-04-26 16:15:35 +00005470 case TYPE_AUTO: {
5471 QualType Deduced = readType(*Loc.F, Record, Idx);
5472 bool IsDecltypeAuto = Record[Idx++];
Richard Smith27d807c2013-04-30 13:56:41 +00005473 bool IsDependent = Deduced.isNull() ? Record[Idx++] : false;
Manuel Klimek2fdbea22013-08-22 12:12:24 +00005474 return Context.getAutoType(Deduced, IsDecltypeAuto, IsDependent);
Richard Smith74aeef52013-04-26 16:15:35 +00005475 }
Guy Benyei11169dd2012-12-18 14:30:41 +00005476
5477 case TYPE_RECORD: {
5478 if (Record.size() != 2) {
5479 Error("incorrect encoding of record type");
5480 return QualType();
5481 }
5482 unsigned Idx = 0;
5483 bool IsDependent = Record[Idx++];
5484 RecordDecl *RD = ReadDeclAs<RecordDecl>(*Loc.F, Record, Idx);
5485 RD = cast_or_null<RecordDecl>(RD->getCanonicalDecl());
5486 QualType T = Context.getRecordType(RD);
5487 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5488 return T;
5489 }
5490
5491 case TYPE_ENUM: {
5492 if (Record.size() != 2) {
5493 Error("incorrect encoding of enum type");
5494 return QualType();
5495 }
5496 unsigned Idx = 0;
5497 bool IsDependent = Record[Idx++];
5498 QualType T
5499 = Context.getEnumType(ReadDeclAs<EnumDecl>(*Loc.F, Record, Idx));
5500 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5501 return T;
5502 }
5503
5504 case TYPE_ATTRIBUTED: {
5505 if (Record.size() != 3) {
5506 Error("incorrect encoding of attributed type");
5507 return QualType();
5508 }
5509 QualType modifiedType = readType(*Loc.F, Record, Idx);
5510 QualType equivalentType = readType(*Loc.F, Record, Idx);
5511 AttributedType::Kind kind = static_cast<AttributedType::Kind>(Record[2]);
5512 return Context.getAttributedType(kind, modifiedType, equivalentType);
5513 }
5514
5515 case TYPE_PAREN: {
5516 if (Record.size() != 1) {
5517 Error("incorrect encoding of paren type");
5518 return QualType();
5519 }
5520 QualType InnerType = readType(*Loc.F, Record, Idx);
5521 return Context.getParenType(InnerType);
5522 }
5523
5524 case TYPE_PACK_EXPANSION: {
5525 if (Record.size() != 2) {
5526 Error("incorrect encoding of pack expansion type");
5527 return QualType();
5528 }
5529 QualType Pattern = readType(*Loc.F, Record, Idx);
5530 if (Pattern.isNull())
5531 return QualType();
David Blaikie05785d12013-02-20 22:23:23 +00005532 Optional<unsigned> NumExpansions;
Guy Benyei11169dd2012-12-18 14:30:41 +00005533 if (Record[1])
5534 NumExpansions = Record[1] - 1;
5535 return Context.getPackExpansionType(Pattern, NumExpansions);
5536 }
5537
5538 case TYPE_ELABORATED: {
5539 unsigned Idx = 0;
5540 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5541 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5542 QualType NamedType = readType(*Loc.F, Record, Idx);
5543 return Context.getElaboratedType(Keyword, NNS, NamedType);
5544 }
5545
5546 case TYPE_OBJC_INTERFACE: {
5547 unsigned Idx = 0;
5548 ObjCInterfaceDecl *ItfD
5549 = ReadDeclAs<ObjCInterfaceDecl>(*Loc.F, Record, Idx);
5550 return Context.getObjCInterfaceType(ItfD->getCanonicalDecl());
5551 }
5552
5553 case TYPE_OBJC_OBJECT: {
5554 unsigned Idx = 0;
5555 QualType Base = readType(*Loc.F, Record, Idx);
5556 unsigned NumProtos = Record[Idx++];
5557 SmallVector<ObjCProtocolDecl*, 4> Protos;
5558 for (unsigned I = 0; I != NumProtos; ++I)
5559 Protos.push_back(ReadDeclAs<ObjCProtocolDecl>(*Loc.F, Record, Idx));
5560 return Context.getObjCObjectType(Base, Protos.data(), NumProtos);
5561 }
5562
5563 case TYPE_OBJC_OBJECT_POINTER: {
5564 unsigned Idx = 0;
5565 QualType Pointee = readType(*Loc.F, Record, Idx);
5566 return Context.getObjCObjectPointerType(Pointee);
5567 }
5568
5569 case TYPE_SUBST_TEMPLATE_TYPE_PARM: {
5570 unsigned Idx = 0;
5571 QualType Parm = readType(*Loc.F, Record, Idx);
5572 QualType Replacement = readType(*Loc.F, Record, Idx);
Stephan Tolksdorfe96f8b32014-03-15 10:23:27 +00005573 return Context.getSubstTemplateTypeParmType(
5574 cast<TemplateTypeParmType>(Parm),
5575 Context.getCanonicalType(Replacement));
Guy Benyei11169dd2012-12-18 14:30:41 +00005576 }
5577
5578 case TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK: {
5579 unsigned Idx = 0;
5580 QualType Parm = readType(*Loc.F, Record, Idx);
5581 TemplateArgument ArgPack = ReadTemplateArgument(*Loc.F, Record, Idx);
5582 return Context.getSubstTemplateTypeParmPackType(
5583 cast<TemplateTypeParmType>(Parm),
5584 ArgPack);
5585 }
5586
5587 case TYPE_INJECTED_CLASS_NAME: {
5588 CXXRecordDecl *D = ReadDeclAs<CXXRecordDecl>(*Loc.F, Record, Idx);
5589 QualType TST = readType(*Loc.F, Record, Idx); // probably derivable
5590 // FIXME: ASTContext::getInjectedClassNameType is not currently suitable
5591 // for AST reading, too much interdependencies.
Richard Smith6377f8f2014-10-21 21:15:18 +00005592 const Type *T = nullptr;
5593 for (auto *DI = D; DI; DI = DI->getPreviousDecl()) {
5594 if (const Type *Existing = DI->getTypeForDecl()) {
5595 T = Existing;
5596 break;
5597 }
5598 }
5599 if (!T) {
Richard Smithf17fdbd2014-04-24 02:25:27 +00005600 T = new (Context, TypeAlignment) InjectedClassNameType(D, TST);
Richard Smith6377f8f2014-10-21 21:15:18 +00005601 for (auto *DI = D; DI; DI = DI->getPreviousDecl())
5602 DI->setTypeForDecl(T);
5603 }
Richard Smithf17fdbd2014-04-24 02:25:27 +00005604 return QualType(T, 0);
Guy Benyei11169dd2012-12-18 14:30:41 +00005605 }
5606
5607 case TYPE_TEMPLATE_TYPE_PARM: {
5608 unsigned Idx = 0;
5609 unsigned Depth = Record[Idx++];
5610 unsigned Index = Record[Idx++];
5611 bool Pack = Record[Idx++];
5612 TemplateTypeParmDecl *D
5613 = ReadDeclAs<TemplateTypeParmDecl>(*Loc.F, Record, Idx);
5614 return Context.getTemplateTypeParmType(Depth, Index, Pack, D);
5615 }
5616
5617 case TYPE_DEPENDENT_NAME: {
5618 unsigned Idx = 0;
5619 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5620 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5621 const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx);
5622 QualType Canon = readType(*Loc.F, Record, Idx);
5623 if (!Canon.isNull())
5624 Canon = Context.getCanonicalType(Canon);
5625 return Context.getDependentNameType(Keyword, NNS, Name, Canon);
5626 }
5627
5628 case TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION: {
5629 unsigned Idx = 0;
5630 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5631 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5632 const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx);
5633 unsigned NumArgs = Record[Idx++];
5634 SmallVector<TemplateArgument, 8> Args;
5635 Args.reserve(NumArgs);
5636 while (NumArgs--)
5637 Args.push_back(ReadTemplateArgument(*Loc.F, Record, Idx));
5638 return Context.getDependentTemplateSpecializationType(Keyword, NNS, Name,
5639 Args.size(), Args.data());
5640 }
5641
5642 case TYPE_DEPENDENT_SIZED_ARRAY: {
5643 unsigned Idx = 0;
5644
5645 // ArrayType
5646 QualType ElementType = readType(*Loc.F, Record, Idx);
5647 ArrayType::ArraySizeModifier ASM
5648 = (ArrayType::ArraySizeModifier)Record[Idx++];
5649 unsigned IndexTypeQuals = Record[Idx++];
5650
5651 // DependentSizedArrayType
5652 Expr *NumElts = ReadExpr(*Loc.F);
5653 SourceRange Brackets = ReadSourceRange(*Loc.F, Record, Idx);
5654
5655 return Context.getDependentSizedArrayType(ElementType, NumElts, ASM,
5656 IndexTypeQuals, Brackets);
5657 }
5658
5659 case TYPE_TEMPLATE_SPECIALIZATION: {
5660 unsigned Idx = 0;
5661 bool IsDependent = Record[Idx++];
5662 TemplateName Name = ReadTemplateName(*Loc.F, Record, Idx);
5663 SmallVector<TemplateArgument, 8> Args;
5664 ReadTemplateArgumentList(Args, *Loc.F, Record, Idx);
5665 QualType Underlying = readType(*Loc.F, Record, Idx);
5666 QualType T;
5667 if (Underlying.isNull())
5668 T = Context.getCanonicalTemplateSpecializationType(Name, Args.data(),
5669 Args.size());
5670 else
5671 T = Context.getTemplateSpecializationType(Name, Args.data(),
5672 Args.size(), Underlying);
5673 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5674 return T;
5675 }
5676
5677 case TYPE_ATOMIC: {
5678 if (Record.size() != 1) {
5679 Error("Incorrect encoding of atomic type");
5680 return QualType();
5681 }
5682 QualType ValueType = readType(*Loc.F, Record, Idx);
5683 return Context.getAtomicType(ValueType);
5684 }
5685 }
5686 llvm_unreachable("Invalid TypeCode!");
5687}
5688
Richard Smith564417a2014-03-20 21:47:22 +00005689void ASTReader::readExceptionSpec(ModuleFile &ModuleFile,
5690 SmallVectorImpl<QualType> &Exceptions,
Richard Smith8acb4282014-07-31 21:57:55 +00005691 FunctionProtoType::ExceptionSpecInfo &ESI,
Richard Smith564417a2014-03-20 21:47:22 +00005692 const RecordData &Record, unsigned &Idx) {
5693 ExceptionSpecificationType EST =
5694 static_cast<ExceptionSpecificationType>(Record[Idx++]);
Richard Smith8acb4282014-07-31 21:57:55 +00005695 ESI.Type = EST;
Richard Smith564417a2014-03-20 21:47:22 +00005696 if (EST == EST_Dynamic) {
Richard Smith8acb4282014-07-31 21:57:55 +00005697 for (unsigned I = 0, N = Record[Idx++]; I != N; ++I)
Richard Smith564417a2014-03-20 21:47:22 +00005698 Exceptions.push_back(readType(ModuleFile, Record, Idx));
Richard Smith8acb4282014-07-31 21:57:55 +00005699 ESI.Exceptions = Exceptions;
Richard Smith564417a2014-03-20 21:47:22 +00005700 } else if (EST == EST_ComputedNoexcept) {
Richard Smith8acb4282014-07-31 21:57:55 +00005701 ESI.NoexceptExpr = ReadExpr(ModuleFile);
Richard Smith564417a2014-03-20 21:47:22 +00005702 } else if (EST == EST_Uninstantiated) {
Richard Smith8acb4282014-07-31 21:57:55 +00005703 ESI.SourceDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
5704 ESI.SourceTemplate = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
Richard Smith564417a2014-03-20 21:47:22 +00005705 } else if (EST == EST_Unevaluated) {
Richard Smith8acb4282014-07-31 21:57:55 +00005706 ESI.SourceDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
Richard Smith564417a2014-03-20 21:47:22 +00005707 }
5708}
5709
Guy Benyei11169dd2012-12-18 14:30:41 +00005710class clang::TypeLocReader : public TypeLocVisitor<TypeLocReader> {
5711 ASTReader &Reader;
5712 ModuleFile &F;
5713 const ASTReader::RecordData &Record;
5714 unsigned &Idx;
5715
5716 SourceLocation ReadSourceLocation(const ASTReader::RecordData &R,
5717 unsigned &I) {
5718 return Reader.ReadSourceLocation(F, R, I);
5719 }
5720
5721 template<typename T>
5722 T *ReadDeclAs(const ASTReader::RecordData &Record, unsigned &Idx) {
5723 return Reader.ReadDeclAs<T>(F, Record, Idx);
5724 }
5725
5726public:
5727 TypeLocReader(ASTReader &Reader, ModuleFile &F,
5728 const ASTReader::RecordData &Record, unsigned &Idx)
5729 : Reader(Reader), F(F), Record(Record), Idx(Idx)
5730 { }
5731
5732 // We want compile-time assurance that we've enumerated all of
5733 // these, so unfortunately we have to declare them first, then
5734 // define them out-of-line.
5735#define ABSTRACT_TYPELOC(CLASS, PARENT)
5736#define TYPELOC(CLASS, PARENT) \
5737 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
5738#include "clang/AST/TypeLocNodes.def"
5739
5740 void VisitFunctionTypeLoc(FunctionTypeLoc);
5741 void VisitArrayTypeLoc(ArrayTypeLoc);
5742};
5743
5744void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
5745 // nothing to do
5746}
5747void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
5748 TL.setBuiltinLoc(ReadSourceLocation(Record, Idx));
5749 if (TL.needsExtraLocalData()) {
5750 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Record[Idx++]));
5751 TL.setWrittenSignSpec(static_cast<DeclSpec::TSS>(Record[Idx++]));
5752 TL.setWrittenWidthSpec(static_cast<DeclSpec::TSW>(Record[Idx++]));
5753 TL.setModeAttr(Record[Idx++]);
5754 }
5755}
5756void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
5757 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5758}
5759void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
5760 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5761}
Reid Kleckner8a365022013-06-24 17:51:48 +00005762void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
5763 // nothing to do
5764}
Reid Kleckner0503a872013-12-05 01:23:43 +00005765void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
5766 // nothing to do
5767}
Guy Benyei11169dd2012-12-18 14:30:41 +00005768void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
5769 TL.setCaretLoc(ReadSourceLocation(Record, Idx));
5770}
5771void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
5772 TL.setAmpLoc(ReadSourceLocation(Record, Idx));
5773}
5774void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
5775 TL.setAmpAmpLoc(ReadSourceLocation(Record, Idx));
5776}
5777void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
5778 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5779 TL.setClassTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5780}
5781void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) {
5782 TL.setLBracketLoc(ReadSourceLocation(Record, Idx));
5783 TL.setRBracketLoc(ReadSourceLocation(Record, Idx));
5784 if (Record[Idx++])
5785 TL.setSizeExpr(Reader.ReadExpr(F));
5786 else
Craig Toppera13603a2014-05-22 05:54:18 +00005787 TL.setSizeExpr(nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00005788}
5789void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) {
5790 VisitArrayTypeLoc(TL);
5791}
5792void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) {
5793 VisitArrayTypeLoc(TL);
5794}
5795void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
5796 VisitArrayTypeLoc(TL);
5797}
5798void TypeLocReader::VisitDependentSizedArrayTypeLoc(
5799 DependentSizedArrayTypeLoc TL) {
5800 VisitArrayTypeLoc(TL);
5801}
5802void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
5803 DependentSizedExtVectorTypeLoc TL) {
5804 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5805}
5806void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
5807 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5808}
5809void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
5810 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5811}
5812void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) {
5813 TL.setLocalRangeBegin(ReadSourceLocation(Record, Idx));
5814 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5815 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5816 TL.setLocalRangeEnd(ReadSourceLocation(Record, Idx));
Alp Tokerb3fd5cf2014-01-21 00:32:38 +00005817 for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) {
5818 TL.setParam(i, ReadDeclAs<ParmVarDecl>(Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00005819 }
5820}
5821void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) {
5822 VisitFunctionTypeLoc(TL);
5823}
5824void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) {
5825 VisitFunctionTypeLoc(TL);
5826}
5827void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
5828 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5829}
5830void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
5831 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5832}
5833void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
5834 TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
5835 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5836 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5837}
5838void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
5839 TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
5840 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5841 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5842 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5843}
5844void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
5845 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5846}
5847void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
5848 TL.setKWLoc(ReadSourceLocation(Record, Idx));
5849 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5850 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5851 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5852}
5853void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) {
5854 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5855}
5856void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) {
5857 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5858}
5859void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) {
5860 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5861}
5862void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
5863 TL.setAttrNameLoc(ReadSourceLocation(Record, Idx));
5864 if (TL.hasAttrOperand()) {
5865 SourceRange range;
5866 range.setBegin(ReadSourceLocation(Record, Idx));
5867 range.setEnd(ReadSourceLocation(Record, Idx));
5868 TL.setAttrOperandParensRange(range);
5869 }
5870 if (TL.hasAttrExprOperand()) {
5871 if (Record[Idx++])
5872 TL.setAttrExprOperand(Reader.ReadExpr(F));
5873 else
Craig Toppera13603a2014-05-22 05:54:18 +00005874 TL.setAttrExprOperand(nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00005875 } else if (TL.hasAttrEnumOperand())
5876 TL.setAttrEnumOperandLoc(ReadSourceLocation(Record, Idx));
5877}
5878void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
5879 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5880}
5881void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
5882 SubstTemplateTypeParmTypeLoc TL) {
5883 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5884}
5885void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
5886 SubstTemplateTypeParmPackTypeLoc TL) {
5887 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5888}
5889void TypeLocReader::VisitTemplateSpecializationTypeLoc(
5890 TemplateSpecializationTypeLoc TL) {
5891 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx));
5892 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx));
5893 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5894 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5895 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i)
5896 TL.setArgLocInfo(i,
5897 Reader.GetTemplateArgumentLocInfo(F,
5898 TL.getTypePtr()->getArg(i).getKind(),
5899 Record, Idx));
5900}
5901void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
5902 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5903 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5904}
5905void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
5906 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5907 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5908}
5909void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
5910 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5911}
5912void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
5913 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5914 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5915 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5916}
5917void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc(
5918 DependentTemplateSpecializationTypeLoc TL) {
5919 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5920 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5921 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx));
5922 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx));
5923 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5924 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5925 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
5926 TL.setArgLocInfo(I,
5927 Reader.GetTemplateArgumentLocInfo(F,
5928 TL.getTypePtr()->getArg(I).getKind(),
5929 Record, Idx));
5930}
5931void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
5932 TL.setEllipsisLoc(ReadSourceLocation(Record, Idx));
5933}
5934void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
5935 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5936}
5937void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
5938 TL.setHasBaseTypeAsWritten(Record[Idx++]);
5939 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5940 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5941 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
5942 TL.setProtocolLoc(i, ReadSourceLocation(Record, Idx));
5943}
5944void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
5945 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5946}
5947void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
5948 TL.setKWLoc(ReadSourceLocation(Record, Idx));
5949 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5950 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5951}
5952
5953TypeSourceInfo *ASTReader::GetTypeSourceInfo(ModuleFile &F,
5954 const RecordData &Record,
5955 unsigned &Idx) {
5956 QualType InfoTy = readType(F, Record, Idx);
5957 if (InfoTy.isNull())
Craig Toppera13603a2014-05-22 05:54:18 +00005958 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00005959
5960 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy);
5961 TypeLocReader TLR(*this, F, Record, Idx);
5962 for (TypeLoc TL = TInfo->getTypeLoc(); !TL.isNull(); TL = TL.getNextTypeLoc())
5963 TLR.Visit(TL);
5964 return TInfo;
5965}
5966
5967QualType ASTReader::GetType(TypeID ID) {
5968 unsigned FastQuals = ID & Qualifiers::FastMask;
5969 unsigned Index = ID >> Qualifiers::FastWidth;
5970
5971 if (Index < NUM_PREDEF_TYPE_IDS) {
5972 QualType T;
5973 switch ((PredefinedTypeIDs)Index) {
5974 case PREDEF_TYPE_NULL_ID: return QualType();
5975 case PREDEF_TYPE_VOID_ID: T = Context.VoidTy; break;
5976 case PREDEF_TYPE_BOOL_ID: T = Context.BoolTy; break;
5977
5978 case PREDEF_TYPE_CHAR_U_ID:
5979 case PREDEF_TYPE_CHAR_S_ID:
5980 // FIXME: Check that the signedness of CharTy is correct!
5981 T = Context.CharTy;
5982 break;
5983
5984 case PREDEF_TYPE_UCHAR_ID: T = Context.UnsignedCharTy; break;
5985 case PREDEF_TYPE_USHORT_ID: T = Context.UnsignedShortTy; break;
5986 case PREDEF_TYPE_UINT_ID: T = Context.UnsignedIntTy; break;
5987 case PREDEF_TYPE_ULONG_ID: T = Context.UnsignedLongTy; break;
5988 case PREDEF_TYPE_ULONGLONG_ID: T = Context.UnsignedLongLongTy; break;
5989 case PREDEF_TYPE_UINT128_ID: T = Context.UnsignedInt128Ty; break;
5990 case PREDEF_TYPE_SCHAR_ID: T = Context.SignedCharTy; break;
5991 case PREDEF_TYPE_WCHAR_ID: T = Context.WCharTy; break;
5992 case PREDEF_TYPE_SHORT_ID: T = Context.ShortTy; break;
5993 case PREDEF_TYPE_INT_ID: T = Context.IntTy; break;
5994 case PREDEF_TYPE_LONG_ID: T = Context.LongTy; break;
5995 case PREDEF_TYPE_LONGLONG_ID: T = Context.LongLongTy; break;
5996 case PREDEF_TYPE_INT128_ID: T = Context.Int128Ty; break;
5997 case PREDEF_TYPE_HALF_ID: T = Context.HalfTy; break;
5998 case PREDEF_TYPE_FLOAT_ID: T = Context.FloatTy; break;
5999 case PREDEF_TYPE_DOUBLE_ID: T = Context.DoubleTy; break;
6000 case PREDEF_TYPE_LONGDOUBLE_ID: T = Context.LongDoubleTy; break;
6001 case PREDEF_TYPE_OVERLOAD_ID: T = Context.OverloadTy; break;
6002 case PREDEF_TYPE_BOUND_MEMBER: T = Context.BoundMemberTy; break;
6003 case PREDEF_TYPE_PSEUDO_OBJECT: T = Context.PseudoObjectTy; break;
6004 case PREDEF_TYPE_DEPENDENT_ID: T = Context.DependentTy; break;
6005 case PREDEF_TYPE_UNKNOWN_ANY: T = Context.UnknownAnyTy; break;
6006 case PREDEF_TYPE_NULLPTR_ID: T = Context.NullPtrTy; break;
6007 case PREDEF_TYPE_CHAR16_ID: T = Context.Char16Ty; break;
6008 case PREDEF_TYPE_CHAR32_ID: T = Context.Char32Ty; break;
6009 case PREDEF_TYPE_OBJC_ID: T = Context.ObjCBuiltinIdTy; break;
6010 case PREDEF_TYPE_OBJC_CLASS: T = Context.ObjCBuiltinClassTy; break;
6011 case PREDEF_TYPE_OBJC_SEL: T = Context.ObjCBuiltinSelTy; break;
Guy Benyeid8a08ea2012-12-18 14:38:23 +00006012 case PREDEF_TYPE_IMAGE1D_ID: T = Context.OCLImage1dTy; break;
6013 case PREDEF_TYPE_IMAGE1D_ARR_ID: T = Context.OCLImage1dArrayTy; break;
6014 case PREDEF_TYPE_IMAGE1D_BUFF_ID: T = Context.OCLImage1dBufferTy; break;
6015 case PREDEF_TYPE_IMAGE2D_ID: T = Context.OCLImage2dTy; break;
6016 case PREDEF_TYPE_IMAGE2D_ARR_ID: T = Context.OCLImage2dArrayTy; break;
6017 case PREDEF_TYPE_IMAGE3D_ID: T = Context.OCLImage3dTy; break;
Guy Benyei61054192013-02-07 10:55:47 +00006018 case PREDEF_TYPE_SAMPLER_ID: T = Context.OCLSamplerTy; break;
Guy Benyei1b4fb3e2013-01-20 12:31:11 +00006019 case PREDEF_TYPE_EVENT_ID: T = Context.OCLEventTy; break;
Guy Benyei11169dd2012-12-18 14:30:41 +00006020 case PREDEF_TYPE_AUTO_DEDUCT: T = Context.getAutoDeductType(); break;
6021
6022 case PREDEF_TYPE_AUTO_RREF_DEDUCT:
6023 T = Context.getAutoRRefDeductType();
6024 break;
6025
6026 case PREDEF_TYPE_ARC_UNBRIDGED_CAST:
6027 T = Context.ARCUnbridgedCastTy;
6028 break;
6029
6030 case PREDEF_TYPE_VA_LIST_TAG:
6031 T = Context.getVaListTagType();
6032 break;
6033
6034 case PREDEF_TYPE_BUILTIN_FN:
6035 T = Context.BuiltinFnTy;
6036 break;
6037 }
6038
6039 assert(!T.isNull() && "Unknown predefined type");
6040 return T.withFastQualifiers(FastQuals);
6041 }
6042
6043 Index -= NUM_PREDEF_TYPE_IDS;
6044 assert(Index < TypesLoaded.size() && "Type index out-of-range");
6045 if (TypesLoaded[Index].isNull()) {
6046 TypesLoaded[Index] = readTypeRecord(Index);
6047 if (TypesLoaded[Index].isNull())
6048 return QualType();
6049
6050 TypesLoaded[Index]->setFromAST();
6051 if (DeserializationListener)
6052 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID),
6053 TypesLoaded[Index]);
6054 }
6055
6056 return TypesLoaded[Index].withFastQualifiers(FastQuals);
6057}
6058
6059QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) {
6060 return GetType(getGlobalTypeID(F, LocalID));
6061}
6062
6063serialization::TypeID
6064ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const {
6065 unsigned FastQuals = LocalID & Qualifiers::FastMask;
6066 unsigned LocalIndex = LocalID >> Qualifiers::FastWidth;
6067
6068 if (LocalIndex < NUM_PREDEF_TYPE_IDS)
6069 return LocalID;
6070
6071 ContinuousRangeMap<uint32_t, int, 2>::iterator I
6072 = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS);
6073 assert(I != F.TypeRemap.end() && "Invalid index into type index remap");
6074
6075 unsigned GlobalIndex = LocalIndex + I->second;
6076 return (GlobalIndex << Qualifiers::FastWidth) | FastQuals;
6077}
6078
6079TemplateArgumentLocInfo
6080ASTReader::GetTemplateArgumentLocInfo(ModuleFile &F,
6081 TemplateArgument::ArgKind Kind,
6082 const RecordData &Record,
6083 unsigned &Index) {
6084 switch (Kind) {
6085 case TemplateArgument::Expression:
6086 return ReadExpr(F);
6087 case TemplateArgument::Type:
6088 return GetTypeSourceInfo(F, Record, Index);
6089 case TemplateArgument::Template: {
6090 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
6091 Index);
6092 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
6093 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
6094 SourceLocation());
6095 }
6096 case TemplateArgument::TemplateExpansion: {
6097 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
6098 Index);
6099 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
6100 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Index);
6101 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
6102 EllipsisLoc);
6103 }
6104 case TemplateArgument::Null:
6105 case TemplateArgument::Integral:
6106 case TemplateArgument::Declaration:
6107 case TemplateArgument::NullPtr:
6108 case TemplateArgument::Pack:
6109 // FIXME: Is this right?
6110 return TemplateArgumentLocInfo();
6111 }
6112 llvm_unreachable("unexpected template argument loc");
6113}
6114
6115TemplateArgumentLoc
6116ASTReader::ReadTemplateArgumentLoc(ModuleFile &F,
6117 const RecordData &Record, unsigned &Index) {
6118 TemplateArgument Arg = ReadTemplateArgument(F, Record, Index);
6119
6120 if (Arg.getKind() == TemplateArgument::Expression) {
6121 if (Record[Index++]) // bool InfoHasSameExpr.
6122 return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr()));
6123 }
6124 return TemplateArgumentLoc(Arg, GetTemplateArgumentLocInfo(F, Arg.getKind(),
6125 Record, Index));
6126}
6127
Enea Zaffanella6dbe1872013-08-10 07:24:53 +00006128const ASTTemplateArgumentListInfo*
6129ASTReader::ReadASTTemplateArgumentListInfo(ModuleFile &F,
6130 const RecordData &Record,
6131 unsigned &Index) {
6132 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Index);
6133 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Index);
6134 unsigned NumArgsAsWritten = Record[Index++];
6135 TemplateArgumentListInfo TemplArgsInfo(LAngleLoc, RAngleLoc);
6136 for (unsigned i = 0; i != NumArgsAsWritten; ++i)
6137 TemplArgsInfo.addArgument(ReadTemplateArgumentLoc(F, Record, Index));
6138 return ASTTemplateArgumentListInfo::Create(getContext(), TemplArgsInfo);
6139}
6140
Guy Benyei11169dd2012-12-18 14:30:41 +00006141Decl *ASTReader::GetExternalDecl(uint32_t ID) {
6142 return GetDecl(ID);
6143}
6144
Richard Smith50895422015-01-31 03:04:55 +00006145template<typename TemplateSpecializationDecl>
6146static void completeRedeclChainForTemplateSpecialization(Decl *D) {
6147 if (auto *TSD = dyn_cast<TemplateSpecializationDecl>(D))
6148 TSD->getSpecializedTemplate()->LoadLazySpecializations();
6149}
6150
Richard Smith053f6c62014-05-16 23:01:30 +00006151void ASTReader::CompleteRedeclChain(const Decl *D) {
Richard Smith851072e2014-05-19 20:59:20 +00006152 if (NumCurrentElementsDeserializing) {
6153 // We arrange to not care about the complete redeclaration chain while we're
6154 // deserializing. Just remember that the AST has marked this one as complete
6155 // but that it's not actually complete yet, so we know we still need to
6156 // complete it later.
6157 PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D));
6158 return;
6159 }
6160
Richard Smith053f6c62014-05-16 23:01:30 +00006161 const DeclContext *DC = D->getDeclContext()->getRedeclContext();
6162
Richard Smith053f6c62014-05-16 23:01:30 +00006163 // If this is a named declaration, complete it by looking it up
6164 // within its context.
6165 //
Richard Smith01bdb7a2014-08-28 05:44:07 +00006166 // FIXME: Merging a function definition should merge
Richard Smith053f6c62014-05-16 23:01:30 +00006167 // all mergeable entities within it.
6168 if (isa<TranslationUnitDecl>(DC) || isa<NamespaceDecl>(DC) ||
6169 isa<CXXRecordDecl>(DC) || isa<EnumDecl>(DC)) {
6170 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) {
6171 auto *II = Name.getAsIdentifierInfo();
6172 if (isa<TranslationUnitDecl>(DC) && II) {
6173 // Outside of C++, we don't have a lookup table for the TU, so update
6174 // the identifier instead. In C++, either way should work fine.
6175 if (II->isOutOfDate())
6176 updateOutOfDateIdentifier(*II);
6177 } else
6178 DC->lookup(Name);
Richard Smith01bdb7a2014-08-28 05:44:07 +00006179 } else if (needsAnonymousDeclarationNumber(cast<NamedDecl>(D))) {
6180 // FIXME: It'd be nice to do something a bit more targeted here.
6181 D->getDeclContext()->decls_begin();
Richard Smith053f6c62014-05-16 23:01:30 +00006182 }
6183 }
Richard Smith50895422015-01-31 03:04:55 +00006184
6185 if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D))
6186 CTSD->getSpecializedTemplate()->LoadLazySpecializations();
6187 if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D))
6188 VTSD->getSpecializedTemplate()->LoadLazySpecializations();
6189 if (auto *FD = dyn_cast<FunctionDecl>(D)) {
6190 if (auto *Template = FD->getPrimaryTemplate())
6191 Template->LoadLazySpecializations();
6192 }
Richard Smith053f6c62014-05-16 23:01:30 +00006193}
6194
Richard Smithc2bb8182015-03-24 06:36:48 +00006195uint64_t ASTReader::ReadCXXCtorInitializersRef(ModuleFile &M,
6196 const RecordData &Record,
6197 unsigned &Idx) {
6198 if (Idx >= Record.size() || Record[Idx] > M.LocalNumCXXCtorInitializers) {
6199 Error("malformed AST file: missing C++ ctor initializers");
6200 return 0;
6201 }
6202
6203 unsigned LocalID = Record[Idx++];
6204 return getGlobalBitOffset(M, M.CXXCtorInitializersOffsets[LocalID - 1]);
6205}
6206
6207CXXCtorInitializer **
6208ASTReader::GetExternalCXXCtorInitializers(uint64_t Offset) {
6209 RecordLocation Loc = getLocalBitOffset(Offset);
6210 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
6211 SavedStreamPosition SavedPosition(Cursor);
6212 Cursor.JumpToBit(Loc.Offset);
6213 ReadingKindTracker ReadingKind(Read_Decl, *this);
6214
6215 RecordData Record;
6216 unsigned Code = Cursor.ReadCode();
6217 unsigned RecCode = Cursor.readRecord(Code, Record);
6218 if (RecCode != DECL_CXX_CTOR_INITIALIZERS) {
6219 Error("malformed AST file: missing C++ ctor initializers");
6220 return nullptr;
6221 }
6222
6223 unsigned Idx = 0;
6224 return ReadCXXCtorInitializers(*Loc.F, Record, Idx);
6225}
6226
Richard Smithcd45dbc2014-04-19 03:48:30 +00006227uint64_t ASTReader::readCXXBaseSpecifiers(ModuleFile &M,
6228 const RecordData &Record,
6229 unsigned &Idx) {
6230 if (Idx >= Record.size() || Record[Idx] > M.LocalNumCXXBaseSpecifiers) {
6231 Error("malformed AST file: missing C++ base specifier");
Guy Benyei11169dd2012-12-18 14:30:41 +00006232 return 0;
Richard Smithcd45dbc2014-04-19 03:48:30 +00006233 }
6234
Guy Benyei11169dd2012-12-18 14:30:41 +00006235 unsigned LocalID = Record[Idx++];
6236 return getGlobalBitOffset(M, M.CXXBaseSpecifiersOffsets[LocalID - 1]);
6237}
6238
6239CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) {
6240 RecordLocation Loc = getLocalBitOffset(Offset);
Chris Lattner7fb3bef2013-01-20 00:56:42 +00006241 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00006242 SavedStreamPosition SavedPosition(Cursor);
6243 Cursor.JumpToBit(Loc.Offset);
6244 ReadingKindTracker ReadingKind(Read_Decl, *this);
6245 RecordData Record;
6246 unsigned Code = Cursor.ReadCode();
Chris Lattner0e6c9402013-01-20 02:38:54 +00006247 unsigned RecCode = Cursor.readRecord(Code, Record);
Guy Benyei11169dd2012-12-18 14:30:41 +00006248 if (RecCode != DECL_CXX_BASE_SPECIFIERS) {
Richard Smithcd45dbc2014-04-19 03:48:30 +00006249 Error("malformed AST file: missing C++ base specifiers");
Craig Toppera13603a2014-05-22 05:54:18 +00006250 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00006251 }
6252
6253 unsigned Idx = 0;
6254 unsigned NumBases = Record[Idx++];
6255 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases);
6256 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases];
6257 for (unsigned I = 0; I != NumBases; ++I)
6258 Bases[I] = ReadCXXBaseSpecifier(*Loc.F, Record, Idx);
6259 return Bases;
6260}
6261
6262serialization::DeclID
6263ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const {
6264 if (LocalID < NUM_PREDEF_DECL_IDS)
6265 return LocalID;
6266
6267 ContinuousRangeMap<uint32_t, int, 2>::iterator I
6268 = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS);
6269 assert(I != F.DeclRemap.end() && "Invalid index into decl index remap");
6270
6271 return LocalID + I->second;
6272}
6273
6274bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID,
6275 ModuleFile &M) const {
Richard Smithfe620d22015-03-05 23:24:12 +00006276 // Predefined decls aren't from any module.
6277 if (ID < NUM_PREDEF_DECL_IDS)
6278 return false;
6279
Guy Benyei11169dd2012-12-18 14:30:41 +00006280 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(ID);
6281 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6282 return &M == I->second;
6283}
6284
Douglas Gregor9f782892013-01-21 15:25:38 +00006285ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) {
Guy Benyei11169dd2012-12-18 14:30:41 +00006286 if (!D->isFromASTFile())
Craig Toppera13603a2014-05-22 05:54:18 +00006287 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00006288 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID());
6289 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6290 return I->second;
6291}
6292
6293SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) {
6294 if (ID < NUM_PREDEF_DECL_IDS)
6295 return SourceLocation();
Richard Smithcd45dbc2014-04-19 03:48:30 +00006296
Guy Benyei11169dd2012-12-18 14:30:41 +00006297 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6298
6299 if (Index > DeclsLoaded.size()) {
6300 Error("declaration ID out-of-range for AST file");
6301 return SourceLocation();
6302 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00006303
Guy Benyei11169dd2012-12-18 14:30:41 +00006304 if (Decl *D = DeclsLoaded[Index])
6305 return D->getLocation();
6306
6307 unsigned RawLocation = 0;
6308 RecordLocation Rec = DeclCursorForID(ID, RawLocation);
6309 return ReadSourceLocation(*Rec.F, RawLocation);
6310}
6311
Richard Smithfe620d22015-03-05 23:24:12 +00006312static Decl *getPredefinedDecl(ASTContext &Context, PredefinedDeclIDs ID) {
6313 switch (ID) {
6314 case PREDEF_DECL_NULL_ID:
6315 return nullptr;
6316
6317 case PREDEF_DECL_TRANSLATION_UNIT_ID:
6318 return Context.getTranslationUnitDecl();
6319
6320 case PREDEF_DECL_OBJC_ID_ID:
6321 return Context.getObjCIdDecl();
6322
6323 case PREDEF_DECL_OBJC_SEL_ID:
6324 return Context.getObjCSelDecl();
6325
6326 case PREDEF_DECL_OBJC_CLASS_ID:
6327 return Context.getObjCClassDecl();
6328
6329 case PREDEF_DECL_OBJC_PROTOCOL_ID:
6330 return Context.getObjCProtocolDecl();
6331
6332 case PREDEF_DECL_INT_128_ID:
6333 return Context.getInt128Decl();
6334
6335 case PREDEF_DECL_UNSIGNED_INT_128_ID:
6336 return Context.getUInt128Decl();
6337
6338 case PREDEF_DECL_OBJC_INSTANCETYPE_ID:
6339 return Context.getObjCInstanceTypeDecl();
6340
6341 case PREDEF_DECL_BUILTIN_VA_LIST_ID:
6342 return Context.getBuiltinVaListDecl();
Richard Smithf19e1272015-03-07 00:04:49 +00006343
6344 case PREDEF_DECL_EXTERN_C_CONTEXT_ID:
6345 return Context.getExternCContextDecl();
Richard Smithfe620d22015-03-05 23:24:12 +00006346 }
Yaron Keren322bdad2015-03-06 07:49:14 +00006347 llvm_unreachable("PredefinedDeclIDs unknown enum value");
Richard Smithfe620d22015-03-05 23:24:12 +00006348}
6349
Richard Smithcd45dbc2014-04-19 03:48:30 +00006350Decl *ASTReader::GetExistingDecl(DeclID ID) {
6351 if (ID < NUM_PREDEF_DECL_IDS) {
Richard Smithfe620d22015-03-05 23:24:12 +00006352 Decl *D = getPredefinedDecl(Context, (PredefinedDeclIDs)ID);
6353 if (D) {
6354 // Track that we have merged the declaration with ID \p ID into the
6355 // pre-existing predefined declaration \p D.
6356 auto &Merged = MergedDecls[D->getCanonicalDecl()];
6357 if (Merged.empty())
6358 Merged.push_back(ID);
Guy Benyei11169dd2012-12-18 14:30:41 +00006359 }
Richard Smithfe620d22015-03-05 23:24:12 +00006360 return D;
Guy Benyei11169dd2012-12-18 14:30:41 +00006361 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00006362
Guy Benyei11169dd2012-12-18 14:30:41 +00006363 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6364
6365 if (Index >= DeclsLoaded.size()) {
6366 assert(0 && "declaration ID out-of-range for AST file");
6367 Error("declaration ID out-of-range for AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00006368 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00006369 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00006370
6371 return DeclsLoaded[Index];
6372}
6373
6374Decl *ASTReader::GetDecl(DeclID ID) {
6375 if (ID < NUM_PREDEF_DECL_IDS)
6376 return GetExistingDecl(ID);
6377
6378 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6379
6380 if (Index >= DeclsLoaded.size()) {
6381 assert(0 && "declaration ID out-of-range for AST file");
6382 Error("declaration ID out-of-range for AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00006383 return nullptr;
Richard Smithcd45dbc2014-04-19 03:48:30 +00006384 }
6385
Guy Benyei11169dd2012-12-18 14:30:41 +00006386 if (!DeclsLoaded[Index]) {
6387 ReadDeclRecord(ID);
6388 if (DeserializationListener)
6389 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
6390 }
6391
6392 return DeclsLoaded[Index];
6393}
6394
6395DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M,
6396 DeclID GlobalID) {
6397 if (GlobalID < NUM_PREDEF_DECL_IDS)
6398 return GlobalID;
6399
6400 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID);
6401 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6402 ModuleFile *Owner = I->second;
6403
6404 llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos
6405 = M.GlobalToLocalDeclIDs.find(Owner);
6406 if (Pos == M.GlobalToLocalDeclIDs.end())
6407 return 0;
6408
6409 return GlobalID - Owner->BaseDeclID + Pos->second;
6410}
6411
6412serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F,
6413 const RecordData &Record,
6414 unsigned &Idx) {
6415 if (Idx >= Record.size()) {
6416 Error("Corrupted AST file");
6417 return 0;
6418 }
6419
6420 return getGlobalDeclID(F, Record[Idx++]);
6421}
6422
6423/// \brief Resolve the offset of a statement into a statement.
6424///
6425/// This operation will read a new statement from the external
6426/// source each time it is called, and is meant to be used via a
6427/// LazyOffsetPtr (which is used by Decls for the body of functions, etc).
6428Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) {
6429 // Switch case IDs are per Decl.
6430 ClearSwitchCaseIDs();
6431
6432 // Offset here is a global offset across the entire chain.
6433 RecordLocation Loc = getLocalBitOffset(Offset);
6434 Loc.F->DeclsCursor.JumpToBit(Loc.Offset);
6435 return ReadStmtFromStream(*Loc.F);
6436}
6437
6438namespace {
6439 class FindExternalLexicalDeclsVisitor {
6440 ASTReader &Reader;
6441 const DeclContext *DC;
6442 bool (*isKindWeWant)(Decl::Kind);
6443
6444 SmallVectorImpl<Decl*> &Decls;
6445 bool PredefsVisited[NUM_PREDEF_DECL_IDS];
6446
6447 public:
6448 FindExternalLexicalDeclsVisitor(ASTReader &Reader, const DeclContext *DC,
6449 bool (*isKindWeWant)(Decl::Kind),
6450 SmallVectorImpl<Decl*> &Decls)
6451 : Reader(Reader), DC(DC), isKindWeWant(isKindWeWant), Decls(Decls)
6452 {
6453 for (unsigned I = 0; I != NUM_PREDEF_DECL_IDS; ++I)
6454 PredefsVisited[I] = false;
6455 }
6456
6457 static bool visit(ModuleFile &M, bool Preorder, void *UserData) {
6458 if (Preorder)
6459 return false;
6460
6461 FindExternalLexicalDeclsVisitor *This
6462 = static_cast<FindExternalLexicalDeclsVisitor *>(UserData);
6463
6464 ModuleFile::DeclContextInfosMap::iterator Info
6465 = M.DeclContextInfos.find(This->DC);
6466 if (Info == M.DeclContextInfos.end() || !Info->second.LexicalDecls)
6467 return false;
6468
6469 // Load all of the declaration IDs
6470 for (const KindDeclIDPair *ID = Info->second.LexicalDecls,
6471 *IDE = ID + Info->second.NumLexicalDecls;
6472 ID != IDE; ++ID) {
6473 if (This->isKindWeWant && !This->isKindWeWant((Decl::Kind)ID->first))
6474 continue;
6475
6476 // Don't add predefined declarations to the lexical context more
6477 // than once.
6478 if (ID->second < NUM_PREDEF_DECL_IDS) {
6479 if (This->PredefsVisited[ID->second])
6480 continue;
6481
6482 This->PredefsVisited[ID->second] = true;
6483 }
6484
6485 if (Decl *D = This->Reader.GetLocalDecl(M, ID->second)) {
6486 if (!This->DC->isDeclInLexicalTraversal(D))
6487 This->Decls.push_back(D);
6488 }
6489 }
6490
6491 return false;
6492 }
6493 };
6494}
6495
6496ExternalLoadResult ASTReader::FindExternalLexicalDecls(const DeclContext *DC,
6497 bool (*isKindWeWant)(Decl::Kind),
6498 SmallVectorImpl<Decl*> &Decls) {
6499 // There might be lexical decls in multiple modules, for the TU at
6500 // least. Walk all of the modules in the order they were loaded.
6501 FindExternalLexicalDeclsVisitor Visitor(*this, DC, isKindWeWant, Decls);
6502 ModuleMgr.visitDepthFirst(&FindExternalLexicalDeclsVisitor::visit, &Visitor);
6503 ++NumLexicalDeclContextsRead;
6504 return ELR_Success;
6505}
6506
6507namespace {
6508
6509class DeclIDComp {
6510 ASTReader &Reader;
6511 ModuleFile &Mod;
6512
6513public:
6514 DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {}
6515
6516 bool operator()(LocalDeclID L, LocalDeclID R) const {
6517 SourceLocation LHS = getLocation(L);
6518 SourceLocation RHS = getLocation(R);
6519 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6520 }
6521
6522 bool operator()(SourceLocation LHS, LocalDeclID R) const {
6523 SourceLocation RHS = getLocation(R);
6524 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6525 }
6526
6527 bool operator()(LocalDeclID L, SourceLocation RHS) const {
6528 SourceLocation LHS = getLocation(L);
6529 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6530 }
6531
6532 SourceLocation getLocation(LocalDeclID ID) const {
6533 return Reader.getSourceManager().getFileLoc(
6534 Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID)));
6535 }
6536};
6537
6538}
6539
6540void ASTReader::FindFileRegionDecls(FileID File,
6541 unsigned Offset, unsigned Length,
6542 SmallVectorImpl<Decl *> &Decls) {
6543 SourceManager &SM = getSourceManager();
6544
6545 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File);
6546 if (I == FileDeclIDs.end())
6547 return;
6548
6549 FileDeclsInfo &DInfo = I->second;
6550 if (DInfo.Decls.empty())
6551 return;
6552
6553 SourceLocation
6554 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset);
6555 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length);
6556
6557 DeclIDComp DIDComp(*this, *DInfo.Mod);
6558 ArrayRef<serialization::LocalDeclID>::iterator
6559 BeginIt = std::lower_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
6560 BeginLoc, DIDComp);
6561 if (BeginIt != DInfo.Decls.begin())
6562 --BeginIt;
6563
6564 // If we are pointing at a top-level decl inside an objc container, we need
6565 // to backtrack until we find it otherwise we will fail to report that the
6566 // region overlaps with an objc container.
6567 while (BeginIt != DInfo.Decls.begin() &&
6568 GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt))
6569 ->isTopLevelDeclInObjCContainer())
6570 --BeginIt;
6571
6572 ArrayRef<serialization::LocalDeclID>::iterator
6573 EndIt = std::upper_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
6574 EndLoc, DIDComp);
6575 if (EndIt != DInfo.Decls.end())
6576 ++EndIt;
6577
6578 for (ArrayRef<serialization::LocalDeclID>::iterator
6579 DIt = BeginIt; DIt != EndIt; ++DIt)
6580 Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt)));
6581}
6582
6583namespace {
6584 /// \brief ModuleFile visitor used to perform name lookup into a
6585 /// declaration context.
6586 class DeclContextNameLookupVisitor {
6587 ASTReader &Reader;
Richard Smith8c913ec2014-08-14 02:21:01 +00006588 ArrayRef<const DeclContext *> Contexts;
Guy Benyei11169dd2012-12-18 14:30:41 +00006589 DeclarationName Name;
6590 SmallVectorImpl<NamedDecl *> &Decls;
Richard Smith52874ec2015-02-13 20:17:14 +00006591 llvm::SmallPtrSetImpl<NamedDecl *> &DeclSet;
Guy Benyei11169dd2012-12-18 14:30:41 +00006592
6593 public:
Richard Smith8c913ec2014-08-14 02:21:01 +00006594 DeclContextNameLookupVisitor(ASTReader &Reader,
6595 ArrayRef<const DeclContext *> Contexts,
Guy Benyei11169dd2012-12-18 14:30:41 +00006596 DeclarationName Name,
Richard Smith52874ec2015-02-13 20:17:14 +00006597 SmallVectorImpl<NamedDecl *> &Decls,
6598 llvm::SmallPtrSetImpl<NamedDecl *> &DeclSet)
6599 : Reader(Reader), Contexts(Contexts), Name(Name), Decls(Decls),
6600 DeclSet(DeclSet) { }
Guy Benyei11169dd2012-12-18 14:30:41 +00006601
6602 static bool visit(ModuleFile &M, void *UserData) {
6603 DeclContextNameLookupVisitor *This
6604 = static_cast<DeclContextNameLookupVisitor *>(UserData);
6605
6606 // Check whether we have any visible declaration information for
6607 // this context in this module.
6608 ModuleFile::DeclContextInfosMap::iterator Info;
6609 bool FoundInfo = false;
Richard Smith8c913ec2014-08-14 02:21:01 +00006610 for (auto *DC : This->Contexts) {
6611 Info = M.DeclContextInfos.find(DC);
6612 if (Info != M.DeclContextInfos.end() &&
Guy Benyei11169dd2012-12-18 14:30:41 +00006613 Info->second.NameLookupTableData) {
6614 FoundInfo = true;
6615 break;
6616 }
6617 }
6618
6619 if (!FoundInfo)
6620 return false;
Richard Smith8c913ec2014-08-14 02:21:01 +00006621
Guy Benyei11169dd2012-12-18 14:30:41 +00006622 // Look for this name within this module.
Richard Smith52e3fba2014-03-11 07:17:35 +00006623 ASTDeclContextNameLookupTable *LookupTable =
Guy Benyei11169dd2012-12-18 14:30:41 +00006624 Info->second.NameLookupTableData;
6625 ASTDeclContextNameLookupTable::iterator Pos
6626 = LookupTable->find(This->Name);
6627 if (Pos == LookupTable->end())
6628 return false;
6629
6630 bool FoundAnything = false;
6631 ASTDeclContextNameLookupTrait::data_type Data = *Pos;
6632 for (; Data.first != Data.second; ++Data.first) {
6633 NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M, *Data.first);
6634 if (!ND)
6635 continue;
6636
6637 if (ND->getDeclName() != This->Name) {
6638 // A name might be null because the decl's redeclarable part is
6639 // currently read before reading its name. The lookup is triggered by
6640 // building that decl (likely indirectly), and so it is later in the
6641 // sense of "already existing" and can be ignored here.
Richard Smith8c913ec2014-08-14 02:21:01 +00006642 // FIXME: This should not happen; deserializing declarations should
6643 // not perform lookups since that can lead to deserialization cycles.
Guy Benyei11169dd2012-12-18 14:30:41 +00006644 continue;
6645 }
Richard Smith8c913ec2014-08-14 02:21:01 +00006646
Guy Benyei11169dd2012-12-18 14:30:41 +00006647 // Record this declaration.
6648 FoundAnything = true;
Richard Smith52874ec2015-02-13 20:17:14 +00006649 if (This->DeclSet.insert(ND).second)
6650 This->Decls.push_back(ND);
Guy Benyei11169dd2012-12-18 14:30:41 +00006651 }
6652
6653 return FoundAnything;
6654 }
6655 };
6656}
6657
Douglas Gregor9f782892013-01-21 15:25:38 +00006658/// \brief Retrieve the "definitive" module file for the definition of the
6659/// given declaration context, if there is one.
6660///
6661/// The "definitive" module file is the only place where we need to look to
6662/// find information about the declarations within the given declaration
6663/// context. For example, C++ and Objective-C classes, C structs/unions, and
6664/// Objective-C protocols, categories, and extensions are all defined in a
6665/// single place in the source code, so they have definitive module files
6666/// associated with them. C++ namespaces, on the other hand, can have
6667/// definitions in multiple different module files.
6668///
6669/// Note: this needs to be kept in sync with ASTWriter::AddedVisibleDecl's
6670/// NDEBUG checking.
6671static ModuleFile *getDefinitiveModuleFileFor(const DeclContext *DC,
6672 ASTReader &Reader) {
Douglas Gregor7a6e2002013-01-22 17:08:30 +00006673 if (const DeclContext *DefDC = getDefinitiveDeclContext(DC))
6674 return Reader.getOwningModuleFile(cast<Decl>(DefDC));
Douglas Gregor9f782892013-01-21 15:25:38 +00006675
Craig Toppera13603a2014-05-22 05:54:18 +00006676 return nullptr;
Douglas Gregor9f782892013-01-21 15:25:38 +00006677}
6678
Richard Smith9ce12e32013-02-07 03:30:24 +00006679bool
Guy Benyei11169dd2012-12-18 14:30:41 +00006680ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC,
6681 DeclarationName Name) {
6682 assert(DC->hasExternalVisibleStorage() &&
6683 "DeclContext has no visible decls in storage");
6684 if (!Name)
Richard Smith9ce12e32013-02-07 03:30:24 +00006685 return false;
Guy Benyei11169dd2012-12-18 14:30:41 +00006686
Richard Smith8c913ec2014-08-14 02:21:01 +00006687 Deserializing LookupResults(this);
6688
Guy Benyei11169dd2012-12-18 14:30:41 +00006689 SmallVector<NamedDecl *, 64> Decls;
Richard Smith52874ec2015-02-13 20:17:14 +00006690 llvm::SmallPtrSet<NamedDecl*, 64> DeclSet;
Richard Smith8c913ec2014-08-14 02:21:01 +00006691
Guy Benyei11169dd2012-12-18 14:30:41 +00006692 // Compute the declaration contexts we need to look into. Multiple such
6693 // declaration contexts occur when two declaration contexts from disjoint
6694 // modules get merged, e.g., when two namespaces with the same name are
6695 // independently defined in separate modules.
6696 SmallVector<const DeclContext *, 2> Contexts;
6697 Contexts.push_back(DC);
Richard Smith8c913ec2014-08-14 02:21:01 +00006698
Guy Benyei11169dd2012-12-18 14:30:41 +00006699 if (DC->isNamespace()) {
Richard Smithcd45dbc2014-04-19 03:48:30 +00006700 auto Merged = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC)));
Guy Benyei11169dd2012-12-18 14:30:41 +00006701 if (Merged != MergedDecls.end()) {
6702 for (unsigned I = 0, N = Merged->second.size(); I != N; ++I)
6703 Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I])));
6704 }
6705 }
Richard Smith8c913ec2014-08-14 02:21:01 +00006706
6707 auto LookUpInContexts = [&](ArrayRef<const DeclContext*> Contexts) {
Richard Smith52874ec2015-02-13 20:17:14 +00006708 DeclContextNameLookupVisitor Visitor(*this, Contexts, Name, Decls, DeclSet);
Richard Smith8c913ec2014-08-14 02:21:01 +00006709
6710 // If we can definitively determine which module file to look into,
6711 // only look there. Otherwise, look in all module files.
6712 ModuleFile *Definitive;
6713 if (Contexts.size() == 1 &&
6714 (Definitive = getDefinitiveModuleFileFor(Contexts[0], *this))) {
6715 DeclContextNameLookupVisitor::visit(*Definitive, &Visitor);
6716 } else {
6717 ModuleMgr.visit(&DeclContextNameLookupVisitor::visit, &Visitor);
6718 }
6719 };
6720
6721 LookUpInContexts(Contexts);
6722
6723 // If this might be an implicit special member function, then also search
6724 // all merged definitions of the surrounding class. We need to search them
6725 // individually, because finding an entity in one of them doesn't imply that
6726 // we can't find a different entity in another one.
Richard Smithcd45dbc2014-04-19 03:48:30 +00006727 if (isa<CXXRecordDecl>(DC)) {
Richard Smith02793752015-03-27 21:16:39 +00006728 auto Merged = MergedLookups.find(DC);
6729 if (Merged != MergedLookups.end()) {
6730 for (unsigned I = 0; I != Merged->second.size(); ++I) {
6731 const DeclContext *Context = Merged->second[I];
6732 LookUpInContexts(Context);
6733 // We might have just added some more merged lookups. If so, our
6734 // iterator is now invalid, so grab a fresh one before continuing.
6735 Merged = MergedLookups.find(DC);
Richard Smithe0612472014-11-21 05:16:13 +00006736 }
Richard Smith8c913ec2014-08-14 02:21:01 +00006737 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00006738 }
6739
Guy Benyei11169dd2012-12-18 14:30:41 +00006740 ++NumVisibleDeclContextsRead;
6741 SetExternalVisibleDeclsForName(DC, Name, Decls);
Richard Smith9ce12e32013-02-07 03:30:24 +00006742 return !Decls.empty();
Guy Benyei11169dd2012-12-18 14:30:41 +00006743}
6744
6745namespace {
6746 /// \brief ModuleFile visitor used to retrieve all visible names in a
6747 /// declaration context.
6748 class DeclContextAllNamesVisitor {
6749 ASTReader &Reader;
Dmitri Gribenkof8579502013-01-12 19:30:44 +00006750 SmallVectorImpl<const DeclContext *> &Contexts;
Craig Topper3598eb72013-07-05 04:43:31 +00006751 DeclsMap &Decls;
Richard Smith52874ec2015-02-13 20:17:14 +00006752 llvm::SmallPtrSet<NamedDecl *, 256> DeclSet;
Argyrios Kyrtzidis2810e9d2012-12-19 22:21:18 +00006753 bool VisitAll;
Guy Benyei11169dd2012-12-18 14:30:41 +00006754
6755 public:
6756 DeclContextAllNamesVisitor(ASTReader &Reader,
6757 SmallVectorImpl<const DeclContext *> &Contexts,
Craig Topper3598eb72013-07-05 04:43:31 +00006758 DeclsMap &Decls, bool VisitAll)
Argyrios Kyrtzidis2810e9d2012-12-19 22:21:18 +00006759 : Reader(Reader), Contexts(Contexts), Decls(Decls), VisitAll(VisitAll) { }
Guy Benyei11169dd2012-12-18 14:30:41 +00006760
6761 static bool visit(ModuleFile &M, void *UserData) {
6762 DeclContextAllNamesVisitor *This
6763 = static_cast<DeclContextAllNamesVisitor *>(UserData);
6764
6765 // Check whether we have any visible declaration information for
6766 // this context in this module.
6767 ModuleFile::DeclContextInfosMap::iterator Info;
6768 bool FoundInfo = false;
6769 for (unsigned I = 0, N = This->Contexts.size(); I != N; ++I) {
6770 Info = M.DeclContextInfos.find(This->Contexts[I]);
6771 if (Info != M.DeclContextInfos.end() &&
6772 Info->second.NameLookupTableData) {
6773 FoundInfo = true;
6774 break;
6775 }
6776 }
6777
6778 if (!FoundInfo)
6779 return false;
6780
Richard Smith52e3fba2014-03-11 07:17:35 +00006781 ASTDeclContextNameLookupTable *LookupTable =
Guy Benyei11169dd2012-12-18 14:30:41 +00006782 Info->second.NameLookupTableData;
6783 bool FoundAnything = false;
6784 for (ASTDeclContextNameLookupTable::data_iterator
Douglas Gregor5e306b12013-01-23 22:38:11 +00006785 I = LookupTable->data_begin(), E = LookupTable->data_end();
6786 I != E;
6787 ++I) {
Guy Benyei11169dd2012-12-18 14:30:41 +00006788 ASTDeclContextNameLookupTrait::data_type Data = *I;
6789 for (; Data.first != Data.second; ++Data.first) {
6790 NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M,
6791 *Data.first);
6792 if (!ND)
6793 continue;
6794
6795 // Record this declaration.
6796 FoundAnything = true;
Richard Smith52874ec2015-02-13 20:17:14 +00006797 if (This->DeclSet.insert(ND).second)
6798 This->Decls[ND->getDeclName()].push_back(ND);
Guy Benyei11169dd2012-12-18 14:30:41 +00006799 }
6800 }
6801
Argyrios Kyrtzidis2810e9d2012-12-19 22:21:18 +00006802 return FoundAnything && !This->VisitAll;
Guy Benyei11169dd2012-12-18 14:30:41 +00006803 }
6804 };
6805}
6806
6807void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) {
6808 if (!DC->hasExternalVisibleStorage())
6809 return;
Craig Topper79be4cd2013-07-05 04:33:53 +00006810 DeclsMap Decls;
Guy Benyei11169dd2012-12-18 14:30:41 +00006811
6812 // Compute the declaration contexts we need to look into. Multiple such
6813 // declaration contexts occur when two declaration contexts from disjoint
6814 // modules get merged, e.g., when two namespaces with the same name are
6815 // independently defined in separate modules.
6816 SmallVector<const DeclContext *, 2> Contexts;
6817 Contexts.push_back(DC);
6818
6819 if (DC->isNamespace()) {
6820 MergedDeclsMap::iterator Merged
6821 = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC)));
6822 if (Merged != MergedDecls.end()) {
6823 for (unsigned I = 0, N = Merged->second.size(); I != N; ++I)
6824 Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I])));
6825 }
6826 }
6827
Argyrios Kyrtzidis2810e9d2012-12-19 22:21:18 +00006828 DeclContextAllNamesVisitor Visitor(*this, Contexts, Decls,
6829 /*VisitAll=*/DC->isFileContext());
Guy Benyei11169dd2012-12-18 14:30:41 +00006830 ModuleMgr.visit(&DeclContextAllNamesVisitor::visit, &Visitor);
6831 ++NumVisibleDeclContextsRead;
6832
Craig Topper79be4cd2013-07-05 04:33:53 +00006833 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) {
Guy Benyei11169dd2012-12-18 14:30:41 +00006834 SetExternalVisibleDeclsForName(DC, I->first, I->second);
6835 }
6836 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false);
6837}
6838
6839/// \brief Under non-PCH compilation the consumer receives the objc methods
6840/// before receiving the implementation, and codegen depends on this.
6841/// We simulate this by deserializing and passing to consumer the methods of the
6842/// implementation before passing the deserialized implementation decl.
6843static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD,
6844 ASTConsumer *Consumer) {
6845 assert(ImplD && Consumer);
6846
Aaron Ballmanaff18c02014-03-13 19:03:34 +00006847 for (auto *I : ImplD->methods())
6848 Consumer->HandleInterestingDecl(DeclGroupRef(I));
Guy Benyei11169dd2012-12-18 14:30:41 +00006849
6850 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD));
6851}
6852
6853void ASTReader::PassInterestingDeclsToConsumer() {
6854 assert(Consumer);
Richard Smith04d05b52014-03-23 00:27:18 +00006855
6856 if (PassingDeclsToConsumer)
6857 return;
6858
6859 // Guard variable to avoid recursively redoing the process of passing
6860 // decls to consumer.
6861 SaveAndRestore<bool> GuardPassingDeclsToConsumer(PassingDeclsToConsumer,
6862 true);
6863
Richard Smith9e2341d2015-03-23 03:25:59 +00006864 // Ensure that we've loaded all potentially-interesting declarations
6865 // that need to be eagerly loaded.
6866 for (auto ID : EagerlyDeserializedDecls)
6867 GetDecl(ID);
6868 EagerlyDeserializedDecls.clear();
6869
Guy Benyei11169dd2012-12-18 14:30:41 +00006870 while (!InterestingDecls.empty()) {
6871 Decl *D = InterestingDecls.front();
6872 InterestingDecls.pop_front();
6873
6874 PassInterestingDeclToConsumer(D);
6875 }
6876}
6877
6878void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
6879 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
6880 PassObjCImplDeclToConsumer(ImplD, Consumer);
6881 else
6882 Consumer->HandleInterestingDecl(DeclGroupRef(D));
6883}
6884
6885void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) {
6886 this->Consumer = Consumer;
6887
Richard Smith9e2341d2015-03-23 03:25:59 +00006888 if (Consumer)
6889 PassInterestingDeclsToConsumer();
Richard Smith7f330cd2015-03-18 01:42:29 +00006890
6891 if (DeserializationListener)
6892 DeserializationListener->ReaderInitialized(this);
Guy Benyei11169dd2012-12-18 14:30:41 +00006893}
6894
6895void ASTReader::PrintStats() {
6896 std::fprintf(stderr, "*** AST File Statistics:\n");
6897
6898 unsigned NumTypesLoaded
6899 = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(),
6900 QualType());
6901 unsigned NumDeclsLoaded
6902 = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(),
Craig Toppera13603a2014-05-22 05:54:18 +00006903 (Decl *)nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00006904 unsigned NumIdentifiersLoaded
6905 = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(),
6906 IdentifiersLoaded.end(),
Craig Toppera13603a2014-05-22 05:54:18 +00006907 (IdentifierInfo *)nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00006908 unsigned NumMacrosLoaded
6909 = MacrosLoaded.size() - std::count(MacrosLoaded.begin(),
6910 MacrosLoaded.end(),
Craig Toppera13603a2014-05-22 05:54:18 +00006911 (MacroInfo *)nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00006912 unsigned NumSelectorsLoaded
6913 = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(),
6914 SelectorsLoaded.end(),
6915 Selector());
6916
6917 if (unsigned TotalNumSLocEntries = getTotalNumSLocs())
6918 std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n",
6919 NumSLocEntriesRead, TotalNumSLocEntries,
6920 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
6921 if (!TypesLoaded.empty())
6922 std::fprintf(stderr, " %u/%u types read (%f%%)\n",
6923 NumTypesLoaded, (unsigned)TypesLoaded.size(),
6924 ((float)NumTypesLoaded/TypesLoaded.size() * 100));
6925 if (!DeclsLoaded.empty())
6926 std::fprintf(stderr, " %u/%u declarations read (%f%%)\n",
6927 NumDeclsLoaded, (unsigned)DeclsLoaded.size(),
6928 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100));
6929 if (!IdentifiersLoaded.empty())
6930 std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n",
6931 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(),
6932 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
6933 if (!MacrosLoaded.empty())
6934 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
6935 NumMacrosLoaded, (unsigned)MacrosLoaded.size(),
6936 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100));
6937 if (!SelectorsLoaded.empty())
6938 std::fprintf(stderr, " %u/%u selectors read (%f%%)\n",
6939 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(),
6940 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
6941 if (TotalNumStatements)
6942 std::fprintf(stderr, " %u/%u statements read (%f%%)\n",
6943 NumStatementsRead, TotalNumStatements,
6944 ((float)NumStatementsRead/TotalNumStatements * 100));
6945 if (TotalNumMacros)
6946 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
6947 NumMacrosRead, TotalNumMacros,
6948 ((float)NumMacrosRead/TotalNumMacros * 100));
6949 if (TotalLexicalDeclContexts)
6950 std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n",
6951 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
6952 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
6953 * 100));
6954 if (TotalVisibleDeclContexts)
6955 std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n",
6956 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
6957 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
6958 * 100));
6959 if (TotalNumMethodPoolEntries) {
6960 std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n",
6961 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
6962 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
6963 * 100));
Guy Benyei11169dd2012-12-18 14:30:41 +00006964 }
Douglas Gregorad2f7a52013-01-28 17:54:36 +00006965 if (NumMethodPoolLookups) {
6966 std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n",
6967 NumMethodPoolHits, NumMethodPoolLookups,
6968 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
6969 }
6970 if (NumMethodPoolTableLookups) {
6971 std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n",
6972 NumMethodPoolTableHits, NumMethodPoolTableLookups,
6973 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups
6974 * 100.0));
6975 }
6976
Douglas Gregor00a50f72013-01-25 00:38:33 +00006977 if (NumIdentifierLookupHits) {
6978 std::fprintf(stderr,
6979 " %u / %u identifier table lookups succeeded (%f%%)\n",
6980 NumIdentifierLookupHits, NumIdentifierLookups,
6981 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
6982 }
6983
Douglas Gregore060e572013-01-25 01:03:03 +00006984 if (GlobalIndex) {
6985 std::fprintf(stderr, "\n");
6986 GlobalIndex->printStats();
6987 }
6988
Guy Benyei11169dd2012-12-18 14:30:41 +00006989 std::fprintf(stderr, "\n");
6990 dump();
6991 std::fprintf(stderr, "\n");
6992}
6993
6994template<typename Key, typename ModuleFile, unsigned InitialCapacity>
6995static void
6996dumpModuleIDMap(StringRef Name,
6997 const ContinuousRangeMap<Key, ModuleFile *,
6998 InitialCapacity> &Map) {
6999 if (Map.begin() == Map.end())
7000 return;
7001
7002 typedef ContinuousRangeMap<Key, ModuleFile *, InitialCapacity> MapType;
7003 llvm::errs() << Name << ":\n";
7004 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
7005 I != IEnd; ++I) {
7006 llvm::errs() << " " << I->first << " -> " << I->second->FileName
7007 << "\n";
7008 }
7009}
7010
7011void ASTReader::dump() {
7012 llvm::errs() << "*** PCH/ModuleFile Remappings:\n";
7013 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap);
7014 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap);
7015 dumpModuleIDMap("Global type map", GlobalTypeMap);
7016 dumpModuleIDMap("Global declaration map", GlobalDeclMap);
7017 dumpModuleIDMap("Global identifier map", GlobalIdentifierMap);
7018 dumpModuleIDMap("Global macro map", GlobalMacroMap);
7019 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap);
7020 dumpModuleIDMap("Global selector map", GlobalSelectorMap);
7021 dumpModuleIDMap("Global preprocessed entity map",
7022 GlobalPreprocessedEntityMap);
7023
7024 llvm::errs() << "\n*** PCH/Modules Loaded:";
7025 for (ModuleManager::ModuleConstIterator M = ModuleMgr.begin(),
7026 MEnd = ModuleMgr.end();
7027 M != MEnd; ++M)
7028 (*M)->dump();
7029}
7030
7031/// Return the amount of memory used by memory buffers, breaking down
7032/// by heap-backed versus mmap'ed memory.
7033void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const {
7034 for (ModuleConstIterator I = ModuleMgr.begin(),
7035 E = ModuleMgr.end(); I != E; ++I) {
7036 if (llvm::MemoryBuffer *buf = (*I)->Buffer.get()) {
7037 size_t bytes = buf->getBufferSize();
7038 switch (buf->getBufferKind()) {
7039 case llvm::MemoryBuffer::MemoryBuffer_Malloc:
7040 sizes.malloc_bytes += bytes;
7041 break;
7042 case llvm::MemoryBuffer::MemoryBuffer_MMap:
7043 sizes.mmap_bytes += bytes;
7044 break;
7045 }
7046 }
7047 }
7048}
7049
7050void ASTReader::InitializeSema(Sema &S) {
7051 SemaObj = &S;
7052 S.addExternalSource(this);
7053
7054 // Makes sure any declarations that were deserialized "too early"
7055 // still get added to the identifier's declaration chains.
Ben Langmuir5418f402014-09-10 21:29:41 +00007056 for (uint64_t ID : PreloadedDeclIDs) {
7057 NamedDecl *D = cast<NamedDecl>(GetDecl(ID));
7058 pushExternalDeclIntoScope(D, D->getDeclName());
Guy Benyei11169dd2012-12-18 14:30:41 +00007059 }
Ben Langmuir5418f402014-09-10 21:29:41 +00007060 PreloadedDeclIDs.clear();
Guy Benyei11169dd2012-12-18 14:30:41 +00007061
Richard Smith3d8e97e2013-10-18 06:54:39 +00007062 // FIXME: What happens if these are changed by a module import?
Guy Benyei11169dd2012-12-18 14:30:41 +00007063 if (!FPPragmaOptions.empty()) {
7064 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS");
7065 SemaObj->FPFeatures.fp_contract = FPPragmaOptions[0];
7066 }
7067
Richard Smith3d8e97e2013-10-18 06:54:39 +00007068 // FIXME: What happens if these are changed by a module import?
Guy Benyei11169dd2012-12-18 14:30:41 +00007069 if (!OpenCLExtensions.empty()) {
7070 unsigned I = 0;
7071#define OPENCLEXT(nm) SemaObj->OpenCLFeatures.nm = OpenCLExtensions[I++];
7072#include "clang/Basic/OpenCLExtensions.def"
7073
7074 assert(OpenCLExtensions.size() == I && "Wrong number of OPENCL_EXTENSIONS");
7075 }
Richard Smith3d8e97e2013-10-18 06:54:39 +00007076
7077 UpdateSema();
7078}
7079
7080void ASTReader::UpdateSema() {
7081 assert(SemaObj && "no Sema to update");
7082
7083 // Load the offsets of the declarations that Sema references.
7084 // They will be lazily deserialized when needed.
7085 if (!SemaDeclRefs.empty()) {
7086 assert(SemaDeclRefs.size() % 2 == 0);
7087 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 2) {
7088 if (!SemaObj->StdNamespace)
7089 SemaObj->StdNamespace = SemaDeclRefs[I];
7090 if (!SemaObj->StdBadAlloc)
7091 SemaObj->StdBadAlloc = SemaDeclRefs[I+1];
7092 }
7093 SemaDeclRefs.clear();
7094 }
Dario Domizioli13a0a382014-05-23 12:13:25 +00007095
7096 // Update the state of 'pragma clang optimize'. Use the same API as if we had
7097 // encountered the pragma in the source.
7098 if(OptimizeOffPragmaLocation.isValid())
7099 SemaObj->ActOnPragmaOptimize(/* IsOn = */ false, OptimizeOffPragmaLocation);
Guy Benyei11169dd2012-12-18 14:30:41 +00007100}
7101
7102IdentifierInfo* ASTReader::get(const char *NameStart, const char *NameEnd) {
7103 // Note that we are loading an identifier.
7104 Deserializing AnIdentifier(this);
Douglas Gregore060e572013-01-25 01:03:03 +00007105 StringRef Name(NameStart, NameEnd - NameStart);
7106
7107 // If there is a global index, look there first to determine which modules
7108 // provably do not have any results for this identifier.
Douglas Gregor7211ac12013-01-25 23:32:03 +00007109 GlobalModuleIndex::HitSet Hits;
Craig Toppera13603a2014-05-22 05:54:18 +00007110 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
Douglas Gregore060e572013-01-25 01:03:03 +00007111 if (!loadGlobalIndex()) {
Douglas Gregor7211ac12013-01-25 23:32:03 +00007112 if (GlobalIndex->lookupIdentifier(Name, Hits)) {
7113 HitsPtr = &Hits;
Douglas Gregore060e572013-01-25 01:03:03 +00007114 }
7115 }
Douglas Gregor7211ac12013-01-25 23:32:03 +00007116 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0,
Douglas Gregor00a50f72013-01-25 00:38:33 +00007117 NumIdentifierLookups,
7118 NumIdentifierLookupHits);
Douglas Gregor7211ac12013-01-25 23:32:03 +00007119 ModuleMgr.visit(IdentifierLookupVisitor::visit, &Visitor, HitsPtr);
Guy Benyei11169dd2012-12-18 14:30:41 +00007120 IdentifierInfo *II = Visitor.getIdentifierInfo();
7121 markIdentifierUpToDate(II);
7122 return II;
7123}
7124
7125namespace clang {
7126 /// \brief An identifier-lookup iterator that enumerates all of the
7127 /// identifiers stored within a set of AST files.
7128 class ASTIdentifierIterator : public IdentifierIterator {
7129 /// \brief The AST reader whose identifiers are being enumerated.
7130 const ASTReader &Reader;
7131
7132 /// \brief The current index into the chain of AST files stored in
7133 /// the AST reader.
7134 unsigned Index;
7135
7136 /// \brief The current position within the identifier lookup table
7137 /// of the current AST file.
7138 ASTIdentifierLookupTable::key_iterator Current;
7139
7140 /// \brief The end position within the identifier lookup table of
7141 /// the current AST file.
7142 ASTIdentifierLookupTable::key_iterator End;
7143
7144 public:
7145 explicit ASTIdentifierIterator(const ASTReader &Reader);
7146
Craig Topper3e89dfe2014-03-13 02:13:41 +00007147 StringRef Next() override;
Guy Benyei11169dd2012-12-18 14:30:41 +00007148 };
7149}
7150
7151ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader)
7152 : Reader(Reader), Index(Reader.ModuleMgr.size() - 1) {
7153 ASTIdentifierLookupTable *IdTable
7154 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].IdentifierLookupTable;
7155 Current = IdTable->key_begin();
7156 End = IdTable->key_end();
7157}
7158
7159StringRef ASTIdentifierIterator::Next() {
7160 while (Current == End) {
7161 // If we have exhausted all of our AST files, we're done.
7162 if (Index == 0)
7163 return StringRef();
7164
7165 --Index;
7166 ASTIdentifierLookupTable *IdTable
7167 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].
7168 IdentifierLookupTable;
7169 Current = IdTable->key_begin();
7170 End = IdTable->key_end();
7171 }
7172
7173 // We have any identifiers remaining in the current AST file; return
7174 // the next one.
Douglas Gregorbfd73d72013-01-23 18:53:14 +00007175 StringRef Result = *Current;
Guy Benyei11169dd2012-12-18 14:30:41 +00007176 ++Current;
Douglas Gregorbfd73d72013-01-23 18:53:14 +00007177 return Result;
Guy Benyei11169dd2012-12-18 14:30:41 +00007178}
7179
Argyrios Kyrtzidis9aca3c62013-04-17 22:10:55 +00007180IdentifierIterator *ASTReader::getIdentifiers() {
7181 if (!loadGlobalIndex())
7182 return GlobalIndex->createIdentifierIterator();
7183
Guy Benyei11169dd2012-12-18 14:30:41 +00007184 return new ASTIdentifierIterator(*this);
7185}
7186
7187namespace clang { namespace serialization {
7188 class ReadMethodPoolVisitor {
7189 ASTReader &Reader;
7190 Selector Sel;
7191 unsigned PriorGeneration;
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00007192 unsigned InstanceBits;
7193 unsigned FactoryBits;
Nico Weberff4b35e2014-12-27 22:14:15 +00007194 bool InstanceHasMoreThanOneDecl;
7195 bool FactoryHasMoreThanOneDecl;
Dmitri Gribenkof8579502013-01-12 19:30:44 +00007196 SmallVector<ObjCMethodDecl *, 4> InstanceMethods;
7197 SmallVector<ObjCMethodDecl *, 4> FactoryMethods;
Guy Benyei11169dd2012-12-18 14:30:41 +00007198
7199 public:
Nico Weber2e0c8f72014-12-27 03:58:08 +00007200 ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel,
Guy Benyei11169dd2012-12-18 14:30:41 +00007201 unsigned PriorGeneration)
Nico Weber2e0c8f72014-12-27 03:58:08 +00007202 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration),
Nico Weberff4b35e2014-12-27 22:14:15 +00007203 InstanceBits(0), FactoryBits(0), InstanceHasMoreThanOneDecl(false),
7204 FactoryHasMoreThanOneDecl(false) {}
Nico Weber2e0c8f72014-12-27 03:58:08 +00007205
Guy Benyei11169dd2012-12-18 14:30:41 +00007206 static bool visit(ModuleFile &M, void *UserData) {
7207 ReadMethodPoolVisitor *This
7208 = static_cast<ReadMethodPoolVisitor *>(UserData);
7209
7210 if (!M.SelectorLookupTable)
7211 return false;
7212
7213 // If we've already searched this module file, skip it now.
7214 if (M.Generation <= This->PriorGeneration)
7215 return true;
7216
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007217 ++This->Reader.NumMethodPoolTableLookups;
Guy Benyei11169dd2012-12-18 14:30:41 +00007218 ASTSelectorLookupTable *PoolTable
7219 = (ASTSelectorLookupTable*)M.SelectorLookupTable;
7220 ASTSelectorLookupTable::iterator Pos = PoolTable->find(This->Sel);
7221 if (Pos == PoolTable->end())
7222 return false;
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007223
7224 ++This->Reader.NumMethodPoolTableHits;
Guy Benyei11169dd2012-12-18 14:30:41 +00007225 ++This->Reader.NumSelectorsRead;
7226 // FIXME: Not quite happy with the statistics here. We probably should
7227 // disable this tracking when called via LoadSelector.
7228 // Also, should entries without methods count as misses?
7229 ++This->Reader.NumMethodPoolEntriesRead;
7230 ASTSelectorLookupTrait::data_type Data = *Pos;
7231 if (This->Reader.DeserializationListener)
7232 This->Reader.DeserializationListener->SelectorRead(Data.ID,
7233 This->Sel);
7234
7235 This->InstanceMethods.append(Data.Instance.begin(), Data.Instance.end());
7236 This->FactoryMethods.append(Data.Factory.begin(), Data.Factory.end());
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00007237 This->InstanceBits = Data.InstanceBits;
7238 This->FactoryBits = Data.FactoryBits;
Nico Weberff4b35e2014-12-27 22:14:15 +00007239 This->InstanceHasMoreThanOneDecl = Data.InstanceHasMoreThanOneDecl;
7240 This->FactoryHasMoreThanOneDecl = Data.FactoryHasMoreThanOneDecl;
Guy Benyei11169dd2012-12-18 14:30:41 +00007241 return true;
7242 }
7243
7244 /// \brief Retrieve the instance methods found by this visitor.
7245 ArrayRef<ObjCMethodDecl *> getInstanceMethods() const {
7246 return InstanceMethods;
7247 }
7248
7249 /// \brief Retrieve the instance methods found by this visitor.
7250 ArrayRef<ObjCMethodDecl *> getFactoryMethods() const {
7251 return FactoryMethods;
7252 }
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00007253
7254 unsigned getInstanceBits() const { return InstanceBits; }
7255 unsigned getFactoryBits() const { return FactoryBits; }
Nico Weberff4b35e2014-12-27 22:14:15 +00007256 bool instanceHasMoreThanOneDecl() const {
7257 return InstanceHasMoreThanOneDecl;
7258 }
7259 bool factoryHasMoreThanOneDecl() const { return FactoryHasMoreThanOneDecl; }
Guy Benyei11169dd2012-12-18 14:30:41 +00007260 };
7261} } // end namespace clang::serialization
7262
7263/// \brief Add the given set of methods to the method list.
7264static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods,
7265 ObjCMethodList &List) {
7266 for (unsigned I = 0, N = Methods.size(); I != N; ++I) {
7267 S.addMethodToGlobalList(&List, Methods[I]);
7268 }
7269}
7270
7271void ASTReader::ReadMethodPool(Selector Sel) {
7272 // Get the selector generation and update it to the current generation.
7273 unsigned &Generation = SelectorGeneration[Sel];
7274 unsigned PriorGeneration = Generation;
Richard Smith053f6c62014-05-16 23:01:30 +00007275 Generation = getGeneration();
Guy Benyei11169dd2012-12-18 14:30:41 +00007276
7277 // Search for methods defined with this selector.
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007278 ++NumMethodPoolLookups;
Guy Benyei11169dd2012-12-18 14:30:41 +00007279 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration);
7280 ModuleMgr.visit(&ReadMethodPoolVisitor::visit, &Visitor);
7281
7282 if (Visitor.getInstanceMethods().empty() &&
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007283 Visitor.getFactoryMethods().empty())
Guy Benyei11169dd2012-12-18 14:30:41 +00007284 return;
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007285
7286 ++NumMethodPoolHits;
7287
Guy Benyei11169dd2012-12-18 14:30:41 +00007288 if (!getSema())
7289 return;
7290
7291 Sema &S = *getSema();
7292 Sema::GlobalMethodPool::iterator Pos
7293 = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first;
Ben Langmuira0c32e92015-01-12 19:27:00 +00007294
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00007295 Pos->second.first.setBits(Visitor.getInstanceBits());
Nico Weberff4b35e2014-12-27 22:14:15 +00007296 Pos->second.first.setHasMoreThanOneDecl(Visitor.instanceHasMoreThanOneDecl());
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00007297 Pos->second.second.setBits(Visitor.getFactoryBits());
Nico Weberff4b35e2014-12-27 22:14:15 +00007298 Pos->second.second.setHasMoreThanOneDecl(Visitor.factoryHasMoreThanOneDecl());
Ben Langmuira0c32e92015-01-12 19:27:00 +00007299
7300 // Add methods to the global pool *after* setting hasMoreThanOneDecl, since
7301 // when building a module we keep every method individually and may need to
7302 // update hasMoreThanOneDecl as we add the methods.
7303 addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first);
7304 addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second);
Guy Benyei11169dd2012-12-18 14:30:41 +00007305}
7306
7307void ASTReader::ReadKnownNamespaces(
7308 SmallVectorImpl<NamespaceDecl *> &Namespaces) {
7309 Namespaces.clear();
7310
7311 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
7312 if (NamespaceDecl *Namespace
7313 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I])))
7314 Namespaces.push_back(Namespace);
7315 }
7316}
7317
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00007318void ASTReader::ReadUndefinedButUsed(
Nick Lewyckyf0f56162013-01-31 03:23:57 +00007319 llvm::DenseMap<NamedDecl*, SourceLocation> &Undefined) {
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00007320 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
7321 NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++]));
Nick Lewycky8334af82013-01-26 00:35:08 +00007322 SourceLocation Loc =
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00007323 SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]);
Nick Lewycky8334af82013-01-26 00:35:08 +00007324 Undefined.insert(std::make_pair(D, Loc));
7325 }
7326}
Nick Lewycky8334af82013-01-26 00:35:08 +00007327
Guy Benyei11169dd2012-12-18 14:30:41 +00007328void ASTReader::ReadTentativeDefinitions(
7329 SmallVectorImpl<VarDecl *> &TentativeDefs) {
7330 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
7331 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I]));
7332 if (Var)
7333 TentativeDefs.push_back(Var);
7334 }
7335 TentativeDefinitions.clear();
7336}
7337
7338void ASTReader::ReadUnusedFileScopedDecls(
7339 SmallVectorImpl<const DeclaratorDecl *> &Decls) {
7340 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
7341 DeclaratorDecl *D
7342 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I]));
7343 if (D)
7344 Decls.push_back(D);
7345 }
7346 UnusedFileScopedDecls.clear();
7347}
7348
7349void ASTReader::ReadDelegatingConstructors(
7350 SmallVectorImpl<CXXConstructorDecl *> &Decls) {
7351 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
7352 CXXConstructorDecl *D
7353 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I]));
7354 if (D)
7355 Decls.push_back(D);
7356 }
7357 DelegatingCtorDecls.clear();
7358}
7359
7360void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) {
7361 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
7362 TypedefNameDecl *D
7363 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I]));
7364 if (D)
7365 Decls.push_back(D);
7366 }
7367 ExtVectorDecls.clear();
7368}
7369
Nico Weber72889432014-09-06 01:25:55 +00007370void ASTReader::ReadUnusedLocalTypedefNameCandidates(
7371 llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) {
7372 for (unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N;
7373 ++I) {
7374 TypedefNameDecl *D = dyn_cast_or_null<TypedefNameDecl>(
7375 GetDecl(UnusedLocalTypedefNameCandidates[I]));
7376 if (D)
7377 Decls.insert(D);
7378 }
7379 UnusedLocalTypedefNameCandidates.clear();
7380}
7381
Guy Benyei11169dd2012-12-18 14:30:41 +00007382void ASTReader::ReadReferencedSelectors(
7383 SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) {
7384 if (ReferencedSelectorsData.empty())
7385 return;
7386
7387 // If there are @selector references added them to its pool. This is for
7388 // implementation of -Wselector.
7389 unsigned int DataSize = ReferencedSelectorsData.size()-1;
7390 unsigned I = 0;
7391 while (I < DataSize) {
7392 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]);
7393 SourceLocation SelLoc
7394 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]);
7395 Sels.push_back(std::make_pair(Sel, SelLoc));
7396 }
7397 ReferencedSelectorsData.clear();
7398}
7399
7400void ASTReader::ReadWeakUndeclaredIdentifiers(
7401 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo> > &WeakIDs) {
7402 if (WeakUndeclaredIdentifiers.empty())
7403 return;
7404
7405 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) {
7406 IdentifierInfo *WeakId
7407 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
7408 IdentifierInfo *AliasId
7409 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
7410 SourceLocation Loc
7411 = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]);
7412 bool Used = WeakUndeclaredIdentifiers[I++];
7413 WeakInfo WI(AliasId, Loc);
7414 WI.setUsed(Used);
7415 WeakIDs.push_back(std::make_pair(WeakId, WI));
7416 }
7417 WeakUndeclaredIdentifiers.clear();
7418}
7419
7420void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) {
7421 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) {
7422 ExternalVTableUse VT;
7423 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++]));
7424 VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]);
7425 VT.DefinitionRequired = VTableUses[Idx++];
7426 VTables.push_back(VT);
7427 }
7428
7429 VTableUses.clear();
7430}
7431
7432void ASTReader::ReadPendingInstantiations(
7433 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation> > &Pending) {
7434 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
7435 ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++]));
7436 SourceLocation Loc
7437 = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]);
7438
7439 Pending.push_back(std::make_pair(D, Loc));
7440 }
7441 PendingInstantiations.clear();
7442}
7443
Richard Smithe40f2ba2013-08-07 21:41:30 +00007444void ASTReader::ReadLateParsedTemplates(
Chandler Carruth52cee4d2015-03-26 09:08:15 +00007445 llvm::MapVector<const FunctionDecl *, LateParsedTemplate *> &LPTMap) {
Richard Smithe40f2ba2013-08-07 21:41:30 +00007446 for (unsigned Idx = 0, N = LateParsedTemplates.size(); Idx < N;
7447 /* In loop */) {
7448 FunctionDecl *FD = cast<FunctionDecl>(GetDecl(LateParsedTemplates[Idx++]));
7449
7450 LateParsedTemplate *LT = new LateParsedTemplate;
7451 LT->D = GetDecl(LateParsedTemplates[Idx++]);
7452
7453 ModuleFile *F = getOwningModuleFile(LT->D);
7454 assert(F && "No module");
7455
7456 unsigned TokN = LateParsedTemplates[Idx++];
7457 LT->Toks.reserve(TokN);
7458 for (unsigned T = 0; T < TokN; ++T)
7459 LT->Toks.push_back(ReadToken(*F, LateParsedTemplates, Idx));
7460
Chandler Carruth52cee4d2015-03-26 09:08:15 +00007461 LPTMap.insert(std::make_pair(FD, LT));
Richard Smithe40f2ba2013-08-07 21:41:30 +00007462 }
7463
7464 LateParsedTemplates.clear();
7465}
7466
Guy Benyei11169dd2012-12-18 14:30:41 +00007467void ASTReader::LoadSelector(Selector Sel) {
7468 // It would be complicated to avoid reading the methods anyway. So don't.
7469 ReadMethodPool(Sel);
7470}
7471
7472void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) {
7473 assert(ID && "Non-zero identifier ID required");
7474 assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range");
7475 IdentifiersLoaded[ID - 1] = II;
7476 if (DeserializationListener)
7477 DeserializationListener->IdentifierRead(ID, II);
7478}
7479
7480/// \brief Set the globally-visible declarations associated with the given
7481/// identifier.
7482///
7483/// If the AST reader is currently in a state where the given declaration IDs
7484/// cannot safely be resolved, they are queued until it is safe to resolve
7485/// them.
7486///
7487/// \param II an IdentifierInfo that refers to one or more globally-visible
7488/// declarations.
7489///
7490/// \param DeclIDs the set of declaration IDs with the name @p II that are
7491/// visible at global scope.
7492///
Douglas Gregor6168bd22013-02-18 15:53:43 +00007493/// \param Decls if non-null, this vector will be populated with the set of
7494/// deserialized declarations. These declarations will not be pushed into
7495/// scope.
Guy Benyei11169dd2012-12-18 14:30:41 +00007496void
7497ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II,
7498 const SmallVectorImpl<uint32_t> &DeclIDs,
Douglas Gregor6168bd22013-02-18 15:53:43 +00007499 SmallVectorImpl<Decl *> *Decls) {
7500 if (NumCurrentElementsDeserializing && !Decls) {
7501 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
Guy Benyei11169dd2012-12-18 14:30:41 +00007502 return;
7503 }
7504
7505 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
Ben Langmuir5418f402014-09-10 21:29:41 +00007506 if (!SemaObj) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007507 // Queue this declaration so that it will be added to the
7508 // translation unit scope and identifier's declaration chain
7509 // once a Sema object is known.
Ben Langmuir5418f402014-09-10 21:29:41 +00007510 PreloadedDeclIDs.push_back(DeclIDs[I]);
7511 continue;
Guy Benyei11169dd2012-12-18 14:30:41 +00007512 }
Ben Langmuir5418f402014-09-10 21:29:41 +00007513
7514 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I]));
7515
7516 // If we're simply supposed to record the declarations, do so now.
7517 if (Decls) {
7518 Decls->push_back(D);
7519 continue;
7520 }
7521
7522 // Introduce this declaration into the translation-unit scope
7523 // and add it to the declaration chain for this identifier, so
7524 // that (unqualified) name lookup will find it.
7525 pushExternalDeclIntoScope(D, II);
Guy Benyei11169dd2012-12-18 14:30:41 +00007526 }
7527}
7528
Douglas Gregorc8a992f2013-01-21 16:52:34 +00007529IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007530 if (ID == 0)
Craig Toppera13603a2014-05-22 05:54:18 +00007531 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007532
7533 if (IdentifiersLoaded.empty()) {
7534 Error("no identifier table in AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00007535 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007536 }
7537
7538 ID -= 1;
7539 if (!IdentifiersLoaded[ID]) {
7540 GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1);
7541 assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map");
7542 ModuleFile *M = I->second;
7543 unsigned Index = ID - M->BaseIdentifierID;
7544 const char *Str = M->IdentifierTableData + M->IdentifierOffsets[Index];
7545
7546 // All of the strings in the AST file are preceded by a 16-bit length.
7547 // Extract that 16-bit length to avoid having to execute strlen().
7548 // NOTE: 'StrLenPtr' is an 'unsigned char*' so that we load bytes as
7549 // unsigned integers. This is important to avoid integer overflow when
7550 // we cast them to 'unsigned'.
7551 const unsigned char *StrLenPtr = (const unsigned char*) Str - 2;
7552 unsigned StrLen = (((unsigned) StrLenPtr[0])
7553 | (((unsigned) StrLenPtr[1]) << 8)) - 1;
Douglas Gregorc8a992f2013-01-21 16:52:34 +00007554 IdentifiersLoaded[ID]
7555 = &PP.getIdentifierTable().get(StringRef(Str, StrLen));
Guy Benyei11169dd2012-12-18 14:30:41 +00007556 if (DeserializationListener)
7557 DeserializationListener->IdentifierRead(ID + 1, IdentifiersLoaded[ID]);
7558 }
7559
7560 return IdentifiersLoaded[ID];
7561}
7562
Douglas Gregorc8a992f2013-01-21 16:52:34 +00007563IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) {
7564 return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID));
Guy Benyei11169dd2012-12-18 14:30:41 +00007565}
7566
7567IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) {
7568 if (LocalID < NUM_PREDEF_IDENT_IDS)
7569 return LocalID;
7570
7571 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7572 = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS);
7573 assert(I != M.IdentifierRemap.end()
7574 && "Invalid index into identifier index remap");
7575
7576 return LocalID + I->second;
7577}
7578
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00007579MacroInfo *ASTReader::getMacro(MacroID ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007580 if (ID == 0)
Craig Toppera13603a2014-05-22 05:54:18 +00007581 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007582
7583 if (MacrosLoaded.empty()) {
7584 Error("no macro table in AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00007585 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007586 }
7587
7588 ID -= NUM_PREDEF_MACRO_IDS;
7589 if (!MacrosLoaded[ID]) {
7590 GlobalMacroMapType::iterator I
7591 = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS);
7592 assert(I != GlobalMacroMap.end() && "Corrupted global macro map");
7593 ModuleFile *M = I->second;
7594 unsigned Index = ID - M->BaseMacroID;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00007595 MacrosLoaded[ID] = ReadMacroRecord(*M, M->MacroOffsets[Index]);
7596
7597 if (DeserializationListener)
7598 DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS,
7599 MacrosLoaded[ID]);
Guy Benyei11169dd2012-12-18 14:30:41 +00007600 }
7601
7602 return MacrosLoaded[ID];
7603}
7604
7605MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) {
7606 if (LocalID < NUM_PREDEF_MACRO_IDS)
7607 return LocalID;
7608
7609 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7610 = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS);
7611 assert(I != M.MacroRemap.end() && "Invalid index into macro index remap");
7612
7613 return LocalID + I->second;
7614}
7615
7616serialization::SubmoduleID
7617ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) {
7618 if (LocalID < NUM_PREDEF_SUBMODULE_IDS)
7619 return LocalID;
7620
7621 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7622 = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS);
7623 assert(I != M.SubmoduleRemap.end()
7624 && "Invalid index into submodule index remap");
7625
7626 return LocalID + I->second;
7627}
7628
7629Module *ASTReader::getSubmodule(SubmoduleID GlobalID) {
7630 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) {
7631 assert(GlobalID == 0 && "Unhandled global submodule ID");
Craig Toppera13603a2014-05-22 05:54:18 +00007632 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007633 }
7634
7635 if (GlobalID > SubmodulesLoaded.size()) {
7636 Error("submodule ID out of range in AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00007637 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007638 }
7639
7640 return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS];
7641}
Douglas Gregorc147b0b2013-01-12 01:29:50 +00007642
7643Module *ASTReader::getModule(unsigned ID) {
7644 return getSubmodule(ID);
7645}
7646
Guy Benyei11169dd2012-12-18 14:30:41 +00007647Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) {
7648 return DecodeSelector(getGlobalSelectorID(M, LocalID));
7649}
7650
7651Selector ASTReader::DecodeSelector(serialization::SelectorID ID) {
7652 if (ID == 0)
7653 return Selector();
7654
7655 if (ID > SelectorsLoaded.size()) {
7656 Error("selector ID out of range in AST file");
7657 return Selector();
7658 }
7659
Craig Toppera13603a2014-05-22 05:54:18 +00007660 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007661 // Load this selector from the selector table.
7662 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID);
7663 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map");
7664 ModuleFile &M = *I->second;
7665 ASTSelectorLookupTrait Trait(*this, M);
7666 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS;
7667 SelectorsLoaded[ID - 1] =
7668 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0);
7669 if (DeserializationListener)
7670 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
7671 }
7672
7673 return SelectorsLoaded[ID - 1];
7674}
7675
7676Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) {
7677 return DecodeSelector(ID);
7678}
7679
7680uint32_t ASTReader::GetNumExternalSelectors() {
7681 // ID 0 (the null selector) is considered an external selector.
7682 return getTotalNumSelectors() + 1;
7683}
7684
7685serialization::SelectorID
7686ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const {
7687 if (LocalID < NUM_PREDEF_SELECTOR_IDS)
7688 return LocalID;
7689
7690 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7691 = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS);
7692 assert(I != M.SelectorRemap.end()
7693 && "Invalid index into selector index remap");
7694
7695 return LocalID + I->second;
7696}
7697
7698DeclarationName
7699ASTReader::ReadDeclarationName(ModuleFile &F,
7700 const RecordData &Record, unsigned &Idx) {
7701 DeclarationName::NameKind Kind = (DeclarationName::NameKind)Record[Idx++];
7702 switch (Kind) {
7703 case DeclarationName::Identifier:
Douglas Gregorc8a992f2013-01-21 16:52:34 +00007704 return DeclarationName(GetIdentifierInfo(F, Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00007705
7706 case DeclarationName::ObjCZeroArgSelector:
7707 case DeclarationName::ObjCOneArgSelector:
7708 case DeclarationName::ObjCMultiArgSelector:
7709 return DeclarationName(ReadSelector(F, Record, Idx));
7710
7711 case DeclarationName::CXXConstructorName:
7712 return Context.DeclarationNames.getCXXConstructorName(
7713 Context.getCanonicalType(readType(F, Record, Idx)));
7714
7715 case DeclarationName::CXXDestructorName:
7716 return Context.DeclarationNames.getCXXDestructorName(
7717 Context.getCanonicalType(readType(F, Record, Idx)));
7718
7719 case DeclarationName::CXXConversionFunctionName:
7720 return Context.DeclarationNames.getCXXConversionFunctionName(
7721 Context.getCanonicalType(readType(F, Record, Idx)));
7722
7723 case DeclarationName::CXXOperatorName:
7724 return Context.DeclarationNames.getCXXOperatorName(
7725 (OverloadedOperatorKind)Record[Idx++]);
7726
7727 case DeclarationName::CXXLiteralOperatorName:
7728 return Context.DeclarationNames.getCXXLiteralOperatorName(
7729 GetIdentifierInfo(F, Record, Idx));
7730
7731 case DeclarationName::CXXUsingDirective:
7732 return DeclarationName::getUsingDirectiveName();
7733 }
7734
7735 llvm_unreachable("Invalid NameKind!");
7736}
7737
7738void ASTReader::ReadDeclarationNameLoc(ModuleFile &F,
7739 DeclarationNameLoc &DNLoc,
7740 DeclarationName Name,
7741 const RecordData &Record, unsigned &Idx) {
7742 switch (Name.getNameKind()) {
7743 case DeclarationName::CXXConstructorName:
7744 case DeclarationName::CXXDestructorName:
7745 case DeclarationName::CXXConversionFunctionName:
7746 DNLoc.NamedType.TInfo = GetTypeSourceInfo(F, Record, Idx);
7747 break;
7748
7749 case DeclarationName::CXXOperatorName:
7750 DNLoc.CXXOperatorName.BeginOpNameLoc
7751 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7752 DNLoc.CXXOperatorName.EndOpNameLoc
7753 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7754 break;
7755
7756 case DeclarationName::CXXLiteralOperatorName:
7757 DNLoc.CXXLiteralOperatorName.OpNameLoc
7758 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7759 break;
7760
7761 case DeclarationName::Identifier:
7762 case DeclarationName::ObjCZeroArgSelector:
7763 case DeclarationName::ObjCOneArgSelector:
7764 case DeclarationName::ObjCMultiArgSelector:
7765 case DeclarationName::CXXUsingDirective:
7766 break;
7767 }
7768}
7769
7770void ASTReader::ReadDeclarationNameInfo(ModuleFile &F,
7771 DeclarationNameInfo &NameInfo,
7772 const RecordData &Record, unsigned &Idx) {
7773 NameInfo.setName(ReadDeclarationName(F, Record, Idx));
7774 NameInfo.setLoc(ReadSourceLocation(F, Record, Idx));
7775 DeclarationNameLoc DNLoc;
7776 ReadDeclarationNameLoc(F, DNLoc, NameInfo.getName(), Record, Idx);
7777 NameInfo.setInfo(DNLoc);
7778}
7779
7780void ASTReader::ReadQualifierInfo(ModuleFile &F, QualifierInfo &Info,
7781 const RecordData &Record, unsigned &Idx) {
7782 Info.QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx);
7783 unsigned NumTPLists = Record[Idx++];
7784 Info.NumTemplParamLists = NumTPLists;
7785 if (NumTPLists) {
7786 Info.TemplParamLists = new (Context) TemplateParameterList*[NumTPLists];
7787 for (unsigned i=0; i != NumTPLists; ++i)
7788 Info.TemplParamLists[i] = ReadTemplateParameterList(F, Record, Idx);
7789 }
7790}
7791
7792TemplateName
7793ASTReader::ReadTemplateName(ModuleFile &F, const RecordData &Record,
7794 unsigned &Idx) {
7795 TemplateName::NameKind Kind = (TemplateName::NameKind)Record[Idx++];
7796 switch (Kind) {
7797 case TemplateName::Template:
7798 return TemplateName(ReadDeclAs<TemplateDecl>(F, Record, Idx));
7799
7800 case TemplateName::OverloadedTemplate: {
7801 unsigned size = Record[Idx++];
7802 UnresolvedSet<8> Decls;
7803 while (size--)
7804 Decls.addDecl(ReadDeclAs<NamedDecl>(F, Record, Idx));
7805
7806 return Context.getOverloadedTemplateName(Decls.begin(), Decls.end());
7807 }
7808
7809 case TemplateName::QualifiedTemplate: {
7810 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
7811 bool hasTemplKeyword = Record[Idx++];
7812 TemplateDecl *Template = ReadDeclAs<TemplateDecl>(F, Record, Idx);
7813 return Context.getQualifiedTemplateName(NNS, hasTemplKeyword, Template);
7814 }
7815
7816 case TemplateName::DependentTemplate: {
7817 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
7818 if (Record[Idx++]) // isIdentifier
7819 return Context.getDependentTemplateName(NNS,
7820 GetIdentifierInfo(F, Record,
7821 Idx));
7822 return Context.getDependentTemplateName(NNS,
7823 (OverloadedOperatorKind)Record[Idx++]);
7824 }
7825
7826 case TemplateName::SubstTemplateTemplateParm: {
7827 TemplateTemplateParmDecl *param
7828 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
7829 if (!param) return TemplateName();
7830 TemplateName replacement = ReadTemplateName(F, Record, Idx);
7831 return Context.getSubstTemplateTemplateParm(param, replacement);
7832 }
7833
7834 case TemplateName::SubstTemplateTemplateParmPack: {
7835 TemplateTemplateParmDecl *Param
7836 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
7837 if (!Param)
7838 return TemplateName();
7839
7840 TemplateArgument ArgPack = ReadTemplateArgument(F, Record, Idx);
7841 if (ArgPack.getKind() != TemplateArgument::Pack)
7842 return TemplateName();
7843
7844 return Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
7845 }
7846 }
7847
7848 llvm_unreachable("Unhandled template name kind!");
7849}
7850
7851TemplateArgument
7852ASTReader::ReadTemplateArgument(ModuleFile &F,
7853 const RecordData &Record, unsigned &Idx) {
7854 TemplateArgument::ArgKind Kind = (TemplateArgument::ArgKind)Record[Idx++];
7855 switch (Kind) {
7856 case TemplateArgument::Null:
7857 return TemplateArgument();
7858 case TemplateArgument::Type:
7859 return TemplateArgument(readType(F, Record, Idx));
7860 case TemplateArgument::Declaration: {
7861 ValueDecl *D = ReadDeclAs<ValueDecl>(F, Record, Idx);
David Blaikie0f62c8d2014-10-16 04:21:25 +00007862 return TemplateArgument(D, readType(F, Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00007863 }
7864 case TemplateArgument::NullPtr:
7865 return TemplateArgument(readType(F, Record, Idx), /*isNullPtr*/true);
7866 case TemplateArgument::Integral: {
7867 llvm::APSInt Value = ReadAPSInt(Record, Idx);
7868 QualType T = readType(F, Record, Idx);
7869 return TemplateArgument(Context, Value, T);
7870 }
7871 case TemplateArgument::Template:
7872 return TemplateArgument(ReadTemplateName(F, Record, Idx));
7873 case TemplateArgument::TemplateExpansion: {
7874 TemplateName Name = ReadTemplateName(F, Record, Idx);
David Blaikie05785d12013-02-20 22:23:23 +00007875 Optional<unsigned> NumTemplateExpansions;
Guy Benyei11169dd2012-12-18 14:30:41 +00007876 if (unsigned NumExpansions = Record[Idx++])
7877 NumTemplateExpansions = NumExpansions - 1;
7878 return TemplateArgument(Name, NumTemplateExpansions);
7879 }
7880 case TemplateArgument::Expression:
7881 return TemplateArgument(ReadExpr(F));
7882 case TemplateArgument::Pack: {
7883 unsigned NumArgs = Record[Idx++];
7884 TemplateArgument *Args = new (Context) TemplateArgument[NumArgs];
7885 for (unsigned I = 0; I != NumArgs; ++I)
7886 Args[I] = ReadTemplateArgument(F, Record, Idx);
7887 return TemplateArgument(Args, NumArgs);
7888 }
7889 }
7890
7891 llvm_unreachable("Unhandled template argument kind!");
7892}
7893
7894TemplateParameterList *
7895ASTReader::ReadTemplateParameterList(ModuleFile &F,
7896 const RecordData &Record, unsigned &Idx) {
7897 SourceLocation TemplateLoc = ReadSourceLocation(F, Record, Idx);
7898 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Idx);
7899 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Idx);
7900
7901 unsigned NumParams = Record[Idx++];
7902 SmallVector<NamedDecl *, 16> Params;
7903 Params.reserve(NumParams);
7904 while (NumParams--)
7905 Params.push_back(ReadDeclAs<NamedDecl>(F, Record, Idx));
7906
7907 TemplateParameterList* TemplateParams =
7908 TemplateParameterList::Create(Context, TemplateLoc, LAngleLoc,
7909 Params.data(), Params.size(), RAngleLoc);
7910 return TemplateParams;
7911}
7912
7913void
7914ASTReader::
Craig Topper5603df42013-07-05 19:34:19 +00007915ReadTemplateArgumentList(SmallVectorImpl<TemplateArgument> &TemplArgs,
Guy Benyei11169dd2012-12-18 14:30:41 +00007916 ModuleFile &F, const RecordData &Record,
7917 unsigned &Idx) {
7918 unsigned NumTemplateArgs = Record[Idx++];
7919 TemplArgs.reserve(NumTemplateArgs);
7920 while (NumTemplateArgs--)
7921 TemplArgs.push_back(ReadTemplateArgument(F, Record, Idx));
7922}
7923
7924/// \brief Read a UnresolvedSet structure.
Richard Smitha4ba74c2013-08-30 04:46:40 +00007925void ASTReader::ReadUnresolvedSet(ModuleFile &F, LazyASTUnresolvedSet &Set,
Guy Benyei11169dd2012-12-18 14:30:41 +00007926 const RecordData &Record, unsigned &Idx) {
7927 unsigned NumDecls = Record[Idx++];
7928 Set.reserve(Context, NumDecls);
7929 while (NumDecls--) {
Richard Smitha4ba74c2013-08-30 04:46:40 +00007930 DeclID ID = ReadDeclID(F, Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00007931 AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
Richard Smitha4ba74c2013-08-30 04:46:40 +00007932 Set.addLazyDecl(Context, ID, AS);
Guy Benyei11169dd2012-12-18 14:30:41 +00007933 }
7934}
7935
7936CXXBaseSpecifier
7937ASTReader::ReadCXXBaseSpecifier(ModuleFile &F,
7938 const RecordData &Record, unsigned &Idx) {
7939 bool isVirtual = static_cast<bool>(Record[Idx++]);
7940 bool isBaseOfClass = static_cast<bool>(Record[Idx++]);
7941 AccessSpecifier AS = static_cast<AccessSpecifier>(Record[Idx++]);
7942 bool inheritConstructors = static_cast<bool>(Record[Idx++]);
7943 TypeSourceInfo *TInfo = GetTypeSourceInfo(F, Record, Idx);
7944 SourceRange Range = ReadSourceRange(F, Record, Idx);
7945 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Idx);
7946 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo,
7947 EllipsisLoc);
7948 Result.setInheritConstructors(inheritConstructors);
7949 return Result;
7950}
7951
Richard Smithc2bb8182015-03-24 06:36:48 +00007952CXXCtorInitializer **
Guy Benyei11169dd2012-12-18 14:30:41 +00007953ASTReader::ReadCXXCtorInitializers(ModuleFile &F, const RecordData &Record,
7954 unsigned &Idx) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007955 unsigned NumInitializers = Record[Idx++];
Richard Smithc2bb8182015-03-24 06:36:48 +00007956 assert(NumInitializers && "wrote ctor initializers but have no inits");
7957 auto **CtorInitializers = new (Context) CXXCtorInitializer*[NumInitializers];
7958 for (unsigned i = 0; i != NumInitializers; ++i) {
7959 TypeSourceInfo *TInfo = nullptr;
7960 bool IsBaseVirtual = false;
7961 FieldDecl *Member = nullptr;
7962 IndirectFieldDecl *IndirectMember = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007963
Richard Smithc2bb8182015-03-24 06:36:48 +00007964 CtorInitializerType Type = (CtorInitializerType)Record[Idx++];
7965 switch (Type) {
7966 case CTOR_INITIALIZER_BASE:
7967 TInfo = GetTypeSourceInfo(F, Record, Idx);
7968 IsBaseVirtual = Record[Idx++];
7969 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00007970
Richard Smithc2bb8182015-03-24 06:36:48 +00007971 case CTOR_INITIALIZER_DELEGATING:
7972 TInfo = GetTypeSourceInfo(F, Record, Idx);
7973 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00007974
Richard Smithc2bb8182015-03-24 06:36:48 +00007975 case CTOR_INITIALIZER_MEMBER:
7976 Member = ReadDeclAs<FieldDecl>(F, Record, Idx);
7977 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00007978
Richard Smithc2bb8182015-03-24 06:36:48 +00007979 case CTOR_INITIALIZER_INDIRECT_MEMBER:
7980 IndirectMember = ReadDeclAs<IndirectFieldDecl>(F, Record, Idx);
7981 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00007982 }
Richard Smithc2bb8182015-03-24 06:36:48 +00007983
7984 SourceLocation MemberOrEllipsisLoc = ReadSourceLocation(F, Record, Idx);
7985 Expr *Init = ReadExpr(F);
7986 SourceLocation LParenLoc = ReadSourceLocation(F, Record, Idx);
7987 SourceLocation RParenLoc = ReadSourceLocation(F, Record, Idx);
7988 bool IsWritten = Record[Idx++];
7989 unsigned SourceOrderOrNumArrayIndices;
7990 SmallVector<VarDecl *, 8> Indices;
7991 if (IsWritten) {
7992 SourceOrderOrNumArrayIndices = Record[Idx++];
7993 } else {
7994 SourceOrderOrNumArrayIndices = Record[Idx++];
7995 Indices.reserve(SourceOrderOrNumArrayIndices);
7996 for (unsigned i=0; i != SourceOrderOrNumArrayIndices; ++i)
7997 Indices.push_back(ReadDeclAs<VarDecl>(F, Record, Idx));
7998 }
7999
8000 CXXCtorInitializer *BOMInit;
8001 if (Type == CTOR_INITIALIZER_BASE) {
8002 BOMInit = new (Context)
8003 CXXCtorInitializer(Context, TInfo, IsBaseVirtual, LParenLoc, Init,
8004 RParenLoc, MemberOrEllipsisLoc);
8005 } else if (Type == CTOR_INITIALIZER_DELEGATING) {
8006 BOMInit = new (Context)
8007 CXXCtorInitializer(Context, TInfo, LParenLoc, Init, RParenLoc);
8008 } else if (IsWritten) {
8009 if (Member)
8010 BOMInit = new (Context) CXXCtorInitializer(
8011 Context, Member, MemberOrEllipsisLoc, LParenLoc, Init, RParenLoc);
8012 else
8013 BOMInit = new (Context)
8014 CXXCtorInitializer(Context, IndirectMember, MemberOrEllipsisLoc,
8015 LParenLoc, Init, RParenLoc);
8016 } else {
8017 if (IndirectMember) {
8018 assert(Indices.empty() && "Indirect field improperly initialized");
8019 BOMInit = new (Context)
8020 CXXCtorInitializer(Context, IndirectMember, MemberOrEllipsisLoc,
8021 LParenLoc, Init, RParenLoc);
8022 } else {
8023 BOMInit = CXXCtorInitializer::Create(
8024 Context, Member, MemberOrEllipsisLoc, LParenLoc, Init, RParenLoc,
8025 Indices.data(), Indices.size());
8026 }
8027 }
8028
8029 if (IsWritten)
8030 BOMInit->setSourceOrder(SourceOrderOrNumArrayIndices);
8031 CtorInitializers[i] = BOMInit;
Guy Benyei11169dd2012-12-18 14:30:41 +00008032 }
8033
Richard Smithc2bb8182015-03-24 06:36:48 +00008034 return CtorInitializers;
Guy Benyei11169dd2012-12-18 14:30:41 +00008035}
8036
8037NestedNameSpecifier *
8038ASTReader::ReadNestedNameSpecifier(ModuleFile &F,
8039 const RecordData &Record, unsigned &Idx) {
8040 unsigned N = Record[Idx++];
Craig Toppera13603a2014-05-22 05:54:18 +00008041 NestedNameSpecifier *NNS = nullptr, *Prev = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00008042 for (unsigned I = 0; I != N; ++I) {
8043 NestedNameSpecifier::SpecifierKind Kind
8044 = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
8045 switch (Kind) {
8046 case NestedNameSpecifier::Identifier: {
8047 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
8048 NNS = NestedNameSpecifier::Create(Context, Prev, II);
8049 break;
8050 }
8051
8052 case NestedNameSpecifier::Namespace: {
8053 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
8054 NNS = NestedNameSpecifier::Create(Context, Prev, NS);
8055 break;
8056 }
8057
8058 case NestedNameSpecifier::NamespaceAlias: {
8059 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
8060 NNS = NestedNameSpecifier::Create(Context, Prev, Alias);
8061 break;
8062 }
8063
8064 case NestedNameSpecifier::TypeSpec:
8065 case NestedNameSpecifier::TypeSpecWithTemplate: {
8066 const Type *T = readType(F, Record, Idx).getTypePtrOrNull();
8067 if (!T)
Craig Toppera13603a2014-05-22 05:54:18 +00008068 return nullptr;
8069
Guy Benyei11169dd2012-12-18 14:30:41 +00008070 bool Template = Record[Idx++];
8071 NNS = NestedNameSpecifier::Create(Context, Prev, Template, T);
8072 break;
8073 }
8074
8075 case NestedNameSpecifier::Global: {
8076 NNS = NestedNameSpecifier::GlobalSpecifier(Context);
8077 // No associated value, and there can't be a prefix.
8078 break;
8079 }
Nikola Smiljanic67860242014-09-26 00:28:20 +00008080
8081 case NestedNameSpecifier::Super: {
8082 CXXRecordDecl *RD = ReadDeclAs<CXXRecordDecl>(F, Record, Idx);
8083 NNS = NestedNameSpecifier::SuperSpecifier(Context, RD);
8084 break;
8085 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008086 }
8087 Prev = NNS;
8088 }
8089 return NNS;
8090}
8091
8092NestedNameSpecifierLoc
8093ASTReader::ReadNestedNameSpecifierLoc(ModuleFile &F, const RecordData &Record,
8094 unsigned &Idx) {
8095 unsigned N = Record[Idx++];
8096 NestedNameSpecifierLocBuilder Builder;
8097 for (unsigned I = 0; I != N; ++I) {
8098 NestedNameSpecifier::SpecifierKind Kind
8099 = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
8100 switch (Kind) {
8101 case NestedNameSpecifier::Identifier: {
8102 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
8103 SourceRange Range = ReadSourceRange(F, Record, Idx);
8104 Builder.Extend(Context, II, Range.getBegin(), Range.getEnd());
8105 break;
8106 }
8107
8108 case NestedNameSpecifier::Namespace: {
8109 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
8110 SourceRange Range = ReadSourceRange(F, Record, Idx);
8111 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
8112 break;
8113 }
8114
8115 case NestedNameSpecifier::NamespaceAlias: {
8116 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
8117 SourceRange Range = ReadSourceRange(F, Record, Idx);
8118 Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd());
8119 break;
8120 }
8121
8122 case NestedNameSpecifier::TypeSpec:
8123 case NestedNameSpecifier::TypeSpecWithTemplate: {
8124 bool Template = Record[Idx++];
8125 TypeSourceInfo *T = GetTypeSourceInfo(F, Record, Idx);
8126 if (!T)
8127 return NestedNameSpecifierLoc();
8128 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
8129
8130 // FIXME: 'template' keyword location not saved anywhere, so we fake it.
8131 Builder.Extend(Context,
8132 Template? T->getTypeLoc().getBeginLoc() : SourceLocation(),
8133 T->getTypeLoc(), ColonColonLoc);
8134 break;
8135 }
8136
8137 case NestedNameSpecifier::Global: {
8138 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
8139 Builder.MakeGlobal(Context, ColonColonLoc);
8140 break;
8141 }
Nikola Smiljanic67860242014-09-26 00:28:20 +00008142
8143 case NestedNameSpecifier::Super: {
8144 CXXRecordDecl *RD = ReadDeclAs<CXXRecordDecl>(F, Record, Idx);
8145 SourceRange Range = ReadSourceRange(F, Record, Idx);
8146 Builder.MakeSuper(Context, RD, Range.getBegin(), Range.getEnd());
8147 break;
8148 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008149 }
8150 }
Nikola Smiljanic67860242014-09-26 00:28:20 +00008151
Guy Benyei11169dd2012-12-18 14:30:41 +00008152 return Builder.getWithLocInContext(Context);
8153}
8154
8155SourceRange
8156ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record,
8157 unsigned &Idx) {
8158 SourceLocation beg = ReadSourceLocation(F, Record, Idx);
8159 SourceLocation end = ReadSourceLocation(F, Record, Idx);
8160 return SourceRange(beg, end);
8161}
8162
8163/// \brief Read an integral value
8164llvm::APInt ASTReader::ReadAPInt(const RecordData &Record, unsigned &Idx) {
8165 unsigned BitWidth = Record[Idx++];
8166 unsigned NumWords = llvm::APInt::getNumWords(BitWidth);
8167 llvm::APInt Result(BitWidth, NumWords, &Record[Idx]);
8168 Idx += NumWords;
8169 return Result;
8170}
8171
8172/// \brief Read a signed integral value
8173llvm::APSInt ASTReader::ReadAPSInt(const RecordData &Record, unsigned &Idx) {
8174 bool isUnsigned = Record[Idx++];
8175 return llvm::APSInt(ReadAPInt(Record, Idx), isUnsigned);
8176}
8177
8178/// \brief Read a floating-point value
Tim Northover178723a2013-01-22 09:46:51 +00008179llvm::APFloat ASTReader::ReadAPFloat(const RecordData &Record,
8180 const llvm::fltSemantics &Sem,
8181 unsigned &Idx) {
8182 return llvm::APFloat(Sem, ReadAPInt(Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00008183}
8184
8185// \brief Read a string
8186std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) {
8187 unsigned Len = Record[Idx++];
8188 std::string Result(Record.data() + Idx, Record.data() + Idx + Len);
8189 Idx += Len;
8190 return Result;
8191}
8192
Richard Smith7ed1bc92014-12-05 22:42:13 +00008193std::string ASTReader::ReadPath(ModuleFile &F, const RecordData &Record,
8194 unsigned &Idx) {
8195 std::string Filename = ReadString(Record, Idx);
8196 ResolveImportedPath(F, Filename);
8197 return Filename;
8198}
8199
Guy Benyei11169dd2012-12-18 14:30:41 +00008200VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record,
8201 unsigned &Idx) {
8202 unsigned Major = Record[Idx++];
8203 unsigned Minor = Record[Idx++];
8204 unsigned Subminor = Record[Idx++];
8205 if (Minor == 0)
8206 return VersionTuple(Major);
8207 if (Subminor == 0)
8208 return VersionTuple(Major, Minor - 1);
8209 return VersionTuple(Major, Minor - 1, Subminor - 1);
8210}
8211
8212CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F,
8213 const RecordData &Record,
8214 unsigned &Idx) {
8215 CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx);
8216 return CXXTemporary::Create(Context, Decl);
8217}
8218
8219DiagnosticBuilder ASTReader::Diag(unsigned DiagID) {
Argyrios Kyrtzidisdc9fdaf2013-05-24 05:44:08 +00008220 return Diag(CurrentImportLoc, DiagID);
Guy Benyei11169dd2012-12-18 14:30:41 +00008221}
8222
8223DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) {
8224 return Diags.Report(Loc, DiagID);
8225}
8226
8227/// \brief Retrieve the identifier table associated with the
8228/// preprocessor.
8229IdentifierTable &ASTReader::getIdentifierTable() {
8230 return PP.getIdentifierTable();
8231}
8232
8233/// \brief Record that the given ID maps to the given switch-case
8234/// statement.
8235void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) {
Craig Toppera13603a2014-05-22 05:54:18 +00008236 assert((*CurrSwitchCaseStmts)[ID] == nullptr &&
Guy Benyei11169dd2012-12-18 14:30:41 +00008237 "Already have a SwitchCase with this ID");
8238 (*CurrSwitchCaseStmts)[ID] = SC;
8239}
8240
8241/// \brief Retrieve the switch-case statement with the given ID.
8242SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) {
Craig Toppera13603a2014-05-22 05:54:18 +00008243 assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID");
Guy Benyei11169dd2012-12-18 14:30:41 +00008244 return (*CurrSwitchCaseStmts)[ID];
8245}
8246
8247void ASTReader::ClearSwitchCaseIDs() {
8248 CurrSwitchCaseStmts->clear();
8249}
8250
8251void ASTReader::ReadComments() {
8252 std::vector<RawComment *> Comments;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00008253 for (SmallVectorImpl<std::pair<BitstreamCursor,
Guy Benyei11169dd2012-12-18 14:30:41 +00008254 serialization::ModuleFile *> >::iterator
8255 I = CommentsCursors.begin(),
8256 E = CommentsCursors.end();
8257 I != E; ++I) {
Dmitri Gribenko9ee0e302014-03-27 15:40:39 +00008258 Comments.clear();
Chris Lattner7fb3bef2013-01-20 00:56:42 +00008259 BitstreamCursor &Cursor = I->first;
Guy Benyei11169dd2012-12-18 14:30:41 +00008260 serialization::ModuleFile &F = *I->second;
8261 SavedStreamPosition SavedPosition(Cursor);
8262
8263 RecordData Record;
8264 while (true) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00008265 llvm::BitstreamEntry Entry =
8266 Cursor.advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd);
Dmitri Gribenko9ee0e302014-03-27 15:40:39 +00008267
Chris Lattner7fb3bef2013-01-20 00:56:42 +00008268 switch (Entry.Kind) {
8269 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
8270 case llvm::BitstreamEntry::Error:
8271 Error("malformed block record in AST file");
8272 return;
8273 case llvm::BitstreamEntry::EndBlock:
8274 goto NextCursor;
8275 case llvm::BitstreamEntry::Record:
8276 // The interesting case.
Guy Benyei11169dd2012-12-18 14:30:41 +00008277 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00008278 }
8279
8280 // Read a record.
8281 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00008282 switch ((CommentRecordTypes)Cursor.readRecord(Entry.ID, Record)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008283 case COMMENTS_RAW_COMMENT: {
8284 unsigned Idx = 0;
8285 SourceRange SR = ReadSourceRange(F, Record, Idx);
8286 RawComment::CommentKind Kind =
8287 (RawComment::CommentKind) Record[Idx++];
8288 bool IsTrailingComment = Record[Idx++];
8289 bool IsAlmostTrailingComment = Record[Idx++];
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00008290 Comments.push_back(new (Context) RawComment(
8291 SR, Kind, IsTrailingComment, IsAlmostTrailingComment,
8292 Context.getLangOpts().CommentOpts.ParseAllComments));
Guy Benyei11169dd2012-12-18 14:30:41 +00008293 break;
8294 }
8295 }
8296 }
Dmitri Gribenko9ee0e302014-03-27 15:40:39 +00008297 NextCursor:
8298 Context.Comments.addDeserializedComments(Comments);
Guy Benyei11169dd2012-12-18 14:30:41 +00008299 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008300}
8301
Argyrios Kyrtzidis1bde1172014-11-18 05:24:18 +00008302void ASTReader::getInputFiles(ModuleFile &F,
8303 SmallVectorImpl<serialization::InputFile> &Files) {
8304 for (unsigned I = 0, E = F.InputFilesLoaded.size(); I != E; ++I) {
8305 unsigned ID = I+1;
8306 Files.push_back(getInputFile(F, ID));
8307 }
8308}
8309
Richard Smithcd45dbc2014-04-19 03:48:30 +00008310std::string ASTReader::getOwningModuleNameForDiagnostic(const Decl *D) {
8311 // If we know the owning module, use it.
8312 if (Module *M = D->getOwningModule())
8313 return M->getFullModuleName();
8314
8315 // Otherwise, use the name of the top-level module the decl is within.
8316 if (ModuleFile *M = getOwningModuleFile(D))
8317 return M->ModuleName;
8318
8319 // Not from a module.
8320 return "";
8321}
8322
Guy Benyei11169dd2012-12-18 14:30:41 +00008323void ASTReader::finishPendingActions() {
Richard Smith851072e2014-05-19 20:59:20 +00008324 while (!PendingIdentifierInfos.empty() ||
8325 !PendingIncompleteDeclChains.empty() || !PendingDeclChains.empty() ||
Richard Smith2b9e3e32013-10-18 06:05:18 +00008326 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() ||
Richard Smitha0ce9c42014-07-29 23:23:27 +00008327 !PendingUpdateRecords.empty()) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008328 // If any identifiers with corresponding top-level declarations have
8329 // been loaded, load those declarations now.
Craig Topper79be4cd2013-07-05 04:33:53 +00008330 typedef llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2> >
8331 TopLevelDeclsMap;
8332 TopLevelDeclsMap TopLevelDecls;
8333
Guy Benyei11169dd2012-12-18 14:30:41 +00008334 while (!PendingIdentifierInfos.empty()) {
Douglas Gregor6168bd22013-02-18 15:53:43 +00008335 IdentifierInfo *II = PendingIdentifierInfos.back().first;
Richard Smithf0ae3c2d2014-03-28 17:31:23 +00008336 SmallVector<uint32_t, 4> DeclIDs =
8337 std::move(PendingIdentifierInfos.back().second);
Douglas Gregorcb15f082013-02-19 18:26:28 +00008338 PendingIdentifierInfos.pop_back();
Douglas Gregor6168bd22013-02-18 15:53:43 +00008339
8340 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]);
Guy Benyei11169dd2012-12-18 14:30:41 +00008341 }
Richard Smithf0ae3c2d2014-03-28 17:31:23 +00008342
Richard Smith851072e2014-05-19 20:59:20 +00008343 // For each decl chain that we wanted to complete while deserializing, mark
8344 // it as "still needs to be completed".
8345 for (unsigned I = 0; I != PendingIncompleteDeclChains.size(); ++I) {
8346 markIncompleteDeclChain(PendingIncompleteDeclChains[I]);
8347 }
8348 PendingIncompleteDeclChains.clear();
8349
Guy Benyei11169dd2012-12-18 14:30:41 +00008350 // Load pending declaration chains.
Richard Smithfe620d22015-03-05 23:24:12 +00008351 for (unsigned I = 0; I != PendingDeclChains.size(); ++I) {
Richard Smithfe620d22015-03-05 23:24:12 +00008352 PendingDeclChainsKnown.erase(PendingDeclChains[I]);
Richard Smithe687bf82015-03-16 20:54:07 +00008353 loadPendingDeclChain(PendingDeclChains[I]);
Richard Smithfe620d22015-03-05 23:24:12 +00008354 }
8355 assert(PendingDeclChainsKnown.empty());
Guy Benyei11169dd2012-12-18 14:30:41 +00008356 PendingDeclChains.clear();
8357
Douglas Gregor6168bd22013-02-18 15:53:43 +00008358 // Make the most recent of the top-level declarations visible.
Craig Topper79be4cd2013-07-05 04:33:53 +00008359 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
8360 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
Douglas Gregor6168bd22013-02-18 15:53:43 +00008361 IdentifierInfo *II = TLD->first;
8362 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
Argyrios Kyrtzidise5edbf92013-04-26 21:33:35 +00008363 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II);
Douglas Gregor6168bd22013-02-18 15:53:43 +00008364 }
8365 }
8366
Guy Benyei11169dd2012-12-18 14:30:41 +00008367 // Load any pending macro definitions.
8368 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008369 IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
8370 SmallVector<PendingMacroInfo, 2> GlobalIDs;
8371 GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
8372 // Initialize the macro history from chained-PCHs ahead of module imports.
Richard Smith49f906a2014-03-01 00:08:04 +00008373 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
Argyrios Kyrtzidis719736c2013-01-19 03:14:56 +00008374 ++IDIdx) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008375 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
Richard Smithe842a472014-10-22 02:05:46 +00008376 if (Info.M->Kind != MK_ImplicitModule &&
8377 Info.M->Kind != MK_ExplicitModule)
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008378 resolvePendingMacro(II, Info);
8379 }
8380 // Handle module imports.
Richard Smith49f906a2014-03-01 00:08:04 +00008381 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008382 ++IDIdx) {
8383 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
Richard Smithe842a472014-10-22 02:05:46 +00008384 if (Info.M->Kind == MK_ImplicitModule ||
8385 Info.M->Kind == MK_ExplicitModule)
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008386 resolvePendingMacro(II, Info);
Guy Benyei11169dd2012-12-18 14:30:41 +00008387 }
8388 }
8389 PendingMacroIDs.clear();
Argyrios Kyrtzidis83a6e3b2013-02-16 00:48:59 +00008390
8391 // Wire up the DeclContexts for Decls that we delayed setting until
8392 // recursive loading is completed.
8393 while (!PendingDeclContextInfos.empty()) {
8394 PendingDeclContextInfo Info = PendingDeclContextInfos.front();
8395 PendingDeclContextInfos.pop_front();
8396 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC));
8397 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC));
8398 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext());
8399 }
Richard Smith2b9e3e32013-10-18 06:05:18 +00008400
Richard Smithd1c46742014-04-30 02:24:17 +00008401 // Perform any pending declaration updates.
Richard Smithd6db68c2014-08-07 20:58:41 +00008402 while (!PendingUpdateRecords.empty()) {
Richard Smithd1c46742014-04-30 02:24:17 +00008403 auto Update = PendingUpdateRecords.pop_back_val();
8404 ReadingKindTracker ReadingKind(Read_Decl, *this);
8405 loadDeclUpdateRecords(Update.first, Update.second);
8406 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008407 }
Richard Smith8a639892015-01-24 01:07:20 +00008408
8409 // At this point, all update records for loaded decls are in place, so any
8410 // fake class definitions should have become real.
8411 assert(PendingFakeDefinitionData.empty() &&
8412 "faked up a class definition but never saw the real one");
8413
Guy Benyei11169dd2012-12-18 14:30:41 +00008414 // If we deserialized any C++ or Objective-C class definitions, any
8415 // Objective-C protocol definitions, or any redeclarable templates, make sure
8416 // that all redeclarations point to the definitions. Note that this can only
8417 // happen now, after the redeclaration chains have been fully wired.
Craig Topperc6914d02014-08-25 04:15:02 +00008418 for (Decl *D : PendingDefinitions) {
8419 if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
Richard Smith5b21db82014-04-23 18:20:42 +00008420 if (const TagType *TagT = dyn_cast<TagType>(TD->getTypeForDecl())) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008421 // Make sure that the TagType points at the definition.
8422 const_cast<TagType*>(TagT)->decl = TD;
8423 }
Richard Smith8ce51082015-03-11 01:44:51 +00008424
Craig Topperc6914d02014-08-25 04:15:02 +00008425 if (auto RD = dyn_cast<CXXRecordDecl>(D)) {
Richard Smith8ce51082015-03-11 01:44:51 +00008426 for (auto *R = getMostRecentExistingDecl(RD); R;
8427 R = R->getPreviousDecl()) {
8428 assert((R == D) ==
8429 cast<CXXRecordDecl>(R)->isThisDeclarationADefinition() &&
Richard Smith2c381642014-08-27 23:11:59 +00008430 "declaration thinks it's the definition but it isn't");
Aaron Ballman86c93902014-03-06 23:45:36 +00008431 cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData;
Richard Smith2c381642014-08-27 23:11:59 +00008432 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008433 }
8434
8435 continue;
8436 }
Richard Smith8ce51082015-03-11 01:44:51 +00008437
Craig Topperc6914d02014-08-25 04:15:02 +00008438 if (auto ID = dyn_cast<ObjCInterfaceDecl>(D)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008439 // Make sure that the ObjCInterfaceType points at the definition.
8440 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl))
8441 ->Decl = ID;
Richard Smith8ce51082015-03-11 01:44:51 +00008442
8443 for (auto *R = getMostRecentExistingDecl(ID); R; R = R->getPreviousDecl())
8444 cast<ObjCInterfaceDecl>(R)->Data = ID->Data;
8445
Guy Benyei11169dd2012-12-18 14:30:41 +00008446 continue;
8447 }
Richard Smith8ce51082015-03-11 01:44:51 +00008448
Craig Topperc6914d02014-08-25 04:15:02 +00008449 if (auto PD = dyn_cast<ObjCProtocolDecl>(D)) {
Richard Smith8ce51082015-03-11 01:44:51 +00008450 for (auto *R = getMostRecentExistingDecl(PD); R; R = R->getPreviousDecl())
8451 cast<ObjCProtocolDecl>(R)->Data = PD->Data;
8452
Guy Benyei11169dd2012-12-18 14:30:41 +00008453 continue;
8454 }
Richard Smith8ce51082015-03-11 01:44:51 +00008455
Craig Topperc6914d02014-08-25 04:15:02 +00008456 auto RTD = cast<RedeclarableTemplateDecl>(D)->getCanonicalDecl();
Richard Smith8ce51082015-03-11 01:44:51 +00008457 for (auto *R = getMostRecentExistingDecl(RTD); R; R = R->getPreviousDecl())
8458 cast<RedeclarableTemplateDecl>(R)->Common = RTD->Common;
Guy Benyei11169dd2012-12-18 14:30:41 +00008459 }
8460 PendingDefinitions.clear();
8461
8462 // Load the bodies of any functions or methods we've encountered. We do
8463 // this now (delayed) so that we can be sure that the declaration chains
8464 // have been fully wired up.
Richard Smith8ce51082015-03-11 01:44:51 +00008465 // FIXME: There seems to be no point in delaying this, it does not depend
8466 // on the redecl chains having been wired up.
Guy Benyei11169dd2012-12-18 14:30:41 +00008467 for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
8468 PBEnd = PendingBodies.end();
8469 PB != PBEnd; ++PB) {
8470 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
8471 // FIXME: Check for =delete/=default?
8472 // FIXME: Complain about ODR violations here?
8473 if (!getContext().getLangOpts().Modules || !FD->hasBody())
8474 FD->setLazyBody(PB->second);
8475 continue;
8476 }
8477
8478 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first);
8479 if (!getContext().getLangOpts().Modules || !MD->hasBody())
8480 MD->setLazyBody(PB->second);
8481 }
8482 PendingBodies.clear();
Richard Smitha0ce9c42014-07-29 23:23:27 +00008483}
8484
8485void ASTReader::diagnoseOdrViolations() {
Richard Smithbb853c72014-08-13 01:23:33 +00008486 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty())
8487 return;
8488
Richard Smitha0ce9c42014-07-29 23:23:27 +00008489 // Trigger the import of the full definition of each class that had any
8490 // odr-merging problems, so we can produce better diagnostics for them.
Richard Smithbb853c72014-08-13 01:23:33 +00008491 // These updates may in turn find and diagnose some ODR failures, so take
8492 // ownership of the set first.
8493 auto OdrMergeFailures = std::move(PendingOdrMergeFailures);
8494 PendingOdrMergeFailures.clear();
8495 for (auto &Merge : OdrMergeFailures) {
Richard Smitha0ce9c42014-07-29 23:23:27 +00008496 Merge.first->buildLookup();
8497 Merge.first->decls_begin();
8498 Merge.first->bases_begin();
8499 Merge.first->vbases_begin();
8500 for (auto *RD : Merge.second) {
8501 RD->decls_begin();
8502 RD->bases_begin();
8503 RD->vbases_begin();
8504 }
8505 }
8506
8507 // For each declaration from a merged context, check that the canonical
8508 // definition of that context also contains a declaration of the same
8509 // entity.
8510 //
8511 // Caution: this loop does things that might invalidate iterators into
8512 // PendingOdrMergeChecks. Don't turn this into a range-based for loop!
8513 while (!PendingOdrMergeChecks.empty()) {
8514 NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
8515
8516 // FIXME: Skip over implicit declarations for now. This matters for things
8517 // like implicitly-declared special member functions. This isn't entirely
8518 // correct; we can end up with multiple unmerged declarations of the same
8519 // implicit entity.
8520 if (D->isImplicit())
8521 continue;
8522
8523 DeclContext *CanonDef = D->getDeclContext();
Richard Smitha0ce9c42014-07-29 23:23:27 +00008524
8525 bool Found = false;
8526 const Decl *DCanon = D->getCanonicalDecl();
8527
Richard Smith01bdb7a2014-08-28 05:44:07 +00008528 for (auto RI : D->redecls()) {
8529 if (RI->getLexicalDeclContext() == CanonDef) {
8530 Found = true;
8531 break;
8532 }
8533 }
8534 if (Found)
8535 continue;
8536
Richard Smitha0ce9c42014-07-29 23:23:27 +00008537 llvm::SmallVector<const NamedDecl*, 4> Candidates;
Richard Smith01bdb7a2014-08-28 05:44:07 +00008538 DeclContext::lookup_result R = CanonDef->lookup(D->getDeclName());
Richard Smitha0ce9c42014-07-29 23:23:27 +00008539 for (DeclContext::lookup_iterator I = R.begin(), E = R.end();
8540 !Found && I != E; ++I) {
8541 for (auto RI : (*I)->redecls()) {
8542 if (RI->getLexicalDeclContext() == CanonDef) {
8543 // This declaration is present in the canonical definition. If it's
8544 // in the same redecl chain, it's the one we're looking for.
8545 if (RI->getCanonicalDecl() == DCanon)
8546 Found = true;
8547 else
8548 Candidates.push_back(cast<NamedDecl>(RI));
8549 break;
8550 }
8551 }
8552 }
8553
8554 if (!Found) {
Richard Smithd08aeb62014-08-28 01:33:39 +00008555 // The AST doesn't like TagDecls becoming invalid after they've been
8556 // completed. We only really need to mark FieldDecls as invalid here.
8557 if (!isa<TagDecl>(D))
8558 D->setInvalidDecl();
Richard Smith4ab3dbd2015-02-13 22:43:51 +00008559
8560 // Ensure we don't accidentally recursively enter deserialization while
8561 // we're producing our diagnostic.
8562 Deserializing RecursionGuard(this);
Richard Smitha0ce9c42014-07-29 23:23:27 +00008563
8564 std::string CanonDefModule =
8565 getOwningModuleNameForDiagnostic(cast<Decl>(CanonDef));
8566 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl)
8567 << D << getOwningModuleNameForDiagnostic(D)
8568 << CanonDef << CanonDefModule.empty() << CanonDefModule;
8569
8570 if (Candidates.empty())
8571 Diag(cast<Decl>(CanonDef)->getLocation(),
8572 diag::note_module_odr_violation_no_possible_decls) << D;
8573 else {
8574 for (unsigned I = 0, N = Candidates.size(); I != N; ++I)
8575 Diag(Candidates[I]->getLocation(),
8576 diag::note_module_odr_violation_possible_decl)
8577 << Candidates[I];
8578 }
8579
8580 DiagnosedOdrMergeFailures.insert(CanonDef);
8581 }
8582 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00008583
Richard Smith4ab3dbd2015-02-13 22:43:51 +00008584 if (OdrMergeFailures.empty())
8585 return;
8586
8587 // Ensure we don't accidentally recursively enter deserialization while
8588 // we're producing our diagnostics.
8589 Deserializing RecursionGuard(this);
8590
Richard Smithcd45dbc2014-04-19 03:48:30 +00008591 // Issue any pending ODR-failure diagnostics.
Richard Smithbb853c72014-08-13 01:23:33 +00008592 for (auto &Merge : OdrMergeFailures) {
Richard Smitha0ce9c42014-07-29 23:23:27 +00008593 // If we've already pointed out a specific problem with this class, don't
8594 // bother issuing a general "something's different" diagnostic.
David Blaikie82e95a32014-11-19 07:49:47 +00008595 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
Richard Smithcd45dbc2014-04-19 03:48:30 +00008596 continue;
8597
8598 bool Diagnosed = false;
8599 for (auto *RD : Merge.second) {
8600 // Multiple different declarations got merged together; tell the user
8601 // where they came from.
8602 if (Merge.first != RD) {
8603 // FIXME: Walk the definition, figure out what's different,
8604 // and diagnose that.
8605 if (!Diagnosed) {
8606 std::string Module = getOwningModuleNameForDiagnostic(Merge.first);
8607 Diag(Merge.first->getLocation(),
8608 diag::err_module_odr_violation_different_definitions)
8609 << Merge.first << Module.empty() << Module;
8610 Diagnosed = true;
8611 }
8612
8613 Diag(RD->getLocation(),
8614 diag::note_module_odr_violation_different_definitions)
8615 << getOwningModuleNameForDiagnostic(RD);
8616 }
8617 }
8618
8619 if (!Diagnosed) {
8620 // All definitions are updates to the same declaration. This happens if a
8621 // module instantiates the declaration of a class template specialization
8622 // and two or more other modules instantiate its definition.
8623 //
8624 // FIXME: Indicate which modules had instantiations of this definition.
8625 // FIXME: How can this even happen?
8626 Diag(Merge.first->getLocation(),
8627 diag::err_module_odr_violation_different_instantiations)
8628 << Merge.first;
8629 }
8630 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008631}
8632
8633void ASTReader::FinishedDeserializing() {
8634 assert(NumCurrentElementsDeserializing &&
8635 "FinishedDeserializing not paired with StartedDeserializing");
8636 if (NumCurrentElementsDeserializing == 1) {
8637 // We decrease NumCurrentElementsDeserializing only after pending actions
8638 // are finished, to avoid recursively re-calling finishPendingActions().
8639 finishPendingActions();
8640 }
8641 --NumCurrentElementsDeserializing;
8642
Richard Smitha0ce9c42014-07-29 23:23:27 +00008643 if (NumCurrentElementsDeserializing == 0) {
Richard Smith9e2341d2015-03-23 03:25:59 +00008644 // Propagate exception specification updates along redeclaration chains.
Richard Smith7226f2a2015-03-23 19:54:56 +00008645 while (!PendingExceptionSpecUpdates.empty()) {
8646 auto Updates = std::move(PendingExceptionSpecUpdates);
8647 PendingExceptionSpecUpdates.clear();
8648 for (auto Update : Updates) {
8649 auto *FPT = Update.second->getType()->castAs<FunctionProtoType>();
8650 SemaObj->UpdateExceptionSpec(Update.second,
8651 FPT->getExtProtoInfo().ExceptionSpec);
8652 }
Richard Smith9e2341d2015-03-23 03:25:59 +00008653 }
8654
Richard Smitha0ce9c42014-07-29 23:23:27 +00008655 diagnoseOdrViolations();
8656
Richard Smith04d05b52014-03-23 00:27:18 +00008657 // We are not in recursive loading, so it's safe to pass the "interesting"
8658 // decls to the consumer.
Richard Smitha0ce9c42014-07-29 23:23:27 +00008659 if (Consumer)
8660 PassInterestingDeclsToConsumer();
Guy Benyei11169dd2012-12-18 14:30:41 +00008661 }
8662}
8663
Argyrios Kyrtzidise5edbf92013-04-26 21:33:35 +00008664void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) {
Richard Smith9e2341d2015-03-23 03:25:59 +00008665 if (IdentifierInfo *II = Name.getAsIdentifierInfo()) {
8666 // Remove any fake results before adding any real ones.
8667 auto It = PendingFakeLookupResults.find(II);
8668 if (It != PendingFakeLookupResults.end()) {
8669 for (auto *ND : PendingFakeLookupResults[II])
8670 SemaObj->IdResolver.RemoveDecl(ND);
Ben Langmuireb8bd2d2015-04-10 22:25:42 +00008671 // FIXME: this works around module+PCH performance issue.
8672 // Rather than erase the result from the map, which is O(n), just clear
8673 // the vector of NamedDecls.
8674 It->second.clear();
Richard Smith9e2341d2015-03-23 03:25:59 +00008675 }
8676 }
Argyrios Kyrtzidise5edbf92013-04-26 21:33:35 +00008677
8678 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
8679 SemaObj->TUScope->AddDecl(D);
8680 } else if (SemaObj->TUScope) {
8681 // Adding the decl to IdResolver may have failed because it was already in
8682 // (even though it was not added in scope). If it is already in, make sure
8683 // it gets in the scope as well.
8684 if (std::find(SemaObj->IdResolver.begin(Name),
8685 SemaObj->IdResolver.end(), D) != SemaObj->IdResolver.end())
8686 SemaObj->TUScope->AddDecl(D);
8687 }
8688}
8689
Nico Weber824285e2014-05-08 04:26:47 +00008690ASTReader::ASTReader(Preprocessor &PP, ASTContext &Context, StringRef isysroot,
8691 bool DisableValidation, bool AllowASTWithCompilerErrors,
8692 bool AllowConfigurationMismatch, bool ValidateSystemInputs,
Ben Langmuir2cb4a782014-02-05 22:21:15 +00008693 bool UseGlobalIndex)
Craig Toppera13603a2014-05-22 05:54:18 +00008694 : Listener(new PCHValidator(PP, *this)), DeserializationListener(nullptr),
Nico Weber824285e2014-05-08 04:26:47 +00008695 OwnsDeserializationListener(false), SourceMgr(PP.getSourceManager()),
Craig Toppera13603a2014-05-22 05:54:18 +00008696 FileMgr(PP.getFileManager()), Diags(PP.getDiagnostics()),
8697 SemaObj(nullptr), PP(PP), Context(Context), Consumer(nullptr),
8698 ModuleMgr(PP.getFileManager()), isysroot(isysroot),
8699 DisableValidation(DisableValidation),
Nico Weber824285e2014-05-08 04:26:47 +00008700 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
8701 AllowConfigurationMismatch(AllowConfigurationMismatch),
8702 ValidateSystemInputs(ValidateSystemInputs),
8703 UseGlobalIndex(UseGlobalIndex), TriedLoadingGlobalIndex(false),
Richard Smith053f6c62014-05-16 23:01:30 +00008704 CurrSwitchCaseStmts(&SwitchCaseStmts),
Nico Weber824285e2014-05-08 04:26:47 +00008705 NumSLocEntriesRead(0), TotalNumSLocEntries(0), NumStatementsRead(0),
8706 TotalNumStatements(0), NumMacrosRead(0), TotalNumMacros(0),
8707 NumIdentifierLookups(0), NumIdentifierLookupHits(0), NumSelectorsRead(0),
8708 NumMethodPoolEntriesRead(0), NumMethodPoolLookups(0),
8709 NumMethodPoolHits(0), NumMethodPoolTableLookups(0),
8710 NumMethodPoolTableHits(0), TotalNumMethodPoolEntries(0),
8711 NumLexicalDeclContextsRead(0), TotalLexicalDeclContexts(0),
8712 NumVisibleDeclContextsRead(0), TotalVisibleDeclContexts(0),
8713 TotalModulesSizeInBits(0), NumCurrentElementsDeserializing(0),
Richard Smithc2bb8182015-03-24 06:36:48 +00008714 PassingDeclsToConsumer(false), ReadingKind(Read_None) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008715 SourceMgr.setExternalSLocEntrySource(this);
8716}
8717
8718ASTReader::~ASTReader() {
Nico Weber824285e2014-05-08 04:26:47 +00008719 if (OwnsDeserializationListener)
8720 delete DeserializationListener;
8721
Guy Benyei11169dd2012-12-18 14:30:41 +00008722 for (DeclContextVisibleUpdatesPending::iterator
8723 I = PendingVisibleUpdates.begin(),
8724 E = PendingVisibleUpdates.end();
8725 I != E; ++I) {
8726 for (DeclContextVisibleUpdates::iterator J = I->second.begin(),
8727 F = I->second.end();
8728 J != F; ++J)
8729 delete J->first;
8730 }
8731}