blob: 529af4ecbfe3b826159d99f44f78017e174aee97 [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;
3207
3208 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 }
3213
3214 F.LocalNumCXXBaseSpecifiers = Record[0];
Chris Lattner0e6c9402013-01-20 02:38:54 +00003215 F.CXXBaseSpecifiersOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003216 NumCXXBaseSpecifiersLoaded += F.LocalNumCXXBaseSpecifiers;
3217 break;
3218 }
3219
3220 case DIAG_PRAGMA_MAPPINGS:
3221 if (F.PragmaDiagMappings.empty())
3222 F.PragmaDiagMappings.swap(Record);
3223 else
3224 F.PragmaDiagMappings.insert(F.PragmaDiagMappings.end(),
3225 Record.begin(), Record.end());
3226 break;
3227
3228 case CUDA_SPECIAL_DECL_REFS:
3229 // Later tables overwrite earlier ones.
3230 // FIXME: Modules will have trouble with this.
3231 CUDASpecialDeclRefs.clear();
3232 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3233 CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
3234 break;
3235
3236 case HEADER_SEARCH_TABLE: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00003237 F.HeaderFileInfoTableData = Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003238 F.LocalNumHeaderFileInfos = Record[1];
Guy Benyei11169dd2012-12-18 14:30:41 +00003239 if (Record[0]) {
3240 F.HeaderFileInfoTable
3241 = HeaderFileInfoLookupTable::Create(
3242 (const unsigned char *)F.HeaderFileInfoTableData + Record[0],
3243 (const unsigned char *)F.HeaderFileInfoTableData,
3244 HeaderFileInfoTrait(*this, F,
3245 &PP.getHeaderSearchInfo(),
Chris Lattner0e6c9402013-01-20 02:38:54 +00003246 Blob.data() + Record[2]));
Guy Benyei11169dd2012-12-18 14:30:41 +00003247
3248 PP.getHeaderSearchInfo().SetExternalSource(this);
3249 if (!PP.getHeaderSearchInfo().getExternalLookup())
3250 PP.getHeaderSearchInfo().SetExternalLookup(this);
3251 }
3252 break;
3253 }
3254
3255 case FP_PRAGMA_OPTIONS:
3256 // Later tables overwrite earlier ones.
3257 FPPragmaOptions.swap(Record);
3258 break;
3259
3260 case OPENCL_EXTENSIONS:
3261 // Later tables overwrite earlier ones.
3262 OpenCLExtensions.swap(Record);
3263 break;
3264
3265 case TENTATIVE_DEFINITIONS:
3266 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3267 TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I]));
3268 break;
3269
3270 case KNOWN_NAMESPACES:
3271 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3272 KnownNamespaces.push_back(getGlobalDeclID(F, Record[I]));
3273 break;
Nick Lewycky8334af82013-01-26 00:35:08 +00003274
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00003275 case UNDEFINED_BUT_USED:
3276 if (UndefinedButUsed.size() % 2 != 0) {
3277 Error("Invalid existing UndefinedButUsed");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003278 return Failure;
Nick Lewycky8334af82013-01-26 00:35:08 +00003279 }
3280
3281 if (Record.size() % 2 != 0) {
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00003282 Error("invalid undefined-but-used record");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003283 return Failure;
Nick Lewycky8334af82013-01-26 00:35:08 +00003284 }
3285 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00003286 UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++]));
3287 UndefinedButUsed.push_back(
Nick Lewycky8334af82013-01-26 00:35:08 +00003288 ReadSourceLocation(F, Record, I).getRawEncoding());
3289 }
3290 break;
3291
Guy Benyei11169dd2012-12-18 14:30:41 +00003292 case IMPORTED_MODULES: {
Richard Smithe842a472014-10-22 02:05:46 +00003293 if (F.Kind != MK_ImplicitModule && F.Kind != MK_ExplicitModule) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003294 // If we aren't loading a module (which has its own exports), make
3295 // all of the imported modules visible.
3296 // FIXME: Deal with macros-only imports.
Richard Smith56be7542014-03-21 00:33:59 +00003297 for (unsigned I = 0, N = Record.size(); I != N; /**/) {
3298 unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]);
3299 SourceLocation Loc = ReadSourceLocation(F, Record, I);
3300 if (GlobalID)
Aaron Ballman4f45b712014-03-21 15:22:56 +00003301 ImportedModules.push_back(ImportedSubmodule(GlobalID, Loc));
Guy Benyei11169dd2012-12-18 14:30:41 +00003302 }
3303 }
3304 break;
3305 }
3306
3307 case LOCAL_REDECLARATIONS: {
3308 F.RedeclarationChains.swap(Record);
3309 break;
3310 }
3311
3312 case LOCAL_REDECLARATIONS_MAP: {
3313 if (F.LocalNumRedeclarationsInMap != 0) {
3314 Error("duplicate LOCAL_REDECLARATIONS_MAP record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003315 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003316 }
3317
3318 F.LocalNumRedeclarationsInMap = Record[0];
Chris Lattner0e6c9402013-01-20 02:38:54 +00003319 F.RedeclarationsMap = (const LocalRedeclarationsInfo *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003320 break;
3321 }
3322
Guy Benyei11169dd2012-12-18 14:30:41 +00003323 case MACRO_OFFSET: {
3324 if (F.LocalNumMacros != 0) {
3325 Error("duplicate MACRO_OFFSET record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003326 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003327 }
Chris Lattner0e6c9402013-01-20 02:38:54 +00003328 F.MacroOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003329 F.LocalNumMacros = Record[0];
3330 unsigned LocalBaseMacroID = Record[1];
3331 F.BaseMacroID = getTotalNumMacros();
3332
3333 if (F.LocalNumMacros > 0) {
3334 // Introduce the global -> local mapping for macros within this module.
3335 GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F));
3336
3337 // Introduce the local -> global mapping for macros within this module.
3338 F.MacroRemap.insertOrReplace(
3339 std::make_pair(LocalBaseMacroID,
3340 F.BaseMacroID - LocalBaseMacroID));
Ben Langmuir52ca6782014-10-20 16:27:32 +00003341
3342 MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros);
Guy Benyei11169dd2012-12-18 14:30:41 +00003343 }
3344 break;
3345 }
3346
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00003347 case MACRO_TABLE: {
3348 // FIXME: Not used yet.
Guy Benyei11169dd2012-12-18 14:30:41 +00003349 break;
3350 }
Richard Smithe40f2ba2013-08-07 21:41:30 +00003351
3352 case LATE_PARSED_TEMPLATE: {
3353 LateParsedTemplates.append(Record.begin(), Record.end());
3354 break;
3355 }
Dario Domizioli13a0a382014-05-23 12:13:25 +00003356
3357 case OPTIMIZE_PRAGMA_OPTIONS:
3358 if (Record.size() != 1) {
3359 Error("invalid pragma optimize record");
3360 return Failure;
3361 }
3362 OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]);
3363 break;
Nico Weber72889432014-09-06 01:25:55 +00003364
3365 case UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES:
3366 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3367 UnusedLocalTypedefNameCandidates.push_back(
3368 getGlobalDeclID(F, Record[I]));
3369 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00003370 }
3371 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003372}
3373
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003374ASTReader::ASTReadResult
3375ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F,
3376 const ModuleFile *ImportedBy,
3377 unsigned ClientLoadCapabilities) {
3378 unsigned Idx = 0;
Richard Smith7ed1bc92014-12-05 22:42:13 +00003379 F.ModuleMapPath = ReadPath(F, Record, Idx);
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003380
Richard Smithe842a472014-10-22 02:05:46 +00003381 if (F.Kind == MK_ExplicitModule) {
3382 // For an explicitly-loaded module, we don't care whether the original
3383 // module map file exists or matches.
3384 return Success;
3385 }
3386
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003387 // Try to resolve ModuleName in the current header search context and
3388 // verify that it is found in the same module map file as we saved. If the
3389 // top-level AST file is a main file, skip this check because there is no
3390 // usable header search context.
3391 assert(!F.ModuleName.empty() &&
Richard Smithe842a472014-10-22 02:05:46 +00003392 "MODULE_NAME should come before MODULE_MAP_FILE");
3393 if (F.Kind == MK_ImplicitModule &&
3394 (*ModuleMgr.begin())->Kind != MK_MainFile) {
3395 // An implicitly-loaded module file should have its module listed in some
3396 // module map file that we've already loaded.
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003397 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName);
Richard Smithe842a472014-10-22 02:05:46 +00003398 auto &Map = PP.getHeaderSearchInfo().getModuleMap();
3399 const FileEntry *ModMap = M ? Map.getModuleMapFileForUniquing(M) : nullptr;
3400 if (!ModMap) {
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003401 assert(ImportedBy && "top-level import should be verified");
3402 if ((ClientLoadCapabilities & ARR_Missing) == 0)
Richard Smithe842a472014-10-22 02:05:46 +00003403 Diag(diag::err_imported_module_not_found) << F.ModuleName << F.FileName
3404 << ImportedBy->FileName
3405 << F.ModuleMapPath;
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003406 return Missing;
3407 }
3408
Richard Smithe842a472014-10-22 02:05:46 +00003409 assert(M->Name == F.ModuleName && "found module with different name");
3410
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003411 // Check the primary module map file.
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003412 const FileEntry *StoredModMap = FileMgr.getFile(F.ModuleMapPath);
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003413 if (StoredModMap == nullptr || StoredModMap != ModMap) {
3414 assert(ModMap && "found module is missing module map file");
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003415 assert(ImportedBy && "top-level import should be verified");
3416 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3417 Diag(diag::err_imported_module_modmap_changed)
3418 << F.ModuleName << ImportedBy->FileName
3419 << ModMap->getName() << F.ModuleMapPath;
3420 return OutOfDate;
3421 }
3422
3423 llvm::SmallPtrSet<const FileEntry *, 1> AdditionalStoredMaps;
3424 for (unsigned I = 0, N = Record[Idx++]; I < N; ++I) {
3425 // FIXME: we should use input files rather than storing names.
Richard Smith7ed1bc92014-12-05 22:42:13 +00003426 std::string Filename = ReadPath(F, Record, Idx);
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003427 const FileEntry *F =
3428 FileMgr.getFile(Filename, false, false);
3429 if (F == nullptr) {
3430 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3431 Error("could not find file '" + Filename +"' referenced by AST file");
3432 return OutOfDate;
3433 }
3434 AdditionalStoredMaps.insert(F);
3435 }
3436
3437 // Check any additional module map files (e.g. module.private.modulemap)
3438 // that are not in the pcm.
3439 if (auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) {
3440 for (const FileEntry *ModMap : *AdditionalModuleMaps) {
3441 // Remove files that match
3442 // Note: SmallPtrSet::erase is really remove
3443 if (!AdditionalStoredMaps.erase(ModMap)) {
3444 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3445 Diag(diag::err_module_different_modmap)
3446 << F.ModuleName << /*new*/0 << ModMap->getName();
3447 return OutOfDate;
3448 }
3449 }
3450 }
3451
3452 // Check any additional module map files that are in the pcm, but not
3453 // found in header search. Cases that match are already removed.
3454 for (const FileEntry *ModMap : AdditionalStoredMaps) {
3455 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3456 Diag(diag::err_module_different_modmap)
3457 << F.ModuleName << /*not new*/1 << ModMap->getName();
3458 return OutOfDate;
3459 }
3460 }
3461
3462 if (Listener)
3463 Listener->ReadModuleMapFile(F.ModuleMapPath);
3464 return Success;
3465}
3466
3467
Douglas Gregorc1489562013-02-12 23:36:21 +00003468/// \brief Move the given method to the back of the global list of methods.
3469static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) {
3470 // Find the entry for this selector in the method pool.
3471 Sema::GlobalMethodPool::iterator Known
3472 = S.MethodPool.find(Method->getSelector());
3473 if (Known == S.MethodPool.end())
3474 return;
3475
3476 // Retrieve the appropriate method list.
3477 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
3478 : Known->second.second;
3479 bool Found = false;
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00003480 for (ObjCMethodList *List = &Start; List; List = List->getNext()) {
Douglas Gregorc1489562013-02-12 23:36:21 +00003481 if (!Found) {
Nico Weber2e0c8f72014-12-27 03:58:08 +00003482 if (List->getMethod() == Method) {
Douglas Gregorc1489562013-02-12 23:36:21 +00003483 Found = true;
3484 } else {
3485 // Keep searching.
3486 continue;
3487 }
3488 }
3489
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00003490 if (List->getNext())
Nico Weber2e0c8f72014-12-27 03:58:08 +00003491 List->setMethod(List->getNext()->getMethod());
Douglas Gregorc1489562013-02-12 23:36:21 +00003492 else
Nico Weber2e0c8f72014-12-27 03:58:08 +00003493 List->setMethod(Method);
Douglas Gregorc1489562013-02-12 23:36:21 +00003494 }
3495}
3496
Richard Smithe657bbd2014-07-18 22:13:40 +00003497void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner,
3498 bool FromFinalization) {
3499 // FIXME: Only do this if Owner->NameVisibility == AllVisible.
Richard Smith57721ac2014-07-21 04:10:40 +00003500 for (Decl *D : Names.HiddenDecls) {
Richard Smith49f906a2014-03-01 00:08:04 +00003501 bool wasHidden = D->Hidden;
3502 D->Hidden = false;
Guy Benyei11169dd2012-12-18 14:30:41 +00003503
Richard Smith49f906a2014-03-01 00:08:04 +00003504 if (wasHidden && SemaObj) {
3505 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) {
3506 moveMethodToBackOfGlobalList(*SemaObj, Method);
Douglas Gregorc1489562013-02-12 23:36:21 +00003507 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003508 }
3509 }
Richard Smith49f906a2014-03-01 00:08:04 +00003510
Richard Smithe657bbd2014-07-18 22:13:40 +00003511 assert((FromFinalization || Owner->NameVisibility >= Module::MacrosVisible) &&
3512 "nothing to make visible?");
Richard Smithdaa69e02014-07-25 04:40:03 +00003513 for (const auto &Macro : Names.HiddenMacros) {
3514 if (FromFinalization)
3515 PP.appendMacroDirective(Macro.first,
3516 Macro.second->import(PP, SourceLocation()));
3517 else
3518 installImportedMacro(Macro.first, Macro.second, Owner);
3519 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003520}
3521
Richard Smith49f906a2014-03-01 00:08:04 +00003522void ASTReader::makeModuleVisible(Module *Mod,
Argyrios Kyrtzidis125df052013-02-01 16:36:12 +00003523 Module::NameVisibilityKind NameVisibility,
Douglas Gregorfb912652013-03-20 21:10:35 +00003524 SourceLocation ImportLoc,
3525 bool Complain) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003526 llvm::SmallPtrSet<Module *, 4> Visited;
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003527 SmallVector<Module *, 4> Stack;
Robert Wilhelm25284cc2013-08-23 16:11:15 +00003528 Stack.push_back(Mod);
Guy Benyei11169dd2012-12-18 14:30:41 +00003529 while (!Stack.empty()) {
Robert Wilhelm25284cc2013-08-23 16:11:15 +00003530 Mod = Stack.pop_back_val();
Guy Benyei11169dd2012-12-18 14:30:41 +00003531
3532 if (NameVisibility <= Mod->NameVisibility) {
Robert Wilhelm25284cc2013-08-23 16:11:15 +00003533 // This module already has this level of visibility (or greater), so
Guy Benyei11169dd2012-12-18 14:30:41 +00003534 // there is nothing more to do.
3535 continue;
3536 }
Richard Smith49f906a2014-03-01 00:08:04 +00003537
Guy Benyei11169dd2012-12-18 14:30:41 +00003538 if (!Mod->isAvailable()) {
3539 // Modules that aren't available cannot be made visible.
3540 continue;
3541 }
3542
3543 // Update the module's name visibility.
Richard Smith49f906a2014-03-01 00:08:04 +00003544 if (NameVisibility >= Module::MacrosVisible &&
3545 Mod->NameVisibility < Module::MacrosVisible)
3546 Mod->MacroVisibilityLoc = ImportLoc;
Guy Benyei11169dd2012-12-18 14:30:41 +00003547 Mod->NameVisibility = NameVisibility;
Richard Smith49f906a2014-03-01 00:08:04 +00003548
Guy Benyei11169dd2012-12-18 14:30:41 +00003549 // If we've already deserialized any names from this module,
3550 // mark them as visible.
3551 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
3552 if (Hidden != HiddenNamesMap.end()) {
Richard Smith57721ac2014-07-21 04:10:40 +00003553 auto HiddenNames = std::move(*Hidden);
Guy Benyei11169dd2012-12-18 14:30:41 +00003554 HiddenNamesMap.erase(Hidden);
Richard Smith57721ac2014-07-21 04:10:40 +00003555 makeNamesVisible(HiddenNames.second, HiddenNames.first,
3556 /*FromFinalization*/false);
3557 assert(HiddenNamesMap.find(Mod) == HiddenNamesMap.end() &&
3558 "making names visible added hidden names");
Guy Benyei11169dd2012-12-18 14:30:41 +00003559 }
Dmitri Gribenkoe9bcf5b2013-11-04 21:51:33 +00003560
Guy Benyei11169dd2012-12-18 14:30:41 +00003561 // Push any exported modules onto the stack to be marked as visible.
Argyrios Kyrtzidis8739f7b2013-02-19 19:34:40 +00003562 SmallVector<Module *, 16> Exports;
3563 Mod->getExportedModules(Exports);
3564 for (SmallVectorImpl<Module *>::iterator
3565 I = Exports.begin(), E = Exports.end(); I != E; ++I) {
3566 Module *Exported = *I;
David Blaikie82e95a32014-11-19 07:49:47 +00003567 if (Visited.insert(Exported).second)
Argyrios Kyrtzidis8739f7b2013-02-19 19:34:40 +00003568 Stack.push_back(Exported);
Guy Benyei11169dd2012-12-18 14:30:41 +00003569 }
Douglas Gregorfb912652013-03-20 21:10:35 +00003570
3571 // Detect any conflicts.
3572 if (Complain) {
3573 assert(ImportLoc.isValid() && "Missing import location");
3574 for (unsigned I = 0, N = Mod->Conflicts.size(); I != N; ++I) {
3575 if (Mod->Conflicts[I].Other->NameVisibility >= NameVisibility) {
3576 Diag(ImportLoc, diag::warn_module_conflict)
3577 << Mod->getFullModuleName()
3578 << Mod->Conflicts[I].Other->getFullModuleName()
3579 << Mod->Conflicts[I].Message;
3580 // FIXME: Need note where the other module was imported.
3581 }
3582 }
3583 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003584 }
3585}
3586
Douglas Gregore060e572013-01-25 01:03:03 +00003587bool ASTReader::loadGlobalIndex() {
3588 if (GlobalIndex)
3589 return false;
3590
3591 if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
3592 !Context.getLangOpts().Modules)
3593 return true;
3594
3595 // Try to load the global index.
3596 TriedLoadingGlobalIndex = true;
3597 StringRef ModuleCachePath
3598 = getPreprocessor().getHeaderSearchInfo().getModuleCachePath();
3599 std::pair<GlobalModuleIndex *, GlobalModuleIndex::ErrorCode> Result
Douglas Gregor7029ce12013-03-19 00:28:20 +00003600 = GlobalModuleIndex::readIndex(ModuleCachePath);
Douglas Gregore060e572013-01-25 01:03:03 +00003601 if (!Result.first)
3602 return true;
3603
3604 GlobalIndex.reset(Result.first);
Douglas Gregor7211ac12013-01-25 23:32:03 +00003605 ModuleMgr.setGlobalIndex(GlobalIndex.get());
Douglas Gregore060e572013-01-25 01:03:03 +00003606 return false;
3607}
3608
3609bool ASTReader::isGlobalIndexUnavailable() const {
3610 return Context.getLangOpts().Modules && UseGlobalIndex &&
3611 !hasGlobalIndex() && TriedLoadingGlobalIndex;
3612}
3613
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003614static void updateModuleTimestamp(ModuleFile &MF) {
3615 // Overwrite the timestamp file contents so that file's mtime changes.
3616 std::string TimestampFilename = MF.getTimestampFilename();
Rafael Espindoladae941a2014-08-25 18:17:04 +00003617 std::error_code EC;
3618 llvm::raw_fd_ostream OS(TimestampFilename, EC, llvm::sys::fs::F_Text);
3619 if (EC)
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003620 return;
3621 OS << "Timestamp file\n";
3622}
3623
Guy Benyei11169dd2012-12-18 14:30:41 +00003624ASTReader::ASTReadResult ASTReader::ReadAST(const std::string &FileName,
3625 ModuleKind Type,
3626 SourceLocation ImportLoc,
3627 unsigned ClientLoadCapabilities) {
Argyrios Kyrtzidisdc9fdaf2013-05-24 05:44:08 +00003628 llvm::SaveAndRestore<SourceLocation>
3629 SetCurImportLocRAII(CurrentImportLoc, ImportLoc);
3630
Richard Smithd1c46742014-04-30 02:24:17 +00003631 // Defer any pending actions until we get to the end of reading the AST file.
3632 Deserializing AnASTFile(this);
3633
Guy Benyei11169dd2012-12-18 14:30:41 +00003634 // Bump the generation number.
Richard Smith053f6c62014-05-16 23:01:30 +00003635 unsigned PreviousGeneration = incrementGeneration(Context);
Guy Benyei11169dd2012-12-18 14:30:41 +00003636
3637 unsigned NumModules = ModuleMgr.size();
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003638 SmallVector<ImportedModule, 4> Loaded;
Guy Benyei11169dd2012-12-18 14:30:41 +00003639 switch(ASTReadResult ReadResult = ReadASTCore(FileName, Type, ImportLoc,
Craig Toppera13603a2014-05-22 05:54:18 +00003640 /*ImportedBy=*/nullptr, Loaded,
Ben Langmuir487ea142014-10-23 18:05:36 +00003641 0, 0, 0,
Guy Benyei11169dd2012-12-18 14:30:41 +00003642 ClientLoadCapabilities)) {
3643 case Failure:
Douglas Gregor7029ce12013-03-19 00:28:20 +00003644 case Missing:
Guy Benyei11169dd2012-12-18 14:30:41 +00003645 case OutOfDate:
3646 case VersionMismatch:
3647 case ConfigurationMismatch:
Ben Langmuir9801b252014-06-20 00:24:56 +00003648 case HadErrors: {
3649 llvm::SmallPtrSet<ModuleFile *, 4> LoadedSet;
3650 for (const ImportedModule &IM : Loaded)
3651 LoadedSet.insert(IM.Mod);
3652
Douglas Gregor7029ce12013-03-19 00:28:20 +00003653 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, ModuleMgr.end(),
Ben Langmuir9801b252014-06-20 00:24:56 +00003654 LoadedSet,
Douglas Gregor7029ce12013-03-19 00:28:20 +00003655 Context.getLangOpts().Modules
3656 ? &PP.getHeaderSearchInfo().getModuleMap()
Craig Toppera13603a2014-05-22 05:54:18 +00003657 : nullptr);
Douglas Gregore060e572013-01-25 01:03:03 +00003658
3659 // If we find that any modules are unusable, the global index is going
3660 // to be out-of-date. Just remove it.
3661 GlobalIndex.reset();
Craig Toppera13603a2014-05-22 05:54:18 +00003662 ModuleMgr.setGlobalIndex(nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00003663 return ReadResult;
Ben Langmuir9801b252014-06-20 00:24:56 +00003664 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003665 case Success:
3666 break;
3667 }
3668
3669 // Here comes stuff that we only do once the entire chain is loaded.
3670
3671 // Load the AST blocks of all of the modules that we loaded.
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003672 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
3673 MEnd = Loaded.end();
Guy Benyei11169dd2012-12-18 14:30:41 +00003674 M != MEnd; ++M) {
3675 ModuleFile &F = *M->Mod;
3676
3677 // Read the AST block.
Ben Langmuir2c9af442014-04-10 17:57:43 +00003678 if (ASTReadResult Result = ReadASTBlock(F, ClientLoadCapabilities))
3679 return Result;
Guy Benyei11169dd2012-12-18 14:30:41 +00003680
3681 // Once read, set the ModuleFile bit base offset and update the size in
3682 // bits of all files we've seen.
3683 F.GlobalBitOffset = TotalModulesSizeInBits;
3684 TotalModulesSizeInBits += F.SizeInBits;
3685 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F));
3686
3687 // Preload SLocEntries.
3688 for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) {
3689 int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID;
3690 // Load it through the SourceManager and don't call ReadSLocEntry()
3691 // directly because the entry may have already been loaded in which case
3692 // calling ReadSLocEntry() directly would trigger an assertion in
3693 // SourceManager.
3694 SourceMgr.getLoadedSLocEntryByID(Index);
3695 }
3696 }
3697
Douglas Gregor603cd862013-03-22 18:50:14 +00003698 // Setup the import locations and notify the module manager that we've
3699 // committed to these module files.
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003700 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
3701 MEnd = Loaded.end();
Guy Benyei11169dd2012-12-18 14:30:41 +00003702 M != MEnd; ++M) {
3703 ModuleFile &F = *M->Mod;
Douglas Gregor603cd862013-03-22 18:50:14 +00003704
3705 ModuleMgr.moduleFileAccepted(&F);
3706
3707 // Set the import location.
Argyrios Kyrtzidis71c1af82013-02-01 16:36:14 +00003708 F.DirectImportLoc = ImportLoc;
Guy Benyei11169dd2012-12-18 14:30:41 +00003709 if (!M->ImportedBy)
3710 F.ImportLoc = M->ImportLoc;
3711 else
3712 F.ImportLoc = ReadSourceLocation(*M->ImportedBy,
3713 M->ImportLoc.getRawEncoding());
3714 }
3715
3716 // Mark all of the identifiers in the identifier table as being out of date,
3717 // so that various accessors know to check the loaded modules when the
3718 // identifier is used.
3719 for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(),
3720 IdEnd = PP.getIdentifierTable().end();
3721 Id != IdEnd; ++Id)
3722 Id->second->setOutOfDate(true);
3723
3724 // Resolve any unresolved module exports.
Douglas Gregorfb912652013-03-20 21:10:35 +00003725 for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) {
3726 UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I];
Guy Benyei11169dd2012-12-18 14:30:41 +00003727 SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID);
3728 Module *ResolvedMod = getSubmodule(GlobalID);
Douglas Gregorfb912652013-03-20 21:10:35 +00003729
3730 switch (Unresolved.Kind) {
3731 case UnresolvedModuleRef::Conflict:
3732 if (ResolvedMod) {
3733 Module::Conflict Conflict;
3734 Conflict.Other = ResolvedMod;
3735 Conflict.Message = Unresolved.String.str();
3736 Unresolved.Mod->Conflicts.push_back(Conflict);
3737 }
3738 continue;
3739
3740 case UnresolvedModuleRef::Import:
Guy Benyei11169dd2012-12-18 14:30:41 +00003741 if (ResolvedMod)
3742 Unresolved.Mod->Imports.push_back(ResolvedMod);
3743 continue;
Guy Benyei11169dd2012-12-18 14:30:41 +00003744
Douglas Gregorfb912652013-03-20 21:10:35 +00003745 case UnresolvedModuleRef::Export:
3746 if (ResolvedMod || Unresolved.IsWildcard)
3747 Unresolved.Mod->Exports.push_back(
3748 Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard));
3749 continue;
3750 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003751 }
Douglas Gregorfb912652013-03-20 21:10:35 +00003752 UnresolvedModuleRefs.clear();
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003753
3754 // FIXME: How do we load the 'use'd modules? They may not be submodules.
3755 // Might be unnecessary as use declarations are only used to build the
3756 // module itself.
Guy Benyei11169dd2012-12-18 14:30:41 +00003757
3758 InitializeContext();
3759
Richard Smith3d8e97e2013-10-18 06:54:39 +00003760 if (SemaObj)
3761 UpdateSema();
3762
Guy Benyei11169dd2012-12-18 14:30:41 +00003763 if (DeserializationListener)
3764 DeserializationListener->ReaderInitialized(this);
3765
3766 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
3767 if (!PrimaryModule.OriginalSourceFileID.isInvalid()) {
3768 PrimaryModule.OriginalSourceFileID
3769 = FileID::get(PrimaryModule.SLocEntryBaseID
3770 + PrimaryModule.OriginalSourceFileID.getOpaqueValue() - 1);
3771
3772 // If this AST file is a precompiled preamble, then set the
3773 // preamble file ID of the source manager to the file source file
3774 // from which the preamble was built.
3775 if (Type == MK_Preamble) {
3776 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID);
3777 } else if (Type == MK_MainFile) {
3778 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID);
3779 }
3780 }
3781
3782 // For any Objective-C class definitions we have already loaded, make sure
3783 // that we load any additional categories.
3784 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
3785 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
3786 ObjCClassesLoaded[I],
3787 PreviousGeneration);
3788 }
Douglas Gregore060e572013-01-25 01:03:03 +00003789
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003790 if (PP.getHeaderSearchInfo()
3791 .getHeaderSearchOpts()
3792 .ModulesValidateOncePerBuildSession) {
3793 // Now we are certain that the module and all modules it depends on are
3794 // up to date. Create or update timestamp files for modules that are
3795 // located in the module cache (not for PCH files that could be anywhere
3796 // in the filesystem).
3797 for (unsigned I = 0, N = Loaded.size(); I != N; ++I) {
3798 ImportedModule &M = Loaded[I];
Richard Smithe842a472014-10-22 02:05:46 +00003799 if (M.Mod->Kind == MK_ImplicitModule) {
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003800 updateModuleTimestamp(*M.Mod);
3801 }
3802 }
3803 }
3804
Guy Benyei11169dd2012-12-18 14:30:41 +00003805 return Success;
3806}
3807
Ben Langmuir487ea142014-10-23 18:05:36 +00003808static ASTFileSignature readASTFileSignature(llvm::BitstreamReader &StreamFile);
3809
Ben Langmuir70a1b812015-03-24 04:43:52 +00003810/// \brief Whether \p Stream starts with the AST/PCH file magic number 'CPCH'.
3811static bool startsWithASTFileMagic(BitstreamCursor &Stream) {
3812 return Stream.Read(8) == 'C' &&
3813 Stream.Read(8) == 'P' &&
3814 Stream.Read(8) == 'C' &&
3815 Stream.Read(8) == 'H';
3816}
3817
Guy Benyei11169dd2012-12-18 14:30:41 +00003818ASTReader::ASTReadResult
3819ASTReader::ReadASTCore(StringRef FileName,
3820 ModuleKind Type,
3821 SourceLocation ImportLoc,
3822 ModuleFile *ImportedBy,
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003823 SmallVectorImpl<ImportedModule> &Loaded,
Douglas Gregor7029ce12013-03-19 00:28:20 +00003824 off_t ExpectedSize, time_t ExpectedModTime,
Ben Langmuir487ea142014-10-23 18:05:36 +00003825 ASTFileSignature ExpectedSignature,
Guy Benyei11169dd2012-12-18 14:30:41 +00003826 unsigned ClientLoadCapabilities) {
3827 ModuleFile *M;
Guy Benyei11169dd2012-12-18 14:30:41 +00003828 std::string ErrorStr;
Douglas Gregor7029ce12013-03-19 00:28:20 +00003829 ModuleManager::AddModuleResult AddResult
3830 = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy,
Richard Smith053f6c62014-05-16 23:01:30 +00003831 getGeneration(), ExpectedSize, ExpectedModTime,
Ben Langmuir487ea142014-10-23 18:05:36 +00003832 ExpectedSignature, readASTFileSignature,
Douglas Gregor7029ce12013-03-19 00:28:20 +00003833 M, ErrorStr);
Guy Benyei11169dd2012-12-18 14:30:41 +00003834
Douglas Gregor7029ce12013-03-19 00:28:20 +00003835 switch (AddResult) {
3836 case ModuleManager::AlreadyLoaded:
3837 return Success;
3838
3839 case ModuleManager::NewlyLoaded:
3840 // Load module file below.
3841 break;
3842
3843 case ModuleManager::Missing:
Richard Smithe842a472014-10-22 02:05:46 +00003844 // The module file was missing; if the client can handle that, return
Douglas Gregor7029ce12013-03-19 00:28:20 +00003845 // it.
3846 if (ClientLoadCapabilities & ARR_Missing)
3847 return Missing;
3848
3849 // Otherwise, return an error.
3850 {
3851 std::string Msg = "Unable to load module \"" + FileName.str() + "\": "
3852 + ErrorStr;
3853 Error(Msg);
3854 }
3855 return Failure;
3856
3857 case ModuleManager::OutOfDate:
3858 // We couldn't load the module file because it is out-of-date. If the
3859 // client can handle out-of-date, return it.
3860 if (ClientLoadCapabilities & ARR_OutOfDate)
3861 return OutOfDate;
3862
3863 // Otherwise, return an error.
3864 {
3865 std::string Msg = "Unable to load module \"" + FileName.str() + "\": "
3866 + ErrorStr;
3867 Error(Msg);
3868 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003869 return Failure;
3870 }
3871
Douglas Gregor7029ce12013-03-19 00:28:20 +00003872 assert(M && "Missing module file");
Guy Benyei11169dd2012-12-18 14:30:41 +00003873
3874 // FIXME: This seems rather a hack. Should CurrentDir be part of the
3875 // module?
3876 if (FileName != "-") {
3877 CurrentDir = llvm::sys::path::parent_path(FileName);
3878 if (CurrentDir.empty()) CurrentDir = ".";
3879 }
3880
3881 ModuleFile &F = *M;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00003882 BitstreamCursor &Stream = F.Stream;
Rafael Espindolafd832392014-11-12 14:48:44 +00003883 Stream.init(&F.StreamFile);
Adrian Prantlcbc368c2015-02-25 02:44:04 +00003884 F.SizeInBits = F.Buffer->getBufferSize() * 8;
3885
Guy Benyei11169dd2012-12-18 14:30:41 +00003886 // Sniff for the signature.
Ben Langmuir70a1b812015-03-24 04:43:52 +00003887 if (!startsWithASTFileMagic(Stream)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003888 Diag(diag::err_not_a_pch_file) << FileName;
3889 return Failure;
3890 }
3891
3892 // This is used for compatibility with older PCH formats.
3893 bool HaveReadControlBlock = false;
3894
Chris Lattnerefa77172013-01-20 00:00:22 +00003895 while (1) {
3896 llvm::BitstreamEntry Entry = Stream.advance();
3897
3898 switch (Entry.Kind) {
3899 case llvm::BitstreamEntry::Error:
3900 case llvm::BitstreamEntry::EndBlock:
3901 case llvm::BitstreamEntry::Record:
Guy Benyei11169dd2012-12-18 14:30:41 +00003902 Error("invalid record at top-level of AST file");
3903 return Failure;
Chris Lattnerefa77172013-01-20 00:00:22 +00003904
3905 case llvm::BitstreamEntry::SubBlock:
3906 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00003907 }
3908
Guy Benyei11169dd2012-12-18 14:30:41 +00003909 // We only know the control subblock ID.
Chris Lattnerefa77172013-01-20 00:00:22 +00003910 switch (Entry.ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003911 case llvm::bitc::BLOCKINFO_BLOCK_ID:
3912 if (Stream.ReadBlockInfoBlock()) {
3913 Error("malformed BlockInfoBlock in AST file");
3914 return Failure;
3915 }
3916 break;
3917 case CONTROL_BLOCK_ID:
3918 HaveReadControlBlock = true;
Ben Langmuirbeee15e2014-04-14 18:00:01 +00003919 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003920 case Success:
3921 break;
3922
3923 case Failure: return Failure;
Douglas Gregor7029ce12013-03-19 00:28:20 +00003924 case Missing: return Missing;
Guy Benyei11169dd2012-12-18 14:30:41 +00003925 case OutOfDate: return OutOfDate;
3926 case VersionMismatch: return VersionMismatch;
3927 case ConfigurationMismatch: return ConfigurationMismatch;
3928 case HadErrors: return HadErrors;
3929 }
3930 break;
3931 case AST_BLOCK_ID:
3932 if (!HaveReadControlBlock) {
3933 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
Dmitri Gribenko2228cd32014-02-11 15:40:09 +00003934 Diag(diag::err_pch_version_too_old);
Guy Benyei11169dd2012-12-18 14:30:41 +00003935 return VersionMismatch;
3936 }
3937
3938 // Record that we've loaded this module.
3939 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc));
3940 return Success;
3941
3942 default:
3943 if (Stream.SkipBlock()) {
3944 Error("malformed block record in AST file");
3945 return Failure;
3946 }
3947 break;
3948 }
3949 }
3950
3951 return Success;
3952}
3953
3954void ASTReader::InitializeContext() {
3955 // If there's a listener, notify them that we "read" the translation unit.
3956 if (DeserializationListener)
3957 DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID,
3958 Context.getTranslationUnitDecl());
3959
Guy Benyei11169dd2012-12-18 14:30:41 +00003960 // FIXME: Find a better way to deal with collisions between these
3961 // built-in types. Right now, we just ignore the problem.
3962
3963 // Load the special types.
3964 if (SpecialTypes.size() >= NumSpecialTypeIDs) {
3965 if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) {
3966 if (!Context.CFConstantStringTypeDecl)
3967 Context.setCFConstantStringType(GetType(String));
3968 }
3969
3970 if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) {
3971 QualType FileType = GetType(File);
3972 if (FileType.isNull()) {
3973 Error("FILE type is NULL");
3974 return;
3975 }
3976
3977 if (!Context.FILEDecl) {
3978 if (const TypedefType *Typedef = FileType->getAs<TypedefType>())
3979 Context.setFILEDecl(Typedef->getDecl());
3980 else {
3981 const TagType *Tag = FileType->getAs<TagType>();
3982 if (!Tag) {
3983 Error("Invalid FILE type in AST file");
3984 return;
3985 }
3986 Context.setFILEDecl(Tag->getDecl());
3987 }
3988 }
3989 }
3990
3991 if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) {
3992 QualType Jmp_bufType = GetType(Jmp_buf);
3993 if (Jmp_bufType.isNull()) {
3994 Error("jmp_buf type is NULL");
3995 return;
3996 }
3997
3998 if (!Context.jmp_bufDecl) {
3999 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>())
4000 Context.setjmp_bufDecl(Typedef->getDecl());
4001 else {
4002 const TagType *Tag = Jmp_bufType->getAs<TagType>();
4003 if (!Tag) {
4004 Error("Invalid jmp_buf type in AST file");
4005 return;
4006 }
4007 Context.setjmp_bufDecl(Tag->getDecl());
4008 }
4009 }
4010 }
4011
4012 if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) {
4013 QualType Sigjmp_bufType = GetType(Sigjmp_buf);
4014 if (Sigjmp_bufType.isNull()) {
4015 Error("sigjmp_buf type is NULL");
4016 return;
4017 }
4018
4019 if (!Context.sigjmp_bufDecl) {
4020 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>())
4021 Context.setsigjmp_bufDecl(Typedef->getDecl());
4022 else {
4023 const TagType *Tag = Sigjmp_bufType->getAs<TagType>();
4024 assert(Tag && "Invalid sigjmp_buf type in AST file");
4025 Context.setsigjmp_bufDecl(Tag->getDecl());
4026 }
4027 }
4028 }
4029
4030 if (unsigned ObjCIdRedef
4031 = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) {
4032 if (Context.ObjCIdRedefinitionType.isNull())
4033 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef);
4034 }
4035
4036 if (unsigned ObjCClassRedef
4037 = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) {
4038 if (Context.ObjCClassRedefinitionType.isNull())
4039 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef);
4040 }
4041
4042 if (unsigned ObjCSelRedef
4043 = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) {
4044 if (Context.ObjCSelRedefinitionType.isNull())
4045 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef);
4046 }
4047
4048 if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) {
4049 QualType Ucontext_tType = GetType(Ucontext_t);
4050 if (Ucontext_tType.isNull()) {
4051 Error("ucontext_t type is NULL");
4052 return;
4053 }
4054
4055 if (!Context.ucontext_tDecl) {
4056 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>())
4057 Context.setucontext_tDecl(Typedef->getDecl());
4058 else {
4059 const TagType *Tag = Ucontext_tType->getAs<TagType>();
4060 assert(Tag && "Invalid ucontext_t type in AST file");
4061 Context.setucontext_tDecl(Tag->getDecl());
4062 }
4063 }
4064 }
4065 }
4066
4067 ReadPragmaDiagnosticMappings(Context.getDiagnostics());
4068
4069 // If there were any CUDA special declarations, deserialize them.
4070 if (!CUDASpecialDeclRefs.empty()) {
4071 assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!");
4072 Context.setcudaConfigureCallDecl(
4073 cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0])));
4074 }
Richard Smith56be7542014-03-21 00:33:59 +00004075
Guy Benyei11169dd2012-12-18 14:30:41 +00004076 // Re-export any modules that were imported by a non-module AST file.
Richard Smith56be7542014-03-21 00:33:59 +00004077 // FIXME: This does not make macro-only imports visible again. It also doesn't
4078 // make #includes mapped to module imports visible.
4079 for (auto &Import : ImportedModules) {
4080 if (Module *Imported = getSubmodule(Import.ID))
Argyrios Kyrtzidis125df052013-02-01 16:36:12 +00004081 makeModuleVisible(Imported, Module::AllVisible,
Richard Smith56be7542014-03-21 00:33:59 +00004082 /*ImportLoc=*/Import.ImportLoc,
Douglas Gregorfb912652013-03-20 21:10:35 +00004083 /*Complain=*/false);
Guy Benyei11169dd2012-12-18 14:30:41 +00004084 }
4085 ImportedModules.clear();
4086}
4087
4088void ASTReader::finalizeForWriting() {
Richard Smith57721ac2014-07-21 04:10:40 +00004089 while (!HiddenNamesMap.empty()) {
4090 auto HiddenNames = std::move(*HiddenNamesMap.begin());
4091 HiddenNamesMap.erase(HiddenNamesMap.begin());
4092 makeNamesVisible(HiddenNames.second, HiddenNames.first,
4093 /*FromFinalization*/true);
Guy Benyei11169dd2012-12-18 14:30:41 +00004094 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004095}
4096
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004097/// \brief Given a cursor at the start of an AST file, scan ahead and drop the
4098/// cursor into the start of the given block ID, returning false on success and
4099/// true on failure.
4100static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004101 while (1) {
4102 llvm::BitstreamEntry Entry = Cursor.advance();
4103 switch (Entry.Kind) {
4104 case llvm::BitstreamEntry::Error:
4105 case llvm::BitstreamEntry::EndBlock:
4106 return true;
4107
4108 case llvm::BitstreamEntry::Record:
4109 // Ignore top-level records.
4110 Cursor.skipRecord(Entry.ID);
4111 break;
4112
4113 case llvm::BitstreamEntry::SubBlock:
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004114 if (Entry.ID == BlockID) {
4115 if (Cursor.EnterSubBlock(BlockID))
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004116 return true;
4117 // Found it!
4118 return false;
4119 }
4120
4121 if (Cursor.SkipBlock())
4122 return true;
4123 }
4124 }
4125}
4126
Ben Langmuir70a1b812015-03-24 04:43:52 +00004127/// \brief Reads and return the signature record from \p StreamFile's control
4128/// block, or else returns 0.
Ben Langmuir487ea142014-10-23 18:05:36 +00004129static ASTFileSignature readASTFileSignature(llvm::BitstreamReader &StreamFile){
4130 BitstreamCursor Stream(StreamFile);
Ben Langmuir70a1b812015-03-24 04:43:52 +00004131 if (!startsWithASTFileMagic(Stream))
Ben Langmuir487ea142014-10-23 18:05:36 +00004132 return 0;
Ben Langmuir487ea142014-10-23 18:05:36 +00004133
4134 // Scan for the CONTROL_BLOCK_ID block.
4135 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID))
4136 return 0;
4137
4138 // Scan for SIGNATURE inside the control block.
4139 ASTReader::RecordData Record;
4140 while (1) {
4141 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
4142 if (Entry.Kind == llvm::BitstreamEntry::EndBlock ||
4143 Entry.Kind != llvm::BitstreamEntry::Record)
4144 return 0;
4145
4146 Record.clear();
4147 StringRef Blob;
4148 if (SIGNATURE == Stream.readRecord(Entry.ID, Record, &Blob))
4149 return Record[0];
4150 }
4151}
4152
Guy Benyei11169dd2012-12-18 14:30:41 +00004153/// \brief Retrieve the name of the original source file name
4154/// directly from the AST file, without actually loading the AST
4155/// file.
4156std::string ASTReader::getOriginalSourceFile(const std::string &ASTFileName,
4157 FileManager &FileMgr,
4158 DiagnosticsEngine &Diags) {
4159 // Open the AST file.
Benjamin Kramera8857962014-10-26 22:44:13 +00004160 auto Buffer = FileMgr.getBufferForFile(ASTFileName);
Guy Benyei11169dd2012-12-18 14:30:41 +00004161 if (!Buffer) {
Benjamin Kramera8857962014-10-26 22:44:13 +00004162 Diags.Report(diag::err_fe_unable_to_read_pch_file)
4163 << ASTFileName << Buffer.getError().message();
Guy Benyei11169dd2012-12-18 14:30:41 +00004164 return std::string();
4165 }
4166
4167 // Initialize the stream
4168 llvm::BitstreamReader StreamFile;
Adrian Prantlcbc368c2015-02-25 02:44:04 +00004169 StreamFile.init((const unsigned char *)(*Buffer)->getBufferStart(),
4170 (const unsigned char *)(*Buffer)->getBufferEnd());
Rafael Espindolaaf0e40a2014-11-12 14:42:25 +00004171 BitstreamCursor Stream(StreamFile);
Guy Benyei11169dd2012-12-18 14:30:41 +00004172
4173 // Sniff for the signature.
Ben Langmuir70a1b812015-03-24 04:43:52 +00004174 if (!startsWithASTFileMagic(Stream)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004175 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName;
4176 return std::string();
4177 }
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004178
Chris Lattnere7b154b2013-01-19 21:39:22 +00004179 // Scan for the CONTROL_BLOCK_ID block.
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004180 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004181 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
4182 return std::string();
Chris Lattnere7b154b2013-01-19 21:39:22 +00004183 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004184
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004185 // Scan for ORIGINAL_FILE inside the control block.
4186 RecordData Record;
Chris Lattnere7b154b2013-01-19 21:39:22 +00004187 while (1) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004188 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
Chris Lattnere7b154b2013-01-19 21:39:22 +00004189 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
4190 return std::string();
4191
4192 if (Entry.Kind != llvm::BitstreamEntry::Record) {
4193 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
4194 return std::string();
Guy Benyei11169dd2012-12-18 14:30:41 +00004195 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00004196
Guy Benyei11169dd2012-12-18 14:30:41 +00004197 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00004198 StringRef Blob;
4199 if (Stream.readRecord(Entry.ID, Record, &Blob) == ORIGINAL_FILE)
4200 return Blob.str();
Guy Benyei11169dd2012-12-18 14:30:41 +00004201 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004202}
4203
4204namespace {
4205 class SimplePCHValidator : public ASTReaderListener {
4206 const LangOptions &ExistingLangOpts;
4207 const TargetOptions &ExistingTargetOpts;
4208 const PreprocessorOptions &ExistingPPOpts;
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00004209 std::string ExistingModuleCachePath;
Guy Benyei11169dd2012-12-18 14:30:41 +00004210 FileManager &FileMgr;
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00004211
Guy Benyei11169dd2012-12-18 14:30:41 +00004212 public:
4213 SimplePCHValidator(const LangOptions &ExistingLangOpts,
4214 const TargetOptions &ExistingTargetOpts,
4215 const PreprocessorOptions &ExistingPPOpts,
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00004216 StringRef ExistingModuleCachePath,
Guy Benyei11169dd2012-12-18 14:30:41 +00004217 FileManager &FileMgr)
4218 : ExistingLangOpts(ExistingLangOpts),
4219 ExistingTargetOpts(ExistingTargetOpts),
4220 ExistingPPOpts(ExistingPPOpts),
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00004221 ExistingModuleCachePath(ExistingModuleCachePath),
Guy Benyei11169dd2012-12-18 14:30:41 +00004222 FileMgr(FileMgr)
4223 {
4224 }
4225
Richard Smith1e2cf0d2014-10-31 02:28:58 +00004226 bool ReadLanguageOptions(const LangOptions &LangOpts, bool Complain,
4227 bool AllowCompatibleDifferences) override {
4228 return checkLanguageOptions(ExistingLangOpts, LangOpts, nullptr,
4229 AllowCompatibleDifferences);
Guy Benyei11169dd2012-12-18 14:30:41 +00004230 }
Chandler Carruth0d745bc2015-03-14 04:47:43 +00004231 bool ReadTargetOptions(const TargetOptions &TargetOpts, bool Complain,
4232 bool AllowCompatibleDifferences) override {
4233 return checkTargetOptions(ExistingTargetOpts, TargetOpts, nullptr,
4234 AllowCompatibleDifferences);
Guy Benyei11169dd2012-12-18 14:30:41 +00004235 }
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00004236 bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
4237 StringRef SpecificModuleCachePath,
4238 bool Complain) override {
4239 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
4240 ExistingModuleCachePath,
4241 nullptr, ExistingLangOpts);
4242 }
Craig Topper3e89dfe2014-03-13 02:13:41 +00004243 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
4244 bool Complain,
4245 std::string &SuggestedPredefines) override {
Craig Toppera13603a2014-05-22 05:54:18 +00004246 return checkPreprocessorOptions(ExistingPPOpts, PPOpts, nullptr, FileMgr,
Argyrios Kyrtzidisd3afa0c2013-04-26 21:33:40 +00004247 SuggestedPredefines, ExistingLangOpts);
Guy Benyei11169dd2012-12-18 14:30:41 +00004248 }
4249 };
4250}
4251
4252bool ASTReader::readASTFileControlBlock(StringRef Filename,
4253 FileManager &FileMgr,
4254 ASTReaderListener &Listener) {
4255 // Open the AST file.
Richard Smith7f330cd2015-03-18 01:42:29 +00004256 // FIXME: This allows use of the VFS; we do not allow use of the
4257 // VFS when actually loading a module.
Benjamin Kramera8857962014-10-26 22:44:13 +00004258 auto Buffer = FileMgr.getBufferForFile(Filename);
Guy Benyei11169dd2012-12-18 14:30:41 +00004259 if (!Buffer) {
4260 return true;
4261 }
4262
4263 // Initialize the stream
4264 llvm::BitstreamReader StreamFile;
Adrian Prantlcbc368c2015-02-25 02:44:04 +00004265 StreamFile.init((const unsigned char *)(*Buffer)->getBufferStart(),
4266 (const unsigned char *)(*Buffer)->getBufferEnd());
Rafael Espindolaaf0e40a2014-11-12 14:42:25 +00004267 BitstreamCursor Stream(StreamFile);
Guy Benyei11169dd2012-12-18 14:30:41 +00004268
4269 // Sniff for the signature.
Ben Langmuir70a1b812015-03-24 04:43:52 +00004270 if (!startsWithASTFileMagic(Stream))
Guy Benyei11169dd2012-12-18 14:30:41 +00004271 return true;
Guy Benyei11169dd2012-12-18 14:30:41 +00004272
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004273 // Scan for the CONTROL_BLOCK_ID block.
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004274 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID))
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004275 return true;
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004276
4277 bool NeedsInputFiles = Listener.needsInputFileVisitation();
Ben Langmuircb69b572014-03-07 06:40:32 +00004278 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
Richard Smithd4b230b2014-10-27 23:01:16 +00004279 bool NeedsImports = Listener.needsImportVisitation();
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004280 BitstreamCursor InputFilesCursor;
4281 if (NeedsInputFiles) {
4282 InputFilesCursor = Stream;
4283 if (SkipCursorToBlock(InputFilesCursor, INPUT_FILES_BLOCK_ID))
4284 return true;
4285
4286 // Read the abbreviations
4287 while (true) {
4288 uint64_t Offset = InputFilesCursor.GetCurrentBitNo();
4289 unsigned Code = InputFilesCursor.ReadCode();
4290
4291 // We expect all abbrevs to be at the start of the block.
4292 if (Code != llvm::bitc::DEFINE_ABBREV) {
4293 InputFilesCursor.JumpToBit(Offset);
4294 break;
4295 }
4296 InputFilesCursor.ReadAbbrevRecord();
4297 }
4298 }
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004299
4300 // Scan for ORIGINAL_FILE inside the control block.
Guy Benyei11169dd2012-12-18 14:30:41 +00004301 RecordData Record;
Richard Smith7ed1bc92014-12-05 22:42:13 +00004302 std::string ModuleDir;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004303 while (1) {
4304 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
4305 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
4306 return false;
4307
4308 if (Entry.Kind != llvm::BitstreamEntry::Record)
4309 return true;
4310
Guy Benyei11169dd2012-12-18 14:30:41 +00004311 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00004312 StringRef Blob;
4313 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob);
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004314 switch ((ControlRecordTypes)RecCode) {
4315 case METADATA: {
4316 if (Record[0] != VERSION_MAJOR)
4317 return true;
Guy Benyei11169dd2012-12-18 14:30:41 +00004318
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004319 if (Listener.ReadFullVersionInformation(Blob))
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004320 return true;
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004321
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004322 break;
4323 }
Ben Langmuir4f5212a2014-04-14 22:12:44 +00004324 case MODULE_NAME:
4325 Listener.ReadModuleName(Blob);
4326 break;
Richard Smith7ed1bc92014-12-05 22:42:13 +00004327 case MODULE_DIRECTORY:
4328 ModuleDir = Blob;
4329 break;
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00004330 case MODULE_MAP_FILE: {
4331 unsigned Idx = 0;
Richard Smith7ed1bc92014-12-05 22:42:13 +00004332 auto Path = ReadString(Record, Idx);
4333 ResolveImportedPath(Path, ModuleDir);
4334 Listener.ReadModuleMapFile(Path);
Ben Langmuir4f5212a2014-04-14 22:12:44 +00004335 break;
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00004336 }
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004337 case LANGUAGE_OPTIONS:
Richard Smith1e2cf0d2014-10-31 02:28:58 +00004338 if (ParseLanguageOptions(Record, false, Listener,
4339 /*AllowCompatibleConfigurationMismatch*/false))
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004340 return true;
4341 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004342
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004343 case TARGET_OPTIONS:
Chandler Carruth0d745bc2015-03-14 04:47:43 +00004344 if (ParseTargetOptions(Record, false, Listener,
4345 /*AllowCompatibleConfigurationMismatch*/ false))
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004346 return true;
4347 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004348
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004349 case DIAGNOSTIC_OPTIONS:
4350 if (ParseDiagnosticOptions(Record, false, Listener))
4351 return true;
4352 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004353
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004354 case FILE_SYSTEM_OPTIONS:
4355 if (ParseFileSystemOptions(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 HEADER_SEARCH_OPTIONS:
4360 if (ParseHeaderSearchOptions(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 PREPROCESSOR_OPTIONS: {
4365 std::string IgnoredSuggestedPredefines;
4366 if (ParsePreprocessorOptions(Record, false, Listener,
4367 IgnoredSuggestedPredefines))
4368 return true;
4369 break;
4370 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004371
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004372 case INPUT_FILE_OFFSETS: {
4373 if (!NeedsInputFiles)
4374 break;
4375
4376 unsigned NumInputFiles = Record[0];
4377 unsigned NumUserFiles = Record[1];
Richard Smithec216502015-02-13 19:48:37 +00004378 const uint64_t *InputFileOffs = (const uint64_t *)Blob.data();
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004379 for (unsigned I = 0; I != NumInputFiles; ++I) {
4380 // Go find this input file.
4381 bool isSystemFile = I >= NumUserFiles;
Ben Langmuircb69b572014-03-07 06:40:32 +00004382
4383 if (isSystemFile && !NeedsSystemInputFiles)
4384 break; // the rest are system input files
4385
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004386 BitstreamCursor &Cursor = InputFilesCursor;
4387 SavedStreamPosition SavedPosition(Cursor);
4388 Cursor.JumpToBit(InputFileOffs[I]);
4389
4390 unsigned Code = Cursor.ReadCode();
4391 RecordData Record;
4392 StringRef Blob;
4393 bool shouldContinue = false;
4394 switch ((InputFileRecordTypes)Cursor.readRecord(Code, Record, &Blob)) {
4395 case INPUT_FILE:
Argyrios Kyrtzidis68ccbe02014-03-14 02:26:31 +00004396 bool Overridden = static_cast<bool>(Record[3]);
Richard Smith7ed1bc92014-12-05 22:42:13 +00004397 std::string Filename = Blob;
4398 ResolveImportedPath(Filename, ModuleDir);
4399 shouldContinue =
4400 Listener.visitInputFile(Filename, isSystemFile, Overridden);
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004401 break;
4402 }
4403 if (!shouldContinue)
4404 break;
4405 }
4406 break;
4407 }
4408
Richard Smithd4b230b2014-10-27 23:01:16 +00004409 case IMPORTS: {
4410 if (!NeedsImports)
4411 break;
4412
4413 unsigned Idx = 0, N = Record.size();
4414 while (Idx < N) {
4415 // Read information about the AST file.
Richard Smith79c98cc2014-10-27 23:25:15 +00004416 Idx += 5; // ImportLoc, Size, ModTime, Signature
Richard Smith7ed1bc92014-12-05 22:42:13 +00004417 std::string Filename = ReadString(Record, Idx);
4418 ResolveImportedPath(Filename, ModuleDir);
4419 Listener.visitImport(Filename);
Richard Smithd4b230b2014-10-27 23:01:16 +00004420 }
4421 break;
4422 }
4423
Richard Smith7f330cd2015-03-18 01:42:29 +00004424 case KNOWN_MODULE_FILES: {
4425 // Known-but-not-technically-used module files are treated as imports.
4426 if (!NeedsImports)
4427 break;
4428
4429 unsigned Idx = 0, N = Record.size();
4430 while (Idx < N) {
4431 std::string Filename = ReadString(Record, Idx);
4432 ResolveImportedPath(Filename, ModuleDir);
4433 Listener.visitImport(Filename);
4434 }
4435 break;
4436 }
4437
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004438 default:
4439 // No other validation to perform.
4440 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004441 }
4442 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004443}
4444
4445
4446bool ASTReader::isAcceptableASTFile(StringRef Filename,
4447 FileManager &FileMgr,
4448 const LangOptions &LangOpts,
4449 const TargetOptions &TargetOpts,
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00004450 const PreprocessorOptions &PPOpts,
4451 std::string ExistingModuleCachePath) {
4452 SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts,
4453 ExistingModuleCachePath, FileMgr);
Guy Benyei11169dd2012-12-18 14:30:41 +00004454 return !readASTFileControlBlock(Filename, FileMgr, validator);
4455}
4456
Ben Langmuir2c9af442014-04-10 17:57:43 +00004457ASTReader::ASTReadResult
4458ASTReader::ReadSubmoduleBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004459 // Enter the submodule block.
4460 if (F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) {
4461 Error("malformed submodule block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004462 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004463 }
4464
4465 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
4466 bool First = true;
Craig Toppera13603a2014-05-22 05:54:18 +00004467 Module *CurrentModule = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00004468 RecordData Record;
4469 while (true) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004470 llvm::BitstreamEntry Entry = F.Stream.advanceSkippingSubblocks();
4471
4472 switch (Entry.Kind) {
4473 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
4474 case llvm::BitstreamEntry::Error:
4475 Error("malformed block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004476 return Failure;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004477 case llvm::BitstreamEntry::EndBlock:
Ben Langmuir2c9af442014-04-10 17:57:43 +00004478 return Success;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004479 case llvm::BitstreamEntry::Record:
4480 // The interesting case.
4481 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004482 }
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004483
Guy Benyei11169dd2012-12-18 14:30:41 +00004484 // Read a record.
Chris Lattner0e6c9402013-01-20 02:38:54 +00004485 StringRef Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00004486 Record.clear();
Richard Smith03478d92014-10-23 22:12:14 +00004487 auto Kind = F.Stream.readRecord(Entry.ID, Record, &Blob);
4488
4489 if ((Kind == SUBMODULE_METADATA) != First) {
4490 Error("submodule metadata record should be at beginning of block");
4491 return Failure;
4492 }
4493 First = false;
4494
4495 // Submodule information is only valid if we have a current module.
4496 // FIXME: Should we error on these cases?
4497 if (!CurrentModule && Kind != SUBMODULE_METADATA &&
4498 Kind != SUBMODULE_DEFINITION)
4499 continue;
4500
4501 switch (Kind) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004502 default: // Default behavior: ignore.
4503 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004504
Richard Smith03478d92014-10-23 22:12:14 +00004505 case SUBMODULE_DEFINITION: {
Douglas Gregor8d932422013-03-20 03:59:18 +00004506 if (Record.size() < 8) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004507 Error("malformed module definition");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004508 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004509 }
Richard Smith03478d92014-10-23 22:12:14 +00004510
Chris Lattner0e6c9402013-01-20 02:38:54 +00004511 StringRef Name = Blob;
Richard Smith9bca2982014-03-08 00:03:56 +00004512 unsigned Idx = 0;
4513 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]);
4514 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]);
4515 bool IsFramework = Record[Idx++];
4516 bool IsExplicit = Record[Idx++];
4517 bool IsSystem = Record[Idx++];
4518 bool IsExternC = Record[Idx++];
4519 bool InferSubmodules = Record[Idx++];
4520 bool InferExplicitSubmodules = Record[Idx++];
4521 bool InferExportWildcard = Record[Idx++];
4522 bool ConfigMacrosExhaustive = Record[Idx++];
Douglas Gregor8d932422013-03-20 03:59:18 +00004523
Ben Langmuirbeee15e2014-04-14 18:00:01 +00004524 Module *ParentModule = nullptr;
Ben Langmuir9d6448b2014-08-09 00:57:23 +00004525 if (Parent)
Guy Benyei11169dd2012-12-18 14:30:41 +00004526 ParentModule = getSubmodule(Parent);
Ben Langmuirbeee15e2014-04-14 18:00:01 +00004527
Guy Benyei11169dd2012-12-18 14:30:41 +00004528 // Retrieve this (sub)module from the module map, creating it if
4529 // necessary.
Ben Langmuir9d6448b2014-08-09 00:57:23 +00004530 CurrentModule = ModMap.findOrCreateModule(Name, ParentModule, IsFramework,
Guy Benyei11169dd2012-12-18 14:30:41 +00004531 IsExplicit).first;
Ben Langmuir9d6448b2014-08-09 00:57:23 +00004532
4533 // FIXME: set the definition loc for CurrentModule, or call
4534 // ModMap.setInferredModuleAllowedBy()
4535
Guy Benyei11169dd2012-12-18 14:30:41 +00004536 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS;
4537 if (GlobalIndex >= SubmodulesLoaded.size() ||
4538 SubmodulesLoaded[GlobalIndex]) {
4539 Error("too many submodules");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004540 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004541 }
Douglas Gregor8a114ab2013-02-06 22:40:31 +00004542
Douglas Gregor7029ce12013-03-19 00:28:20 +00004543 if (!ParentModule) {
4544 if (const FileEntry *CurFile = CurrentModule->getASTFile()) {
4545 if (CurFile != F.File) {
4546 if (!Diags.isDiagnosticInFlight()) {
4547 Diag(diag::err_module_file_conflict)
4548 << CurrentModule->getTopLevelModuleName()
4549 << CurFile->getName()
4550 << F.File->getName();
4551 }
Ben Langmuir2c9af442014-04-10 17:57:43 +00004552 return Failure;
Douglas Gregor8a114ab2013-02-06 22:40:31 +00004553 }
Douglas Gregor8a114ab2013-02-06 22:40:31 +00004554 }
Douglas Gregor7029ce12013-03-19 00:28:20 +00004555
4556 CurrentModule->setASTFile(F.File);
Douglas Gregor8a114ab2013-02-06 22:40:31 +00004557 }
Ben Langmuirbeee15e2014-04-14 18:00:01 +00004558
Guy Benyei11169dd2012-12-18 14:30:41 +00004559 CurrentModule->IsFromModuleFile = true;
4560 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem;
Richard Smith9bca2982014-03-08 00:03:56 +00004561 CurrentModule->IsExternC = IsExternC;
Guy Benyei11169dd2012-12-18 14:30:41 +00004562 CurrentModule->InferSubmodules = InferSubmodules;
4563 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules;
4564 CurrentModule->InferExportWildcard = InferExportWildcard;
Douglas Gregor8d932422013-03-20 03:59:18 +00004565 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive;
Guy Benyei11169dd2012-12-18 14:30:41 +00004566 if (DeserializationListener)
4567 DeserializationListener->ModuleRead(GlobalID, CurrentModule);
4568
4569 SubmodulesLoaded[GlobalIndex] = CurrentModule;
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004570
Douglas Gregorfb912652013-03-20 21:10:35 +00004571 // Clear out data that will be replaced by what is the module file.
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004572 CurrentModule->LinkLibraries.clear();
Douglas Gregor8d932422013-03-20 03:59:18 +00004573 CurrentModule->ConfigMacros.clear();
Douglas Gregorfb912652013-03-20 21:10:35 +00004574 CurrentModule->UnresolvedConflicts.clear();
4575 CurrentModule->Conflicts.clear();
Guy Benyei11169dd2012-12-18 14:30:41 +00004576 break;
4577 }
4578
4579 case SUBMODULE_UMBRELLA_HEADER: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00004580 if (const FileEntry *Umbrella = PP.getFileManager().getFile(Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004581 if (!CurrentModule->getUmbrellaHeader())
4582 ModMap.setUmbrellaHeader(CurrentModule, Umbrella);
4583 else if (CurrentModule->getUmbrellaHeader() != Umbrella) {
Ben Langmuirbc35fbe2015-02-20 21:46:39 +00004584 // This can be a spurious difference caused by changing the VFS to
4585 // point to a different copy of the file, and it is too late to
4586 // to rebuild safely.
4587 // FIXME: If we wrote the virtual paths instead of the 'real' paths,
4588 // after input file validation only real problems would remain and we
4589 // could just error. For now, assume it's okay.
4590 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004591 }
4592 }
4593 break;
4594 }
4595
Richard Smith202210b2014-10-24 20:23:01 +00004596 case SUBMODULE_HEADER:
4597 case SUBMODULE_EXCLUDED_HEADER:
4598 case SUBMODULE_PRIVATE_HEADER:
4599 // We lazily associate headers with their modules via the HeaderInfo table.
Argyrios Kyrtzidisb146baa2013-03-13 21:13:51 +00004600 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
4601 // of complete filenames or remove it entirely.
Richard Smith202210b2014-10-24 20:23:01 +00004602 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004603
Richard Smith202210b2014-10-24 20:23:01 +00004604 case SUBMODULE_TEXTUAL_HEADER:
4605 case SUBMODULE_PRIVATE_TEXTUAL_HEADER:
4606 // FIXME: Textual headers are not marked in the HeaderInfo table. Load
4607 // them here.
4608 break;
Lawrence Crowlb53e5482013-06-20 21:14:14 +00004609
Guy Benyei11169dd2012-12-18 14:30:41 +00004610 case SUBMODULE_TOPHEADER: {
Argyrios Kyrtzidis3c5305c2013-03-13 21:13:43 +00004611 CurrentModule->addTopHeaderFilename(Blob);
Guy Benyei11169dd2012-12-18 14:30:41 +00004612 break;
4613 }
4614
4615 case SUBMODULE_UMBRELLA_DIR: {
Guy Benyei11169dd2012-12-18 14:30:41 +00004616 if (const DirectoryEntry *Umbrella
Chris Lattner0e6c9402013-01-20 02:38:54 +00004617 = PP.getFileManager().getDirectory(Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004618 if (!CurrentModule->getUmbrellaDir())
4619 ModMap.setUmbrellaDir(CurrentModule, Umbrella);
4620 else if (CurrentModule->getUmbrellaDir() != Umbrella) {
Ben Langmuir2c9af442014-04-10 17:57:43 +00004621 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
4622 Error("mismatched umbrella directories in submodule");
4623 return OutOfDate;
Guy Benyei11169dd2012-12-18 14:30:41 +00004624 }
4625 }
4626 break;
4627 }
4628
4629 case SUBMODULE_METADATA: {
Guy Benyei11169dd2012-12-18 14:30:41 +00004630 F.BaseSubmoduleID = getTotalNumSubmodules();
4631 F.LocalNumSubmodules = Record[0];
4632 unsigned LocalBaseSubmoduleID = Record[1];
4633 if (F.LocalNumSubmodules > 0) {
4634 // Introduce the global -> local mapping for submodules within this
4635 // module.
4636 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F));
4637
4638 // Introduce the local -> global mapping for submodules within this
4639 // module.
4640 F.SubmoduleRemap.insertOrReplace(
4641 std::make_pair(LocalBaseSubmoduleID,
4642 F.BaseSubmoduleID - LocalBaseSubmoduleID));
Ben Langmuirfe971d92014-08-16 04:54:18 +00004643
Ben Langmuir52ca6782014-10-20 16:27:32 +00004644 SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules);
4645 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004646 break;
4647 }
4648
4649 case SUBMODULE_IMPORTS: {
Guy Benyei11169dd2012-12-18 14:30:41 +00004650 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) {
Douglas Gregorfb912652013-03-20 21:10:35 +00004651 UnresolvedModuleRef Unresolved;
Guy Benyei11169dd2012-12-18 14:30:41 +00004652 Unresolved.File = &F;
4653 Unresolved.Mod = CurrentModule;
4654 Unresolved.ID = Record[Idx];
Douglas Gregorfb912652013-03-20 21:10:35 +00004655 Unresolved.Kind = UnresolvedModuleRef::Import;
Guy Benyei11169dd2012-12-18 14:30:41 +00004656 Unresolved.IsWildcard = false;
Douglas Gregorfb912652013-03-20 21:10:35 +00004657 UnresolvedModuleRefs.push_back(Unresolved);
Guy Benyei11169dd2012-12-18 14:30:41 +00004658 }
4659 break;
4660 }
4661
4662 case SUBMODULE_EXPORTS: {
Guy Benyei11169dd2012-12-18 14:30:41 +00004663 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) {
Douglas Gregorfb912652013-03-20 21:10:35 +00004664 UnresolvedModuleRef Unresolved;
Guy Benyei11169dd2012-12-18 14:30:41 +00004665 Unresolved.File = &F;
4666 Unresolved.Mod = CurrentModule;
4667 Unresolved.ID = Record[Idx];
Douglas Gregorfb912652013-03-20 21:10:35 +00004668 Unresolved.Kind = UnresolvedModuleRef::Export;
Guy Benyei11169dd2012-12-18 14:30:41 +00004669 Unresolved.IsWildcard = Record[Idx + 1];
Douglas Gregorfb912652013-03-20 21:10:35 +00004670 UnresolvedModuleRefs.push_back(Unresolved);
Guy Benyei11169dd2012-12-18 14:30:41 +00004671 }
4672
4673 // Once we've loaded the set of exports, there's no reason to keep
4674 // the parsed, unresolved exports around.
4675 CurrentModule->UnresolvedExports.clear();
4676 break;
4677 }
4678 case SUBMODULE_REQUIRES: {
Richard Smitha3feee22013-10-28 22:18:19 +00004679 CurrentModule->addRequirement(Blob, Record[0], Context.getLangOpts(),
Guy Benyei11169dd2012-12-18 14:30:41 +00004680 Context.getTargetInfo());
4681 break;
4682 }
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004683
4684 case SUBMODULE_LINK_LIBRARY:
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004685 CurrentModule->LinkLibraries.push_back(
Chris Lattner0e6c9402013-01-20 02:38:54 +00004686 Module::LinkLibrary(Blob, Record[0]));
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004687 break;
Douglas Gregor35b13ec2013-03-20 00:22:05 +00004688
4689 case SUBMODULE_CONFIG_MACRO:
Douglas Gregor35b13ec2013-03-20 00:22:05 +00004690 CurrentModule->ConfigMacros.push_back(Blob.str());
4691 break;
Douglas Gregorfb912652013-03-20 21:10:35 +00004692
4693 case SUBMODULE_CONFLICT: {
Douglas Gregorfb912652013-03-20 21:10:35 +00004694 UnresolvedModuleRef Unresolved;
4695 Unresolved.File = &F;
4696 Unresolved.Mod = CurrentModule;
4697 Unresolved.ID = Record[0];
4698 Unresolved.Kind = UnresolvedModuleRef::Conflict;
4699 Unresolved.IsWildcard = false;
4700 Unresolved.String = Blob;
4701 UnresolvedModuleRefs.push_back(Unresolved);
4702 break;
4703 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004704 }
4705 }
4706}
4707
4708/// \brief Parse the record that corresponds to a LangOptions data
4709/// structure.
4710///
4711/// This routine parses the language options from the AST file and then gives
4712/// them to the AST listener if one is set.
4713///
4714/// \returns true if the listener deems the file unacceptable, false otherwise.
4715bool ASTReader::ParseLanguageOptions(const RecordData &Record,
4716 bool Complain,
Richard Smith1e2cf0d2014-10-31 02:28:58 +00004717 ASTReaderListener &Listener,
4718 bool AllowCompatibleDifferences) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004719 LangOptions LangOpts;
4720 unsigned Idx = 0;
4721#define LANGOPT(Name, Bits, Default, Description) \
4722 LangOpts.Name = Record[Idx++];
4723#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
4724 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
4725#include "clang/Basic/LangOptions.def"
Alexey Samsonovedf99a92014-11-07 22:29:38 +00004726#define SANITIZER(NAME, ID) \
4727 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]);
Will Dietzf54319c2013-01-18 11:30:38 +00004728#include "clang/Basic/Sanitizers.def"
Guy Benyei11169dd2012-12-18 14:30:41 +00004729
4730 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++];
4731 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx);
4732 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion);
4733
4734 unsigned Length = Record[Idx++];
4735 LangOpts.CurrentModule.assign(Record.begin() + Idx,
4736 Record.begin() + Idx + Length);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004737
4738 Idx += Length;
4739
4740 // Comment options.
4741 for (unsigned N = Record[Idx++]; N; --N) {
4742 LangOpts.CommentOpts.BlockCommandNames.push_back(
4743 ReadString(Record, Idx));
4744 }
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004745 LangOpts.CommentOpts.ParseAllComments = Record[Idx++];
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004746
Richard Smith1e2cf0d2014-10-31 02:28:58 +00004747 return Listener.ReadLanguageOptions(LangOpts, Complain,
4748 AllowCompatibleDifferences);
Guy Benyei11169dd2012-12-18 14:30:41 +00004749}
4750
Chandler Carruth0d745bc2015-03-14 04:47:43 +00004751bool ASTReader::ParseTargetOptions(const RecordData &Record, bool Complain,
4752 ASTReaderListener &Listener,
4753 bool AllowCompatibleDifferences) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004754 unsigned Idx = 0;
4755 TargetOptions TargetOpts;
4756 TargetOpts.Triple = ReadString(Record, Idx);
4757 TargetOpts.CPU = ReadString(Record, Idx);
4758 TargetOpts.ABI = ReadString(Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00004759 for (unsigned N = Record[Idx++]; N; --N) {
4760 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx));
4761 }
4762 for (unsigned N = Record[Idx++]; N; --N) {
4763 TargetOpts.Features.push_back(ReadString(Record, Idx));
4764 }
4765
Chandler Carruth0d745bc2015-03-14 04:47:43 +00004766 return Listener.ReadTargetOptions(TargetOpts, Complain,
4767 AllowCompatibleDifferences);
Guy Benyei11169dd2012-12-18 14:30:41 +00004768}
4769
4770bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain,
4771 ASTReaderListener &Listener) {
Ben Langmuirb92de022014-04-29 16:25:26 +00004772 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions);
Guy Benyei11169dd2012-12-18 14:30:41 +00004773 unsigned Idx = 0;
Ben Langmuirb92de022014-04-29 16:25:26 +00004774#define DIAGOPT(Name, Bits, Default) DiagOpts->Name = Record[Idx++];
Guy Benyei11169dd2012-12-18 14:30:41 +00004775#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
Ben Langmuirb92de022014-04-29 16:25:26 +00004776 DiagOpts->set##Name(static_cast<Type>(Record[Idx++]));
Guy Benyei11169dd2012-12-18 14:30:41 +00004777#include "clang/Basic/DiagnosticOptions.def"
4778
Richard Smith3be1cb22014-08-07 00:24:21 +00004779 for (unsigned N = Record[Idx++]; N; --N)
Ben Langmuirb92de022014-04-29 16:25:26 +00004780 DiagOpts->Warnings.push_back(ReadString(Record, Idx));
Richard Smith3be1cb22014-08-07 00:24:21 +00004781 for (unsigned N = Record[Idx++]; N; --N)
4782 DiagOpts->Remarks.push_back(ReadString(Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00004783
4784 return Listener.ReadDiagnosticOptions(DiagOpts, Complain);
4785}
4786
4787bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain,
4788 ASTReaderListener &Listener) {
4789 FileSystemOptions FSOpts;
4790 unsigned Idx = 0;
4791 FSOpts.WorkingDir = ReadString(Record, Idx);
4792 return Listener.ReadFileSystemOptions(FSOpts, Complain);
4793}
4794
4795bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record,
4796 bool Complain,
4797 ASTReaderListener &Listener) {
4798 HeaderSearchOptions HSOpts;
4799 unsigned Idx = 0;
4800 HSOpts.Sysroot = ReadString(Record, Idx);
4801
4802 // Include entries.
4803 for (unsigned N = Record[Idx++]; N; --N) {
4804 std::string Path = ReadString(Record, Idx);
4805 frontend::IncludeDirGroup Group
4806 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]);
Guy Benyei11169dd2012-12-18 14:30:41 +00004807 bool IsFramework = Record[Idx++];
4808 bool IgnoreSysRoot = Record[Idx++];
Guy Benyei11169dd2012-12-18 14:30:41 +00004809 HSOpts.UserEntries.push_back(
Daniel Dunbar53681732013-01-30 00:34:26 +00004810 HeaderSearchOptions::Entry(Path, Group, IsFramework, IgnoreSysRoot));
Guy Benyei11169dd2012-12-18 14:30:41 +00004811 }
4812
4813 // System header prefixes.
4814 for (unsigned N = Record[Idx++]; N; --N) {
4815 std::string Prefix = ReadString(Record, Idx);
4816 bool IsSystemHeader = Record[Idx++];
4817 HSOpts.SystemHeaderPrefixes.push_back(
4818 HeaderSearchOptions::SystemHeaderPrefix(Prefix, IsSystemHeader));
4819 }
4820
4821 HSOpts.ResourceDir = ReadString(Record, Idx);
4822 HSOpts.ModuleCachePath = ReadString(Record, Idx);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004823 HSOpts.ModuleUserBuildPath = ReadString(Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00004824 HSOpts.DisableModuleHash = Record[Idx++];
4825 HSOpts.UseBuiltinIncludes = Record[Idx++];
4826 HSOpts.UseStandardSystemIncludes = Record[Idx++];
4827 HSOpts.UseStandardCXXIncludes = Record[Idx++];
4828 HSOpts.UseLibcxx = Record[Idx++];
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00004829 std::string SpecificModuleCachePath = ReadString(Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00004830
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00004831 return Listener.ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
4832 Complain);
Guy Benyei11169dd2012-12-18 14:30:41 +00004833}
4834
4835bool ASTReader::ParsePreprocessorOptions(const RecordData &Record,
4836 bool Complain,
4837 ASTReaderListener &Listener,
4838 std::string &SuggestedPredefines) {
4839 PreprocessorOptions PPOpts;
4840 unsigned Idx = 0;
4841
4842 // Macro definitions/undefs
4843 for (unsigned N = Record[Idx++]; N; --N) {
4844 std::string Macro = ReadString(Record, Idx);
4845 bool IsUndef = Record[Idx++];
4846 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef));
4847 }
4848
4849 // Includes
4850 for (unsigned N = Record[Idx++]; N; --N) {
4851 PPOpts.Includes.push_back(ReadString(Record, Idx));
4852 }
4853
4854 // Macro Includes
4855 for (unsigned N = Record[Idx++]; N; --N) {
4856 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx));
4857 }
4858
4859 PPOpts.UsePredefines = Record[Idx++];
Argyrios Kyrtzidisd3afa0c2013-04-26 21:33:40 +00004860 PPOpts.DetailedRecord = Record[Idx++];
Guy Benyei11169dd2012-12-18 14:30:41 +00004861 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx);
4862 PPOpts.ImplicitPTHInclude = ReadString(Record, Idx);
4863 PPOpts.ObjCXXARCStandardLibrary =
4864 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]);
4865 SuggestedPredefines.clear();
4866 return Listener.ReadPreprocessorOptions(PPOpts, Complain,
4867 SuggestedPredefines);
4868}
4869
4870std::pair<ModuleFile *, unsigned>
4871ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) {
4872 GlobalPreprocessedEntityMapType::iterator
4873 I = GlobalPreprocessedEntityMap.find(GlobalIndex);
4874 assert(I != GlobalPreprocessedEntityMap.end() &&
4875 "Corrupted global preprocessed entity map");
4876 ModuleFile *M = I->second;
4877 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID;
4878 return std::make_pair(M, LocalIndex);
4879}
4880
Benjamin Kramerb4ef6682015-02-06 17:25:10 +00004881llvm::iterator_range<PreprocessingRecord::iterator>
Guy Benyei11169dd2012-12-18 14:30:41 +00004882ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const {
4883 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
4884 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID,
4885 Mod.NumPreprocessedEntities);
4886
Benjamin Kramerb4ef6682015-02-06 17:25:10 +00004887 return llvm::make_range(PreprocessingRecord::iterator(),
4888 PreprocessingRecord::iterator());
Guy Benyei11169dd2012-12-18 14:30:41 +00004889}
4890
Benjamin Kramerb4ef6682015-02-06 17:25:10 +00004891llvm::iterator_range<ASTReader::ModuleDeclIterator>
Guy Benyei11169dd2012-12-18 14:30:41 +00004892ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) {
Benjamin Kramerb4ef6682015-02-06 17:25:10 +00004893 return llvm::make_range(
4894 ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls),
4895 ModuleDeclIterator(this, &Mod,
4896 Mod.FileSortedDecls + Mod.NumFileSortedDecls));
Guy Benyei11169dd2012-12-18 14:30:41 +00004897}
4898
4899PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) {
4900 PreprocessedEntityID PPID = Index+1;
4901 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
4902 ModuleFile &M = *PPInfo.first;
4903 unsigned LocalIndex = PPInfo.second;
4904 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
4905
Guy Benyei11169dd2012-12-18 14:30:41 +00004906 if (!PP.getPreprocessingRecord()) {
4907 Error("no preprocessing record");
Craig Toppera13603a2014-05-22 05:54:18 +00004908 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00004909 }
4910
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004911 SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor);
4912 M.PreprocessorDetailCursor.JumpToBit(PPOffs.BitOffset);
4913
4914 llvm::BitstreamEntry Entry =
4915 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
4916 if (Entry.Kind != llvm::BitstreamEntry::Record)
Craig Toppera13603a2014-05-22 05:54:18 +00004917 return nullptr;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004918
Guy Benyei11169dd2012-12-18 14:30:41 +00004919 // Read the record.
4920 SourceRange Range(ReadSourceLocation(M, PPOffs.Begin),
4921 ReadSourceLocation(M, PPOffs.End));
4922 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
Chris Lattner0e6c9402013-01-20 02:38:54 +00004923 StringRef Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00004924 RecordData Record;
4925 PreprocessorDetailRecordTypes RecType =
Chris Lattner0e6c9402013-01-20 02:38:54 +00004926 (PreprocessorDetailRecordTypes)M.PreprocessorDetailCursor.readRecord(
4927 Entry.ID, Record, &Blob);
Guy Benyei11169dd2012-12-18 14:30:41 +00004928 switch (RecType) {
4929 case PPD_MACRO_EXPANSION: {
4930 bool isBuiltin = Record[0];
Craig Toppera13603a2014-05-22 05:54:18 +00004931 IdentifierInfo *Name = nullptr;
4932 MacroDefinition *Def = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00004933 if (isBuiltin)
4934 Name = getLocalIdentifier(M, Record[1]);
4935 else {
4936 PreprocessedEntityID
4937 GlobalID = getGlobalPreprocessedEntityID(M, Record[1]);
4938 Def =cast<MacroDefinition>(PPRec.getLoadedPreprocessedEntity(GlobalID-1));
4939 }
4940
4941 MacroExpansion *ME;
4942 if (isBuiltin)
4943 ME = new (PPRec) MacroExpansion(Name, Range);
4944 else
4945 ME = new (PPRec) MacroExpansion(Def, Range);
4946
4947 return ME;
4948 }
4949
4950 case PPD_MACRO_DEFINITION: {
4951 // Decode the identifier info and then check again; if the macro is
4952 // still defined and associated with the identifier,
4953 IdentifierInfo *II = getLocalIdentifier(M, Record[0]);
4954 MacroDefinition *MD
4955 = new (PPRec) MacroDefinition(II, Range);
4956
4957 if (DeserializationListener)
4958 DeserializationListener->MacroDefinitionRead(PPID, MD);
4959
4960 return MD;
4961 }
4962
4963 case PPD_INCLUSION_DIRECTIVE: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00004964 const char *FullFileNameStart = Blob.data() + Record[0];
4965 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]);
Craig Toppera13603a2014-05-22 05:54:18 +00004966 const FileEntry *File = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00004967 if (!FullFileName.empty())
4968 File = PP.getFileManager().getFile(FullFileName);
4969
4970 // FIXME: Stable encoding
4971 InclusionDirective::InclusionKind Kind
4972 = static_cast<InclusionDirective::InclusionKind>(Record[2]);
4973 InclusionDirective *ID
4974 = new (PPRec) InclusionDirective(PPRec, Kind,
Chris Lattner0e6c9402013-01-20 02:38:54 +00004975 StringRef(Blob.data(), Record[0]),
Guy Benyei11169dd2012-12-18 14:30:41 +00004976 Record[1], Record[3],
4977 File,
4978 Range);
4979 return ID;
4980 }
4981 }
4982
4983 llvm_unreachable("Invalid PreprocessorDetailRecordTypes");
4984}
4985
4986/// \brief \arg SLocMapI points at a chunk of a module that contains no
4987/// preprocessed entities or the entities it contains are not the ones we are
4988/// looking for. Find the next module that contains entities and return the ID
4989/// of the first entry.
4990PreprocessedEntityID ASTReader::findNextPreprocessedEntity(
4991 GlobalSLocOffsetMapType::const_iterator SLocMapI) const {
4992 ++SLocMapI;
4993 for (GlobalSLocOffsetMapType::const_iterator
4994 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
4995 ModuleFile &M = *SLocMapI->second;
4996 if (M.NumPreprocessedEntities)
4997 return M.BasePreprocessedEntityID;
4998 }
4999
5000 return getTotalNumPreprocessedEntities();
5001}
5002
5003namespace {
5004
5005template <unsigned PPEntityOffset::*PPLoc>
5006struct PPEntityComp {
5007 const ASTReader &Reader;
5008 ModuleFile &M;
5009
5010 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) { }
5011
5012 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const {
5013 SourceLocation LHS = getLoc(L);
5014 SourceLocation RHS = getLoc(R);
5015 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
5016 }
5017
5018 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const {
5019 SourceLocation LHS = getLoc(L);
5020 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
5021 }
5022
5023 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const {
5024 SourceLocation RHS = getLoc(R);
5025 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
5026 }
5027
5028 SourceLocation getLoc(const PPEntityOffset &PPE) const {
5029 return Reader.ReadSourceLocation(M, PPE.*PPLoc);
5030 }
5031};
5032
5033}
5034
Alp Toker2e9ce4c2014-05-16 18:59:21 +00005035PreprocessedEntityID ASTReader::findPreprocessedEntity(SourceLocation Loc,
5036 bool EndsAfter) const {
5037 if (SourceMgr.isLocalSourceLocation(Loc))
Guy Benyei11169dd2012-12-18 14:30:41 +00005038 return getTotalNumPreprocessedEntities();
5039
Alp Toker2e9ce4c2014-05-16 18:59:21 +00005040 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
5041 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
Guy Benyei11169dd2012-12-18 14:30:41 +00005042 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
5043 "Corrupted global sloc offset map");
5044
5045 if (SLocMapI->second->NumPreprocessedEntities == 0)
5046 return findNextPreprocessedEntity(SLocMapI);
5047
5048 ModuleFile &M = *SLocMapI->second;
5049 typedef const PPEntityOffset *pp_iterator;
5050 pp_iterator pp_begin = M.PreprocessedEntityOffsets;
5051 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities;
5052
5053 size_t Count = M.NumPreprocessedEntities;
5054 size_t Half;
5055 pp_iterator First = pp_begin;
5056 pp_iterator PPI;
5057
Alp Toker2e9ce4c2014-05-16 18:59:21 +00005058 if (EndsAfter) {
5059 PPI = std::upper_bound(pp_begin, pp_end, Loc,
5060 PPEntityComp<&PPEntityOffset::Begin>(*this, M));
5061 } else {
5062 // Do a binary search manually instead of using std::lower_bound because
5063 // The end locations of entities may be unordered (when a macro expansion
5064 // is inside another macro argument), but for this case it is not important
5065 // whether we get the first macro expansion or its containing macro.
5066 while (Count > 0) {
5067 Half = Count / 2;
5068 PPI = First;
5069 std::advance(PPI, Half);
5070 if (SourceMgr.isBeforeInTranslationUnit(ReadSourceLocation(M, PPI->End),
5071 Loc)) {
5072 First = PPI;
5073 ++First;
5074 Count = Count - Half - 1;
5075 } else
5076 Count = Half;
5077 }
Guy Benyei11169dd2012-12-18 14:30:41 +00005078 }
5079
5080 if (PPI == pp_end)
5081 return findNextPreprocessedEntity(SLocMapI);
5082
5083 return M.BasePreprocessedEntityID + (PPI - pp_begin);
5084}
5085
Guy Benyei11169dd2012-12-18 14:30:41 +00005086/// \brief Returns a pair of [Begin, End) indices of preallocated
5087/// preprocessed entities that \arg Range encompasses.
5088std::pair<unsigned, unsigned>
5089 ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) {
5090 if (Range.isInvalid())
5091 return std::make_pair(0,0);
5092 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
5093
Alp Toker2e9ce4c2014-05-16 18:59:21 +00005094 PreprocessedEntityID BeginID =
5095 findPreprocessedEntity(Range.getBegin(), false);
5096 PreprocessedEntityID EndID = findPreprocessedEntity(Range.getEnd(), true);
Guy Benyei11169dd2012-12-18 14:30:41 +00005097 return std::make_pair(BeginID, EndID);
5098}
5099
5100/// \brief Optionally returns true or false if the preallocated preprocessed
5101/// entity with index \arg Index came from file \arg FID.
David Blaikie05785d12013-02-20 22:23:23 +00005102Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index,
Guy Benyei11169dd2012-12-18 14:30:41 +00005103 FileID FID) {
5104 if (FID.isInvalid())
5105 return false;
5106
5107 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
5108 ModuleFile &M = *PPInfo.first;
5109 unsigned LocalIndex = PPInfo.second;
5110 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
5111
5112 SourceLocation Loc = ReadSourceLocation(M, PPOffs.Begin);
5113 if (Loc.isInvalid())
5114 return false;
5115
5116 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
5117 return true;
5118 else
5119 return false;
5120}
5121
5122namespace {
5123 /// \brief Visitor used to search for information about a header file.
5124 class HeaderFileInfoVisitor {
Guy Benyei11169dd2012-12-18 14:30:41 +00005125 const FileEntry *FE;
5126
David Blaikie05785d12013-02-20 22:23:23 +00005127 Optional<HeaderFileInfo> HFI;
Guy Benyei11169dd2012-12-18 14:30:41 +00005128
5129 public:
Argyrios Kyrtzidis61a38962013-03-06 18:12:44 +00005130 explicit HeaderFileInfoVisitor(const FileEntry *FE)
5131 : FE(FE) { }
Guy Benyei11169dd2012-12-18 14:30:41 +00005132
5133 static bool visit(ModuleFile &M, void *UserData) {
5134 HeaderFileInfoVisitor *This
5135 = static_cast<HeaderFileInfoVisitor *>(UserData);
5136
Guy Benyei11169dd2012-12-18 14:30:41 +00005137 HeaderFileInfoLookupTable *Table
5138 = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable);
5139 if (!Table)
5140 return false;
5141
5142 // Look in the on-disk hash table for an entry for this file name.
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00005143 HeaderFileInfoLookupTable::iterator Pos = Table->find(This->FE);
Guy Benyei11169dd2012-12-18 14:30:41 +00005144 if (Pos == Table->end())
5145 return false;
5146
5147 This->HFI = *Pos;
5148 return true;
5149 }
5150
David Blaikie05785d12013-02-20 22:23:23 +00005151 Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; }
Guy Benyei11169dd2012-12-18 14:30:41 +00005152 };
5153}
5154
5155HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) {
Argyrios Kyrtzidis61a38962013-03-06 18:12:44 +00005156 HeaderFileInfoVisitor Visitor(FE);
Guy Benyei11169dd2012-12-18 14:30:41 +00005157 ModuleMgr.visit(&HeaderFileInfoVisitor::visit, &Visitor);
Argyrios Kyrtzidis1054bbf2013-05-08 23:46:55 +00005158 if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
Guy Benyei11169dd2012-12-18 14:30:41 +00005159 return *HFI;
Guy Benyei11169dd2012-12-18 14:30:41 +00005160
5161 return HeaderFileInfo();
5162}
5163
5164void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) {
5165 // FIXME: Make it work properly with modules.
Dmitri Gribenkof8579502013-01-12 19:30:44 +00005166 SmallVector<DiagnosticsEngine::DiagState *, 32> DiagStates;
Guy Benyei11169dd2012-12-18 14:30:41 +00005167 for (ModuleIterator I = ModuleMgr.begin(), E = ModuleMgr.end(); I != E; ++I) {
5168 ModuleFile &F = *(*I);
5169 unsigned Idx = 0;
5170 DiagStates.clear();
5171 assert(!Diag.DiagStates.empty());
5172 DiagStates.push_back(&Diag.DiagStates.front()); // the command-line one.
5173 while (Idx < F.PragmaDiagMappings.size()) {
5174 SourceLocation Loc = ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]);
5175 unsigned DiagStateID = F.PragmaDiagMappings[Idx++];
5176 if (DiagStateID != 0) {
5177 Diag.DiagStatePoints.push_back(
5178 DiagnosticsEngine::DiagStatePoint(DiagStates[DiagStateID-1],
5179 FullSourceLoc(Loc, SourceMgr)));
5180 continue;
5181 }
5182
5183 assert(DiagStateID == 0);
5184 // A new DiagState was created here.
5185 Diag.DiagStates.push_back(*Diag.GetCurDiagState());
5186 DiagnosticsEngine::DiagState *NewState = &Diag.DiagStates.back();
5187 DiagStates.push_back(NewState);
5188 Diag.DiagStatePoints.push_back(
5189 DiagnosticsEngine::DiagStatePoint(NewState,
5190 FullSourceLoc(Loc, SourceMgr)));
5191 while (1) {
5192 assert(Idx < F.PragmaDiagMappings.size() &&
5193 "Invalid data, didn't find '-1' marking end of diag/map pairs");
5194 if (Idx >= F.PragmaDiagMappings.size()) {
5195 break; // Something is messed up but at least avoid infinite loop in
5196 // release build.
5197 }
5198 unsigned DiagID = F.PragmaDiagMappings[Idx++];
5199 if (DiagID == (unsigned)-1) {
5200 break; // no more diag/map pairs for this location.
5201 }
Alp Tokerc726c362014-06-10 09:31:37 +00005202 diag::Severity Map = (diag::Severity)F.PragmaDiagMappings[Idx++];
5203 DiagnosticMapping Mapping = Diag.makeUserMapping(Map, Loc);
5204 Diag.GetCurDiagState()->setMapping(DiagID, Mapping);
Guy Benyei11169dd2012-12-18 14:30:41 +00005205 }
5206 }
5207 }
5208}
5209
5210/// \brief Get the correct cursor and offset for loading a type.
5211ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) {
5212 GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index);
5213 assert(I != GlobalTypeMap.end() && "Corrupted global type map");
5214 ModuleFile *M = I->second;
5215 return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex]);
5216}
5217
5218/// \brief Read and return the type with the given index..
5219///
5220/// The index is the type ID, shifted and minus the number of predefs. This
5221/// routine actually reads the record corresponding to the type at the given
5222/// location. It is a helper routine for GetType, which deals with reading type
5223/// IDs.
5224QualType ASTReader::readTypeRecord(unsigned Index) {
5225 RecordLocation Loc = TypeCursorForIndex(Index);
Chris Lattner7fb3bef2013-01-20 00:56:42 +00005226 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00005227
5228 // Keep track of where we are in the stream, then jump back there
5229 // after reading this type.
5230 SavedStreamPosition SavedPosition(DeclsCursor);
5231
5232 ReadingKindTracker ReadingKind(Read_Type, *this);
5233
5234 // Note that we are loading a type record.
5235 Deserializing AType(this);
5236
5237 unsigned Idx = 0;
5238 DeclsCursor.JumpToBit(Loc.Offset);
5239 RecordData Record;
5240 unsigned Code = DeclsCursor.ReadCode();
Chris Lattner0e6c9402013-01-20 02:38:54 +00005241 switch ((TypeCode)DeclsCursor.readRecord(Code, Record)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00005242 case TYPE_EXT_QUAL: {
5243 if (Record.size() != 2) {
5244 Error("Incorrect encoding of extended qualifier type");
5245 return QualType();
5246 }
5247 QualType Base = readType(*Loc.F, Record, Idx);
5248 Qualifiers Quals = Qualifiers::fromOpaqueValue(Record[Idx++]);
5249 return Context.getQualifiedType(Base, Quals);
5250 }
5251
5252 case TYPE_COMPLEX: {
5253 if (Record.size() != 1) {
5254 Error("Incorrect encoding of complex type");
5255 return QualType();
5256 }
5257 QualType ElemType = readType(*Loc.F, Record, Idx);
5258 return Context.getComplexType(ElemType);
5259 }
5260
5261 case TYPE_POINTER: {
5262 if (Record.size() != 1) {
5263 Error("Incorrect encoding of pointer type");
5264 return QualType();
5265 }
5266 QualType PointeeType = readType(*Loc.F, Record, Idx);
5267 return Context.getPointerType(PointeeType);
5268 }
5269
Reid Kleckner8a365022013-06-24 17:51:48 +00005270 case TYPE_DECAYED: {
5271 if (Record.size() != 1) {
5272 Error("Incorrect encoding of decayed type");
5273 return QualType();
5274 }
5275 QualType OriginalType = readType(*Loc.F, Record, Idx);
5276 QualType DT = Context.getAdjustedParameterType(OriginalType);
5277 if (!isa<DecayedType>(DT))
5278 Error("Decayed type does not decay");
5279 return DT;
5280 }
5281
Reid Kleckner0503a872013-12-05 01:23:43 +00005282 case TYPE_ADJUSTED: {
5283 if (Record.size() != 2) {
5284 Error("Incorrect encoding of adjusted type");
5285 return QualType();
5286 }
5287 QualType OriginalTy = readType(*Loc.F, Record, Idx);
5288 QualType AdjustedTy = readType(*Loc.F, Record, Idx);
5289 return Context.getAdjustedType(OriginalTy, AdjustedTy);
5290 }
5291
Guy Benyei11169dd2012-12-18 14:30:41 +00005292 case TYPE_BLOCK_POINTER: {
5293 if (Record.size() != 1) {
5294 Error("Incorrect encoding of block pointer type");
5295 return QualType();
5296 }
5297 QualType PointeeType = readType(*Loc.F, Record, Idx);
5298 return Context.getBlockPointerType(PointeeType);
5299 }
5300
5301 case TYPE_LVALUE_REFERENCE: {
5302 if (Record.size() != 2) {
5303 Error("Incorrect encoding of lvalue reference type");
5304 return QualType();
5305 }
5306 QualType PointeeType = readType(*Loc.F, Record, Idx);
5307 return Context.getLValueReferenceType(PointeeType, Record[1]);
5308 }
5309
5310 case TYPE_RVALUE_REFERENCE: {
5311 if (Record.size() != 1) {
5312 Error("Incorrect encoding of rvalue reference type");
5313 return QualType();
5314 }
5315 QualType PointeeType = readType(*Loc.F, Record, Idx);
5316 return Context.getRValueReferenceType(PointeeType);
5317 }
5318
5319 case TYPE_MEMBER_POINTER: {
5320 if (Record.size() != 2) {
5321 Error("Incorrect encoding of member pointer type");
5322 return QualType();
5323 }
5324 QualType PointeeType = readType(*Loc.F, Record, Idx);
5325 QualType ClassType = readType(*Loc.F, Record, Idx);
5326 if (PointeeType.isNull() || ClassType.isNull())
5327 return QualType();
5328
5329 return Context.getMemberPointerType(PointeeType, ClassType.getTypePtr());
5330 }
5331
5332 case TYPE_CONSTANT_ARRAY: {
5333 QualType ElementType = readType(*Loc.F, Record, Idx);
5334 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5335 unsigned IndexTypeQuals = Record[2];
5336 unsigned Idx = 3;
5337 llvm::APInt Size = ReadAPInt(Record, Idx);
5338 return Context.getConstantArrayType(ElementType, Size,
5339 ASM, IndexTypeQuals);
5340 }
5341
5342 case TYPE_INCOMPLETE_ARRAY: {
5343 QualType ElementType = readType(*Loc.F, Record, Idx);
5344 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5345 unsigned IndexTypeQuals = Record[2];
5346 return Context.getIncompleteArrayType(ElementType, ASM, IndexTypeQuals);
5347 }
5348
5349 case TYPE_VARIABLE_ARRAY: {
5350 QualType ElementType = readType(*Loc.F, Record, Idx);
5351 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5352 unsigned IndexTypeQuals = Record[2];
5353 SourceLocation LBLoc = ReadSourceLocation(*Loc.F, Record[3]);
5354 SourceLocation RBLoc = ReadSourceLocation(*Loc.F, Record[4]);
5355 return Context.getVariableArrayType(ElementType, ReadExpr(*Loc.F),
5356 ASM, IndexTypeQuals,
5357 SourceRange(LBLoc, RBLoc));
5358 }
5359
5360 case TYPE_VECTOR: {
5361 if (Record.size() != 3) {
5362 Error("incorrect encoding of vector type in AST file");
5363 return QualType();
5364 }
5365
5366 QualType ElementType = readType(*Loc.F, Record, Idx);
5367 unsigned NumElements = Record[1];
5368 unsigned VecKind = Record[2];
5369 return Context.getVectorType(ElementType, NumElements,
5370 (VectorType::VectorKind)VecKind);
5371 }
5372
5373 case TYPE_EXT_VECTOR: {
5374 if (Record.size() != 3) {
5375 Error("incorrect encoding of extended vector type in AST file");
5376 return QualType();
5377 }
5378
5379 QualType ElementType = readType(*Loc.F, Record, Idx);
5380 unsigned NumElements = Record[1];
5381 return Context.getExtVectorType(ElementType, NumElements);
5382 }
5383
5384 case TYPE_FUNCTION_NO_PROTO: {
5385 if (Record.size() != 6) {
5386 Error("incorrect encoding of no-proto function type");
5387 return QualType();
5388 }
5389 QualType ResultType = readType(*Loc.F, Record, Idx);
5390 FunctionType::ExtInfo Info(Record[1], Record[2], Record[3],
5391 (CallingConv)Record[4], Record[5]);
5392 return Context.getFunctionNoProtoType(ResultType, Info);
5393 }
5394
5395 case TYPE_FUNCTION_PROTO: {
5396 QualType ResultType = readType(*Loc.F, Record, Idx);
5397
5398 FunctionProtoType::ExtProtoInfo EPI;
5399 EPI.ExtInfo = FunctionType::ExtInfo(/*noreturn*/ Record[1],
5400 /*hasregparm*/ Record[2],
5401 /*regparm*/ Record[3],
5402 static_cast<CallingConv>(Record[4]),
5403 /*produces*/ Record[5]);
5404
5405 unsigned Idx = 6;
Guy Benyei11169dd2012-12-18 14:30:41 +00005406
5407 EPI.Variadic = Record[Idx++];
5408 EPI.HasTrailingReturn = Record[Idx++];
5409 EPI.TypeQuals = Record[Idx++];
5410 EPI.RefQualifier = static_cast<RefQualifierKind>(Record[Idx++]);
Richard Smith564417a2014-03-20 21:47:22 +00005411 SmallVector<QualType, 8> ExceptionStorage;
Richard Smith8acb4282014-07-31 21:57:55 +00005412 readExceptionSpec(*Loc.F, ExceptionStorage, EPI.ExceptionSpec, Record, Idx);
Richard Smith01b2cb42014-07-26 06:37:51 +00005413
5414 unsigned NumParams = Record[Idx++];
5415 SmallVector<QualType, 16> ParamTypes;
5416 for (unsigned I = 0; I != NumParams; ++I)
5417 ParamTypes.push_back(readType(*Loc.F, Record, Idx));
5418
Jordan Rose5c382722013-03-08 21:51:21 +00005419 return Context.getFunctionType(ResultType, ParamTypes, EPI);
Guy Benyei11169dd2012-12-18 14:30:41 +00005420 }
5421
5422 case TYPE_UNRESOLVED_USING: {
5423 unsigned Idx = 0;
5424 return Context.getTypeDeclType(
5425 ReadDeclAs<UnresolvedUsingTypenameDecl>(*Loc.F, Record, Idx));
5426 }
5427
5428 case TYPE_TYPEDEF: {
5429 if (Record.size() != 2) {
5430 Error("incorrect encoding of typedef type");
5431 return QualType();
5432 }
5433 unsigned Idx = 0;
5434 TypedefNameDecl *Decl = ReadDeclAs<TypedefNameDecl>(*Loc.F, Record, Idx);
5435 QualType Canonical = readType(*Loc.F, Record, Idx);
5436 if (!Canonical.isNull())
5437 Canonical = Context.getCanonicalType(Canonical);
5438 return Context.getTypedefType(Decl, Canonical);
5439 }
5440
5441 case TYPE_TYPEOF_EXPR:
5442 return Context.getTypeOfExprType(ReadExpr(*Loc.F));
5443
5444 case TYPE_TYPEOF: {
5445 if (Record.size() != 1) {
5446 Error("incorrect encoding of typeof(type) in AST file");
5447 return QualType();
5448 }
5449 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5450 return Context.getTypeOfType(UnderlyingType);
5451 }
5452
5453 case TYPE_DECLTYPE: {
5454 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5455 return Context.getDecltypeType(ReadExpr(*Loc.F), UnderlyingType);
5456 }
5457
5458 case TYPE_UNARY_TRANSFORM: {
5459 QualType BaseType = readType(*Loc.F, Record, Idx);
5460 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5461 UnaryTransformType::UTTKind UKind = (UnaryTransformType::UTTKind)Record[2];
5462 return Context.getUnaryTransformType(BaseType, UnderlyingType, UKind);
5463 }
5464
Richard Smith74aeef52013-04-26 16:15:35 +00005465 case TYPE_AUTO: {
5466 QualType Deduced = readType(*Loc.F, Record, Idx);
5467 bool IsDecltypeAuto = Record[Idx++];
Richard Smith27d807c2013-04-30 13:56:41 +00005468 bool IsDependent = Deduced.isNull() ? Record[Idx++] : false;
Manuel Klimek2fdbea22013-08-22 12:12:24 +00005469 return Context.getAutoType(Deduced, IsDecltypeAuto, IsDependent);
Richard Smith74aeef52013-04-26 16:15:35 +00005470 }
Guy Benyei11169dd2012-12-18 14:30:41 +00005471
5472 case TYPE_RECORD: {
5473 if (Record.size() != 2) {
5474 Error("incorrect encoding of record type");
5475 return QualType();
5476 }
5477 unsigned Idx = 0;
5478 bool IsDependent = Record[Idx++];
5479 RecordDecl *RD = ReadDeclAs<RecordDecl>(*Loc.F, Record, Idx);
5480 RD = cast_or_null<RecordDecl>(RD->getCanonicalDecl());
5481 QualType T = Context.getRecordType(RD);
5482 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5483 return T;
5484 }
5485
5486 case TYPE_ENUM: {
5487 if (Record.size() != 2) {
5488 Error("incorrect encoding of enum type");
5489 return QualType();
5490 }
5491 unsigned Idx = 0;
5492 bool IsDependent = Record[Idx++];
5493 QualType T
5494 = Context.getEnumType(ReadDeclAs<EnumDecl>(*Loc.F, Record, Idx));
5495 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5496 return T;
5497 }
5498
5499 case TYPE_ATTRIBUTED: {
5500 if (Record.size() != 3) {
5501 Error("incorrect encoding of attributed type");
5502 return QualType();
5503 }
5504 QualType modifiedType = readType(*Loc.F, Record, Idx);
5505 QualType equivalentType = readType(*Loc.F, Record, Idx);
5506 AttributedType::Kind kind = static_cast<AttributedType::Kind>(Record[2]);
5507 return Context.getAttributedType(kind, modifiedType, equivalentType);
5508 }
5509
5510 case TYPE_PAREN: {
5511 if (Record.size() != 1) {
5512 Error("incorrect encoding of paren type");
5513 return QualType();
5514 }
5515 QualType InnerType = readType(*Loc.F, Record, Idx);
5516 return Context.getParenType(InnerType);
5517 }
5518
5519 case TYPE_PACK_EXPANSION: {
5520 if (Record.size() != 2) {
5521 Error("incorrect encoding of pack expansion type");
5522 return QualType();
5523 }
5524 QualType Pattern = readType(*Loc.F, Record, Idx);
5525 if (Pattern.isNull())
5526 return QualType();
David Blaikie05785d12013-02-20 22:23:23 +00005527 Optional<unsigned> NumExpansions;
Guy Benyei11169dd2012-12-18 14:30:41 +00005528 if (Record[1])
5529 NumExpansions = Record[1] - 1;
5530 return Context.getPackExpansionType(Pattern, NumExpansions);
5531 }
5532
5533 case TYPE_ELABORATED: {
5534 unsigned Idx = 0;
5535 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5536 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5537 QualType NamedType = readType(*Loc.F, Record, Idx);
5538 return Context.getElaboratedType(Keyword, NNS, NamedType);
5539 }
5540
5541 case TYPE_OBJC_INTERFACE: {
5542 unsigned Idx = 0;
5543 ObjCInterfaceDecl *ItfD
5544 = ReadDeclAs<ObjCInterfaceDecl>(*Loc.F, Record, Idx);
5545 return Context.getObjCInterfaceType(ItfD->getCanonicalDecl());
5546 }
5547
5548 case TYPE_OBJC_OBJECT: {
5549 unsigned Idx = 0;
5550 QualType Base = readType(*Loc.F, Record, Idx);
5551 unsigned NumProtos = Record[Idx++];
5552 SmallVector<ObjCProtocolDecl*, 4> Protos;
5553 for (unsigned I = 0; I != NumProtos; ++I)
5554 Protos.push_back(ReadDeclAs<ObjCProtocolDecl>(*Loc.F, Record, Idx));
5555 return Context.getObjCObjectType(Base, Protos.data(), NumProtos);
5556 }
5557
5558 case TYPE_OBJC_OBJECT_POINTER: {
5559 unsigned Idx = 0;
5560 QualType Pointee = readType(*Loc.F, Record, Idx);
5561 return Context.getObjCObjectPointerType(Pointee);
5562 }
5563
5564 case TYPE_SUBST_TEMPLATE_TYPE_PARM: {
5565 unsigned Idx = 0;
5566 QualType Parm = readType(*Loc.F, Record, Idx);
5567 QualType Replacement = readType(*Loc.F, Record, Idx);
Stephan Tolksdorfe96f8b32014-03-15 10:23:27 +00005568 return Context.getSubstTemplateTypeParmType(
5569 cast<TemplateTypeParmType>(Parm),
5570 Context.getCanonicalType(Replacement));
Guy Benyei11169dd2012-12-18 14:30:41 +00005571 }
5572
5573 case TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK: {
5574 unsigned Idx = 0;
5575 QualType Parm = readType(*Loc.F, Record, Idx);
5576 TemplateArgument ArgPack = ReadTemplateArgument(*Loc.F, Record, Idx);
5577 return Context.getSubstTemplateTypeParmPackType(
5578 cast<TemplateTypeParmType>(Parm),
5579 ArgPack);
5580 }
5581
5582 case TYPE_INJECTED_CLASS_NAME: {
5583 CXXRecordDecl *D = ReadDeclAs<CXXRecordDecl>(*Loc.F, Record, Idx);
5584 QualType TST = readType(*Loc.F, Record, Idx); // probably derivable
5585 // FIXME: ASTContext::getInjectedClassNameType is not currently suitable
5586 // for AST reading, too much interdependencies.
Richard Smith6377f8f2014-10-21 21:15:18 +00005587 const Type *T = nullptr;
5588 for (auto *DI = D; DI; DI = DI->getPreviousDecl()) {
5589 if (const Type *Existing = DI->getTypeForDecl()) {
5590 T = Existing;
5591 break;
5592 }
5593 }
5594 if (!T) {
Richard Smithf17fdbd2014-04-24 02:25:27 +00005595 T = new (Context, TypeAlignment) InjectedClassNameType(D, TST);
Richard Smith6377f8f2014-10-21 21:15:18 +00005596 for (auto *DI = D; DI; DI = DI->getPreviousDecl())
5597 DI->setTypeForDecl(T);
5598 }
Richard Smithf17fdbd2014-04-24 02:25:27 +00005599 return QualType(T, 0);
Guy Benyei11169dd2012-12-18 14:30:41 +00005600 }
5601
5602 case TYPE_TEMPLATE_TYPE_PARM: {
5603 unsigned Idx = 0;
5604 unsigned Depth = Record[Idx++];
5605 unsigned Index = Record[Idx++];
5606 bool Pack = Record[Idx++];
5607 TemplateTypeParmDecl *D
5608 = ReadDeclAs<TemplateTypeParmDecl>(*Loc.F, Record, Idx);
5609 return Context.getTemplateTypeParmType(Depth, Index, Pack, D);
5610 }
5611
5612 case TYPE_DEPENDENT_NAME: {
5613 unsigned Idx = 0;
5614 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5615 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5616 const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx);
5617 QualType Canon = readType(*Loc.F, Record, Idx);
5618 if (!Canon.isNull())
5619 Canon = Context.getCanonicalType(Canon);
5620 return Context.getDependentNameType(Keyword, NNS, Name, Canon);
5621 }
5622
5623 case TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION: {
5624 unsigned Idx = 0;
5625 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5626 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5627 const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx);
5628 unsigned NumArgs = Record[Idx++];
5629 SmallVector<TemplateArgument, 8> Args;
5630 Args.reserve(NumArgs);
5631 while (NumArgs--)
5632 Args.push_back(ReadTemplateArgument(*Loc.F, Record, Idx));
5633 return Context.getDependentTemplateSpecializationType(Keyword, NNS, Name,
5634 Args.size(), Args.data());
5635 }
5636
5637 case TYPE_DEPENDENT_SIZED_ARRAY: {
5638 unsigned Idx = 0;
5639
5640 // ArrayType
5641 QualType ElementType = readType(*Loc.F, Record, Idx);
5642 ArrayType::ArraySizeModifier ASM
5643 = (ArrayType::ArraySizeModifier)Record[Idx++];
5644 unsigned IndexTypeQuals = Record[Idx++];
5645
5646 // DependentSizedArrayType
5647 Expr *NumElts = ReadExpr(*Loc.F);
5648 SourceRange Brackets = ReadSourceRange(*Loc.F, Record, Idx);
5649
5650 return Context.getDependentSizedArrayType(ElementType, NumElts, ASM,
5651 IndexTypeQuals, Brackets);
5652 }
5653
5654 case TYPE_TEMPLATE_SPECIALIZATION: {
5655 unsigned Idx = 0;
5656 bool IsDependent = Record[Idx++];
5657 TemplateName Name = ReadTemplateName(*Loc.F, Record, Idx);
5658 SmallVector<TemplateArgument, 8> Args;
5659 ReadTemplateArgumentList(Args, *Loc.F, Record, Idx);
5660 QualType Underlying = readType(*Loc.F, Record, Idx);
5661 QualType T;
5662 if (Underlying.isNull())
5663 T = Context.getCanonicalTemplateSpecializationType(Name, Args.data(),
5664 Args.size());
5665 else
5666 T = Context.getTemplateSpecializationType(Name, Args.data(),
5667 Args.size(), Underlying);
5668 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5669 return T;
5670 }
5671
5672 case TYPE_ATOMIC: {
5673 if (Record.size() != 1) {
5674 Error("Incorrect encoding of atomic type");
5675 return QualType();
5676 }
5677 QualType ValueType = readType(*Loc.F, Record, Idx);
5678 return Context.getAtomicType(ValueType);
5679 }
5680 }
5681 llvm_unreachable("Invalid TypeCode!");
5682}
5683
Richard Smith564417a2014-03-20 21:47:22 +00005684void ASTReader::readExceptionSpec(ModuleFile &ModuleFile,
5685 SmallVectorImpl<QualType> &Exceptions,
Richard Smith8acb4282014-07-31 21:57:55 +00005686 FunctionProtoType::ExceptionSpecInfo &ESI,
Richard Smith564417a2014-03-20 21:47:22 +00005687 const RecordData &Record, unsigned &Idx) {
5688 ExceptionSpecificationType EST =
5689 static_cast<ExceptionSpecificationType>(Record[Idx++]);
Richard Smith8acb4282014-07-31 21:57:55 +00005690 ESI.Type = EST;
Richard Smith564417a2014-03-20 21:47:22 +00005691 if (EST == EST_Dynamic) {
Richard Smith8acb4282014-07-31 21:57:55 +00005692 for (unsigned I = 0, N = Record[Idx++]; I != N; ++I)
Richard Smith564417a2014-03-20 21:47:22 +00005693 Exceptions.push_back(readType(ModuleFile, Record, Idx));
Richard Smith8acb4282014-07-31 21:57:55 +00005694 ESI.Exceptions = Exceptions;
Richard Smith564417a2014-03-20 21:47:22 +00005695 } else if (EST == EST_ComputedNoexcept) {
Richard Smith8acb4282014-07-31 21:57:55 +00005696 ESI.NoexceptExpr = ReadExpr(ModuleFile);
Richard Smith564417a2014-03-20 21:47:22 +00005697 } else if (EST == EST_Uninstantiated) {
Richard Smith8acb4282014-07-31 21:57:55 +00005698 ESI.SourceDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
5699 ESI.SourceTemplate = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
Richard Smith564417a2014-03-20 21:47:22 +00005700 } else if (EST == EST_Unevaluated) {
Richard Smith8acb4282014-07-31 21:57:55 +00005701 ESI.SourceDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
Richard Smith564417a2014-03-20 21:47:22 +00005702 }
5703}
5704
Guy Benyei11169dd2012-12-18 14:30:41 +00005705class clang::TypeLocReader : public TypeLocVisitor<TypeLocReader> {
5706 ASTReader &Reader;
5707 ModuleFile &F;
5708 const ASTReader::RecordData &Record;
5709 unsigned &Idx;
5710
5711 SourceLocation ReadSourceLocation(const ASTReader::RecordData &R,
5712 unsigned &I) {
5713 return Reader.ReadSourceLocation(F, R, I);
5714 }
5715
5716 template<typename T>
5717 T *ReadDeclAs(const ASTReader::RecordData &Record, unsigned &Idx) {
5718 return Reader.ReadDeclAs<T>(F, Record, Idx);
5719 }
5720
5721public:
5722 TypeLocReader(ASTReader &Reader, ModuleFile &F,
5723 const ASTReader::RecordData &Record, unsigned &Idx)
5724 : Reader(Reader), F(F), Record(Record), Idx(Idx)
5725 { }
5726
5727 // We want compile-time assurance that we've enumerated all of
5728 // these, so unfortunately we have to declare them first, then
5729 // define them out-of-line.
5730#define ABSTRACT_TYPELOC(CLASS, PARENT)
5731#define TYPELOC(CLASS, PARENT) \
5732 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
5733#include "clang/AST/TypeLocNodes.def"
5734
5735 void VisitFunctionTypeLoc(FunctionTypeLoc);
5736 void VisitArrayTypeLoc(ArrayTypeLoc);
5737};
5738
5739void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
5740 // nothing to do
5741}
5742void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
5743 TL.setBuiltinLoc(ReadSourceLocation(Record, Idx));
5744 if (TL.needsExtraLocalData()) {
5745 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Record[Idx++]));
5746 TL.setWrittenSignSpec(static_cast<DeclSpec::TSS>(Record[Idx++]));
5747 TL.setWrittenWidthSpec(static_cast<DeclSpec::TSW>(Record[Idx++]));
5748 TL.setModeAttr(Record[Idx++]);
5749 }
5750}
5751void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
5752 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5753}
5754void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
5755 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5756}
Reid Kleckner8a365022013-06-24 17:51:48 +00005757void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
5758 // nothing to do
5759}
Reid Kleckner0503a872013-12-05 01:23:43 +00005760void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
5761 // nothing to do
5762}
Guy Benyei11169dd2012-12-18 14:30:41 +00005763void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
5764 TL.setCaretLoc(ReadSourceLocation(Record, Idx));
5765}
5766void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
5767 TL.setAmpLoc(ReadSourceLocation(Record, Idx));
5768}
5769void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
5770 TL.setAmpAmpLoc(ReadSourceLocation(Record, Idx));
5771}
5772void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
5773 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5774 TL.setClassTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5775}
5776void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) {
5777 TL.setLBracketLoc(ReadSourceLocation(Record, Idx));
5778 TL.setRBracketLoc(ReadSourceLocation(Record, Idx));
5779 if (Record[Idx++])
5780 TL.setSizeExpr(Reader.ReadExpr(F));
5781 else
Craig Toppera13603a2014-05-22 05:54:18 +00005782 TL.setSizeExpr(nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00005783}
5784void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) {
5785 VisitArrayTypeLoc(TL);
5786}
5787void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) {
5788 VisitArrayTypeLoc(TL);
5789}
5790void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
5791 VisitArrayTypeLoc(TL);
5792}
5793void TypeLocReader::VisitDependentSizedArrayTypeLoc(
5794 DependentSizedArrayTypeLoc TL) {
5795 VisitArrayTypeLoc(TL);
5796}
5797void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
5798 DependentSizedExtVectorTypeLoc TL) {
5799 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5800}
5801void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
5802 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5803}
5804void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
5805 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5806}
5807void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) {
5808 TL.setLocalRangeBegin(ReadSourceLocation(Record, Idx));
5809 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5810 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5811 TL.setLocalRangeEnd(ReadSourceLocation(Record, Idx));
Alp Tokerb3fd5cf2014-01-21 00:32:38 +00005812 for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) {
5813 TL.setParam(i, ReadDeclAs<ParmVarDecl>(Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00005814 }
5815}
5816void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) {
5817 VisitFunctionTypeLoc(TL);
5818}
5819void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) {
5820 VisitFunctionTypeLoc(TL);
5821}
5822void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
5823 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5824}
5825void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
5826 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5827}
5828void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
5829 TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
5830 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5831 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5832}
5833void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
5834 TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
5835 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5836 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5837 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5838}
5839void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
5840 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5841}
5842void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
5843 TL.setKWLoc(ReadSourceLocation(Record, Idx));
5844 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5845 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5846 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5847}
5848void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) {
5849 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5850}
5851void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) {
5852 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5853}
5854void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) {
5855 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5856}
5857void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
5858 TL.setAttrNameLoc(ReadSourceLocation(Record, Idx));
5859 if (TL.hasAttrOperand()) {
5860 SourceRange range;
5861 range.setBegin(ReadSourceLocation(Record, Idx));
5862 range.setEnd(ReadSourceLocation(Record, Idx));
5863 TL.setAttrOperandParensRange(range);
5864 }
5865 if (TL.hasAttrExprOperand()) {
5866 if (Record[Idx++])
5867 TL.setAttrExprOperand(Reader.ReadExpr(F));
5868 else
Craig Toppera13603a2014-05-22 05:54:18 +00005869 TL.setAttrExprOperand(nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00005870 } else if (TL.hasAttrEnumOperand())
5871 TL.setAttrEnumOperandLoc(ReadSourceLocation(Record, Idx));
5872}
5873void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
5874 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5875}
5876void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
5877 SubstTemplateTypeParmTypeLoc TL) {
5878 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5879}
5880void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
5881 SubstTemplateTypeParmPackTypeLoc TL) {
5882 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5883}
5884void TypeLocReader::VisitTemplateSpecializationTypeLoc(
5885 TemplateSpecializationTypeLoc TL) {
5886 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx));
5887 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx));
5888 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5889 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5890 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i)
5891 TL.setArgLocInfo(i,
5892 Reader.GetTemplateArgumentLocInfo(F,
5893 TL.getTypePtr()->getArg(i).getKind(),
5894 Record, Idx));
5895}
5896void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
5897 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5898 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5899}
5900void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
5901 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5902 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5903}
5904void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
5905 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5906}
5907void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
5908 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5909 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5910 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5911}
5912void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc(
5913 DependentTemplateSpecializationTypeLoc TL) {
5914 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5915 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5916 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx));
5917 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx));
5918 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5919 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5920 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
5921 TL.setArgLocInfo(I,
5922 Reader.GetTemplateArgumentLocInfo(F,
5923 TL.getTypePtr()->getArg(I).getKind(),
5924 Record, Idx));
5925}
5926void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
5927 TL.setEllipsisLoc(ReadSourceLocation(Record, Idx));
5928}
5929void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
5930 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5931}
5932void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
5933 TL.setHasBaseTypeAsWritten(Record[Idx++]);
5934 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5935 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5936 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
5937 TL.setProtocolLoc(i, ReadSourceLocation(Record, Idx));
5938}
5939void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
5940 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5941}
5942void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
5943 TL.setKWLoc(ReadSourceLocation(Record, Idx));
5944 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5945 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5946}
5947
5948TypeSourceInfo *ASTReader::GetTypeSourceInfo(ModuleFile &F,
5949 const RecordData &Record,
5950 unsigned &Idx) {
5951 QualType InfoTy = readType(F, Record, Idx);
5952 if (InfoTy.isNull())
Craig Toppera13603a2014-05-22 05:54:18 +00005953 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00005954
5955 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy);
5956 TypeLocReader TLR(*this, F, Record, Idx);
5957 for (TypeLoc TL = TInfo->getTypeLoc(); !TL.isNull(); TL = TL.getNextTypeLoc())
5958 TLR.Visit(TL);
5959 return TInfo;
5960}
5961
5962QualType ASTReader::GetType(TypeID ID) {
5963 unsigned FastQuals = ID & Qualifiers::FastMask;
5964 unsigned Index = ID >> Qualifiers::FastWidth;
5965
5966 if (Index < NUM_PREDEF_TYPE_IDS) {
5967 QualType T;
5968 switch ((PredefinedTypeIDs)Index) {
5969 case PREDEF_TYPE_NULL_ID: return QualType();
5970 case PREDEF_TYPE_VOID_ID: T = Context.VoidTy; break;
5971 case PREDEF_TYPE_BOOL_ID: T = Context.BoolTy; break;
5972
5973 case PREDEF_TYPE_CHAR_U_ID:
5974 case PREDEF_TYPE_CHAR_S_ID:
5975 // FIXME: Check that the signedness of CharTy is correct!
5976 T = Context.CharTy;
5977 break;
5978
5979 case PREDEF_TYPE_UCHAR_ID: T = Context.UnsignedCharTy; break;
5980 case PREDEF_TYPE_USHORT_ID: T = Context.UnsignedShortTy; break;
5981 case PREDEF_TYPE_UINT_ID: T = Context.UnsignedIntTy; break;
5982 case PREDEF_TYPE_ULONG_ID: T = Context.UnsignedLongTy; break;
5983 case PREDEF_TYPE_ULONGLONG_ID: T = Context.UnsignedLongLongTy; break;
5984 case PREDEF_TYPE_UINT128_ID: T = Context.UnsignedInt128Ty; break;
5985 case PREDEF_TYPE_SCHAR_ID: T = Context.SignedCharTy; break;
5986 case PREDEF_TYPE_WCHAR_ID: T = Context.WCharTy; break;
5987 case PREDEF_TYPE_SHORT_ID: T = Context.ShortTy; break;
5988 case PREDEF_TYPE_INT_ID: T = Context.IntTy; break;
5989 case PREDEF_TYPE_LONG_ID: T = Context.LongTy; break;
5990 case PREDEF_TYPE_LONGLONG_ID: T = Context.LongLongTy; break;
5991 case PREDEF_TYPE_INT128_ID: T = Context.Int128Ty; break;
5992 case PREDEF_TYPE_HALF_ID: T = Context.HalfTy; break;
5993 case PREDEF_TYPE_FLOAT_ID: T = Context.FloatTy; break;
5994 case PREDEF_TYPE_DOUBLE_ID: T = Context.DoubleTy; break;
5995 case PREDEF_TYPE_LONGDOUBLE_ID: T = Context.LongDoubleTy; break;
5996 case PREDEF_TYPE_OVERLOAD_ID: T = Context.OverloadTy; break;
5997 case PREDEF_TYPE_BOUND_MEMBER: T = Context.BoundMemberTy; break;
5998 case PREDEF_TYPE_PSEUDO_OBJECT: T = Context.PseudoObjectTy; break;
5999 case PREDEF_TYPE_DEPENDENT_ID: T = Context.DependentTy; break;
6000 case PREDEF_TYPE_UNKNOWN_ANY: T = Context.UnknownAnyTy; break;
6001 case PREDEF_TYPE_NULLPTR_ID: T = Context.NullPtrTy; break;
6002 case PREDEF_TYPE_CHAR16_ID: T = Context.Char16Ty; break;
6003 case PREDEF_TYPE_CHAR32_ID: T = Context.Char32Ty; break;
6004 case PREDEF_TYPE_OBJC_ID: T = Context.ObjCBuiltinIdTy; break;
6005 case PREDEF_TYPE_OBJC_CLASS: T = Context.ObjCBuiltinClassTy; break;
6006 case PREDEF_TYPE_OBJC_SEL: T = Context.ObjCBuiltinSelTy; break;
Guy Benyeid8a08ea2012-12-18 14:38:23 +00006007 case PREDEF_TYPE_IMAGE1D_ID: T = Context.OCLImage1dTy; break;
6008 case PREDEF_TYPE_IMAGE1D_ARR_ID: T = Context.OCLImage1dArrayTy; break;
6009 case PREDEF_TYPE_IMAGE1D_BUFF_ID: T = Context.OCLImage1dBufferTy; break;
6010 case PREDEF_TYPE_IMAGE2D_ID: T = Context.OCLImage2dTy; break;
6011 case PREDEF_TYPE_IMAGE2D_ARR_ID: T = Context.OCLImage2dArrayTy; break;
6012 case PREDEF_TYPE_IMAGE3D_ID: T = Context.OCLImage3dTy; break;
Guy Benyei61054192013-02-07 10:55:47 +00006013 case PREDEF_TYPE_SAMPLER_ID: T = Context.OCLSamplerTy; break;
Guy Benyei1b4fb3e2013-01-20 12:31:11 +00006014 case PREDEF_TYPE_EVENT_ID: T = Context.OCLEventTy; break;
Guy Benyei11169dd2012-12-18 14:30:41 +00006015 case PREDEF_TYPE_AUTO_DEDUCT: T = Context.getAutoDeductType(); break;
6016
6017 case PREDEF_TYPE_AUTO_RREF_DEDUCT:
6018 T = Context.getAutoRRefDeductType();
6019 break;
6020
6021 case PREDEF_TYPE_ARC_UNBRIDGED_CAST:
6022 T = Context.ARCUnbridgedCastTy;
6023 break;
6024
6025 case PREDEF_TYPE_VA_LIST_TAG:
6026 T = Context.getVaListTagType();
6027 break;
6028
6029 case PREDEF_TYPE_BUILTIN_FN:
6030 T = Context.BuiltinFnTy;
6031 break;
6032 }
6033
6034 assert(!T.isNull() && "Unknown predefined type");
6035 return T.withFastQualifiers(FastQuals);
6036 }
6037
6038 Index -= NUM_PREDEF_TYPE_IDS;
6039 assert(Index < TypesLoaded.size() && "Type index out-of-range");
6040 if (TypesLoaded[Index].isNull()) {
6041 TypesLoaded[Index] = readTypeRecord(Index);
6042 if (TypesLoaded[Index].isNull())
6043 return QualType();
6044
6045 TypesLoaded[Index]->setFromAST();
6046 if (DeserializationListener)
6047 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID),
6048 TypesLoaded[Index]);
6049 }
6050
6051 return TypesLoaded[Index].withFastQualifiers(FastQuals);
6052}
6053
6054QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) {
6055 return GetType(getGlobalTypeID(F, LocalID));
6056}
6057
6058serialization::TypeID
6059ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const {
6060 unsigned FastQuals = LocalID & Qualifiers::FastMask;
6061 unsigned LocalIndex = LocalID >> Qualifiers::FastWidth;
6062
6063 if (LocalIndex < NUM_PREDEF_TYPE_IDS)
6064 return LocalID;
6065
6066 ContinuousRangeMap<uint32_t, int, 2>::iterator I
6067 = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS);
6068 assert(I != F.TypeRemap.end() && "Invalid index into type index remap");
6069
6070 unsigned GlobalIndex = LocalIndex + I->second;
6071 return (GlobalIndex << Qualifiers::FastWidth) | FastQuals;
6072}
6073
6074TemplateArgumentLocInfo
6075ASTReader::GetTemplateArgumentLocInfo(ModuleFile &F,
6076 TemplateArgument::ArgKind Kind,
6077 const RecordData &Record,
6078 unsigned &Index) {
6079 switch (Kind) {
6080 case TemplateArgument::Expression:
6081 return ReadExpr(F);
6082 case TemplateArgument::Type:
6083 return GetTypeSourceInfo(F, Record, Index);
6084 case TemplateArgument::Template: {
6085 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
6086 Index);
6087 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
6088 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
6089 SourceLocation());
6090 }
6091 case TemplateArgument::TemplateExpansion: {
6092 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
6093 Index);
6094 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
6095 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Index);
6096 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
6097 EllipsisLoc);
6098 }
6099 case TemplateArgument::Null:
6100 case TemplateArgument::Integral:
6101 case TemplateArgument::Declaration:
6102 case TemplateArgument::NullPtr:
6103 case TemplateArgument::Pack:
6104 // FIXME: Is this right?
6105 return TemplateArgumentLocInfo();
6106 }
6107 llvm_unreachable("unexpected template argument loc");
6108}
6109
6110TemplateArgumentLoc
6111ASTReader::ReadTemplateArgumentLoc(ModuleFile &F,
6112 const RecordData &Record, unsigned &Index) {
6113 TemplateArgument Arg = ReadTemplateArgument(F, Record, Index);
6114
6115 if (Arg.getKind() == TemplateArgument::Expression) {
6116 if (Record[Index++]) // bool InfoHasSameExpr.
6117 return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr()));
6118 }
6119 return TemplateArgumentLoc(Arg, GetTemplateArgumentLocInfo(F, Arg.getKind(),
6120 Record, Index));
6121}
6122
Enea Zaffanella6dbe1872013-08-10 07:24:53 +00006123const ASTTemplateArgumentListInfo*
6124ASTReader::ReadASTTemplateArgumentListInfo(ModuleFile &F,
6125 const RecordData &Record,
6126 unsigned &Index) {
6127 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Index);
6128 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Index);
6129 unsigned NumArgsAsWritten = Record[Index++];
6130 TemplateArgumentListInfo TemplArgsInfo(LAngleLoc, RAngleLoc);
6131 for (unsigned i = 0; i != NumArgsAsWritten; ++i)
6132 TemplArgsInfo.addArgument(ReadTemplateArgumentLoc(F, Record, Index));
6133 return ASTTemplateArgumentListInfo::Create(getContext(), TemplArgsInfo);
6134}
6135
Guy Benyei11169dd2012-12-18 14:30:41 +00006136Decl *ASTReader::GetExternalDecl(uint32_t ID) {
6137 return GetDecl(ID);
6138}
6139
Richard Smith50895422015-01-31 03:04:55 +00006140template<typename TemplateSpecializationDecl>
6141static void completeRedeclChainForTemplateSpecialization(Decl *D) {
6142 if (auto *TSD = dyn_cast<TemplateSpecializationDecl>(D))
6143 TSD->getSpecializedTemplate()->LoadLazySpecializations();
6144}
6145
Richard Smith053f6c62014-05-16 23:01:30 +00006146void ASTReader::CompleteRedeclChain(const Decl *D) {
Richard Smith851072e2014-05-19 20:59:20 +00006147 if (NumCurrentElementsDeserializing) {
6148 // We arrange to not care about the complete redeclaration chain while we're
6149 // deserializing. Just remember that the AST has marked this one as complete
6150 // but that it's not actually complete yet, so we know we still need to
6151 // complete it later.
6152 PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D));
6153 return;
6154 }
6155
Richard Smith053f6c62014-05-16 23:01:30 +00006156 const DeclContext *DC = D->getDeclContext()->getRedeclContext();
6157
Richard Smith053f6c62014-05-16 23:01:30 +00006158 // If this is a named declaration, complete it by looking it up
6159 // within its context.
6160 //
Richard Smith01bdb7a2014-08-28 05:44:07 +00006161 // FIXME: Merging a function definition should merge
Richard Smith053f6c62014-05-16 23:01:30 +00006162 // all mergeable entities within it.
6163 if (isa<TranslationUnitDecl>(DC) || isa<NamespaceDecl>(DC) ||
6164 isa<CXXRecordDecl>(DC) || isa<EnumDecl>(DC)) {
6165 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) {
6166 auto *II = Name.getAsIdentifierInfo();
6167 if (isa<TranslationUnitDecl>(DC) && II) {
6168 // Outside of C++, we don't have a lookup table for the TU, so update
6169 // the identifier instead. In C++, either way should work fine.
6170 if (II->isOutOfDate())
6171 updateOutOfDateIdentifier(*II);
6172 } else
6173 DC->lookup(Name);
Richard Smith01bdb7a2014-08-28 05:44:07 +00006174 } else if (needsAnonymousDeclarationNumber(cast<NamedDecl>(D))) {
6175 // FIXME: It'd be nice to do something a bit more targeted here.
6176 D->getDeclContext()->decls_begin();
Richard Smith053f6c62014-05-16 23:01:30 +00006177 }
6178 }
Richard Smith50895422015-01-31 03:04:55 +00006179
6180 if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D))
6181 CTSD->getSpecializedTemplate()->LoadLazySpecializations();
6182 if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D))
6183 VTSD->getSpecializedTemplate()->LoadLazySpecializations();
6184 if (auto *FD = dyn_cast<FunctionDecl>(D)) {
6185 if (auto *Template = FD->getPrimaryTemplate())
6186 Template->LoadLazySpecializations();
6187 }
Richard Smith053f6c62014-05-16 23:01:30 +00006188}
6189
Richard Smithcd45dbc2014-04-19 03:48:30 +00006190uint64_t ASTReader::readCXXBaseSpecifiers(ModuleFile &M,
6191 const RecordData &Record,
6192 unsigned &Idx) {
6193 if (Idx >= Record.size() || Record[Idx] > M.LocalNumCXXBaseSpecifiers) {
6194 Error("malformed AST file: missing C++ base specifier");
Guy Benyei11169dd2012-12-18 14:30:41 +00006195 return 0;
Richard Smithcd45dbc2014-04-19 03:48:30 +00006196 }
6197
Guy Benyei11169dd2012-12-18 14:30:41 +00006198 unsigned LocalID = Record[Idx++];
6199 return getGlobalBitOffset(M, M.CXXBaseSpecifiersOffsets[LocalID - 1]);
6200}
6201
6202CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) {
6203 RecordLocation Loc = getLocalBitOffset(Offset);
Chris Lattner7fb3bef2013-01-20 00:56:42 +00006204 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00006205 SavedStreamPosition SavedPosition(Cursor);
6206 Cursor.JumpToBit(Loc.Offset);
6207 ReadingKindTracker ReadingKind(Read_Decl, *this);
6208 RecordData Record;
6209 unsigned Code = Cursor.ReadCode();
Chris Lattner0e6c9402013-01-20 02:38:54 +00006210 unsigned RecCode = Cursor.readRecord(Code, Record);
Guy Benyei11169dd2012-12-18 14:30:41 +00006211 if (RecCode != DECL_CXX_BASE_SPECIFIERS) {
Richard Smithcd45dbc2014-04-19 03:48:30 +00006212 Error("malformed AST file: missing C++ base specifiers");
Craig Toppera13603a2014-05-22 05:54:18 +00006213 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00006214 }
6215
6216 unsigned Idx = 0;
6217 unsigned NumBases = Record[Idx++];
6218 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases);
6219 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases];
6220 for (unsigned I = 0; I != NumBases; ++I)
6221 Bases[I] = ReadCXXBaseSpecifier(*Loc.F, Record, Idx);
6222 return Bases;
6223}
6224
6225serialization::DeclID
6226ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const {
6227 if (LocalID < NUM_PREDEF_DECL_IDS)
6228 return LocalID;
6229
6230 ContinuousRangeMap<uint32_t, int, 2>::iterator I
6231 = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS);
6232 assert(I != F.DeclRemap.end() && "Invalid index into decl index remap");
6233
6234 return LocalID + I->second;
6235}
6236
6237bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID,
6238 ModuleFile &M) const {
Richard Smithfe620d22015-03-05 23:24:12 +00006239 // Predefined decls aren't from any module.
6240 if (ID < NUM_PREDEF_DECL_IDS)
6241 return false;
6242
Guy Benyei11169dd2012-12-18 14:30:41 +00006243 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(ID);
6244 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6245 return &M == I->second;
6246}
6247
Douglas Gregor9f782892013-01-21 15:25:38 +00006248ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) {
Guy Benyei11169dd2012-12-18 14:30:41 +00006249 if (!D->isFromASTFile())
Craig Toppera13603a2014-05-22 05:54:18 +00006250 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00006251 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID());
6252 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6253 return I->second;
6254}
6255
6256SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) {
6257 if (ID < NUM_PREDEF_DECL_IDS)
6258 return SourceLocation();
Richard Smithcd45dbc2014-04-19 03:48:30 +00006259
Guy Benyei11169dd2012-12-18 14:30:41 +00006260 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6261
6262 if (Index > DeclsLoaded.size()) {
6263 Error("declaration ID out-of-range for AST file");
6264 return SourceLocation();
6265 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00006266
Guy Benyei11169dd2012-12-18 14:30:41 +00006267 if (Decl *D = DeclsLoaded[Index])
6268 return D->getLocation();
6269
6270 unsigned RawLocation = 0;
6271 RecordLocation Rec = DeclCursorForID(ID, RawLocation);
6272 return ReadSourceLocation(*Rec.F, RawLocation);
6273}
6274
Richard Smithfe620d22015-03-05 23:24:12 +00006275static Decl *getPredefinedDecl(ASTContext &Context, PredefinedDeclIDs ID) {
6276 switch (ID) {
6277 case PREDEF_DECL_NULL_ID:
6278 return nullptr;
6279
6280 case PREDEF_DECL_TRANSLATION_UNIT_ID:
6281 return Context.getTranslationUnitDecl();
6282
6283 case PREDEF_DECL_OBJC_ID_ID:
6284 return Context.getObjCIdDecl();
6285
6286 case PREDEF_DECL_OBJC_SEL_ID:
6287 return Context.getObjCSelDecl();
6288
6289 case PREDEF_DECL_OBJC_CLASS_ID:
6290 return Context.getObjCClassDecl();
6291
6292 case PREDEF_DECL_OBJC_PROTOCOL_ID:
6293 return Context.getObjCProtocolDecl();
6294
6295 case PREDEF_DECL_INT_128_ID:
6296 return Context.getInt128Decl();
6297
6298 case PREDEF_DECL_UNSIGNED_INT_128_ID:
6299 return Context.getUInt128Decl();
6300
6301 case PREDEF_DECL_OBJC_INSTANCETYPE_ID:
6302 return Context.getObjCInstanceTypeDecl();
6303
6304 case PREDEF_DECL_BUILTIN_VA_LIST_ID:
6305 return Context.getBuiltinVaListDecl();
Richard Smithf19e1272015-03-07 00:04:49 +00006306
6307 case PREDEF_DECL_EXTERN_C_CONTEXT_ID:
6308 return Context.getExternCContextDecl();
Richard Smithfe620d22015-03-05 23:24:12 +00006309 }
Yaron Keren322bdad2015-03-06 07:49:14 +00006310 llvm_unreachable("PredefinedDeclIDs unknown enum value");
Richard Smithfe620d22015-03-05 23:24:12 +00006311}
6312
Richard Smithcd45dbc2014-04-19 03:48:30 +00006313Decl *ASTReader::GetExistingDecl(DeclID ID) {
6314 if (ID < NUM_PREDEF_DECL_IDS) {
Richard Smithfe620d22015-03-05 23:24:12 +00006315 Decl *D = getPredefinedDecl(Context, (PredefinedDeclIDs)ID);
6316 if (D) {
6317 // Track that we have merged the declaration with ID \p ID into the
6318 // pre-existing predefined declaration \p D.
6319 auto &Merged = MergedDecls[D->getCanonicalDecl()];
6320 if (Merged.empty())
6321 Merged.push_back(ID);
Guy Benyei11169dd2012-12-18 14:30:41 +00006322 }
Richard Smithfe620d22015-03-05 23:24:12 +00006323 return D;
Guy Benyei11169dd2012-12-18 14:30:41 +00006324 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00006325
Guy Benyei11169dd2012-12-18 14:30:41 +00006326 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6327
6328 if (Index >= DeclsLoaded.size()) {
6329 assert(0 && "declaration ID out-of-range for AST file");
6330 Error("declaration ID out-of-range for AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00006331 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00006332 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00006333
6334 return DeclsLoaded[Index];
6335}
6336
6337Decl *ASTReader::GetDecl(DeclID ID) {
6338 if (ID < NUM_PREDEF_DECL_IDS)
6339 return GetExistingDecl(ID);
6340
6341 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6342
6343 if (Index >= DeclsLoaded.size()) {
6344 assert(0 && "declaration ID out-of-range for AST file");
6345 Error("declaration ID out-of-range for AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00006346 return nullptr;
Richard Smithcd45dbc2014-04-19 03:48:30 +00006347 }
6348
Guy Benyei11169dd2012-12-18 14:30:41 +00006349 if (!DeclsLoaded[Index]) {
6350 ReadDeclRecord(ID);
6351 if (DeserializationListener)
6352 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
6353 }
6354
6355 return DeclsLoaded[Index];
6356}
6357
6358DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M,
6359 DeclID GlobalID) {
6360 if (GlobalID < NUM_PREDEF_DECL_IDS)
6361 return GlobalID;
6362
6363 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID);
6364 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6365 ModuleFile *Owner = I->second;
6366
6367 llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos
6368 = M.GlobalToLocalDeclIDs.find(Owner);
6369 if (Pos == M.GlobalToLocalDeclIDs.end())
6370 return 0;
6371
6372 return GlobalID - Owner->BaseDeclID + Pos->second;
6373}
6374
6375serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F,
6376 const RecordData &Record,
6377 unsigned &Idx) {
6378 if (Idx >= Record.size()) {
6379 Error("Corrupted AST file");
6380 return 0;
6381 }
6382
6383 return getGlobalDeclID(F, Record[Idx++]);
6384}
6385
6386/// \brief Resolve the offset of a statement into a statement.
6387///
6388/// This operation will read a new statement from the external
6389/// source each time it is called, and is meant to be used via a
6390/// LazyOffsetPtr (which is used by Decls for the body of functions, etc).
6391Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) {
6392 // Switch case IDs are per Decl.
6393 ClearSwitchCaseIDs();
6394
6395 // Offset here is a global offset across the entire chain.
6396 RecordLocation Loc = getLocalBitOffset(Offset);
6397 Loc.F->DeclsCursor.JumpToBit(Loc.Offset);
6398 return ReadStmtFromStream(*Loc.F);
6399}
6400
6401namespace {
6402 class FindExternalLexicalDeclsVisitor {
6403 ASTReader &Reader;
6404 const DeclContext *DC;
6405 bool (*isKindWeWant)(Decl::Kind);
6406
6407 SmallVectorImpl<Decl*> &Decls;
6408 bool PredefsVisited[NUM_PREDEF_DECL_IDS];
6409
6410 public:
6411 FindExternalLexicalDeclsVisitor(ASTReader &Reader, const DeclContext *DC,
6412 bool (*isKindWeWant)(Decl::Kind),
6413 SmallVectorImpl<Decl*> &Decls)
6414 : Reader(Reader), DC(DC), isKindWeWant(isKindWeWant), Decls(Decls)
6415 {
6416 for (unsigned I = 0; I != NUM_PREDEF_DECL_IDS; ++I)
6417 PredefsVisited[I] = false;
6418 }
6419
6420 static bool visit(ModuleFile &M, bool Preorder, void *UserData) {
6421 if (Preorder)
6422 return false;
6423
6424 FindExternalLexicalDeclsVisitor *This
6425 = static_cast<FindExternalLexicalDeclsVisitor *>(UserData);
6426
6427 ModuleFile::DeclContextInfosMap::iterator Info
6428 = M.DeclContextInfos.find(This->DC);
6429 if (Info == M.DeclContextInfos.end() || !Info->second.LexicalDecls)
6430 return false;
6431
6432 // Load all of the declaration IDs
6433 for (const KindDeclIDPair *ID = Info->second.LexicalDecls,
6434 *IDE = ID + Info->second.NumLexicalDecls;
6435 ID != IDE; ++ID) {
6436 if (This->isKindWeWant && !This->isKindWeWant((Decl::Kind)ID->first))
6437 continue;
6438
6439 // Don't add predefined declarations to the lexical context more
6440 // than once.
6441 if (ID->second < NUM_PREDEF_DECL_IDS) {
6442 if (This->PredefsVisited[ID->second])
6443 continue;
6444
6445 This->PredefsVisited[ID->second] = true;
6446 }
6447
6448 if (Decl *D = This->Reader.GetLocalDecl(M, ID->second)) {
6449 if (!This->DC->isDeclInLexicalTraversal(D))
6450 This->Decls.push_back(D);
6451 }
6452 }
6453
6454 return false;
6455 }
6456 };
6457}
6458
6459ExternalLoadResult ASTReader::FindExternalLexicalDecls(const DeclContext *DC,
6460 bool (*isKindWeWant)(Decl::Kind),
6461 SmallVectorImpl<Decl*> &Decls) {
6462 // There might be lexical decls in multiple modules, for the TU at
6463 // least. Walk all of the modules in the order they were loaded.
6464 FindExternalLexicalDeclsVisitor Visitor(*this, DC, isKindWeWant, Decls);
6465 ModuleMgr.visitDepthFirst(&FindExternalLexicalDeclsVisitor::visit, &Visitor);
6466 ++NumLexicalDeclContextsRead;
6467 return ELR_Success;
6468}
6469
6470namespace {
6471
6472class DeclIDComp {
6473 ASTReader &Reader;
6474 ModuleFile &Mod;
6475
6476public:
6477 DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {}
6478
6479 bool operator()(LocalDeclID L, LocalDeclID R) const {
6480 SourceLocation LHS = getLocation(L);
6481 SourceLocation RHS = getLocation(R);
6482 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6483 }
6484
6485 bool operator()(SourceLocation LHS, LocalDeclID R) const {
6486 SourceLocation RHS = getLocation(R);
6487 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6488 }
6489
6490 bool operator()(LocalDeclID L, SourceLocation RHS) const {
6491 SourceLocation LHS = getLocation(L);
6492 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6493 }
6494
6495 SourceLocation getLocation(LocalDeclID ID) const {
6496 return Reader.getSourceManager().getFileLoc(
6497 Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID)));
6498 }
6499};
6500
6501}
6502
6503void ASTReader::FindFileRegionDecls(FileID File,
6504 unsigned Offset, unsigned Length,
6505 SmallVectorImpl<Decl *> &Decls) {
6506 SourceManager &SM = getSourceManager();
6507
6508 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File);
6509 if (I == FileDeclIDs.end())
6510 return;
6511
6512 FileDeclsInfo &DInfo = I->second;
6513 if (DInfo.Decls.empty())
6514 return;
6515
6516 SourceLocation
6517 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset);
6518 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length);
6519
6520 DeclIDComp DIDComp(*this, *DInfo.Mod);
6521 ArrayRef<serialization::LocalDeclID>::iterator
6522 BeginIt = std::lower_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
6523 BeginLoc, DIDComp);
6524 if (BeginIt != DInfo.Decls.begin())
6525 --BeginIt;
6526
6527 // If we are pointing at a top-level decl inside an objc container, we need
6528 // to backtrack until we find it otherwise we will fail to report that the
6529 // region overlaps with an objc container.
6530 while (BeginIt != DInfo.Decls.begin() &&
6531 GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt))
6532 ->isTopLevelDeclInObjCContainer())
6533 --BeginIt;
6534
6535 ArrayRef<serialization::LocalDeclID>::iterator
6536 EndIt = std::upper_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
6537 EndLoc, DIDComp);
6538 if (EndIt != DInfo.Decls.end())
6539 ++EndIt;
6540
6541 for (ArrayRef<serialization::LocalDeclID>::iterator
6542 DIt = BeginIt; DIt != EndIt; ++DIt)
6543 Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt)));
6544}
6545
6546namespace {
6547 /// \brief ModuleFile visitor used to perform name lookup into a
6548 /// declaration context.
6549 class DeclContextNameLookupVisitor {
6550 ASTReader &Reader;
Richard Smith8c913ec2014-08-14 02:21:01 +00006551 ArrayRef<const DeclContext *> Contexts;
Guy Benyei11169dd2012-12-18 14:30:41 +00006552 DeclarationName Name;
6553 SmallVectorImpl<NamedDecl *> &Decls;
Richard Smith52874ec2015-02-13 20:17:14 +00006554 llvm::SmallPtrSetImpl<NamedDecl *> &DeclSet;
Guy Benyei11169dd2012-12-18 14:30:41 +00006555
6556 public:
Richard Smith8c913ec2014-08-14 02:21:01 +00006557 DeclContextNameLookupVisitor(ASTReader &Reader,
6558 ArrayRef<const DeclContext *> Contexts,
Guy Benyei11169dd2012-12-18 14:30:41 +00006559 DeclarationName Name,
Richard Smith52874ec2015-02-13 20:17:14 +00006560 SmallVectorImpl<NamedDecl *> &Decls,
6561 llvm::SmallPtrSetImpl<NamedDecl *> &DeclSet)
6562 : Reader(Reader), Contexts(Contexts), Name(Name), Decls(Decls),
6563 DeclSet(DeclSet) { }
Guy Benyei11169dd2012-12-18 14:30:41 +00006564
6565 static bool visit(ModuleFile &M, void *UserData) {
6566 DeclContextNameLookupVisitor *This
6567 = static_cast<DeclContextNameLookupVisitor *>(UserData);
6568
6569 // Check whether we have any visible declaration information for
6570 // this context in this module.
6571 ModuleFile::DeclContextInfosMap::iterator Info;
6572 bool FoundInfo = false;
Richard Smith8c913ec2014-08-14 02:21:01 +00006573 for (auto *DC : This->Contexts) {
6574 Info = M.DeclContextInfos.find(DC);
6575 if (Info != M.DeclContextInfos.end() &&
Guy Benyei11169dd2012-12-18 14:30:41 +00006576 Info->second.NameLookupTableData) {
6577 FoundInfo = true;
6578 break;
6579 }
6580 }
6581
6582 if (!FoundInfo)
6583 return false;
Richard Smith8c913ec2014-08-14 02:21:01 +00006584
Guy Benyei11169dd2012-12-18 14:30:41 +00006585 // Look for this name within this module.
Richard Smith52e3fba2014-03-11 07:17:35 +00006586 ASTDeclContextNameLookupTable *LookupTable =
Guy Benyei11169dd2012-12-18 14:30:41 +00006587 Info->second.NameLookupTableData;
6588 ASTDeclContextNameLookupTable::iterator Pos
6589 = LookupTable->find(This->Name);
6590 if (Pos == LookupTable->end())
6591 return false;
6592
6593 bool FoundAnything = false;
6594 ASTDeclContextNameLookupTrait::data_type Data = *Pos;
6595 for (; Data.first != Data.second; ++Data.first) {
6596 NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M, *Data.first);
6597 if (!ND)
6598 continue;
6599
6600 if (ND->getDeclName() != This->Name) {
6601 // A name might be null because the decl's redeclarable part is
6602 // currently read before reading its name. The lookup is triggered by
6603 // building that decl (likely indirectly), and so it is later in the
6604 // sense of "already existing" and can be ignored here.
Richard Smith8c913ec2014-08-14 02:21:01 +00006605 // FIXME: This should not happen; deserializing declarations should
6606 // not perform lookups since that can lead to deserialization cycles.
Guy Benyei11169dd2012-12-18 14:30:41 +00006607 continue;
6608 }
Richard Smith8c913ec2014-08-14 02:21:01 +00006609
Guy Benyei11169dd2012-12-18 14:30:41 +00006610 // Record this declaration.
6611 FoundAnything = true;
Richard Smith52874ec2015-02-13 20:17:14 +00006612 if (This->DeclSet.insert(ND).second)
6613 This->Decls.push_back(ND);
Guy Benyei11169dd2012-12-18 14:30:41 +00006614 }
6615
6616 return FoundAnything;
6617 }
6618 };
6619}
6620
Douglas Gregor9f782892013-01-21 15:25:38 +00006621/// \brief Retrieve the "definitive" module file for the definition of the
6622/// given declaration context, if there is one.
6623///
6624/// The "definitive" module file is the only place where we need to look to
6625/// find information about the declarations within the given declaration
6626/// context. For example, C++ and Objective-C classes, C structs/unions, and
6627/// Objective-C protocols, categories, and extensions are all defined in a
6628/// single place in the source code, so they have definitive module files
6629/// associated with them. C++ namespaces, on the other hand, can have
6630/// definitions in multiple different module files.
6631///
6632/// Note: this needs to be kept in sync with ASTWriter::AddedVisibleDecl's
6633/// NDEBUG checking.
6634static ModuleFile *getDefinitiveModuleFileFor(const DeclContext *DC,
6635 ASTReader &Reader) {
Douglas Gregor7a6e2002013-01-22 17:08:30 +00006636 if (const DeclContext *DefDC = getDefinitiveDeclContext(DC))
6637 return Reader.getOwningModuleFile(cast<Decl>(DefDC));
Douglas Gregor9f782892013-01-21 15:25:38 +00006638
Craig Toppera13603a2014-05-22 05:54:18 +00006639 return nullptr;
Douglas Gregor9f782892013-01-21 15:25:38 +00006640}
6641
Richard Smith9ce12e32013-02-07 03:30:24 +00006642bool
Guy Benyei11169dd2012-12-18 14:30:41 +00006643ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC,
6644 DeclarationName Name) {
6645 assert(DC->hasExternalVisibleStorage() &&
6646 "DeclContext has no visible decls in storage");
6647 if (!Name)
Richard Smith9ce12e32013-02-07 03:30:24 +00006648 return false;
Guy Benyei11169dd2012-12-18 14:30:41 +00006649
Richard Smith8c913ec2014-08-14 02:21:01 +00006650 Deserializing LookupResults(this);
6651
Guy Benyei11169dd2012-12-18 14:30:41 +00006652 SmallVector<NamedDecl *, 64> Decls;
Richard Smith52874ec2015-02-13 20:17:14 +00006653 llvm::SmallPtrSet<NamedDecl*, 64> DeclSet;
Richard Smith8c913ec2014-08-14 02:21:01 +00006654
Guy Benyei11169dd2012-12-18 14:30:41 +00006655 // Compute the declaration contexts we need to look into. Multiple such
6656 // declaration contexts occur when two declaration contexts from disjoint
6657 // modules get merged, e.g., when two namespaces with the same name are
6658 // independently defined in separate modules.
6659 SmallVector<const DeclContext *, 2> Contexts;
6660 Contexts.push_back(DC);
Richard Smith8c913ec2014-08-14 02:21:01 +00006661
Guy Benyei11169dd2012-12-18 14:30:41 +00006662 if (DC->isNamespace()) {
Richard Smithcd45dbc2014-04-19 03:48:30 +00006663 auto Merged = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC)));
Guy Benyei11169dd2012-12-18 14:30:41 +00006664 if (Merged != MergedDecls.end()) {
6665 for (unsigned I = 0, N = Merged->second.size(); I != N; ++I)
6666 Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I])));
6667 }
6668 }
Richard Smith8c913ec2014-08-14 02:21:01 +00006669
6670 auto LookUpInContexts = [&](ArrayRef<const DeclContext*> Contexts) {
Richard Smith52874ec2015-02-13 20:17:14 +00006671 DeclContextNameLookupVisitor Visitor(*this, Contexts, Name, Decls, DeclSet);
Richard Smith8c913ec2014-08-14 02:21:01 +00006672
6673 // If we can definitively determine which module file to look into,
6674 // only look there. Otherwise, look in all module files.
6675 ModuleFile *Definitive;
6676 if (Contexts.size() == 1 &&
6677 (Definitive = getDefinitiveModuleFileFor(Contexts[0], *this))) {
6678 DeclContextNameLookupVisitor::visit(*Definitive, &Visitor);
6679 } else {
6680 ModuleMgr.visit(&DeclContextNameLookupVisitor::visit, &Visitor);
6681 }
6682 };
6683
6684 LookUpInContexts(Contexts);
6685
6686 // If this might be an implicit special member function, then also search
6687 // all merged definitions of the surrounding class. We need to search them
6688 // individually, because finding an entity in one of them doesn't imply that
6689 // we can't find a different entity in another one.
Richard Smithcd45dbc2014-04-19 03:48:30 +00006690 if (isa<CXXRecordDecl>(DC)) {
Richard Smith8c913ec2014-08-14 02:21:01 +00006691 auto Kind = Name.getNameKind();
6692 if (Kind == DeclarationName::CXXConstructorName ||
6693 Kind == DeclarationName::CXXDestructorName ||
6694 (Kind == DeclarationName::CXXOperatorName &&
6695 Name.getCXXOverloadedOperator() == OO_Equal)) {
6696 auto Merged = MergedLookups.find(DC);
Richard Smithe0612472014-11-21 05:16:13 +00006697 if (Merged != MergedLookups.end()) {
6698 for (unsigned I = 0; I != Merged->second.size(); ++I) {
Daniel Jasperc0b7c802015-02-18 14:13:46 +00006699 const DeclContext *Context = Merged->second[I];
6700 LookUpInContexts(Context);
Richard Smithe0612472014-11-21 05:16:13 +00006701 // We might have just added some more merged lookups. If so, our
6702 // iterator is now invalid, so grab a fresh one before continuing.
6703 Merged = MergedLookups.find(DC);
6704 }
6705 }
Richard Smith8c913ec2014-08-14 02:21:01 +00006706 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00006707 }
6708
Guy Benyei11169dd2012-12-18 14:30:41 +00006709 ++NumVisibleDeclContextsRead;
6710 SetExternalVisibleDeclsForName(DC, Name, Decls);
Richard Smith9ce12e32013-02-07 03:30:24 +00006711 return !Decls.empty();
Guy Benyei11169dd2012-12-18 14:30:41 +00006712}
6713
6714namespace {
6715 /// \brief ModuleFile visitor used to retrieve all visible names in a
6716 /// declaration context.
6717 class DeclContextAllNamesVisitor {
6718 ASTReader &Reader;
Dmitri Gribenkof8579502013-01-12 19:30:44 +00006719 SmallVectorImpl<const DeclContext *> &Contexts;
Craig Topper3598eb72013-07-05 04:43:31 +00006720 DeclsMap &Decls;
Richard Smith52874ec2015-02-13 20:17:14 +00006721 llvm::SmallPtrSet<NamedDecl *, 256> DeclSet;
Argyrios Kyrtzidis2810e9d2012-12-19 22:21:18 +00006722 bool VisitAll;
Guy Benyei11169dd2012-12-18 14:30:41 +00006723
6724 public:
6725 DeclContextAllNamesVisitor(ASTReader &Reader,
6726 SmallVectorImpl<const DeclContext *> &Contexts,
Craig Topper3598eb72013-07-05 04:43:31 +00006727 DeclsMap &Decls, bool VisitAll)
Argyrios Kyrtzidis2810e9d2012-12-19 22:21:18 +00006728 : Reader(Reader), Contexts(Contexts), Decls(Decls), VisitAll(VisitAll) { }
Guy Benyei11169dd2012-12-18 14:30:41 +00006729
6730 static bool visit(ModuleFile &M, void *UserData) {
6731 DeclContextAllNamesVisitor *This
6732 = static_cast<DeclContextAllNamesVisitor *>(UserData);
6733
6734 // Check whether we have any visible declaration information for
6735 // this context in this module.
6736 ModuleFile::DeclContextInfosMap::iterator Info;
6737 bool FoundInfo = false;
6738 for (unsigned I = 0, N = This->Contexts.size(); I != N; ++I) {
6739 Info = M.DeclContextInfos.find(This->Contexts[I]);
6740 if (Info != M.DeclContextInfos.end() &&
6741 Info->second.NameLookupTableData) {
6742 FoundInfo = true;
6743 break;
6744 }
6745 }
6746
6747 if (!FoundInfo)
6748 return false;
6749
Richard Smith52e3fba2014-03-11 07:17:35 +00006750 ASTDeclContextNameLookupTable *LookupTable =
Guy Benyei11169dd2012-12-18 14:30:41 +00006751 Info->second.NameLookupTableData;
6752 bool FoundAnything = false;
6753 for (ASTDeclContextNameLookupTable::data_iterator
Douglas Gregor5e306b12013-01-23 22:38:11 +00006754 I = LookupTable->data_begin(), E = LookupTable->data_end();
6755 I != E;
6756 ++I) {
Guy Benyei11169dd2012-12-18 14:30:41 +00006757 ASTDeclContextNameLookupTrait::data_type Data = *I;
6758 for (; Data.first != Data.second; ++Data.first) {
6759 NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M,
6760 *Data.first);
6761 if (!ND)
6762 continue;
6763
6764 // Record this declaration.
6765 FoundAnything = true;
Richard Smith52874ec2015-02-13 20:17:14 +00006766 if (This->DeclSet.insert(ND).second)
6767 This->Decls[ND->getDeclName()].push_back(ND);
Guy Benyei11169dd2012-12-18 14:30:41 +00006768 }
6769 }
6770
Argyrios Kyrtzidis2810e9d2012-12-19 22:21:18 +00006771 return FoundAnything && !This->VisitAll;
Guy Benyei11169dd2012-12-18 14:30:41 +00006772 }
6773 };
6774}
6775
6776void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) {
6777 if (!DC->hasExternalVisibleStorage())
6778 return;
Craig Topper79be4cd2013-07-05 04:33:53 +00006779 DeclsMap Decls;
Guy Benyei11169dd2012-12-18 14:30:41 +00006780
6781 // Compute the declaration contexts we need to look into. Multiple such
6782 // declaration contexts occur when two declaration contexts from disjoint
6783 // modules get merged, e.g., when two namespaces with the same name are
6784 // independently defined in separate modules.
6785 SmallVector<const DeclContext *, 2> Contexts;
6786 Contexts.push_back(DC);
6787
6788 if (DC->isNamespace()) {
6789 MergedDeclsMap::iterator Merged
6790 = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC)));
6791 if (Merged != MergedDecls.end()) {
6792 for (unsigned I = 0, N = Merged->second.size(); I != N; ++I)
6793 Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I])));
6794 }
6795 }
6796
Argyrios Kyrtzidis2810e9d2012-12-19 22:21:18 +00006797 DeclContextAllNamesVisitor Visitor(*this, Contexts, Decls,
6798 /*VisitAll=*/DC->isFileContext());
Guy Benyei11169dd2012-12-18 14:30:41 +00006799 ModuleMgr.visit(&DeclContextAllNamesVisitor::visit, &Visitor);
6800 ++NumVisibleDeclContextsRead;
6801
Craig Topper79be4cd2013-07-05 04:33:53 +00006802 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) {
Guy Benyei11169dd2012-12-18 14:30:41 +00006803 SetExternalVisibleDeclsForName(DC, I->first, I->second);
6804 }
6805 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false);
6806}
6807
6808/// \brief Under non-PCH compilation the consumer receives the objc methods
6809/// before receiving the implementation, and codegen depends on this.
6810/// We simulate this by deserializing and passing to consumer the methods of the
6811/// implementation before passing the deserialized implementation decl.
6812static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD,
6813 ASTConsumer *Consumer) {
6814 assert(ImplD && Consumer);
6815
Aaron Ballmanaff18c02014-03-13 19:03:34 +00006816 for (auto *I : ImplD->methods())
6817 Consumer->HandleInterestingDecl(DeclGroupRef(I));
Guy Benyei11169dd2012-12-18 14:30:41 +00006818
6819 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD));
6820}
6821
6822void ASTReader::PassInterestingDeclsToConsumer() {
6823 assert(Consumer);
Richard Smith04d05b52014-03-23 00:27:18 +00006824
6825 if (PassingDeclsToConsumer)
6826 return;
6827
6828 // Guard variable to avoid recursively redoing the process of passing
6829 // decls to consumer.
6830 SaveAndRestore<bool> GuardPassingDeclsToConsumer(PassingDeclsToConsumer,
6831 true);
6832
Richard Smith9e2341d2015-03-23 03:25:59 +00006833 // Ensure that we've loaded all potentially-interesting declarations
6834 // that need to be eagerly loaded.
6835 for (auto ID : EagerlyDeserializedDecls)
6836 GetDecl(ID);
6837 EagerlyDeserializedDecls.clear();
6838
Guy Benyei11169dd2012-12-18 14:30:41 +00006839 while (!InterestingDecls.empty()) {
6840 Decl *D = InterestingDecls.front();
6841 InterestingDecls.pop_front();
6842
6843 PassInterestingDeclToConsumer(D);
6844 }
6845}
6846
6847void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
6848 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
6849 PassObjCImplDeclToConsumer(ImplD, Consumer);
6850 else
6851 Consumer->HandleInterestingDecl(DeclGroupRef(D));
6852}
6853
6854void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) {
6855 this->Consumer = Consumer;
6856
Richard Smith9e2341d2015-03-23 03:25:59 +00006857 if (Consumer)
6858 PassInterestingDeclsToConsumer();
Richard Smith7f330cd2015-03-18 01:42:29 +00006859
6860 if (DeserializationListener)
6861 DeserializationListener->ReaderInitialized(this);
Guy Benyei11169dd2012-12-18 14:30:41 +00006862}
6863
6864void ASTReader::PrintStats() {
6865 std::fprintf(stderr, "*** AST File Statistics:\n");
6866
6867 unsigned NumTypesLoaded
6868 = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(),
6869 QualType());
6870 unsigned NumDeclsLoaded
6871 = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(),
Craig Toppera13603a2014-05-22 05:54:18 +00006872 (Decl *)nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00006873 unsigned NumIdentifiersLoaded
6874 = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(),
6875 IdentifiersLoaded.end(),
Craig Toppera13603a2014-05-22 05:54:18 +00006876 (IdentifierInfo *)nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00006877 unsigned NumMacrosLoaded
6878 = MacrosLoaded.size() - std::count(MacrosLoaded.begin(),
6879 MacrosLoaded.end(),
Craig Toppera13603a2014-05-22 05:54:18 +00006880 (MacroInfo *)nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00006881 unsigned NumSelectorsLoaded
6882 = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(),
6883 SelectorsLoaded.end(),
6884 Selector());
6885
6886 if (unsigned TotalNumSLocEntries = getTotalNumSLocs())
6887 std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n",
6888 NumSLocEntriesRead, TotalNumSLocEntries,
6889 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
6890 if (!TypesLoaded.empty())
6891 std::fprintf(stderr, " %u/%u types read (%f%%)\n",
6892 NumTypesLoaded, (unsigned)TypesLoaded.size(),
6893 ((float)NumTypesLoaded/TypesLoaded.size() * 100));
6894 if (!DeclsLoaded.empty())
6895 std::fprintf(stderr, " %u/%u declarations read (%f%%)\n",
6896 NumDeclsLoaded, (unsigned)DeclsLoaded.size(),
6897 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100));
6898 if (!IdentifiersLoaded.empty())
6899 std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n",
6900 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(),
6901 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
6902 if (!MacrosLoaded.empty())
6903 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
6904 NumMacrosLoaded, (unsigned)MacrosLoaded.size(),
6905 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100));
6906 if (!SelectorsLoaded.empty())
6907 std::fprintf(stderr, " %u/%u selectors read (%f%%)\n",
6908 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(),
6909 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
6910 if (TotalNumStatements)
6911 std::fprintf(stderr, " %u/%u statements read (%f%%)\n",
6912 NumStatementsRead, TotalNumStatements,
6913 ((float)NumStatementsRead/TotalNumStatements * 100));
6914 if (TotalNumMacros)
6915 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
6916 NumMacrosRead, TotalNumMacros,
6917 ((float)NumMacrosRead/TotalNumMacros * 100));
6918 if (TotalLexicalDeclContexts)
6919 std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n",
6920 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
6921 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
6922 * 100));
6923 if (TotalVisibleDeclContexts)
6924 std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n",
6925 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
6926 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
6927 * 100));
6928 if (TotalNumMethodPoolEntries) {
6929 std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n",
6930 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
6931 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
6932 * 100));
Guy Benyei11169dd2012-12-18 14:30:41 +00006933 }
Douglas Gregorad2f7a52013-01-28 17:54:36 +00006934 if (NumMethodPoolLookups) {
6935 std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n",
6936 NumMethodPoolHits, NumMethodPoolLookups,
6937 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
6938 }
6939 if (NumMethodPoolTableLookups) {
6940 std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n",
6941 NumMethodPoolTableHits, NumMethodPoolTableLookups,
6942 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups
6943 * 100.0));
6944 }
6945
Douglas Gregor00a50f72013-01-25 00:38:33 +00006946 if (NumIdentifierLookupHits) {
6947 std::fprintf(stderr,
6948 " %u / %u identifier table lookups succeeded (%f%%)\n",
6949 NumIdentifierLookupHits, NumIdentifierLookups,
6950 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
6951 }
6952
Douglas Gregore060e572013-01-25 01:03:03 +00006953 if (GlobalIndex) {
6954 std::fprintf(stderr, "\n");
6955 GlobalIndex->printStats();
6956 }
6957
Guy Benyei11169dd2012-12-18 14:30:41 +00006958 std::fprintf(stderr, "\n");
6959 dump();
6960 std::fprintf(stderr, "\n");
6961}
6962
6963template<typename Key, typename ModuleFile, unsigned InitialCapacity>
6964static void
6965dumpModuleIDMap(StringRef Name,
6966 const ContinuousRangeMap<Key, ModuleFile *,
6967 InitialCapacity> &Map) {
6968 if (Map.begin() == Map.end())
6969 return;
6970
6971 typedef ContinuousRangeMap<Key, ModuleFile *, InitialCapacity> MapType;
6972 llvm::errs() << Name << ":\n";
6973 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
6974 I != IEnd; ++I) {
6975 llvm::errs() << " " << I->first << " -> " << I->second->FileName
6976 << "\n";
6977 }
6978}
6979
6980void ASTReader::dump() {
6981 llvm::errs() << "*** PCH/ModuleFile Remappings:\n";
6982 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap);
6983 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap);
6984 dumpModuleIDMap("Global type map", GlobalTypeMap);
6985 dumpModuleIDMap("Global declaration map", GlobalDeclMap);
6986 dumpModuleIDMap("Global identifier map", GlobalIdentifierMap);
6987 dumpModuleIDMap("Global macro map", GlobalMacroMap);
6988 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap);
6989 dumpModuleIDMap("Global selector map", GlobalSelectorMap);
6990 dumpModuleIDMap("Global preprocessed entity map",
6991 GlobalPreprocessedEntityMap);
6992
6993 llvm::errs() << "\n*** PCH/Modules Loaded:";
6994 for (ModuleManager::ModuleConstIterator M = ModuleMgr.begin(),
6995 MEnd = ModuleMgr.end();
6996 M != MEnd; ++M)
6997 (*M)->dump();
6998}
6999
7000/// Return the amount of memory used by memory buffers, breaking down
7001/// by heap-backed versus mmap'ed memory.
7002void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const {
7003 for (ModuleConstIterator I = ModuleMgr.begin(),
7004 E = ModuleMgr.end(); I != E; ++I) {
7005 if (llvm::MemoryBuffer *buf = (*I)->Buffer.get()) {
7006 size_t bytes = buf->getBufferSize();
7007 switch (buf->getBufferKind()) {
7008 case llvm::MemoryBuffer::MemoryBuffer_Malloc:
7009 sizes.malloc_bytes += bytes;
7010 break;
7011 case llvm::MemoryBuffer::MemoryBuffer_MMap:
7012 sizes.mmap_bytes += bytes;
7013 break;
7014 }
7015 }
7016 }
7017}
7018
7019void ASTReader::InitializeSema(Sema &S) {
7020 SemaObj = &S;
7021 S.addExternalSource(this);
7022
7023 // Makes sure any declarations that were deserialized "too early"
7024 // still get added to the identifier's declaration chains.
Ben Langmuir5418f402014-09-10 21:29:41 +00007025 for (uint64_t ID : PreloadedDeclIDs) {
7026 NamedDecl *D = cast<NamedDecl>(GetDecl(ID));
7027 pushExternalDeclIntoScope(D, D->getDeclName());
Guy Benyei11169dd2012-12-18 14:30:41 +00007028 }
Ben Langmuir5418f402014-09-10 21:29:41 +00007029 PreloadedDeclIDs.clear();
Guy Benyei11169dd2012-12-18 14:30:41 +00007030
Richard Smith3d8e97e2013-10-18 06:54:39 +00007031 // FIXME: What happens if these are changed by a module import?
Guy Benyei11169dd2012-12-18 14:30:41 +00007032 if (!FPPragmaOptions.empty()) {
7033 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS");
7034 SemaObj->FPFeatures.fp_contract = FPPragmaOptions[0];
7035 }
7036
Richard Smith3d8e97e2013-10-18 06:54:39 +00007037 // FIXME: What happens if these are changed by a module import?
Guy Benyei11169dd2012-12-18 14:30:41 +00007038 if (!OpenCLExtensions.empty()) {
7039 unsigned I = 0;
7040#define OPENCLEXT(nm) SemaObj->OpenCLFeatures.nm = OpenCLExtensions[I++];
7041#include "clang/Basic/OpenCLExtensions.def"
7042
7043 assert(OpenCLExtensions.size() == I && "Wrong number of OPENCL_EXTENSIONS");
7044 }
Richard Smith3d8e97e2013-10-18 06:54:39 +00007045
7046 UpdateSema();
7047}
7048
7049void ASTReader::UpdateSema() {
7050 assert(SemaObj && "no Sema to update");
7051
7052 // Load the offsets of the declarations that Sema references.
7053 // They will be lazily deserialized when needed.
7054 if (!SemaDeclRefs.empty()) {
7055 assert(SemaDeclRefs.size() % 2 == 0);
7056 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 2) {
7057 if (!SemaObj->StdNamespace)
7058 SemaObj->StdNamespace = SemaDeclRefs[I];
7059 if (!SemaObj->StdBadAlloc)
7060 SemaObj->StdBadAlloc = SemaDeclRefs[I+1];
7061 }
7062 SemaDeclRefs.clear();
7063 }
Dario Domizioli13a0a382014-05-23 12:13:25 +00007064
7065 // Update the state of 'pragma clang optimize'. Use the same API as if we had
7066 // encountered the pragma in the source.
7067 if(OptimizeOffPragmaLocation.isValid())
7068 SemaObj->ActOnPragmaOptimize(/* IsOn = */ false, OptimizeOffPragmaLocation);
Guy Benyei11169dd2012-12-18 14:30:41 +00007069}
7070
7071IdentifierInfo* ASTReader::get(const char *NameStart, const char *NameEnd) {
7072 // Note that we are loading an identifier.
7073 Deserializing AnIdentifier(this);
Douglas Gregore060e572013-01-25 01:03:03 +00007074 StringRef Name(NameStart, NameEnd - NameStart);
7075
7076 // If there is a global index, look there first to determine which modules
7077 // provably do not have any results for this identifier.
Douglas Gregor7211ac12013-01-25 23:32:03 +00007078 GlobalModuleIndex::HitSet Hits;
Craig Toppera13603a2014-05-22 05:54:18 +00007079 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
Douglas Gregore060e572013-01-25 01:03:03 +00007080 if (!loadGlobalIndex()) {
Douglas Gregor7211ac12013-01-25 23:32:03 +00007081 if (GlobalIndex->lookupIdentifier(Name, Hits)) {
7082 HitsPtr = &Hits;
Douglas Gregore060e572013-01-25 01:03:03 +00007083 }
7084 }
Douglas Gregor7211ac12013-01-25 23:32:03 +00007085 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0,
Douglas Gregor00a50f72013-01-25 00:38:33 +00007086 NumIdentifierLookups,
7087 NumIdentifierLookupHits);
Douglas Gregor7211ac12013-01-25 23:32:03 +00007088 ModuleMgr.visit(IdentifierLookupVisitor::visit, &Visitor, HitsPtr);
Guy Benyei11169dd2012-12-18 14:30:41 +00007089 IdentifierInfo *II = Visitor.getIdentifierInfo();
7090 markIdentifierUpToDate(II);
7091 return II;
7092}
7093
7094namespace clang {
7095 /// \brief An identifier-lookup iterator that enumerates all of the
7096 /// identifiers stored within a set of AST files.
7097 class ASTIdentifierIterator : public IdentifierIterator {
7098 /// \brief The AST reader whose identifiers are being enumerated.
7099 const ASTReader &Reader;
7100
7101 /// \brief The current index into the chain of AST files stored in
7102 /// the AST reader.
7103 unsigned Index;
7104
7105 /// \brief The current position within the identifier lookup table
7106 /// of the current AST file.
7107 ASTIdentifierLookupTable::key_iterator Current;
7108
7109 /// \brief The end position within the identifier lookup table of
7110 /// the current AST file.
7111 ASTIdentifierLookupTable::key_iterator End;
7112
7113 public:
7114 explicit ASTIdentifierIterator(const ASTReader &Reader);
7115
Craig Topper3e89dfe2014-03-13 02:13:41 +00007116 StringRef Next() override;
Guy Benyei11169dd2012-12-18 14:30:41 +00007117 };
7118}
7119
7120ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader)
7121 : Reader(Reader), Index(Reader.ModuleMgr.size() - 1) {
7122 ASTIdentifierLookupTable *IdTable
7123 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].IdentifierLookupTable;
7124 Current = IdTable->key_begin();
7125 End = IdTable->key_end();
7126}
7127
7128StringRef ASTIdentifierIterator::Next() {
7129 while (Current == End) {
7130 // If we have exhausted all of our AST files, we're done.
7131 if (Index == 0)
7132 return StringRef();
7133
7134 --Index;
7135 ASTIdentifierLookupTable *IdTable
7136 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].
7137 IdentifierLookupTable;
7138 Current = IdTable->key_begin();
7139 End = IdTable->key_end();
7140 }
7141
7142 // We have any identifiers remaining in the current AST file; return
7143 // the next one.
Douglas Gregorbfd73d72013-01-23 18:53:14 +00007144 StringRef Result = *Current;
Guy Benyei11169dd2012-12-18 14:30:41 +00007145 ++Current;
Douglas Gregorbfd73d72013-01-23 18:53:14 +00007146 return Result;
Guy Benyei11169dd2012-12-18 14:30:41 +00007147}
7148
Argyrios Kyrtzidis9aca3c62013-04-17 22:10:55 +00007149IdentifierIterator *ASTReader::getIdentifiers() {
7150 if (!loadGlobalIndex())
7151 return GlobalIndex->createIdentifierIterator();
7152
Guy Benyei11169dd2012-12-18 14:30:41 +00007153 return new ASTIdentifierIterator(*this);
7154}
7155
7156namespace clang { namespace serialization {
7157 class ReadMethodPoolVisitor {
7158 ASTReader &Reader;
7159 Selector Sel;
7160 unsigned PriorGeneration;
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00007161 unsigned InstanceBits;
7162 unsigned FactoryBits;
Nico Weberff4b35e2014-12-27 22:14:15 +00007163 bool InstanceHasMoreThanOneDecl;
7164 bool FactoryHasMoreThanOneDecl;
Dmitri Gribenkof8579502013-01-12 19:30:44 +00007165 SmallVector<ObjCMethodDecl *, 4> InstanceMethods;
7166 SmallVector<ObjCMethodDecl *, 4> FactoryMethods;
Guy Benyei11169dd2012-12-18 14:30:41 +00007167
7168 public:
Nico Weber2e0c8f72014-12-27 03:58:08 +00007169 ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel,
Guy Benyei11169dd2012-12-18 14:30:41 +00007170 unsigned PriorGeneration)
Nico Weber2e0c8f72014-12-27 03:58:08 +00007171 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration),
Nico Weberff4b35e2014-12-27 22:14:15 +00007172 InstanceBits(0), FactoryBits(0), InstanceHasMoreThanOneDecl(false),
7173 FactoryHasMoreThanOneDecl(false) {}
Nico Weber2e0c8f72014-12-27 03:58:08 +00007174
Guy Benyei11169dd2012-12-18 14:30:41 +00007175 static bool visit(ModuleFile &M, void *UserData) {
7176 ReadMethodPoolVisitor *This
7177 = static_cast<ReadMethodPoolVisitor *>(UserData);
7178
7179 if (!M.SelectorLookupTable)
7180 return false;
7181
7182 // If we've already searched this module file, skip it now.
7183 if (M.Generation <= This->PriorGeneration)
7184 return true;
7185
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007186 ++This->Reader.NumMethodPoolTableLookups;
Guy Benyei11169dd2012-12-18 14:30:41 +00007187 ASTSelectorLookupTable *PoolTable
7188 = (ASTSelectorLookupTable*)M.SelectorLookupTable;
7189 ASTSelectorLookupTable::iterator Pos = PoolTable->find(This->Sel);
7190 if (Pos == PoolTable->end())
7191 return false;
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007192
7193 ++This->Reader.NumMethodPoolTableHits;
Guy Benyei11169dd2012-12-18 14:30:41 +00007194 ++This->Reader.NumSelectorsRead;
7195 // FIXME: Not quite happy with the statistics here. We probably should
7196 // disable this tracking when called via LoadSelector.
7197 // Also, should entries without methods count as misses?
7198 ++This->Reader.NumMethodPoolEntriesRead;
7199 ASTSelectorLookupTrait::data_type Data = *Pos;
7200 if (This->Reader.DeserializationListener)
7201 This->Reader.DeserializationListener->SelectorRead(Data.ID,
7202 This->Sel);
7203
7204 This->InstanceMethods.append(Data.Instance.begin(), Data.Instance.end());
7205 This->FactoryMethods.append(Data.Factory.begin(), Data.Factory.end());
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00007206 This->InstanceBits = Data.InstanceBits;
7207 This->FactoryBits = Data.FactoryBits;
Nico Weberff4b35e2014-12-27 22:14:15 +00007208 This->InstanceHasMoreThanOneDecl = Data.InstanceHasMoreThanOneDecl;
7209 This->FactoryHasMoreThanOneDecl = Data.FactoryHasMoreThanOneDecl;
Guy Benyei11169dd2012-12-18 14:30:41 +00007210 return true;
7211 }
7212
7213 /// \brief Retrieve the instance methods found by this visitor.
7214 ArrayRef<ObjCMethodDecl *> getInstanceMethods() const {
7215 return InstanceMethods;
7216 }
7217
7218 /// \brief Retrieve the instance methods found by this visitor.
7219 ArrayRef<ObjCMethodDecl *> getFactoryMethods() const {
7220 return FactoryMethods;
7221 }
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00007222
7223 unsigned getInstanceBits() const { return InstanceBits; }
7224 unsigned getFactoryBits() const { return FactoryBits; }
Nico Weberff4b35e2014-12-27 22:14:15 +00007225 bool instanceHasMoreThanOneDecl() const {
7226 return InstanceHasMoreThanOneDecl;
7227 }
7228 bool factoryHasMoreThanOneDecl() const { return FactoryHasMoreThanOneDecl; }
Guy Benyei11169dd2012-12-18 14:30:41 +00007229 };
7230} } // end namespace clang::serialization
7231
7232/// \brief Add the given set of methods to the method list.
7233static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods,
7234 ObjCMethodList &List) {
7235 for (unsigned I = 0, N = Methods.size(); I != N; ++I) {
7236 S.addMethodToGlobalList(&List, Methods[I]);
7237 }
7238}
7239
7240void ASTReader::ReadMethodPool(Selector Sel) {
7241 // Get the selector generation and update it to the current generation.
7242 unsigned &Generation = SelectorGeneration[Sel];
7243 unsigned PriorGeneration = Generation;
Richard Smith053f6c62014-05-16 23:01:30 +00007244 Generation = getGeneration();
Guy Benyei11169dd2012-12-18 14:30:41 +00007245
7246 // Search for methods defined with this selector.
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007247 ++NumMethodPoolLookups;
Guy Benyei11169dd2012-12-18 14:30:41 +00007248 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration);
7249 ModuleMgr.visit(&ReadMethodPoolVisitor::visit, &Visitor);
7250
7251 if (Visitor.getInstanceMethods().empty() &&
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007252 Visitor.getFactoryMethods().empty())
Guy Benyei11169dd2012-12-18 14:30:41 +00007253 return;
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007254
7255 ++NumMethodPoolHits;
7256
Guy Benyei11169dd2012-12-18 14:30:41 +00007257 if (!getSema())
7258 return;
7259
7260 Sema &S = *getSema();
7261 Sema::GlobalMethodPool::iterator Pos
7262 = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first;
Ben Langmuira0c32e92015-01-12 19:27:00 +00007263
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00007264 Pos->second.first.setBits(Visitor.getInstanceBits());
Nico Weberff4b35e2014-12-27 22:14:15 +00007265 Pos->second.first.setHasMoreThanOneDecl(Visitor.instanceHasMoreThanOneDecl());
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00007266 Pos->second.second.setBits(Visitor.getFactoryBits());
Nico Weberff4b35e2014-12-27 22:14:15 +00007267 Pos->second.second.setHasMoreThanOneDecl(Visitor.factoryHasMoreThanOneDecl());
Ben Langmuira0c32e92015-01-12 19:27:00 +00007268
7269 // Add methods to the global pool *after* setting hasMoreThanOneDecl, since
7270 // when building a module we keep every method individually and may need to
7271 // update hasMoreThanOneDecl as we add the methods.
7272 addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first);
7273 addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second);
Guy Benyei11169dd2012-12-18 14:30:41 +00007274}
7275
7276void ASTReader::ReadKnownNamespaces(
7277 SmallVectorImpl<NamespaceDecl *> &Namespaces) {
7278 Namespaces.clear();
7279
7280 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
7281 if (NamespaceDecl *Namespace
7282 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I])))
7283 Namespaces.push_back(Namespace);
7284 }
7285}
7286
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00007287void ASTReader::ReadUndefinedButUsed(
Nick Lewyckyf0f56162013-01-31 03:23:57 +00007288 llvm::DenseMap<NamedDecl*, SourceLocation> &Undefined) {
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00007289 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
7290 NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++]));
Nick Lewycky8334af82013-01-26 00:35:08 +00007291 SourceLocation Loc =
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00007292 SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]);
Nick Lewycky8334af82013-01-26 00:35:08 +00007293 Undefined.insert(std::make_pair(D, Loc));
7294 }
7295}
Nick Lewycky8334af82013-01-26 00:35:08 +00007296
Guy Benyei11169dd2012-12-18 14:30:41 +00007297void ASTReader::ReadTentativeDefinitions(
7298 SmallVectorImpl<VarDecl *> &TentativeDefs) {
7299 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
7300 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I]));
7301 if (Var)
7302 TentativeDefs.push_back(Var);
7303 }
7304 TentativeDefinitions.clear();
7305}
7306
7307void ASTReader::ReadUnusedFileScopedDecls(
7308 SmallVectorImpl<const DeclaratorDecl *> &Decls) {
7309 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
7310 DeclaratorDecl *D
7311 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I]));
7312 if (D)
7313 Decls.push_back(D);
7314 }
7315 UnusedFileScopedDecls.clear();
7316}
7317
7318void ASTReader::ReadDelegatingConstructors(
7319 SmallVectorImpl<CXXConstructorDecl *> &Decls) {
7320 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
7321 CXXConstructorDecl *D
7322 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I]));
7323 if (D)
7324 Decls.push_back(D);
7325 }
7326 DelegatingCtorDecls.clear();
7327}
7328
7329void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) {
7330 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
7331 TypedefNameDecl *D
7332 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I]));
7333 if (D)
7334 Decls.push_back(D);
7335 }
7336 ExtVectorDecls.clear();
7337}
7338
Nico Weber72889432014-09-06 01:25:55 +00007339void ASTReader::ReadUnusedLocalTypedefNameCandidates(
7340 llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) {
7341 for (unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N;
7342 ++I) {
7343 TypedefNameDecl *D = dyn_cast_or_null<TypedefNameDecl>(
7344 GetDecl(UnusedLocalTypedefNameCandidates[I]));
7345 if (D)
7346 Decls.insert(D);
7347 }
7348 UnusedLocalTypedefNameCandidates.clear();
7349}
7350
Guy Benyei11169dd2012-12-18 14:30:41 +00007351void ASTReader::ReadReferencedSelectors(
7352 SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) {
7353 if (ReferencedSelectorsData.empty())
7354 return;
7355
7356 // If there are @selector references added them to its pool. This is for
7357 // implementation of -Wselector.
7358 unsigned int DataSize = ReferencedSelectorsData.size()-1;
7359 unsigned I = 0;
7360 while (I < DataSize) {
7361 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]);
7362 SourceLocation SelLoc
7363 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]);
7364 Sels.push_back(std::make_pair(Sel, SelLoc));
7365 }
7366 ReferencedSelectorsData.clear();
7367}
7368
7369void ASTReader::ReadWeakUndeclaredIdentifiers(
7370 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo> > &WeakIDs) {
7371 if (WeakUndeclaredIdentifiers.empty())
7372 return;
7373
7374 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) {
7375 IdentifierInfo *WeakId
7376 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
7377 IdentifierInfo *AliasId
7378 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
7379 SourceLocation Loc
7380 = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]);
7381 bool Used = WeakUndeclaredIdentifiers[I++];
7382 WeakInfo WI(AliasId, Loc);
7383 WI.setUsed(Used);
7384 WeakIDs.push_back(std::make_pair(WeakId, WI));
7385 }
7386 WeakUndeclaredIdentifiers.clear();
7387}
7388
7389void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) {
7390 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) {
7391 ExternalVTableUse VT;
7392 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++]));
7393 VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]);
7394 VT.DefinitionRequired = VTableUses[Idx++];
7395 VTables.push_back(VT);
7396 }
7397
7398 VTableUses.clear();
7399}
7400
7401void ASTReader::ReadPendingInstantiations(
7402 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation> > &Pending) {
7403 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
7404 ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++]));
7405 SourceLocation Loc
7406 = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]);
7407
7408 Pending.push_back(std::make_pair(D, Loc));
7409 }
7410 PendingInstantiations.clear();
7411}
7412
Richard Smithe40f2ba2013-08-07 21:41:30 +00007413void ASTReader::ReadLateParsedTemplates(
7414 llvm::DenseMap<const FunctionDecl *, LateParsedTemplate *> &LPTMap) {
7415 for (unsigned Idx = 0, N = LateParsedTemplates.size(); Idx < N;
7416 /* In loop */) {
7417 FunctionDecl *FD = cast<FunctionDecl>(GetDecl(LateParsedTemplates[Idx++]));
7418
7419 LateParsedTemplate *LT = new LateParsedTemplate;
7420 LT->D = GetDecl(LateParsedTemplates[Idx++]);
7421
7422 ModuleFile *F = getOwningModuleFile(LT->D);
7423 assert(F && "No module");
7424
7425 unsigned TokN = LateParsedTemplates[Idx++];
7426 LT->Toks.reserve(TokN);
7427 for (unsigned T = 0; T < TokN; ++T)
7428 LT->Toks.push_back(ReadToken(*F, LateParsedTemplates, Idx));
7429
7430 LPTMap[FD] = LT;
7431 }
7432
7433 LateParsedTemplates.clear();
7434}
7435
Guy Benyei11169dd2012-12-18 14:30:41 +00007436void ASTReader::LoadSelector(Selector Sel) {
7437 // It would be complicated to avoid reading the methods anyway. So don't.
7438 ReadMethodPool(Sel);
7439}
7440
7441void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) {
7442 assert(ID && "Non-zero identifier ID required");
7443 assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range");
7444 IdentifiersLoaded[ID - 1] = II;
7445 if (DeserializationListener)
7446 DeserializationListener->IdentifierRead(ID, II);
7447}
7448
7449/// \brief Set the globally-visible declarations associated with the given
7450/// identifier.
7451///
7452/// If the AST reader is currently in a state where the given declaration IDs
7453/// cannot safely be resolved, they are queued until it is safe to resolve
7454/// them.
7455///
7456/// \param II an IdentifierInfo that refers to one or more globally-visible
7457/// declarations.
7458///
7459/// \param DeclIDs the set of declaration IDs with the name @p II that are
7460/// visible at global scope.
7461///
Douglas Gregor6168bd22013-02-18 15:53:43 +00007462/// \param Decls if non-null, this vector will be populated with the set of
7463/// deserialized declarations. These declarations will not be pushed into
7464/// scope.
Guy Benyei11169dd2012-12-18 14:30:41 +00007465void
7466ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II,
7467 const SmallVectorImpl<uint32_t> &DeclIDs,
Douglas Gregor6168bd22013-02-18 15:53:43 +00007468 SmallVectorImpl<Decl *> *Decls) {
7469 if (NumCurrentElementsDeserializing && !Decls) {
7470 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
Guy Benyei11169dd2012-12-18 14:30:41 +00007471 return;
7472 }
7473
7474 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
Ben Langmuir5418f402014-09-10 21:29:41 +00007475 if (!SemaObj) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007476 // Queue this declaration so that it will be added to the
7477 // translation unit scope and identifier's declaration chain
7478 // once a Sema object is known.
Ben Langmuir5418f402014-09-10 21:29:41 +00007479 PreloadedDeclIDs.push_back(DeclIDs[I]);
7480 continue;
Guy Benyei11169dd2012-12-18 14:30:41 +00007481 }
Ben Langmuir5418f402014-09-10 21:29:41 +00007482
7483 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I]));
7484
7485 // If we're simply supposed to record the declarations, do so now.
7486 if (Decls) {
7487 Decls->push_back(D);
7488 continue;
7489 }
7490
7491 // Introduce this declaration into the translation-unit scope
7492 // and add it to the declaration chain for this identifier, so
7493 // that (unqualified) name lookup will find it.
7494 pushExternalDeclIntoScope(D, II);
Guy Benyei11169dd2012-12-18 14:30:41 +00007495 }
7496}
7497
Douglas Gregorc8a992f2013-01-21 16:52:34 +00007498IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007499 if (ID == 0)
Craig Toppera13603a2014-05-22 05:54:18 +00007500 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007501
7502 if (IdentifiersLoaded.empty()) {
7503 Error("no identifier table in AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00007504 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007505 }
7506
7507 ID -= 1;
7508 if (!IdentifiersLoaded[ID]) {
7509 GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1);
7510 assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map");
7511 ModuleFile *M = I->second;
7512 unsigned Index = ID - M->BaseIdentifierID;
7513 const char *Str = M->IdentifierTableData + M->IdentifierOffsets[Index];
7514
7515 // All of the strings in the AST file are preceded by a 16-bit length.
7516 // Extract that 16-bit length to avoid having to execute strlen().
7517 // NOTE: 'StrLenPtr' is an 'unsigned char*' so that we load bytes as
7518 // unsigned integers. This is important to avoid integer overflow when
7519 // we cast them to 'unsigned'.
7520 const unsigned char *StrLenPtr = (const unsigned char*) Str - 2;
7521 unsigned StrLen = (((unsigned) StrLenPtr[0])
7522 | (((unsigned) StrLenPtr[1]) << 8)) - 1;
Douglas Gregorc8a992f2013-01-21 16:52:34 +00007523 IdentifiersLoaded[ID]
7524 = &PP.getIdentifierTable().get(StringRef(Str, StrLen));
Guy Benyei11169dd2012-12-18 14:30:41 +00007525 if (DeserializationListener)
7526 DeserializationListener->IdentifierRead(ID + 1, IdentifiersLoaded[ID]);
7527 }
7528
7529 return IdentifiersLoaded[ID];
7530}
7531
Douglas Gregorc8a992f2013-01-21 16:52:34 +00007532IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) {
7533 return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID));
Guy Benyei11169dd2012-12-18 14:30:41 +00007534}
7535
7536IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) {
7537 if (LocalID < NUM_PREDEF_IDENT_IDS)
7538 return LocalID;
7539
7540 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7541 = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS);
7542 assert(I != M.IdentifierRemap.end()
7543 && "Invalid index into identifier index remap");
7544
7545 return LocalID + I->second;
7546}
7547
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00007548MacroInfo *ASTReader::getMacro(MacroID ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007549 if (ID == 0)
Craig Toppera13603a2014-05-22 05:54:18 +00007550 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007551
7552 if (MacrosLoaded.empty()) {
7553 Error("no macro table in AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00007554 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007555 }
7556
7557 ID -= NUM_PREDEF_MACRO_IDS;
7558 if (!MacrosLoaded[ID]) {
7559 GlobalMacroMapType::iterator I
7560 = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS);
7561 assert(I != GlobalMacroMap.end() && "Corrupted global macro map");
7562 ModuleFile *M = I->second;
7563 unsigned Index = ID - M->BaseMacroID;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00007564 MacrosLoaded[ID] = ReadMacroRecord(*M, M->MacroOffsets[Index]);
7565
7566 if (DeserializationListener)
7567 DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS,
7568 MacrosLoaded[ID]);
Guy Benyei11169dd2012-12-18 14:30:41 +00007569 }
7570
7571 return MacrosLoaded[ID];
7572}
7573
7574MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) {
7575 if (LocalID < NUM_PREDEF_MACRO_IDS)
7576 return LocalID;
7577
7578 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7579 = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS);
7580 assert(I != M.MacroRemap.end() && "Invalid index into macro index remap");
7581
7582 return LocalID + I->second;
7583}
7584
7585serialization::SubmoduleID
7586ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) {
7587 if (LocalID < NUM_PREDEF_SUBMODULE_IDS)
7588 return LocalID;
7589
7590 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7591 = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS);
7592 assert(I != M.SubmoduleRemap.end()
7593 && "Invalid index into submodule index remap");
7594
7595 return LocalID + I->second;
7596}
7597
7598Module *ASTReader::getSubmodule(SubmoduleID GlobalID) {
7599 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) {
7600 assert(GlobalID == 0 && "Unhandled global submodule ID");
Craig Toppera13603a2014-05-22 05:54:18 +00007601 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007602 }
7603
7604 if (GlobalID > SubmodulesLoaded.size()) {
7605 Error("submodule ID out of range in AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00007606 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007607 }
7608
7609 return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS];
7610}
Douglas Gregorc147b0b2013-01-12 01:29:50 +00007611
7612Module *ASTReader::getModule(unsigned ID) {
7613 return getSubmodule(ID);
7614}
7615
Guy Benyei11169dd2012-12-18 14:30:41 +00007616Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) {
7617 return DecodeSelector(getGlobalSelectorID(M, LocalID));
7618}
7619
7620Selector ASTReader::DecodeSelector(serialization::SelectorID ID) {
7621 if (ID == 0)
7622 return Selector();
7623
7624 if (ID > SelectorsLoaded.size()) {
7625 Error("selector ID out of range in AST file");
7626 return Selector();
7627 }
7628
Craig Toppera13603a2014-05-22 05:54:18 +00007629 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007630 // Load this selector from the selector table.
7631 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID);
7632 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map");
7633 ModuleFile &M = *I->second;
7634 ASTSelectorLookupTrait Trait(*this, M);
7635 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS;
7636 SelectorsLoaded[ID - 1] =
7637 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0);
7638 if (DeserializationListener)
7639 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
7640 }
7641
7642 return SelectorsLoaded[ID - 1];
7643}
7644
7645Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) {
7646 return DecodeSelector(ID);
7647}
7648
7649uint32_t ASTReader::GetNumExternalSelectors() {
7650 // ID 0 (the null selector) is considered an external selector.
7651 return getTotalNumSelectors() + 1;
7652}
7653
7654serialization::SelectorID
7655ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const {
7656 if (LocalID < NUM_PREDEF_SELECTOR_IDS)
7657 return LocalID;
7658
7659 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7660 = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS);
7661 assert(I != M.SelectorRemap.end()
7662 && "Invalid index into selector index remap");
7663
7664 return LocalID + I->second;
7665}
7666
7667DeclarationName
7668ASTReader::ReadDeclarationName(ModuleFile &F,
7669 const RecordData &Record, unsigned &Idx) {
7670 DeclarationName::NameKind Kind = (DeclarationName::NameKind)Record[Idx++];
7671 switch (Kind) {
7672 case DeclarationName::Identifier:
Douglas Gregorc8a992f2013-01-21 16:52:34 +00007673 return DeclarationName(GetIdentifierInfo(F, Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00007674
7675 case DeclarationName::ObjCZeroArgSelector:
7676 case DeclarationName::ObjCOneArgSelector:
7677 case DeclarationName::ObjCMultiArgSelector:
7678 return DeclarationName(ReadSelector(F, Record, Idx));
7679
7680 case DeclarationName::CXXConstructorName:
7681 return Context.DeclarationNames.getCXXConstructorName(
7682 Context.getCanonicalType(readType(F, Record, Idx)));
7683
7684 case DeclarationName::CXXDestructorName:
7685 return Context.DeclarationNames.getCXXDestructorName(
7686 Context.getCanonicalType(readType(F, Record, Idx)));
7687
7688 case DeclarationName::CXXConversionFunctionName:
7689 return Context.DeclarationNames.getCXXConversionFunctionName(
7690 Context.getCanonicalType(readType(F, Record, Idx)));
7691
7692 case DeclarationName::CXXOperatorName:
7693 return Context.DeclarationNames.getCXXOperatorName(
7694 (OverloadedOperatorKind)Record[Idx++]);
7695
7696 case DeclarationName::CXXLiteralOperatorName:
7697 return Context.DeclarationNames.getCXXLiteralOperatorName(
7698 GetIdentifierInfo(F, Record, Idx));
7699
7700 case DeclarationName::CXXUsingDirective:
7701 return DeclarationName::getUsingDirectiveName();
7702 }
7703
7704 llvm_unreachable("Invalid NameKind!");
7705}
7706
7707void ASTReader::ReadDeclarationNameLoc(ModuleFile &F,
7708 DeclarationNameLoc &DNLoc,
7709 DeclarationName Name,
7710 const RecordData &Record, unsigned &Idx) {
7711 switch (Name.getNameKind()) {
7712 case DeclarationName::CXXConstructorName:
7713 case DeclarationName::CXXDestructorName:
7714 case DeclarationName::CXXConversionFunctionName:
7715 DNLoc.NamedType.TInfo = GetTypeSourceInfo(F, Record, Idx);
7716 break;
7717
7718 case DeclarationName::CXXOperatorName:
7719 DNLoc.CXXOperatorName.BeginOpNameLoc
7720 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7721 DNLoc.CXXOperatorName.EndOpNameLoc
7722 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7723 break;
7724
7725 case DeclarationName::CXXLiteralOperatorName:
7726 DNLoc.CXXLiteralOperatorName.OpNameLoc
7727 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7728 break;
7729
7730 case DeclarationName::Identifier:
7731 case DeclarationName::ObjCZeroArgSelector:
7732 case DeclarationName::ObjCOneArgSelector:
7733 case DeclarationName::ObjCMultiArgSelector:
7734 case DeclarationName::CXXUsingDirective:
7735 break;
7736 }
7737}
7738
7739void ASTReader::ReadDeclarationNameInfo(ModuleFile &F,
7740 DeclarationNameInfo &NameInfo,
7741 const RecordData &Record, unsigned &Idx) {
7742 NameInfo.setName(ReadDeclarationName(F, Record, Idx));
7743 NameInfo.setLoc(ReadSourceLocation(F, Record, Idx));
7744 DeclarationNameLoc DNLoc;
7745 ReadDeclarationNameLoc(F, DNLoc, NameInfo.getName(), Record, Idx);
7746 NameInfo.setInfo(DNLoc);
7747}
7748
7749void ASTReader::ReadQualifierInfo(ModuleFile &F, QualifierInfo &Info,
7750 const RecordData &Record, unsigned &Idx) {
7751 Info.QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx);
7752 unsigned NumTPLists = Record[Idx++];
7753 Info.NumTemplParamLists = NumTPLists;
7754 if (NumTPLists) {
7755 Info.TemplParamLists = new (Context) TemplateParameterList*[NumTPLists];
7756 for (unsigned i=0; i != NumTPLists; ++i)
7757 Info.TemplParamLists[i] = ReadTemplateParameterList(F, Record, Idx);
7758 }
7759}
7760
7761TemplateName
7762ASTReader::ReadTemplateName(ModuleFile &F, const RecordData &Record,
7763 unsigned &Idx) {
7764 TemplateName::NameKind Kind = (TemplateName::NameKind)Record[Idx++];
7765 switch (Kind) {
7766 case TemplateName::Template:
7767 return TemplateName(ReadDeclAs<TemplateDecl>(F, Record, Idx));
7768
7769 case TemplateName::OverloadedTemplate: {
7770 unsigned size = Record[Idx++];
7771 UnresolvedSet<8> Decls;
7772 while (size--)
7773 Decls.addDecl(ReadDeclAs<NamedDecl>(F, Record, Idx));
7774
7775 return Context.getOverloadedTemplateName(Decls.begin(), Decls.end());
7776 }
7777
7778 case TemplateName::QualifiedTemplate: {
7779 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
7780 bool hasTemplKeyword = Record[Idx++];
7781 TemplateDecl *Template = ReadDeclAs<TemplateDecl>(F, Record, Idx);
7782 return Context.getQualifiedTemplateName(NNS, hasTemplKeyword, Template);
7783 }
7784
7785 case TemplateName::DependentTemplate: {
7786 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
7787 if (Record[Idx++]) // isIdentifier
7788 return Context.getDependentTemplateName(NNS,
7789 GetIdentifierInfo(F, Record,
7790 Idx));
7791 return Context.getDependentTemplateName(NNS,
7792 (OverloadedOperatorKind)Record[Idx++]);
7793 }
7794
7795 case TemplateName::SubstTemplateTemplateParm: {
7796 TemplateTemplateParmDecl *param
7797 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
7798 if (!param) return TemplateName();
7799 TemplateName replacement = ReadTemplateName(F, Record, Idx);
7800 return Context.getSubstTemplateTemplateParm(param, replacement);
7801 }
7802
7803 case TemplateName::SubstTemplateTemplateParmPack: {
7804 TemplateTemplateParmDecl *Param
7805 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
7806 if (!Param)
7807 return TemplateName();
7808
7809 TemplateArgument ArgPack = ReadTemplateArgument(F, Record, Idx);
7810 if (ArgPack.getKind() != TemplateArgument::Pack)
7811 return TemplateName();
7812
7813 return Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
7814 }
7815 }
7816
7817 llvm_unreachable("Unhandled template name kind!");
7818}
7819
7820TemplateArgument
7821ASTReader::ReadTemplateArgument(ModuleFile &F,
7822 const RecordData &Record, unsigned &Idx) {
7823 TemplateArgument::ArgKind Kind = (TemplateArgument::ArgKind)Record[Idx++];
7824 switch (Kind) {
7825 case TemplateArgument::Null:
7826 return TemplateArgument();
7827 case TemplateArgument::Type:
7828 return TemplateArgument(readType(F, Record, Idx));
7829 case TemplateArgument::Declaration: {
7830 ValueDecl *D = ReadDeclAs<ValueDecl>(F, Record, Idx);
David Blaikie0f62c8d2014-10-16 04:21:25 +00007831 return TemplateArgument(D, readType(F, Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00007832 }
7833 case TemplateArgument::NullPtr:
7834 return TemplateArgument(readType(F, Record, Idx), /*isNullPtr*/true);
7835 case TemplateArgument::Integral: {
7836 llvm::APSInt Value = ReadAPSInt(Record, Idx);
7837 QualType T = readType(F, Record, Idx);
7838 return TemplateArgument(Context, Value, T);
7839 }
7840 case TemplateArgument::Template:
7841 return TemplateArgument(ReadTemplateName(F, Record, Idx));
7842 case TemplateArgument::TemplateExpansion: {
7843 TemplateName Name = ReadTemplateName(F, Record, Idx);
David Blaikie05785d12013-02-20 22:23:23 +00007844 Optional<unsigned> NumTemplateExpansions;
Guy Benyei11169dd2012-12-18 14:30:41 +00007845 if (unsigned NumExpansions = Record[Idx++])
7846 NumTemplateExpansions = NumExpansions - 1;
7847 return TemplateArgument(Name, NumTemplateExpansions);
7848 }
7849 case TemplateArgument::Expression:
7850 return TemplateArgument(ReadExpr(F));
7851 case TemplateArgument::Pack: {
7852 unsigned NumArgs = Record[Idx++];
7853 TemplateArgument *Args = new (Context) TemplateArgument[NumArgs];
7854 for (unsigned I = 0; I != NumArgs; ++I)
7855 Args[I] = ReadTemplateArgument(F, Record, Idx);
7856 return TemplateArgument(Args, NumArgs);
7857 }
7858 }
7859
7860 llvm_unreachable("Unhandled template argument kind!");
7861}
7862
7863TemplateParameterList *
7864ASTReader::ReadTemplateParameterList(ModuleFile &F,
7865 const RecordData &Record, unsigned &Idx) {
7866 SourceLocation TemplateLoc = ReadSourceLocation(F, Record, Idx);
7867 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Idx);
7868 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Idx);
7869
7870 unsigned NumParams = Record[Idx++];
7871 SmallVector<NamedDecl *, 16> Params;
7872 Params.reserve(NumParams);
7873 while (NumParams--)
7874 Params.push_back(ReadDeclAs<NamedDecl>(F, Record, Idx));
7875
7876 TemplateParameterList* TemplateParams =
7877 TemplateParameterList::Create(Context, TemplateLoc, LAngleLoc,
7878 Params.data(), Params.size(), RAngleLoc);
7879 return TemplateParams;
7880}
7881
7882void
7883ASTReader::
Craig Topper5603df42013-07-05 19:34:19 +00007884ReadTemplateArgumentList(SmallVectorImpl<TemplateArgument> &TemplArgs,
Guy Benyei11169dd2012-12-18 14:30:41 +00007885 ModuleFile &F, const RecordData &Record,
7886 unsigned &Idx) {
7887 unsigned NumTemplateArgs = Record[Idx++];
7888 TemplArgs.reserve(NumTemplateArgs);
7889 while (NumTemplateArgs--)
7890 TemplArgs.push_back(ReadTemplateArgument(F, Record, Idx));
7891}
7892
7893/// \brief Read a UnresolvedSet structure.
Richard Smitha4ba74c2013-08-30 04:46:40 +00007894void ASTReader::ReadUnresolvedSet(ModuleFile &F, LazyASTUnresolvedSet &Set,
Guy Benyei11169dd2012-12-18 14:30:41 +00007895 const RecordData &Record, unsigned &Idx) {
7896 unsigned NumDecls = Record[Idx++];
7897 Set.reserve(Context, NumDecls);
7898 while (NumDecls--) {
Richard Smitha4ba74c2013-08-30 04:46:40 +00007899 DeclID ID = ReadDeclID(F, Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00007900 AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
Richard Smitha4ba74c2013-08-30 04:46:40 +00007901 Set.addLazyDecl(Context, ID, AS);
Guy Benyei11169dd2012-12-18 14:30:41 +00007902 }
7903}
7904
7905CXXBaseSpecifier
7906ASTReader::ReadCXXBaseSpecifier(ModuleFile &F,
7907 const RecordData &Record, unsigned &Idx) {
7908 bool isVirtual = static_cast<bool>(Record[Idx++]);
7909 bool isBaseOfClass = static_cast<bool>(Record[Idx++]);
7910 AccessSpecifier AS = static_cast<AccessSpecifier>(Record[Idx++]);
7911 bool inheritConstructors = static_cast<bool>(Record[Idx++]);
7912 TypeSourceInfo *TInfo = GetTypeSourceInfo(F, Record, Idx);
7913 SourceRange Range = ReadSourceRange(F, Record, Idx);
7914 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Idx);
7915 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo,
7916 EllipsisLoc);
7917 Result.setInheritConstructors(inheritConstructors);
7918 return Result;
7919}
7920
7921std::pair<CXXCtorInitializer **, unsigned>
7922ASTReader::ReadCXXCtorInitializers(ModuleFile &F, const RecordData &Record,
7923 unsigned &Idx) {
Craig Toppera13603a2014-05-22 05:54:18 +00007924 CXXCtorInitializer **CtorInitializers = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007925 unsigned NumInitializers = Record[Idx++];
7926 if (NumInitializers) {
7927 CtorInitializers
7928 = new (Context) CXXCtorInitializer*[NumInitializers];
7929 for (unsigned i=0; i != NumInitializers; ++i) {
Craig Toppera13603a2014-05-22 05:54:18 +00007930 TypeSourceInfo *TInfo = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007931 bool IsBaseVirtual = false;
Craig Toppera13603a2014-05-22 05:54:18 +00007932 FieldDecl *Member = nullptr;
7933 IndirectFieldDecl *IndirectMember = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007934
7935 CtorInitializerType Type = (CtorInitializerType)Record[Idx++];
7936 switch (Type) {
7937 case CTOR_INITIALIZER_BASE:
7938 TInfo = GetTypeSourceInfo(F, Record, Idx);
7939 IsBaseVirtual = Record[Idx++];
7940 break;
7941
7942 case CTOR_INITIALIZER_DELEGATING:
7943 TInfo = GetTypeSourceInfo(F, Record, Idx);
7944 break;
7945
7946 case CTOR_INITIALIZER_MEMBER:
7947 Member = ReadDeclAs<FieldDecl>(F, Record, Idx);
7948 break;
7949
7950 case CTOR_INITIALIZER_INDIRECT_MEMBER:
7951 IndirectMember = ReadDeclAs<IndirectFieldDecl>(F, Record, Idx);
7952 break;
7953 }
7954
7955 SourceLocation MemberOrEllipsisLoc = ReadSourceLocation(F, Record, Idx);
7956 Expr *Init = ReadExpr(F);
7957 SourceLocation LParenLoc = ReadSourceLocation(F, Record, Idx);
7958 SourceLocation RParenLoc = ReadSourceLocation(F, Record, Idx);
7959 bool IsWritten = Record[Idx++];
7960 unsigned SourceOrderOrNumArrayIndices;
7961 SmallVector<VarDecl *, 8> Indices;
7962 if (IsWritten) {
7963 SourceOrderOrNumArrayIndices = Record[Idx++];
7964 } else {
7965 SourceOrderOrNumArrayIndices = Record[Idx++];
7966 Indices.reserve(SourceOrderOrNumArrayIndices);
7967 for (unsigned i=0; i != SourceOrderOrNumArrayIndices; ++i)
7968 Indices.push_back(ReadDeclAs<VarDecl>(F, Record, Idx));
7969 }
7970
7971 CXXCtorInitializer *BOMInit;
7972 if (Type == CTOR_INITIALIZER_BASE) {
7973 BOMInit = new (Context) CXXCtorInitializer(Context, TInfo, IsBaseVirtual,
7974 LParenLoc, Init, RParenLoc,
7975 MemberOrEllipsisLoc);
7976 } else if (Type == CTOR_INITIALIZER_DELEGATING) {
7977 BOMInit = new (Context) CXXCtorInitializer(Context, TInfo, LParenLoc,
7978 Init, RParenLoc);
7979 } else if (IsWritten) {
7980 if (Member)
7981 BOMInit = new (Context) CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc,
7982 LParenLoc, Init, RParenLoc);
7983 else
7984 BOMInit = new (Context) CXXCtorInitializer(Context, IndirectMember,
7985 MemberOrEllipsisLoc, LParenLoc,
7986 Init, RParenLoc);
7987 } else {
Argyrios Kyrtzidis794671d2013-05-30 23:59:46 +00007988 if (IndirectMember) {
7989 assert(Indices.empty() && "Indirect field improperly initialized");
7990 BOMInit = new (Context) CXXCtorInitializer(Context, IndirectMember,
7991 MemberOrEllipsisLoc, LParenLoc,
7992 Init, RParenLoc);
7993 } else {
7994 BOMInit = CXXCtorInitializer::Create(Context, Member, MemberOrEllipsisLoc,
7995 LParenLoc, Init, RParenLoc,
7996 Indices.data(), Indices.size());
7997 }
Guy Benyei11169dd2012-12-18 14:30:41 +00007998 }
7999
8000 if (IsWritten)
8001 BOMInit->setSourceOrder(SourceOrderOrNumArrayIndices);
8002 CtorInitializers[i] = BOMInit;
8003 }
8004 }
8005
8006 return std::make_pair(CtorInitializers, NumInitializers);
8007}
8008
8009NestedNameSpecifier *
8010ASTReader::ReadNestedNameSpecifier(ModuleFile &F,
8011 const RecordData &Record, unsigned &Idx) {
8012 unsigned N = Record[Idx++];
Craig Toppera13603a2014-05-22 05:54:18 +00008013 NestedNameSpecifier *NNS = nullptr, *Prev = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00008014 for (unsigned I = 0; I != N; ++I) {
8015 NestedNameSpecifier::SpecifierKind Kind
8016 = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
8017 switch (Kind) {
8018 case NestedNameSpecifier::Identifier: {
8019 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
8020 NNS = NestedNameSpecifier::Create(Context, Prev, II);
8021 break;
8022 }
8023
8024 case NestedNameSpecifier::Namespace: {
8025 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
8026 NNS = NestedNameSpecifier::Create(Context, Prev, NS);
8027 break;
8028 }
8029
8030 case NestedNameSpecifier::NamespaceAlias: {
8031 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
8032 NNS = NestedNameSpecifier::Create(Context, Prev, Alias);
8033 break;
8034 }
8035
8036 case NestedNameSpecifier::TypeSpec:
8037 case NestedNameSpecifier::TypeSpecWithTemplate: {
8038 const Type *T = readType(F, Record, Idx).getTypePtrOrNull();
8039 if (!T)
Craig Toppera13603a2014-05-22 05:54:18 +00008040 return nullptr;
8041
Guy Benyei11169dd2012-12-18 14:30:41 +00008042 bool Template = Record[Idx++];
8043 NNS = NestedNameSpecifier::Create(Context, Prev, Template, T);
8044 break;
8045 }
8046
8047 case NestedNameSpecifier::Global: {
8048 NNS = NestedNameSpecifier::GlobalSpecifier(Context);
8049 // No associated value, and there can't be a prefix.
8050 break;
8051 }
Nikola Smiljanic67860242014-09-26 00:28:20 +00008052
8053 case NestedNameSpecifier::Super: {
8054 CXXRecordDecl *RD = ReadDeclAs<CXXRecordDecl>(F, Record, Idx);
8055 NNS = NestedNameSpecifier::SuperSpecifier(Context, RD);
8056 break;
8057 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008058 }
8059 Prev = NNS;
8060 }
8061 return NNS;
8062}
8063
8064NestedNameSpecifierLoc
8065ASTReader::ReadNestedNameSpecifierLoc(ModuleFile &F, const RecordData &Record,
8066 unsigned &Idx) {
8067 unsigned N = Record[Idx++];
8068 NestedNameSpecifierLocBuilder Builder;
8069 for (unsigned I = 0; I != N; ++I) {
8070 NestedNameSpecifier::SpecifierKind Kind
8071 = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
8072 switch (Kind) {
8073 case NestedNameSpecifier::Identifier: {
8074 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
8075 SourceRange Range = ReadSourceRange(F, Record, Idx);
8076 Builder.Extend(Context, II, Range.getBegin(), Range.getEnd());
8077 break;
8078 }
8079
8080 case NestedNameSpecifier::Namespace: {
8081 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
8082 SourceRange Range = ReadSourceRange(F, Record, Idx);
8083 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
8084 break;
8085 }
8086
8087 case NestedNameSpecifier::NamespaceAlias: {
8088 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
8089 SourceRange Range = ReadSourceRange(F, Record, Idx);
8090 Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd());
8091 break;
8092 }
8093
8094 case NestedNameSpecifier::TypeSpec:
8095 case NestedNameSpecifier::TypeSpecWithTemplate: {
8096 bool Template = Record[Idx++];
8097 TypeSourceInfo *T = GetTypeSourceInfo(F, Record, Idx);
8098 if (!T)
8099 return NestedNameSpecifierLoc();
8100 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
8101
8102 // FIXME: 'template' keyword location not saved anywhere, so we fake it.
8103 Builder.Extend(Context,
8104 Template? T->getTypeLoc().getBeginLoc() : SourceLocation(),
8105 T->getTypeLoc(), ColonColonLoc);
8106 break;
8107 }
8108
8109 case NestedNameSpecifier::Global: {
8110 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
8111 Builder.MakeGlobal(Context, ColonColonLoc);
8112 break;
8113 }
Nikola Smiljanic67860242014-09-26 00:28:20 +00008114
8115 case NestedNameSpecifier::Super: {
8116 CXXRecordDecl *RD = ReadDeclAs<CXXRecordDecl>(F, Record, Idx);
8117 SourceRange Range = ReadSourceRange(F, Record, Idx);
8118 Builder.MakeSuper(Context, RD, Range.getBegin(), Range.getEnd());
8119 break;
8120 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008121 }
8122 }
Nikola Smiljanic67860242014-09-26 00:28:20 +00008123
Guy Benyei11169dd2012-12-18 14:30:41 +00008124 return Builder.getWithLocInContext(Context);
8125}
8126
8127SourceRange
8128ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record,
8129 unsigned &Idx) {
8130 SourceLocation beg = ReadSourceLocation(F, Record, Idx);
8131 SourceLocation end = ReadSourceLocation(F, Record, Idx);
8132 return SourceRange(beg, end);
8133}
8134
8135/// \brief Read an integral value
8136llvm::APInt ASTReader::ReadAPInt(const RecordData &Record, unsigned &Idx) {
8137 unsigned BitWidth = Record[Idx++];
8138 unsigned NumWords = llvm::APInt::getNumWords(BitWidth);
8139 llvm::APInt Result(BitWidth, NumWords, &Record[Idx]);
8140 Idx += NumWords;
8141 return Result;
8142}
8143
8144/// \brief Read a signed integral value
8145llvm::APSInt ASTReader::ReadAPSInt(const RecordData &Record, unsigned &Idx) {
8146 bool isUnsigned = Record[Idx++];
8147 return llvm::APSInt(ReadAPInt(Record, Idx), isUnsigned);
8148}
8149
8150/// \brief Read a floating-point value
Tim Northover178723a2013-01-22 09:46:51 +00008151llvm::APFloat ASTReader::ReadAPFloat(const RecordData &Record,
8152 const llvm::fltSemantics &Sem,
8153 unsigned &Idx) {
8154 return llvm::APFloat(Sem, ReadAPInt(Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00008155}
8156
8157// \brief Read a string
8158std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) {
8159 unsigned Len = Record[Idx++];
8160 std::string Result(Record.data() + Idx, Record.data() + Idx + Len);
8161 Idx += Len;
8162 return Result;
8163}
8164
Richard Smith7ed1bc92014-12-05 22:42:13 +00008165std::string ASTReader::ReadPath(ModuleFile &F, const RecordData &Record,
8166 unsigned &Idx) {
8167 std::string Filename = ReadString(Record, Idx);
8168 ResolveImportedPath(F, Filename);
8169 return Filename;
8170}
8171
Guy Benyei11169dd2012-12-18 14:30:41 +00008172VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record,
8173 unsigned &Idx) {
8174 unsigned Major = Record[Idx++];
8175 unsigned Minor = Record[Idx++];
8176 unsigned Subminor = Record[Idx++];
8177 if (Minor == 0)
8178 return VersionTuple(Major);
8179 if (Subminor == 0)
8180 return VersionTuple(Major, Minor - 1);
8181 return VersionTuple(Major, Minor - 1, Subminor - 1);
8182}
8183
8184CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F,
8185 const RecordData &Record,
8186 unsigned &Idx) {
8187 CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx);
8188 return CXXTemporary::Create(Context, Decl);
8189}
8190
8191DiagnosticBuilder ASTReader::Diag(unsigned DiagID) {
Argyrios Kyrtzidisdc9fdaf2013-05-24 05:44:08 +00008192 return Diag(CurrentImportLoc, DiagID);
Guy Benyei11169dd2012-12-18 14:30:41 +00008193}
8194
8195DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) {
8196 return Diags.Report(Loc, DiagID);
8197}
8198
8199/// \brief Retrieve the identifier table associated with the
8200/// preprocessor.
8201IdentifierTable &ASTReader::getIdentifierTable() {
8202 return PP.getIdentifierTable();
8203}
8204
8205/// \brief Record that the given ID maps to the given switch-case
8206/// statement.
8207void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) {
Craig Toppera13603a2014-05-22 05:54:18 +00008208 assert((*CurrSwitchCaseStmts)[ID] == nullptr &&
Guy Benyei11169dd2012-12-18 14:30:41 +00008209 "Already have a SwitchCase with this ID");
8210 (*CurrSwitchCaseStmts)[ID] = SC;
8211}
8212
8213/// \brief Retrieve the switch-case statement with the given ID.
8214SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) {
Craig Toppera13603a2014-05-22 05:54:18 +00008215 assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID");
Guy Benyei11169dd2012-12-18 14:30:41 +00008216 return (*CurrSwitchCaseStmts)[ID];
8217}
8218
8219void ASTReader::ClearSwitchCaseIDs() {
8220 CurrSwitchCaseStmts->clear();
8221}
8222
8223void ASTReader::ReadComments() {
8224 std::vector<RawComment *> Comments;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00008225 for (SmallVectorImpl<std::pair<BitstreamCursor,
Guy Benyei11169dd2012-12-18 14:30:41 +00008226 serialization::ModuleFile *> >::iterator
8227 I = CommentsCursors.begin(),
8228 E = CommentsCursors.end();
8229 I != E; ++I) {
Dmitri Gribenko9ee0e302014-03-27 15:40:39 +00008230 Comments.clear();
Chris Lattner7fb3bef2013-01-20 00:56:42 +00008231 BitstreamCursor &Cursor = I->first;
Guy Benyei11169dd2012-12-18 14:30:41 +00008232 serialization::ModuleFile &F = *I->second;
8233 SavedStreamPosition SavedPosition(Cursor);
8234
8235 RecordData Record;
8236 while (true) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00008237 llvm::BitstreamEntry Entry =
8238 Cursor.advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd);
Dmitri Gribenko9ee0e302014-03-27 15:40:39 +00008239
Chris Lattner7fb3bef2013-01-20 00:56:42 +00008240 switch (Entry.Kind) {
8241 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
8242 case llvm::BitstreamEntry::Error:
8243 Error("malformed block record in AST file");
8244 return;
8245 case llvm::BitstreamEntry::EndBlock:
8246 goto NextCursor;
8247 case llvm::BitstreamEntry::Record:
8248 // The interesting case.
Guy Benyei11169dd2012-12-18 14:30:41 +00008249 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00008250 }
8251
8252 // Read a record.
8253 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00008254 switch ((CommentRecordTypes)Cursor.readRecord(Entry.ID, Record)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008255 case COMMENTS_RAW_COMMENT: {
8256 unsigned Idx = 0;
8257 SourceRange SR = ReadSourceRange(F, Record, Idx);
8258 RawComment::CommentKind Kind =
8259 (RawComment::CommentKind) Record[Idx++];
8260 bool IsTrailingComment = Record[Idx++];
8261 bool IsAlmostTrailingComment = Record[Idx++];
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00008262 Comments.push_back(new (Context) RawComment(
8263 SR, Kind, IsTrailingComment, IsAlmostTrailingComment,
8264 Context.getLangOpts().CommentOpts.ParseAllComments));
Guy Benyei11169dd2012-12-18 14:30:41 +00008265 break;
8266 }
8267 }
8268 }
Dmitri Gribenko9ee0e302014-03-27 15:40:39 +00008269 NextCursor:
8270 Context.Comments.addDeserializedComments(Comments);
Guy Benyei11169dd2012-12-18 14:30:41 +00008271 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008272}
8273
Argyrios Kyrtzidis1bde1172014-11-18 05:24:18 +00008274void ASTReader::getInputFiles(ModuleFile &F,
8275 SmallVectorImpl<serialization::InputFile> &Files) {
8276 for (unsigned I = 0, E = F.InputFilesLoaded.size(); I != E; ++I) {
8277 unsigned ID = I+1;
8278 Files.push_back(getInputFile(F, ID));
8279 }
8280}
8281
Richard Smithcd45dbc2014-04-19 03:48:30 +00008282std::string ASTReader::getOwningModuleNameForDiagnostic(const Decl *D) {
8283 // If we know the owning module, use it.
8284 if (Module *M = D->getOwningModule())
8285 return M->getFullModuleName();
8286
8287 // Otherwise, use the name of the top-level module the decl is within.
8288 if (ModuleFile *M = getOwningModuleFile(D))
8289 return M->ModuleName;
8290
8291 // Not from a module.
8292 return "";
8293}
8294
Guy Benyei11169dd2012-12-18 14:30:41 +00008295void ASTReader::finishPendingActions() {
Richard Smith851072e2014-05-19 20:59:20 +00008296 while (!PendingIdentifierInfos.empty() ||
8297 !PendingIncompleteDeclChains.empty() || !PendingDeclChains.empty() ||
Richard Smith2b9e3e32013-10-18 06:05:18 +00008298 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() ||
Richard Smitha0ce9c42014-07-29 23:23:27 +00008299 !PendingUpdateRecords.empty()) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008300 // If any identifiers with corresponding top-level declarations have
8301 // been loaded, load those declarations now.
Craig Topper79be4cd2013-07-05 04:33:53 +00008302 typedef llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2> >
8303 TopLevelDeclsMap;
8304 TopLevelDeclsMap TopLevelDecls;
8305
Guy Benyei11169dd2012-12-18 14:30:41 +00008306 while (!PendingIdentifierInfos.empty()) {
Douglas Gregor6168bd22013-02-18 15:53:43 +00008307 IdentifierInfo *II = PendingIdentifierInfos.back().first;
Richard Smithf0ae3c2d2014-03-28 17:31:23 +00008308 SmallVector<uint32_t, 4> DeclIDs =
8309 std::move(PendingIdentifierInfos.back().second);
Douglas Gregorcb15f082013-02-19 18:26:28 +00008310 PendingIdentifierInfos.pop_back();
Douglas Gregor6168bd22013-02-18 15:53:43 +00008311
8312 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]);
Guy Benyei11169dd2012-12-18 14:30:41 +00008313 }
Richard Smithf0ae3c2d2014-03-28 17:31:23 +00008314
Richard Smith851072e2014-05-19 20:59:20 +00008315 // For each decl chain that we wanted to complete while deserializing, mark
8316 // it as "still needs to be completed".
8317 for (unsigned I = 0; I != PendingIncompleteDeclChains.size(); ++I) {
8318 markIncompleteDeclChain(PendingIncompleteDeclChains[I]);
8319 }
8320 PendingIncompleteDeclChains.clear();
8321
Guy Benyei11169dd2012-12-18 14:30:41 +00008322 // Load pending declaration chains.
Richard Smithfe620d22015-03-05 23:24:12 +00008323 for (unsigned I = 0; I != PendingDeclChains.size(); ++I) {
Richard Smithfe620d22015-03-05 23:24:12 +00008324 PendingDeclChainsKnown.erase(PendingDeclChains[I]);
Richard Smithe687bf82015-03-16 20:54:07 +00008325 loadPendingDeclChain(PendingDeclChains[I]);
Richard Smithfe620d22015-03-05 23:24:12 +00008326 }
8327 assert(PendingDeclChainsKnown.empty());
Guy Benyei11169dd2012-12-18 14:30:41 +00008328 PendingDeclChains.clear();
8329
Douglas Gregor6168bd22013-02-18 15:53:43 +00008330 // Make the most recent of the top-level declarations visible.
Craig Topper79be4cd2013-07-05 04:33:53 +00008331 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
8332 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
Douglas Gregor6168bd22013-02-18 15:53:43 +00008333 IdentifierInfo *II = TLD->first;
8334 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
Argyrios Kyrtzidise5edbf92013-04-26 21:33:35 +00008335 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II);
Douglas Gregor6168bd22013-02-18 15:53:43 +00008336 }
8337 }
8338
Guy Benyei11169dd2012-12-18 14:30:41 +00008339 // Load any pending macro definitions.
8340 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008341 IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
8342 SmallVector<PendingMacroInfo, 2> GlobalIDs;
8343 GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
8344 // Initialize the macro history from chained-PCHs ahead of module imports.
Richard Smith49f906a2014-03-01 00:08:04 +00008345 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
Argyrios Kyrtzidis719736c2013-01-19 03:14:56 +00008346 ++IDIdx) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008347 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
Richard Smithe842a472014-10-22 02:05:46 +00008348 if (Info.M->Kind != MK_ImplicitModule &&
8349 Info.M->Kind != MK_ExplicitModule)
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008350 resolvePendingMacro(II, Info);
8351 }
8352 // Handle module imports.
Richard Smith49f906a2014-03-01 00:08:04 +00008353 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008354 ++IDIdx) {
8355 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
Richard Smithe842a472014-10-22 02:05:46 +00008356 if (Info.M->Kind == MK_ImplicitModule ||
8357 Info.M->Kind == MK_ExplicitModule)
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008358 resolvePendingMacro(II, Info);
Guy Benyei11169dd2012-12-18 14:30:41 +00008359 }
8360 }
8361 PendingMacroIDs.clear();
Argyrios Kyrtzidis83a6e3b2013-02-16 00:48:59 +00008362
8363 // Wire up the DeclContexts for Decls that we delayed setting until
8364 // recursive loading is completed.
8365 while (!PendingDeclContextInfos.empty()) {
8366 PendingDeclContextInfo Info = PendingDeclContextInfos.front();
8367 PendingDeclContextInfos.pop_front();
8368 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC));
8369 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC));
8370 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext());
8371 }
Richard Smith2b9e3e32013-10-18 06:05:18 +00008372
Richard Smithd1c46742014-04-30 02:24:17 +00008373 // Perform any pending declaration updates.
Richard Smithd6db68c2014-08-07 20:58:41 +00008374 while (!PendingUpdateRecords.empty()) {
Richard Smithd1c46742014-04-30 02:24:17 +00008375 auto Update = PendingUpdateRecords.pop_back_val();
8376 ReadingKindTracker ReadingKind(Read_Decl, *this);
8377 loadDeclUpdateRecords(Update.first, Update.second);
8378 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008379 }
Richard Smith8a639892015-01-24 01:07:20 +00008380
8381 // At this point, all update records for loaded decls are in place, so any
8382 // fake class definitions should have become real.
8383 assert(PendingFakeDefinitionData.empty() &&
8384 "faked up a class definition but never saw the real one");
8385
Guy Benyei11169dd2012-12-18 14:30:41 +00008386 // If we deserialized any C++ or Objective-C class definitions, any
8387 // Objective-C protocol definitions, or any redeclarable templates, make sure
8388 // that all redeclarations point to the definitions. Note that this can only
8389 // happen now, after the redeclaration chains have been fully wired.
Craig Topperc6914d02014-08-25 04:15:02 +00008390 for (Decl *D : PendingDefinitions) {
8391 if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
Richard Smith5b21db82014-04-23 18:20:42 +00008392 if (const TagType *TagT = dyn_cast<TagType>(TD->getTypeForDecl())) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008393 // Make sure that the TagType points at the definition.
8394 const_cast<TagType*>(TagT)->decl = TD;
8395 }
Richard Smith8ce51082015-03-11 01:44:51 +00008396
Craig Topperc6914d02014-08-25 04:15:02 +00008397 if (auto RD = dyn_cast<CXXRecordDecl>(D)) {
Richard Smith8ce51082015-03-11 01:44:51 +00008398 for (auto *R = getMostRecentExistingDecl(RD); R;
8399 R = R->getPreviousDecl()) {
8400 assert((R == D) ==
8401 cast<CXXRecordDecl>(R)->isThisDeclarationADefinition() &&
Richard Smith2c381642014-08-27 23:11:59 +00008402 "declaration thinks it's the definition but it isn't");
Aaron Ballman86c93902014-03-06 23:45:36 +00008403 cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData;
Richard Smith2c381642014-08-27 23:11:59 +00008404 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008405 }
8406
8407 continue;
8408 }
Richard Smith8ce51082015-03-11 01:44:51 +00008409
Craig Topperc6914d02014-08-25 04:15:02 +00008410 if (auto ID = dyn_cast<ObjCInterfaceDecl>(D)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008411 // Make sure that the ObjCInterfaceType points at the definition.
8412 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl))
8413 ->Decl = ID;
Richard Smith8ce51082015-03-11 01:44:51 +00008414
8415 for (auto *R = getMostRecentExistingDecl(ID); R; R = R->getPreviousDecl())
8416 cast<ObjCInterfaceDecl>(R)->Data = ID->Data;
8417
Guy Benyei11169dd2012-12-18 14:30:41 +00008418 continue;
8419 }
Richard Smith8ce51082015-03-11 01:44:51 +00008420
Craig Topperc6914d02014-08-25 04:15:02 +00008421 if (auto PD = dyn_cast<ObjCProtocolDecl>(D)) {
Richard Smith8ce51082015-03-11 01:44:51 +00008422 for (auto *R = getMostRecentExistingDecl(PD); R; R = R->getPreviousDecl())
8423 cast<ObjCProtocolDecl>(R)->Data = PD->Data;
8424
Guy Benyei11169dd2012-12-18 14:30:41 +00008425 continue;
8426 }
Richard Smith8ce51082015-03-11 01:44:51 +00008427
Craig Topperc6914d02014-08-25 04:15:02 +00008428 auto RTD = cast<RedeclarableTemplateDecl>(D)->getCanonicalDecl();
Richard Smith8ce51082015-03-11 01:44:51 +00008429 for (auto *R = getMostRecentExistingDecl(RTD); R; R = R->getPreviousDecl())
8430 cast<RedeclarableTemplateDecl>(R)->Common = RTD->Common;
Guy Benyei11169dd2012-12-18 14:30:41 +00008431 }
8432 PendingDefinitions.clear();
8433
8434 // Load the bodies of any functions or methods we've encountered. We do
8435 // this now (delayed) so that we can be sure that the declaration chains
8436 // have been fully wired up.
Richard Smith8ce51082015-03-11 01:44:51 +00008437 // FIXME: There seems to be no point in delaying this, it does not depend
8438 // on the redecl chains having been wired up.
Guy Benyei11169dd2012-12-18 14:30:41 +00008439 for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
8440 PBEnd = PendingBodies.end();
8441 PB != PBEnd; ++PB) {
8442 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
8443 // FIXME: Check for =delete/=default?
8444 // FIXME: Complain about ODR violations here?
8445 if (!getContext().getLangOpts().Modules || !FD->hasBody())
8446 FD->setLazyBody(PB->second);
8447 continue;
8448 }
8449
8450 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first);
8451 if (!getContext().getLangOpts().Modules || !MD->hasBody())
8452 MD->setLazyBody(PB->second);
8453 }
8454 PendingBodies.clear();
Richard Smitha0ce9c42014-07-29 23:23:27 +00008455}
8456
8457void ASTReader::diagnoseOdrViolations() {
Richard Smithbb853c72014-08-13 01:23:33 +00008458 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty())
8459 return;
8460
Richard Smitha0ce9c42014-07-29 23:23:27 +00008461 // Trigger the import of the full definition of each class that had any
8462 // odr-merging problems, so we can produce better diagnostics for them.
Richard Smithbb853c72014-08-13 01:23:33 +00008463 // These updates may in turn find and diagnose some ODR failures, so take
8464 // ownership of the set first.
8465 auto OdrMergeFailures = std::move(PendingOdrMergeFailures);
8466 PendingOdrMergeFailures.clear();
8467 for (auto &Merge : OdrMergeFailures) {
Richard Smitha0ce9c42014-07-29 23:23:27 +00008468 Merge.first->buildLookup();
8469 Merge.first->decls_begin();
8470 Merge.first->bases_begin();
8471 Merge.first->vbases_begin();
8472 for (auto *RD : Merge.second) {
8473 RD->decls_begin();
8474 RD->bases_begin();
8475 RD->vbases_begin();
8476 }
8477 }
8478
8479 // For each declaration from a merged context, check that the canonical
8480 // definition of that context also contains a declaration of the same
8481 // entity.
8482 //
8483 // Caution: this loop does things that might invalidate iterators into
8484 // PendingOdrMergeChecks. Don't turn this into a range-based for loop!
8485 while (!PendingOdrMergeChecks.empty()) {
8486 NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
8487
8488 // FIXME: Skip over implicit declarations for now. This matters for things
8489 // like implicitly-declared special member functions. This isn't entirely
8490 // correct; we can end up with multiple unmerged declarations of the same
8491 // implicit entity.
8492 if (D->isImplicit())
8493 continue;
8494
8495 DeclContext *CanonDef = D->getDeclContext();
Richard Smitha0ce9c42014-07-29 23:23:27 +00008496
8497 bool Found = false;
8498 const Decl *DCanon = D->getCanonicalDecl();
8499
Richard Smith01bdb7a2014-08-28 05:44:07 +00008500 for (auto RI : D->redecls()) {
8501 if (RI->getLexicalDeclContext() == CanonDef) {
8502 Found = true;
8503 break;
8504 }
8505 }
8506 if (Found)
8507 continue;
8508
Richard Smitha0ce9c42014-07-29 23:23:27 +00008509 llvm::SmallVector<const NamedDecl*, 4> Candidates;
Richard Smith01bdb7a2014-08-28 05:44:07 +00008510 DeclContext::lookup_result R = CanonDef->lookup(D->getDeclName());
Richard Smitha0ce9c42014-07-29 23:23:27 +00008511 for (DeclContext::lookup_iterator I = R.begin(), E = R.end();
8512 !Found && I != E; ++I) {
8513 for (auto RI : (*I)->redecls()) {
8514 if (RI->getLexicalDeclContext() == CanonDef) {
8515 // This declaration is present in the canonical definition. If it's
8516 // in the same redecl chain, it's the one we're looking for.
8517 if (RI->getCanonicalDecl() == DCanon)
8518 Found = true;
8519 else
8520 Candidates.push_back(cast<NamedDecl>(RI));
8521 break;
8522 }
8523 }
8524 }
8525
8526 if (!Found) {
Richard Smithd08aeb62014-08-28 01:33:39 +00008527 // The AST doesn't like TagDecls becoming invalid after they've been
8528 // completed. We only really need to mark FieldDecls as invalid here.
8529 if (!isa<TagDecl>(D))
8530 D->setInvalidDecl();
Richard Smith4ab3dbd2015-02-13 22:43:51 +00008531
8532 // Ensure we don't accidentally recursively enter deserialization while
8533 // we're producing our diagnostic.
8534 Deserializing RecursionGuard(this);
Richard Smitha0ce9c42014-07-29 23:23:27 +00008535
8536 std::string CanonDefModule =
8537 getOwningModuleNameForDiagnostic(cast<Decl>(CanonDef));
8538 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl)
8539 << D << getOwningModuleNameForDiagnostic(D)
8540 << CanonDef << CanonDefModule.empty() << CanonDefModule;
8541
8542 if (Candidates.empty())
8543 Diag(cast<Decl>(CanonDef)->getLocation(),
8544 diag::note_module_odr_violation_no_possible_decls) << D;
8545 else {
8546 for (unsigned I = 0, N = Candidates.size(); I != N; ++I)
8547 Diag(Candidates[I]->getLocation(),
8548 diag::note_module_odr_violation_possible_decl)
8549 << Candidates[I];
8550 }
8551
8552 DiagnosedOdrMergeFailures.insert(CanonDef);
8553 }
8554 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00008555
Richard Smith4ab3dbd2015-02-13 22:43:51 +00008556 if (OdrMergeFailures.empty())
8557 return;
8558
8559 // Ensure we don't accidentally recursively enter deserialization while
8560 // we're producing our diagnostics.
8561 Deserializing RecursionGuard(this);
8562
Richard Smithcd45dbc2014-04-19 03:48:30 +00008563 // Issue any pending ODR-failure diagnostics.
Richard Smithbb853c72014-08-13 01:23:33 +00008564 for (auto &Merge : OdrMergeFailures) {
Richard Smitha0ce9c42014-07-29 23:23:27 +00008565 // If we've already pointed out a specific problem with this class, don't
8566 // bother issuing a general "something's different" diagnostic.
David Blaikie82e95a32014-11-19 07:49:47 +00008567 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
Richard Smithcd45dbc2014-04-19 03:48:30 +00008568 continue;
8569
8570 bool Diagnosed = false;
8571 for (auto *RD : Merge.second) {
8572 // Multiple different declarations got merged together; tell the user
8573 // where they came from.
8574 if (Merge.first != RD) {
8575 // FIXME: Walk the definition, figure out what's different,
8576 // and diagnose that.
8577 if (!Diagnosed) {
8578 std::string Module = getOwningModuleNameForDiagnostic(Merge.first);
8579 Diag(Merge.first->getLocation(),
8580 diag::err_module_odr_violation_different_definitions)
8581 << Merge.first << Module.empty() << Module;
8582 Diagnosed = true;
8583 }
8584
8585 Diag(RD->getLocation(),
8586 diag::note_module_odr_violation_different_definitions)
8587 << getOwningModuleNameForDiagnostic(RD);
8588 }
8589 }
8590
8591 if (!Diagnosed) {
8592 // All definitions are updates to the same declaration. This happens if a
8593 // module instantiates the declaration of a class template specialization
8594 // and two or more other modules instantiate its definition.
8595 //
8596 // FIXME: Indicate which modules had instantiations of this definition.
8597 // FIXME: How can this even happen?
8598 Diag(Merge.first->getLocation(),
8599 diag::err_module_odr_violation_different_instantiations)
8600 << Merge.first;
8601 }
8602 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008603}
8604
8605void ASTReader::FinishedDeserializing() {
8606 assert(NumCurrentElementsDeserializing &&
8607 "FinishedDeserializing not paired with StartedDeserializing");
8608 if (NumCurrentElementsDeserializing == 1) {
8609 // We decrease NumCurrentElementsDeserializing only after pending actions
8610 // are finished, to avoid recursively re-calling finishPendingActions().
8611 finishPendingActions();
8612 }
8613 --NumCurrentElementsDeserializing;
8614
Richard Smitha0ce9c42014-07-29 23:23:27 +00008615 if (NumCurrentElementsDeserializing == 0) {
Richard Smith9e2341d2015-03-23 03:25:59 +00008616 // Propagate exception specification updates along redeclaration chains.
Richard Smith7226f2a2015-03-23 19:54:56 +00008617 while (!PendingExceptionSpecUpdates.empty()) {
8618 auto Updates = std::move(PendingExceptionSpecUpdates);
8619 PendingExceptionSpecUpdates.clear();
8620 for (auto Update : Updates) {
8621 auto *FPT = Update.second->getType()->castAs<FunctionProtoType>();
8622 SemaObj->UpdateExceptionSpec(Update.second,
8623 FPT->getExtProtoInfo().ExceptionSpec);
8624 }
Richard Smith9e2341d2015-03-23 03:25:59 +00008625 }
8626
Richard Smitha0ce9c42014-07-29 23:23:27 +00008627 diagnoseOdrViolations();
8628
Richard Smith04d05b52014-03-23 00:27:18 +00008629 // We are not in recursive loading, so it's safe to pass the "interesting"
8630 // decls to the consumer.
Richard Smitha0ce9c42014-07-29 23:23:27 +00008631 if (Consumer)
8632 PassInterestingDeclsToConsumer();
Guy Benyei11169dd2012-12-18 14:30:41 +00008633 }
8634}
8635
Argyrios Kyrtzidise5edbf92013-04-26 21:33:35 +00008636void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) {
Richard Smith9e2341d2015-03-23 03:25:59 +00008637 if (IdentifierInfo *II = Name.getAsIdentifierInfo()) {
8638 // Remove any fake results before adding any real ones.
8639 auto It = PendingFakeLookupResults.find(II);
8640 if (It != PendingFakeLookupResults.end()) {
8641 for (auto *ND : PendingFakeLookupResults[II])
8642 SemaObj->IdResolver.RemoveDecl(ND);
8643 PendingFakeLookupResults.erase(It);
8644 }
8645 }
Argyrios Kyrtzidise5edbf92013-04-26 21:33:35 +00008646
8647 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
8648 SemaObj->TUScope->AddDecl(D);
8649 } else if (SemaObj->TUScope) {
8650 // Adding the decl to IdResolver may have failed because it was already in
8651 // (even though it was not added in scope). If it is already in, make sure
8652 // it gets in the scope as well.
8653 if (std::find(SemaObj->IdResolver.begin(Name),
8654 SemaObj->IdResolver.end(), D) != SemaObj->IdResolver.end())
8655 SemaObj->TUScope->AddDecl(D);
8656 }
8657}
8658
Nico Weber824285e2014-05-08 04:26:47 +00008659ASTReader::ASTReader(Preprocessor &PP, ASTContext &Context, StringRef isysroot,
8660 bool DisableValidation, bool AllowASTWithCompilerErrors,
8661 bool AllowConfigurationMismatch, bool ValidateSystemInputs,
Ben Langmuir2cb4a782014-02-05 22:21:15 +00008662 bool UseGlobalIndex)
Craig Toppera13603a2014-05-22 05:54:18 +00008663 : Listener(new PCHValidator(PP, *this)), DeserializationListener(nullptr),
Nico Weber824285e2014-05-08 04:26:47 +00008664 OwnsDeserializationListener(false), SourceMgr(PP.getSourceManager()),
Craig Toppera13603a2014-05-22 05:54:18 +00008665 FileMgr(PP.getFileManager()), Diags(PP.getDiagnostics()),
8666 SemaObj(nullptr), PP(PP), Context(Context), Consumer(nullptr),
8667 ModuleMgr(PP.getFileManager()), isysroot(isysroot),
8668 DisableValidation(DisableValidation),
Nico Weber824285e2014-05-08 04:26:47 +00008669 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
8670 AllowConfigurationMismatch(AllowConfigurationMismatch),
8671 ValidateSystemInputs(ValidateSystemInputs),
8672 UseGlobalIndex(UseGlobalIndex), TriedLoadingGlobalIndex(false),
Richard Smith053f6c62014-05-16 23:01:30 +00008673 CurrSwitchCaseStmts(&SwitchCaseStmts),
Nico Weber824285e2014-05-08 04:26:47 +00008674 NumSLocEntriesRead(0), TotalNumSLocEntries(0), NumStatementsRead(0),
8675 TotalNumStatements(0), NumMacrosRead(0), TotalNumMacros(0),
8676 NumIdentifierLookups(0), NumIdentifierLookupHits(0), NumSelectorsRead(0),
8677 NumMethodPoolEntriesRead(0), NumMethodPoolLookups(0),
8678 NumMethodPoolHits(0), NumMethodPoolTableLookups(0),
8679 NumMethodPoolTableHits(0), TotalNumMethodPoolEntries(0),
8680 NumLexicalDeclContextsRead(0), TotalLexicalDeclContexts(0),
8681 NumVisibleDeclContextsRead(0), TotalVisibleDeclContexts(0),
8682 TotalModulesSizeInBits(0), NumCurrentElementsDeserializing(0),
8683 PassingDeclsToConsumer(false), NumCXXBaseSpecifiersLoaded(0),
8684 ReadingKind(Read_None) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008685 SourceMgr.setExternalSLocEntrySource(this);
8686}
8687
8688ASTReader::~ASTReader() {
Nico Weber824285e2014-05-08 04:26:47 +00008689 if (OwnsDeserializationListener)
8690 delete DeserializationListener;
8691
Guy Benyei11169dd2012-12-18 14:30:41 +00008692 for (DeclContextVisibleUpdatesPending::iterator
8693 I = PendingVisibleUpdates.begin(),
8694 E = PendingVisibleUpdates.end();
8695 I != E; ++I) {
8696 for (DeclContextVisibleUpdates::iterator J = I->second.begin(),
8697 F = I->second.end();
8698 J != F; ++J)
8699 delete J->first;
8700 }
8701}